From c6b607b6e100fc98c1c009be7d94a2e251bc606e Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Thu, 20 Dec 2012 16:12:50 +0100 Subject: [PATCH] Add type field to UDP datagrams This will allow future extensions --- net/can/canethgw.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/net/can/canethgw.c b/net/can/canethgw.c index 6dda6f36dcdd..635383de66e8 100644 --- a/net/can/canethgw.c +++ b/net/can/canethgw.c @@ -24,6 +24,10 @@ MODULE_LICENSE("GPL"); +enum msg_types { + CAN_FRAME, +}; + struct cegw_job { struct kref refcount; @@ -45,8 +49,9 @@ static void cegw_job_release(struct kref *ref); static int cegw_udp_send(struct socket *udp_sock, struct can_frame *cf, struct sockaddr_in* addr) { struct msghdr mh; - struct kvec vec; + struct kvec vec[2]; int err; + __u16 type = CAN_FRAME; mh.msg_name = addr; mh.msg_namelen = sizeof(*addr); @@ -54,10 +59,12 @@ static int cegw_udp_send(struct socket *udp_sock, struct can_frame *cf, struct s mh.msg_controllen = 0; mh.msg_flags = 0; - vec.iov_base = cf; - vec.iov_len = sizeof(*cf); + type = cpu_to_be16(type); + vec[0].iov_base = &type; + vec[1].iov_base = cf; + vec[1].iov_len = sizeof(*cf); - err = kernel_sendmsg(udp_sock, &mh, &vec, 1, sizeof(*cf)); + err = kernel_sendmsg(udp_sock, &mh, vec, 2, sizeof(*cf)); return err; } @@ -90,26 +97,34 @@ static int cegw_can_send(struct socket* can_sock, struct can_frame* cf) static int cegw_udp2can(void *data) { struct can_frame cf; - struct kvec vec; + struct kvec vec[2]; struct msghdr mh; struct cegw_job *job = (struct cegw_job *)data; struct socket *udp_sock = NULL, *can_sock = NULL; int ret = 0; + __u16 type; memset(&mh, 0, sizeof(mh)); udp_sock = job->udp_sock; can_sock = job->can_sock; while (1) { - vec.iov_base = &cf; - vec.iov_len = sizeof(cf); - ret = kernel_recvmsg(udp_sock, &mh, &vec, 1, + vec[0].iov_base = &type; + vec[0].iov_len = sizeof(type); + vec[1].iov_base = &cf; + vec[1].iov_len = sizeof(cf); + ret = kernel_recvmsg(udp_sock, &mh, vec, 2, sizeof(cf), 0); - if (ret < 1) + if (ret != sizeof(type) + sizeof(cf)) break; - cf.can_id = be32_to_cpu(cf.can_id); - cegw_can_send(can_sock, &cf); + type = be16_to_cpu(type); + switch (type) { + case CAN_FRAME: + cf.can_id = be32_to_cpu(cf.can_id); + cegw_can_send(can_sock, &cf); + default:; + } } cegw_thread_stop(job); -- 2.39.2