--- a/src/contrib/ports/win32/pcapif.c 2016-08-11 18:09:35 +++ b/src/contrib/ports/win32/pcapif.c 2016-08-12 14:51:15 @@ -76,6 +76,14 @@ #include "lwip/etharp.h" +#if defined(LWIP_USE_PCAP_OID_GET_REQUEST) /* For 'enum _NDIS_MEDIA_STATE' */ + #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) + #include + #else + #include + #endif +#endif + /* For compatibility with old pcap */ #ifndef PCAP_OPENFLAG_PROMISCUOUS #define PCAP_OPENFLAG_PROMISCUOUS 1 @@ -187,6 +195,28 @@ /* Forward declarations. */ static void pcapif_input(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *packet); +#if PCAPIF_HANDLE_LINKSTATE && defined(LWIP_USE_PCAP_OID_GET_REQUEST) +static enum pcapifh_link_event pcapif_linkstate_get(pcap_t *pd) +{ + enum _NDIS_MEDIA_STATE NdisMediaState; + size_t ret_size = sizeof(NdisMediaState); + + if (pcap_oid_get_request(pd, OID_GEN_MEDIA_CONNECT_STATUS, &NdisMediaState, &ret_size) != 0 || + ret_size != sizeof(NdisMediaState)) + return (PCAPIF_LINKEVENT_UNKNOWN); + + switch (NdisMediaState) { + case NdisMediaStateConnected: + return PCAPIF_LINKEVENT_UP; + case NdisMediaStateDisconnected: + return PCAPIF_LINKEVENT_DOWN; + default: + break; + } + return PCAPIF_LINKEVENT_UNKNOWN; +} +#endif + #ifdef PACKET_LIB_GET_ADAPTER_NETADDRESS /** Get the index of an adapter by its network address * @@ -472,8 +502,13 @@ pcap_freealldevs(alldevs); #if PCAPIF_HANDLE_LINKSTATE + #ifdef LWIP_USE_PCAP_OID_GET_REQUEST + pa->link_state = NULL; + pa->last_link_event = pcapif_linkstate_get(pa->adapter); + #else pa->link_state = pcapifh_linkstate_init(pa->name); pa->last_link_event = PCAPIF_LINKEVENT_UNKNOWN; + #endif #endif /* PCAPIF_HANDLE_LINKSTATE */ return pa; @@ -487,7 +522,11 @@ struct pcapif_private *pa = (struct pcapif_private*)PCAPIF_GET_STATE_PTR(netif); enum pcapifh_link_event le; +#ifdef LWIP_USE_PCAP_OID_GET_REQUEST + le = pcapif_linkstate_get(pa->adapter); +#else le = pcapifh_linkstate_get(pa->link_state); +#endif if (pa->last_link_event != le) { pa->last_link_event = le; @@ -531,9 +570,9 @@ /* wait for rxthread to end */ while(pa->rx_running); #endif /* PCAPIF_RX_USE_THREAD */ -#if PCAPIF_HANDLE_LINKSTATE +#if PCAPIF_HANDLE_LINKSTATE && !defined(LWIP_USE_PCAP_OID_GET_REQUEST) pcapifh_linkstate_close(pa->link_state); -#endif /* PCAPIF_HANDLE_LINKSTATE */ +#endif /* PCAPIF_HANDLE_LINKSTATE !LWIP_USE_PCAP_OID_GET_REQUEST */ free(pa); } } @@ -628,7 +667,12 @@ /* get the initial link state of the selected interface */ #if PCAPIF_HANDLE_LINKSTATE + #if defined(LWIP_USE_PCAP_OID_GET_REQUEST) + pa->last_link_event = pcapif_linkstate_get(pa->adapter); + #else pa->last_link_event = pcapifh_linkstate_get(pa->link_state); + #endif + if (pa->last_link_event == PCAPIF_LINKEVENT_DOWN) { netif_set_link_down(netif); } else { --- a/src/contrib/ports/win32/pcapif_helper.c 2015-09-22 20:02:55 +++ b/src/contrib/ports/win32/pcapif_helper.c 2016-08-13 18:14:45 @@ -3,6 +3,14 @@ * for managing the link state. */ +#if defined(LWIP_USE_PCAP_OID_GET_REQUEST) + /* + * pcap_oid_get_request() is used directly in pcapif.c + */ +#include + +#else /* rest of file */ + #include "pcapif_helper.h" #include @@ -103,3 +111,4 @@ } #endif /* WIN32 */ \ No newline at end of file +#endif /* LWIP_USE_PCAP_OID_GET_REQUEST */ --- a/src/contrib/ports/win32/pcapif_helper.h 2015-09-22 20:02:55 +++ b/src/contrib/ports/win32/pcapif_helper.h 2016-08-12 14:26:57 @@ -13,10 +13,11 @@ PCAPIF_LINKEVENT_DOWN }; -struct pcapifh_linkstate* pcapifh_linkstate_init(char *adapter_name); -enum pcapifh_link_event pcapifh_linkstate_get(struct pcapifh_linkstate* state); -void pcapifh_linkstate_close(struct pcapifh_linkstate* state); - +#if !defined(LWIP_USE_PCAP_OID_GET_REQUEST) + struct pcapifh_linkstate* pcapifh_linkstate_init(const char *adapter_name); + enum pcapifh_link_event pcapifh_linkstate_get(struct pcapifh_linkstate* state); + void pcapifh_linkstate_close(struct pcapifh_linkstate* state); +#endif #ifdef __cplusplus }