deleted file mode 100755
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-# The following expression selects the first bridge listed by 'brctl show'.
-# Modify it to suit your needs.
-switch=$(/usr/sbin/brctl show | awk 'NR==2 { print $1 }')
-
-/bin/echo 1 > /proc/sys/net/ipv6/conf/${switch}/disable_ipv6
-/sbin/ifconfig $1 0.0.0.0 up
-/usr/sbin/brctl addif ${switch} $1
-/usr/sbin/brctl setfd ${switch} 0
-/usr/sbin/brctl stp ${switch} off
@@ -7,7 +7,7 @@ Utility classes and functions to handle Virtual Machine creation using qemu.
import time, os, logging, fcntl, re, commands, glob
from autotest_lib.client.common_lib import error
from autotest_lib.client.bin import utils
-import virt_utils, virt_vm, kvm_monitor, aexpect
+import virt_utils, virt_vm, virt_test_setup, kvm_monitor, aexpect
class VM(virt_vm.BaseVM):
@@ -41,6 +41,7 @@ class VM(virt_vm.BaseVM):
self.pci_assignable = None
self.netdev_id = []
self.device_id = []
+ self.tapfds = []
self.uuid = None
@@ -240,19 +241,17 @@ class VM(virt_vm.BaseVM):
cmd += ",id='%s'" % device_id
return cmd
- def add_net(help, vlan, mode, ifname=None, script=None,
- downscript=None, tftp=None, bootfile=None, hostfwd=[],
- netdev_id=None, netdev_extra_params=None):
+ def add_net(help, vlan, mode, ifname=None, tftp=None, bootfile=None,
+ hostfwd=[], netdev_id=None, netdev_extra_params=None,
+ tapfd=None):
if has_option(help, "netdev"):
cmd = " -netdev %s,id=%s" % (mode, netdev_id)
if netdev_extra_params:
cmd += ",%s" % netdev_extra_params
else:
cmd = " -net %s,vlan=%d" % (mode, vlan)
- if mode == "tap":
- if ifname: cmd += ",ifname='%s'" % ifname
- if script: cmd += ",script='%s'" % script
- cmd += ",downscript='%s'" % (downscript or "no")
+ if mode == "tap" and tapfd:
+ cmd += ",fd=%d" % tapfd
elif mode == "user":
if tftp and "[,tftp=" in help:
cmd += ",tftp='%s'" % tftp
@@ -422,20 +421,22 @@ class VM(virt_vm.BaseVM):
qemu_cmd += add_nic(help, vlan, nic_params.get("nic_model"), mac,
device_id, netdev_id, nic_params.get("nic_extra_params"))
# Handle the '-net tap' or '-net user' or '-netdev' part
- script = nic_params.get("nic_script")
- downscript = nic_params.get("nic_downscript")
tftp = nic_params.get("tftp")
- if script:
- script = virt_utils.get_path(root_dir, script)
- if downscript:
- downscript = virt_utils.get_path(root_dir, downscript)
if tftp:
tftp = virt_utils.get_path(root_dir, tftp)
- qemu_cmd += add_net(help, vlan, nic_params.get("nic_mode", "user"),
- vm.get_ifname(vlan),
- script, downscript, tftp,
+ if nic_params.get("nic_mode") == "tap":
+ try:
+ tapfd = vm.tapfds[vlan]
+ except:
+ tapfd = None
+ else:
+ tapfd = None
+ qemu_cmd += add_net(help, vlan,
+ nic_params.get("nic_mode", "user"),
+ vm.get_ifname(vlan), tftp,
nic_params.get("bootp"), redirs, netdev_id,
- nic_params.get("netdev_extra_params"))
+ nic_params.get("netdev_extra_params"),
+ tapfd)
# Proceed to next NIC
vlan += 1
@@ -558,6 +559,10 @@ class VM(virt_vm.BaseVM):
@raise VMBadPATypeError: If an unsupported PCI assignment type is
requested
@raise VMPAError: If no PCI assignable devices could be assigned
+ @raise TAPCreationError: If fail to create tap fd
+ @raise BRAddIfError: If fail to add a tap to a bridge
+ @raise TAPBringUpError: If fail to bring up a tap
+ @raise PrivateBridgeError: If fail to bring the private bridge
"""
error.context("creating '%s'" % self.name)
self.destroy(free_mac_addresses=False)
@@ -621,12 +626,24 @@ class VM(virt_vm.BaseVM):
guest_port = int(redir_params.get("guest_port"))
self.redirs[guest_port] = host_ports[i]
- # Generate netdev/device IDs for all NICs
+ # Generate netdev IDs for all NICs and create TAP fd
self.netdev_id = []
- self.device_id = []
+ self.tapfds = []
+ vlan = 0
for nic in params.objects("nics"):
self.netdev_id.append(virt_utils.generate_random_id())
self.device_id.append(virt_utils.generate_random_id())
+ nic_params = params.object_params(nic)
+ if nic_params.get("nic_mode") == "tap":
+ ifname = self.get_ifname(vlan)
+ brname = nic_params.get("bridge")
+ if brname == "private":
+ brname = virt_test_setup.PrivateBridgeConfig().brname
+ tapfd = virt_utils.open_tap("/dev/net/tun", ifname)
+ virt_utils.add_to_bridge(ifname, brname)
+ virt_utils.bring_up_ifname(ifname)
+ self.tapfds.append(tapfd)
+ vlan += 1
# Find available VNC port, if needed
if params.get("display") == "vnc":
@@ -865,6 +882,12 @@ class VM(virt_vm.BaseVM):
num_nics = len(self.params.objects("nics"))
for vlan in range(num_nics):
self.free_mac_address(vlan)
+ for tapfd in self.tapfds:
+ try:
+ os.close(tapfd)
+ # File descriptor is already closed
+ except OSError:
+ pass
@property
@@ -56,12 +56,16 @@ class NetError(Exception):
class TAPModuleError(NetError):
- def __init__(self, devname):
+ def __init__(self, devname, action="open", details=None):
NetError.__init__(self, devname)
self.devname = devname
def __str__(self):
- return "Can't open %s" % self.devname
+ e_msg = "Can't %s %s" % (self.action, self.devname)
+ if self.details is not None:
+ e_msg += " : %s" % details
+ return e_msg
+
class TAPNotExistError(NetError):
def __init__(self, ifname):