[Xenomai-git] New commits on branch next

2018-01-23 Thread git repository hosting
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=44cdc651a51fa2801c459cbffe65517fca6effe6
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=757343a99bdff957db0b113cfc95202a0991d53f
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=1f1490ac7bdfcf057bb4725658a61f4ae2ae3178
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=61ecba1b01a652788bfa0a826e3bb8b559b5c050
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=25c968df70a51e307a30534947c402b87c8a424d
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=eaf7bdf4b3c077c6ea3a9af318d9bdf91aaa3182
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=11a910939700b10c893a5fd72ac4e07c5b6bdaa0
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=97744b1715d6ef3c02a39f7e681cd9e390a628b7
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=08eace07ee95609501348fd303548a9cf8c1
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=b6df2c2bfc83bc4983d6c54eebbc27b58252cd7f
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 : net/packet: sendmsg: remove direct references to user memory

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

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/socket: enforce secondary mode for SIOCETHTOOL

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

Author: Philippe Gerum 
Date:   Thu Jan 18 10:37:01 2018 +0100

net/socket: enforce secondary mode for SIOCETHTOOL

Assume this feature was originally provided by the regular driver
converted to RTNet, which we may want to support thoroughly, including
when tapping into the common PHY layer is required.

To this end, we need to enter the ioctl handler from secondary mode
only, which is not supposed to be an issue since there is no point is
expecting ethertool requests to be part of the time-critical code
anyway.

---

 kernel/drivers/net/stack/socket.c |   10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/kernel/drivers/net/stack/socket.c 
b/kernel/drivers/net/stack/socket.c
index d7d36d5..1eb1856 100644
--- a/kernel/drivers/net/stack/socket.c
+++ b/kernel/drivers/net/stack/socket.c
@@ -340,10 +340,12 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void __user *arg)
break;
 
case SIOCETHTOOL:
-   if (rtdev->do_ioctl != NULL)
-   ret = rtdev->do_ioctl(rtdev, request, arg);
-   else
-   ret = -EOPNOTSUPP;
+   if (rtdev->do_ioctl != NULL) {
+   if (rtdm_in_rt_context())
+   return -ENOSYS;
+   ret = rtdev->do_ioctl(rtdev, request, arg);
+   } else
+   ret = -EOPNOTSUPP;
break;
 
default:


___
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-23 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: ef57c4e6339d69c0fd4df78a363a5258f2bd1a13
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ef57c4e6339d69c0fd4df78a363a5258f2bd1a13

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

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

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

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

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

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

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/tcp: fix invalid reference in getsockopt()

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

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

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

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

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

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

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

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/socket: align rtdev do_ioctl handler on the regular ndo_do_ioctl

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

Author: Philippe Gerum 
Date:   Tue Jan 23 12:03:51 2018 +0100

net/socket: align rtdev do_ioctl handler on the regular ndo_do_ioctl

Align on the signature of the regular ndo_do_ioctl() handler for
interface-directed ioctl requests, since an ifr block must have been
provided by the caller to determine the device to hand over the
request to anyway.

---

 kernel/drivers/net/drivers/igb/igb_main.c |7 +++
 kernel/drivers/net/stack/include/rtdev.h  |2 +-
 kernel/drivers/net/stack/socket.c |4 ++--
 3 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/kernel/drivers/net/drivers/igb/igb_main.c 
b/kernel/drivers/net/drivers/igb/igb_main.c
index fe0132b..be98d78 100644
--- a/kernel/drivers/net/drivers/igb/igb_main.c
+++ b/kernel/drivers/net/drivers/igb/igb_main.c
@@ -216,7 +216,7 @@ static int igb_msix_ring(rtdm_irq_t *irq_handle);
 static void igb_poll(struct igb_q_vector *);
 static bool igb_clean_tx_irq(struct igb_q_vector *);
 static bool igb_clean_rx_irq(struct igb_q_vector *, int);
-static int igb_ioctl(struct rtnet_device *, unsigned cmd, void *);
+static int igb_ioctl(struct rtnet_device *, struct ifreq *ifr, int cmd);
 static void igb_reset_task(struct work_struct *);
 static void igb_vlan_mode(struct rtnet_device *netdev,
  netdev_features_t features);
@@ -5063,15 +5063,14 @@ static int igb_mii_ioctl(struct rtnet_device *netdev, 
struct ifreq *ifr, int cmd
  * @ifreq:
  * @cmd:
  **/
-static int igb_ioctl(struct rtnet_device *netdev, unsigned cmd, void *rq)
+static int igb_ioctl(struct rtnet_device *netdev, struct ifreq *ifr, int cmd)
 {
-   struct ifreq *ifr = rq;
-
switch (cmd) {
case SIOCGMIIPHY:
case SIOCGMIIREG:
case SIOCSMIIREG:
return igb_mii_ioctl(netdev, ifr, cmd);
+
default:
return -EOPNOTSUPP;
}
diff --git a/kernel/drivers/net/stack/include/rtdev.h 
b/kernel/drivers/net/stack/include/rtdev.h
index c1c0b4e..a3ac7dd 100644
--- a/kernel/drivers/net/stack/include/rtdev.h
+++ b/kernel/drivers/net/stack/include/rtdev.h
@@ -152,7 +152,7 @@ struct rtnet_device {
   unsigned int priority);
 
 int (*do_ioctl)(struct rtnet_device *rtdev,
-   unsigned int request, void * cmd);
+   struct ifreq *ifr, int cmd);
 struct net_device_stats *(*get_stats)(struct rtnet_device *rtdev);
 
 /* DMA pre-mapping hooks */
diff --git a/kernel/drivers/net/stack/socket.c 
b/kernel/drivers/net/stack/socket.c
index 1eb1856..c139d95 100644
--- a/kernel/drivers/net/stack/socket.c
+++ b/kernel/drivers/net/stack/socket.c
@@ -343,12 +343,12 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void __user *arg)
if (rtdev->do_ioctl != NULL) {
if (rtdm_in_rt_context())
return -ENOSYS;
-   ret = rtdev->do_ioctl(rtdev, request, arg);
+   ret = rtdev->do_ioctl(rtdev, ifr, request);
} else
ret = -EOPNOTSUPP;
break;
 
-   default:
+default:
ret = -EOPNOTSUPP;
break;
 }


___
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-23 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 0c537afbdf67db06ff4049847f34e4eda86d2b4f
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0c537afbdf67db06ff4049847f34e4eda86d2b4f

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-23 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 1db07ba1a497e1252e8326f85c1154fee7dc70ee
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1db07ba1a497e1252e8326f85c1154fee7dc70ee

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

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

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/socket: forward private ioctl requests to NIC driver

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

Author: Philippe Gerum 
Date:   Thu Jan 18 10:49:19 2018 +0100

net/socket: forward private ioctl requests to NIC driver

This allows RTnet to define requests in the SIOCPROTOPRIVATE range for
identifying device-specific features added to the converted NIC
driver.

Therefore, no excution mode is enforced by the base handler, the
callee should check for the current mode, returning -ENOSYS to trigger
the adaptive switch if required.

---

 kernel/drivers/net/stack/socket.c |7 +++
 1 file changed, 7 insertions(+)

diff --git a/kernel/drivers/net/stack/socket.c 
b/kernel/drivers/net/stack/socket.c
index c139d95..f2622d3 100644
--- a/kernel/drivers/net/stack/socket.c
+++ b/kernel/drivers/net/stack/socket.c
@@ -348,6 +348,13 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void __user *arg)
ret = -EOPNOTSUPP;
break;
 
+   case SIOCPROTOPRIVATE ... SIOCPROTOPRIVATE + 15:
+   if (rtdev->do_ioctl != NULL)
+   ret = rtdev->do_ioctl(rtdev, ifr, request);
+   else
+   ret = -EOPNOTSUPP;
+   break;
+
 default:
ret = -EOPNOTSUPP;
break;


___
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-23 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: dc5068a27cdd649e0bed4e5fc2ea5bee4f050957
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=dc5068a27cdd649e0bed4e5fc2ea5bee4f050957

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

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

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 : cobalt/rtdm: factor out iovec[] copy routines

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

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

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

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

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

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/iovec: drop useless kernel<-> iovec[] copy helpers

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

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

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

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

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

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

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

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 : cobalt/powerpc: include proper header for ptrace

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

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

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

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: drop superfluous, broken includes

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

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

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

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 : cobalt/rtdm: factor out iovec[] copy routines

2018-01-23 Thread git repository hosting
Module: xenomai-3
Branch: stable-3.0.x
Commit: 3a2fbc62b2dce64e959a49db9bcc049e6acc4e21
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3a2fbc62b2dce64e959a49db9bcc049e6acc4e21

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 : cobalt/powerpc: include proper header for ptrace

2018-01-23 Thread git repository hosting
Module: xenomai-3
Branch: stable-3.0.x
Commit: bc7a27106a7500e42fab8ecc1444cabd9251dcc0
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bc7a27106a7500e42fab8ecc1444cabd9251dcc0

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: drop superfluous, broken includes

2018-01-23 Thread git repository hosting
Module: xenomai-3
Branch: stable-3.0.x
Commit: fccddaf33d27ae85de50a8ea08bf2a4f4265a2e8
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=fccddaf33d27ae85de50a8ea08bf2a4f4265a2e8

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/socket: align rtdev do_ioctl handler on the regular ndo_do_ioctl

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

Author: Philippe Gerum 
Date:   Tue Jan 23 12:03:51 2018 +0100

net/socket: align rtdev do_ioctl handler on the regular ndo_do_ioctl

Align on the signature of the regular ndo_do_ioctl() handler for
interface-directed ioctl requests, since an ifr block must have been
provided by the caller to determine the device to hand over the
request to anyway.

---

 kernel/drivers/net/drivers/igb/igb_main.c |7 +++
 kernel/drivers/net/stack/include/rtdev.h  |2 +-
 kernel/drivers/net/stack/socket.c |4 ++--
 3 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/kernel/drivers/net/drivers/igb/igb_main.c 
b/kernel/drivers/net/drivers/igb/igb_main.c
index fe0132b..be98d78 100644
--- a/kernel/drivers/net/drivers/igb/igb_main.c
+++ b/kernel/drivers/net/drivers/igb/igb_main.c
@@ -216,7 +216,7 @@ static int igb_msix_ring(rtdm_irq_t *irq_handle);
 static void igb_poll(struct igb_q_vector *);
 static bool igb_clean_tx_irq(struct igb_q_vector *);
 static bool igb_clean_rx_irq(struct igb_q_vector *, int);
-static int igb_ioctl(struct rtnet_device *, unsigned cmd, void *);
+static int igb_ioctl(struct rtnet_device *, struct ifreq *ifr, int cmd);
 static void igb_reset_task(struct work_struct *);
 static void igb_vlan_mode(struct rtnet_device *netdev,
  netdev_features_t features);
@@ -5063,15 +5063,14 @@ static int igb_mii_ioctl(struct rtnet_device *netdev, 
struct ifreq *ifr, int cmd
  * @ifreq:
  * @cmd:
  **/
-static int igb_ioctl(struct rtnet_device *netdev, unsigned cmd, void *rq)
+static int igb_ioctl(struct rtnet_device *netdev, struct ifreq *ifr, int cmd)
 {
-   struct ifreq *ifr = rq;
-
switch (cmd) {
case SIOCGMIIPHY:
case SIOCGMIIREG:
case SIOCSMIIREG:
return igb_mii_ioctl(netdev, ifr, cmd);
+
default:
return -EOPNOTSUPP;
}
diff --git a/kernel/drivers/net/stack/include/rtdev.h 
b/kernel/drivers/net/stack/include/rtdev.h
index c1c0b4e..a3ac7dd 100644
--- a/kernel/drivers/net/stack/include/rtdev.h
+++ b/kernel/drivers/net/stack/include/rtdev.h
@@ -152,7 +152,7 @@ struct rtnet_device {
   unsigned int priority);
 
 int (*do_ioctl)(struct rtnet_device *rtdev,
-   unsigned int request, void * cmd);
+   struct ifreq *ifr, int cmd);
 struct net_device_stats *(*get_stats)(struct rtnet_device *rtdev);
 
 /* DMA pre-mapping hooks */
diff --git a/kernel/drivers/net/stack/socket.c 
b/kernel/drivers/net/stack/socket.c
index 1eb1856..c139d95 100644
--- a/kernel/drivers/net/stack/socket.c
+++ b/kernel/drivers/net/stack/socket.c
@@ -343,12 +343,12 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void __user *arg)
if (rtdev->do_ioctl != NULL) {
if (rtdm_in_rt_context())
return -ENOSYS;
-   ret = rtdev->do_ioctl(rtdev, request, arg);
+   ret = rtdev->do_ioctl(rtdev, ifr, request);
} else
ret = -EOPNOTSUPP;
break;
 
-   default:
+default:
ret = -EOPNOTSUPP;
break;
 }


___
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-23 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 865c0d1ef4c95404a97f6ef1c2a78846ed27602b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=865c0d1ef4c95404a97f6ef1c2a78846ed27602b

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

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

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

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

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/iovec: drop useless kernel<-> iovec[] copy helpers

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

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

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

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

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

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

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

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

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

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/socket: forward private ioctl requests to NIC driver

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

Author: Philippe Gerum 
Date:   Thu Jan 18 10:49:19 2018 +0100

net/socket: forward private ioctl requests to NIC driver

This allows RTnet to define requests in the SIOCPROTOPRIVATE range for
identifying device-specific features added to the converted NIC
driver.

Therefore, no excution mode is enforced by the base handler, the
callee should check for the current mode, returning -ENOSYS to trigger
the adaptive switch if required.

---

 kernel/drivers/net/stack/socket.c |7 +++
 1 file changed, 7 insertions(+)

diff --git a/kernel/drivers/net/stack/socket.c 
b/kernel/drivers/net/stack/socket.c
index c139d95..f2622d3 100644
--- a/kernel/drivers/net/stack/socket.c
+++ b/kernel/drivers/net/stack/socket.c
@@ -348,6 +348,13 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void __user *arg)
ret = -EOPNOTSUPP;
break;
 
+   case SIOCPROTOPRIVATE ... SIOCPROTOPRIVATE + 15:
+   if (rtdev->do_ioctl != NULL)
+   ret = rtdev->do_ioctl(rtdev, ifr, request);
+   else
+   ret = -EOPNOTSUPP;
+   break;
+
 default:
ret = -EOPNOTSUPP;
break;


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


[Xenomai-git] Philippe Gerum : net/socket: enforce secondary mode for SIOCETHTOOL

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

Author: Philippe Gerum 
Date:   Thu Jan 18 10:37:01 2018 +0100

net/socket: enforce secondary mode for SIOCETHTOOL

Assume this feature was originally provided by the regular driver
converted to RTNet, which we may want to support thoroughly, including
when tapping into the common PHY layer is required.

To this end, we need to enter the ioctl handler from secondary mode
only, which is not supposed to be an issue since there is no point is
expecting ethertool requests to be part of the time-critical code
anyway.

---

 kernel/drivers/net/stack/socket.c |   10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/kernel/drivers/net/stack/socket.c 
b/kernel/drivers/net/stack/socket.c
index d7d36d5..1eb1856 100644
--- a/kernel/drivers/net/stack/socket.c
+++ b/kernel/drivers/net/stack/socket.c
@@ -340,10 +340,12 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void __user *arg)
break;
 
case SIOCETHTOOL:
-   if (rtdev->do_ioctl != NULL)
-   ret = rtdev->do_ioctl(rtdev, request, arg);
-   else
-   ret = -EOPNOTSUPP;
+   if (rtdev->do_ioctl != NULL) {
+   if (rtdm_in_rt_context())
+   return -ENOSYS;
+   ret = rtdev->do_ioctl(rtdev, request, arg);
+   } else
+   ret = -EOPNOTSUPP;
break;
 
default:


___
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-23 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 7b98bdbfbd8e7f63021d1a07ce0beff1139c9cdf
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7b98bdbfbd8e7f63021d1a07ce0beff1139c9cdf

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

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

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 : cobalt/powerpc: include proper header for ptrace

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

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

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

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

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

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-23 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 0f3c11255a1c4eef4e83212184ffb04c395db874
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0f3c11255a1c4eef4e83212184ffb04c395db874

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

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

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-23 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: eed2d3a22cae55e9c714fd48d2ec86866a69e3ef
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=eed2d3a22cae55e9c714fd48d2ec86866a69e3ef

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

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

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

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

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

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

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/tcp: fix invalid reference in getsockopt()

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

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 : cobalt/rtdm: factor out iovec[] copy routines

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

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-23 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 0bf599ee63d8b750fef736a130addbe85a585654
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0bf599ee63d8b750fef736a130addbe85a585654

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-23 Thread git repository hosting
Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 0042738c31a7c1d286c8f307af4dc0f1301d5dbd
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0042738c31a7c1d286c8f307af4dc0f1301d5dbd

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

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

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

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

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

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

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 : lib/cobalt: recvfrom: update *addrlen when requested

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

Author: Philippe Gerum 
Date:   Tue Jan 23 16:35:54 2018 +0100

lib/cobalt: recvfrom: update *addrlen when requested

---

 lib/cobalt/rtdm.c |   11 +--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/lib/cobalt/rtdm.c b/lib/cobalt/rtdm.c
index 1907090..9e88ca9 100644
--- a/lib/cobalt/rtdm.c
+++ b/lib/cobalt/rtdm.c
@@ -269,8 +269,15 @@ COBALT_IMPL(ssize_t, recvfrom, (int fd, void *buf, size_t 
len, int flags,
int ret;
 
ret = do_recvmsg(fd, , flags);
-   if (ret != -EBADF && ret != -ENOSYS)
-   return set_errno(ret);
+   if (ret != -EBADF && ret != -ENOSYS) {
+   if (ret < 0)
+   return set_errno(ret);
+
+   if (from)
+   *fromlen = msg.msg_namelen;
+
+   return ret;
+   }
 
return __STD(recvfrom(fd, buf, len, flags, from, fromlen));
 }


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


[Xenomai-git] Philippe Gerum : net/socket: enforce secondary mode for SIOCETHTOOL

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

Author: Philippe Gerum 
Date:   Thu Jan 18 10:37:01 2018 +0100

net/socket: enforce secondary mode for SIOCETHTOOL

Assume this feature was originally provided by the regular driver
converted to RTNet, which we may want to support thoroughly, including
when tapping into the common PHY layer is required.

To this end, we need to enter the ioctl handler from secondary mode
only, which is not supposed to be an issue since there is no point is
expecting ethertool requests to be part of the time-critical code
anyway.

---

 kernel/drivers/net/stack/socket.c |   10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/kernel/drivers/net/stack/socket.c 
b/kernel/drivers/net/stack/socket.c
index d7d36d5..1eb1856 100644
--- a/kernel/drivers/net/stack/socket.c
+++ b/kernel/drivers/net/stack/socket.c
@@ -340,10 +340,12 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void __user *arg)
break;
 
case SIOCETHTOOL:
-   if (rtdev->do_ioctl != NULL)
-   ret = rtdev->do_ioctl(rtdev, request, arg);
-   else
-   ret = -EOPNOTSUPP;
+   if (rtdev->do_ioctl != NULL) {
+   if (rtdm_in_rt_context())
+   return -ENOSYS;
+   ret = rtdev->do_ioctl(rtdev, request, arg);
+   } else
+   ret = -EOPNOTSUPP;
break;
 
default:


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


[Xenomai-git] Philippe Gerum : net/socket: forward private ioctl requests to NIC driver

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

Author: Philippe Gerum 
Date:   Thu Jan 18 10:49:19 2018 +0100

net/socket: forward private ioctl requests to NIC driver

This allows RTnet to define requests in the SIOCPROTOPRIVATE range for
identifying device-specific features added to the converted NIC
driver.

Therefore, no excution mode is enforced by the base handler, the
callee should check for the current mode, returning -ENOSYS to trigger
the adaptive switch if required.

---

 kernel/drivers/net/stack/socket.c |7 +++
 1 file changed, 7 insertions(+)

diff --git a/kernel/drivers/net/stack/socket.c 
b/kernel/drivers/net/stack/socket.c
index c139d95..f2622d3 100644
--- a/kernel/drivers/net/stack/socket.c
+++ b/kernel/drivers/net/stack/socket.c
@@ -348,6 +348,13 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void __user *arg)
ret = -EOPNOTSUPP;
break;
 
+   case SIOCPROTOPRIVATE ... SIOCPROTOPRIVATE + 15:
+   if (rtdev->do_ioctl != NULL)
+   ret = rtdev->do_ioctl(rtdev, ifr, request);
+   else
+   ret = -EOPNOTSUPP;
+   break;
+
 default:
ret = -EOPNOTSUPP;
break;


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


[Xenomai-git] Philippe Gerum : net/socket: align rtdev do_ioctl handler on the regular ndo_do_ioctl

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

Author: Philippe Gerum 
Date:   Tue Jan 23 12:03:51 2018 +0100

net/socket: align rtdev do_ioctl handler on the regular ndo_do_ioctl

Align on the signature of the regular ndo_do_ioctl() handler for
interface-directed ioctl requests, since an ifr block must have been
provided by the caller to determine the device to hand over the
request to anyway.

---

 kernel/drivers/net/drivers/igb/igb_main.c |7 +++
 kernel/drivers/net/stack/include/rtdev.h  |2 +-
 kernel/drivers/net/stack/socket.c |4 ++--
 3 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/kernel/drivers/net/drivers/igb/igb_main.c 
b/kernel/drivers/net/drivers/igb/igb_main.c
index fe0132b..be98d78 100644
--- a/kernel/drivers/net/drivers/igb/igb_main.c
+++ b/kernel/drivers/net/drivers/igb/igb_main.c
@@ -216,7 +216,7 @@ static int igb_msix_ring(rtdm_irq_t *irq_handle);
 static void igb_poll(struct igb_q_vector *);
 static bool igb_clean_tx_irq(struct igb_q_vector *);
 static bool igb_clean_rx_irq(struct igb_q_vector *, int);
-static int igb_ioctl(struct rtnet_device *, unsigned cmd, void *);
+static int igb_ioctl(struct rtnet_device *, struct ifreq *ifr, int cmd);
 static void igb_reset_task(struct work_struct *);
 static void igb_vlan_mode(struct rtnet_device *netdev,
  netdev_features_t features);
@@ -5063,15 +5063,14 @@ static int igb_mii_ioctl(struct rtnet_device *netdev, 
struct ifreq *ifr, int cmd
  * @ifreq:
  * @cmd:
  **/
-static int igb_ioctl(struct rtnet_device *netdev, unsigned cmd, void *rq)
+static int igb_ioctl(struct rtnet_device *netdev, struct ifreq *ifr, int cmd)
 {
-   struct ifreq *ifr = rq;
-
switch (cmd) {
case SIOCGMIIPHY:
case SIOCGMIIREG:
case SIOCSMIIREG:
return igb_mii_ioctl(netdev, ifr, cmd);
+
default:
return -EOPNOTSUPP;
}
diff --git a/kernel/drivers/net/stack/include/rtdev.h 
b/kernel/drivers/net/stack/include/rtdev.h
index c1c0b4e..a3ac7dd 100644
--- a/kernel/drivers/net/stack/include/rtdev.h
+++ b/kernel/drivers/net/stack/include/rtdev.h
@@ -152,7 +152,7 @@ struct rtnet_device {
   unsigned int priority);
 
 int (*do_ioctl)(struct rtnet_device *rtdev,
-   unsigned int request, void * cmd);
+   struct ifreq *ifr, int cmd);
 struct net_device_stats *(*get_stats)(struct rtnet_device *rtdev);
 
 /* DMA pre-mapping hooks */
diff --git a/kernel/drivers/net/stack/socket.c 
b/kernel/drivers/net/stack/socket.c
index 1eb1856..c139d95 100644
--- a/kernel/drivers/net/stack/socket.c
+++ b/kernel/drivers/net/stack/socket.c
@@ -343,12 +343,12 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void __user *arg)
if (rtdev->do_ioctl != NULL) {
if (rtdm_in_rt_context())
return -ENOSYS;
-   ret = rtdev->do_ioctl(rtdev, request, arg);
+   ret = rtdev->do_ioctl(rtdev, ifr, request);
} else
ret = -EOPNOTSUPP;
break;
 
-   default:
+default:
ret = -EOPNOTSUPP;
break;
 }


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


[Xenomai-git] Philippe Gerum : lib/cobalt: recvfrom: update *addrlen when requested

2018-01-23 Thread git repository hosting
Module: xenomai-3
Branch: stable-3.0.x
Commit: 398ea8fdf41e194d727a15170b3f02449e236453
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=398ea8fdf41e194d727a15170b3f02449e236453

Author: Philippe Gerum 
Date:   Tue Jan 23 16:35:54 2018 +0100

lib/cobalt: recvfrom: update *addrlen when requested

---

 lib/cobalt/rtdm.c |   11 +--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/lib/cobalt/rtdm.c b/lib/cobalt/rtdm.c
index 1907090..9e88ca9 100644
--- a/lib/cobalt/rtdm.c
+++ b/lib/cobalt/rtdm.c
@@ -269,8 +269,15 @@ COBALT_IMPL(ssize_t, recvfrom, (int fd, void *buf, size_t 
len, int flags,
int ret;
 
ret = do_recvmsg(fd, , flags);
-   if (ret != -EBADF && ret != -ENOSYS)
-   return set_errno(ret);
+   if (ret != -EBADF && ret != -ENOSYS) {
+   if (ret < 0)
+   return set_errno(ret);
+
+   if (from)
+   *fromlen = msg.msg_namelen;
+
+   return ret;
+   }
 
return __STD(recvfrom(fd, buf, len, flags, from, fromlen));
 }


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