Added LWIP_HOOK_ETHARP_GET_GW to implement IPv4 routing with multiple gateways

This commit is contained in:
goldsimon 2014-03-17 12:53:31 +01:00
parent 3fceef0936
commit 40d25adb88
3 changed files with 33 additions and 8 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}
}
}
}