From 5d28dce664616a97dcc08e3c9ac1ef3d25634aee Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Sun, 6 Nov 2022 17:12:09 +0100 Subject: [PATCH 01/19] Add admin_iface and admin_iface_ip_net variables to Host and its config --- autotest.cfg | 4 ++-- autotest.py | 2 ++ server.py | 10 ++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/autotest.cfg b/autotest.cfg index c8c5ff0..fa8b0c7 100644 --- a/autotest.cfg +++ b/autotest.cfg @@ -1,7 +1,7 @@ [host] fqdn=river.dse.in.tum.de -admin_iface= -admin_bridge= +admin_iface=br-gierens0 +admin_iface_ip_net=192.168.56.1/24 test_iface= test_iface_addr= test_iface_mac= diff --git a/autotest.py b/autotest.py index 431cfff..213af3b 100755 --- a/autotest.py +++ b/autotest.py @@ -569,6 +569,8 @@ def create_servers(conf: ConfigParser, if host: servers['host'] = Host( conf['host']['fqdn'], + conf['host']['admin_iface'], + conf['host']['admin_iface_ip_net'], conf['host']['test_iface'], conf['host']['test_iface_addr'], conf['host']['test_iface_mac'], diff --git a/server.py b/server.py index 88154aa..65c1210 100644 --- a/server.py +++ b/server.py @@ -842,11 +842,15 @@ class Host(Server): >>> Host('server.test.de') Host(fqdn='server.test.de') """ + admin_iface: str + admin_iface_ip_net: str guest_test_iface_mac: str guest_root_disk_path: str def __init__(self: 'Host', fqdn: str, + admin_iface: str, + admin_iface_ip_net: str, test_iface: str, test_iface_addr: str, test_iface_mac: str, @@ -863,6 +867,10 @@ def __init__(self: 'Host', ---------- fqdn : str The fully qualified domain name of the host. + admin_iface : str + The network interface identifier of the admin bridge interface. + admin_iface_ip_net : str + The IP address and subnet mask of the admin bridge interface. test_iface : str The name of the test interface. test_iface_addr : str @@ -899,6 +907,8 @@ def __init__(self: 'Host', super().__init__(fqdn, test_iface, test_iface_addr, test_iface_mac, test_iface_driv, moongen_dir, xdp_reflector_dir, localhost) + self.admin_iface = admin_iface + self.admin_iface_ip_net = admin_iface_ip_net self.guest_test_iface_mac = guest_test_iface_mac self.guest_root_disk_path = guest_root_disk_path From 8ebcb0c1c5d7a70b9c874f78b70f767bdcf1694a Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Sun, 6 Nov 2022 17:14:02 +0100 Subject: [PATCH 02/19] Remove admin_iface settings from loadgen config --- autotest.cfg | 2 -- 1 file changed, 2 deletions(-) diff --git a/autotest.cfg b/autotest.cfg index fa8b0c7..969384f 100644 --- a/autotest.cfg +++ b/autotest.cfg @@ -23,8 +23,6 @@ xdp_reflector_dir= [loadgen] fqdn=wilfred.dse.in.tum.de -admin_iface= -admin_bridge= test_iface= test_iface_addr= test_iface_mac= From caa1f68a01998aa9bffc0e0f3eb13ef9292e1676 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Sun, 6 Nov 2022 17:14:26 +0100 Subject: [PATCH 03/19] Add Host.setup_admin_bridge function --- server.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/server.py b/server.py index 65c1210..3257b79 100644 --- a/server.py +++ b/server.py @@ -912,6 +912,23 @@ def __init__(self: 'Host', self.guest_test_iface_mac = guest_test_iface_mac self.guest_root_disk_path = guest_root_disk_path + def setup_admin_bridge(self: 'Host'): + """ + Setup the admin bridge. + + Parameters + ---------- + + Returns + ------- + """ + self.exec('sudo modprobe bridge') + self.exec(f'sudo ip link show {self.admin_iface} 2>/dev/null' + + f' || (sudo ip link add {self.admin_iface} type bridge; ' + + f'sudo ip addr add {self.admin_iface_ip_net} ' + + f'dev {self.admin_iface}; true)') + self.exec(f'sudo ip link set {self.admin_iface} up') + def setup_admin_tap(self: 'Host'): """ Setup the admin tap. From c9b3e5acc32d1ae43b17de9133c7c0d7d52554a6 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Sun, 6 Nov 2022 17:20:49 +0100 Subject: [PATCH 04/19] Rename Host's admin_iface to admin_bridge --- autotest.cfg | 4 ++-- autotest.py | 4 ++-- server.py | 28 ++++++++++++++-------------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/autotest.cfg b/autotest.cfg index 969384f..4ef16fa 100644 --- a/autotest.cfg +++ b/autotest.cfg @@ -1,7 +1,7 @@ [host] fqdn=river.dse.in.tum.de -admin_iface=br-gierens0 -admin_iface_ip_net=192.168.56.1/24 +admin_bridge=br-gierens0 +admin_bridge_ip_net=192.168.56.1/24 test_iface= test_iface_addr= test_iface_mac= diff --git a/autotest.py b/autotest.py index 213af3b..cc85fcd 100755 --- a/autotest.py +++ b/autotest.py @@ -569,8 +569,8 @@ def create_servers(conf: ConfigParser, if host: servers['host'] = Host( conf['host']['fqdn'], - conf['host']['admin_iface'], - conf['host']['admin_iface_ip_net'], + conf['host']['admin_bridge'], + conf['host']['admin_bridge_ip_net'], conf['host']['test_iface'], conf['host']['test_iface_addr'], conf['host']['test_iface_mac'], diff --git a/server.py b/server.py index 3257b79..0816201 100644 --- a/server.py +++ b/server.py @@ -842,15 +842,15 @@ class Host(Server): >>> Host('server.test.de') Host(fqdn='server.test.de') """ - admin_iface: str - admin_iface_ip_net: str + admin_bridge: str + admin_bridge_ip_net: str guest_test_iface_mac: str guest_root_disk_path: str def __init__(self: 'Host', fqdn: str, - admin_iface: str, - admin_iface_ip_net: str, + admin_bridge: str, + admin_bridge_ip_net: str, test_iface: str, test_iface_addr: str, test_iface_mac: str, @@ -867,9 +867,9 @@ def __init__(self: 'Host', ---------- fqdn : str The fully qualified domain name of the host. - admin_iface : str + admin_bridge : str The network interface identifier of the admin bridge interface. - admin_iface_ip_net : str + admin_bridge_ip_net : str The IP address and subnet mask of the admin bridge interface. test_iface : str The name of the test interface. @@ -907,12 +907,12 @@ def __init__(self: 'Host', super().__init__(fqdn, test_iface, test_iface_addr, test_iface_mac, test_iface_driv, moongen_dir, xdp_reflector_dir, localhost) - self.admin_iface = admin_iface - self.admin_iface_ip_net = admin_iface_ip_net + self.admin_bridge = admin_bridge + self.admin_bridge_ip_net = admin_bridge_ip_net self.guest_test_iface_mac = guest_test_iface_mac self.guest_root_disk_path = guest_root_disk_path - def setup_admin_bridge(self: 'Host'): + def setup_admin_bridge(self: 'Host'): """ Setup the admin bridge. @@ -923,11 +923,11 @@ def setup_admin_bridge(self: 'Host'): ------- """ self.exec('sudo modprobe bridge') - self.exec(f'sudo ip link show {self.admin_iface} 2>/dev/null' + - f' || (sudo ip link add {self.admin_iface} type bridge; ' + - f'sudo ip addr add {self.admin_iface_ip_net} ' + - f'dev {self.admin_iface}; true)') - self.exec(f'sudo ip link set {self.admin_iface} up') + self.exec(f'sudo ip link show {self.admin_bridge} 2>/dev/null' + + f' || (sudo ip link add {self.admin_bridge} type bridge; ' + + f'sudo ip addr add {self.admin_bridge_ip_net} ' + + f'dev {self.admin_bridge}; true)') + self.exec(f'sudo ip link set {self.admin_bridge} up') def setup_admin_tap(self: 'Host'): """ From 898d2bc7b5172ad0360609bd39ea8da690dc40a1 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Sun, 6 Nov 2022 17:37:10 +0100 Subject: [PATCH 05/19] Add Host admin_tap variable and corresponding config setting --- autotest.cfg | 1 + autotest.py | 1 + server.py | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/autotest.cfg b/autotest.cfg index 4ef16fa..50092c8 100644 --- a/autotest.cfg +++ b/autotest.cfg @@ -2,6 +2,7 @@ fqdn=river.dse.in.tum.de admin_bridge=br-gierens0 admin_bridge_ip_net=192.168.56.1/24 +admin_tap=tap-gierens0 test_iface= test_iface_addr= test_iface_mac= diff --git a/autotest.py b/autotest.py index cc85fcd..839ca0c 100755 --- a/autotest.py +++ b/autotest.py @@ -571,6 +571,7 @@ def create_servers(conf: ConfigParser, conf['host']['fqdn'], conf['host']['admin_bridge'], conf['host']['admin_bridge_ip_net'], + conf['host']['admin_tap'], conf['host']['test_iface'], conf['host']['test_iface_addr'], conf['host']['test_iface_mac'], diff --git a/server.py b/server.py index 0816201..91247e2 100644 --- a/server.py +++ b/server.py @@ -844,6 +844,7 @@ class Host(Server): """ admin_bridge: str admin_bridge_ip_net: str + admin_tap: str guest_test_iface_mac: str guest_root_disk_path: str @@ -851,6 +852,7 @@ def __init__(self: 'Host', fqdn: str, admin_bridge: str, admin_bridge_ip_net: str, + admin_tap: str, test_iface: str, test_iface_addr: str, test_iface_mac: str, @@ -871,6 +873,8 @@ def __init__(self: 'Host', The network interface identifier of the admin bridge interface. admin_bridge_ip_net : str The IP address and subnet mask of the admin bridge interface. + admin_tap : str + The network interface identifier of the admin tap interface. test_iface : str The name of the test interface. test_iface_addr : str @@ -909,6 +913,7 @@ def __init__(self: 'Host', localhost) self.admin_bridge = admin_bridge self.admin_bridge_ip_net = admin_bridge_ip_net + self.admin_tap = admin_tap self.guest_test_iface_mac = guest_test_iface_mac self.guest_root_disk_path = guest_root_disk_path From e0fdaeff832351f22dd6b73a4281b710d392b80d Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Sun, 6 Nov 2022 17:37:33 +0100 Subject: [PATCH 06/19] Revised Host.setup_admin_tap to use admin_tap variable --- server.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/server.py b/server.py index 91247e2..51636d1 100644 --- a/server.py +++ b/server.py @@ -948,10 +948,11 @@ def setup_admin_tap(self: 'Host'): ------- """ self.exec('sudo modprobe tun tap') - self.exec('sudo ip link show tap0 2>/dev/null' + - ' || (sudo tunctl -t tap0 -u networkadmin' + - ' && sudo brctl addif br0 tap0; true)') - self.exec('sudo ip link set tap0 up') + self.exec(f'sudo ip link show {self.admin_tap} 2>/dev/null' + + f' || (sudo ip tuntap add {self.admin_tap} mode tap;' + + f' sudo ip link set {self.admin_tap} ' + f'master {self.admin_bridge}; true)') + self.exec(f'sudo ip link set {self.admin_tap} up') def setup_test_br_tap(self: 'Host'): """ From d0eff02bf1ca04ad033c676477c4062a426c4996 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Sun, 6 Nov 2022 21:51:52 +0100 Subject: [PATCH 07/19] Add test_iface settings for chair server river to autotest.cfg --- autotest.cfg | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/autotest.cfg b/autotest.cfg index 50092c8..93ebe68 100644 --- a/autotest.cfg +++ b/autotest.cfg @@ -3,10 +3,10 @@ fqdn=river.dse.in.tum.de admin_bridge=br-gierens0 admin_bridge_ip_net=192.168.56.1/24 admin_tap=tap-gierens0 -test_iface= -test_iface_addr= -test_iface_mac= -test_iface_driv= +test_iface=enp81s0 +test_iface_addr=0000:51:00.0 +test_iface_mac=b4:96:91:b3:8b:3c +test_iface_driv=ice moongen_dir= xdp_reflector_dir= From 561b21de84a3ec1fd9a8279eaf1c57e7bf237459 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Sun, 6 Nov 2022 21:54:55 +0100 Subject: [PATCH 08/19] Add test_bridge/tap/macvtap variables to Host and corresponding config --- autotest.cfg | 3 +++ autotest.py | 3 +++ server.py | 15 +++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/autotest.cfg b/autotest.cfg index 93ebe68..2fc2d20 100644 --- a/autotest.cfg +++ b/autotest.cfg @@ -7,6 +7,9 @@ test_iface=enp81s0 test_iface_addr=0000:51:00.0 test_iface_mac=b4:96:91:b3:8b:3c test_iface_driv=ice +test_bridge=br-gierens1 +test_tap=tap-gierens1 +test_macvtap=macvtap-gierens1 moongen_dir= xdp_reflector_dir= diff --git a/autotest.py b/autotest.py index 839ca0c..51964ba 100755 --- a/autotest.py +++ b/autotest.py @@ -576,6 +576,9 @@ def create_servers(conf: ConfigParser, conf['host']['test_iface_addr'], conf['host']['test_iface_mac'], conf['host']['test_iface_driv'], + conf['host']['test_bridge'], + conf['host']['test_tap'], + conf['host']['test_macvtap'], conf['guest']['root_disk_file'], conf['guest']['test_iface_mac'], conf['host']['moongen_dir'], diff --git a/server.py b/server.py index 51636d1..5a17ff5 100644 --- a/server.py +++ b/server.py @@ -845,6 +845,9 @@ class Host(Server): admin_bridge: str admin_bridge_ip_net: str admin_tap: str + test_bridge: str + test_tap: str + test_macvtap: str guest_test_iface_mac: str guest_root_disk_path: str @@ -857,6 +860,9 @@ def __init__(self: 'Host', test_iface_addr: str, test_iface_mac: str, test_iface_driv: str, + test_bridge: str, + test_tap: str, + test_macvtap: str, guest_root_disk_path: str, guest_test_iface_mac: str, moongen_dir: str, @@ -883,6 +889,12 @@ def __init__(self: 'Host', The MAC address of the test interface. test_iface_driv : str The driver of the test interface. + test_bridge : str + The network interface identifier of the test bridge interface. + test_tap : str + The network interface identifier of the test tap interface. + test_macvtap : str + The network interface identifier of the test macvtap interface. guest_root_disk_path : str The path to the root disk of the guest. guest_test_iface_mac : str @@ -914,6 +926,9 @@ def __init__(self: 'Host', self.admin_bridge = admin_bridge self.admin_bridge_ip_net = admin_bridge_ip_net self.admin_tap = admin_tap + self.test_bridge = test_bridge + self.test_tap = test_tap + self.test_macvtap = test_macvtap self.guest_test_iface_mac = guest_test_iface_mac self.guest_root_disk_path = guest_root_disk_path From 1f5b9d3eec48a125c3072878827523f07b9c7815 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Sun, 6 Nov 2022 22:01:31 +0100 Subject: [PATCH 09/19] Add Server.whoami function --- server.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/server.py b/server.py index 5a17ff5..2a2bf2b 100644 --- a/server.py +++ b/server.py @@ -209,6 +209,20 @@ def exec(self: 'Server', command: str) -> str: else: return self.__exec_ssh(command) + def whoami(self: 'Server') -> str: + """ + Get the user name. + + Parameters + ---------- + + Returns + ------- + str + The user name. + """ + return self.exec('whoami').strip() + def tmux_new(self: 'Server', session_name: str, command: str) -> None: """ Start a tmux session on the server. From 17f3016a1bf79dbc87476f487a2df6b405500dd5 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Sun, 6 Nov 2022 22:14:27 +0100 Subject: [PATCH 10/19] Revise Host.setup_test_br_tap to use config and ip command --- server.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/server.py b/server.py index 2a2bf2b..952769d 100644 --- a/server.py +++ b/server.py @@ -997,25 +997,31 @@ def setup_test_br_tap(self: 'Host'): ------- """ # load kernel modules - self.exec('sudo modprobe tun tap') + self.exec('sudo modprobe bridge tun tap') # create bridge and tap device - self.exec('sudo ip link show br1 2>/dev/null || sudo brctl addbr br1') - self.exec('sudo ip link show tap1 2>/dev/null || ' + - 'sudo ip tuntap add dev tap1 mode tap user networkadmin ' + - 'multi_queue') + self.exec(f'sudo ip link show {self.test_bridge} 2>/dev/null ' + + f' || (sudo ip link add {self.test_bridge} type bridge; ' + + 'true)') + username = self.whoami() + self.exec(f'sudo ip link show {self.test_tap} 2>/dev/null || ' + + f'(sudo ip tuntap add dev {self.test_tap} mode tap ' + + f'user {username} multi_queue; true)') # add tap device and physical nic to bridge - tap1_output = self.exec('sudo ip link show tap1') - if 'master br1' not in tap1_output: - self.exec('sudo brctl addif br1 tap1') + tap_output = self.exec(f'sudo ip link show {self.test_tap}') + if f'master {self.test_bridge}' not in tap_output: + self.exec(f'sudo ip link set {self.test_tap} ' + + f'master {self.test_bridge}') test_iface_output = self.exec(f'sudo ip link show {self.test_iface}') - if 'master br1' not in test_iface_output: - self.exec(f'sudo brctl addif br1 {self.test_iface}') + if f'master {self.test_bridge}' not in test_iface_output: + self.exec(f'sudo ip link set {self.test_iface} ' + + f'master {self.test_bridge}') # bring up all interfaces (nic, bridge and tap) self.exec(f'sudo ip link set {self.test_iface} up ' + - '&& sudo ip link set br1 up && sudo ip link set tap1 up') + f'&& sudo ip link set {self.test_bridge} up ' + + f'&& sudo ip link set {self.test_tap} up') def destroy_br_tap(self: 'Host'): """ From ad44f33f4f01df6f40b06670b23b60193c450591 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Mon, 7 Nov 2022 14:11:36 +0100 Subject: [PATCH 11/19] Revise Host.destroy_test_br_tap to use interface variables --- server.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/server.py b/server.py index 952769d..b2a4326 100644 --- a/server.py +++ b/server.py @@ -1023,7 +1023,7 @@ def setup_test_br_tap(self: 'Host'): f'&& sudo ip link set {self.test_bridge} up ' + f'&& sudo ip link set {self.test_tap} up') - def destroy_br_tap(self: 'Host'): + def destroy_test_br_tap(self: 'Host'): """ Destroy the bridged test tap device. @@ -1033,10 +1033,8 @@ def destroy_br_tap(self: 'Host'): Returns ------- """ - self.exec('sudo ip link set tap1 down') - self.exec('sudo brctl delif br1 tap1') - self.exec('sudo ip link delete tap1') - self.exec('sudo brctl delbr br1') + self.exec(f'sudo ip link delete {self.test_tap} || true') + self.exec(f'sudo ip link delete {self.test_bridge} || true') def setup_test_macvtap(self: 'Host'): """ From a958a850c20d2003769da79d472ecf636d8bad37 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Mon, 7 Nov 2022 14:26:26 +0100 Subject: [PATCH 12/19] Fix length of test_macvtap name Apparently interface names are stored in 16 bytes including trailing null character, so 15 visible characters. --- autotest.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autotest.cfg b/autotest.cfg index 2fc2d20..ac376f8 100644 --- a/autotest.cfg +++ b/autotest.cfg @@ -9,7 +9,7 @@ test_iface_mac=b4:96:91:b3:8b:3c test_iface_driv=ice test_bridge=br-gierens1 test_tap=tap-gierens1 -test_macvtap=macvtap-gierens1 +test_macvtap=mvtap-gierens1 moongen_dir= xdp_reflector_dir= From 251bc4d8d54e66967a1091087a990b9d257bcabe Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Mon, 7 Nov 2022 14:57:09 +0100 Subject: [PATCH 13/19] Revise Host.setup_test_macvtap to use ip command and config variables --- server.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/server.py b/server.py index b2a4326..6223b56 100644 --- a/server.py +++ b/server.py @@ -1049,14 +1049,15 @@ def setup_test_macvtap(self: 'Host'): Returns ------- """ - self.exec('sudo ip link show macvtap1 2>/dev/null' + - ' || sudo ip link add link enp176s0 name macvtap1' + - ' type macvtap') - self.exec('sudo ip link set macvtap1 address ' + + self.exec('sudo modprobe macvlan') + self.exec(f'sudo ip link show {self.test_macvtap} 2>/dev/null' + + f' || sudo ip link add link {self.test_iface}' + + f' name {self.test_macvtap} type macvtap') + self.exec(f'sudo ip link set {self.test_macvtap} address ' + f'{self.guest_test_iface_mac} up') - self.exec('sudo ip link set enp176s0 up') self.exec('sudo chmod 666' + - ' /dev/tap$(cat /sys/class/net/macvtap1/ifindex)') + f' /dev/tap$(cat /sys/class/net/{self.test_macvtap}/ifindex)' + ) def destroy_macvtap(self: 'Host'): """ From 28fb484b9a7eb0ba88c11cd230f8d7a14fddb137 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Mon, 7 Nov 2022 14:57:42 +0100 Subject: [PATCH 14/19] Delete unused Host functions and revise Host.destroy_macvtap to use config --- server.py | 41 ++--------------------------------------- 1 file changed, 2 insertions(+), 39 deletions(-) diff --git a/server.py b/server.py index 6223b56..5f57409 100644 --- a/server.py +++ b/server.py @@ -1059,7 +1059,7 @@ def setup_test_macvtap(self: 'Host'): f' /dev/tap$(cat /sys/class/net/{self.test_macvtap}/ifindex)' ) - def destroy_macvtap(self: 'Host'): + def destroy_test_macvtap(self: 'Host'): """ Destroy the macvtap test interface. @@ -1069,44 +1069,7 @@ def destroy_macvtap(self: 'Host'): Returns ------- """ - self.exec('sudo ip link delete macvtap1') - - def setup_test_bridge(self: 'Host'): - """ - Setup test bridge. - - This sets up a bridge device for the test interface of the host. - - Parameters - ---------- - mac : str - The MAC address for the test bridge. - """ - # load kernel modules - self.exec('sudo modprobe tun tap') - - # create bridge - self.exec('sudo ip link show br1 2>/dev/null || sudo brctl addbr br1') - - # set bridge's MAC address - self.exec('sudo ip link set br1 down && ' + - f'sudo ip link set br1 address {self.guest_test_iface_mac}') - - # add tap device and physical nic to bridge - test_iface_output = self.exec(f'sudo ip link show {self.test_iface}') - if 'master br1' not in test_iface_output: - self.exec(f'sudo brctl addif br1 {self.test_iface}') - - # bring up all interfaces (nic and bridge) - self.exec(f'sudo ip link set {self.test_iface} up' + - ' && sudo ip link set br1 up') - - def destroy_test_bridge(self: 'Host'): - """ - Destroy the test bridge. - """ - self.exec('sudo ip link set br1 down') - self.exec('sudo brctl delbr br1') + self.exec(f'sudo ip link delete {self.test_macvtap} || true') def run_guest(self: 'Host', net_type: str, From 10b664a9a15e925e3a41341bc38db7d541db4efb Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Mon, 7 Nov 2022 15:00:30 +0100 Subject: [PATCH 15/19] Revise Host.cleanup_network to use destroy_test_br_tap/macvtap --- server.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server.py b/server.py index 5f57409..1a63c1e 100644 --- a/server.py +++ b/server.py @@ -1206,9 +1206,8 @@ def cleanup_network(self: 'Host') -> None: """ self.release_test_iface() self.stop_xdp_reflector(self.test_iface) - self.exec('sudo ip link delete tap1 2>/dev/null || true') - self.exec('sudo ip link delete br1 2>/dev/null || true') - self.exec('sudo ip link delete macvtap1 2>/dev/null || true') + self.destroy_test_br_tap() + self.destroy_test_macvtap() class Guest(Server): From f343ed41f738e83db8c5e90be41535e2926d82d4 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Mon, 7 Nov 2022 15:22:04 +0100 Subject: [PATCH 16/19] Comment out release_test_iface in Host.cleanup_network This doesn't work yet, we will fix this later. --- server.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server.py b/server.py index 1a63c1e..698e69f 100644 --- a/server.py +++ b/server.py @@ -1204,7 +1204,8 @@ def cleanup_network(self: 'Host') -> None: Returns ------- """ - self.release_test_iface() + # TODO + # self.release_test_iface() self.stop_xdp_reflector(self.test_iface) self.destroy_test_br_tap() self.destroy_test_macvtap() From 5fee791d5dee6e7159af1a94aa78a2a27aa866d3 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Mon, 7 Nov 2022 15:22:48 +0100 Subject: [PATCH 17/19] Add Host.setup_admin_bridge to setup_network command --- autotest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/autotest.py b/autotest.py index 51964ba..deb77c2 100755 --- a/autotest.py +++ b/autotest.py @@ -738,6 +738,7 @@ def setup_network(args: Namespace, conf: ConfigParser) -> None: host: Host = create_servers(conf, guest=False, loadgen=False)['host'] try: + host.setup_admin_bridge() host.setup_admin_tap() if args.interface == 'brtap': host.setup_test_br_tap() From 69a2e86d3686279091856bc1624d877928438cd9 Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Mon, 7 Nov 2022 15:23:08 +0100 Subject: [PATCH 18/19] Add error message about failed network setup to setup_network command --- autotest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/autotest.py b/autotest.py index deb77c2..62f62bd 100755 --- a/autotest.py +++ b/autotest.py @@ -745,6 +745,7 @@ def setup_network(args: Namespace, conf: ConfigParser) -> None: else: host.setup_test_macvtap() except Exception: + error('Failed to setup network') host.cleanup_network() From 551db05f1df2776ccc9b1fc5bf0c62c0b81237da Mon Sep 17 00:00:00 2001 From: Sandro-Alessio Gierens Date: Mon, 7 Nov 2022 15:30:07 +0100 Subject: [PATCH 19/19] Add new guest test_iface_mac to config --- autotest.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autotest.cfg b/autotest.cfg index ac376f8..d99d379 100644 --- a/autotest.cfg +++ b/autotest.cfg @@ -20,7 +20,7 @@ memory=4096 root_disk_file= test_iface= test_iface_addr= -test_iface_mac= +test_iface_mac=52:54:00:00:00:01 test_iface_driv= moongen_dir= xdp_reflector_dir=