diff options
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/net-util.c | 39 | ||||
-rw-r--r-- | src/shared/net-util.h | 2 |
2 files changed, 41 insertions, 0 deletions
diff --git a/src/shared/net-util.c b/src/shared/net-util.c index 50cfa2c3f3..1c223117b8 100644 --- a/src/shared/net-util.c +++ b/src/shared/net-util.c @@ -24,6 +24,9 @@ #include <arpa/inet.h> #include <fnmatch.h> +#include "strv.h" +#include "siphash24.h" +#include "libudev-private.h" #include "net-util.h" #include "log.h" #include "utf8.h" @@ -31,6 +34,42 @@ #include "conf-parser.h" #include "condition.h" +#define HASH_KEY SD_ID128_MAKE(d3,1e,48,fa,90,fe,4b,4c,9d,af,d5,d7,a1,b1,2e,8a) + +int net_get_unique_predictable_data(struct udev_device *device, uint8_t result[8]) { + size_t l, sz = 0; + const char *name, *field = NULL; + int r; + uint8_t *v; + + /* fetch some persistent data unique (on this machine) to this device */ + FOREACH_STRING(field, "ID_NET_NAME_ONBOARD", "ID_NET_NAME_SLOT", "ID_NET_NAME_PATH", "ID_NET_NAME_MAC") { + name = udev_device_get_property_value(device, field); + if (name) + break; + } + + if (!name) + return -ENOENT; + + l = strlen(name); + sz = sizeof(sd_id128_t) + l; + v = alloca(sz); + + /* fetch some persistent data unique to this machine */ + r = sd_id128_get_machine((sd_id128_t*) v); + if (r < 0) + return r; + memcpy(v + sizeof(sd_id128_t), name, l); + + /* Let's hash the machine ID plus the device name. We + * use a fixed, but originally randomly created hash + * key here. */ + siphash24(result, v, sz, HASH_KEY.bytes); + + return 0; +} + bool net_match_config(const struct ether_addr *match_mac, const char *match_path, const char *match_driver, diff --git a/src/shared/net-util.h b/src/shared/net-util.h index 99479e1f5c..4a8d3f9fdf 100644 --- a/src/shared/net-util.h +++ b/src/shared/net-util.h @@ -62,3 +62,5 @@ int config_parse_ifalias(const char *unit, const char *filename, unsigned line, int ltype, const char *rvalue, void *data, void *userdata); int net_parse_inaddr(const char *address, unsigned char *family, void *dst); + +int net_get_unique_predictable_data(struct udev_device *device, uint8_t result[8]); |