__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)
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;
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;
}
}