* [PATCH v4 0/2] libxl: deterministic mac addresses @ 2018-09-12 17:40 Joshua Perrett 2018-09-12 17:40 ` [PATCH v4 1/2] Created tools/shared directory containing MD5 files Joshua Perrett 2018-09-12 17:40 ` [PATCH v4 2/2] libxl: made vm mac address assignment deterministic Joshua Perrett 0 siblings, 2 replies; 5+ messages in thread From: Joshua Perrett @ 2018-09-12 17:40 UTC (permalink / raw) To: xen-devel Cc: Wei Liu, Ian Jackson, Joshua Perrett, Marcus Granado, George Dunlap The patch has now been split into two parts. One adds the MD5 files to a shared directory in tools, so that it can potentially be reused. The second patch makes mac addresses deterministic. It still uses a host mac address, seeing as gethostid() won't work (as George explained). The code should now work the same on both little endian and big endian machines. Joshua Perrett (2): Created tools/shared directory containing MD5 files libxl: made vm mac address assignment deterministic tools/Makefile | 1 + tools/Rules.mk | 1 + tools/libxl/Makefile | 2 +- tools/libxl/libxl_freebsd.c | 5 + tools/libxl/libxl_internal.h | 5 + tools/libxl/libxl_linux.c | 31 ++++- tools/libxl/libxl_netbsd.c | 5 + tools/libxl/libxl_nic.c | 31 ++++- tools/shared/Makefile | 21 ++++ tools/shared/md5.c | 266 +++++++++++++++++++++++++++++++++++++++++++ tools/shared/md5.h | 26 +++++ 11 files changed, 386 insertions(+), 8 deletions(-) create mode 100644 tools/shared/Makefile create mode 100644 tools/shared/md5.c create mode 100644 tools/shared/md5.h -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v4 1/2] Created tools/shared directory containing MD5 files 2018-09-12 17:40 [PATCH v4 0/2] libxl: deterministic mac addresses Joshua Perrett @ 2018-09-12 17:40 ` Joshua Perrett 2018-09-20 16:18 ` Wei Liu 2018-09-12 17:40 ` [PATCH v4 2/2] libxl: made vm mac address assignment deterministic Joshua Perrett 1 sibling, 1 reply; 5+ messages in thread From: Joshua Perrett @ 2018-09-12 17:40 UTC (permalink / raw) To: xen-devel Cc: Wei Liu, Ian Jackson, Joshua Perrett, Marcus Granado, George Dunlap MD5 code is originally from the public domain (written by Colin Plumb in 1993), files taken from xen/tools/blktap2/drivers/. They have been modified slightly (useful functions made public). Signed-off-by: Joshua perrett <jperrett256@gmail.com> --- tools/Makefile | 1 + tools/Rules.mk | 1 + tools/shared/Makefile | 21 ++++ tools/shared/md5.c | 266 ++++++++++++++++++++++++++++++++++++++++++++++++++ tools/shared/md5.h | 26 +++++ 5 files changed, 315 insertions(+) create mode 100644 tools/shared/Makefile create mode 100644 tools/shared/md5.c create mode 100644 tools/shared/md5.h diff --git a/tools/Makefile b/tools/Makefile index 67977ad850..34ec41790d 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -24,6 +24,7 @@ SUBDIRS-$(CONFIG_BLKTAP2) += blktap2 SUBDIRS-$(CONFIG_NetBSD) += xenbackendd SUBDIRS-y += libfsimage SUBDIRS-$(CONFIG_Linux) += libvchan +SUBDIRS-y += shared # do not recurse in to a dir we are about to delete ifneq "$(MAKECMDGOALS)" "distclean" diff --git a/tools/Rules.mk b/tools/Rules.mk index 296b722372..40040c7947 100644 --- a/tools/Rules.mk +++ b/tools/Rules.mk @@ -25,6 +25,7 @@ XEN_XENSTORE = $(XEN_ROOT)/tools/xenstore XEN_LIBXENSTAT = $(XEN_ROOT)/tools/xenstat/libxenstat/src XEN_BLKTAP2 = $(XEN_ROOT)/tools/blktap2 XEN_LIBVCHAN = $(XEN_ROOT)/tools/libvchan +XEN_SHARED = $(XEN_ROOT)/tools/shared CFLAGS_xeninclude = -I$(XEN_INCLUDE) diff --git a/tools/shared/Makefile b/tools/shared/Makefile new file mode 100644 index 0000000000..8aa26863b9 --- /dev/null +++ b/tools/shared/Makefile @@ -0,0 +1,21 @@ +XEN_ROOT=$(CURDIR)/../.. +include $(XEN_ROOT)/tools/Rules.mk + +TARGETS=md5.o + +.PHONY: all +all: build + +.PHONY: build +build: $(TARGETS) + +.PHONY: clean +clean: + $(RM) *.o $(TARGETS) *~ $(DEPS_RM) + +.PHONY: distclean +distclean: clean + +install uninstall: + +-include $(DEPS_INCLUDE) diff --git a/tools/shared/md5.c b/tools/shared/md5.c new file mode 100644 index 0000000000..88ea13938a --- /dev/null +++ b/tools/shared/md5.c @@ -0,0 +1,266 @@ +/* start - public domain MD5 implementation */ +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +#include <string.h> +#include <stdint.h> +#include "md5.h" + +static void MD5Transform(uint32_t buf[4], uint32_t const in[16]); + + +/** + * md5_sum - MD5 hash for a data block + * @addr: Pointers to the data area + * @len: Lengths of the data block + * @mac: Buffer for the hash + */ +void md5_sum(const uint8_t *addr, const size_t len, uint8_t *mac) +{ + MD5_CTX ctx; + + MD5Init(&ctx); + MD5Update(&ctx, addr, len); + MD5Final(mac, &ctx); +} + + +#ifndef WORDS_BIGENDIAN +#define byteReverse(buf, len) /* Nothing */ +#else +/* + * Note: this code is harmless on little-endian machines. + */ +static void byteReverse(unsigned char *buf, unsigned longs) +{ + uint32_t t; + do { + t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(uint32_t *) buf = t; + buf += 4; + } while (--longs); +} +#endif + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +void MD5Init(struct MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) +{ + uint32_t t; + + /* Update bitcount */ + + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if (t) { + unsigned char *p = (unsigned char *) ctx->in + t; + + t = 64 - t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (uint32_t *) ctx->in); + buf += t; + len -= t; + } + /* Process data in 64-byte chunks */ + + while (len >= 64) { + memcpy(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (uint32_t *) ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + memcpy(ctx->in, buf, len); +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +void MD5Final(unsigned char digest[16], struct MD5Context *ctx) +{ + unsigned count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (uint32_t *) ctx->in); + + /* Now fill the next block with 56 bytes */ + memset(ctx->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); + } + byteReverse(ctx->in, 14); + + /* Append length in bits and transform */ + ((uint32_t *) ctx->in)[14] = ctx->bits[0]; + ((uint32_t *) ctx->in)[15] = ctx->bits[1]; + + MD5Transform(ctx->buf, (uint32_t *) ctx->in); + byteReverse((unsigned char *) ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ +} + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void MD5Transform(uint32_t buf[4], uint32_t const in[16]) +{ + register uint32_t a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} diff --git a/tools/shared/md5.h b/tools/shared/md5.h new file mode 100644 index 0000000000..09c27e2968 --- /dev/null +++ b/tools/shared/md5.h @@ -0,0 +1,26 @@ +#ifndef MD5_H +#define MD5_H + +#include <stdint.h> +#include <stddef.h> + +/** + * md5_sum - MD5 hash for a data block + * @addr: Pointers to the data area + * @len: Lengths of the data block + * @mac: Buffer for the hash + */ +void md5_sum(const uint8_t *addr, const size_t len, uint8_t *mac); + + +struct MD5Context { + uint32_t buf[4]; + uint32_t bits[2]; + uint8_t in[64]; +}; +typedef struct MD5Context MD5_CTX; +void MD5Init(struct MD5Context *context); +void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len); +void MD5Final(unsigned char digest[16], struct MD5Context *context); + +#endif -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v4 1/2] Created tools/shared directory containing MD5 files 2018-09-12 17:40 ` [PATCH v4 1/2] Created tools/shared directory containing MD5 files Joshua Perrett @ 2018-09-20 16:18 ` Wei Liu 0 siblings, 0 replies; 5+ messages in thread From: Wei Liu @ 2018-09-20 16:18 UTC (permalink / raw) To: Joshua Perrett Cc: xen-devel, Wei Liu, Ian Jackson, Marcus Granado, George Dunlap On Wed, Sep 12, 2018 at 05:40:36PM +0000, Joshua Perrett wrote: > MD5 code is originally from the public domain (written by Colin Plumb in > 1993), files taken from xen/tools/blktap2/drivers/. They have been > modified slightly (useful functions made public). > > Signed-off-by: Joshua perrett <jperrett256@gmail.com> > --- > tools/Makefile | 1 + > tools/Rules.mk | 1 + > tools/shared/Makefile | 21 ++++ > tools/shared/md5.c | 266 ++++++++++++++++++++++++++++++++++++++++++++++++++ > tools/shared/md5.h | 26 +++++ > 5 files changed, 315 insertions(+) > create mode 100644 tools/shared/Makefile > create mode 100644 tools/shared/md5.c > create mode 100644 tools/shared/md5.h > > diff --git a/tools/Makefile b/tools/Makefile > index 67977ad850..34ec41790d 100644 > --- a/tools/Makefile > +++ b/tools/Makefile > @@ -24,6 +24,7 @@ SUBDIRS-$(CONFIG_BLKTAP2) += blktap2 > SUBDIRS-$(CONFIG_NetBSD) += xenbackendd > SUBDIRS-y += libfsimage > SUBDIRS-$(CONFIG_Linux) += libvchan > +SUBDIRS-y += shared I'm afraid building this in the shared directory is not quite right. You will need to use vpath in libxl/Makefile to add the shared/ directory to libxl. See https://www.gnu.org/software/make/manual/html_node/General-Search.html and libxc/Makefile for example. Wei. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v4 2/2] libxl: made vm mac address assignment deterministic 2018-09-12 17:40 [PATCH v4 0/2] libxl: deterministic mac addresses Joshua Perrett 2018-09-12 17:40 ` [PATCH v4 1/2] Created tools/shared directory containing MD5 files Joshua Perrett @ 2018-09-12 17:40 ` Joshua Perrett 2018-09-20 16:20 ` Wei Liu 1 sibling, 1 reply; 5+ messages in thread From: Joshua Perrett @ 2018-09-12 17:40 UTC (permalink / raw) To: xen-devel Cc: Wei Liu, Ian Jackson, Joshua Perrett, Marcus Granado, George Dunlap Uses MD5 on a host mac address, the vm name and vif index to generate the last three bytes of the vm mac address (for each vm). It uses the vif index to account for multiple vifs. Reported-by: George Dunlap <george.dunlap@citrix.com> Signed-off-by: Joshua Perrett <jperrett256@gmail.com> --- tools/libxl/Makefile | 2 +- tools/libxl/libxl_freebsd.c | 5 +++++ tools/libxl/libxl_internal.h | 5 +++++ tools/libxl/libxl_linux.c | 31 ++++++++++++++++++++++++++++++- tools/libxl/libxl_netbsd.c | 5 +++++ tools/libxl/libxl_nic.c | 31 +++++++++++++++++++++++++------ 6 files changed, 71 insertions(+), 8 deletions(-) diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 6da342ed61..21a67bc2fc 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -142,7 +142,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_9pfs.o libxl_domain.o libxl_vdispl.o \ libxl_pvcalls.o libxl_vsnd.o libxl_vkb.o $(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o -LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o +LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o $(XEN_SHARED)/md5.o LIBXL_TESTS += timedereg LIBXL_TESTS_PROGS = $(LIBXL_TESTS) fdderegrace diff --git a/tools/libxl/libxl_freebsd.c b/tools/libxl/libxl_freebsd.c index 6442ccec72..23d8155c75 100644 --- a/tools/libxl/libxl_freebsd.c +++ b/tools/libxl/libxl_freebsd.c @@ -245,3 +245,8 @@ int libxl__pci_topology_init(libxl__gc *gc, { return ERROR_NI; } + +int libxl__get_host_mac(libxl__gc *gc, unsigned char *buf) +{ + return ERROR_NI; +} diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 802382c704..4a5154600d 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -50,6 +50,9 @@ #include <sys/un.h> #include <sys/file.h> #include <sys/ioctl.h> +#include <ifaddrs.h> +#include <linux/if_packet.h> +#include <net/ethernet.h> #include <xenevtchn.h> #include <xenstore.h> @@ -1413,6 +1416,8 @@ _hidden int libxl__pci_topology_init(libxl__gc *gc, physdev_pci_device_t *devs, int num_devs); +_hidden int libxl__get_host_mac(libxl__gc *gc, unsigned char *buf); + /* from libxl_pci */ _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting); diff --git a/tools/libxl/libxl_linux.c b/tools/libxl/libxl_linux.c index 6ef0abc693..e528f7c085 100644 --- a/tools/libxl/libxl_linux.c +++ b/tools/libxl/libxl_linux.c @@ -16,7 +16,7 @@ #include "libxl_osdeps.h" /* must come before any other headers */ #include "libxl_internal.h" - + int libxl__try_phy_backend(mode_t st_mode) { if (S_ISBLK(st_mode) || S_ISREG(st_mode)) { @@ -307,6 +307,35 @@ int libxl__pci_topology_init(libxl__gc *gc, return err; } +int libxl__get_host_mac(libxl__gc *gc, unsigned char *buf) +{ + int rc = ERROR_FAIL; + + struct ifaddrs *iface_list; + uint8_t largest[6] = {0}; + + if (getifaddrs(&iface_list) == 0) { + for (struct ifaddrs *iface = iface_list; + iface != NULL; iface = iface->ifa_next) { + if (iface->ifa_addr && iface->ifa_addr->sa_family == AF_PACKET) { + struct sockaddr_ll *s = (struct sockaddr_ll *)iface->ifa_addr; + if (s->sll_halen == 6) { + if (memcmp(s->sll_addr, largest, s->sll_halen) > 0) { + memcpy(buf, s->sll_addr, s->sll_halen); + memcpy(largest, s->sll_addr, s->sll_halen); + rc = 0; + } + } + } + } + freeifaddrs(iface_list); + } else { + LOGE(WARN, "getifaddrs failed"); + } + + return rc; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_netbsd.c b/tools/libxl/libxl_netbsd.c index 2edfb00641..7b001ec2b7 100644 --- a/tools/libxl/libxl_netbsd.c +++ b/tools/libxl/libxl_netbsd.c @@ -124,3 +124,8 @@ int libxl__pci_topology_init(libxl__gc *gc, { return ERROR_NI; } + +int libxl__get_host_mac(libxl__gc *gc, unsigned char *buf) +{ + return ERROR_NI; +} diff --git a/tools/libxl/libxl_nic.c b/tools/libxl/libxl_nic.c index 01b711b84e..1010627f5d 100644 --- a/tools/libxl/libxl_nic.c +++ b/tools/libxl/libxl_nic.c @@ -17,6 +17,12 @@ #include "libxl_internal.h" +#include <string.h> + +#include <arpa/inet.h> + +#include "../shared/md5.h" + int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid, const char *mac, libxl_device_nic *nic) { @@ -54,7 +60,8 @@ int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid, } static int libxl__device_nic_setdefault(libxl__gc *gc, uint32_t domid, - libxl_device_nic *nic, bool hotplug) + libxl_device_nic *nic, const char *name, + const int nic_index, bool hotplug) { int rc; @@ -65,11 +72,23 @@ static int libxl__device_nic_setdefault(libxl__gc *gc, uint32_t domid, if (!nic->model) return ERROR_NOMEM; } if (libxl__mac_is_default(&nic->mac)) { - const uint8_t *r; - libxl_uuid uuid; + uint8_t r[16]; + + MD5_CTX ctx; + MD5Init(&ctx); + + uint8_t hostmac[6]; + + if (libxl__get_host_mac(gc, hostmac) == 0) { + MD5Update(&ctx, hostmac, sizeof(hostmac)); + } else { + LOGD(INFO, domid, "failed to get host mac address, will generate vm mac address without"); + } - libxl_uuid_generate(&uuid); - r = libxl_uuid_bytearray(&uuid); + MD5Update(&ctx, (uint8_t *) name, strlen(name)); + uint32_t index = htonl(nic_index); + MD5Update(&ctx, (uint8_t *) &index, sizeof(nic_index)); + MD5Final(r, &ctx); nic->mac[0] = 0x00; nic->mac[1] = 0x16; @@ -478,7 +497,7 @@ int libxl__device_nic_set_devids(libxl__gc *gc, libxl_domain_config *d_config, * but qemu needs the nic information to be complete. */ ret = libxl__device_nic_setdefault(gc, domid, &d_config->nics[i], - false); + d_config->c_info.name, i, false); if (ret) { LOGD(ERROR, domid, "Unable to set nic defaults for nic %d", i); goto out; -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v4 2/2] libxl: made vm mac address assignment deterministic 2018-09-12 17:40 ` [PATCH v4 2/2] libxl: made vm mac address assignment deterministic Joshua Perrett @ 2018-09-20 16:20 ` Wei Liu 0 siblings, 0 replies; 5+ messages in thread From: Wei Liu @ 2018-09-20 16:20 UTC (permalink / raw) To: Joshua Perrett Cc: xen-devel, Ian Jackson, Wei Liu, Marcus Granado, George Dunlap On Wed, Sep 12, 2018 at 05:40:37PM +0000, Joshua Perrett wrote: [...] > +int libxl__get_host_mac(libxl__gc *gc, unsigned char *buf) > +{ > + int rc = ERROR_FAIL; > + > + struct ifaddrs *iface_list; > + uint8_t largest[6] = {0}; > + > + if (getifaddrs(&iface_list) == 0) { > + for (struct ifaddrs *iface = iface_list; > + iface != NULL; iface = iface->ifa_next) { > + if (iface->ifa_addr && iface->ifa_addr->sa_family == AF_PACKET) { > + struct sockaddr_ll *s = (struct sockaddr_ll *)iface->ifa_addr; > + if (s->sll_halen == 6) { > + if (memcmp(s->sll_addr, largest, s->sll_halen) > 0) { > + memcpy(buf, s->sll_addr, s->sll_halen); > + memcpy(largest, s->sll_addr, s->sll_halen); > + rc = 0; Sorry I didn't participate in the conversation IRL. What is the resolution here? Wei. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2018-09-20 16:30 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-09-12 17:40 [PATCH v4 0/2] libxl: deterministic mac addresses Joshua Perrett 2018-09-12 17:40 ` [PATCH v4 1/2] Created tools/shared directory containing MD5 files Joshua Perrett 2018-09-20 16:18 ` Wei Liu 2018-09-12 17:40 ` [PATCH v4 2/2] libxl: made vm mac address assignment deterministic Joshua Perrett 2018-09-20 16:20 ` Wei Liu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).