From 40d25adb884279ee3968c55c741921e2f2109f7a Mon Sep 17 00:00:00 2001 From: goldsimon Date: Mon, 17 Mar 2014 12:53:31 +0100 Subject: [PATCH] Added LWIP_HOOK_ETHARP_GET_GW to implement IPv4 routing with multiple gateways --- CHANGELOG | 4 ++++ src/include/lwip/opt.h | 13 +++++++++++++ src/netif/etharp.c | 24 ++++++++++++++++-------- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 6db4c834..f86f5d9b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,6 +6,10 @@ HISTORY ++ New features: + 2013-03-17: Simon Goldschmidt (patch by Ghobad Emadi) + * opt.h, etharp.c: Added LWIP_HOOK_ETHARP_GET_GW to implement IPv4 routing with + multiple gateways + 2013-04-20: Fatih Asici * opt.h, etharp.h/.c: patch #7993: Added support for transmitting packets with VLAN headers via hook function LWIP_HOOK_VLAN_SET and to check them diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h index 7db6b4ad..11080be5 100644 --- a/src/include/lwip/opt.h +++ b/src/include/lwip/opt.h @@ -2235,6 +2235,19 @@ * that case, ip_route() continues as normal. */ +/** + * LWIP_HOOK_ETHARP_GET_GW(netif, dest): + * - called from etharp_output() (IPv4) + * - netif: the netif used for sending + * - dest: the destination IPv4 address + * Returns the IPv4 address of the gateway to handle the specified destination + * IPv4 address. If NULL is returned, the netif's default gateway is used. + * The returned address MUST be reachable on the specified netif! + * This function is meant to implement advanced IPv4 routing together with + * LWIP_HOOK_IP4_ROUTE(). The actual routing/gateway table implementation is + * not part of lwIP but can e.g. be hidden in the netif's state argument. +*/ + /** * LWIP_HOOK_VLAN_CHECK(netif, eth_hdr, vlan_hdr): * - called from ethernet_input() if VLAN support is enabled diff --git a/src/netif/etharp.c b/src/netif/etharp.c index a3aff06a..650af4c7 100644 --- a/src/netif/etharp.c +++ b/src/netif/etharp.c @@ -954,14 +954,22 @@ etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr) if (!ip_addr_islinklocal(&iphdr->src)) #endif /* LWIP_AUTOIP */ { - /* interface has default gateway? */ - if (!ip_addr_isany(&netif->gw)) { - /* send to hardware address of default gateway IP address */ - dst_addr = &(netif->gw); - /* no default gateway available */ - } else { - /* no route to destination error (default gateway missing) */ - return ERR_RTE; +#ifdef LWIP_HOOK_ETHARP_GET_GW + /* For advanced routing, a single default gateway might not be enough, so get + the IP address of the gateway to handle the current destination address. */ + dst_addr = LWIP_HOOK_ETHARP_GET_GW(netif, ipaddr); + if(dst_addr == NULL) +#endif /* LWIP_HOOK_ETHARP_GET_GW */ + { + /* interface has default gateway? */ + if (!ip_addr_isany(&netif->gw)) { + /* send to hardware address of default gateway IP address */ + dst_addr = &(netif->gw); + /* no default gateway available */ + } else { + /* no route to destination error (default gateway missing) */ + return ERR_RTE; + } } } }