]> granicus.if.org Git - esp-idf/commitdiff
Broadcast IP route based on source IP address.
authorXiaXiaotian <xiaxiaotian@espressif.com>
Fri, 30 Jun 2017 08:18:29 +0000 (16:18 +0800)
committerXiaXiaotian <xiaxiaotian@espressif.com>
Tue, 5 Sep 2017 09:51:15 +0000 (17:51 +0800)
    If destination IP address of the packet is broadcast address, firstly compare
    source IP address with the that of each network interface. If it matches,
    packet is forwarded from the interface.

components/lwip/core/ipv4/ip4.c
components/lwip/include/lwip/port/lwipopts.h

index 3877e2060923cd45201d2c612697046ccb76e1ea..cc4393af78610f1df084af7065dd13c9d9cfad74 100755 (executable)
@@ -115,9 +115,36 @@ ip4_set_default_multicast_netif(struct netif* default_multicast_netif)
 #endif /* LWIP_MULTICAST_TX_OPTIONS */
 
 #ifdef LWIP_HOOK_IP4_ROUTE_SRC
+/**
+ * Source based IPv4 routing hook function. This function works only
+ * when destination IP is broadcast IP.
+ */
+struct netif *
+ip4_route_src_hook(const ip4_addr_t *dest, const ip4_addr_t *src)
+{
+    struct netif *netif = NULL;
+
+    /* destination IP is broadcast IP? */
+    if ((src != NULL) && (dest->addr == IPADDR_BROADCAST)) {
+      /* iterate through netifs */
+      for (netif = netif_list; netif != NULL; netif = netif->next) {
+        /* is the netif up, does it have a link and a valid address? */
+        if (netif_is_up(netif) && netif_is_link_up(netif) && !ip4_addr_isany_val(*netif_ip4_addr(netif))) {
+          /* source IP matches? */
+          if (ip4_addr_cmp(src, netif_ip4_addr(netif))) {
+            /* return netif on which to forward IP packet */
+            return netif;
+          }
+        }
+      }
+    }
+
+    return netif;
+}
+
 /**
  * Source based IPv4 routing must be fully implemented in
- * LWIP_HOOK_IP4_ROUTE_SRC(). This function only provides he parameters.
+ * LWIP_HOOK_IP4_ROUTE_SRC(). This function only provides the parameters.
  */
 struct netif *
 ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src)
index 3b8c5485c41a0bdadd2e68ef0b3f6063271a9a32..737569a718639e99fe29be8228c270aceae77fc8 100644 (file)
    ---------- Hook options ---------------
    ---------------------------------------
 */
+#define LWIP_HOOK_IP4_ROUTE_SRC         ip4_route_src_hook
 
 /*
    ---------------------------------------