From b5db00e52ee2e20578839e4e4488f7b9af9abc38 Mon Sep 17 00:00:00 2001 From: Umut Tezduyar Lindskog Date: Fri, 21 Mar 2014 19:23:35 +0100 Subject: sd-ipv4ll/networkd: generate predictable addresses Increase the chance of using the same link local address between reboots. The pseudo random sequence of addresses we attempt is now seeded with data that is very likely to stay the same between reboots, but at the same time be unique to the specific machine/nic. First we try to use the ID_NET_NAME_* data from the udev db combined with the machin-id, which is guaranteed to be unique and persistent, if available. If that is not possible (e.g., in containers where we don't have access to the udev db) we fallback to using the MAC address of the interface, which is guaranteed to be unique, and likely to be persistent. [tomegun: three minor changes: - don't expose HASH_KEY in the siphash24 header - get rid of some compile-warnings (and some casts at the same time), by using uint8_t[8] rather than uint64_t in the api - added commit message] --- src/network/networkd-link.c | 12 ++++++++++++ src/network/networkd.h | 1 + 2 files changed, 13 insertions(+) (limited to 'src/network') diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 14cc8715ce..4044f0b5a5 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -63,6 +63,8 @@ int link_new(Manager *manager, struct udev_device *device, Link **ret) { if (r < 0) return r; + link->udev_device = udev_device_ref(device); + *ret = link; link = NULL; @@ -85,6 +87,8 @@ void link_free(Link *link) { free(link->ifname); free(link->state_file); + udev_device_unref(link->udev_device); + free(link); } @@ -1283,10 +1287,18 @@ int link_add(Manager *m, struct udev_device *device, Link **ret) { return r; if (link->network->ipv4ll) { + uint8_t seed[8]; r = sd_ipv4ll_new(&link->ipv4ll); if (r < 0) return r; + r = net_get_unique_predictable_data(link->udev_device, seed); + if (r >= 0) { + r = sd_ipv4ll_set_address_seed(link->ipv4ll, seed); + if (r < 0) + return r; + } + r = sd_ipv4ll_attach_event(link->ipv4ll, NULL, 0); if (r < 0) return r; diff --git a/src/network/networkd.h b/src/network/networkd.h index 311350c1e2..239ef1cd38 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -198,6 +198,7 @@ struct Link { char *ifname; char *state_file; struct ether_addr mac; + struct udev_device *udev_device; unsigned flags; -- cgit v1.2.3-54-g00ecf