|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxl: made vm mac address assignment deterministic
On Wed, Sep 05, 2018 at 12:25:55PM +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>
[...]
> int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid,
> const char *mac, libxl_device_nic *nic)
> {
> @@ -53,8 +65,41 @@ 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 = ERROR_FAIL;
Having a blank line makes things a bit clearer.
> + #ifdef __linux__
> + struct ifaddrs *iface_list;
> + uint64_t largest = 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;
Blank line here.
Generally please add a blank line between variable declarations and
statements.
> + if (s->sll_halen == 6) {
> + uint64_t value = 0;
Blank line here.
> + memcpy(&value, s->sll_addr, 6);
Please use sizeof(s->sll_addr) instead of 6.
Also please add an assert before the memcpy
assert(sizeof(value) >= sizeof(s->sll-addr));
This will help catch potential buffer overflow issue. Not that there is
one in your code, it is just good habit to have.
> + if (value > largest) {
> + memcpy(buf, s->sll_addr, 6);
> + largest = value;
> + rc = 0;
Interesting algorithm, but I don't know anything better at the moment.
:)
> + }
> + }
> + }
> + }
> + freeifaddrs(iface_list);
> + } else {
> + LOG(WARN, "getifaddrs\n");
Use LOGE here to log errno too. And please say
getifaddrs failed
And there is no need to have '\n' at the end of the line. LOG* macros
add that themselves.
> + }
> + #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 +110,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];
> +
> + if(libxl__get_host_mac(gc, hostmac) == 0) {
Missing a space after `if' here.
> + MD5Update(&ctx, hostmac, sizeof(hostmac));
> + } else {
> + LOGD(INFO, domid, "failed to get host mac address, will generate
> vm mac address without\n");
Remove '\n'.
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 |