[libvirt] [PATCH v3 4/4] FreeBSD: implement virNetDevTapCreate() and virNetDevTapDelete().

Eric Blake eblake at redhat.com
Tue Feb 5 00:01:56 UTC 2013


On 01/26/2013 08:13 AM, Roman Bogorodskiy wrote:
> ---
>  src/util/virnetdevtap.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 111 insertions(+), 3 deletions(-)
> 
> diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c
> index a884de1..36994fc 100644
> --- a/src/util/virnetdevtap.c
> +++ b/src/util/virnetdevtap.c
> @@ -103,7 +103,7 @@ virNetDevProbeVnetHdr(int tapfd)
>  #endif
>  
>  
> -#ifdef TUNSETIFF
> +#if defined(TUNSETIFF)

Pointless churn.

> @@ -230,7 +230,115 @@ cleanup:
>      VIR_FORCE_CLOSE(fd);
>      return ret;
>  }
> -#else /* ! TUNSETIFF */
> +#elif defined(__FreeBSD__)

Again, what is the REAL feature that we are probing here, instead of
hard-coding things to an OS probe?

> +int virNetDevTapCreate(char **ifname,
> +                       int *tapfd,
> +                       unsigned int flags ATTRIBUTE_UNUSED)
> +{
> +    int s;
> +    struct ifreq ifr;
> +    int ret = -1;
> +    char *newifname = NULL;
> +
> +    /* As FreeBSD determines interface type by name,
> +     * we have to create 'tap' interface first and
> +     * then rename it to 'vnet'
> +     */
> +    if ((s = virNetDevSetupControl("tap", &ifr)) < 0)
> +        return -1;
> +
> +    if (ioctl(s, SIOCIFCREATE2, &ifr) < 0) {

Is the existence of SIOCIFCREATE2 the right feature to be probing for?

> +        virReportSystemError(errno, "%s",
> +                             _("Unable to create tap device"));
> +        goto cleanup;
> +    }
> +
> +    /* In case we were given exact interface name (e.g. 'vnetN'),
> +     * we just rename to it. If we have format string like
> +     * 'vnet%d', we need to find the first available name that
> +     * matches this pattern
> +     */
> +    if (strstr(*ifname, "%d") != NULL) {
> +        int i;
> +        for (i = 0; i <= IF_MAXUNIT; i++) {
> +            virBuffer newname = VIR_BUFFER_INITIALIZER;
> +            virBufferAsprintf(&newname, *ifname, i);
> +
> +            if (virBufferError(&newname)) {
> +                virBufferFreeAndReset(&newname);
> +                virReportOOMError();
> +                goto cleanup;
> +            }

virBuffer is useful for concatenation.  But your use case is one-shot
formatting; in which case I'd use virAsprintf instead of virBufferAsprintf:

char *newname;
if (virAsprintf(&newname, *ifname, i) < 0) {
    virReportOOMError();
    goto cleanup;
}

> +
> +            if (virNetDevExists(virBufferCurrentContent(&newname)) == 0) {
> +                newifname = strdup(virBufferContentAndReset(&newname));
> +                break;
> +            }

at which point, you don't have to strdup(); newname is already the right
allocated string.

> +        }
> +        if (newifname) {
> +            VIR_FREE(*ifname);
> +            *ifname = newifname;
> +        } else {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Failed to generate new name for interface %s"),
> +                           ifr.ifr_name);
> +            goto cleanup;
> +        }
> +    }

> +
> +int virNetDevTapDelete(const char *ifname)

int
virNetDevTapDelete(const char *ifname)

> +
> +#else /* !defined(__FreeBSD__) */

This comment isn't quite right; it is more like:

#else /* !TUNSETIFF && !__FreeBSD__ */

or whatever feature check we actually use.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130204/c6f1d77d/attachment-0001.sig>


More information about the libvir-list mailing list