mirror of
https://github.com/ep00ch/lwip-contrib-mac.git
synced 2024-07-07 20:29:04 +00:00
MSVC packetlib adapter: added the possibility to select adapter via GUID (instead of index, which can change); added some deallocations on error; printing adapter names when listing adapters
This commit is contained in:
parent
c813c2f691
commit
2e84b2ba2b
@ -5,7 +5,11 @@
|
|||||||
|
|
||||||
/* configuration for this port */
|
/* configuration for this port */
|
||||||
|
|
||||||
#define PACKET_LIB_ADAPTER_NR 3
|
/** Define this to the index of the windows network adapter to use */
|
||||||
|
#define PACKET_LIB_ADAPTER_NR 1
|
||||||
|
/** Define this to the GUID of the windows network adapter to use
|
||||||
|
* or NOT define this if you want PACKET_LIB_ADAPTER_NR to be used */
|
||||||
|
/*#define PACKET_LIB_ADAPTER_GUID "00000000-0000-0000-0000-000000000000"*/
|
||||||
|
|
||||||
#define LWIP_PORT_INIT_IPADDR(addr) IP4_ADDR((addr), 192,168,1,200)
|
#define LWIP_PORT_INIT_IPADDR(addr) IP4_ADDR((addr), 192,168,1,200)
|
||||||
#define LWIP_PORT_INIT_GW(addr) IP4_ADDR((addr), 192,168,1,1)
|
#define LWIP_PORT_INIT_GW(addr) IP4_ADDR((addr), 192,168,1,1)
|
||||||
|
@ -94,6 +94,78 @@ struct packet_adapter {
|
|||||||
char buffer[PACKET_INPUT_BUFSIZE];
|
char buffer[PACKET_INPUT_BUFSIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Get a list of adapters
|
||||||
|
*
|
||||||
|
* @param adapter_list void* array: list where the adapters are stored
|
||||||
|
* @param list_len size of adapter_list (number of void*)
|
||||||
|
* @param buffer here the actual data is stored, adapter_list points into this buffer
|
||||||
|
* @param buf_len size of buffer in bytes
|
||||||
|
* @return number of adapters found or negative on error
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
get_adapter_list(void** adapter_list, int list_len, void* buffer, size_t buf_len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *temp, *start;
|
||||||
|
ULONG AdapterLength;
|
||||||
|
|
||||||
|
memset(adapter_list, 0, list_len*sizeof(void*));
|
||||||
|
memset(buffer, 0, buf_len);
|
||||||
|
|
||||||
|
/* obtain the name of the adapters installed on this machine
|
||||||
|
(a list of strings separated by '\0') */
|
||||||
|
AdapterLength = buf_len;
|
||||||
|
if (PacketGetAdapterNames((char*)buffer, &AdapterLength)==FALSE){
|
||||||
|
printf("Unable to retrieve the list of the adapters!\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the start of each adapter name in the list and put it into
|
||||||
|
* the AdapterList array */
|
||||||
|
i = 0;
|
||||||
|
temp = buffer;
|
||||||
|
start = buffer;
|
||||||
|
while ((*temp != '\0') || (*(temp - 1) != '\0')) {
|
||||||
|
if (*temp == '\0') {
|
||||||
|
adapter_list[i] = start;
|
||||||
|
start = temp + 1;
|
||||||
|
i++;
|
||||||
|
if (i >= list_len) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
temp++;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get the index of an adapter by its GUID
|
||||||
|
*
|
||||||
|
* @param GUID of the adapter
|
||||||
|
* @return index of the adapter or negative on error
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
get_adapter_index(const char* adapter_guid)
|
||||||
|
{
|
||||||
|
void *AdapterList[MAX_NUM_ADAPTERS];
|
||||||
|
int i;
|
||||||
|
char AdapterName[ADAPTER_NAME_LEN]; /* string that contains a list of the network adapters */
|
||||||
|
int AdapterNum;
|
||||||
|
|
||||||
|
if ((adapter_guid != NULL) && (adapter_guid[0] != 0)) {
|
||||||
|
AdapterNum = get_adapter_list(AdapterList, MAX_NUM_ADAPTERS, AdapterName, ADAPTER_NAME_LEN);
|
||||||
|
if (AdapterNum > 0) {
|
||||||
|
for (i = 0; i < AdapterNum; i++) {
|
||||||
|
if(strstr(AdapterList[i], adapter_guid)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a network adapter and set it up for packet input
|
* Open a network adapter and set it up for packet input
|
||||||
*
|
*
|
||||||
@ -109,9 +181,7 @@ init_adapter(int adapter_num, char *mac_addr, input_fn input, void *arg)
|
|||||||
void *AdapterList[MAX_NUM_ADAPTERS];
|
void *AdapterList[MAX_NUM_ADAPTERS];
|
||||||
int i;
|
int i;
|
||||||
char AdapterName[ADAPTER_NAME_LEN]; /* string that contains a list of the network adapters */
|
char AdapterName[ADAPTER_NAME_LEN]; /* string that contains a list of the network adapters */
|
||||||
char *temp, *start;
|
int AdapterNum;
|
||||||
int AdapterNum =0;
|
|
||||||
ULONG AdapterLength;
|
|
||||||
PPACKET_OID_DATA ppacket_oid_data;
|
PPACKET_OID_DATA ppacket_oid_data;
|
||||||
unsigned char ethaddr[ETHARP_HWADDR_LEN];
|
unsigned char ethaddr[ETHARP_HWADDR_LEN];
|
||||||
struct packet_adapter *pa;
|
struct packet_adapter *pa;
|
||||||
@ -126,43 +196,31 @@ init_adapter(int adapter_num, char *mac_addr, input_fn input, void *arg)
|
|||||||
pa->input = input;
|
pa->input = input;
|
||||||
pa->input_fn_arg = arg;
|
pa->input_fn_arg = arg;
|
||||||
|
|
||||||
memset(AdapterList, 0, sizeof(AdapterList));
|
AdapterNum = get_adapter_list(AdapterList, MAX_NUM_ADAPTERS, AdapterName, ADAPTER_NAME_LEN);
|
||||||
memset(AdapterName, 0, sizeof(AdapterName));
|
|
||||||
|
|
||||||
/* obtain the name of the adapters installed on this machine
|
|
||||||
(a list of strings separated by '\0') */
|
|
||||||
AdapterLength = ADAPTER_NAME_LEN;
|
|
||||||
if (PacketGetAdapterNames((char*)AdapterName, &AdapterLength)==FALSE){
|
|
||||||
printf("Unable to retrieve the list of the adapters!\n");
|
|
||||||
free(pa);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the start of each adapter name in the list and put it into
|
|
||||||
* the AdapterList array */
|
|
||||||
i = 0;
|
|
||||||
temp = AdapterName;
|
|
||||||
start = AdapterName;
|
|
||||||
while ((*temp != '\0') || (*(temp - 1) != '\0')) {
|
|
||||||
if (*temp == '\0') {
|
|
||||||
AdapterList[i] = start;
|
|
||||||
start = temp + 1;
|
|
||||||
i++;
|
|
||||||
if (i >= MAX_NUM_ADAPTERS) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
temp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* print all adapter names */
|
/* print all adapter names */
|
||||||
AdapterNum = i;
|
|
||||||
if (AdapterNum <= 0) {
|
if (AdapterNum <= 0) {
|
||||||
free(pa);
|
free(pa);
|
||||||
return NULL; /* no adapters found */
|
return NULL; /* no adapters found */
|
||||||
}
|
}
|
||||||
for (i = 0; i < AdapterNum; i++) {
|
for (i = 0; i < AdapterNum; i++) {
|
||||||
|
LPADAPTER lpAdapter;
|
||||||
printf("%2i: %s\n", i, AdapterList[i]);
|
printf("%2i: %s\n", i, AdapterList[i]);
|
||||||
|
/* set up the selected adapter */
|
||||||
|
lpAdapter = PacketOpenAdapter(AdapterList[i]);
|
||||||
|
if (lpAdapter && (lpAdapter->hFile != INVALID_HANDLE_VALUE)) {
|
||||||
|
ppacket_oid_data = malloc(sizeof(PACKET_OID_DATA) + PACKET_OID_DATA_SIZE);
|
||||||
|
if (ppacket_oid_data) {
|
||||||
|
ppacket_oid_data->Oid = OID_GEN_VENDOR_DESCRIPTION;
|
||||||
|
ppacket_oid_data->Length = PACKET_OID_DATA_SIZE;
|
||||||
|
if (PacketRequest(lpAdapter, FALSE, ppacket_oid_data)) {
|
||||||
|
printf(" Name: \"%s\"\n", ppacket_oid_data->Data);
|
||||||
|
}
|
||||||
|
free(ppacket_oid_data);
|
||||||
|
}
|
||||||
|
PacketCloseAdapter(lpAdapter);
|
||||||
|
lpAdapter = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* invalid adapter index -> check this after printing the adapters */
|
/* invalid adapter index -> check this after printing the adapters */
|
||||||
if (adapter_num < 0) {
|
if (adapter_num < 0) {
|
||||||
@ -176,6 +234,7 @@ init_adapter(int adapter_num, char *mac_addr, input_fn input, void *arg)
|
|||||||
free(pa);
|
free(pa);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
printf("Using adapter_num: %d\n", adapter_num);
|
||||||
/* set up the selected adapter */
|
/* set up the selected adapter */
|
||||||
pa->lpAdapter = PacketOpenAdapter(AdapterList[adapter_num]);
|
pa->lpAdapter = PacketOpenAdapter(AdapterList[adapter_num]);
|
||||||
if (!pa->lpAdapter || (pa->lpAdapter->hFile == INVALID_HANDLE_VALUE)) {
|
if (!pa->lpAdapter || (pa->lpAdapter->hFile == INVALID_HANDLE_VALUE)) {
|
||||||
@ -185,6 +244,7 @@ init_adapter(int adapter_num, char *mac_addr, input_fn input, void *arg)
|
|||||||
/* alloc the OID packet */
|
/* alloc the OID packet */
|
||||||
ppacket_oid_data = malloc(sizeof(PACKET_OID_DATA) + PACKET_OID_DATA_SIZE);
|
ppacket_oid_data = malloc(sizeof(PACKET_OID_DATA) + PACKET_OID_DATA_SIZE);
|
||||||
if (!ppacket_oid_data) {
|
if (!ppacket_oid_data) {
|
||||||
|
PacketCloseAdapter(pa->lpAdapter);
|
||||||
free(pa);
|
free(pa);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -198,6 +258,8 @@ init_adapter(int adapter_num, char *mac_addr, input_fn input, void *arg)
|
|||||||
ppacket_oid_data->Oid = OID_802_3_PERMANENT_ADDRESS;
|
ppacket_oid_data->Oid = OID_802_3_PERMANENT_ADDRESS;
|
||||||
ppacket_oid_data->Length = ETHARP_HWADDR_LEN;
|
ppacket_oid_data->Length = ETHARP_HWADDR_LEN;
|
||||||
if (!PacketRequest(pa->lpAdapter, FALSE, ppacket_oid_data)) {
|
if (!PacketRequest(pa->lpAdapter, FALSE, ppacket_oid_data)) {
|
||||||
|
printf("ERROR getting the adapter's HWADDR, maybe it's not an ethernet adapter?\n");
|
||||||
|
PacketCloseAdapter(pa->lpAdapter);
|
||||||
free(pa);
|
free(pa);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -216,6 +278,8 @@ init_adapter(int adapter_num, char *mac_addr, input_fn input, void *arg)
|
|||||||
PacketSetHwFilter(pa->lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL | NDIS_PACKET_TYPE_PROMISCUOUS);
|
PacketSetHwFilter(pa->lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL | NDIS_PACKET_TYPE_PROMISCUOUS);
|
||||||
/* set up packet descriptor (the application input buffer) */
|
/* set up packet descriptor (the application input buffer) */
|
||||||
if ((pa->lpPacket = PacketAllocatePacket()) == NULL) {
|
if ((pa->lpPacket = PacketAllocatePacket()) == NULL) {
|
||||||
|
printf("ERROR setting up a packet descriptor\n");
|
||||||
|
PacketCloseAdapter(pa->lpAdapter);
|
||||||
free(pa);
|
free(pa);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -234,8 +298,12 @@ shutdown_adapter(void *adapter)
|
|||||||
{
|
{
|
||||||
struct packet_adapter *pa = (struct packet_adapter*)adapter;
|
struct packet_adapter *pa = (struct packet_adapter*)adapter;
|
||||||
if (pa != NULL) {
|
if (pa != NULL) {
|
||||||
|
if (pa->lpPacket) {
|
||||||
PacketFreePacket(pa->lpPacket);
|
PacketFreePacket(pa->lpPacket);
|
||||||
|
}
|
||||||
|
if (pa->lpAdapter) {
|
||||||
PacketCloseAdapter(pa->lpAdapter);
|
PacketCloseAdapter(pa->lpAdapter);
|
||||||
|
}
|
||||||
free(pa);
|
free(pa);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ void shutdown_adapter(void *adapter);
|
|||||||
int packet_send (void *adapter, void *buffer, int len);
|
int packet_send (void *adapter, void *buffer, int len);
|
||||||
void update_adapter (void *adapter);
|
void update_adapter (void *adapter);
|
||||||
enum link_adapter_event link_adapter (void *adapter);
|
enum link_adapter_event link_adapter (void *adapter);
|
||||||
|
int get_adapter_index(const char* adapter_guid);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -118,9 +118,20 @@ low_level_init(struct netif *netif)
|
|||||||
{
|
{
|
||||||
char adapter_mac_addr[ETHARP_HWADDR_LEN];
|
char adapter_mac_addr[ETHARP_HWADDR_LEN];
|
||||||
char my_mac_addr[ETHARP_HWADDR_LEN] = LWIP_MAC_ADDR_BASE;
|
char my_mac_addr[ETHARP_HWADDR_LEN] = LWIP_MAC_ADDR_BASE;
|
||||||
|
int adapter_num = PACKET_LIB_ADAPTER_NR;
|
||||||
|
|
||||||
|
#ifdef PACKET_LIB_ADAPTER_GUID
|
||||||
|
/* get adapter index for guid string */
|
||||||
|
adapter_num = get_adapter_index(PACKET_LIB_ADAPTER_GUID);
|
||||||
|
if (adapter_num < 0) {
|
||||||
|
printf("ERROR finding network adapter with GUID \"%s\"!\n", PACKET_LIB_ADAPTER_GUID);
|
||||||
|
LWIP_ASSERT("ERROR initializing network adapter!\n", 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif /* PACKET_LIB_ADAPTER_GUID */
|
||||||
|
|
||||||
/* Do whatever else is needed to initialize interface. */
|
/* Do whatever else is needed to initialize interface. */
|
||||||
if ((netif->state = init_adapter(PACKET_LIB_ADAPTER_NR, adapter_mac_addr,
|
if ((netif->state = init_adapter(adapter_num, adapter_mac_addr,
|
||||||
ethernetif_process_input, netif)) == NULL) {
|
ethernetif_process_input, netif)) == NULL) {
|
||||||
printf("ERROR initializing network adapter %d!\n", PACKET_LIB_ADAPTER_NR);
|
printf("ERROR initializing network adapter %d!\n", PACKET_LIB_ADAPTER_NR);
|
||||||
LWIP_ASSERT("ERROR initializing network adapter!\n", 0);
|
LWIP_ASSERT("ERROR initializing network adapter!\n", 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user