diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-12-10 00:26:16 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-12-10 00:26:16 +0100 |
commit | a90e23051b5b29deca4726a397574a34621038aa (patch) | |
tree | 1f324e48d17e03d1324cabc7d9a1d7af100972e2 | |
parent | f8b5a3b75fb55f0acb85c21424b3893c822742e9 (diff) |
nspawn: create the macvlan MAC addresses in an arch independent stable way
-rw-r--r-- | src/nspawn/nspawn.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 3e3ec49052..932696aa9e 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -1591,17 +1591,17 @@ static int reset_audit_loginuid(void) { #define CONTAINER_HASH_KEY SD_ID128_MAKE(c3,c4,f9,19,b5,57,b2,1c,e6,cf,14,27,03,9c,ee,a2) #define MACVLAN_HASH_KEY SD_ID128_MAKE(00,13,6d,bc,66,83,44,81,bb,0c,f9,51,1f,24,a6,6f) -static int generate_mac(struct ether_addr *mac, sd_id128_t hash_key, unsigned idx) { - int r; - +static int generate_mac(struct ether_addr *mac, sd_id128_t hash_key, uint64_t idx) { uint8_t result[8]; size_t l, sz; - uint8_t *v; + uint8_t *v, *i; + int r; l = strlen(arg_machine); sz = sizeof(sd_id128_t) + l; if (idx > 0) sz += sizeof(idx); + v = alloca(sz); /* fetch some persistent data unique to the host */ @@ -1611,7 +1611,11 @@ static int generate_mac(struct ether_addr *mac, sd_id128_t hash_key, unsigned id /* combine with some data unique (on this host) to this * container instance */ - memcpy(mempcpy(v + sizeof(sd_id128_t), arg_machine, l), &idx, sizeof(idx)); + i = mempcpy(v + sizeof(sd_id128_t), arg_machine, l); + if (idx > 0) { + idx = htole64(idx); + memcpy(i, &idx, sizeof(idx)); + } /* Let's hash the host machine ID plus the container name. We * use a fixed, but originally randomly created hash key here. */ |