mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-08 05:55:19 +00:00
a2ae3d299c
When starting a guest with <interface/> which has the target device name set (i.e. not generated by us), it may happen that the TAP device already exists. This then may lead to all sorts of problems. For instance: for <interface type='network'/> the TAP device is plugged into the network's bridge, but since the TAP device is persistent it remains plugged there even after the guest is shut off. We don't have a code that unplugs TAP devices from the bridge because TAP devices we create are transient, i.e. are removed automatically when QEMU closes their FD. The only exception is <interface type='ethernet'/> with <target managed='no'/> where we specifically want to let users use pre-created TAP device and basically not touch it at all. There's another reason for denying to use a pre-created TAP devices: if we ever have bug in TAP name generation, we may re-use a TAP device from another domain. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2144738 Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Laine Stump <laine@redhat.com>
110 lines
4.5 KiB
C
110 lines
4.5 KiB
C
/*
|
|
* Copyright (C) 2007-2011, 2013 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library. If not, see
|
|
* <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "internal.h"
|
|
#include "virnetdev.h"
|
|
#include "virnetdevvportprofile.h"
|
|
#include "virnetdevvlan.h"
|
|
|
|
#ifdef __FreeBSD__
|
|
/* This should be defined on OSes that don't automatically
|
|
* cleanup released devices */
|
|
# define VIR_NETDEV_TAP_REQUIRE_MANUAL_CLEANUP 1
|
|
#endif
|
|
|
|
int virNetDevTapCreate(char **ifname,
|
|
const char *tunpath,
|
|
int *tapfd,
|
|
size_t tapfdSize,
|
|
unsigned int flags)
|
|
ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT G_NO_INLINE;
|
|
|
|
int virNetDevTapDelete(const char *ifname,
|
|
const char *tunpath)
|
|
ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
int virNetDevTapGetName(int tapfd, char **ifname)
|
|
ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
char* virNetDevTapGetRealDeviceName(char *ifname)
|
|
ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT G_NO_INLINE;
|
|
|
|
typedef enum {
|
|
VIR_NETDEV_TAP_CREATE_NONE = 0,
|
|
/* Bring the interface up */
|
|
VIR_NETDEV_TAP_CREATE_IFUP = 1 << 0,
|
|
/* Enable IFF_VNET_HDR on the tap device */
|
|
VIR_NETDEV_TAP_CREATE_VNET_HDR = 1 << 1,
|
|
/* Set this interface's MAC as the bridge's MAC address */
|
|
VIR_NETDEV_TAP_CREATE_USE_MAC_FOR_BRIDGE = 1 << 2,
|
|
/* The device will persist after the file descriptor is closed */
|
|
VIR_NETDEV_TAP_CREATE_PERSIST = 1 << 3,
|
|
/* The device is allowed to exist before creation */
|
|
VIR_NETDEV_TAP_CREATE_ALLOW_EXISTING = 1 << 4,
|
|
} virNetDevTapCreateFlags;
|
|
|
|
int
|
|
virNetDevTapAttachBridge(const char *tapname,
|
|
const char *brname,
|
|
const virMacAddr *macaddr,
|
|
const unsigned char *vmuuid,
|
|
const virNetDevVPortProfile *virtPortProfile,
|
|
const virNetDevVlan *virtVlan,
|
|
virTristateBool isolatedPort,
|
|
unsigned int mtu,
|
|
unsigned int *actualMTU)
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
|
G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
int
|
|
virNetDevTapReattachBridge(const char *tapname,
|
|
const char *brname,
|
|
const virMacAddr *macaddr,
|
|
const unsigned char *vmuuid,
|
|
const virNetDevVPortProfile *virtPortProfile,
|
|
const virNetDevVlan *virtVlan,
|
|
virTristateBool isolatedPort,
|
|
unsigned int mtu,
|
|
unsigned int *actualMTU)
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
|
G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
int virNetDevTapCreateInBridgePort(const char *brname,
|
|
char **ifname,
|
|
const virMacAddr *macaddr,
|
|
const unsigned char *vmuuid,
|
|
const char *tunpath,
|
|
int *tapfd,
|
|
size_t tapfdSize,
|
|
const virNetDevVPortProfile *virtPortProfile,
|
|
const virNetDevVlan *virtVlan,
|
|
virTristateBool isolatedPort,
|
|
virNetDevCoalesce *coalesce,
|
|
unsigned int mtu,
|
|
unsigned int *actualMTU,
|
|
unsigned int flags)
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
|
G_GNUC_WARN_UNUSED_RESULT G_NO_INLINE;
|
|
|
|
int virNetDevTapInterfaceStats(const char *ifname,
|
|
virDomainInterfaceStatsPtr stats,
|
|
bool swapped)
|
|
G_GNUC_WARN_UNUSED_RESULT;
|