diff --git a/CHANGELOG b/CHANGELOG index 34078239..de30305b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -23,6 +23,10 @@ HISTORY ++ New features: + 2007-03-21 Kieran Mansley + * netif.c, netif.h: Apply patch#4197 with some changes (originator: rireland@hmgsl.com). + Provides callback on netif up/down state change. + 2007-03-11 Frédéric Bernon, Mace Gael, Steve Reynolds * sockets.h, sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c, igmp.h, igmp.c, ip.c, netif.h, tcpip.c, opt.h: diff --git a/src/core/netif.c b/src/core/netif.c index b1e2bc18..5ec5a283 100644 --- a/src/core/netif.c +++ b/src/core/netif.c @@ -79,6 +79,10 @@ netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, /* netif not under DHCP control by default */ netif->dhcp = NULL; #endif +#if LWIP_NETIF_CALLBACK + netif->status_callback = NULL; +#endif /* LWIP_NETIF_CALLBACK */ + /* remember netif specific state information data */ netif->state = state; netif->num = netifnum++; @@ -287,10 +291,17 @@ netif_set_default(struct netif *netif) */ void netif_set_up(struct netif *netif) { - netif->flags |= NETIF_FLAG_UP; + if ( !(netif->flags & NETIF_FLAG_UP )) { + netif->flags |= NETIF_FLAG_UP; + #if LWIP_SNMP - snmp_get_sysuptime(&netif->ts); + snmp_get_sysuptime(&netif->ts); #endif +#if LWIP_NETIF_CALLBACK + if ( netif->status_callback ) + (netif->status_callback)( netif ); +#endif /* LWIP_NETIF_CALLBACK */ + } } /** @@ -311,10 +322,18 @@ u8_t netif_is_up(struct netif *netif) */ void netif_set_down(struct netif *netif) { - netif->flags &= ~NETIF_FLAG_UP; + if ( netif->flags & NETIF_FLAG_UP ) + { + netif->flags &= ~NETIF_FLAG_UP; #if LWIP_SNMP - snmp_get_sysuptime(&netif->ts); + snmp_get_sysuptime(&netif->ts); #endif + +#if LWIP_NETIF_CALLBACK + if ( netif->status_callback ) + (netif->status_callback)( netif ); +#endif /* LWIP_NETIF_CALLBACK */ + } } void @@ -323,3 +342,15 @@ netif_init(void) netif_list = netif_default = NULL; } + +#if LWIP_NETIF_CALLBACK +/** + * Set callback to be called when interface is brought up/down + */ +void netif_set_status_callback( struct netif *netif, void (* status_callback)(struct netif *netif )) +{ + if ( netif ) + netif->status_callback = status_callback; +} +#endif /* LWIP_NETIF_CALLBACK */ + diff --git a/src/include/lwip/netif.h b/src/include/lwip/netif.h index 4e58e734..9c86f8e5 100644 --- a/src/include/lwip/netif.h +++ b/src/include/lwip/netif.h @@ -90,6 +90,11 @@ struct netif { * to send a packet on the interface. This function outputs * the pbuf as-is on the link medium. */ err_t (* linkoutput)(struct netif *netif, struct pbuf *p); +#if LWIP_NETIF_CALLBACK + /** This function is called when the netif state is set to up or down + */ + void (* status_callback)(struct netif *netif); +#endif /* end, LWIP_NETIF_CALLBACK */ /** This field can be set by the device driver and could point * to state information for the device. */ void *state; @@ -165,5 +170,11 @@ void netif_set_gw(struct netif *netif, struct ip_addr *gw); void netif_set_up(struct netif *netif); void netif_set_down(struct netif *netif); u8_t netif_is_up(struct netif *netif); +#if LWIP_NETIF_CALLBACK +/* + * Set callback to be called when interface is brought up/down + */ +void netif_set_status_callback( struct netif *netif, void (* status_callback)(struct netif *netif )); +#endif /* LWIP_NETIF_CALLBACK */ #endif /* __LWIP_NETIF_H__ */