1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2021 Dmitry Kozlyuk
9 #include "pcap_osdep.h"
12 * Given a device name like "\Device\NPF_{GUID}" extract the "{GUID}" part.
13 * Return NULL if "{GUID}" part is not found.
16 iface_guid(const char *name)
18 static const size_t GUID_LENGTH = 32 + 4; /* 16 hex bytes + 4 dashes */
22 ob = strchr(name, '{');
27 if (cb == NULL || cb - ob != GUID_LENGTH + 1) /* + 1 opening '{' */
34 * libpcap takes device names like "\Device\NPF_{GUID}",
35 * GetAdapterIndex() takes interface names like "\DEVICE\TCPIP_{GUID}".
36 * Try to convert, fall back to original device name.
39 osdep_iface_index_get(const char *device_name)
41 WCHAR adapter_name[MAX_ADAPTER_NAME_LENGTH];
46 guid = iface_guid(device_name);
48 StringCbPrintfW(adapter_name, sizeof(adapter_name),
49 L"\\DEVICE\\TCPIP_%S", guid);
51 StringCbPrintfW(adapter_name, sizeof(adapter_name),
54 ret = GetAdapterIndex(adapter_name, &index);
55 if (ret != NO_ERROR) {
56 PMD_LOG(ERR, "GetAdapterIndex(%S) = %lu\n", adapter_name, ret);
64 * libpcap takes device names like "\Device\NPF_{GUID}",
65 * GetAdaptersAddresses() returns names in "{GUID}" form.
66 * Try to extract GUID from device name, fall back to original device name.
69 osdep_iface_mac_get(const char *device_name, struct rte_ether_addr *mac)
71 IP_ADAPTER_ADDRESSES *info = NULL, *cur = NULL;
73 const char *adapter_name;
76 sys_ret = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &size);
77 if (sys_ret != ERROR_BUFFER_OVERFLOW) {
78 PMD_LOG(ERR, "GetAdapterAddresses() = %lu, expected %lu\n",
79 sys_ret, ERROR_BUFFER_OVERFLOW);
83 info = (IP_ADAPTER_ADDRESSES *)malloc(size);
85 PMD_LOG(ERR, "Cannot allocate adapter address info\n");
89 sys_ret = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, info, &size);
90 if (sys_ret != ERROR_SUCCESS) {
91 PMD_LOG(ERR, "GetAdapterAddresses() = %lu\n", sys_ret);
96 adapter_name = iface_guid(device_name);
97 if (adapter_name == NULL)
98 adapter_name = device_name;
100 for (cur = info; cur != NULL; cur = cur->Next) {
101 if (strcmp(cur->AdapterName, adapter_name) == 0) {
102 if (cur->PhysicalAddressLength != RTE_ETHER_ADDR_LEN) {
103 PMD_LOG(ERR, "Physical address length: want %u, got %lu",
105 cur->PhysicalAddressLength);
109 memcpy(mac->addr_bytes, cur->PhysicalAddress,