[Xenomai-git] Philippe Gerum : net/packet: recvmsg: remove direct references to user memory

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: b219f4e43aba433c7d9aed66494e49b6a80e518d
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b219f4e43aba433c7d9aed66494e49b6a80e518d

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/udp: ioctl: remove direct references to user memory

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 69ad8d52cb1ded3522d9c47ea1a9742cb724187d
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=69ad8d52cb1ded3522d9c47ea1a9742cb724187d

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/packet: sendmsg: remove direct references to user memory

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 22d4422418f21f62b7d7203d508bddcaff75ff58
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=22d4422418f21f62b7d7203d508bddcaff75ff58

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/tcp: recvmsg: remove direct references to user memory

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: aa31445b240a067f85754dd48cf35df0485aa314
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=aa31445b240a067f85754dd48cf35df0485aa314

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: convert to rtdm_get_iov_flatlen()

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: ccafe388b682200a199969082081dbdeedf77d4b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ccafe388b682200a199969082081dbdeedf77d4b

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/tcp: sendmsg: remove direct references to user memory

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: c6e96e38a2663ccedd2ba1c5501f7b6c0046ea64
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c6e96e38a2663ccedd2ba1c5501f7b6c0046ea64

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/packet: ioctl: remove direct references to user memory (2)

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 3e388bcfde6c59bd9ec28bbcdb3757d32f19160b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3e388bcfde6c59bd9ec28bbcdb3757d32f19160b

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/iovec: add copy iterators for iovec[]

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 9a4978e5ecda81d6db9e8b8d8d67f9de49db43ef
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9a4978e5ecda81d6db9e8b8d8d67f9de49db43ef

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/udp: ioctl: fix temp arg buffer type

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 0a961cea15ce7c9d89c0a7f0ffccc30b7926e98b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0a961cea15ce7c9d89c0a7f0ffccc30b7926e98b

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

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: dd322711e3359f6d650649b77b89402523665736
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=dd322711e3359f6d650649b77b89402523665736

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/posix/signal: drop non-sensical masking with obsolete __SI_MASK

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 514f7decb92648a9b1a25ba6005472eb83742d87
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=514f7decb92648a9b1a25ba6005472eb83742d87

Author: Philippe Gerum 
Date:   Wed Dec  6 16:51:44 2017 +0100

cobalt/posix/signal: drop non-sensical masking with obsolete __SI_MASK

---

 kernel/cobalt/posix/compat.c |9 ++---
 kernel/cobalt/posix/signal.c |9 ++---
 2 files changed, 4 insertions(+), 14 deletions(-)

diff --git a/kernel/cobalt/posix/compat.c b/kernel/cobalt/posix/compat.c
index 44521b5..962465a 100644
--- a/kernel/cobalt/posix/compat.c
+++ b/kernel/cobalt/posix/compat.c
@@ -301,19 +301,14 @@ int sys32_put_siginfo(void __user *u_si, const struct 
siginfo *si,
  int overrun)
 {
struct compat_siginfo __user *u_p = u_si;
-   int code, ret;
+   int ret;
 
if (u_p == NULL)
return -EFAULT;
 
-   /* Translate kernel codes for userland. */
-   code = si->si_code;
-   if (code & __SI_MASK)
-   code |= __SI_MASK;
-
ret = __xn_put_user(si->si_signo, _p->si_signo);
ret |= __xn_put_user(si->si_errno, _p->si_errno);
-   ret |= __xn_put_user(code, _p->si_code);
+   ret |= __xn_put_user(si->si_code, _p->si_code);
 
/*
 * Copy the generic/standard siginfo bits to userland.
diff --git a/kernel/cobalt/posix/signal.c b/kernel/cobalt/posix/signal.c
index 416d3e4..e870283 100644
--- a/kernel/cobalt/posix/signal.c
+++ b/kernel/cobalt/posix/signal.c
@@ -339,16 +339,11 @@ static int signal_put_siginfo(void __user *u_si, const 
struct siginfo *si,
  int overrun)
 {
struct siginfo __user *u_p = u_si;
-   int code, ret;
-
-   /* Translate kernel codes for userland. */
-   code = si->si_code;
-   if (code & __SI_MASK)
-   code |= __SI_MASK;
+   int ret;
 
ret = __xn_put_user(si->si_signo, _p->si_signo);
ret |= __xn_put_user(si->si_errno, _p->si_errno);
-   ret |= __xn_put_user(code, _p->si_code);
+   ret |= __xn_put_user(si->si_code, _p->si_code);
 
/*
 * Copy the generic/standard siginfo bits to userland.


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt: do not use obsolete GFP_TEMPORARY

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: d4c842d53acd4ec1f47bd25d712f7569e5d82211
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d4c842d53acd4ec1f47bd25d712f7569e5d82211

Author: Philippe Gerum 
Date:   Wed Dec  6 16:44:55 2017 +0100

cobalt: do not use obsolete GFP_TEMPORARY

---

 kernel/cobalt/debug.c |2 +-
 kernel/cobalt/posix/process.c |2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c
index 9f659c6..74022c5 100644
--- a/kernel/cobalt/debug.c
+++ b/kernel/cobalt/debug.c
@@ -229,7 +229,7 @@ void xndebug_trace_relax(int nr, unsigned long *backtrace,
 * offsets.
 */
 
-   tmp = (char *)__get_free_page(GFP_TEMPORARY);
+   tmp = (char *)__get_free_page(GFP_KERNEL);
if (tmp == NULL)
/*
 * The situation looks really bad, but we can't do
diff --git a/kernel/cobalt/posix/process.c b/kernel/cobalt/posix/process.c
index 69a3dcb..387690f 100644
--- a/kernel/cobalt/posix/process.c
+++ b/kernel/cobalt/posix/process.c
@@ -236,7 +236,7 @@ static inline char *get_exe_path(struct task_struct *p)
 * which is a heavyweight operation anyway, let's pick the
 * memory from the page allocator.
 */
-   buf = (char *)__get_free_page(GFP_TEMPORARY);
+   buf = (char *)__get_free_page(GFP_KERNEL);
if (buf == NULL)
return ERR_PTR(-ENOMEM);
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : net/iovec: drop useless kernel<-> iovec[] copy helpers

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 9903bb7abbe4e2ba58d54856142348d18424b2b1
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9903bb7abbe4e2ba58d54856142348d18424b2b1

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/cap: fix panic in rtcap_signal_handler()

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: e6712968eea65958771f21f5b0eb874c1a4280e9
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e6712968eea65958771f21f5b0eb874c1a4280e9

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/udp: recvmsg: write back namelen only if name required

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: fd9728a3580cf7c87eeb814d3e98cbdcbc8f8991
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=fd9728a3580cf7c87eeb814d3e98cbdcbc8f8991

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/udp: recvmsg: remove direct references to user memory

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: b6dc4754f8fa09ce178fd2aec8f0eb5715a2e900
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b6dc4754f8fa09ce178fd2aec8f0eb5715a2e900

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/packet: ioctl: remove direct references to user memory

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: aa71ca000790c3c23737d53501e41125973e0a17
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=aa71ca000790c3c23737d53501e41125973e0a17

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/packet: recvmsg: write back namelen only if name required

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 8daab0176297ec0a3ef7c666bfde9afad3c6dd9b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8daab0176297ec0a3ef7c666bfde9afad3c6dd9b

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: wire up corectl interface

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 6f9ab1402d5f1345ec3e372326504a99339e218d
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=6f9ab1402d5f1345ec3e372326504a99339e218d

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] Leopold Palomo-Avellaneda : net/drivers: fix compilation drivers

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 07162c739707e14e19b18daec9e416bdb28f89e0
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=07162c739707e14e19b18daec9e416bdb28f89e0

Author: Leopold Palomo-Avellaneda 
Date:   Mon Nov 27 18:36:42 2017 +0100

net/drivers: fix compilation drivers

the local debug variable has a name-clash with a identically named
function in arch/x86/include/asm/traps.h
also a macro guard apparently used an outdated name.

This patch is equivalent than the proposed one by Norbert Lange
for the intel cards.

---

 kernel/drivers/net/drivers/natsemi.c   |6 ++---
 kernel/drivers/net/drivers/pcnet32.c   |8 +++---
 kernel/drivers/net/drivers/r8169.c |8 +++---
 kernel/drivers/net/drivers/via-rhine.c |   46 
 4 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/kernel/drivers/net/drivers/natsemi.c 
b/kernel/drivers/net/drivers/natsemi.c
index e477472..bc05d63 100644
--- a/kernel/drivers/net/drivers/natsemi.c
+++ b/kernel/drivers/net/drivers/natsemi.c
@@ -196,7 +196,7 @@ MODULE_PARM_DESC(cards, "array of cards to be supported 
(e.g. 1,0,1)");
 NETIF_MSG_WOL  | \
 NETIF_MSG_RX_ERR   | \
 NETIF_MSG_TX_ERR)
-static int debug = -1;
+static int local_debug = -1;
 
 /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
 static int max_interrupt_work = 20;
@@ -259,7 +259,7 @@ MODULE_LICENSE("GPL");
 
 module_param(max_interrupt_work, int, 0444);
 module_param(mtu, int, 0444);
-module_param(debug, int, 0444);
+module_param_named(debug, local_debug, int, 0444);
 /*** RTnet ***
 MODULE_PARM(rx_copybreak, "i");
  *** RTnet ***/
@@ -829,7 +829,7 @@ static int natsemi_probe1 (struct pci_dev *pdev,
pci_set_drvdata(pdev, dev);
np->iosize = iosize;
rtdm_lock_init(>lock);
-   np->msg_enable = (debug >= 0) ? (1<msg_enable = (local_debug >= 0) ? (1<hands_off = 0;
 
/* Reset the chip to erase previous misconfiguration. */
diff --git a/kernel/drivers/net/drivers/pcnet32.c 
b/kernel/drivers/net/drivers/pcnet32.c
index b041397..0146b18 100644
--- a/kernel/drivers/net/drivers/pcnet32.c
+++ b/kernel/drivers/net/drivers/pcnet32.c
@@ -1455,10 +1455,10 @@ static struct pci_driver pcnet32_driver = {
 };
 
 /* An additional parameter that may be passed in... */
-static int debug = -1;
+static int local_debug = -1;
 static int tx_start_pt = -1;
 
-module_param(debug, int, 0444);
+module_param_named(debug, local_debug, int, 0444);
 MODULE_PARM_DESC(debug, DRV_NAME " debug level (0-6)");
 module_param(max_interrupt_work, int, 0444);
 MODULE_PARM_DESC(max_interrupt_work, DRV_NAME " maximum events handled per 
interrupt");
@@ -1483,8 +1483,8 @@ static int __init pcnet32_init_module(void)
 {
 printk(KERN_INFO "%s", version);
 
-if (debug > 0)
-   pcnet32_debug = debug;
+if (local_debug > 0)
+   pcnet32_debug = local_debug;
 
 if ((tx_start_pt >= 0) && (tx_start_pt <= 3))
tx_start = tx_start_pt;
diff --git a/kernel/drivers/net/drivers/r8169.c 
b/kernel/drivers/net/drivers/r8169.c
index 5da29bd..e7abf6f 100644
--- a/kernel/drivers/net/drivers/r8169.c
+++ b/kernel/drivers/net/drivers/r8169.c
@@ -128,9 +128,9 @@ MODULE_PARM_DESC(cards, "array of cards to be supported 
(e.g. 1,0,1)");
 #define DEBUG_TX_SYNC 4
 #define DEBUG_TX_OTHER 8
 #define DEBUG_RUN 16
-static int debug = -1;
+static int local_debug = -1;
 static int r8169_debug = -1;
-module_param(debug, int, 0444);
+module_param_named(debug, local_debug, int, 0444);
 MODULE_PARM_DESC(debug, MODULENAME " debug level (bit mask, see docs!)");
 
 
@@ -1921,8 +1921,8 @@ static struct pci_driver rtl8169_pci_driver = {
 static int __init rtl8169_init_module (void)
 {
/*  Enable debugging output... */
-   if (debug > 0) {
-   r8169_debug = debug;
+   if (local_debug > 0) {
+   r8169_debug = local_debug;
}
if (r8169_debug & DEBUG_RUN) printk("Initializing " MODULENAME " 
driver");
return pci_register_driver (_pci_driver);
diff --git a/kernel/drivers/net/drivers/via-rhine.c 
b/kernel/drivers/net/drivers/via-rhine.c
index b623a89..1110fc5 100644
--- a/kernel/drivers/net/drivers/via-rhine.c
+++ b/kernel/drivers/net/drivers/via-rhine.c
@@ -126,7 +126,7 @@
 /* A few user-configurable values.
These may be modified when a driver module is loaded. */
 
-static int debug = 1;  /* 1 normal messages, 0 quiet .. 7 
verbose. */
+static int local_debug = 1;/* 1 normal messages, 0 quiet 
.. 7 verbose. */
 static int max_interrupt_work = 20;
 
 /* Set the copy breakpoint for the copy-only-tiny-frames scheme.
@@ -247,7 +247,7 @@ MODULE_DESCRIPTION("RTnet VIA Rhine PCI Fast Ethernet 
driver");
 MODULE_LICENSE("GPL");
 
 

[Xenomai-git] Philippe Gerum : net/tcp: ioctl: remove direct references to user memory

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 2f1c3ce42e1b8d21ba06ac1e744e2f1c9997e59b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2f1c3ce42e1b8d21ba06ac1e744e2f1c9997e59b

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] Greg Gallagher : net/drivers: e1000: Fix up name collision, debug is already defined

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 5b616b6020fea59a54143988b85aa612d4f4ffc3
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=5b616b6020fea59a54143988b85aa612d4f4ffc3

Author: Greg Gallagher 
Date:   Sat Dec  9 04:50:00 2017 +0100

net/drivers: e1000: Fix up name collision, debug is already defined

---

 kernel/drivers/net/drivers/experimental/e1000/e1000_main.c |8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/kernel/drivers/net/drivers/experimental/e1000/e1000_main.c 
b/kernel/drivers/net/drivers/experimental/e1000/e1000_main.c
index 66ecfce..acdc13c 100644
--- a/kernel/drivers/net/drivers/experimental/e1000/e1000_main.c
+++ b/kernel/drivers/net/drivers/experimental/e1000/e1000_main.c
@@ -421,9 +421,9 @@ module_param_array(cards, int, NULL, 0444);
 MODULE_PARM_DESC(cards, "array of cards to be supported (eg. 1,0,1)");
 
 
-static int debug = NETIF_MSG_DRV | NETIF_MSG_PROBE;
-module_param(debug, int, 0);
-MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
+static int local_debug = NETIF_MSG_DRV | NETIF_MSG_PROBE;
+module_param(local_debug, int, 0);
+MODULE_PARM_DESC(local_debug, "Debug level (0=none,...,16=all)");
 
 /* The parameter 'pciif' might be used to use this driver for
  * PCI or PCIe only NICs.
@@ -1096,7 +1096,7 @@ static int e1000_probe(struct pci_dev *pdev,
adapter->netdev = netdev;
adapter->pdev = pdev;
adapter->hw.back = adapter;
-   adapter->msg_enable = (1 << debug) - 1;
+   adapter->msg_enable = (1 << local_debug) - 1;
 
err = -EIO;
adapter->hw.hw_addr = ioremap(pci_resource_start(pdev, BAR_0),


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : net/tcp: fix invalid reference in getsockopt()

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: ffd20b9b7c788f70f88ecaa8ea99cd0a21f82057
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ffd20b9b7c788f70f88ecaa8ea99cd0a21f82057

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] Marek Vasut : utils/can: Fix Makefile.am

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: cbc6b87bed0fe7d6d932d943fc8ca0fb49bb5b71
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cbc6b87bed0fe7d6d932d943fc8ca0fb49bb5b71

Author: Marek Vasut 
Date:   Tue Dec 19 13:43:15 2017 +0100

utils/can: Fix Makefile.am

Prefix CPPFLAGS and LDFLAGS with AM_ to make automake actually
use those and propagate external CPPFLAGS and LDFLAGS settings
into the build.

Signed-off-by: Marek Vasut 

---

 utils/can/Makefile.am |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/utils/can/Makefile.am b/utils/can/Makefile.am
index 570758d..561dc71 100644
--- a/utils/can/Makefile.am
+++ b/utils/can/Makefile.am
@@ -4,11 +4,11 @@ bin_PROGRAMS = rtcanrecv rtcansend
 
 CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
 
-CPPFLAGS = \
+AM_CPPFLAGS =  \
@XENO_USER_CFLAGS@  \
-I$(top_srcdir)/include
 
-LDFLAGS = @XENO_AUTOINIT_LDFLAGS@ $(XENO_POSIX_WRAPPERS)
+AM_LDFLAGS = @XENO_AUTOINIT_LDFLAGS@ $(XENO_POSIX_WRAPPERS)
 
 rtcanconfig_SOURCES = rtcanconfig.c
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/rtdm: factor out iovec[] copy routines

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 439ee1bc1e8bfcc29a51c5d15d434b6373a4f79f
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=439ee1bc1e8bfcc29a51c5d15d434b6373a4f79f

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/socket: add get_arg/put_arg helpers

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 24915620e76abf6c3a4b37e78729fc7528484949
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=24915620e76abf6c3a4b37e78729fc7528484949

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 : cobalt/wrappers: convert to raw_copy_to/from_user() API

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: b97fc97219b7d958a89a4f5b00b8e7de53733a81
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b97fc97219b7d958a89a4f5b00b8e7de53733a81

Author: Philippe Gerum 
Date:   Wed Dec  6 16:43:19 2017 +0100

cobalt/wrappers: convert to raw_copy_to/from_user() API

---

 kernel/cobalt/include/asm-generic/xenomai/syscall.h  |8 
 kernel/cobalt/include/asm-generic/xenomai/wrappers.h |7 +++
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/kernel/cobalt/include/asm-generic/xenomai/syscall.h 
b/kernel/cobalt/include/asm-generic/xenomai/syscall.h
index 84fa2ef..f11ade8 100644
--- a/kernel/cobalt/include/asm-generic/xenomai/syscall.h
+++ b/kernel/cobalt/include/asm-generic/xenomai/syscall.h
@@ -36,10 +36,10 @@
__xn_reg_arg4(regs),\
__xn_reg_arg5(regs)
 
-#define __xn_copy_from_user(dstP, srcP, n) __copy_from_user_inatomic(dstP, 
srcP, n)
-#define __xn_copy_to_user(dstP, srcP, n)   __copy_to_user_inatomic(dstP, 
srcP, n)
-#define __xn_put_user(src, dstP)   __put_user_inatomic(src, dstP)
-#define __xn_get_user(dst, srcP)   __get_user_inatomic(dst, srcP)
+#define __xn_copy_from_user(dstP, srcP, n) raw_copy_from_user(dstP, srcP, 
n)
+#define __xn_copy_to_user(dstP, srcP, n)   raw_copy_to_user(dstP, srcP, n)
+#define __xn_put_user(src, dstP)   __put_user(src, dstP)
+#define __xn_get_user(dst, srcP)   __get_user(dst, srcP)
 #define __xn_strncpy_from_user(dstP, srcP, n)  strncpy_from_user(dstP, srcP, n)
 
 static inline int cobalt_copy_from_user(void *dst, const void __user *src,
diff --git a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h 
b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h
index fa2dae4..7493b58 100644
--- a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h
+++ b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h
@@ -38,6 +38,13 @@
  *   symbol, so that obsolete wrappers can be spotted.
  */
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
+#define raw_copy_to_user(__to, __from, __n)__copy_to_user_inatomic(__to, 
__from, __n)
+#define raw_copy_from_user(__to, __from, __n)  __copy_from_user_inatomic(__to, 
__from, __n)
+#define raw_put_user(__from, __to) __put_user_inatomic(__from, 
__to)
+#define raw_get_user(__to, __from) __get_user_inatomic(__to, 
__from)
+#endif
+
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
 #define in_ia32_syscall() (current_thread_info()->status & TS_COMPAT)
 #endif


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : boilerplate/bootstrap: dual-license the bootstrap source code

2017-12-20 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: f18416cd11628c37aef8b2c564f8174dfd3e80bf
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f18416cd11628c37aef8b2c564f8174dfd3e80bf

Author: Philippe Gerum 
Date:   Tue Dec 19 11:18:26 2017 +0100

boilerplate/bootstrap: dual-license the bootstrap source code

lib/boilerplate/bootstrap.c is meant to be glued to the application
executable for bootstrapping the Cobalt services automatically at load
up.

>From the standpoint of its sole author (i.e. me), doing so adds no
requirement with respect to the licensing terms of the containing
application.

Allow lib/boilerplate/bootstrap.c to be distributed under the terms of
the MIT license to reflect this fact.

---

 lib/boilerplate/init/bootstrap.c |   29 +
 1 file changed, 29 insertions(+)

diff --git a/lib/boilerplate/init/bootstrap.c b/lib/boilerplate/init/bootstrap.c
index e72a7b8..64a11c2 100644
--- a/lib/boilerplate/init/bootstrap.c
+++ b/lib/boilerplate/init/bootstrap.c
@@ -1,4 +1,33 @@
 /*
+ * The source code in this particular file is released using a dual
+ * license scheme.  You can choose the licence that better fits your
+ * requirements.
+ *
+ * ---
+ *
+ * Copyright (C) 2017 Philippe Gerum 
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *  
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * ---
+ *
  * Copyright (C) 2013 Philippe Gerum .
  *
  * This library is free software; you can redistribute it and/or


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git