From: Lucas Meneghel Rodrigues <lmr@redhat.com>
To: autotest@test.kernel.org
Cc: kvm@vger.kernel.org
Subject: [PATCH 4/5] KVM test: setup tap fd and pass it to qemu-kvm v3
Date: Tue, 24 May 2011 04:03:19 -0300 [thread overview]
Message-ID: <1306220600-3840-5-git-send-email-lmr@redhat.com> (raw)
In-Reply-To: <1306220600-3840-1-git-send-email-lmr@redhat.com>
We used to use qemu-ifup to manage the tap which have several
limitations:
1) If we want to specify a bridge, we must create a customized
qemu-ifup file as the default script always match the first bridge.
2) It's hard to add support for macvtap device.
So this patch let kvm subtest control the tap creation and setup then
pass it to qemu-kvm. User could specify the bridge he want to used in
configuration file.
The original autoconfiguration was changed by private bridge setup.
Changes from v1:
* Combine the private bridge config and TAP fd in one patchset,
dropped the "auto" mode
* Close TAP fds on VM.destroy() (thanks to Amos Kong for finding
the problem)
Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Lucas Meneghel Rodrigues <lmr@redhat.com>
---
client/tests/kvm/scripts/qemu-ifup | 11 -------
client/virt/kvm_vm.py | 59 +++++++++++++++++++++++------------
client/virt/virt_utils.py | 8 ++++-
3 files changed, 45 insertions(+), 33 deletions(-)
delete mode 100755 client/tests/kvm/scripts/qemu-ifup
diff --git a/client/tests/kvm/scripts/qemu-ifup b/client/tests/kvm/scripts/qemu-ifup
deleted file mode 100755
index c4debf5..0000000
--- a/client/tests/kvm/scripts/qemu-ifup
+++ /dev/null
@@ -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
diff --git a/client/virt/kvm_vm.py b/client/virt/kvm_vm.py
index c9bb273..9b26dee 100644
--- a/client/virt/kvm_vm.py
+++ b/client/virt/kvm_vm.py
@@ -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,8 @@ 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:
+ os.close(tapfd)
@property
diff --git a/client/virt/virt_utils.py b/client/virt/virt_utils.py
index 7eeaf4f..101427e 100644
--- a/client/virt/virt_utils.py
+++ b/client/virt/virt_utils.py
@@ -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):
--
1.7.5.1
next prev parent reply other threads:[~2011-05-24 7:03 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-24 7:03 [PATCH 0/5] Setup private bridge in KVM autotest, get rid of ifup scripts Lucas Meneghel Rodrigues
2011-05-24 7:03 ` [PATCH 1/5] KVM test: Adding framework code to control bridge creation Lucas Meneghel Rodrigues
2011-05-24 7:03 ` [PATCH 2/5] KVM test: Add helpers to control the TAP/bridge Lucas Meneghel Rodrigues
2011-05-24 7:03 ` [PATCH 3/5] KVM test: virt_env_process: Setup private bridge during postprocessing Lucas Meneghel Rodrigues
2011-05-24 7:03 ` Lucas Meneghel Rodrigues [this message]
2011-05-24 7:03 ` [PATCH 5/5] KVM test: Changing KVM autotest default to private bridge Lucas Meneghel Rodrigues
-- strict thread matches above, loose matches on Subject: below --
2011-06-02 4:23 [PATCH 0/5] Create private bridge, get rid of qemu ifup scripts v3 Lucas Meneghel Rodrigues
2011-06-02 4:23 ` [PATCH 4/5] KVM test: setup tap fd and pass it to qemu-kvm v3 Lucas Meneghel Rodrigues
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1306220600-3840-5-git-send-email-lmr@redhat.com \
--to=lmr@redhat.com \
--cc=autotest@test.kernel.org \
--cc=kvm@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox