]> rtime.felk.cvut.cz Git - can-eth-gw-linux.git/commitdiff
Merge branch 'master' of rtime.felk.cvut.cz:can-eth-gw-linux
authorMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 4 Apr 2014 14:37:20 +0000 (16:37 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 4 Apr 2014 14:37:20 +0000 (16:37 +0200)
Conflicts:
include/uapi/linux/can/canethgw.h
net/can/canethgw.c

1  2 
include/uapi/linux/can/canethgw.h
net/can/canethgw.c

index ba81ee36fdfa49735a54dc56cb985f26ff4dc412,f12e054850d6a35d90594b5d5df85abd9ecd1494..4bc96a7845eda6d165b5b5cab0f6cf0f881ab0e9
@@@ -9,21 -9,9 +9,9 @@@ struct cegw_ioct
        __u32 udp_sock;
        __u32 udp_dstcnt;
        __u32 udp_addrlen;
 -      struct sockaddr_in udp_dst[0];
 +      __u8 udp_dst[0];
  };
  
- #ifdef __KERNEL__
- struct cegw_job
- {
-       struct kref refcount;
-       struct socket* can_sock;
-       struct socket* udp_sock;
-       u32  udp_dstcnt;
-       u32  udp_addrlen;
-       u8   udp_dst[0];
- };
- #endif
  #define CEGW_IOCTL_BASE 'c'
  #define CEGW_IOCTL_START _IOW(CEGW_IOCTL_BASE, 0, struct cegw_ioctl)
  
index 36da707cc4bfcc3947fb1245a15b2b88ac49a086,86e28efaa12fef28b13d64b65a29f4b4220ee64c..6c9c8aae64c7aa1b6c2ab6c1af42cbed85149cf1
  
  MODULE_LICENSE("GPL");
  
 -      __u32  udp_dstcnt;
 -      struct sockaddr_in udp_dst[0];
+ enum msg_types {
+       CAN_FRAME,
+ };
+ struct cegw_job
+ {
+       struct kref refcount;
+       struct socket* can_sock;
+       struct socket* udp_sock;
++      u32  udp_dstcnt;
++      u32  udp_addrlen;
++      u8   udp_dst[0];
+ };
  static int cegw_udp2can(void *data);
  static int cegw_udp_send(struct socket *udp_sock, struct can_frame *cf,
 -              struct sockaddr_in* addr);
 +              struct sockaddr* addr, int addrlen);
  static int cegw_can2udp(void *data);
  static int cegw_can_send(struct socket *can_sock, struct can_frame *cf);
  static int cegw_thread_start(void *data);
  static int cegw_thread_stop(struct cegw_job *job);
  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)
 +static int cegw_udp_send(struct socket *udp_sock, struct can_frame *cf, struct sockaddr *addr,
 +              int addrlen)
  {
        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);
 +      mh.msg_namelen = addrlen;
        mh.msg_control = NULL;
        mh.msg_controllen = 0;
        mh.msg_flags = 0;
@@@ -270,20 -289,14 +296,20 @@@ static long cegw_ioctl_start(struct fil
  
        err = copy_from_user(&job->udp_dst, (void __user *)(arg + sizeof(struct cegw_ioctl)), dstcnt*addrlen);
        if (err != 0) {
-               kfree(job);
-               return -EFAULT;
+               err = -EFAULT;
+               goto err_free;
        }
  
 -      for (i=0; i<dstcnt; i++) {
 -              if (job->udp_dst[i].sin_family != AF_INET) {
 +      /* */
 +      if (dstcnt > 0)
 +              sa = (struct sockaddr *)job->udp_dst;
 +              chckfam = sa->sa_family;
 +
 +      for (i=1; i<dstcnt; i++) {
 +              sa = (struct sockaddr *)(job->udp_dst + i*addrlen);
 +              if (sa->sa_family != chckfam) {
-                       kfree(job);
-                       return -EAFNOSUPPORT;
+                       err = -EAFNOSUPPORT;
+                       goto err_free;
                }
        }