mirror of
https://git.savannah.nongnu.org/git/lwip.git
synced 2026-06-16 18:03:44 +08:00
Import lwIP contrib rep
... from http://git.savannah.gnu.org/cgit/lwip/lwip-contrib.git/ into contrib/ subdir, STABLE-2_1_0_RELEASE tag lwIP contrib is now officially frozen TODO: Fix build
This commit is contained in:
105
contrib/ports/win32/pcapif_helper.c
Normal file
105
contrib/ports/win32/pcapif_helper.c
Normal file
@@ -0,0 +1,105 @@
|
||||
/**
|
||||
* pcapif_helper.c - This file is part of lwIP pcapif and provides helper functions
|
||||
* for managing the link state.
|
||||
*/
|
||||
|
||||
#include "pcapif_helper.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lwip/arch.h"
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning( push, 3 )
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <packet32.h>
|
||||
#include <ntddndis.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning ( pop )
|
||||
#endif
|
||||
|
||||
struct pcapifh_linkstate {
|
||||
LPADAPTER lpAdapter;
|
||||
PPACKET_OID_DATA ppacket_oid_data;
|
||||
};
|
||||
|
||||
struct pcapifh_linkstate* pcapifh_linkstate_init(char *adapter_name)
|
||||
{
|
||||
struct pcapifh_linkstate* state = (struct pcapifh_linkstate*)malloc(sizeof(struct pcapifh_linkstate));
|
||||
if (state != NULL) {
|
||||
memset(state, 0, sizeof(struct pcapifh_linkstate));
|
||||
state->ppacket_oid_data = (PPACKET_OID_DATA)malloc(sizeof(PACKET_OID_DATA) + sizeof(NDIS_MEDIA_STATE));
|
||||
if (state->ppacket_oid_data == NULL) {
|
||||
free(state);
|
||||
state = NULL;
|
||||
} else {
|
||||
state->lpAdapter = PacketOpenAdapter((char*)adapter_name);
|
||||
if ((state->lpAdapter == NULL) || (state->lpAdapter->hFile == INVALID_HANDLE_VALUE)) {
|
||||
/* failed to open adapter */
|
||||
free(state);
|
||||
state = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
enum pcapifh_link_event pcapifh_linkstate_get(struct pcapifh_linkstate* state)
|
||||
{
|
||||
enum pcapifh_link_event ret = PCAPIF_LINKEVENT_UNKNOWN;
|
||||
if (state != NULL) {
|
||||
state->ppacket_oid_data->Oid = OID_GEN_MEDIA_CONNECT_STATUS;
|
||||
state->ppacket_oid_data->Length = sizeof(NDIS_MEDIA_STATE);
|
||||
if (PacketRequest(state->lpAdapter, FALSE, state->ppacket_oid_data)) {
|
||||
NDIS_MEDIA_STATE fNdisMediaState;
|
||||
fNdisMediaState = (*((PNDIS_MEDIA_STATE)(state->ppacket_oid_data->Data)));
|
||||
ret = ((fNdisMediaState == NdisMediaStateConnected) ? PCAPIF_LINKEVENT_UP : PCAPIF_LINKEVENT_DOWN);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void pcapifh_linkstate_close(struct pcapifh_linkstate* state)
|
||||
{
|
||||
if (state != NULL) {
|
||||
if (state->lpAdapter != NULL) {
|
||||
PacketCloseAdapter(state->lpAdapter);
|
||||
}
|
||||
if (state->ppacket_oid_data != NULL) {
|
||||
free(state->ppacket_oid_data);
|
||||
}
|
||||
free(state);
|
||||
}
|
||||
}
|
||||
|
||||
#else /* WIN32 */
|
||||
|
||||
/* @todo: add linux/unix implementation? */
|
||||
|
||||
struct pcapifh_linkstate {
|
||||
u8_t empty;
|
||||
};
|
||||
|
||||
struct pcapifh_linkstate* pcapifh_linkstate_init(char *adapter_name)
|
||||
{
|
||||
LWIP_UNUSED_ARG(adapter_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
enum pcapifh_link_event pcapifh_linkstate_get(struct pcapifh_linkstate* state)
|
||||
{
|
||||
LWIP_UNUSED_ARG(state);
|
||||
return PCAPIF_LINKEVENT_UP;
|
||||
}
|
||||
void pcapifh_linkstate_close(struct pcapifh_linkstate* state)
|
||||
{
|
||||
LWIP_UNUSED_ARG(state);
|
||||
}
|
||||
|
||||
#endif /* WIN32 */
|
||||
Reference in New Issue
Block a user