Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 68c79b33 authored by Tomasz Wasilczyk's avatar Tomasz Wasilczyk Committed by Android (Google) Code Review
Browse files

Merge "Implement fetching hardware address"

parents 35a55a18 91c3a047
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -16,11 +16,16 @@

#pragma once

#include <linux/if_ether.h>

#include <array>
#include <optional>
#include <string>

namespace android::netdevice {

typedef std::array<uint8_t, ETH_ALEN> hwaddr_t;

/**
 * Configures libnetdevice to use PF_CAN sockets instead of AF_INET,
 * what requires less permissive SEPolicy rules for a given process.
@@ -91,4 +96,14 @@ bool add(std::string dev, std::string type);
 */
bool del(std::string dev);

/**
 * Fetches interface's hardware address.
 *
 * \param ifname Interface name
 * \return Hardware address (MAC address) or nullopt if the lookup failed
 */
std::optional<hwaddr_t> getHwAddr(const std::string& ifname);

}  // namespace android::netdevice

bool operator==(const android::netdevice::hwaddr_t lhs, const unsigned char rhs[ETH_ALEN]);
+14 −0
Original line number Diff line number Diff line
@@ -81,4 +81,18 @@ bool del(std::string dev) {
    return sock.send(req) && sock.receiveAck();
}

std::optional<hwaddr_t> getHwAddr(const std::string& ifname) {
    auto ifr = ifreqs::fromName(ifname);
    if (!ifreqs::send(SIOCGIFHWADDR, ifr)) return std::nullopt;

    hwaddr_t hwaddr;
    memcpy(hwaddr.data(), ifr.ifr_hwaddr.sa_data, hwaddr.size());
    return hwaddr;
}

}  // namespace android::netdevice

bool operator==(const android::netdevice::hwaddr_t lhs, const unsigned char rhs[ETH_ALEN]) {
    static_assert(lhs.size() == ETH_ALEN);
    return 0 == memcmp(lhs.data(), rhs, lhs.size());
}