diff --git a/src/core/ipv4/ip4.c b/src/core/ipv4/ip4.c index 4e4eb6114..45e12d579 100644 --- a/src/core/ipv4/ip4.c +++ b/src/core/ipv4/ip4.c @@ -121,9 +121,37 @@ ip4_set_default_multicast_netif(struct netif* default_multicast_netif) #endif /* LWIP_MULTICAST_TX_OPTIONS */ #ifdef LWIP_HOOK_IP4_ROUTE_SRC +#if ESP_LWIP +/** + * 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) && (!ip4_addr_isany(src) || 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; +} +#endif + /** * 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)