[Xenomai-git] Philippe Gerum : net/socket: add get_arg/put_arg helpers

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: d953cb2a8315e50fa2c28f1ef2b89ccdc9242af5
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d953cb2a8315e50fa2c28f1ef2b89ccdc9242af5

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 94fbdea0617457f7ec7e01ecb77441ce1365c41e
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=94fbdea0617457f7ec7e01ecb77441ce1365c41e

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 9e18b4cafe5b77a34e669101c897f08a0b306e9d
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9e18b4cafe5b77a34e669101c897f08a0b306e9d

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: abe2eb66528f0a371c807bdd8eb6b2a75a076ddc
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=abe2eb66528f0a371c807bdd8eb6b2a75a076ddc

Author: Philippe Gerum 
Date:   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()

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 2c39fd5a3661880b6ffc69c333dcc2189daf3017
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2c39fd5a3661880b6ffc69c333dcc2189daf3017

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 81c5c20cc57e12b371ee229cf51b2df1e7defd16
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=81c5c20cc57e12b371ee229cf51b2df1e7defd16

Author: Philippe Gerum 
Date:   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)

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 8511bd779f903c1f101952dae6fd43c9fbf10021
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8511bd779f903c1f101952dae6fd43c9fbf10021

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: f65fe3e6895f73c1682a8bbd2e98659fd375ca35
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f65fe3e6895f73c1682a8bbd2e98659fd375ca35

Author: Philippe Gerum 
Date:   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()

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: e6c78422e09f124ab406692600d2d2f1a3c40c7f
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e6c78422e09f124ab406692600d2d2f1a3c40c7f

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 6103b46cbe79c440794ce17582a481d8f5c77362
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=6103b46cbe79c440794ce17582a481d8f5c77362

Author: Philippe Gerum 
Date:   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)

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 4e5889f9c35d4d18e6855dcb8506672a15f8e2c8
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=4e5889f9c35d4d18e6855dcb8506672a15f8e2c8

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 925709991068539f9d29ca3fffc3835d5d5d0140
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=925709991068539f9d29ca3fffc3835d5d5d0140

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: cb707ef0bf1726d1aea59d5bd46a4ebb563e60da
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cb707ef0bf1726d1aea59d5bd46a4ebb563e60da

Author: Philippe Gerum 
Date:   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)

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: a9e0c0a735ae23a58f05c1408e244a3f9cfdc910
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a9e0c0a735ae23a58f05c1408e244a3f9cfdc910

Author: Philippe Gerum 
Date:   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)

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 98d70068cdcbbfb1791c7cd2a7f97ae8ccbe98d3
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=98d70068cdcbbfb1791c7cd2a7f97ae8ccbe98d3

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 2fbc33b858fd056d7ac47570daa5e35957da0086
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2fbc33b858fd056d7ac47570daa5e35957da0086

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: d7411a1d3baa1ae51f10b1754c0718219cb424e5
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d7411a1d3baa1ae51f10b1754c0718219cb424e5

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 7f8eeff852c6ed2408349570402e13a247b3b106
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7f8eeff852c6ed2408349570402e13a247b3b106

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: ed185a6790ad6ac55b425e6240c16c999daf50b0
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ed185a6790ad6ac55b425e6240c16c999daf50b0

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: ef48e5182069b4a7e495a1b46fb898fa42929823
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ef48e5182069b4a7e495a1b46fb898fa42929823

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 4af6b1b7243b01d759775a4766dbfa0d6f3d7368
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=4af6b1b7243b01d759775a4766dbfa0d6f3d7368

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: ab7b3807b282c50d3cb550ff8a0a3a30e8019c10
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ab7b3807b282c50d3cb550ff8a0a3a30e8019c10

Author: Philippe Gerum 
Date:   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[]

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 74a7a057fe954eae249fa8e3056abbc3f2dcf03c
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=74a7a057fe954eae249fa8e3056abbc3f2dcf03c

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: ac098c017c392d105d3d67ff497077ad5db1b45b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ac098c017c392d105d3d67ff497077ad5db1b45b

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 33c43f43cf6d8851e08424e0ad15a42c5d88c2bf
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=33c43f43cf6d8851e08424e0ad15a42c5d88c2bf

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: dfbefb86f3de1e570914d9f8ecc7ef77a5f81088
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=dfbefb86f3de1e570914d9f8ecc7ef77a5f81088

Author: Philippe Gerum 
Date:   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()

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 5fb8fb04ac93bf2190408f8734c5b61a33dc6176
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=5fb8fb04ac93bf2190408f8734c5b61a33dc6176

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
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 Gerum 
Date:   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)

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 62696c26ea86c6b008946f1b747aed297b53f96f
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=62696c26ea86c6b008946f1b747aed297b53f96f

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: ffe372fe069b49a0167dd113e25e896e1fe9e8f9
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ffe372fe069b49a0167dd113e25e896e1fe9e8f9

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: cd3cf0cf7dfcd5f2adb3eee1c5fade7ab9aadbca
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cd3cf0cf7dfcd5f2adb3eee1c5fade7ab9aadbca

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 2815ba1805e8c16a8b0d914a2c9137d3b24e6480
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2815ba1805e8c16a8b0d914a2c9137d3b24e6480

Author: Philippe Gerum 
Date:   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)

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 2878891f538e2cd093abd496efd8e3e966e25671
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2878891f538e2cd093abd496efd8e3e966e25671

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: b03907363c31318060e7beaaa67d02b8a3700c06
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b03907363c31318060e7beaaa67d02b8a3700c06

Author: Philippe Gerum 
Date:   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()

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 37d1b906573a008d977e40fc8f29cf70a6bd712d
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=37d1b906573a008d977e40fc8f29cf70a6bd712d

Author: Philippe Gerum 
Date:   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)

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 1b841edf72ca869f4a4aa9f826f3d5417d3d988c
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1b841edf72ca869f4a4aa9f826f3d5417d3d988c

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 395c66ad00f2d8f57916cc77c3afdd71d0f26b8a
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=395c66ad00f2d8f57916cc77c3afdd71d0f26b8a

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: d121ef4f5d6e78a194d97b50d8bbca6dae9871c5
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d121ef4f5d6e78a194d97b50d8bbca6dae9871c5

Author: Philippe Gerum 
Date:   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()

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 630b1cd6d4e47d80c4ac751c31072be256a3ef71
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=630b1cd6d4e47d80c4ac751c31072be256a3ef71

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: da90bbe0a85efd3c5ce4728f60e12466a2666779
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=da90bbe0a85efd3c5ce4728f60e12466a2666779

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 968caacaf6c34ddd91d86bcc773b2d8fa74bb511
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=968caacaf6c34ddd91d86bcc773b2d8fa74bb511

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: c1b0b74ec84b8314c9388e45128efe0c73c3be2a
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c1b0b74ec84b8314c9388e45128efe0c73c3be2a

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 3cf85b1f9245d17432faaead869af97f64a9bf9a
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3cf85b1f9245d17432faaead869af97f64a9bf9a

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 1db36f2b2db10717312da68cb75702c388bd5f90
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1db36f2b2db10717312da68cb75702c388bd5f90

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 9a5a058a6fde92f7286928907a83cb47ae144a95
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9a5a058a6fde92f7286928907a83cb47ae144a95

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 8ba470914477247c42e0e5a56f145849b3eb6ecd
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8ba470914477247c42e0e5a56f145849b3eb6ecd

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: de3677ba112349317eef8459a6d2dd5ae3514163
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=de3677ba112349317eef8459a6d2dd5ae3514163

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 2fd8127356b0d11417fccaccd716dc9057ce4fb0
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2fd8127356b0d11417fccaccd716dc9057ce4fb0

Author: Philippe Gerum 
Date:   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[]

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: b127f5435c3b7cb19df917ef1d46d3522b1b414d
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b127f5435c3b7cb19df917ef1d46d3522b1b414d

Author: Philippe Gerum 
Date:   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)

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 535352895bf22f8a1c28493e1f3d70ebfc6f70f2
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=535352895bf22f8a1c28493e1f3d70ebfc6f70f2

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 84b4013f9df2634341298966a489ffbeb23d0d53
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=84b4013f9df2634341298966a489ffbeb23d0d53

Author: Philippe Gerum 
Date:   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()

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 5db979646e9115b3e1de9e9759848df62b546e0c
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=5db979646e9115b3e1de9e9759848df62b546e0c

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 7db71fc8242f6cc44629d10f995bc63f6b22e6ec
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7db71fc8242f6cc44629d10f995bc63f6b22e6ec

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: d0c48d747bb90cac8ab9f87896345c6898e6048b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d0c48d747bb90cac8ab9f87896345c6898e6048b

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 7ffd31e5c576699f62f1e832eee610fd2372ed14
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7ffd31e5c576699f62f1e832eee610fd2372ed14

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 086f3236002f7c314dcfeeff81b556676470250e
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=086f3236002f7c314dcfeeff81b556676470250e

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 062ed8e1d9c38a4aa3f058561654600b37fb6c5d
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=062ed8e1d9c38a4aa3f058561654600b37fb6c5d

Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8f54824d94beaa549552d4c7eea54e6e4d86afe2
Author: Philippe Gerum 
Date:   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

2018-01-15 Thread git repository hosting
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 Gerum 
Date:   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

2018-01-15 Thread git repository hosting
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 Gerum 
Date:   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

2018-01-15 Thread git repository hosting
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 Gerum 
Date:   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