+ mutex_lock( &cegw_setting_mutex );
+ udp_addr.sin_family = AF_INET;
+ udp_addr.sin_port = htons( cegw_setting.eth_port );
+ udp_addr.sin_addr = cegw_setting.eth_addr;
+ mutex_unlock( &cegw_setting_mutex );
+
+ if( sock_create_kern( PF_INET, SOCK_DGRAM, IPPROTO_UDP, &udp_sock) != 0 )
+ {
+ printk( KERN_ERR "error: can_sock creation failed\n" );
+ return -1;
+ }
+
+ if( kernel_bind( udp_sock, (struct sockaddr*)&udp_addr, sizeof( udp_addr ) ) != 0 ) /* ref impl ?!? */
+ {
+ printk( "error: binding failed\n" );
+ sock_release( udp_sock );
+ return -1;
+ }
+
+ printk( "gw_udp_recv is complete\n" );
+ complete_all( &udp_compl ); /* ToDo: why _all? */
+ wait_for_completion( &can_compl );
+ printk( "gw_udp_recv continues\n" );
+