|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxl: made vm mac address assignment deterministic
On Thu, Aug 30, 2018 at 03:18:04PM +0000, Joshua Perrett wrote:
> Uses MD5 on the host mac address, 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.
>
> MD5 code is originally from the public domain (written by Colin Plumb in
> 1993), files found in xen/tools/blktap2/drivers/.
>
> Reported-by: George Dunlap <george.dunlap@xxxxxxxxxx>
> Signed-off-by: Joshua Perrett <jperrett256@xxxxxxxxx>
> ---
> tools/libxl/Makefile | 2 +-
> tools/libxl/libxl_nic.c | 65 ++++++++++--
> tools/libxl/md5.c | 266
> ++++++++++++++++++++++++++++++++++++++++++++++++
> tools/libxl/md5.h | 26 +++++
> 4 files changed, 352 insertions(+), 7 deletions(-)
> create mode 100644 tools/libxl/md5.c
> create mode 100644 tools/libxl/md5.h
>
> diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
> index 6da342ed61..6e7db11367 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 md5.o
>
> LIBXL_TESTS += timedereg
> LIBXL_TESTS_PROGS = $(LIBXL_TESTS) fdderegrace
> diff --git a/tools/libxl/libxl_nic.c b/tools/libxl/libxl_nic.c
> index 01b711b84e..9a1c0fb16f 100644
> --- a/tools/libxl/libxl_nic.c
> +++ b/tools/libxl/libxl_nic.c
> @@ -17,6 +17,18 @@
>
> #include "libxl_internal.h"
>
> +#include <string.h>
> +
> +#include "md5.h"
> +
> +#ifdef __linux__
> +#include <sys/types.h>
> +#include <ifaddrs.h>
> +#include <sys/socket.h>
> +#include <linux/if_packet.h>
> +#include <net/ethernet.h>
> +#endif
> +
> int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid,
> const char *mac, libxl_device_nic *nic)
> {
> @@ -53,8 +65,38 @@ int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid,
> return rc;
> }
>
> +static int libxl__get_host_mac(libxl__gc *gc, unsigned char *buf)
> +{
> + int rc = -1;
rc should be initialised to ERROR_FAIL;
> + #ifdef __linux__
> + struct ifaddrs *iface_list;
> +
> + if (getifaddrs(&iface_list) == 0) {
You haven't answered my question regarding stability of this list.
> + 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) {
> + memcpy(buf, s->sll_addr, 6);
> + if(buf[0] || buf[1] || buf[2] || buf[3] || buf[4] ||
> buf[5]) {
Missing space after if.
Also please wrap the line around 80 characters.
> + rc = 0;
> + break;
> + }
> + }
> + }
> + }
> + freeifaddrs(iface_list);
> + } else {
> + LOG(ERROR, "getifaddrs\n");
If this is not a fatal error you should use WARN here.
> + }
> + #endif
> +
> + return rc;
> +}
> +
> 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 +107,22 @@ 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] = {0};
> +
> + if(libxl__get_host_mac(gc, hostmac) == 0) {
> + MD5Update(&ctx, hostmac, sizeof(hostmac));
> + } else {
> + LOGD(WARN, domid, "failed to get host mac address, will generate
> vm mac address without\n");
Turn WARN into INFO.
Wei.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |