+inline static void cegw_udp_send( struct socket* udp_sock, struct can_frame* cf, struct in_addr ipaddr, u16 port )
+{
+ struct msghdr mh;
+ struct sockaddr_in addr;
+ struct kvec vec;
+
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons( port );
+ addr.sin_addr = ipaddr;
+
+ mh.msg_name = &addr;
+ mh.msg_namelen = sizeof( addr );
+ mh.msg_control = NULL;
+ mh.msg_controllen = 0;
+ mh.msg_flags = 0;
+
+ vec.iov_base = cf;
+ vec.iov_len = sizeof( *cf );
+
+ kernel_sendmsg( udp_sock, &mh, &vec, 1, sizeof( *cf ) );
+}
+
+inline static void cegw_can_send( struct socket* can_sock, struct can_frame* cf, int ifindex )
+{
+ struct msghdr mh;
+ struct kvec vec;
+ struct sockaddr_can addr;
+
+ addr.can_family = AF_CAN;
+ addr.can_ifindex = ifindex;
+
+ mh.msg_name = &addr;
+ mh.msg_namelen = sizeof( addr );
+ mh.msg_control = NULL;
+ mh.msg_controllen = 0;
+ mh.msg_flags = 0;
+
+ vec.iov_base = cf;
+ vec.iov_len = sizeof( *cf );
+
+ kernel_sendmsg( can_sock, &mh, &vec, 1, sizeof( *cf ) ); /* ToDo: handle error */
+}
+
+/**
+ * cegw_udp_can - performs udp->can routing
+ * This function is run as a thread.
+ */
+static int cegw_udp_can( void* data )