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

Commit 72782150 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "libnetdevice: Add prefixlen option to setAddr4" into main

parents f066f5d4 e07129d9
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -128,7 +128,8 @@ std::set<std::string> getAllAddr4(std::string_view ifname);
 * \param addr IPv4 address to set
 * \return true in case of success, false otherwise
 */
bool setAddr4(std::string_view ifname, std::string_view addr);
bool setAddr4(std::string_view ifname, std::string_view addr,
              std::optional<uint8_t> prefixlen = std::nullopt);

/**
 * Add new IPv4 address to a given interface.
+21 −4
Original line number Diff line number Diff line
@@ -93,14 +93,31 @@ static in_addr_t inetAddr(std::string_view addr) {
    return addrn;
}

bool setAddr4(std::string_view ifname, std::string_view addr) {
    auto ifr = ifreqs::fromName(ifname);
static in_addr_t prefixLengthToIpv4Netmask(uint8_t prefixlen) {
    in_addr_t zero = 0;
    return htonl(~zero << (32 - prefixlen));
}

    struct sockaddr_in* ifrAddr = reinterpret_cast<sockaddr_in*>(&ifr.ifr_addr);
bool setAddr4(std::string_view ifname, std::string_view addr, std::optional<uint8_t> prefixlen) {
    auto ifr = ifreqs::fromName(ifname);
    auto ifrAddr = reinterpret_cast<sockaddr_in*>(&ifr.ifr_addr);
    ifrAddr->sin_family = AF_INET;
    ifrAddr->sin_addr.s_addr = inetAddr(addr);
    if (!ifreqs::send(SIOCSIFADDR, ifr)) return false;

    if (prefixlen.has_value()) {
        if (*prefixlen < 0 || *prefixlen > 32) {
            LOG(ERROR) << "Invalid prefix length: " << *prefixlen;
            return false;
        }
        ifr = ifreqs::fromName(ifname);
        auto ifrNetmask = reinterpret_cast<sockaddr_in*>(&ifr.ifr_netmask);
        ifrNetmask->sin_family = AF_INET;
        ifrNetmask->sin_addr.s_addr = prefixLengthToIpv4Netmask(*prefixlen);
        if (!ifreqs::send(SIOCSIFNETMASK, ifr)) return false;
    }

    return ifreqs::send(SIOCSIFADDR, ifr);
    return true;
}

bool addAddr4(std::string_view ifname, std::string_view addr, uint8_t prefixlen) {