[libvirt] [PATCH 3/4] FreeBSD: implement virNetDevSetMAC().

John Ferlan jferlan at redhat.com
Mon Jan 7 15:34:16 UTC 2013


On 01/04/2013 10:00 AM, Roman Bogorodskiy wrote:
> ---
>  src/util/virnetdev.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 50 insertions(+)
> 
> diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
> index c7eeb50..6e4f7ad 100644
> --- a/src/util/virnetdev.c
> +++ b/src/util/virnetdev.c
> @@ -42,6 +42,11 @@
>  # undef HAVE_STRUCT_IFREQ
>  #endif
>  
> +#if defined(__FreeBSD__)
> +# include <sys/sockio.h>
> +# include <net/if_dl.h>
> +#endif
> +
>  #define VIR_FROM_THIS VIR_FROM_NONE
>  
>  #if defined(HAVE_STRUCT_IFREQ)
> @@ -200,6 +205,51 @@ cleanup:
>      VIR_FORCE_CLOSE(fd);
>      return ret;
>  }
> +#elif defined(__FreeBSD__)
> +int virNetDevSetMAC(const char *ifname,
> +                    const virMacAddrPtr macaddr)
> +{
> +        struct ifreq ifr;
> +        struct sockaddr_dl sdl;
> +        uint8_t mac[19];

19 was odd to me... I found VIR_MAC_STRING_BUFLEN (which is essentially
18) using cscope.  Figured it would be better to go that route - it does
make it easier to find code later on that's adjust the MAC

> +        char *macstr;
> +        int s;
> +        int ret = -1;
> +
> +        if ((s = virNetDevSetupControl(ifname, &ifr)) < 0)
> +            return -1;
> +
> +        if (VIR_ALLOC_N(macstr, VIR_MAC_STRING_BUFLEN) < 0) {
> +            virReportOOMError();
> +            ret = - 1;

Redundant with the initialization

> +            goto cleanup;
> +        }
> +        virMacAddrFormat(&macaddr, macstr);
> +
> +        virStrncpy(ifr.ifr_name, ifname, IFNAMSIZ, sizeof(ifr.ifr_name));

Ignoring the status of the virStrncpy()

> +        memset(mac, 0, sizeof(mac));
> +        mac[0] = ':';
> +        virStrncpy(mac + 1, macstr, strlen(macstr), sizeof(mac));

Ignoring the status of the virStrncpy()

> +        sdl.sdl_len = sizeof(sdl);
> +        link_addr(mac, &sdl);
> +
> +        bcopy(sdl.sdl_data, ifr.ifr_addr.sa_data, 6);
> +        ifr.ifr_addr.sa_len = 6;
> +
> +        if (ioctl(s, SIOCSIFLLADDR, &ifr) < 0) {
> +            virReportSystemError(errno,
> +                                 _("Cannot set interface MAC on '%s'"),
> +                                ifname);
> +            goto cleanup;
> +        }
> +
> +        ret = 0;
> +cleanup:
> +        VIR_FREE(macstr);
> +        VIR_FORCE_CLOSE(s);
> +
> +        return ret;
> +}
>  #else
>  int virNetDevSetMAC(const char *ifname,
>                      const virMacAddrPtr macaddr ATTRIBUTE_UNUSED)
> 




More information about the libvir-list mailing list