From: Michael Tremer Date: Sat, 11 Feb 2023 12:01:42 +0000 (+0000) Subject: networkd: Generate a random Ethernet address for ports X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9a93da54510ec2b49e0890d2b420a097316eaace;p=network.git networkd: Generate a random Ethernet address for ports This happens when either no address was set, or it cannot be parsed. Signed-off-by: Michael Tremer --- diff --git a/src/networkd/address.h b/src/networkd/address.h index 1d9fbfc9..f875b261 100644 --- a/src/networkd/address.h +++ b/src/networkd/address.h @@ -23,6 +23,9 @@ #include #include +#include + +#include "logging.h" typedef struct ether_addr nw_address_t; @@ -44,4 +47,26 @@ static inline char* nw_address_to_string(const nw_address_t* addr) { return strdup(buffer); } +static inline int nw_address_generate(nw_address_t* addr) { + ssize_t bytes = getrandom(addr, sizeof(*addr), 0); + if (bytes < 0) { + ERROR("getrandom() failed: %m\n"); + return 1; + } + + // Check if we filled the entire buffer + if (bytes < (ssize_t)sizeof(*addr)) { + ERROR("Could not gather enough randomness\n"); + return 1; + } + + // Clear the multicast bit + addr->ether_addr_octet[0] &= 0xfe; + + // Set the software-generated bit + addr->ether_addr_octet[1] |= 0x02; + + return 0; +} + #endif /* NETWORKD_ADDRESS_H */ diff --git a/src/networkd/port.c b/src/networkd/port.c index aff79a53..4c325924 100644 --- a/src/networkd/port.c +++ b/src/networkd/port.c @@ -75,18 +75,28 @@ static int nw_port_setup_address(struct nw_port* port) { const char* s = nw_config_get(port->config, "ADDRESS"); if (!s) { ERROR("Port %s: Address isn't set\n", port->name); - return 1; + goto ERROR; } // Parse the address r = nw_address_from_string(&port->address, s); if (r) { ERROR("Port %s: Could not parse address: %m\n", port->name); - return r; + goto ERROR; } // XXX Do we need to check for multicast here? + return 0; + +ERROR: + // Generate a random Ethernet address + r = nw_address_generate(&port->address); + if (r) { + ERROR("Could not generate a random Ethernet address: %m\n"); + return r; + } + return 0; }