Skip to content

Commit

Permalink
[Linux] Prioritize interface matching for WiFi MAC address
Browse files Browse the repository at this point in the history
Prefer interface matching the WiFi interface name when
obtaining WiFi MAC address. Fallback to use first
non-loopback interface if no match is found.
  • Loading branch information
zqiu-nest committed Nov 29, 2022
1 parent b54b49c commit a0ae917
Showing 1 changed file with 23 additions and 8 deletions.
31 changes: 23 additions & 8 deletions src/platform/Linux/ConfigurationManagerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,31 +129,46 @@ CHIP_ERROR ConfigurationManagerImpl::Init()
CHIP_ERROR ConfigurationManagerImpl::GetPrimaryWiFiMACAddress(uint8_t * buf)
{
struct ifaddrs * addresses = nullptr;
struct sockaddr_ll * mac = nullptr;
CHIP_ERROR error = CHIP_NO_ERROR;
bool found = false;

// TODO: ideally the buffer size should have been passed as a span, however
// for now use the size that is validated in GenericConfigurationManagerImpl.ipp
constexpr size_t kExpectedBufMinSize = ConfigurationManager::kPrimaryMACAddressLength;
memset(buf, 0, kExpectedBufMinSize);

// Prioritize address for interface matching the WiFi interface name
// specified in the config headers. Otherwise, use the address for the
// first non-loopback interface.
VerifyOrExit(getifaddrs(&addresses) == 0, error = CHIP_ERROR_INTERNAL);
for (auto addr = addresses; addr != nullptr; addr = addr->ifa_next)
{
if ((addr->ifa_addr) && (addr->ifa_addr->sa_family == AF_PACKET) && strncmp(addr->ifa_name, "lo", IFNAMSIZ) != 0)
if ((addr->ifa_addr) && (addr->ifa_addr->sa_family == AF_PACKET))
{
struct sockaddr_ll * mac = (struct sockaddr_ll *) addr->ifa_addr;
memcpy(buf, mac->sll_addr, std::min<size_t>(mac->sll_halen, kExpectedBufMinSize));
found = true;
break;
if (strncmp(addr->ifa_name, CHIP_DEVICE_CONFIG_WIFI_STATION_IF_NAME, IFNAMSIZ) == 0)
{
mac = (struct sockaddr_ll *) addr->ifa_addr;
break;
}

if (strncmp(addr->ifa_name, "lo", IFNAMSIZ) != 0 && !mac)
{
mac = (struct sockaddr_ll *) addr->ifa_addr;
}
}
}
freeifaddrs(addresses);
if (!found)

if (mac)
{
memcpy(buf, mac->sll_addr, std::min<size_t>(mac->sll_halen, kExpectedBufMinSize));
}
else
{
error = CHIP_ERROR_NO_ENDPOINT;
}

freeifaddrs(addresses);

exit:
return error;
}
Expand Down

0 comments on commit a0ae917

Please sign in to comment.