netif.h, netif.c: A new NETIF_FLAG_ETHARP flag is defined in netif.h, to allow to initialize a network interface's flag with. It tell this interface is an ethernet device, and we can use ARP with it to do a "gratuitous ARP" (RFC 3220 "IP Mobility Support for IPv4" section 4.6) when interface is "up" with netif_set_up().

This commit is contained in:
fbernon 2007-03-28 09:23:35 +00:00
parent 4aee4c1ac7
commit cd1c96db56
3 changed files with 30 additions and 12 deletions

View File

@ -23,6 +23,12 @@ HISTORY
++ New features: ++ New features:
2007-03-28 Frédéric Bernon
* netif.h, netif.c: A new NETIF_FLAG_ETHARP flag is defined in netif.h, to allow to
initialize a network interface's flag with. It tell this interface is an ethernet
device, and we can use ARP with it to do a "gratuitous ARP" (RFC 3220 "IP Mobility
Support for IPv4" section 4.6) when interface is "up" with netif_set_up().
2007-03-26 Frédéric Bernon, Jonathan Larmour 2007-03-26 Frédéric Bernon, Jonathan Larmour
* opt.h, tcpip.c: New configuration option LWIP_ARP allow to disable ARP init at build * opt.h, tcpip.c: New configuration option LWIP_ARP allow to disable ARP init at build
time if you only use PPP or SLIP. The default is enable. Note we don't have to call time if you only use PPP or SLIP. The default is enable. Note we don't have to call

View File

@ -44,6 +44,11 @@
#include "lwip/tcp.h" #include "lwip/tcp.h"
#include "lwip/snmp.h" #include "lwip/snmp.h"
#if LWIP_ARP
#include "netif/etharp.h"
#endif /* LWIP_ARP */
struct netif *netif_list = NULL; struct netif *netif_list = NULL;
struct netif *netif_default = NULL; struct netif *netif_default = NULL;
@ -219,14 +224,6 @@ netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr)
snmp_insert_ipaddridx_tree(netif); snmp_insert_ipaddridx_tree(netif);
snmp_insert_iprteidx_tree(0,netif); snmp_insert_iprteidx_tree(0,netif);
#if 0 /* only allowed for Ethernet interfaces TODO: how can we check? */
/** For Ethernet network interfaces, we would like to send a
* "gratuitous ARP"; this is an ARP packet sent by a node in order
* to spontaneously cause other nodes to update an entry in their
* ARP cache. From RFC 3220 "IP Mobility Support for IPv4" section 4.6.
*/
etharp_query(netif, ipaddr, NULL);
#endif
LWIP_DEBUGF(NETIF_DEBUG | DBG_TRACE | DBG_STATE | 3, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", LWIP_DEBUGF(NETIF_DEBUG | DBG_TRACE | DBG_STATE | 3, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
netif->name[0], netif->name[1], netif->name[0], netif->name[1],
ip4_addr1(&netif->ip_addr), ip4_addr1(&netif->ip_addr),
@ -296,11 +293,24 @@ void netif_set_up(struct netif *netif)
#if LWIP_SNMP #if LWIP_SNMP
snmp_get_sysuptime(&netif->ts); snmp_get_sysuptime(&netif->ts);
#endif #endif /* LWIP_SNMP */
#if LWIP_NETIF_CALLBACK #if LWIP_NETIF_CALLBACK
if ( netif->status_callback ) if ( netif->status_callback )
(netif->status_callback)( netif ); (netif->status_callback)( netif );
#endif /* LWIP_NETIF_CALLBACK */ #endif /* LWIP_NETIF_CALLBACK */
#if LWIP_ARP
/** For Ethernet network interfaces, we would like to send a
* "gratuitous ARP"; this is an ARP packet sent by a node in order
* to spontaneously cause other nodes to update an entry in their
* ARP cache. From RFC 3220 "IP Mobility Support for IPv4" section 4.6.
*/
if ((netif->flags & NETIF_FLAG_ETHARP) == 0) {
etharp_query(netif, &(netif->ip_addr), NULL);
}
#endif /* LWIP_ARP */
} }
} }

View File

@ -64,6 +64,8 @@
/** if set, the interface has an active link /** if set, the interface has an active link
* (set by the network interface driver) */ * (set by the network interface driver) */
#define NETIF_FLAG_LINK_UP 0x10U #define NETIF_FLAG_LINK_UP 0x10U
/** if set, the netif is an device using ARP */
#define NETIF_FLAG_ETHARP 0x20U
/** Generic data structure used for all lwIP network interfaces. /** Generic data structure used for all lwIP network interfaces.
* The following fields should be filled in by the initialization * The following fields should be filled in by the initialization
@ -101,7 +103,7 @@ struct netif {
#if LWIP_DHCP #if LWIP_DHCP
/** the DHCP client state information for this netif */ /** the DHCP client state information for this netif */
struct dhcp *dhcp; struct dhcp *dhcp;
#endif #endif /* LWIP_DHCP */
/** number of bytes used in hwaddr */ /** number of bytes used in hwaddr */
u8_t hwaddr_len; u8_t hwaddr_len;
/** link level hardware address of this interface */ /** link level hardware address of this interface */
@ -130,11 +132,11 @@ struct netif {
u32_t ifoutucastpkts; u32_t ifoutucastpkts;
u32_t ifoutnucastpkts; u32_t ifoutnucastpkts;
u32_t ifoutdiscards; u32_t ifoutdiscards;
#endif #endif /* LWIP_SNMP */
#if LWIP_IGMP #if LWIP_IGMP
/* This function could be called to add or delete a entry in the multicast filter table of the ethernet MAC.*/ /* This function could be called to add or delete a entry in the multicast filter table of the ethernet MAC.*/
err_t (*igmp_mac_filter)( struct netif *netif, struct ip_addr *group, u8_t action); err_t (*igmp_mac_filter)( struct netif *netif, struct ip_addr *group, u8_t action);
#endif #endif /* LWIP_IGMP */
}; };
/** The list of network interfaces. */ /** The list of network interfaces. */