[Xenomai-git] Philippe Gerum : net/socket: add get_arg/put_arg helpers
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: d953cb2a8315e50fa2c28f1ef2b89ccdc9242af5 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d953cb2a8315e50fa2c28f1ef2b89ccdc9242af5 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 : net/udp: recvmsg: write back namelen only if name required
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 94fbdea0617457f7ec7e01ecb77441ce1365c41e URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=94fbdea0617457f7ec7e01ecb77441ce1365c41e 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/packet: recvmsg: write back namelen only if name required
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 9e18b4cafe5b77a34e669101c897f08a0b306e9d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9e18b4cafe5b77a34e669101c897f08a0b306e9d 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/udp: sendmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: abe2eb66528f0a371c807bdd8eb6b2a75a076ddc URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=abe2eb66528f0a371c807bdd8eb6b2a75a076ddc 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 : net: convert to rtdm_get_iov_flatlen()
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 2c39fd5a3661880b6ffc69c333dcc2189daf3017 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2c39fd5a3661880b6ffc69c333dcc2189daf3017 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/udp: recvmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 81c5c20cc57e12b371ee229cf51b2df1e7defd16 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=81c5c20cc57e12b371ee229cf51b2df1e7defd16 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/socket: ioctl: remove direct references to user memory (2)
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 8511bd779f903c1f101952dae6fd43c9fbf10021 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8511bd779f903c1f101952dae6fd43c9fbf10021 Author: Philippe GerumDate: Sun Jan 7 18:26:48 2018 +0100 net/socket: ioctl: remove direct references to user memory (2) --- kernel/drivers/net/stack/socket.c | 47 - 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/kernel/drivers/net/stack/socket.c b/kernel/drivers/net/stack/socket.c index 5b2..d7d36d5 100644 --- a/kernel/drivers/net/stack/socket.c +++ b/kernel/drivers/net/stack/socket.c @@ -243,25 +243,20 @@ EXPORT_SYMBOL_GPL(rt_socket_common_ioctl); int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg) { struct rtnet_device *rtdev; -const struct ifreq *ifr; -struct ifreq_ifr, *ifrw; +struct ifreq _ifr, *ifr, *u_ifr; struct sockaddr_in _sin; -const struct ifconf *ifc; -struct ifconf _ifc, *ifcw; +struct ifconf _ifc, *ifc, *u_ifc; int ret = 0, size = 0, i; short flags; if (request == SIOCGIFCONF) { - ifc = rtnet_get_arg(fd, &_ifc, arg, sizeof(_ifc)); + u_ifc = arg; + ifc = rtnet_get_arg(fd, &_ifc, u_ifc, sizeof(_ifc)); if (IS_ERR(ifc)) return PTR_ERR(ifc); - for (ifrw = ifc->ifc_req, i = 1; i <= MAX_RT_DEVICES; i++) { - ifrw = (struct ifreq *)rtnet_get_arg(fd, &_ifr, ifrw, sizeof(_ifr)); - if (IS_ERR(ifrw)) - return PTR_ERR(ifrw); - + for (u_ifr = ifc->ifc_req, i = 1; i <= MAX_RT_DEVICES; i++, u_ifr++) { rtdev = rtdev_get_by_index(i); if (rtdev == NULL) continue; @@ -278,26 +273,24 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg) break; } - ret = rtnet_put_arg(fd, ifrw->ifr_name, rtdev->name, IFNAMSIZ); + ret = rtnet_put_arg(fd, u_ifr->ifr_name, rtdev->name, IFNAMSIZ); if (ret == 0) { memset(&_sin, 0, sizeof(_sin)); _sin.sin_family = AF_INET; _sin.sin_addr.s_addr = rtdev->local_ip; - ret = rtnet_put_arg(fd, >ifr_addr, &_sin, sizeof(ifrw->ifr_addr)); + ret = rtnet_put_arg(fd, _ifr->ifr_addr, &_sin, sizeof(_sin)); } rtdev_dereference(rtdev); if (ret) return ret; - ifrw++; } - ifcw = arg; - return rtnet_put_arg(fd, >ifc_len, , sizeof(size)); + return rtnet_put_arg(fd, _ifc->ifc_len, , sizeof(size)); } -ifrw = arg; -ifr = rtnet_get_arg(fd, &_ifr, arg, sizeof(_ifr)); +u_ifr = arg; +ifr = rtnet_get_arg(fd, &_ifr, u_ifr, sizeof(_ifr)); if (IS_ERR(ifr)) return PTR_ERR(ifr); @@ -305,7 +298,7 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg) rtdev = rtdev_get_by_index(ifr->ifr_ifindex); if (rtdev == NULL) return -ENODEV; - ret = rtnet_put_arg(fd, ifrw->ifr_name, rtdev->name, IFNAMSIZ); + ret = rtnet_put_arg(fd, u_ifr->ifr_name, rtdev->name, IFNAMSIZ); goto out; } @@ -315,8 +308,8 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg) switch (request) { case SIOCGIFINDEX: - ret = rtnet_put_arg(fd, >ifr_ifindex, >ifindex, - sizeof(ifrw->ifr_ifindex)); + ret = rtnet_put_arg(fd, _ifr->ifr_ifindex, >ifindex, + sizeof(u_ifr->ifr_ifindex)); break; case SIOCGIFFLAGS: @@ -327,23 +320,23 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg) | RTNET_LINK_STATE_NOCARRIER)) == RTNET_LINK_STATE_PRESENT) flags |= IFF_RUNNING; - ret = rtnet_put_arg(fd, >ifr_flags, , - sizeof(ifrw->ifr_flags)); + ret = rtnet_put_arg(fd, _ifr->ifr_flags, , + sizeof(u_ifr->ifr_flags)); break; case SIOCGIFHWADDR: - ret = rtnet_put_arg(fd, >ifr_hwaddr.sa_data, rtdev->dev_addr, - rtdev->addr_len); + ret = rtnet_put_arg(fd, _ifr->ifr_hwaddr.sa_data, + rtdev->dev_addr, rtdev->addr_len); if (!ret) - ret = rtnet_put_arg(fd, >ifr_hwaddr.sa_family, >type, - sizeof(ifrw->ifr_hwaddr.sa_family)); + ret = rtnet_put_arg(fd, _ifr->ifr_hwaddr.sa_family, +
[Xenomai-git] Philippe Gerum : cobalt/powerpc: include proper header for ptrace
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: f65fe3e6895f73c1682a8bbd2e98659fd375ca35 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f65fe3e6895f73c1682a8bbd2e98659fd375ca35 Author: Philippe GerumDate: Sun Jan 7 18:58:00 2018 +0100 cobalt/powerpc: include proper header for ptrace --- kernel/cobalt/arch/powerpc/include/asm/xenomai/syscall.h |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cobalt/arch/powerpc/include/asm/xenomai/syscall.h b/kernel/cobalt/arch/powerpc/include/asm/xenomai/syscall.h index 6a9e836..2edd5eb 100644 --- a/kernel/cobalt/arch/powerpc/include/asm/xenomai/syscall.h +++ b/kernel/cobalt/arch/powerpc/include/asm/xenomai/syscall.h @@ -23,7 +23,7 @@ #define _COBALT_POWERPC_ASM_SYSCALL_H #include -#include +#include #include #define __xn_reg_sys(__regs) ((__regs)->gpr[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: e6c78422e09f124ab406692600d2d2f1a3c40c7f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e6c78422e09f124ab406692600d2d2f1a3c40c7f 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] Philippe Gerum : net/udp: ioctl: fix temp arg buffer type
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 6103b46cbe79c440794ce17582a481d8f5c77362 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=6103b46cbe79c440794ce17582a481d8f5c77362 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: recvmsg, ioctl: remove direct references to user memory (2)
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 4e5889f9c35d4d18e6855dcb8506672a15f8e2c8 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=4e5889f9c35d4d18e6855dcb8506672a15f8e2c8 Author: Philippe GerumDate: Sun Jan 7 18:23:57 2018 +0100 net/udp: recvmsg, ioctl: remove direct references to user memory (2) --- kernel/drivers/net/stack/ipv4/udp/udp.c | 137 ++- 1 file changed, 78 insertions(+), 59 deletions(-) diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c b/kernel/drivers/net/stack/ipv4/udp/udp.c index 4368303..8e80d3e 100644 --- a/kernel/drivers/net/stack/ipv4/udp/udp.c +++ b/kernel/drivers/net/stack/ipv4/udp/udp.c @@ -154,18 +154,24 @@ static inline struct rtsocket *rt_udp_v4_lookup(u32 daddr, u16 dport) * @s: socket * @addr: local address */ -int rt_udp_bind(struct rtsocket *sock, const struct sockaddr *addr, -socklen_t addrlen) +int rt_udp_bind(struct rtdm_fd *fd, struct rtsocket *sock, + const struct sockaddr __user *addr, socklen_t addrlen) { -struct sockaddr_in *usin = (struct sockaddr_in *)addr; +struct sockaddr_in _sin, *sin; rtdm_lockctx_t context; int index; int err = 0; -if ((addrlen < (int)sizeof(struct sockaddr_in)) || -((usin->sin_port & auto_port_mask) == auto_port_start)) -return -EINVAL; +if (addrlen < sizeof(struct sockaddr_in)) + return -EINVAL; + +sin = rtnet_get_arg(fd, &_sin, addr, sizeof(_sin)); +if (IS_ERR(sin)) + return PTR_ERR(sin); + +if ((sin->sin_port & auto_port_mask) == auto_port_start) + return -EINVAL; rtdm_lock_get_irqsave(_socket_base_lock, context); @@ -181,8 +187,8 @@ int rt_udp_bind(struct rtsocket *sock, const struct sockaddr *addr, port_hash_del(_registry[index]); if (port_hash_insert(_registry[index], - usin->sin_addr.s_addr, - usin->sin_port ?: index + auto_port_start)) { + sin->sin_addr.s_addr, + sin->sin_port ?: index + auto_port_start)) { port_hash_insert(_registry[index], port_registry[index].saddr, port_registry[index].sport); @@ -207,51 +213,64 @@ int rt_udp_bind(struct rtsocket *sock, const struct sockaddr *addr, /*** * rt_udp_connect */ -int rt_udp_connect(struct rtsocket *sock, const struct sockaddr *serv_addr, - socklen_t addrlen) +int rt_udp_connect(struct rtdm_fd *fd, struct rtsocket *sock, + const struct sockaddr __user *serv_addr, socklen_t addrlen) { -struct sockaddr_in *usin = (struct sockaddr_in *) serv_addr; -rtdm_lockctx_t context; -int index; - - -if (usin->sin_family == AF_UNSPEC) { -if ((index = sock->prot.inet.reg_index) < 0) -/* socket is being closed */ -return -EBADF; - -rtdm_lock_get_irqsave(_socket_base_lock, context); - -sock->prot.inet.saddr = INADDR_ANY; -/* Note: The following line differs from standard stacks, and we also - don't remove the socket from the port list. Might get fixed in - the future... */ -sock->prot.inet.sport = index + auto_port_start; -sock->prot.inet.daddr = INADDR_ANY; -sock->prot.inet.dport = 0; -sock->prot.inet.state = TCP_CLOSE; - -rtdm_lock_put_irqrestore(_socket_base_lock, context); -} else { -if ((addrlen < (int)sizeof(struct sockaddr_in)) || -(usin->sin_family != AF_INET)) -return -EINVAL; - -rtdm_lock_get_irqsave(_socket_base_lock, context); - -if (sock->prot.inet.state != TCP_CLOSE) { -rtdm_lock_put_irqrestore(_socket_base_lock, context); -return -EINVAL; -} - -sock->prot.inet.state = TCP_ESTABLISHED; -sock->prot.inet.daddr = usin->sin_addr.s_addr; -sock->prot.inet.dport = usin->sin_port; - -rtdm_lock_put_irqrestore(_socket_base_lock, context); -} + struct sockaddr _sa, *sa; + struct sockaddr_in _sin, *sin; + rtdm_lockctx_t context; + int index; + + if (addrlen < sizeof(struct sockaddr)) + return -EINVAL; + + sa = rtnet_get_arg(fd, &_sa, serv_addr, sizeof(_sa)); + if (IS_ERR(sa)) + return PTR_ERR(sa); + + if (sa->sa_family == AF_UNSPEC) { + if ((index = sock->prot.inet.reg_index) < 0) + /* socket is being closed */ + return -EBADF; + + rtdm_lock_get_irqsave(_socket_base_lock, context); + + sock->prot.inet.saddr = INADDR_ANY; + /* Note: The following line differs from standard + stacks, and we also don't remove the socket
[Xenomai-git] Philippe Gerum : net: drop superfluous, broken includes
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 925709991068539f9d29ca3fffc3835d5d5d0140 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=925709991068539f9d29ca3fffc3835d5d5d0140 Author: Philippe GerumDate: Sun Jan 7 18:58:29 2018 +0100 net: drop superfluous, broken includes --- kernel/drivers/net/stack/rtcfg/rtcfg_event.c |1 - kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c |1 - kernel/drivers/net/stack/rtnet_chrdev.c |1 - kernel/drivers/net/stack/rtnet_rtpc.c|2 -- 4 files changed, 5 deletions(-) diff --git a/kernel/drivers/net/stack/rtcfg/rtcfg_event.c b/kernel/drivers/net/stack/rtcfg/rtcfg_event.c index 3569459..2e0324c 100644 --- a/kernel/drivers/net/stack/rtcfg/rtcfg_event.c +++ b/kernel/drivers/net/stack/rtcfg/rtcfg_event.c @@ -22,7 +22,6 @@ * */ -#include #include #include #include diff --git a/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c b/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c index 0241754..d7ed720 100644 --- a/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c +++ b/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c @@ -22,7 +22,6 @@ * */ -#include #include #include diff --git a/kernel/drivers/net/stack/rtnet_chrdev.c b/kernel/drivers/net/stack/rtnet_chrdev.c index f06ff2a..f5f32c9 100644 --- a/kernel/drivers/net/stack/rtnet_chrdev.c +++ b/kernel/drivers/net/stack/rtnet_chrdev.c @@ -22,7 +22,6 @@ * */ -#include #include #include #include diff --git a/kernel/drivers/net/stack/rtnet_rtpc.c b/kernel/drivers/net/stack/rtnet_rtpc.c index 54a8137..c99f4f0 100644 --- a/kernel/drivers/net/stack/rtnet_rtpc.c +++ b/kernel/drivers/net/stack/rtnet_rtpc.c @@ -22,8 +22,6 @@ * */ -#include -#include #include #include #include ___ 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: cb707ef0bf1726d1aea59d5bd46a4ebb563e60da URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cb707ef0bf1726d1aea59d5bd46a4ebb563e60da 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/packet: ioctl: remove direct references to user memory (3)
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: a9e0c0a735ae23a58f05c1408e244a3f9cfdc910 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a9e0c0a735ae23a58f05c1408e244a3f9cfdc910 Author: Philippe GerumDate: Sun Jan 7 18:24:18 2018 +0100 net/packet: ioctl: remove direct references to user memory (3) --- kernel/drivers/net/stack/packet/af_packet.c | 12 ++-- 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kernel/drivers/net/stack/packet/af_packet.c b/kernel/drivers/net/stack/packet/af_packet.c index 56daba8..9fa985d 100644 --- a/kernel/drivers/net/stack/packet/af_packet.c +++ b/kernel/drivers/net/stack/packet/af_packet.c @@ -305,7 +305,7 @@ static int rt_packet_ioctl(struct rtdm_fd *fd, unsigned int request, void __user * rt_packet_recvmsg */ static ssize_t -rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) +rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *u_msg, int msg_flags) { struct rtsocket *sock = rtdm_fd_to_private(fd); ssize_t len; @@ -314,11 +314,11 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) struct sockaddr_ll sll; intret, flags; nanosecs_rel_t timeout = sock->timeout; -struct user_msghdr _msg; +struct user_msghdr _msg, *msg; socklen_t namelen; struct iovec iov_fast[RTDM_IOV_FASTMAX], *iov; -msg = rtnet_get_arg(fd, &_msg, msg, sizeof(*msg)); +msg = rtnet_get_arg(fd, &_msg, u_msg, sizeof(_msg)); if (IS_ERR(msg)) return PTR_ERR(msg); @@ -364,12 +364,12 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) /* 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; - ret = rtnet_put_arg(fd, >msg_name, , sizeof(sll)); + ret = rtnet_put_arg(fd, msg->msg_name, , sizeof(sll)); if (ret) goto fail; namelen = sizeof(sll); - ret = rtnet_put_arg(fd, >msg_namelen, , sizeof(namelen)); + ret = rtnet_put_arg(fd, _msg->msg_namelen, , sizeof(namelen)); if (ret) goto fail; } @@ -389,7 +389,7 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) if (copy_len > len) { copy_len = len; flags = msg->msg_flags | MSG_TRUNC; - ret = rtnet_put_arg(fd, >msg_flags, , sizeof(flags)); + ret = rtnet_put_arg(fd, _msg->msg_flags, , sizeof(flags)); if (ret) goto fail; } ___ 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: 98d70068cdcbbfb1791c7cd2a7f97ae8ccbe98d3 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=98d70068cdcbbfb1791c7cd2a7f97ae8ccbe98d3 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/packet: sendmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 2fbc33b858fd056d7ac47570daa5e35957da0086 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2fbc33b858fd056d7ac47570daa5e35957da0086 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/packet: recvmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: d7411a1d3baa1ae51f10b1754c0718219cb424e5 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d7411a1d3baa1ae51f10b1754c0718219cb424e5 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/tcp: sendmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 7f8eeff852c6ed2408349570402e13a247b3b106 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7f8eeff852c6ed2408349570402e13a247b3b106 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/udp: ioctl: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: ed185a6790ad6ac55b425e6240c16c999daf50b0 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ed185a6790ad6ac55b425e6240c16c999daf50b0 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/tcp: ioctl: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: ef48e5182069b4a7e495a1b46fb898fa42929823 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ef48e5182069b4a7e495a1b46fb898fa42929823 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] Philippe Gerum : net/tcp: recvmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 4af6b1b7243b01d759775a4766dbfa0d6f3d7368 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=4af6b1b7243b01d759775a4766dbfa0d6f3d7368 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/packet: ioctl: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: ab7b3807b282c50d3cb550ff8a0a3a30e8019c10 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ab7b3807b282c50d3cb550ff8a0a3a30e8019c10 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/iovec: add copy iterators for iovec[]
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 74a7a057fe954eae249fa8e3056abbc3f2dcf03c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=74a7a057fe954eae249fa8e3056abbc3f2dcf03c 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 : cobalt/rtdm: fix semaphore wait mode for fd_cleanup thread
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: ac098c017c392d105d3d67ff497077ad5db1b45b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ac098c017c392d105d3d67ff497077ad5db1b45b Author: Philippe GerumDate: Mon Jan 15 14:45:22 2018 +0100 cobalt/rtdm: fix semaphore wait mode for fd_cleanup thread This thread must wait for work in interruptible mode, does not wait for a device event. This fixes the bad process time accounting which otherwise would converge to 1.00 for an idle system when the Cobalt core is enabled. --- kernel/cobalt/rtdm/fd.c |9 - 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/kernel/cobalt/rtdm/fd.c b/kernel/cobalt/rtdm/fd.c index 7daf532..b4d3920 100644 --- a/kernel/cobalt/rtdm/fd.c +++ b/kernel/cobalt/rtdm/fd.c @@ -245,11 +245,10 @@ static int fd_cleanup_thread(void *data) set_cpus_allowed_ptr(current, cpu_online_mask); do { - err = down_killable(_fd_cleanup_sem); - } while (err && !kthread_should_stop()); - - if (kthread_should_stop()) - break; + err = down_interruptible(_fd_cleanup_sem); + if (kthread_should_stop()) + return 0; + } while (err); xnlock_get_irqsave(_lock, s); fd = list_first_entry(_fd_cleanup_queue, ___ 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: 33c43f43cf6d8851e08424e0ad15a42c5d88c2bf URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=33c43f43cf6d8851e08424e0ad15a42c5d88c2bf 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: wire up corectl interface
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: dfbefb86f3de1e570914d9f8ecc7ef77a5f81088 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=dfbefb86f3de1e570914d9f8ecc7ef77a5f81088 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] Philippe Gerum : net/cap: fix panic in rtcap_signal_handler()
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 5fb8fb04ac93bf2190408f8734c5b61a33dc6176 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=5fb8fb04ac93bf2190408f8734c5b61a33dc6176 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 : cobalt/rtdm: fix semaphore wait mode for fd_cleanup thread
Module: xenomai-3 Branch: stable-3.0.x Commit: ac098c017c392d105d3d67ff497077ad5db1b45b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ac098c017c392d105d3d67ff497077ad5db1b45b Author: Philippe GerumDate: Mon Jan 15 14:45:22 2018 +0100 cobalt/rtdm: fix semaphore wait mode for fd_cleanup thread This thread must wait for work in interruptible mode, does not wait for a device event. This fixes the bad process time accounting which otherwise would converge to 1.00 for an idle system when the Cobalt core is enabled. --- kernel/cobalt/rtdm/fd.c |9 - 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/kernel/cobalt/rtdm/fd.c b/kernel/cobalt/rtdm/fd.c index 7daf532..b4d3920 100644 --- a/kernel/cobalt/rtdm/fd.c +++ b/kernel/cobalt/rtdm/fd.c @@ -245,11 +245,10 @@ static int fd_cleanup_thread(void *data) set_cpus_allowed_ptr(current, cpu_online_mask); do { - err = down_killable(_fd_cleanup_sem); - } while (err && !kthread_should_stop()); - - if (kthread_should_stop()) - break; + err = down_interruptible(_fd_cleanup_sem); + if (kthread_should_stop()) + return 0; + } while (err); xnlock_get_irqsave(_lock, s); fd = list_first_entry(_fd_cleanup_queue, ___ 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: 62696c26ea86c6b008946f1b747aed297b53f96f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=62696c26ea86c6b008946f1b747aed297b53f96f 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/udp: ioctl: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: ffe372fe069b49a0167dd113e25e896e1fe9e8f9 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ffe372fe069b49a0167dd113e25e896e1fe9e8f9 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: drop superfluous, broken includes
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: cd3cf0cf7dfcd5f2adb3eee1c5fade7ab9aadbca URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cd3cf0cf7dfcd5f2adb3eee1c5fade7ab9aadbca Author: Philippe GerumDate: Sun Jan 7 18:58:29 2018 +0100 net: drop superfluous, broken includes --- kernel/drivers/net/stack/rtcfg/rtcfg_event.c |1 - kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c |1 - kernel/drivers/net/stack/rtnet_chrdev.c |1 - kernel/drivers/net/stack/rtnet_rtpc.c|2 -- 4 files changed, 5 deletions(-) diff --git a/kernel/drivers/net/stack/rtcfg/rtcfg_event.c b/kernel/drivers/net/stack/rtcfg/rtcfg_event.c index 3569459..2e0324c 100644 --- a/kernel/drivers/net/stack/rtcfg/rtcfg_event.c +++ b/kernel/drivers/net/stack/rtcfg/rtcfg_event.c @@ -22,7 +22,6 @@ * */ -#include #include #include #include diff --git a/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c b/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c index 0241754..d7ed720 100644 --- a/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c +++ b/kernel/drivers/net/stack/rtcfg/rtcfg_ioctl.c @@ -22,7 +22,6 @@ * */ -#include #include #include diff --git a/kernel/drivers/net/stack/rtnet_chrdev.c b/kernel/drivers/net/stack/rtnet_chrdev.c index f06ff2a..f5f32c9 100644 --- a/kernel/drivers/net/stack/rtnet_chrdev.c +++ b/kernel/drivers/net/stack/rtnet_chrdev.c @@ -22,7 +22,6 @@ * */ -#include #include #include #include diff --git a/kernel/drivers/net/stack/rtnet_rtpc.c b/kernel/drivers/net/stack/rtnet_rtpc.c index 54a8137..c99f4f0 100644 --- a/kernel/drivers/net/stack/rtnet_rtpc.c +++ b/kernel/drivers/net/stack/rtnet_rtpc.c @@ -22,8 +22,6 @@ * */ -#include -#include #include #include #include ___ 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: 2815ba1805e8c16a8b0d914a2c9137d3b24e6480 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2815ba1805e8c16a8b0d914a2c9137d3b24e6480 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/udp: recvmsg, ioctl: remove direct references to user memory (2)
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 2878891f538e2cd093abd496efd8e3e966e25671 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2878891f538e2cd093abd496efd8e3e966e25671 Author: Philippe GerumDate: Sun Jan 7 18:23:57 2018 +0100 net/udp: recvmsg, ioctl: remove direct references to user memory (2) --- kernel/drivers/net/stack/ipv4/udp/udp.c | 137 ++- 1 file changed, 78 insertions(+), 59 deletions(-) diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c b/kernel/drivers/net/stack/ipv4/udp/udp.c index 4368303..8e80d3e 100644 --- a/kernel/drivers/net/stack/ipv4/udp/udp.c +++ b/kernel/drivers/net/stack/ipv4/udp/udp.c @@ -154,18 +154,24 @@ static inline struct rtsocket *rt_udp_v4_lookup(u32 daddr, u16 dport) * @s: socket * @addr: local address */ -int rt_udp_bind(struct rtsocket *sock, const struct sockaddr *addr, -socklen_t addrlen) +int rt_udp_bind(struct rtdm_fd *fd, struct rtsocket *sock, + const struct sockaddr __user *addr, socklen_t addrlen) { -struct sockaddr_in *usin = (struct sockaddr_in *)addr; +struct sockaddr_in _sin, *sin; rtdm_lockctx_t context; int index; int err = 0; -if ((addrlen < (int)sizeof(struct sockaddr_in)) || -((usin->sin_port & auto_port_mask) == auto_port_start)) -return -EINVAL; +if (addrlen < sizeof(struct sockaddr_in)) + return -EINVAL; + +sin = rtnet_get_arg(fd, &_sin, addr, sizeof(_sin)); +if (IS_ERR(sin)) + return PTR_ERR(sin); + +if ((sin->sin_port & auto_port_mask) == auto_port_start) + return -EINVAL; rtdm_lock_get_irqsave(_socket_base_lock, context); @@ -181,8 +187,8 @@ int rt_udp_bind(struct rtsocket *sock, const struct sockaddr *addr, port_hash_del(_registry[index]); if (port_hash_insert(_registry[index], - usin->sin_addr.s_addr, - usin->sin_port ?: index + auto_port_start)) { + sin->sin_addr.s_addr, + sin->sin_port ?: index + auto_port_start)) { port_hash_insert(_registry[index], port_registry[index].saddr, port_registry[index].sport); @@ -207,51 +213,64 @@ int rt_udp_bind(struct rtsocket *sock, const struct sockaddr *addr, /*** * rt_udp_connect */ -int rt_udp_connect(struct rtsocket *sock, const struct sockaddr *serv_addr, - socklen_t addrlen) +int rt_udp_connect(struct rtdm_fd *fd, struct rtsocket *sock, + const struct sockaddr __user *serv_addr, socklen_t addrlen) { -struct sockaddr_in *usin = (struct sockaddr_in *) serv_addr; -rtdm_lockctx_t context; -int index; - - -if (usin->sin_family == AF_UNSPEC) { -if ((index = sock->prot.inet.reg_index) < 0) -/* socket is being closed */ -return -EBADF; - -rtdm_lock_get_irqsave(_socket_base_lock, context); - -sock->prot.inet.saddr = INADDR_ANY; -/* Note: The following line differs from standard stacks, and we also - don't remove the socket from the port list. Might get fixed in - the future... */ -sock->prot.inet.sport = index + auto_port_start; -sock->prot.inet.daddr = INADDR_ANY; -sock->prot.inet.dport = 0; -sock->prot.inet.state = TCP_CLOSE; - -rtdm_lock_put_irqrestore(_socket_base_lock, context); -} else { -if ((addrlen < (int)sizeof(struct sockaddr_in)) || -(usin->sin_family != AF_INET)) -return -EINVAL; - -rtdm_lock_get_irqsave(_socket_base_lock, context); - -if (sock->prot.inet.state != TCP_CLOSE) { -rtdm_lock_put_irqrestore(_socket_base_lock, context); -return -EINVAL; -} - -sock->prot.inet.state = TCP_ESTABLISHED; -sock->prot.inet.daddr = usin->sin_addr.s_addr; -sock->prot.inet.dport = usin->sin_port; - -rtdm_lock_put_irqrestore(_socket_base_lock, context); -} + struct sockaddr _sa, *sa; + struct sockaddr_in _sin, *sin; + rtdm_lockctx_t context; + int index; + + if (addrlen < sizeof(struct sockaddr)) + return -EINVAL; + + sa = rtnet_get_arg(fd, &_sa, serv_addr, sizeof(_sa)); + if (IS_ERR(sa)) + return PTR_ERR(sa); + + if (sa->sa_family == AF_UNSPEC) { + if ((index = sock->prot.inet.reg_index) < 0) + /* socket is being closed */ + return -EBADF; + + rtdm_lock_get_irqsave(_socket_base_lock, context); + + sock->prot.inet.saddr = INADDR_ANY; + /* Note: The following line differs from standard + stacks, and we also don't remove the socket
[Xenomai-git] Philippe Gerum : net/packet: sendmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: b03907363c31318060e7beaaa67d02b8a3700c06 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b03907363c31318060e7beaaa67d02b8a3700c06 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/cap: fix panic in rtcap_signal_handler()
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 37d1b906573a008d977e40fc8f29cf70a6bd712d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=37d1b906573a008d977e40fc8f29cf70a6bd712d 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/socket: ioctl: remove direct references to user memory (2)
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 1b841edf72ca869f4a4aa9f826f3d5417d3d988c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1b841edf72ca869f4a4aa9f826f3d5417d3d988c Author: Philippe GerumDate: Sun Jan 7 18:26:48 2018 +0100 net/socket: ioctl: remove direct references to user memory (2) --- kernel/drivers/net/stack/socket.c | 47 - 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/kernel/drivers/net/stack/socket.c b/kernel/drivers/net/stack/socket.c index 5b2..d7d36d5 100644 --- a/kernel/drivers/net/stack/socket.c +++ b/kernel/drivers/net/stack/socket.c @@ -243,25 +243,20 @@ EXPORT_SYMBOL_GPL(rt_socket_common_ioctl); int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg) { struct rtnet_device *rtdev; -const struct ifreq *ifr; -struct ifreq_ifr, *ifrw; +struct ifreq _ifr, *ifr, *u_ifr; struct sockaddr_in _sin; -const struct ifconf *ifc; -struct ifconf _ifc, *ifcw; +struct ifconf _ifc, *ifc, *u_ifc; int ret = 0, size = 0, i; short flags; if (request == SIOCGIFCONF) { - ifc = rtnet_get_arg(fd, &_ifc, arg, sizeof(_ifc)); + u_ifc = arg; + ifc = rtnet_get_arg(fd, &_ifc, u_ifc, sizeof(_ifc)); if (IS_ERR(ifc)) return PTR_ERR(ifc); - for (ifrw = ifc->ifc_req, i = 1; i <= MAX_RT_DEVICES; i++) { - ifrw = (struct ifreq *)rtnet_get_arg(fd, &_ifr, ifrw, sizeof(_ifr)); - if (IS_ERR(ifrw)) - return PTR_ERR(ifrw); - + for (u_ifr = ifc->ifc_req, i = 1; i <= MAX_RT_DEVICES; i++, u_ifr++) { rtdev = rtdev_get_by_index(i); if (rtdev == NULL) continue; @@ -278,26 +273,24 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg) break; } - ret = rtnet_put_arg(fd, ifrw->ifr_name, rtdev->name, IFNAMSIZ); + ret = rtnet_put_arg(fd, u_ifr->ifr_name, rtdev->name, IFNAMSIZ); if (ret == 0) { memset(&_sin, 0, sizeof(_sin)); _sin.sin_family = AF_INET; _sin.sin_addr.s_addr = rtdev->local_ip; - ret = rtnet_put_arg(fd, >ifr_addr, &_sin, sizeof(ifrw->ifr_addr)); + ret = rtnet_put_arg(fd, _ifr->ifr_addr, &_sin, sizeof(_sin)); } rtdev_dereference(rtdev); if (ret) return ret; - ifrw++; } - ifcw = arg; - return rtnet_put_arg(fd, >ifc_len, , sizeof(size)); + return rtnet_put_arg(fd, _ifc->ifc_len, , sizeof(size)); } -ifrw = arg; -ifr = rtnet_get_arg(fd, &_ifr, arg, sizeof(_ifr)); +u_ifr = arg; +ifr = rtnet_get_arg(fd, &_ifr, u_ifr, sizeof(_ifr)); if (IS_ERR(ifr)) return PTR_ERR(ifr); @@ -305,7 +298,7 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg) rtdev = rtdev_get_by_index(ifr->ifr_ifindex); if (rtdev == NULL) return -ENODEV; - ret = rtnet_put_arg(fd, ifrw->ifr_name, rtdev->name, IFNAMSIZ); + ret = rtnet_put_arg(fd, u_ifr->ifr_name, rtdev->name, IFNAMSIZ); goto out; } @@ -315,8 +308,8 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg) switch (request) { case SIOCGIFINDEX: - ret = rtnet_put_arg(fd, >ifr_ifindex, >ifindex, - sizeof(ifrw->ifr_ifindex)); + ret = rtnet_put_arg(fd, _ifr->ifr_ifindex, >ifindex, + sizeof(u_ifr->ifr_ifindex)); break; case SIOCGIFFLAGS: @@ -327,23 +320,23 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, void __user *arg) | RTNET_LINK_STATE_NOCARRIER)) == RTNET_LINK_STATE_PRESENT) flags |= IFF_RUNNING; - ret = rtnet_put_arg(fd, >ifr_flags, , - sizeof(ifrw->ifr_flags)); + ret = rtnet_put_arg(fd, _ifr->ifr_flags, , + sizeof(u_ifr->ifr_flags)); break; case SIOCGIFHWADDR: - ret = rtnet_put_arg(fd, >ifr_hwaddr.sa_data, rtdev->dev_addr, - rtdev->addr_len); + ret = rtnet_put_arg(fd, _ifr->ifr_hwaddr.sa_data, + rtdev->dev_addr, rtdev->addr_len); if (!ret) - ret = rtnet_put_arg(fd, >ifr_hwaddr.sa_family, >type, - sizeof(ifrw->ifr_hwaddr.sa_family)); + ret = rtnet_put_arg(fd, _ifr->ifr_hwaddr.sa_family, +
[Xenomai-git] Philippe Gerum : net/iovec: drop useless kernel<-> iovec[] copy helpers
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 395c66ad00f2d8f57916cc77c3afdd71d0f26b8a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=395c66ad00f2d8f57916cc77c3afdd71d0f26b8a 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/tcp: ioctl: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: d121ef4f5d6e78a194d97b50d8bbca6dae9871c5 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d121ef4f5d6e78a194d97b50d8bbca6dae9871c5 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] Philippe Gerum : net: convert to rtdm_get_iov_flatlen()
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 630b1cd6d4e47d80c4ac751c31072be256a3ef71 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=630b1cd6d4e47d80c4ac751c31072be256a3ef71 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/udp: ioctl: fix temp arg buffer type
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: da90bbe0a85efd3c5ce4728f60e12466a2666779 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=da90bbe0a85efd3c5ce4728f60e12466a2666779 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: 968caacaf6c34ddd91d86bcc773b2d8fa74bb511 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=968caacaf6c34ddd91d86bcc773b2d8fa74bb511 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/powerpc: include proper header for ptrace
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: c1b0b74ec84b8314c9388e45128efe0c73c3be2a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c1b0b74ec84b8314c9388e45128efe0c73c3be2a Author: Philippe GerumDate: Sun Jan 7 18:58:00 2018 +0100 cobalt/powerpc: include proper header for ptrace --- kernel/cobalt/arch/powerpc/include/asm/xenomai/syscall.h |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cobalt/arch/powerpc/include/asm/xenomai/syscall.h b/kernel/cobalt/arch/powerpc/include/asm/xenomai/syscall.h index 6a9e836..2edd5eb 100644 --- a/kernel/cobalt/arch/powerpc/include/asm/xenomai/syscall.h +++ b/kernel/cobalt/arch/powerpc/include/asm/xenomai/syscall.h @@ -23,7 +23,7 @@ #define _COBALT_POWERPC_ASM_SYSCALL_H #include -#include +#include #include #define __xn_reg_sys(__regs) ((__regs)->gpr[0]) ___ 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
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 3cf85b1f9245d17432faaead869af97f64a9bf9a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3cf85b1f9245d17432faaead869af97f64a9bf9a 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/udp: recvmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 1db36f2b2db10717312da68cb75702c388bd5f90 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1db36f2b2db10717312da68cb75702c388bd5f90 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 : cobalt/rtdm: factor out iovec[] copy routines
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 9a5a058a6fde92f7286928907a83cb47ae144a95 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9a5a058a6fde92f7286928907a83cb47ae144a95 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 : drivers/gpio: allow open coded IRQ handling
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 8ba470914477247c42e0e5a56f145849b3eb6ecd URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8ba470914477247c42e0e5a56f145849b3eb6ecd Author: Philippe GerumDate: Thu Jan 11 12:30:23 2018 +0100 drivers/gpio: allow open coded IRQ handling Some client code may want to deal with GPIO interrupt handling directly, without support for an irq_chip controller paired with the GPIO chip. Assume that a failure to retrieve the IRQ number associated to a pin means exactly that, offloading interrupt handling to an open coded implementation the client code should provide for. In parallel, introduce rtdm_gpiochip_post_event() for notifying the GPIO core from an incoming interrupt event on a given pin. --- include/cobalt/kernel/rtdm/Makefile.am |1 + .../cobalt/kernel/rtdm/gpio.h | 27 -- kernel/drivers/gpio/gpio-bcm2835.c |2 +- kernel/drivers/gpio/gpio-core.c| 90 +++- kernel/drivers/gpio/gpio-mxc.c |2 +- kernel/drivers/gpio/gpio-sun8i-h3.c|2 +- kernel/drivers/gpio/gpio-zynq7000.c|2 +- 7 files changed, 73 insertions(+), 53 deletions(-) diff --git a/include/cobalt/kernel/rtdm/Makefile.am b/include/cobalt/kernel/rtdm/Makefile.am index 2c04cac..5fc6783 100644 --- a/include/cobalt/kernel/rtdm/Makefile.am +++ b/include/cobalt/kernel/rtdm/Makefile.am @@ -6,6 +6,7 @@ noinst_HEADERS =\ compat.h\ driver.h\ fd.h\ + gpio.h \ ipc.h \ rtdm.h \ serial.h\ diff --git a/kernel/drivers/gpio/gpio-core.h b/include/cobalt/kernel/rtdm/gpio.h similarity index 74% rename from kernel/drivers/gpio/gpio-core.h rename to include/cobalt/kernel/rtdm/gpio.h index 96e0f7b..224b562 100644 --- a/kernel/drivers/gpio/gpio-core.h +++ b/include/cobalt/kernel/rtdm/gpio.h @@ -1,7 +1,7 @@ /** - * @note Copyright (C) 2016 Philippe Gerum + * Copyright (C) 2016 Philippe Gerum * - * This program is free software; you can redistribute it and/or + * Xenomai is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. @@ -15,8 +15,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef _RTDM_GPIO_CORE_H -#define _RTDM_GPIO_CORE_H +#ifndef _COBALT_RTDM_GPIO_H +#define _COBALT_RTDM_GPIO_H #include #include @@ -24,14 +24,24 @@ struct class; struct device_node; +struct gpio_desc; + +struct rtdm_gpio_pin { + struct rtdm_device dev; + struct list_head next; + rtdm_irq_t irqh; + rtdm_event_t event; + char *name; + struct gpio_desc *desc; +}; struct rtdm_gpio_chip { struct gpio_chip *gc; struct rtdm_driver driver; struct class *devclass; - struct list_head pins; struct list_head next; rtdm_lock_t lock; + struct rtdm_gpio_pin pins[0]; }; int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, @@ -46,6 +56,9 @@ void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc); int rtdm_gpiochip_add_by_name(struct rtdm_gpio_chip *rgc, const char *label, int gpio_subclass); +int rtdm_gpiochip_post_event(struct rtdm_gpio_chip *rgc, +unsigned int offset); + #ifdef CONFIG_OF int rtdm_gpiochip_scan_of(struct device_node *from, @@ -53,8 +66,6 @@ int rtdm_gpiochip_scan_of(struct device_node *from, void rtdm_gpiochip_remove_of(int type); -extern struct list_head rtdm_gpio_chips; - #endif -#endif /* !_RTDM_GPIO_CORE_H */ +#endif /* !_COBALT_RTDM_GPIO_H */ diff --git a/kernel/drivers/gpio/gpio-bcm2835.c b/kernel/drivers/gpio/gpio-bcm2835.c index 186df66..f30d6b5 100644 --- a/kernel/drivers/gpio/gpio-bcm2835.c +++ b/kernel/drivers/gpio/gpio-bcm2835.c @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include -#include "gpio-core.h" +#include #define RTDM_SUBCLASS_BCM2835 1 diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 05eafb1..1bf8a9c 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -22,16 +22,7 @@ #include #include #include -#include "gpio-core.h" - -struct rtdm_gpio_pin { - struct rtdm_device dev; - struct list_head next; - rtdm_irq_t irqh; - rtdm_event_t event; - char *name; - struct gpio_desc *desc; -}; +#include struct rtdm_gpio_chan { int requested : 1, @@ -59,8 +50,7 @@ static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin
[Xenomai-git] Philippe Gerum : net/packet: recvmsg: write back namelen only if name required
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: de3677ba112349317eef8459a6d2dd5ae3514163 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=de3677ba112349317eef8459a6d2dd5ae3514163 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/udp: recvmsg: write back namelen only if name required
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 2fd8127356b0d11417fccaccd716dc9057ce4fb0 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2fd8127356b0d11417fccaccd716dc9057ce4fb0 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/iovec: add copy iterators for iovec[]
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: b127f5435c3b7cb19df917ef1d46d3522b1b414d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b127f5435c3b7cb19df917ef1d46d3522b1b414d 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/packet: ioctl: remove direct references to user memory (3)
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 535352895bf22f8a1c28493e1f3d70ebfc6f70f2 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=535352895bf22f8a1c28493e1f3d70ebfc6f70f2 Author: Philippe GerumDate: Sun Jan 7 18:24:18 2018 +0100 net/packet: ioctl: remove direct references to user memory (3) --- kernel/drivers/net/stack/packet/af_packet.c | 12 ++-- 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kernel/drivers/net/stack/packet/af_packet.c b/kernel/drivers/net/stack/packet/af_packet.c index 56daba8..9fa985d 100644 --- a/kernel/drivers/net/stack/packet/af_packet.c +++ b/kernel/drivers/net/stack/packet/af_packet.c @@ -305,7 +305,7 @@ static int rt_packet_ioctl(struct rtdm_fd *fd, unsigned int request, void __user * rt_packet_recvmsg */ static ssize_t -rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) +rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *u_msg, int msg_flags) { struct rtsocket *sock = rtdm_fd_to_private(fd); ssize_t len; @@ -314,11 +314,11 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) struct sockaddr_ll sll; intret, flags; nanosecs_rel_t timeout = sock->timeout; -struct user_msghdr _msg; +struct user_msghdr _msg, *msg; socklen_t namelen; struct iovec iov_fast[RTDM_IOV_FASTMAX], *iov; -msg = rtnet_get_arg(fd, &_msg, msg, sizeof(*msg)); +msg = rtnet_get_arg(fd, &_msg, u_msg, sizeof(_msg)); if (IS_ERR(msg)) return PTR_ERR(msg); @@ -364,12 +364,12 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) /* 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; - ret = rtnet_put_arg(fd, >msg_name, , sizeof(sll)); + ret = rtnet_put_arg(fd, msg->msg_name, , sizeof(sll)); if (ret) goto fail; namelen = sizeof(sll); - ret = rtnet_put_arg(fd, >msg_namelen, , sizeof(namelen)); + ret = rtnet_put_arg(fd, _msg->msg_namelen, , sizeof(namelen)); if (ret) goto fail; } @@ -389,7 +389,7 @@ rt_packet_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int msg_flags) if (copy_len > len) { copy_len = len; flags = msg->msg_flags | MSG_TRUNC; - ret = rtnet_put_arg(fd, >msg_flags, , sizeof(flags)); + ret = rtnet_put_arg(fd, _msg->msg_flags, , sizeof(flags)); if (ret) goto fail; } ___ 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: 84b4013f9df2634341298966a489ffbeb23d0d53 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=84b4013f9df2634341298966a489ffbeb23d0d53 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/tcp: fix invalid reference in getsockopt()
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 5db979646e9115b3e1de9e9759848df62b546e0c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=5db979646e9115b3e1de9e9759848df62b546e0c 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] Philippe Gerum : net/packet: recvmsg: remove direct references to user memory
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 7db71fc8242f6cc44629d10f995bc63f6b22e6ec URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7db71fc8242f6cc44629d10f995bc63f6b22e6ec 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/socket: add get_arg/put_arg helpers
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: d0c48d747bb90cac8ab9f87896345c6898e6048b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d0c48d747bb90cac8ab9f87896345c6898e6048b 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 : drivers/gpio: pass back allocated GPIO chip descriptor
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 7ffd31e5c576699f62f1e832eee610fd2372ed14 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7ffd31e5c576699f62f1e832eee610fd2372ed14 Author: Philippe GerumDate: Thu Jan 11 15:50:28 2018 +0100 drivers/gpio: pass back allocated GPIO chip descriptor rtdm_gpiochip_alloc() is a way to instantiate a single GPIO descriptor instead of mapping all GPIO controllers defined by the firmware which belong to a particular type. This routine is matched by rtdm_gpiochip_remove() for deallocation. We need the former to return a pointer to the allocated descriptor we may then pass to the latter. --- include/cobalt/kernel/rtdm/gpio.h |5 +++-- kernel/drivers/gpio/gpio-core.c | 26 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/include/cobalt/kernel/rtdm/gpio.h b/include/cobalt/kernel/rtdm/gpio.h index 224b562..378a678 100644 --- a/include/cobalt/kernel/rtdm/gpio.h +++ b/include/cobalt/kernel/rtdm/gpio.h @@ -48,8 +48,9 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, struct gpio_chip *gc, int gpio_subclass); -int rtdm_gpiochip_alloc(struct gpio_chip *gc, - int gpio_subclass); +struct rtdm_gpio_chip * +rtdm_gpiochip_alloc(struct gpio_chip *gc, + int gpio_subclass); void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc); diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 1bf8a9c..3e97547 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -376,9 +376,6 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, { int ret; - if (!realtime_core_enabled()) - return 0; - rgc->devclass = class_create(gc->owner, gc->label); if (IS_ERR(rgc->devclass)) { printk(XENO_ERR "cannot create sysfs class\n"); @@ -417,31 +414,32 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, } EXPORT_SYMBOL_GPL(rtdm_gpiochip_add); -int rtdm_gpiochip_alloc(struct gpio_chip *gc, int gpio_subclass) +struct rtdm_gpio_chip * +rtdm_gpiochip_alloc(struct gpio_chip *gc, int gpio_subclass) { struct rtdm_gpio_chip *rgc; size_t asize; int ret; if (gc->ngpio == 0) - return -EINVAL; + return ERR_PTR(-EINVAL); asize = sizeof(*rgc) + gc->ngpio * sizeof(struct rtdm_gpio_pin); rgc = kzalloc(asize, GFP_KERNEL); if (rgc == NULL) - return -ENOMEM; + return ERR_PTR(-ENOMEM); ret = rtdm_gpiochip_add(rgc, gc, gpio_subclass); if (ret) { kfree(rgc); - return ret; + return ERR_PTR(ret); } mutex_lock(_lock); list_add(>next, _gpio_chips); mutex_unlock(_lock); - return 0; + return rgc; } EXPORT_SYMBOL_GPL(rtdm_gpiochip_alloc); @@ -535,8 +533,12 @@ int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, struct gpiochip_holder *h, *n; struct device_node *np = from; struct platform_device *pdev; + struct rtdm_gpio_chip *rgc; int ret = -ENODEV, _ret; + if (!realtime_core_enabled()) + return 0; + for (;;) { np = of_find_compatible_node(np, NULL, compat); if (np == NULL) @@ -552,7 +554,10 @@ int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, ret = 0; list_for_each_entry_safe(h, n, , next) { list_del(>next); - _ret = rtdm_gpiochip_alloc(h->chip, type); + _ret = 0; + rgc = rtdm_gpiochip_alloc(h->chip, type); + if (IS_ERR(rgc)) + _ret = PTR_ERR(rgc); kfree(h); if (_ret && !ret) ret = _ret; @@ -570,6 +575,9 @@ void rtdm_gpiochip_remove_of(int type) { struct rtdm_gpio_chip *rgc, *n; + if (!realtime_core_enabled()) + return; + list_for_each_entry_safe(rgc, n, _gpio_chips, next) { if (rgc->driver.profile_info.subclass_id == type) { rtdm_gpiochip_remove(rgc); ___ 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: 086f3236002f7c314dcfeeff81b556676470250e URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=086f3236002f7c314dcfeeff81b556676470250e 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] Philippe Gerum : drivers/gpio: expose GPIO chip allocation routine
Module: xenomai-3 Branch: wip/rtnet-fixes Commit: 062ed8e1d9c38a4aa3f058561654600b37fb6c5d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=062ed8e1d9c38a4aa3f058561654600b37fb6c5d Author: Philippe GerumDate: Tue Jan 9 17:40:39 2018 +0100 drivers/gpio: expose GPIO chip allocation routine For creating a new RTDM-based GPIO chip descriptor (struct rtdm_gpio_chip), mapped to its regular counterpart (struct gpio_chip). --- kernel/drivers/gpio/gpio-core.c | 64 +++ kernel/drivers/gpio/gpio-core.h |3 ++ 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index c19b1f7..05eafb1 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -40,6 +40,10 @@ struct rtdm_gpio_chan { is_interrupt : 1; }; +static LIST_HEAD(rtdm_gpio_chips); + +static DEFINE_MUTEX(chip_lock); + static int gpio_pin_interrupt(rtdm_irq_t *irqh) { struct rtdm_gpio_pin *pin; @@ -425,11 +429,34 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, } EXPORT_SYMBOL_GPL(rtdm_gpiochip_add); -void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc) +int rtdm_gpiochip_alloc(struct gpio_chip *gc, int gpio_subclass) { - if (!realtime_core_enabled()) - return; + struct rtdm_gpio_chip *rgc; + int ret; + rgc = kzalloc(sizeof(*rgc), GFP_KERNEL); + if (rgc == NULL) + return -ENOMEM; + + ret = rtdm_gpiochip_add(rgc, gc, gpio_subclass); + if (ret) { + kfree(rgc); + return ret; + } + + mutex_lock(_lock); + list_add(>next, _gpio_chips); + mutex_unlock(_lock); + + return 0; +} +EXPORT_SYMBOL_GPL(rtdm_gpiochip_alloc); + +void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc) +{ + mutex_lock(_lock); + list_del(>next); + mutex_unlock(_lock); delete_pin_devices(rgc); class_destroy(rgc->devclass); } @@ -463,10 +490,6 @@ EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name); #include -LIST_HEAD(rtdm_gpio_chips); - -static DEFINE_MUTEX(chip_lock); - struct gpiochip_holder { struct gpio_chip *chip; struct list_head next; @@ -497,28 +520,6 @@ static int match_gpio_chip(struct gpio_chip *gc, void *data) return 0; } -static int add_gpio_chip(struct gpio_chip *gc, int type) -{ - struct rtdm_gpio_chip *rgc; - int ret; - - rgc = kzalloc(sizeof(*rgc), GFP_KERNEL); - if (rgc == NULL) - return -ENOMEM; - - ret = rtdm_gpiochip_add(rgc, gc, type); - if (ret) { - kfree(rgc); - return ret; - } - - mutex_lock(_lock); - list_add(>next, _gpio_chips); - mutex_unlock(_lock); - - return 0; -} - int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, int type) { @@ -543,7 +544,7 @@ int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, ret = 0; list_for_each_entry_safe(h, n, , next) { list_del(>next); - _ret = add_gpio_chip(h->chip, type); + _ret = rtdm_gpiochip_alloc(h->chip, type); kfree(h); if (_ret && !ret) ret = _ret; @@ -563,9 +564,6 @@ void rtdm_gpiochip_remove_of(int type) list_for_each_entry_safe(rgc, n, _gpio_chips, next) { if (rgc->driver.profile_info.subclass_id == type) { - mutex_lock(_lock); - list_del(>next); - mutex_unlock(_lock); rtdm_gpiochip_remove(rgc); kfree(rgc); } diff --git a/kernel/drivers/gpio/gpio-core.h b/kernel/drivers/gpio/gpio-core.h index 11249e8..96e0f7b 100644 --- a/kernel/drivers/gpio/gpio-core.h +++ b/kernel/drivers/gpio/gpio-core.h @@ -38,6 +38,9 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, struct gpio_chip *gc, int gpio_subclass); +int rtdm_gpiochip_alloc(struct gpio_chip *gc, + int gpio_subclass); + void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc); int rtdm_gpiochip_add_by_name(struct rtdm_gpio_chip *rgc, ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] New commits on branch next
URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8f54824d94beaa549552d4c7eea54e6e4d86afe2 Author: Philippe GerumDate: Tue Oct 3 12:02:36 2017 +0200 demo/gpiopwn: include required header explicitly URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=35f8e79e1ee05138749d986f6e1a1cccf234d3e5 Author: Jan Kiszka Date: Fri Sep 29 12:21:21 2017 +0200 cobalt/tracing: Primarily identify threads via pid Except for the short phase between thread_init and shadow_map, a thread is always identifiable via the pid of its Linux mate. Use this shorter value, which also correlates with what ftrace records anyway, instead of the pointer or the name. Report the full thread name only in prominent cases: init, resume and switch. Signed-off-by: Jan Kiszka URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=599aac98cd1f96aa3689b70267753856c8644fe1 Author: Jan Kiszka Date: Fri Sep 29 10:32:42 2017 +0200 cobalt/tracing: Don't report current thread in tracepoints All these are synchronous, and the thread context is already recorded by ftrace. Signed-off-by: Jan Kiszka URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ca028e0620a7d23183000a9ea93a35f02464 Author: Jan Kiszka Date: Fri Sep 29 07:36:27 2017 +0200 cobalt/tracing: Print syscalls by name Matching numbers against syscall.h, specifically when the call is compat or x32, is tedious work. Fortunately, ftrace allows up to automate this. Signed-off-by: Jan Kiszka URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e06266abfe5bd6ea7b4ca5b9497f9f8b4d8812ce Author: Jan Kiszka Date: Fri May 6 14:40:00 2016 +0200 cobalt/tracing: Trace changes of the current thread priority Specifically useful to validate scheduling during PI or PP phases. Signed-off-by: Jan Kiszka URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8c2e95b32a986b4a790ae3f2bc4a073bddd7832c Author: Jan Kiszka Date: Thu Sep 28 20:54:24 2017 +0200 cobalt/tracing: Enhance cobalt_switch_context tracepoint Adding PIDs and the state of the previous task will allow to track Xenomai task switches in kernelshark (so far via out-of-tree patches, upstream is planning for the necessary plugin concept). Moreover, reporting the current priority on context switch helps debugging unexpected or delayed context switches Signed-off-by: Jan Kiszka URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b9a86cd737ba92dc92fddfc9247adb9ff054337b Author: Jan Kiszka Date: Thu Sep 28 19:57:49 2017 +0200 cobalt/tracing: Convert cobalt_print_sched_params into proper function The code of cobalt_print_sched_params is carried into the format string in tracefs, and trace-cmd tries to make any sense out of it. While it can process simply statements, this code is too complex and will prevent the parsing. Convert it into a function. That still does not resolve the parsing issue of trace-cmd, but that can be addressed by a custom plugin which can then interpret this tracepoint. That wouldn't be possible with the broken format string. Signed-off-by: Jan Kiszka URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=297027123e7f0332c98e610c54f857b52ff84c15 Author: Jan Kiszka Date: Thu Sep 28 19:55:28 2017 +0200 cobalt/tracing: Do not print numerical policy in trace __print_symbolic already ensures that unknown policies are printed numerically. Signed-off-by: Jan Kiszka URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=723193f39b870215ccc9e947b33b558e3705 Author: Jan Kiszka Date: Thu Aug 31 19:21:53 2017 +0200 cobalt/wrappers: Fix version level for cobalt_gpiochip_dev That renaming only took place in 4.5. Signed-off-by: Jan Kiszka URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=fab34949c267dee6518f4925b00238b3b50cd095 Author: Jan Kiszka Date: Sun Oct 1 08:38:17 2017 +0200 cobalt: Never crash on reading host task pid Catch the case that we try to obtain the pid of a not yet fully initialized thread. Signal the error by returning -1 which is specifically useful in case the value is added to some debug output or trace. xnthread_host_pid is now too complex for inlining. Signed-off-by: Jan Kiszka URL:
[Xenomai-git] Philippe Gerum : drivers/gpio: expose GPIO chip allocation routine
Module: xenomai-3 Branch: stable-3.0.x Commit: 062ed8e1d9c38a4aa3f058561654600b37fb6c5d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=062ed8e1d9c38a4aa3f058561654600b37fb6c5d Author: Philippe GerumDate: Tue Jan 9 17:40:39 2018 +0100 drivers/gpio: expose GPIO chip allocation routine For creating a new RTDM-based GPIO chip descriptor (struct rtdm_gpio_chip), mapped to its regular counterpart (struct gpio_chip). --- kernel/drivers/gpio/gpio-core.c | 64 +++ kernel/drivers/gpio/gpio-core.h |3 ++ 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index c19b1f7..05eafb1 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -40,6 +40,10 @@ struct rtdm_gpio_chan { is_interrupt : 1; }; +static LIST_HEAD(rtdm_gpio_chips); + +static DEFINE_MUTEX(chip_lock); + static int gpio_pin_interrupt(rtdm_irq_t *irqh) { struct rtdm_gpio_pin *pin; @@ -425,11 +429,34 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, } EXPORT_SYMBOL_GPL(rtdm_gpiochip_add); -void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc) +int rtdm_gpiochip_alloc(struct gpio_chip *gc, int gpio_subclass) { - if (!realtime_core_enabled()) - return; + struct rtdm_gpio_chip *rgc; + int ret; + rgc = kzalloc(sizeof(*rgc), GFP_KERNEL); + if (rgc == NULL) + return -ENOMEM; + + ret = rtdm_gpiochip_add(rgc, gc, gpio_subclass); + if (ret) { + kfree(rgc); + return ret; + } + + mutex_lock(_lock); + list_add(>next, _gpio_chips); + mutex_unlock(_lock); + + return 0; +} +EXPORT_SYMBOL_GPL(rtdm_gpiochip_alloc); + +void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc) +{ + mutex_lock(_lock); + list_del(>next); + mutex_unlock(_lock); delete_pin_devices(rgc); class_destroy(rgc->devclass); } @@ -463,10 +490,6 @@ EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name); #include -LIST_HEAD(rtdm_gpio_chips); - -static DEFINE_MUTEX(chip_lock); - struct gpiochip_holder { struct gpio_chip *chip; struct list_head next; @@ -497,28 +520,6 @@ static int match_gpio_chip(struct gpio_chip *gc, void *data) return 0; } -static int add_gpio_chip(struct gpio_chip *gc, int type) -{ - struct rtdm_gpio_chip *rgc; - int ret; - - rgc = kzalloc(sizeof(*rgc), GFP_KERNEL); - if (rgc == NULL) - return -ENOMEM; - - ret = rtdm_gpiochip_add(rgc, gc, type); - if (ret) { - kfree(rgc); - return ret; - } - - mutex_lock(_lock); - list_add(>next, _gpio_chips); - mutex_unlock(_lock); - - return 0; -} - int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, int type) { @@ -543,7 +544,7 @@ int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, ret = 0; list_for_each_entry_safe(h, n, , next) { list_del(>next); - _ret = add_gpio_chip(h->chip, type); + _ret = rtdm_gpiochip_alloc(h->chip, type); kfree(h); if (_ret && !ret) ret = _ret; @@ -563,9 +564,6 @@ void rtdm_gpiochip_remove_of(int type) list_for_each_entry_safe(rgc, n, _gpio_chips, next) { if (rgc->driver.profile_info.subclass_id == type) { - mutex_lock(_lock); - list_del(>next); - mutex_unlock(_lock); rtdm_gpiochip_remove(rgc); kfree(rgc); } diff --git a/kernel/drivers/gpio/gpio-core.h b/kernel/drivers/gpio/gpio-core.h index 11249e8..96e0f7b 100644 --- a/kernel/drivers/gpio/gpio-core.h +++ b/kernel/drivers/gpio/gpio-core.h @@ -38,6 +38,9 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, struct gpio_chip *gc, int gpio_subclass); +int rtdm_gpiochip_alloc(struct gpio_chip *gc, + int gpio_subclass); + void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc); int rtdm_gpiochip_add_by_name(struct rtdm_gpio_chip *rgc, ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: allow open coded IRQ handling
Module: xenomai-3 Branch: stable-3.0.x Commit: 8ba470914477247c42e0e5a56f145849b3eb6ecd URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8ba470914477247c42e0e5a56f145849b3eb6ecd Author: Philippe GerumDate: Thu Jan 11 12:30:23 2018 +0100 drivers/gpio: allow open coded IRQ handling Some client code may want to deal with GPIO interrupt handling directly, without support for an irq_chip controller paired with the GPIO chip. Assume that a failure to retrieve the IRQ number associated to a pin means exactly that, offloading interrupt handling to an open coded implementation the client code should provide for. In parallel, introduce rtdm_gpiochip_post_event() for notifying the GPIO core from an incoming interrupt event on a given pin. --- include/cobalt/kernel/rtdm/Makefile.am |1 + .../cobalt/kernel/rtdm/gpio.h | 27 -- kernel/drivers/gpio/gpio-bcm2835.c |2 +- kernel/drivers/gpio/gpio-core.c| 90 +++- kernel/drivers/gpio/gpio-mxc.c |2 +- kernel/drivers/gpio/gpio-sun8i-h3.c|2 +- kernel/drivers/gpio/gpio-zynq7000.c|2 +- 7 files changed, 73 insertions(+), 53 deletions(-) diff --git a/include/cobalt/kernel/rtdm/Makefile.am b/include/cobalt/kernel/rtdm/Makefile.am index 2c04cac..5fc6783 100644 --- a/include/cobalt/kernel/rtdm/Makefile.am +++ b/include/cobalt/kernel/rtdm/Makefile.am @@ -6,6 +6,7 @@ noinst_HEADERS =\ compat.h\ driver.h\ fd.h\ + gpio.h \ ipc.h \ rtdm.h \ serial.h\ diff --git a/kernel/drivers/gpio/gpio-core.h b/include/cobalt/kernel/rtdm/gpio.h similarity index 74% rename from kernel/drivers/gpio/gpio-core.h rename to include/cobalt/kernel/rtdm/gpio.h index 96e0f7b..224b562 100644 --- a/kernel/drivers/gpio/gpio-core.h +++ b/include/cobalt/kernel/rtdm/gpio.h @@ -1,7 +1,7 @@ /** - * @note Copyright (C) 2016 Philippe Gerum + * Copyright (C) 2016 Philippe Gerum * - * This program is free software; you can redistribute it and/or + * Xenomai is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. @@ -15,8 +15,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef _RTDM_GPIO_CORE_H -#define _RTDM_GPIO_CORE_H +#ifndef _COBALT_RTDM_GPIO_H +#define _COBALT_RTDM_GPIO_H #include #include @@ -24,14 +24,24 @@ struct class; struct device_node; +struct gpio_desc; + +struct rtdm_gpio_pin { + struct rtdm_device dev; + struct list_head next; + rtdm_irq_t irqh; + rtdm_event_t event; + char *name; + struct gpio_desc *desc; +}; struct rtdm_gpio_chip { struct gpio_chip *gc; struct rtdm_driver driver; struct class *devclass; - struct list_head pins; struct list_head next; rtdm_lock_t lock; + struct rtdm_gpio_pin pins[0]; }; int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, @@ -46,6 +56,9 @@ void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc); int rtdm_gpiochip_add_by_name(struct rtdm_gpio_chip *rgc, const char *label, int gpio_subclass); +int rtdm_gpiochip_post_event(struct rtdm_gpio_chip *rgc, +unsigned int offset); + #ifdef CONFIG_OF int rtdm_gpiochip_scan_of(struct device_node *from, @@ -53,8 +66,6 @@ int rtdm_gpiochip_scan_of(struct device_node *from, void rtdm_gpiochip_remove_of(int type); -extern struct list_head rtdm_gpio_chips; - #endif -#endif /* !_RTDM_GPIO_CORE_H */ +#endif /* !_COBALT_RTDM_GPIO_H */ diff --git a/kernel/drivers/gpio/gpio-bcm2835.c b/kernel/drivers/gpio/gpio-bcm2835.c index 186df66..f30d6b5 100644 --- a/kernel/drivers/gpio/gpio-bcm2835.c +++ b/kernel/drivers/gpio/gpio-bcm2835.c @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include -#include "gpio-core.h" +#include #define RTDM_SUBCLASS_BCM2835 1 diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 05eafb1..1bf8a9c 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -22,16 +22,7 @@ #include #include #include -#include "gpio-core.h" - -struct rtdm_gpio_pin { - struct rtdm_device dev; - struct list_head next; - rtdm_irq_t irqh; - rtdm_event_t event; - char *name; - struct gpio_desc *desc; -}; +#include struct rtdm_gpio_chan { int requested : 1, @@ -59,8 +50,7 @@ static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin,
[Xenomai-git] Philippe Gerum : drivers/gpio: pass back allocated GPIO chip descriptor
Module: xenomai-3 Branch: stable-3.0.x Commit: 7ffd31e5c576699f62f1e832eee610fd2372ed14 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7ffd31e5c576699f62f1e832eee610fd2372ed14 Author: Philippe GerumDate: Thu Jan 11 15:50:28 2018 +0100 drivers/gpio: pass back allocated GPIO chip descriptor rtdm_gpiochip_alloc() is a way to instantiate a single GPIO descriptor instead of mapping all GPIO controllers defined by the firmware which belong to a particular type. This routine is matched by rtdm_gpiochip_remove() for deallocation. We need the former to return a pointer to the allocated descriptor we may then pass to the latter. --- include/cobalt/kernel/rtdm/gpio.h |5 +++-- kernel/drivers/gpio/gpio-core.c | 26 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/include/cobalt/kernel/rtdm/gpio.h b/include/cobalt/kernel/rtdm/gpio.h index 224b562..378a678 100644 --- a/include/cobalt/kernel/rtdm/gpio.h +++ b/include/cobalt/kernel/rtdm/gpio.h @@ -48,8 +48,9 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, struct gpio_chip *gc, int gpio_subclass); -int rtdm_gpiochip_alloc(struct gpio_chip *gc, - int gpio_subclass); +struct rtdm_gpio_chip * +rtdm_gpiochip_alloc(struct gpio_chip *gc, + int gpio_subclass); void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc); diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 1bf8a9c..3e97547 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -376,9 +376,6 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, { int ret; - if (!realtime_core_enabled()) - return 0; - rgc->devclass = class_create(gc->owner, gc->label); if (IS_ERR(rgc->devclass)) { printk(XENO_ERR "cannot create sysfs class\n"); @@ -417,31 +414,32 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, } EXPORT_SYMBOL_GPL(rtdm_gpiochip_add); -int rtdm_gpiochip_alloc(struct gpio_chip *gc, int gpio_subclass) +struct rtdm_gpio_chip * +rtdm_gpiochip_alloc(struct gpio_chip *gc, int gpio_subclass) { struct rtdm_gpio_chip *rgc; size_t asize; int ret; if (gc->ngpio == 0) - return -EINVAL; + return ERR_PTR(-EINVAL); asize = sizeof(*rgc) + gc->ngpio * sizeof(struct rtdm_gpio_pin); rgc = kzalloc(asize, GFP_KERNEL); if (rgc == NULL) - return -ENOMEM; + return ERR_PTR(-ENOMEM); ret = rtdm_gpiochip_add(rgc, gc, gpio_subclass); if (ret) { kfree(rgc); - return ret; + return ERR_PTR(ret); } mutex_lock(_lock); list_add(>next, _gpio_chips); mutex_unlock(_lock); - return 0; + return rgc; } EXPORT_SYMBOL_GPL(rtdm_gpiochip_alloc); @@ -535,8 +533,12 @@ int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, struct gpiochip_holder *h, *n; struct device_node *np = from; struct platform_device *pdev; + struct rtdm_gpio_chip *rgc; int ret = -ENODEV, _ret; + if (!realtime_core_enabled()) + return 0; + for (;;) { np = of_find_compatible_node(np, NULL, compat); if (np == NULL) @@ -552,7 +554,10 @@ int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, ret = 0; list_for_each_entry_safe(h, n, , next) { list_del(>next); - _ret = rtdm_gpiochip_alloc(h->chip, type); + _ret = 0; + rgc = rtdm_gpiochip_alloc(h->chip, type); + if (IS_ERR(rgc)) + _ret = PTR_ERR(rgc); kfree(h); if (_ret && !ret) ret = _ret; @@ -570,6 +575,9 @@ void rtdm_gpiochip_remove_of(int type) { struct rtdm_gpio_chip *rgc, *n; + if (!realtime_core_enabled()) + return; + list_for_each_entry_safe(rgc, n, _gpio_chips, next) { if (rgc->driver.profile_info.subclass_id == type) { rtdm_gpiochip_remove(rgc); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git