diff --git a/components/lwip/core/ipv4/ip4.c b/components/lwip/core/ipv4/ip4.c index 3877e2060..cc4393af7 100755 --- a/components/lwip/core/ipv4/ip4.c +++ b/components/lwip/core/ipv4/ip4.c @@ -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) diff --git a/components/lwip/include/lwip/port/lwipopts.h b/components/lwip/include/lwip/port/lwipopts.h index a4b07006e..0741db925 100644 --- a/components/lwip/include/lwip/port/lwipopts.h +++ b/components/lwip/include/lwip/port/lwipopts.h @@ -596,6 +596,7 @@ ---------- Hook options --------------- --------------------------------------- */ +#define LWIP_HOOK_IP4_ROUTE_SRC ip4_route_src_hook /* ---------------------------------------