You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by bt...@apache.org on 2021/01/31 00:04:52 UTC

[incubator-nuttx] 01/02: net/ip: do not drop the udp packet from IP layer

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

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

commit ab148bc69fe9fb66a849043612dc7aa89515295c
Author: chao.an <an...@xiaomi.com>
AuthorDate: Mon Jan 18 16:43:52 2021 +0800

    net/ip: do not drop the udp packet from IP layer
    
    this change to support receive the udp data from the specified
    port without obtaining the address.
    
    e.g: disable the Bootstrap flag on dhcpc handshake
    
    Reference:
    RFC1542: Clarifications and Extensions for the Bootstrap Protocol.
    
    Signed-off-by: chao.an <an...@xiaomi.com>
---
 net/devif/ipv4_input.c | 20 ++++++++++----------
 net/devif/ipv6_input.c | 29 +++++++++++++----------------
 2 files changed, 23 insertions(+), 26 deletions(-)

diff --git a/net/devif/ipv4_input.c b/net/devif/ipv4_input.c
index e88c3b2..8e35497 100644
--- a/net/devif/ipv4_input.c
+++ b/net/devif/ipv4_input.c
@@ -237,16 +237,6 @@ int ipv4_input(FAR struct net_driver_s *dev)
     }
   else
 #endif
-#ifdef CONFIG_NET_ICMP
-  /* In other cases, the device must be assigned a non-zero IP address. */
-
-  if (net_ipv4addr_cmp(dev->d_ipaddr, INADDR_ANY))
-    {
-      nwarn("WARNING: No IP address assigned\n");
-      goto drop;
-    }
-  else
-#endif
 #if defined(CONFIG_NET_BROADCAST) && defined(NET_UDP_HAVE_STACK)
   /* The address is not the broadcast address and we have been assigned a
    * address.  So there is also the possibility that the destination address
@@ -307,6 +297,7 @@ int ipv4_input(FAR struct net_driver_s *dev)
             }
           else
 #endif
+          if (ipv4->proto != IP_PROTO_UDP)
             {
               /* Not destined for us and not forwardable... Drop the
                * packet.
@@ -322,6 +313,15 @@ int ipv4_input(FAR struct net_driver_s *dev)
             }
         }
     }
+#ifdef CONFIG_NET_ICMP
+  /* In other cases, the device must be assigned a non-zero IP address. */
+
+  else if (net_ipv4addr_cmp(dev->d_ipaddr, INADDR_ANY))
+    {
+      nwarn("WARNING: No IP address assigned\n");
+      goto drop;
+    }
+#endif
 
   if (ipv4_chksum(dev) != 0xffff)
     {
diff --git a/net/devif/ipv6_input.c b/net/devif/ipv6_input.c
index 95d75cc..5d56d83 100644
--- a/net/devif/ipv6_input.c
+++ b/net/devif/ipv6_input.c
@@ -409,22 +409,6 @@ int ipv6_input(FAR struct net_driver_s *dev)
        * address by its IPv6 nexthdr field.
        */
     }
-
-  /* In other cases, the device must be assigned a non-zero IP address
-   * (the all zero address is the "unspecified" address.
-   */
-
-  else
-#endif
-#ifdef CONFIG_NET_ICMPv6
-  if (net_ipv6addr_cmp(dev->d_ipv6addr, g_ipv6_unspecaddr))
-    {
-      nwarn("WARNING: No IP address assigned\n");
-      goto drop;
-    }
-
-  /* Check if the packet is destined for out IP address */
-
   else
 #endif
     {
@@ -449,6 +433,7 @@ int ipv6_input(FAR struct net_driver_s *dev)
             }
           else
 #endif
+          if (nxthdr != IP_PROTO_UDP)
             {
               /* Not destined for us and not forwardable... drop the packet. */
 
@@ -457,6 +442,18 @@ int ipv6_input(FAR struct net_driver_s *dev)
             }
         }
     }
+#ifdef CONFIG_NET_ICMPv6
+
+  /* In other cases, the device must be assigned a non-zero IP address
+   * (the all zero address is the "unspecified" address.
+   */
+
+  if (net_ipv6addr_cmp(dev->d_ipv6addr, g_ipv6_unspecaddr))
+    {
+      nwarn("WARNING: No IP address assigned\n");
+      goto drop;
+    }
+#endif
 
   /* Now process the incoming packet according to the protocol specified in
    * the next header IPv6 field.