This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 3f08f32486 net: allow icmpv6 and udp to find the dev by the ifindex 
with s_boundto.
3f08f32486 is described below

commit 3f08f3248667076c25ecdb72461c37cb1963b7dc
Author: liqinhui <liqin...@xiaomi.com>
AuthorDate: Sat Oct 7 19:24:42 2023 +0800

    net: allow icmpv6 and udp to find the dev by the ifindex with s_boundto.
    
    In order to support the dhcpv6c.
    
    Signed-off-by: liqinhui <liqin...@xiaomi.com>
---
 net/icmpv6/icmpv6_sendmsg.c | 14 ++++++++++++--
 net/inet/inet_sockif.c      |  5 +++++
 net/udp/udp_finddev.c       |  7 +++++--
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/net/icmpv6/icmpv6_sendmsg.c b/net/icmpv6/icmpv6_sendmsg.c
index 0e39796237..e238e82fcb 100644
--- a/net/icmpv6/icmpv6_sendmsg.c
+++ b/net/icmpv6/icmpv6_sendmsg.c
@@ -298,8 +298,18 @@ ssize_t icmpv6_sendmsg(FAR struct socket *psock, FAR 
struct msghdr *msg,
 
   /* Get the device that will be used to route this ICMPv6 ECHO request */
 
-  dev = netdev_findby_ripv6addr(g_ipv6_unspecaddr,
-                               inaddr->sin6_addr.s6_addr16);
+#ifdef CONFIG_NET_BINDTODEVICE
+  if (conn->sconn.s_boundto != 0)
+    {
+      dev = netdev_findbyindex(conn->sconn.s_boundto);
+    }
+  else
+#endif
+    {
+      dev = netdev_findby_ripv6addr(g_ipv6_unspecaddr,
+                                    inaddr->sin6_addr.s6_addr16);
+    }
+
   if (dev == NULL)
     {
       nerr("ERROR: Not reachable\n");
diff --git a/net/inet/inet_sockif.c b/net/inet/inet_sockif.c
index 2f63f94751..8e6f8bd91c 100644
--- a/net/inet/inet_sockif.c
+++ b/net/inet/inet_sockif.c
@@ -1909,6 +1909,11 @@ static ssize_t inet_sendmsg(FAR struct socket *psock,
 
   for (len = 0, iov = msg->msg_iov; iov != end; iov++)
     {
+      if (iov->iov_len == 0 || iov->iov_base == NULL)
+        {
+          continue;
+        }
+
       memcpy(((unsigned char *)buf) + len, iov->iov_base, iov->iov_len);
       len += iov->iov_len;
     }
diff --git a/net/udp/udp_finddev.c b/net/udp/udp_finddev.c
index 2240ac05ba..b4c2d92b50 100644
--- a/net/udp/udp_finddev.c
+++ b/net/udp/udp_finddev.c
@@ -215,11 +215,14 @@ udp_find_raddr_device(FAR struct udp_conn_s *conn,
 #if defined(CONFIG_NET_MLD) && defined(CONFIG_NET_BINDTODEVICE)
           if (IN6_IS_ADDR_MULTICAST(&raddr))
             {
-              if ((conn->sconn.s_boundto == 0) &&
-                  (conn->mreq.imr_ifindex != 0))
+              if (conn->mreq.imr_ifindex != 0)
                 {
                   return netdev_findbyindex(conn->mreq.imr_ifindex);
                 }
+              else if (conn->sconn.s_boundto != 0)
+                {
+                  return netdev_findbyindex(conn->sconn.s_boundto);
+                }
             }
           else
 #endif

Reply via email to