mirror of
https://github.com/ep00ch/lwip-contrib-mac.git
synced 2024-07-02 16:29:31 +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 */
|
||||
|
||||
#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_GW(addr) IP4_ADDR((addr), 192,168,1,1)
|
||||
|
|
|
@ -94,6 +94,78 @@ struct packet_adapter {
|
|||
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
|
||||
*
|
||||
|
@ -109,9 +181,7 @@ init_adapter(int adapter_num, char *mac_addr, input_fn input, void *arg)
|
|||
void *AdapterList[MAX_NUM_ADAPTERS];
|
||||
int i;
|
||||
char AdapterName[ADAPTER_NAME_LEN]; /* string that contains a list of the network adapters */
|
||||
char *temp, *start;
|
||||
int AdapterNum =0;
|
||||
ULONG AdapterLength;
|
||||
int AdapterNum;
|
||||
PPACKET_OID_DATA ppacket_oid_data;
|
||||
unsigned char ethaddr[ETHARP_HWADDR_LEN];
|
||||
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_fn_arg = arg;
|
||||
|
||||
memset(AdapterList, 0, sizeof(AdapterList));
|
||||
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++;
|
||||
}
|
||||
AdapterNum = get_adapter_list(AdapterList, MAX_NUM_ADAPTERS, AdapterName, ADAPTER_NAME_LEN);
|
||||
|
||||
/* print all adapter names */
|
||||
AdapterNum = i;
|
||||
if (AdapterNum <= 0) {
|
||||
free(pa);
|
||||
return NULL; /* no adapters found */
|
||||
}
|
||||
for (i = 0; i < AdapterNum; i++) {
|
||||
LPADAPTER lpAdapter;
|
||||
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 */
|
||||
if (adapter_num < 0) {
|
||||
|
@ -176,6 +234,7 @@ init_adapter(int adapter_num, char *mac_addr, input_fn input, void *arg)
|
|||
free(pa);
|
||||
return NULL;
|
||||
}
|
||||
printf("Using adapter_num: %d\n", adapter_num);
|
||||
/* set up the selected adapter */
|
||||
pa->lpAdapter = PacketOpenAdapter(AdapterList[adapter_num]);
|
||||
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 */
|
||||
ppacket_oid_data = malloc(sizeof(PACKET_OID_DATA) + PACKET_OID_DATA_SIZE);
|
||||
if (!ppacket_oid_data) {
|
||||
PacketCloseAdapter(pa->lpAdapter);
|
||||
free(pa);
|
||||
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->Length = ETHARP_HWADDR_LEN;
|
||||
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);
|
||||
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);
|
||||
/* set up packet descriptor (the application input buffer) */
|
||||
if ((pa->lpPacket = PacketAllocatePacket()) == NULL) {
|
||||
printf("ERROR setting up a packet descriptor\n");
|
||||
PacketCloseAdapter(pa->lpAdapter);
|
||||
free(pa);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -234,8 +298,12 @@ shutdown_adapter(void *adapter)
|
|||
{
|
||||
struct packet_adapter *pa = (struct packet_adapter*)adapter;
|
||||
if (pa != NULL) {
|
||||
PacketFreePacket(pa->lpPacket);
|
||||
PacketCloseAdapter(pa->lpAdapter);
|
||||
if (pa->lpPacket) {
|
||||
PacketFreePacket(pa->lpPacket);
|
||||
}
|
||||
if (pa->lpAdapter) {
|
||||
PacketCloseAdapter(pa->lpAdapter);
|
||||
}
|
||||
free(pa);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ void shutdown_adapter(void *adapter);
|
|||
int packet_send (void *adapter, void *buffer, int len);
|
||||
void update_adapter (void *adapter);
|
||||
enum link_adapter_event link_adapter (void *adapter);
|
||||
int get_adapter_index(const char* adapter_guid);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -118,9 +118,20 @@ low_level_init(struct netif *netif)
|
|||
{
|
||||
char adapter_mac_addr[ETHARP_HWADDR_LEN];
|
||||
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. */
|
||||
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) {
|
||||
printf("ERROR initializing network adapter %d!\n", PACKET_LIB_ADAPTER_NR);
|
||||
LWIP_ASSERT("ERROR initializing network adapter!\n", 0);
|
||||
|
|
Loading…
Reference in New Issue
Block a user