+ udp_addr.sin_family = AF_INET;
+ udp_addr.sin_port = htons( cegw_setting.eth_port );
+ udp_addr.sin_addr = cegw_setting.eth_addr;
+
+ /* create and bind sockets */
+ if( sock_create_kern( PF_INET, SOCK_DGRAM, IPPROTO_UDP, &udp_sock) != 0 )
+ {
+ printk( KERN_ERR "canethgw: udp socket creation failed\n" );
+ return -1;
+ }
+
+ if( sock_create_kern( PF_CAN, SOCK_RAW, CAN_RAW, &can_sock) != 0 )
+ {
+ printk( KERN_ERR "canethgw: can socket creation failed\n" );
+ return -1;
+ }
+
+ if( kernel_bind( udp_sock, (struct sockaddr*)&udp_addr, sizeof( udp_addr ) ) != 0 )
+ {
+ printk( KERN_ERR "canethgw: udp socket binding failed\n" );
+ sock_release( udp_sock );
+ sock_release( can_sock );
+ return -1; /* ToDo: state==RUNNING and return? */
+ }
+
+ if( kernel_bind( can_sock, (struct sockaddr*) &can_addr, sizeof(can_addr) ) != 0 )
+ {
+ printk( KERN_ERR "canethgw: can socket binding failed\n" );
+ sock_release( udp_sock );
+ sock_release( can_sock );
+ return -1;
+ }
+
+ /* start threads */
+ cegw_state = CEGW_RUNNING;