[Xenomai-git] Philippe Gerum : net/packet: recvmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: b219f4e43aba433c7d9aed66494e49b6a80e518d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b219f4e43aba433c7d9aed66494e49b6a80e518d Author: Philippe GerumDate: Tue Dec 5 10:31:32 2017 +0100 net/packet: recvmsg: remove direct references to user memory --- kernel/drivers/net/stack/packet/af_packet.c | 84 +++ 1 file changed, 59 insertions(+), 25 deletions(-) diff --git a/kernel/drivers/net/stack/packet/af_packet.c b/kernel/drivers/net/stack/packet/af_packet.c index f6638a7..ff3ef33 100644 --- a/kernel/drivers/net/stack/packet/af_packet.c +++ b/kernel/drivers/net/stack/packet/af_packet.c @@ -292,14 +292,29 @@ static ssize_t rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) { struct rtsocket *sock = rtdm_fd_to_private(fd); -size_t len = rt_iovec_len(msg->msg_iov, msg->msg_iovlen); +ssize_t len; size_t copy_len; -size_t real_len; struct rtskb*rtskb; -struct sockaddr_ll *sll; -int ret; +struct sockaddr_ll sll; +intret, flags; nanosecs_rel_t timeout = sock->timeout; +struct user_msghdr _msg; +socklen_t namelen; +struct iovec iov_fast[RTDM_IOV_FASTMAX], *iov; + +msg = rtnet_get_arg(fd, &_msg, msg, sizeof(*msg)); +if (IS_ERR(msg)) + return PTR_ERR(msg); + +if (msg->msg_iovlen < 0) + return -EINVAL; +if (msg->msg_iovlen == 0) + return 0; + +ret = rtdm_get_iovec(fd, , msg, iov_fast); +if (ret) + return ret; /* non-blocking receive? */ if (msg_flags & MSG_DONTWAIT) @@ -308,50 +323,64 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) ret = rtdm_sem_timeddown(>pending_sem, timeout, NULL); if (unlikely(ret < 0)) switch (ret) { + default: + ret = -EBADF; /* socket has been closed */ case -EWOULDBLOCK: case -ETIMEDOUT: case -EINTR: + rtdm_drop_iovec(iov, iov_fast); return ret; - - default: - return -EBADF; /* socket has been closed */ } rtskb = rtskb_dequeue_chain(>incoming); RTNET_ASSERT(rtskb != NULL, return -EFAULT;); -sll = msg->msg_name; - /* copy the address */ -msg->msg_namelen = sizeof(*sll); -if (sll != NULL) { - struct rtnet_device *rtdev = rtskb->rtdev; +namelen = sizeof(sll); +ret = rtnet_put_arg(fd, >msg_namelen, , sizeof(namelen)); +if (ret) + goto fail; - sll->sll_family = AF_PACKET; - sll->sll_hatype = rtdev->type; - sll->sll_protocol = rtskb->protocol; - sll->sll_pkttype = rtskb->pkt_type; - sll->sll_ifindex = rtdev->ifindex; +/* copy the address if required. */ +if (msg->msg_name) { + struct rtnet_device *rtdev = rtskb->rtdev; + memset(, 0, sizeof(sll)); + sll.sll_family = AF_PACKET; + sll.sll_hatype = rtdev->type; + sll.sll_protocol = rtskb->protocol; + sll.sll_pkttype = rtskb->pkt_type; + sll.sll_ifindex = rtdev->ifindex; /* Ethernet specific - we rather need some parse handler here */ - memcpy(sll->sll_addr, rtskb->mac.ethernet->h_source, ETH_ALEN); - sll->sll_halen = ETH_ALEN; + memcpy(sll.sll_addr, rtskb->mac.ethernet->h_source, ETH_ALEN); + sll.sll_halen = ETH_ALEN; + ret = rtnet_put_arg(fd, >msg_name, , sizeof(sll)); + if (ret) + goto fail; } /* Include the header in raw delivery */ if (rtdm_fd_to_context(fd)->device->driver->socket_type != SOCK_DGRAM) rtskb_push(rtskb, rtskb->data - rtskb->mac.raw); -copy_len = real_len = rtskb->len; - /* The data must not be longer than the available buffer size */ +copy_len = rtskb->len; +len = rt_iovec_len(iov, msg->msg_iovlen); +if (len < 0) { + copy_len = len; + goto out; +} + if (copy_len > len) { copy_len = len; - msg->msg_flags |= MSG_TRUNC; + flags = msg->msg_flags | MSG_TRUNC; + ret = rtnet_put_arg(fd, >msg_flags, , sizeof(flags)); + if (ret) + goto fail; } -rt_memcpy_tokerneliovec(msg->msg_iov, rtskb->data, copy_len); - +copy_len = rtnet_write_to_iov(fd, iov, msg->msg_iovlen, rtskb->data, copy_len); +out: if ((msg_flags & MSG_PEEK) == 0) { kfree_rtskb(rtskb); } else { @@ -359,7 +388,12 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) rtdm_sem_up(>pending_sem); } -return real_len; +rtdm_drop_iovec(iov, iov_fast); + +return copy_len; +fail: +copy_len = ret; +goto out; } ___ Xenomai-git mailing list
[Xenomai-git] Philippe Gerum : net/udp: ioctl: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 69ad8d52cb1ded3522d9c47ea1a9742cb724187d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=69ad8d52cb1ded3522d9c47ea1a9742cb724187d Author: Philippe GerumDate: Mon Dec 4 19:21:23 2017 +0100 net/udp: ioctl: remove direct references to user memory --- kernel/drivers/net/stack/ipv4/udp/udp.c | 31 ++- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c b/kernel/drivers/net/stack/ipv4/udp/udp.c index 01c9d8d..f8eeadd 100644 --- a/kernel/drivers/net/stack/ipv4/udp/udp.c +++ b/kernel/drivers/net/stack/ipv4/udp/udp.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -345,26 +346,30 @@ void rt_udp_close(struct rtdm_fd *fd) -int rt_udp_ioctl(struct rtdm_fd *fd, unsigned int request, void *arg) +int rt_udp_ioctl(struct rtdm_fd *fd, unsigned int request, void __user *arg) { -struct rtsocket *sock = rtdm_fd_to_private(fd); -struct _rtdm_setsockaddr_args *setaddr = arg; - + struct rtsocket *sock = rtdm_fd_to_private(fd); + const struct _rtdm_setsockaddr_args *setaddr; + struct _rtdm_setsockaddr_args *_setaddr; -/* fast path for common socket IOCTLs */ -if (_IOC_TYPE(request) == RTIOC_TYPE_NETWORK) -return rt_socket_common_ioctl(fd, request, arg); + /* fast path for common socket IOCTLs */ + if (_IOC_TYPE(request) == RTIOC_TYPE_NETWORK) + return rt_socket_common_ioctl(fd, request, arg); -switch (request) { + switch (request) { case _RTIOC_BIND: -return rt_udp_bind(sock, setaddr->addr, setaddr->addrlen); - case _RTIOC_CONNECT: -return rt_udp_connect(sock, setaddr->addr, setaddr->addrlen); + setaddr = rtnet_get_arg(fd, &_setaddr, arg, sizeof(_setaddr)); + if (IS_ERR(setaddr)) + return PTR_ERR(setaddr); + if (request == _RTIOC_BIND) + return rt_udp_bind(sock, setaddr->addr, setaddr->addrlen); + + return rt_udp_connect(sock, setaddr->addr, setaddr->addrlen); default: -return rt_ip_ioctl(fd, request, arg); -} + return rt_ip_ioctl(fd, request, arg); + } } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/packet: sendmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 22d4422418f21f62b7d7203d508bddcaff75ff58 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=22d4422418f21f62b7d7203d508bddcaff75ff58 Author: Philippe GerumDate: Tue Dec 5 18:56:12 2017 +0100 net/packet: sendmsg: remove direct references to user memory --- kernel/drivers/net/stack/packet/af_packet.c | 67 +++ 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/kernel/drivers/net/stack/packet/af_packet.c b/kernel/drivers/net/stack/packet/af_packet.c index f248239..046f380 100644 --- a/kernel/drivers/net/stack/packet/af_packet.c +++ b/kernel/drivers/net/stack/packet/af_packet.c @@ -404,43 +404,70 @@ static ssize_t rt_packet_sendmsg(struct rtdm_fd *fd, const struct user_msghdr *msg, int msg_flags) { struct rtsocket *sock = rtdm_fd_to_private(fd); -size_t len = rt_iovec_len(msg->msg_iov, msg->msg_iovlen); -struct sockaddr_ll *sll = (struct sockaddr_ll*)msg->msg_name; +size_t len; +struct sockaddr_ll _sll, *sll; struct rtnet_device *rtdev; struct rtskb*rtskb; unsigned short proto; unsigned char *addr; int ifindex; -int ret = 0; - +ssize_t ret; +struct user_msghdr _msg; +struct iovec iov_fast[RTDM_IOV_FASTMAX], *iov; if (msg_flags & MSG_OOB)/* Mirror BSD error message compatibility */ return -EOPNOTSUPP; if (msg_flags & ~MSG_DONTWAIT) return -EINVAL; -if (sll == NULL) { +msg = rtnet_get_arg(fd, &_msg, msg, sizeof(*msg)); +if (IS_ERR(msg)) + return PTR_ERR(msg); + +if (msg->msg_iovlen < 0) + return -EINVAL; + +if (msg->msg_iovlen == 0) + return 0; + +ret = rtdm_get_iovec(fd, , msg, iov_fast); +if (ret) + return ret; + +if (msg->msg_name == NULL) { /* Note: We do not care about races with rt_packet_bind here - the user has to do so. */ ifindex = sock->prot.packet.ifindex; proto = sock->prot.packet.packet_type.type; addr= NULL; + sll = NULL; } else { - if ((msg->msg_namelen < sizeof(struct sockaddr_ll)) || - (msg->msg_namelen < - (sll->sll_halen + offsetof(struct sockaddr_ll, sll_addr))) || - ((sll->sll_family != AF_PACKET) && - (sll->sll_family != AF_UNSPEC))) - return -EINVAL; - - ifindex = sll->sll_ifindex; - proto = sll->sll_protocol; - addr= sll->sll_addr; + sll = rtnet_get_arg(fd, &_sll, msg->msg_name, sizeof(_sll)); + if (IS_ERR(sll)) { + ret = PTR_ERR(sll); + goto abort; + } + + if ((msg->msg_namelen < sizeof(struct sockaddr_ll)) || + (msg->msg_namelen < +(sll->sll_halen + offsetof(struct sockaddr_ll, sll_addr))) || + ((sll->sll_family != AF_PACKET) && +(sll->sll_family != AF_UNSPEC))) { + ret = -EINVAL; + goto abort; + } + + ifindex = sll->sll_ifindex; + proto = sll->sll_protocol; + addr= sll->sll_addr; } -if ((rtdev = rtdev_get_by_index(ifindex)) == NULL) - return -ENODEV; +if ((rtdev = rtdev_get_by_index(ifindex)) == NULL) { + ret = -ENODEV; + goto abort; +} +len = rt_iovec_len(iov, msg->msg_iovlen); rtskb = alloc_rtskb(rtdev->hard_header_len + len, >skb_pool); if (rtskb == NULL) { ret = -ENOBUFS; @@ -480,7 +507,7 @@ rt_packet_sendmsg(struct rtdm_fd *fd, const struct user_msghdr *msg, int msg_fla goto err; } -rt_memcpy_fromkerneliovec(rtskb_put(rtskb, len), msg->msg_iov, len); +ret = rtnet_read_from_iov(fd, iov, msg->msg_iovlen, rtskb_put(rtskb, len), len); if ((rtdev->flags & IFF_UP) != 0) { if ((ret = rtdev_xmit(rtskb)) == 0) @@ -492,8 +519,10 @@ rt_packet_sendmsg(struct rtdm_fd *fd, const struct user_msghdr *msg, int msg_fla out: rtdev_dereference(rtdev); -return ret; + abort: +rtdm_drop_iovec(iov, iov_fast); +return ret; err: kfree_rtskb(rtskb); goto out; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/tcp: recvmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: aa31445b240a067f85754dd48cf35df0485aa314 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=aa31445b240a067f85754dd48cf35df0485aa314 Author: Philippe GerumDate: Wed Dec 6 13:17:20 2017 +0100 net/tcp: recvmsg: remove direct references to user memory --- kernel/drivers/net/stack/ipv4/tcp/tcp.c | 45 +++ 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/kernel/drivers/net/stack/ipv4/tcp/tcp.c b/kernel/drivers/net/stack/ipv4/tcp/tcp.c index f01399d..6c1f38d 100644 --- a/kernel/drivers/net/stack/ipv4/tcp/tcp.c +++ b/kernel/drivers/net/stack/ipv4/tcp/tcp.c @@ -1668,7 +1668,7 @@ static int rt_tcp_accept(struct tcp_socket *ts, struct sockaddr *addr, ts->is_accepted = 1; rtdm_lock_put_irqrestore(>socket_lock, context); -ret = rt_socket_fd(>sock)->fd; +//ret = rt_socket_fd(>sock)->fd; err: /* it is not critical to leave this unlocked @@ -2069,20 +2069,43 @@ static ssize_t rt_tcp_write(struct rtdm_fd *fd, const void *buf, size_t nbyte) */ static ssize_t rt_tcp_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) { -size_t len; -void *buf; + struct iovec iov_fast[RTDM_IOV_FASTMAX], *iov; + struct user_msghdr _msg; + ssize_t ret; + size_t len; + void *buf; -if (msg_flags) - return -EOPNOTSUPP; + if (msg_flags) + return -EOPNOTSUPP; -/* loop over all vectors to be implemented */ -if (msg->msg_iovlen != 1) - return -EOPNOTSUPP; + msg = rtnet_get_arg(fd, &_msg, msg, sizeof(*msg)); + if (IS_ERR(msg)) + return PTR_ERR(msg); -len = msg->msg_iov[0].iov_len; -buf = msg->msg_iov[0].iov_base; + /* loop over all vectors to be implemented */ + if (msg->msg_iovlen != 1) + return -EOPNOTSUPP; + + ret = rtdm_get_iovec(fd, , msg, iov_fast); + if (ret) + return ret; -return rt_tcp_read(fd, buf, len); + len = iov[0].iov_len; + if (len > 0) { + buf = xnmalloc(len); + if (buf == NULL) { + ret = -ENOMEM; + goto out; + } + ret = rtdm_copy_from_user(fd, buf, iov[0].iov_base, len); + if (!ret) + ret = rt_tcp_read(fd, buf, len); + xnfree(buf); + } +out: + rtdm_drop_iovec(iov, iov_fast); + + return ret; } /*** ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net: convert to rtdm_get_iov_flatlen()
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: ccafe388b682200a199969082081dbdeedf77d4b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ccafe388b682200a199969082081dbdeedf77d4b Author: Philippe GerumDate: Wed Dec 6 13:40:19 2017 +0100 net: convert to rtdm_get_iov_flatlen() --- kernel/drivers/net/stack/ipv4/udp/udp.c |4 ++-- kernel/drivers/net/stack/packet/af_packet.c |4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c b/kernel/drivers/net/stack/ipv4/udp/udp.c index c460e40..a3fd496 100644 --- a/kernel/drivers/net/stack/ipv4/udp/udp.c +++ b/kernel/drivers/net/stack/ipv4/udp/udp.c @@ -454,7 +454,7 @@ ssize_t rt_udp_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flag __rtskb_pull(skb, sizeof(struct udphdr)); flags = msg->msg_flags & ~MSG_TRUNC; -len = rt_iovec_len(iov, msg->msg_iovlen); +len = rtdm_get_iov_flatlen(iov, msg->msg_iovlen); /* iterate over all IP fragments */ do { @@ -605,7 +605,7 @@ ssize_t rt_udp_sendmsg(struct rtdm_fd *fd, const struct user_msghdr *msg, int ms if (err) return err; -len = rt_iovec_len(iov, msg->msg_iovlen); +len = rtdm_get_iov_flatlen(iov, msg->msg_iovlen); if ((len < 0) || (len > 0x-sizeof(struct iphdr)-sizeof(struct udphdr))) { err = -EMSGSIZE; goto out; diff --git a/kernel/drivers/net/stack/packet/af_packet.c b/kernel/drivers/net/stack/packet/af_packet.c index 046f380..4fbf523 100644 --- a/kernel/drivers/net/stack/packet/af_packet.c +++ b/kernel/drivers/net/stack/packet/af_packet.c @@ -364,7 +364,7 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) /* The data must not be longer than the available buffer size */ copy_len = rtskb->len; -len = rt_iovec_len(iov, msg->msg_iovlen); +len = rtdm_get_iov_flatlen(iov, msg->msg_iovlen); if (len < 0) { copy_len = len; goto out; @@ -467,7 +467,7 @@ rt_packet_sendmsg(struct rtdm_fd *fd, const struct user_msghdr *msg, int msg_fla goto abort; } -len = rt_iovec_len(iov, msg->msg_iovlen); +len = rtdm_get_iov_flatlen(iov, msg->msg_iovlen); rtskb = alloc_rtskb(rtdev->hard_header_len + len, >skb_pool); if (rtskb == NULL) { ret = -ENOBUFS; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/tcp: sendmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: c6e96e38a2663ccedd2ba1c5501f7b6c0046ea64 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c6e96e38a2663ccedd2ba1c5501f7b6c0046ea64 Author: Philippe GerumDate: Wed Dec 6 13:30:29 2017 +0100 net/tcp: sendmsg: remove direct references to user memory --- kernel/drivers/net/stack/ipv4/tcp/tcp.c | 45 +++ 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/kernel/drivers/net/stack/ipv4/tcp/tcp.c b/kernel/drivers/net/stack/ipv4/tcp/tcp.c index 6c1f38d..c5e42bc 100644 --- a/kernel/drivers/net/stack/ipv4/tcp/tcp.c +++ b/kernel/drivers/net/stack/ipv4/tcp/tcp.c @@ -1668,7 +1668,7 @@ static int rt_tcp_accept(struct tcp_socket *ts, struct sockaddr *addr, ts->is_accepted = 1; rtdm_lock_put_irqrestore(>socket_lock, context); -//ret = rt_socket_fd(>sock)->fd; +ret = rt_socket_fd(>sock)->fd; err: /* it is not critical to leave this unlocked @@ -2114,20 +2114,43 @@ out: static ssize_t rt_tcp_sendmsg(struct rtdm_fd *fd, const struct user_msghdr *msg, int msg_flags) { -size_t len; -void *buf; + struct iovec iov_fast[RTDM_IOV_FASTMAX], *iov; + struct user_msghdr _msg; + ssize_t ret; + size_t len; + void *buf; + + if (msg_flags) + return -EOPNOTSUPP; -if (msg_flags) - return -EOPNOTSUPP; + msg = rtnet_get_arg(fd, &_msg, msg, sizeof(*msg)); + if (IS_ERR(msg)) + return PTR_ERR(msg); + + /* loop over all vectors to be implemented */ + if (msg->msg_iovlen != 1) + return -EOPNOTSUPP; -/* loop over all vectors to be implemented */ -if (msg->msg_iovlen != 1) - return -EOPNOTSUPP; + ret = rtdm_get_iovec(fd, , msg, iov_fast); + if (ret) + return ret; -len = msg->msg_iov[0].iov_len; -buf = msg->msg_iov[0].iov_base; + len = iov[0].iov_len; + if (len > 0) { + buf = xnmalloc(len); + if (buf == NULL) { + ret = -ENOMEM; + goto out; + } + ret = rtdm_copy_from_user(fd, buf, iov[0].iov_base, len); + if (!ret) + ret = rt_tcp_write(fd, buf, len); + xnfree(buf); + } +out: + rtdm_drop_iovec(iov, iov_fast); -return rt_tcp_write(fd, (const void*)buf, len); + return ret; } /*** ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/packet: ioctl: remove direct references to user memory (2)
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 3e388bcfde6c59bd9ec28bbcdb3757d32f19160b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3e388bcfde6c59bd9ec28bbcdb3757d32f19160b Author: Philippe GerumDate: Wed Dec 20 11:45:16 2017 +0100 net/packet: ioctl: remove direct references to user memory (2) --- kernel/drivers/net/stack/packet/af_packet.c | 156 +++ 1 file changed, 86 insertions(+), 70 deletions(-) diff --git a/kernel/drivers/net/stack/packet/af_packet.c b/kernel/drivers/net/stack/packet/af_packet.c index 4fbf523..56daba8 100644 --- a/kernel/drivers/net/stack/packet/af_packet.c +++ b/kernel/drivers/net/stack/packet/af_packet.c @@ -101,45 +101,50 @@ static void rt_packet_unlock(struct rtpacket_type *pt) /*** * rt_packet_bind */ -static int rt_packet_bind(struct rtsocket *sock, const struct sockaddr *addr, - socklen_t addrlen) +static int rt_packet_bind(struct rtdm_fd *fd, struct rtsocket *sock, + const struct sockaddr *addr, socklen_t addrlen) { -struct sockaddr_ll *sll = (struct sockaddr_ll *)addr; -struct rtpacket_type*pt = >prot.packet.packet_type; -int new_type; -int ret; -rtdm_lockctx_t context; - - -if ((addrlen < (int)sizeof(struct sockaddr_ll)) || - (sll->sll_family != AF_PACKET)) - return -EINVAL; - -new_type = (sll->sll_protocol != 0) ? sll->sll_protocol : sock->protocol; - -rtdm_lock_get_irqsave(>param_lock, context); - -/* release existing binding */ -if (pt->type != 0) - rtdev_remove_pack(pt); - -pt->type = new_type; -sock->prot.packet.ifindex = sll->sll_ifindex; + struct sockaddr_ll _sll, *sll; + struct rtpacket_type*pt = >prot.packet.packet_type; + int new_type; + int ret; + rtdm_lockctx_t context; + + if (addrlen < sizeof(struct sockaddr_ll)) + return -EINVAL; + + sll = rtnet_get_arg(fd, &_sll, addr, sizeof(_sll)); + if (IS_ERR(sll)) + return PTR_ERR(sll); + + if (sll->sll_family != AF_PACKET) + return -EINVAL; + + new_type = (sll->sll_protocol != 0) ? sll->sll_protocol : sock->protocol; + + rtdm_lock_get_irqsave(>param_lock, context); + + /* release existing binding */ + if (pt->type != 0) + rtdev_remove_pack(pt); + + pt->type = new_type; + sock->prot.packet.ifindex = sll->sll_ifindex; + + /* if protocol is non-zero, register the packet type */ + if (new_type != 0) { + pt->handler = rt_packet_rcv; + pt->err_handler = NULL; + pt->trylock = rt_packet_trylock; + pt->unlock = rt_packet_unlock; + + ret = rtdev_add_pack(pt); + } else + ret = 0; + + rtdm_lock_put_irqrestore(>param_lock, context); -/* if protocol is non-zero, register the packet type */ -if (new_type != 0) { - pt->handler = rt_packet_rcv; - pt->err_handler = NULL; - pt->trylock = rt_packet_trylock; - pt->unlock = rt_packet_unlock; - - ret = rtdev_add_pack(pt); -} else - ret = 0; - -rtdm_lock_put_irqrestore(>param_lock, context); - -return ret; + return ret; } @@ -147,41 +152,52 @@ static int rt_packet_bind(struct rtsocket *sock, const struct sockaddr *addr, /*** * rt_packet_getsockname */ -static int rt_packet_getsockname(struct rtsocket *sock, struct sockaddr *addr, -socklen_t *addrlen) +static int rt_packet_getsockname(struct rtdm_fd *fd, struct rtsocket *sock, +struct sockaddr *addr, socklen_t *addrlen) { -struct sockaddr_ll *sll = (struct sockaddr_ll*)addr; -struct rtnet_device *rtdev; -rtdm_lockctx_t context; - - -if (*addrlen < sizeof(struct sockaddr_ll)) - return -EINVAL; - -rtdm_lock_get_irqsave(>param_lock, context); - -sll->sll_family = AF_PACKET; -sll->sll_ifindex = sock->prot.packet.ifindex; -sll->sll_protocol = sock->protocol; - -rtdm_lock_put_irqrestore(>param_lock, context); - -rtdev = rtdev_get_by_index(sll->sll_ifindex); -if (rtdev != NULL) { - sll->sll_hatype = rtdev->type; - sll->sll_halen = rtdev->addr_len; - - memcpy(sll->sll_addr, rtdev->dev_addr, rtdev->addr_len); + struct sockaddr_ll _sll, *sll; + struct rtnet_device *rtdev; + rtdm_lockctx_t context; + socklen_t _namelen, *namelen; + int ret; + + namelen = rtnet_get_arg(fd, &_namelen, addrlen, sizeof(_namelen)); + if (IS_ERR(namelen)) + return PTR_ERR(namelen); + + if (*namelen < sizeof(struct sockaddr_ll)) + return -EINVAL; + + sll = rtnet_get_arg(fd, &_sll,
[Xenomai-git] Philippe Gerum : net/iovec: add copy iterators for iovec[]
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 9a4978e5ecda81d6db9e8b8d8d67f9de49db43ef URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9a4978e5ecda81d6db9e8b8d8d67f9de49db43ef Author: Philippe GerumDate: Tue Dec 5 15:34:17 2017 +0100 net/iovec: add copy iterators for iovec[] --- kernel/drivers/net/stack/include/rtnet_iovec.h |8 +++ kernel/drivers/net/stack/iovec.c | 79 +++- 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/kernel/drivers/net/stack/include/rtnet_iovec.h b/kernel/drivers/net/stack/include/rtnet_iovec.h index 2b81893..09e86d1 100644 --- a/kernel/drivers/net/stack/include/rtnet_iovec.h +++ b/kernel/drivers/net/stack/include/rtnet_iovec.h @@ -25,6 +25,8 @@ #include +struct user_msghdr; +struct rtdm_fd; /*** * rt_iovec_len @@ -44,7 +46,13 @@ static inline size_t rt_iovec_len(const struct iovec *iov, int iovlen) extern void rt_memcpy_tokerneliovec(struct iovec *iov, unsigned char *kdata, int len); extern void rt_memcpy_fromkerneliovec(unsigned char *kdata, struct iovec *iov, int len); +ssize_t rtnet_write_to_iov(struct rtdm_fd *fd, + struct iovec *iov, int iovlen, + const void *data, size_t len); +ssize_t rtnet_read_from_iov(struct rtdm_fd *fd, + struct iovec *iov, int iovlen, + void *data, size_t len); #endif /* __KERNEL__ */ #endif /* __RTNET_IOVEC_H_ */ diff --git a/kernel/drivers/net/stack/iovec.c b/kernel/drivers/net/stack/iovec.c index 24efa87..3164d28 100644 --- a/kernel/drivers/net/stack/iovec.c +++ b/kernel/drivers/net/stack/iovec.c @@ -25,8 +25,9 @@ #include #include #include - +#include #include +#include /*** @@ -49,6 +50,7 @@ void rt_memcpy_tokerneliovec(struct iovec *iov, unsigned char *kdata, int len) iov++; } } +EXPORT_SYMBOL_GPL(rt_memcpy_tokerneliovec); /*** @@ -71,7 +73,78 @@ void rt_memcpy_fromkerneliovec(unsigned char *kdata, struct iovec *iov,int len) iov++; } } +EXPORT_SYMBOL_GPL(rt_memcpy_fromkerneliovec); +ssize_t rtnet_write_to_iov(struct rtdm_fd *fd, + struct iovec *iov, int iovlen, + const void *data, size_t len) +{ + ssize_t ret = 0; + size_t nbytes; + int n; -EXPORT_SYMBOL_GPL(rt_memcpy_tokerneliovec); -EXPORT_SYMBOL_GPL(rt_memcpy_fromkerneliovec); + for (n = 0; len > 0 && n < iovlen; n++, iov++) { + if (iov->iov_len == 0) + continue; + + nbytes = iov->iov_len; + if (nbytes > len) + nbytes = len; + + ret = rtnet_put_arg(fd, iov->iov_base, data, nbytes); + if (ret) + break; + + len -= nbytes; + data += nbytes; + iov->iov_len -= nbytes; + iov->iov_base += nbytes; + ret += nbytes; + if (ret < 0) { + ret = -EINVAL; + break; + } + } + + return ret; +} +EXPORT_SYMBOL_GPL(rtnet_write_to_iov); + +ssize_t rtnet_read_from_iov(struct rtdm_fd *fd, + struct iovec *iov, int iovlen, + void *data, size_t len) +{ + ssize_t ret = 0; + size_t nbytes; + int n; + + for (n = 0; len > 0 && n < iovlen; n++, iov++) { + if (iov->iov_len == 0) + continue; + + nbytes = iov->iov_len; + if (nbytes > len) + nbytes = len; + + if (!rtdm_fd_is_user(fd)) + memcpy(data, iov->iov_base, nbytes); + else { + ret = rtdm_copy_from_user(fd, data, iov->iov_base, nbytes); + if (ret) + break; + } + + len -= nbytes; + data += nbytes; + iov->iov_len -= nbytes; + iov->iov_base += nbytes; + ret += nbytes; + if (ret < 0) { + ret = -EINVAL; + break; + } + } + + return ret; +} +EXPORT_SYMBOL_GPL(rtnet_read_from_iov); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/udp: ioctl: fix temp arg buffer type
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 0a961cea15ce7c9d89c0a7f0ffccc30b7926e98b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0a961cea15ce7c9d89c0a7f0ffccc30b7926e98b Author: Philippe GerumDate: Sun Dec 17 15:27:04 2017 +0100 net/udp: ioctl: fix temp arg buffer type --- kernel/drivers/net/stack/ipv4/udp/udp.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c b/kernel/drivers/net/stack/ipv4/udp/udp.c index a3fd496..4368303 100644 --- a/kernel/drivers/net/stack/ipv4/udp/udp.c +++ b/kernel/drivers/net/stack/ipv4/udp/udp.c @@ -350,7 +350,7 @@ int rt_udp_ioctl(struct rtdm_fd *fd, unsigned int request, void __user *arg) { struct rtsocket *sock = rtdm_fd_to_private(fd); const struct _rtdm_setsockaddr_args *setaddr; - struct _rtdm_setsockaddr_args *_setaddr; + struct _rtdm_setsockaddr_args _setaddr; /* fast path for common socket IOCTLs */ if (_IOC_TYPE(request) == RTIOC_TYPE_NETWORK) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/udp: sendmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: dd322711e3359f6d650649b77b89402523665736 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=dd322711e3359f6d650649b77b89402523665736 Author: Philippe GerumDate: Wed Dec 6 12:45:58 2017 +0100 net/udp: sendmsg: remove direct references to user memory --- kernel/drivers/net/stack/ipv4/udp/udp.c | 126 +++ 1 file changed, 79 insertions(+), 47 deletions(-) diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c b/kernel/drivers/net/stack/ipv4/udp/udp.c index 4ec5ab3..c460e40 100644 --- a/kernel/drivers/net/stack/ipv4/udp/udp.c +++ b/kernel/drivers/net/stack/ipv4/udp/udp.c @@ -515,6 +515,7 @@ struct udpfakehdr struct udphdr uh; u32 daddr; u32 saddr; +struct rtdm_fd *fd; struct iovec *iov; int iovlen; u32 wcheck; @@ -529,35 +530,36 @@ static int rt_udp_getfrag(const void *p, unsigned char *to, unsigned int offset, unsigned int fraglen) { struct udpfakehdr *ufh = (struct udpfakehdr *)p; -int i; +int i, ret; // We should optimize this function a bit (copy+csum...)! -if (offset==0) { -/* Checksum of the complete data part of the UDP message: */ -for (i = 0; i < ufh->iovlen; i++) { +if (offset) + return rtnet_read_from_iov(ufh->fd, ufh->iov, ufh->iovlen, to, fraglen); + +/* Checksum of the complete data part of the UDP message: */ +for (i = 0; i < ufh->iovlen; i++) { ufh->wcheck = csum_partial(ufh->iov[i].iov_base, ufh->iov[i].iov_len, ufh->wcheck); -} - -rt_memcpy_fromkerneliovec(to + sizeof(struct udphdr), ufh->iov, - fraglen - sizeof(struct udphdr)); +} -/* Checksum of the udp header: */ -ufh->wcheck = csum_partial((unsigned char *)ufh, - sizeof(struct udphdr), ufh->wcheck); +ret = rtnet_read_from_iov(ufh->fd, ufh->iov, ufh->iovlen, + to + sizeof(struct udphdr), + fraglen - sizeof(struct udphdr)); +if (ret) + return ret; -ufh->uh.check = csum_tcpudp_magic(ufh->saddr, ufh->daddr, ntohs(ufh->uh.len), - IPPROTO_UDP, ufh->wcheck); +/* Checksum of the udp header: */ +ufh->wcheck = csum_partial((unsigned char *)ufh, + sizeof(struct udphdr), ufh->wcheck); + +ufh->uh.check = csum_tcpudp_magic(ufh->saddr, ufh->daddr, ntohs(ufh->uh.len), + IPPROTO_UDP, ufh->wcheck); -if (ufh->uh.check == 0) +if (ufh->uh.check == 0) ufh->uh.check = -1; -memcpy(to, ufh, sizeof(struct udphdr)); -return 0; -} - -rt_memcpy_fromkerneliovec(to, ufh->iov, fraglen); +memcpy(to, ufh, sizeof(struct udphdr)); return 0; } @@ -570,9 +572,9 @@ static int rt_udp_getfrag(const void *p, unsigned char *to, ssize_t rt_udp_sendmsg(struct rtdm_fd *fd, const struct user_msghdr *msg, int msg_flags) { struct rtsocket *sock = rtdm_fd_to_private(fd); -size_t len = rt_iovec_len(msg->msg_iov, msg->msg_iovlen); -int ulen = len + sizeof(struct udphdr); -struct sockaddr_in *usin; +size_t len; +int ulen; +struct sockaddr_in _sin, *sin; struct udpfakehdr ufh; struct dest_route rt; u32 saddr; @@ -580,10 +582,8 @@ ssize_t rt_udp_sendmsg(struct rtdm_fd *fd, const struct user_msghdr *msg, int ms u16 dport; int err; rtdm_lockctx_t context; - - -if ((len < 0) || (len > 0x-sizeof(struct iphdr)-sizeof(struct udphdr))) -return -EMSGSIZE; +struct user_msghdr _msg; +struct iovec iov_fast[RTDM_IOV_FASTMAX], *iov; if (msg_flags & MSG_OOB) /* Mirror BSD error message compatibility */ return -EOPNOTSUPP; @@ -591,39 +591,70 @@ ssize_t rt_udp_sendmsg(struct rtdm_fd *fd, const struct user_msghdr *msg, int ms if (msg_flags & ~(MSG_DONTROUTE|MSG_DONTWAIT) ) return -EINVAL; -if ((msg->msg_name) && (msg->msg_namelen==sizeof(struct sockaddr_in))) { -usin = (struct sockaddr_in*) msg->msg_name; +msg = rtnet_get_arg(fd, &_msg, msg, sizeof(*msg)); +if (IS_ERR(msg)) + return PTR_ERR(msg); -if ((usin->sin_family != AF_INET) && (usin->sin_family != AF_UNSPEC)) -return -EINVAL; +if (msg->msg_iovlen < 0) + return -EINVAL; + +if (msg->msg_iovlen == 0) + return 0; + +err = rtdm_get_iovec(fd, , msg, iov_fast); +if (err) + return err; -daddr = usin->sin_addr.s_addr; -dport = usin->sin_port; +len = rt_iovec_len(iov, msg->msg_iovlen); +if ((len < 0) || (len > 0x-sizeof(struct
[Xenomai-git] Philippe Gerum : cobalt/posix/signal: drop non-sensical masking with obsolete __SI_MASK
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 514f7decb92648a9b1a25ba6005472eb83742d87 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=514f7decb92648a9b1a25ba6005472eb83742d87 Author: Philippe GerumDate: Wed Dec 6 16:51:44 2017 +0100 cobalt/posix/signal: drop non-sensical masking with obsolete __SI_MASK --- kernel/cobalt/posix/compat.c |9 ++--- kernel/cobalt/posix/signal.c |9 ++--- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/kernel/cobalt/posix/compat.c b/kernel/cobalt/posix/compat.c index 44521b5..962465a 100644 --- a/kernel/cobalt/posix/compat.c +++ b/kernel/cobalt/posix/compat.c @@ -301,19 +301,14 @@ int sys32_put_siginfo(void __user *u_si, const struct siginfo *si, int overrun) { struct compat_siginfo __user *u_p = u_si; - int code, ret; + int ret; if (u_p == NULL) return -EFAULT; - /* Translate kernel codes for userland. */ - code = si->si_code; - if (code & __SI_MASK) - code |= __SI_MASK; - ret = __xn_put_user(si->si_signo, _p->si_signo); ret |= __xn_put_user(si->si_errno, _p->si_errno); - ret |= __xn_put_user(code, _p->si_code); + ret |= __xn_put_user(si->si_code, _p->si_code); /* * Copy the generic/standard siginfo bits to userland. diff --git a/kernel/cobalt/posix/signal.c b/kernel/cobalt/posix/signal.c index 416d3e4..e870283 100644 --- a/kernel/cobalt/posix/signal.c +++ b/kernel/cobalt/posix/signal.c @@ -339,16 +339,11 @@ static int signal_put_siginfo(void __user *u_si, const struct siginfo *si, int overrun) { struct siginfo __user *u_p = u_si; - int code, ret; - - /* Translate kernel codes for userland. */ - code = si->si_code; - if (code & __SI_MASK) - code |= __SI_MASK; + int ret; ret = __xn_put_user(si->si_signo, _p->si_signo); ret |= __xn_put_user(si->si_errno, _p->si_errno); - ret |= __xn_put_user(code, _p->si_code); + ret |= __xn_put_user(si->si_code, _p->si_code); /* * Copy the generic/standard siginfo bits to userland. ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt: do not use obsolete GFP_TEMPORARY
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: d4c842d53acd4ec1f47bd25d712f7569e5d82211 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d4c842d53acd4ec1f47bd25d712f7569e5d82211 Author: Philippe GerumDate: Wed Dec 6 16:44:55 2017 +0100 cobalt: do not use obsolete GFP_TEMPORARY --- kernel/cobalt/debug.c |2 +- kernel/cobalt/posix/process.c |2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c index 9f659c6..74022c5 100644 --- a/kernel/cobalt/debug.c +++ b/kernel/cobalt/debug.c @@ -229,7 +229,7 @@ void xndebug_trace_relax(int nr, unsigned long *backtrace, * offsets. */ - tmp = (char *)__get_free_page(GFP_TEMPORARY); + tmp = (char *)__get_free_page(GFP_KERNEL); if (tmp == NULL) /* * The situation looks really bad, but we can't do diff --git a/kernel/cobalt/posix/process.c b/kernel/cobalt/posix/process.c index 69a3dcb..387690f 100644 --- a/kernel/cobalt/posix/process.c +++ b/kernel/cobalt/posix/process.c @@ -236,7 +236,7 @@ static inline char *get_exe_path(struct task_struct *p) * which is a heavyweight operation anyway, let's pick the * memory from the page allocator. */ - buf = (char *)__get_free_page(GFP_TEMPORARY); + buf = (char *)__get_free_page(GFP_KERNEL); if (buf == NULL) return ERR_PTR(-ENOMEM); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/iovec: drop useless kernel<-> iovec[] copy helpers
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 9903bb7abbe4e2ba58d54856142348d18424b2b1 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9903bb7abbe4e2ba58d54856142348d18424b2b1 Author: Philippe GerumDate: Wed Dec 6 13:41:06 2017 +0100 net/iovec: drop useless kernel<-> iovec[] copy helpers No more in-tree users for those, in the wake of dropping the broken direct references from the kernel to user-space memory. --- kernel/drivers/net/stack/include/rtnet_iovec.h | 18 -- kernel/drivers/net/stack/iovec.c | 46 2 files changed, 64 deletions(-) diff --git a/kernel/drivers/net/stack/include/rtnet_iovec.h b/kernel/drivers/net/stack/include/rtnet_iovec.h index 09e86d1..69113f4 100644 --- a/kernel/drivers/net/stack/include/rtnet_iovec.h +++ b/kernel/drivers/net/stack/include/rtnet_iovec.h @@ -28,24 +28,6 @@ struct user_msghdr; struct rtdm_fd; -/*** - * rt_iovec_len - */ -static inline size_t rt_iovec_len(const struct iovec *iov, int iovlen) -{ -int i; -size_t len = 0; - -for (i = 0; i < iovlen; i++) -len += iov[i].iov_len; - -return len; -} - - -extern void rt_memcpy_tokerneliovec(struct iovec *iov, unsigned char *kdata, int len); -extern void rt_memcpy_fromkerneliovec(unsigned char *kdata, struct iovec *iov, int len); - ssize_t rtnet_write_to_iov(struct rtdm_fd *fd, struct iovec *iov, int iovlen, const void *data, size_t len); diff --git a/kernel/drivers/net/stack/iovec.c b/kernel/drivers/net/stack/iovec.c index 3164d28..ac7501c 100644 --- a/kernel/drivers/net/stack/iovec.c +++ b/kernel/drivers/net/stack/iovec.c @@ -29,52 +29,6 @@ #include #include - -/*** - * rt_memcpy_tokerneliovec - */ -void rt_memcpy_tokerneliovec(struct iovec *iov, unsigned char *kdata, int len) -{ -while (len > 0) -{ -if (iov->iov_len) -{ -int copy = min_t(unsigned int, iov->iov_len, len); - -memcpy(iov->iov_base, kdata, copy); -kdata+=copy; -len-=copy; -iov->iov_len-=copy; -iov->iov_base+=copy; -} -iov++; -} -} -EXPORT_SYMBOL_GPL(rt_memcpy_tokerneliovec); - - -/*** - * rt_memcpy_fromkerneliovec - */ -void rt_memcpy_fromkerneliovec(unsigned char *kdata, struct iovec *iov,int len) -{ -while (len > 0) -{ -if (iov->iov_len) -{ -int copy=min_t(unsigned int, len, iov->iov_len); - -memcpy(kdata, iov->iov_base, copy); -len-=copy; -kdata+=copy; -iov->iov_base+=copy; -iov->iov_len-=copy; -} -iov++; -} -} -EXPORT_SYMBOL_GPL(rt_memcpy_fromkerneliovec); - ssize_t rtnet_write_to_iov(struct rtdm_fd *fd, struct iovec *iov, int iovlen, const void *data, size_t len) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/cap: fix panic in rtcap_signal_handler()
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: e6712968eea65958771f21f5b0eb874c1a4280e9 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e6712968eea65958771f21f5b0eb874c1a4280e9 Author: Philippe GerumDate: Fri Jun 16 18:07:26 2017 +0200 net/cap: fix panic in rtcap_signal_handler() --- kernel/drivers/net/addons/cap.c | 12 +++- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/kernel/drivers/net/addons/cap.c b/kernel/drivers/net/addons/cap.c index 7b8f4fe..78d5f56 100644 --- a/kernel/drivers/net/addons/cap.c +++ b/kernel/drivers/net/addons/cap.c @@ -195,11 +195,13 @@ static void rtcap_signal_handler(rtdm_nrtsig_t *nrtsig, void *arg) ifindex = rtskb->rtdev->ifindex; active = tap_device[ifindex].present; - if ((tap_device[ifindex].tap_dev->flags & IFF_UP) == 0) - active &= ~TAP_DEV; - if (active & RTMAC_TAP_DEV && - !(tap_device[ifindex].rtmac_tap_dev->flags & IFF_UP)) - active &= ~RTMAC_TAP_DEV; + if (active) { + if ((tap_device[ifindex].tap_dev->flags & IFF_UP) == 0) + active &= ~TAP_DEV; + if (active & RTMAC_TAP_DEV && + !(tap_device[ifindex].rtmac_tap_dev->flags & IFF_UP)) + active &= ~RTMAC_TAP_DEV; + } if (active == 0) { tap_device[ifindex].tap_dev_stats.rx_dropped++; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/udp: recvmsg: write back namelen only if name required
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: fd9728a3580cf7c87eeb814d3e98cbdcbc8f8991 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=fd9728a3580cf7c87eeb814d3e98cbdcbc8f8991 Author: Philippe GerumDate: Wed Dec 6 12:47:55 2017 +0100 net/udp: recvmsg: write back namelen only if name required --- kernel/drivers/net/stack/ipv4/udp/udp.c | 14 +++--- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c b/kernel/drivers/net/stack/ipv4/udp/udp.c index 8284ff7..4ec5ab3 100644 --- a/kernel/drivers/net/stack/ipv4/udp/udp.c +++ b/kernel/drivers/net/stack/ipv4/udp/udp.c @@ -432,12 +432,7 @@ ssize_t rt_udp_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flag uh = skb->h.uh; first_skb = skb; -namelen = sizeof(sin); -ret = rtnet_put_arg(fd, >msg_namelen, , sizeof(namelen)); -if (ret) - goto fail; - -/* copy the address */ +/* copy the address if required. */ if (msg->msg_name) { memset(, 0, sizeof(sin)); sin.sin_family = AF_INET; @@ -446,7 +441,12 @@ ssize_t rt_udp_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flag ret = rtnet_put_arg(fd, >msg_name, , sizeof(sin)); if (ret) goto fail; -} + + namelen = sizeof(sin); + ret = rtnet_put_arg(fd, >msg_namelen, , sizeof(namelen)); + if (ret) + goto fail; + } data_len = ntohs(uh->len) - sizeof(struct udphdr); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/udp: recvmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: b6dc4754f8fa09ce178fd2aec8f0eb5715a2e900 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b6dc4754f8fa09ce178fd2aec8f0eb5715a2e900 Author: Philippe GerumDate: Wed Dec 6 12:45:31 2017 +0100 net/udp: recvmsg: remove direct references to user memory --- kernel/drivers/net/stack/ipv4/udp/udp.c | 95 +-- 1 file changed, 65 insertions(+), 30 deletions(-) diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c b/kernel/drivers/net/stack/ipv4/udp/udp.c index f8eeadd..8284ff7 100644 --- a/kernel/drivers/net/stack/ipv4/udp/udp.c +++ b/kernel/drivers/net/stack/ipv4/udp/udp.c @@ -377,20 +377,39 @@ int rt_udp_ioctl(struct rtdm_fd *fd, unsigned int request, void __user *arg) /*** * rt_udp_recvmsg */ +/*** + * rt_udp_recvmsg + */ ssize_t rt_udp_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) { struct rtsocket *sock = rtdm_fd_to_private(fd); -size_t len = rt_iovec_len(msg->msg_iov, msg->msg_iovlen); +size_t len; struct rtskb*skb; struct rtskb*first_skb; size_t copied = 0; size_t block_size; size_t data_len; struct udphdr *uh; -struct sockaddr_in *sin; +struct sockaddr_in sin; nanosecs_rel_t timeout = sock->timeout; -int ret; +int ret, flags; +struct user_msghdr _msg; +socklen_t namelen; +struct iovec iov_fast[RTDM_IOV_FASTMAX], *iov; + +msg = rtnet_get_arg(fd, &_msg, msg, sizeof(*msg)); +if (IS_ERR(msg)) + return PTR_ERR(msg); +if (msg->msg_iovlen < 0) + return -EINVAL; + +if (msg->msg_iovlen == 0) + return 0; + +ret = rtdm_get_iovec(fd, , msg, iov_fast); +if (ret) + return ret; /* non-blocking receive? */ if (msg_flags & MSG_DONTWAIT) @@ -398,35 +417,44 @@ ssize_t rt_udp_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flag ret = rtdm_sem_timeddown(>pending_sem, timeout, NULL); if (unlikely(ret < 0)) -switch (ret) { -case -EWOULDBLOCK: -case -ETIMEDOUT: -case -EINTR: -return ret; - -default: -return -EBADF; /* socket has been closed */ -} + switch (ret) { + default: + ret = -EBADF; /* socket has been closed */ + case -EWOULDBLOCK: + case -ETIMEDOUT: + case -EINTR: + rtdm_drop_iovec(iov, iov_fast); + return ret; + } skb = rtskb_dequeue_chain(>incoming); RTNET_ASSERT(skb != NULL, return -EFAULT;); - uh = skb->h.uh; -data_len = ntohs(uh->len) - sizeof(struct udphdr); -sin = msg->msg_name; +first_skb = skb; +namelen = sizeof(sin); +ret = rtnet_put_arg(fd, >msg_namelen, , sizeof(namelen)); +if (ret) + goto fail; + /* copy the address */ -msg->msg_namelen = sizeof(*sin); -if (sin) { -sin->sin_family = AF_INET; -sin->sin_port= uh->source; -sin->sin_addr.s_addr = skb->nh.iph->saddr; +if (msg->msg_name) { + memset(, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_port= uh->source; + sin.sin_addr.s_addr = skb->nh.iph->saddr; + ret = rtnet_put_arg(fd, >msg_name, , sizeof(sin)); + if (ret) + goto fail; } +data_len = ntohs(uh->len) - sizeof(struct udphdr); + /* remove the UDP header */ __rtskb_pull(skb, sizeof(struct udphdr)); -first_skb = skb; +flags = msg->msg_flags & ~MSG_TRUNC; +len = rt_iovec_len(iov, msg->msg_iovlen); /* iterate over all IP fragments */ do { @@ -440,25 +468,28 @@ ssize_t rt_udp_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flag if (copied > len) { block_size -= copied - len; copied = len; -msg->msg_flags |= MSG_TRUNC; - -/* copy the data */ -rt_memcpy_tokerneliovec(msg->msg_iov, skb->data, block_size); - -break; + flags |= MSG_TRUNC; } /* copy the data */ -rt_memcpy_tokerneliovec(msg->msg_iov, skb->data, block_size); + ret = rtnet_write_to_iov(fd, iov, msg->msg_iovlen, skb->data, block_size); + if (ret) + goto fail; /* next fragment */ skb = skb->next; -} while (skb != NULL); +} while (skb && !(flags & MSG_TRUNC)); /* did we copied all bytes? */ if (data_len > 0) -msg->msg_flags |= MSG_TRUNC; + flags |= MSG_TRUNC; +if (flags != msg->msg_flags) { + ret = rtnet_put_arg(fd, >msg_flags, , sizeof(flags)); + if (ret) + goto fail; +} +out: if ((msg_flags &
[Xenomai-git] Philippe Gerum : net/packet: ioctl: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: aa71ca000790c3c23737d53501e41125973e0a17 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=aa71ca000790c3c23737d53501e41125973e0a17 Author: Philippe GerumDate: Mon Dec 4 19:40:34 2017 +0100 net/packet: ioctl: remove direct references to user memory --- kernel/drivers/net/stack/packet/af_packet.c | 36 --- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/kernel/drivers/net/stack/packet/af_packet.c b/kernel/drivers/net/stack/packet/af_packet.c index 1e4c2be..f6638a7 100644 --- a/kernel/drivers/net/stack/packet/af_packet.c +++ b/kernel/drivers/net/stack/packet/af_packet.c @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -251,28 +252,35 @@ static void rt_packet_close(struct rtdm_fd *fd) /*** * rt_packet_ioctl */ -static int rt_packet_ioctl(struct rtdm_fd *fd, unsigned int request, void *arg) +static int rt_packet_ioctl(struct rtdm_fd *fd, unsigned int request, void __user *arg) { -struct rtsocket *sock = rtdm_fd_to_private(fd); -struct _rtdm_setsockaddr_args *setaddr = arg; -struct _rtdm_getsockaddr_args *getaddr = arg; - + struct rtsocket *sock = rtdm_fd_to_private(fd); + const struct _rtdm_setsockaddr_args *setaddr; + struct _rtdm_setsockaddr_args _setaddr; + const struct _rtdm_getsockaddr_args *getaddr; + struct _rtdm_getsockaddr_args _getaddr; -/* fast path for common socket IOCTLs */ -if (_IOC_TYPE(request) == RTIOC_TYPE_NETWORK) - return rt_socket_common_ioctl(fd, request, arg); + /* fast path for common socket IOCTLs */ + if (_IOC_TYPE(request) == RTIOC_TYPE_NETWORK) + return rt_socket_common_ioctl(fd, request, arg); -switch (request) { + switch (request) { case _RTIOC_BIND: - return rt_packet_bind(sock, setaddr->addr, setaddr->addrlen); + setaddr = rtnet_get_arg(fd, &_setaddr, arg, sizeof(_setaddr)); + if (IS_ERR(setaddr)) + return PTR_ERR(setaddr); + return rt_packet_bind(sock, setaddr->addr, setaddr->addrlen); case _RTIOC_GETSOCKNAME: - return rt_packet_getsockname(sock, getaddr->addr, -getaddr->addrlen); + getaddr = rtnet_get_arg(fd, &_getaddr, arg, sizeof(_getaddr)); + if (IS_ERR(getaddr)) + return PTR_ERR(getaddr); + return rt_packet_getsockname(sock, getaddr->addr, +getaddr->addrlen); default: - return rt_socket_if_ioctl(fd, request, arg); -} + return rt_socket_if_ioctl(fd, request, arg); + } } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/packet: recvmsg: write back namelen only if name required
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 8daab0176297ec0a3ef7c666bfde9afad3c6dd9b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8daab0176297ec0a3ef7c666bfde9afad3c6dd9b Author: Philippe GerumDate: Tue Dec 5 10:36:07 2017 +0100 net/packet: recvmsg: write back namelen only if name required --- kernel/drivers/net/stack/packet/af_packet.c | 11 +-- 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/kernel/drivers/net/stack/packet/af_packet.c b/kernel/drivers/net/stack/packet/af_packet.c index ff3ef33..f248239 100644 --- a/kernel/drivers/net/stack/packet/af_packet.c +++ b/kernel/drivers/net/stack/packet/af_packet.c @@ -335,12 +335,6 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) rtskb = rtskb_dequeue_chain(>incoming); RTNET_ASSERT(rtskb != NULL, return -EFAULT;); -/* copy the address */ -namelen = sizeof(sll); -ret = rtnet_put_arg(fd, >msg_namelen, , sizeof(namelen)); -if (ret) - goto fail; - /* copy the address if required. */ if (msg->msg_name) { struct rtnet_device *rtdev = rtskb->rtdev; @@ -357,6 +351,11 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) ret = rtnet_put_arg(fd, >msg_name, , sizeof(sll)); if (ret) goto fail; + + namelen = sizeof(sll); + ret = rtnet_put_arg(fd, >msg_namelen, , sizeof(namelen)); + if (ret) + goto fail; } /* Include the header in raw delivery */ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net: wire up corectl interface
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 6f9ab1402d5f1345ec3e372326504a99339e218d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=6f9ab1402d5f1345ec3e372326504a99339e218d Author: Philippe GerumDate: Mon Dec 4 16:52:24 2017 +0100 net: wire up corectl interface A bug in some Makefile rule caused the corectl support to be wrongly omitted from the object list for building rtnet.ko. As a consequence of this, there is no way the smokey-based RTnet testsuite could have ever worked. Wire up the corectl handler to the Cobalt core as expected. --- kernel/drivers/net/stack/Makefile |3 +-- kernel/drivers/net/stack/corectl.c |9 ++--- kernel/drivers/net/stack/rtnet_module.c |6 ++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/kernel/drivers/net/stack/Makefile b/kernel/drivers/net/stack/Makefile index 508d487..d055dc2 100644 --- a/kernel/drivers/net/stack/Makefile +++ b/kernel/drivers/net/stack/Makefile @@ -1,7 +1,5 @@ ccflags-y += -Idrivers/xenomai/net/stack/include -Ikernel/ -obj-y += corectl.o - obj-$(CONFIG_XENO_DRIVERS_NET_RTIPV4) += ipv4/ obj-$(CONFIG_XENO_DRIVERS_NET_RTPACKET) += packet/ @@ -13,6 +11,7 @@ obj-$(CONFIG_XENO_DRIVERS_NET_RTCFG) += rtcfg/ obj-$(CONFIG_XENO_DRIVERS_NET) += rtnet.o rtnet-y := \ + corectl.o \ iovec.o \ rtdev.o \ rtdev_mgr.o \ diff --git a/kernel/drivers/net/stack/corectl.c b/kernel/drivers/net/stack/corectl.c index 2f6f179..c8a9a12 100644 --- a/kernel/drivers/net/stack/corectl.c +++ b/kernel/drivers/net/stack/corectl.c @@ -66,9 +66,12 @@ static struct notifier_block rtnet_corectl_notifier = { .notifier_call = rtnet_corectl_call, }; -static int rtnet_corectl_register(void) +void rtnet_corectl_register(void) { cobalt_add_config_chain(_corectl_notifier); - return 0; } -device_initcall(rtnet_corectl_register); + +void rtnet_corectl_unregister(void) +{ + cobalt_remove_config_chain(_corectl_notifier); +} diff --git a/kernel/drivers/net/stack/rtnet_module.c b/kernel/drivers/net/stack/rtnet_module.c index 1e42558..63ad558 100644 --- a/kernel/drivers/net/stack/rtnet_module.c +++ b/kernel/drivers/net/stack/rtnet_module.c @@ -50,6 +50,8 @@ const char rtnet_rtdm_provider_name[] = EXPORT_SYMBOL_GPL(rtnet_rtdm_provider_name); +void rtnet_corectl_register(void); +void rtnet_corectl_unregister(void); #ifdef CONFIG_XENO_OPT_VFILE /*** @@ -345,6 +347,8 @@ int __init rtnet_init(void) if ((err = rtpc_init()) != 0) goto err_out6; +rtnet_corectl_register(); + return 0; @@ -376,6 +380,8 @@ err_out1: */ void __exit rtnet_release(void) { +rtnet_corectl_unregister(); + rtpc_cleanup(); rtwlan_exit(); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Leopold Palomo-Avellaneda : net/drivers: fix compilation drivers
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 07162c739707e14e19b18daec9e416bdb28f89e0 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=07162c739707e14e19b18daec9e416bdb28f89e0 Author: Leopold Palomo-AvellanedaDate: Mon Nov 27 18:36:42 2017 +0100 net/drivers: fix compilation drivers the local debug variable has a name-clash with a identically named function in arch/x86/include/asm/traps.h also a macro guard apparently used an outdated name. This patch is equivalent than the proposed one by Norbert Lange for the intel cards. --- kernel/drivers/net/drivers/natsemi.c |6 ++--- kernel/drivers/net/drivers/pcnet32.c |8 +++--- kernel/drivers/net/drivers/r8169.c |8 +++--- kernel/drivers/net/drivers/via-rhine.c | 46 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/kernel/drivers/net/drivers/natsemi.c b/kernel/drivers/net/drivers/natsemi.c index e477472..bc05d63 100644 --- a/kernel/drivers/net/drivers/natsemi.c +++ b/kernel/drivers/net/drivers/natsemi.c @@ -196,7 +196,7 @@ MODULE_PARM_DESC(cards, "array of cards to be supported (e.g. 1,0,1)"); NETIF_MSG_WOL | \ NETIF_MSG_RX_ERR | \ NETIF_MSG_TX_ERR) -static int debug = -1; +static int local_debug = -1; /* Maximum events (Rx packets, etc.) to handle at each interrupt. */ static int max_interrupt_work = 20; @@ -259,7 +259,7 @@ MODULE_LICENSE("GPL"); module_param(max_interrupt_work, int, 0444); module_param(mtu, int, 0444); -module_param(debug, int, 0444); +module_param_named(debug, local_debug, int, 0444); /*** RTnet *** MODULE_PARM(rx_copybreak, "i"); *** RTnet ***/ @@ -829,7 +829,7 @@ static int natsemi_probe1 (struct pci_dev *pdev, pci_set_drvdata(pdev, dev); np->iosize = iosize; rtdm_lock_init(>lock); - np->msg_enable = (debug >= 0) ? (1< msg_enable = (local_debug >= 0) ? (1< hands_off = 0; /* Reset the chip to erase previous misconfiguration. */ diff --git a/kernel/drivers/net/drivers/pcnet32.c b/kernel/drivers/net/drivers/pcnet32.c index b041397..0146b18 100644 --- a/kernel/drivers/net/drivers/pcnet32.c +++ b/kernel/drivers/net/drivers/pcnet32.c @@ -1455,10 +1455,10 @@ static struct pci_driver pcnet32_driver = { }; /* An additional parameter that may be passed in... */ -static int debug = -1; +static int local_debug = -1; static int tx_start_pt = -1; -module_param(debug, int, 0444); +module_param_named(debug, local_debug, int, 0444); MODULE_PARM_DESC(debug, DRV_NAME " debug level (0-6)"); module_param(max_interrupt_work, int, 0444); MODULE_PARM_DESC(max_interrupt_work, DRV_NAME " maximum events handled per interrupt"); @@ -1483,8 +1483,8 @@ static int __init pcnet32_init_module(void) { printk(KERN_INFO "%s", version); -if (debug > 0) - pcnet32_debug = debug; +if (local_debug > 0) + pcnet32_debug = local_debug; if ((tx_start_pt >= 0) && (tx_start_pt <= 3)) tx_start = tx_start_pt; diff --git a/kernel/drivers/net/drivers/r8169.c b/kernel/drivers/net/drivers/r8169.c index 5da29bd..e7abf6f 100644 --- a/kernel/drivers/net/drivers/r8169.c +++ b/kernel/drivers/net/drivers/r8169.c @@ -128,9 +128,9 @@ MODULE_PARM_DESC(cards, "array of cards to be supported (e.g. 1,0,1)"); #define DEBUG_TX_SYNC 4 #define DEBUG_TX_OTHER 8 #define DEBUG_RUN 16 -static int debug = -1; +static int local_debug = -1; static int r8169_debug = -1; -module_param(debug, int, 0444); +module_param_named(debug, local_debug, int, 0444); MODULE_PARM_DESC(debug, MODULENAME " debug level (bit mask, see docs!)"); @@ -1921,8 +1921,8 @@ static struct pci_driver rtl8169_pci_driver = { static int __init rtl8169_init_module (void) { /* Enable debugging output... */ - if (debug > 0) { - r8169_debug = debug; + if (local_debug > 0) { + r8169_debug = local_debug; } if (r8169_debug & DEBUG_RUN) printk("Initializing " MODULENAME " driver"); return pci_register_driver (_pci_driver); diff --git a/kernel/drivers/net/drivers/via-rhine.c b/kernel/drivers/net/drivers/via-rhine.c index b623a89..1110fc5 100644 --- a/kernel/drivers/net/drivers/via-rhine.c +++ b/kernel/drivers/net/drivers/via-rhine.c @@ -126,7 +126,7 @@ /* A few user-configurable values. These may be modified when a driver module is loaded. */ -static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */ +static int local_debug = 1;/* 1 normal messages, 0 quiet .. 7 verbose. */ static int max_interrupt_work = 20; /* Set the copy breakpoint for the copy-only-tiny-frames scheme. @@ -247,7 +247,7 @@ MODULE_DESCRIPTION("RTnet VIA Rhine PCI Fast Ethernet driver"); MODULE_LICENSE("GPL");
[Xenomai-git] Philippe Gerum : net/tcp: ioctl: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 2f1c3ce42e1b8d21ba06ac1e744e2f1c9997e59b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2f1c3ce42e1b8d21ba06ac1e744e2f1c9997e59b Author: Philippe GerumDate: Mon Dec 4 19:21:18 2017 +0100 net/tcp: ioctl: remove direct references to user memory --- kernel/drivers/net/stack/ipv4/tcp/tcp.c | 82 +-- 1 file changed, 56 insertions(+), 26 deletions(-) diff --git a/kernel/drivers/net/stack/ipv4/tcp/tcp.c b/kernel/drivers/net/stack/ipv4/tcp/tcp.c index b1d01e9..f01399d 100644 --- a/kernel/drivers/net/stack/ipv4/tcp/tcp.c +++ b/kernel/drivers/net/stack/ipv4/tcp/tcp.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -1781,10 +1782,16 @@ static int rt_tcp_ioctl(struct rtdm_fd *fd, unsigned int request, void __user *arg) { struct tcp_socket* ts = rtdm_fd_to_private(fd); -struct _rtdm_setsockaddr_args *setaddr = arg; -struct _rtdm_getsockaddr_args *getaddr = arg; -struct _rtdm_getsockopt_args *getopt = arg; -struct _rtdm_setsockopt_args *setopt = arg; +const struct _rtdm_setsockaddr_args *setaddr; +struct _rtdm_setsockaddr_args _setaddr; +const struct _rtdm_getsockaddr_args *getaddr; +struct _rtdm_getsockaddr_args _getaddr; +const struct _rtdm_getsockopt_args *getopt; +struct _rtdm_getsockopt_args _getopt; +const struct _rtdm_setsockopt_args *setopt; +struct _rtdm_setsockopt_args _setopt; +const long *val; +long _val; int in_rt; /* fast path for common socket IOCTLs */ @@ -1795,42 +1802,65 @@ static int rt_tcp_ioctl(struct rtdm_fd *fd, switch (request) { case _RTIOC_BIND: - return rt_tcp_bind(ts, setaddr->addr, setaddr->addrlen); - + setaddr = rtnet_get_arg(fd, &_setaddr, arg, sizeof(_setaddr)); + if (IS_ERR(setaddr)) + return PTR_ERR(setaddr); + return rt_tcp_bind(ts, setaddr->addr, setaddr->addrlen); case _RTIOC_CONNECT: - if (!in_rt) - return -ENOSYS; - return rt_tcp_connect(ts, setaddr->addr, setaddr->addrlen); + if (!in_rt) + return -ENOSYS; + setaddr = rtnet_get_arg(fd, &_setaddr, arg, sizeof(_setaddr)); + if (IS_ERR(setaddr)) + return PTR_ERR(setaddr); + return rt_tcp_connect(ts, setaddr->addr, setaddr->addrlen); case _RTIOC_LISTEN: - return rt_tcp_listen(ts, (unsigned long)arg); + val = rtnet_get_arg(fd, &_val, arg, sizeof(long)); + if (IS_ERR(val)) + return PTR_ERR(val); + return rt_tcp_listen(ts, *val); case _RTIOC_ACCEPT: - if (!in_rt) - return -ENOSYS; - return rt_tcp_accept(ts, getaddr->addr, getaddr->addrlen); + if (!in_rt) + return -ENOSYS; + getaddr = rtnet_get_arg(fd, &_getaddr, arg, sizeof(_getaddr)); + if (IS_ERR(getaddr)) + return PTR_ERR(getaddr); + return rt_tcp_accept(ts, getaddr->addr, getaddr->addrlen); case _RTIOC_SHUTDOWN: - return rt_tcp_shutdown(ts, (unsigned long)arg); + val = rtnet_get_arg(fd, &_val, arg, sizeof(long)); + if (IS_ERR(val)) + return PTR_ERR(val); + return rt_tcp_shutdown(ts, *val); case _RTIOC_SETSOCKOPT: - if (setopt->level != SOL_SOCKET) - break; + setopt = rtnet_get_arg(fd, &_setopt, arg, sizeof(_setopt)); + if (IS_ERR(setopt)) + return PTR_ERR(setopt); - return rt_tcp_setsockopt(fd, ts, setopt->level, -setopt->optname, setopt->optval, -setopt->optlen); + if (setopt->level != SOL_SOCKET) + break; + + return rt_tcp_setsockopt(fd, ts, setopt->level, +setopt->optname, setopt->optval, +setopt->optlen); case _RTIOC_GETSOCKOPT: - if (getopt->level != SOL_SOCKET) - break; - return rt_tcp_getsockopt(fd, ts, getopt->level, -getopt->optname, getopt->optval, -getopt->optlen); + getopt = rtnet_get_arg(fd, &_getopt, arg, sizeof(_getopt)); + if (IS_ERR(getopt)) + return PTR_ERR(getopt); - default: - break; + if (getopt->level != SOL_SOCKET) + break; + + return rt_tcp_getsockopt(fd, ts, getopt->level, +getopt->optname,
[Xenomai-git] Greg Gallagher : net/drivers: e1000: Fix up name collision, debug is already defined
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 5b616b6020fea59a54143988b85aa612d4f4ffc3 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=5b616b6020fea59a54143988b85aa612d4f4ffc3 Author: Greg GallagherDate: Sat Dec 9 04:50:00 2017 +0100 net/drivers: e1000: Fix up name collision, debug is already defined --- kernel/drivers/net/drivers/experimental/e1000/e1000_main.c |8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/drivers/net/drivers/experimental/e1000/e1000_main.c b/kernel/drivers/net/drivers/experimental/e1000/e1000_main.c index 66ecfce..acdc13c 100644 --- a/kernel/drivers/net/drivers/experimental/e1000/e1000_main.c +++ b/kernel/drivers/net/drivers/experimental/e1000/e1000_main.c @@ -421,9 +421,9 @@ module_param_array(cards, int, NULL, 0444); MODULE_PARM_DESC(cards, "array of cards to be supported (eg. 1,0,1)"); -static int debug = NETIF_MSG_DRV | NETIF_MSG_PROBE; -module_param(debug, int, 0); -MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); +static int local_debug = NETIF_MSG_DRV | NETIF_MSG_PROBE; +module_param(local_debug, int, 0); +MODULE_PARM_DESC(local_debug, "Debug level (0=none,...,16=all)"); /* The parameter 'pciif' might be used to use this driver for * PCI or PCIe only NICs. @@ -1096,7 +1096,7 @@ static int e1000_probe(struct pci_dev *pdev, adapter->netdev = netdev; adapter->pdev = pdev; adapter->hw.back = adapter; - adapter->msg_enable = (1 << debug) - 1; + adapter->msg_enable = (1 << local_debug) - 1; err = -EIO; adapter->hw.hw_addr = ioremap(pci_resource_start(pdev, BAR_0), ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/tcp: fix invalid reference in getsockopt()
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: ffd20b9b7c788f70f88ecaa8ea99cd0a21f82057 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ffd20b9b7c788f70f88ecaa8ea99cd0a21f82057 Author: Philippe GerumDate: Mon Dec 4 17:49:19 2017 +0100 net/tcp: fix invalid reference in getsockopt() --- kernel/drivers/net/stack/ipv4/tcp/tcp.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/drivers/net/stack/ipv4/tcp/tcp.c b/kernel/drivers/net/stack/ipv4/tcp/tcp.c index 8bbb740..b1d01e9 100644 --- a/kernel/drivers/net/stack/ipv4/tcp/tcp.c +++ b/kernel/drivers/net/stack/ipv4/tcp/tcp.c @@ -1822,7 +1822,7 @@ static int rt_tcp_ioctl(struct rtdm_fd *fd, setopt->optlen); case _RTIOC_GETSOCKOPT: - if (setopt->level != SOL_SOCKET) + if (getopt->level != SOL_SOCKET) break; return rt_tcp_getsockopt(fd, ts, getopt->level, getopt->optname, getopt->optval, ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Marek Vasut : utils/can: Fix Makefile.am
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: cbc6b87bed0fe7d6d932d943fc8ca0fb49bb5b71 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cbc6b87bed0fe7d6d932d943fc8ca0fb49bb5b71 Author: Marek VasutDate: Tue Dec 19 13:43:15 2017 +0100 utils/can: Fix Makefile.am Prefix CPPFLAGS and LDFLAGS with AM_ to make automake actually use those and propagate external CPPFLAGS and LDFLAGS settings into the build. Signed-off-by: Marek Vasut --- utils/can/Makefile.am |4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/can/Makefile.am b/utils/can/Makefile.am index 570758d..561dc71 100644 --- a/utils/can/Makefile.am +++ b/utils/can/Makefile.am @@ -4,11 +4,11 @@ bin_PROGRAMS = rtcanrecv rtcansend CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC) -CPPFLAGS = \ +AM_CPPFLAGS = \ @XENO_USER_CFLAGS@ \ -I$(top_srcdir)/include -LDFLAGS = @XENO_AUTOINIT_LDFLAGS@ $(XENO_POSIX_WRAPPERS) +AM_LDFLAGS = @XENO_AUTOINIT_LDFLAGS@ $(XENO_POSIX_WRAPPERS) rtcanconfig_SOURCES = rtcanconfig.c ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/rtdm: factor out iovec[] copy routines
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 439ee1bc1e8bfcc29a51c5d15d434b6373a4f79f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=439ee1bc1e8bfcc29a51c5d15d434b6373a4f79f Author: Philippe GerumDate: Tue Dec 5 11:22:59 2017 +0100 cobalt/rtdm: factor out iovec[] copy routines --- include/cobalt/kernel/rtdm/driver.h | 19 + kernel/cobalt/rtdm/drvlib.c | 80 +++ kernel/drivers/ipc/bufp.c | 20 - kernel/drivers/ipc/iddp.c | 20 - kernel/drivers/ipc/internal.h | 19 - kernel/drivers/ipc/rtipc.c | 76 - kernel/drivers/ipc/xddp.c | 20 - 7 files changed, 129 insertions(+), 125 deletions(-) diff --git a/include/cobalt/kernel/rtdm/driver.h b/include/cobalt/kernel/rtdm/driver.h index 0c7b62e..63beb48 100644 --- a/include/cobalt/kernel/rtdm/driver.h +++ b/include/cobalt/kernel/rtdm/driver.h @@ -1339,6 +1339,25 @@ static inline int rtdm_in_rt_context(void) return (ipipe_current_domain != ipipe_root_domain); } +#define RTDM_IOV_FASTMAX 16 + +int rtdm_get_iovec(struct rtdm_fd *fd, struct iovec **iov, + const struct user_msghdr *msg, + struct iovec *iov_fast); + +int rtdm_put_iovec(struct rtdm_fd *fd, struct iovec *iov, + const struct user_msghdr *msg, + struct iovec *iov_fast); + +static inline +void rtdm_drop_iovec(struct iovec *iov, struct iovec *iov_fast) +{ + if (iov != iov_fast) + xnfree(iov); +} + +ssize_t rtdm_get_iov_flatlen(struct iovec *iov, int iovlen); + #endif /* !DOXYGEN_CPP */ #endif /* _COBALT_RTDM_DRIVER_H */ diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c index fb7bd7e..847e18f 100644 --- a/kernel/cobalt/rtdm/drvlib.c +++ b/kernel/cobalt/rtdm/drvlib.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "internal.h" #include @@ -2151,6 +2152,85 @@ int rtdm_ratelimit(struct rtdm_ratelimit_state *rs, const char *func) } EXPORT_SYMBOL_GPL(rtdm_ratelimit); +int rtdm_get_iovec(struct rtdm_fd *fd, struct iovec **iovp, + const struct user_msghdr *msg, + struct iovec *iov_fast) +{ + size_t len = sizeof(struct iovec) * msg->msg_iovlen; + struct iovec *iov = iov_fast; + + /* +* If the I/O vector doesn't fit in the fast memory, allocate +* a chunk from the system heap which is large enough to hold +* it. +*/ + if (msg->msg_iovlen > RTDM_IOV_FASTMAX) { + iov = xnmalloc(len); + if (iov == NULL) + return -ENOMEM; + } + + *iovp = iov; + + if (!rtdm_fd_is_user(fd)) { + memcpy(iov, msg->msg_iov, len); + return 0; + } + +#ifdef CONFIG_XENO_ARCH_SYS3264 + if (rtdm_fd_is_compat(fd)) + return sys32_get_iovec(iov, + (struct compat_iovec __user *)msg->msg_iov, + msg->msg_iovlen); +#endif + + return rtdm_copy_from_user(fd, iov, msg->msg_iov, len); +} +EXPORT_SYMBOL_GPL(rtdm_get_iovec); + +int rtdm_put_iovec(struct rtdm_fd *fd, struct iovec *iov, + const struct user_msghdr *msg, + struct iovec *iov_fast) +{ + size_t len = sizeof(iov[0]) * msg->msg_iovlen; + int ret; + + if (!rtdm_fd_is_user(fd)) { + memcpy(msg->msg_iov, iov, len); + ret = 0; + } else +#ifdef CONFIG_XENO_ARCH_SYS3264 + if (rtdm_fd_is_compat(fd)) + ret = sys32_put_iovec((struct compat_iovec __user *)msg->msg_iov, + iov, msg->msg_iovlen); + else +#endif + ret = rtdm_copy_to_user(fd, msg->msg_iov, iov, len); + + if (iov != iov_fast) + xnfree(iov); + + return ret; +} +EXPORT_SYMBOL_GPL(rtdm_put_iovec); + +ssize_t rtdm_get_iov_flatlen(struct iovec *iov, int iovlen) +{ + ssize_t len; + int nvec; + + /* Return the flattened vector length. */ + for (len = 0, nvec = 0; nvec < iovlen; nvec++) { + ssize_t l = iov[nvec].iov_len; + if (l < 0 || len + l < len) /* SuS wants this. */ + return -EINVAL; + len += l; + } + + return len; +} +EXPORT_SYMBOL_GPL(rtdm_get_iov_flatlen); + #ifdef DOXYGEN_CPP /* Only used for doxygen doc generation */ /** diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c index 3b565bd..e1c8672 100644 --- a/kernel/drivers/ipc/bufp.c +++ b/kernel/drivers/ipc/bufp.c @@ -307,7 +307,7 @@ static ssize_t __bufp_recvmsg(struct rtdm_fd *fd, if (!test_bit(_BUFP_BOUND, >status)) return -EAGAIN; - len = rtipc_get_iov_flatlen(iov, iovlen); + len =
[Xenomai-git] Philippe Gerum : net/socket: add get_arg/put_arg helpers
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 24915620e76abf6c3a4b37e78729fc7528484949 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=24915620e76abf6c3a4b37e78729fc7528484949 Author: Philippe GerumDate: Mon Dec 4 19:20:48 2017 +0100 net/socket: add get_arg/put_arg helpers --- kernel/drivers/net/stack/include/rtnet_socket.h | 10 +- kernel/drivers/net/stack/socket.c | 218 +++ 2 files changed, 150 insertions(+), 78 deletions(-) diff --git a/kernel/drivers/net/stack/include/rtnet_socket.h b/kernel/drivers/net/stack/include/rtnet_socket.h index cddf328..37f411a 100644 --- a/kernel/drivers/net/stack/include/rtnet_socket.h +++ b/kernel/drivers/net/stack/include/rtnet_socket.h @@ -88,6 +88,12 @@ static inline struct rtdm_fd *rt_socket_fd(struct rtsocket *sock) return rtdm_private_to_fd(sock); } +void *rtnet_get_arg(struct rtdm_fd *fd, void *tmp, + const void *src, size_t len); + +int rtnet_put_arg(struct rtdm_fd *fd, void *dst, + const void *src, size_t len); + #define rt_socket_reference(sock) \ rtdm_fd_lock(rt_socket_fd(sock)) #define rt_socket_dereference(sock) \ @@ -99,8 +105,8 @@ int __rt_socket_init(struct rtdm_fd *fd, unsigned short protocol, __rt_socket_init(fd, proto, THIS_MODULE) void rt_socket_cleanup(struct rtdm_fd *fd); -int rt_socket_common_ioctl(struct rtdm_fd *fd, int request, void *arg); -int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void *arg); +int rt_socket_common_ioctl(struct rtdm_fd *fd, int request, void __user *arg); +int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg); int rt_socket_select_bind(struct rtdm_fd *fd, rtdm_selector_t *selector, enum rtdm_selecttype type, diff --git a/kernel/drivers/net/stack/socket.c b/kernel/drivers/net/stack/socket.c index 7dacb25..5b2 100644 --- a/kernel/drivers/net/stack/socket.c +++ b/kernel/drivers/net/stack/socket.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -141,23 +142,32 @@ EXPORT_SYMBOL_GPL(rt_socket_cleanup); /*** * rt_socket_common_ioctl */ -int rt_socket_common_ioctl(struct rtdm_fd *fd, int request, void *arg) +int rt_socket_common_ioctl(struct rtdm_fd *fd, int request, void __user *arg) { struct rtsocket *sock = rtdm_fd_to_private(fd); int ret = 0; -struct rtnet_callback *callback = arg; -unsigned intrtskbs; +struct rtnet_callback *callback; +const unsigned int *val; +unsigned int _val; +const nanosecs_rel_t *timeout; +nanosecs_rel_t _timeout; rtdm_lockctx_t context; switch (request) { case RTNET_RTIOC_XMITPARAMS: - sock->priority = *(unsigned int *)arg; - break; + val = rtnet_get_arg(fd, &_val, arg, sizeof(_val)); + if (IS_ERR(val)) + return PTR_ERR(val); + sock->priority = *val; + break; case RTNET_RTIOC_TIMEOUT: - sock->timeout = *(nanosecs_rel_t *)arg; - break; + timeout = rtnet_get_arg(fd, &_timeout, arg, sizeof(_timeout)); + if (IS_ERR(timeout)) + return PTR_ERR(timeout); + sock->timeout = *timeout; + break; case RTNET_RTIOC_CALLBACK: if (rtdm_fd_is_user(fd)) @@ -165,6 +175,7 @@ int rt_socket_common_ioctl(struct rtdm_fd *fd, int request, void *arg) rtdm_lock_get_irqsave(>param_lock, context); + callback = arg; sock->callback_func = callback->func; sock->callback_arg = callback->arg; @@ -172,44 +183,48 @@ int rt_socket_common_ioctl(struct rtdm_fd *fd, int request, void *arg) break; case RTNET_RTIOC_EXTPOOL: - rtskbs = *(unsigned int *)arg; + val = rtnet_get_arg(fd, &_val, arg, sizeof(_val)); + if (IS_ERR(val)) + return PTR_ERR(val); - if (rtdm_in_rt_context()) - return -ENOSYS; + if (rtdm_in_rt_context()) + return -ENOSYS; - mutex_lock(>pool_nrt_lock); + mutex_lock(>pool_nrt_lock); - if (test_bit(SKB_POOL_CLOSED, >flags)) { - mutex_unlock(>pool_nrt_lock); - return -EBADF; - } - ret = rtskb_pool_extend(>skb_pool, rtskbs); - sock->pool_size += ret; + if (test_bit(SKB_POOL_CLOSED, >flags)) { + mutex_unlock(>pool_nrt_lock); + return -EBADF; + } + ret = rtskb_pool_extend(>skb_pool, *val); + sock->pool_size += ret; - mutex_unlock(>pool_nrt_lock); + mutex_unlock(>pool_nrt_lock); - if (ret == 0
[Xenomai-git] Philippe Gerum : cobalt/wrappers: convert to raw_copy_to/from_user() API
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: b97fc97219b7d958a89a4f5b00b8e7de53733a81 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b97fc97219b7d958a89a4f5b00b8e7de53733a81 Author: Philippe GerumDate: Wed Dec 6 16:43:19 2017 +0100 cobalt/wrappers: convert to raw_copy_to/from_user() API --- kernel/cobalt/include/asm-generic/xenomai/syscall.h |8 kernel/cobalt/include/asm-generic/xenomai/wrappers.h |7 +++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/kernel/cobalt/include/asm-generic/xenomai/syscall.h b/kernel/cobalt/include/asm-generic/xenomai/syscall.h index 84fa2ef..f11ade8 100644 --- a/kernel/cobalt/include/asm-generic/xenomai/syscall.h +++ b/kernel/cobalt/include/asm-generic/xenomai/syscall.h @@ -36,10 +36,10 @@ __xn_reg_arg4(regs),\ __xn_reg_arg5(regs) -#define __xn_copy_from_user(dstP, srcP, n) __copy_from_user_inatomic(dstP, srcP, n) -#define __xn_copy_to_user(dstP, srcP, n) __copy_to_user_inatomic(dstP, srcP, n) -#define __xn_put_user(src, dstP) __put_user_inatomic(src, dstP) -#define __xn_get_user(dst, srcP) __get_user_inatomic(dst, srcP) +#define __xn_copy_from_user(dstP, srcP, n) raw_copy_from_user(dstP, srcP, n) +#define __xn_copy_to_user(dstP, srcP, n) raw_copy_to_user(dstP, srcP, n) +#define __xn_put_user(src, dstP) __put_user(src, dstP) +#define __xn_get_user(dst, srcP) __get_user(dst, srcP) #define __xn_strncpy_from_user(dstP, srcP, n) strncpy_from_user(dstP, srcP, n) static inline int cobalt_copy_from_user(void *dst, const void __user *src, diff --git a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h index fa2dae4..7493b58 100644 --- a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h +++ b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h @@ -38,6 +38,13 @@ * symbol, so that obsolete wrappers can be spotted. */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0) +#define raw_copy_to_user(__to, __from, __n)__copy_to_user_inatomic(__to, __from, __n) +#define raw_copy_from_user(__to, __from, __n) __copy_from_user_inatomic(__to, __from, __n) +#define raw_put_user(__from, __to) __put_user_inatomic(__from, __to) +#define raw_get_user(__to, __from) __get_user_inatomic(__to, __from) +#endif + #if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) #define in_ia32_syscall() (current_thread_info()->status & TS_COMPAT) #endif ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : boilerplate/bootstrap: dual-license the bootstrap source code
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: f18416cd11628c37aef8b2c564f8174dfd3e80bf URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f18416cd11628c37aef8b2c564f8174dfd3e80bf Author: Philippe GerumDate: Tue Dec 19 11:18:26 2017 +0100 boilerplate/bootstrap: dual-license the bootstrap source code lib/boilerplate/bootstrap.c is meant to be glued to the application executable for bootstrapping the Cobalt services automatically at load up. >From the standpoint of its sole author (i.e. me), doing so adds no requirement with respect to the licensing terms of the containing application. Allow lib/boilerplate/bootstrap.c to be distributed under the terms of the MIT license to reflect this fact. --- lib/boilerplate/init/bootstrap.c | 29 + 1 file changed, 29 insertions(+) diff --git a/lib/boilerplate/init/bootstrap.c b/lib/boilerplate/init/bootstrap.c index e72a7b8..64a11c2 100644 --- a/lib/boilerplate/init/bootstrap.c +++ b/lib/boilerplate/init/bootstrap.c @@ -1,4 +1,33 @@ /* + * The source code in this particular file is released using a dual + * license scheme. You can choose the licence that better fits your + * requirements. + * + * --- + * + * Copyright (C) 2017 Philippe Gerum + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * --- + * * Copyright (C) 2013 Philippe Gerum . * * This library is free software; you can redistribute it and/or ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git