1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
| | #! /usr/bin/env avocado-runner-avocado-classless
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Copyright Red Hat
# Author: David Gibson <david@gibson.dropbear.id.au>
"""
Test A Simple Socket Transport
scenario/simple.py - Smallest sensible network to use passt/pasta
"""
import contextlib
from tasst import address
from tasst.nstool import unshare_site
from tasst.exesite import Site
from tasst.transfer import test_transfers
from tasst.typecheck import typecheck
IFNAME = 'veth'
HOST_NET4 = address.TEST_NET_1
HOST_NET6 = address.TEST_NET6_TASST_A
ipa_local = address.IpiAllocator(HOST_NET4, HOST_NET6)
(IP4, IP6) = ipa_local.next_ipis()
(GW_IP4, GW_IP6) = ipa_local.next_ipis()
ipa_remote = address.IpiAllocator(address.TEST_NET_2,
address.TEST_NET6_TASST_B)
(REMOTE_IP4, REMOTE_IP6) = ipa_remote.next_ipis()
class __SimpleNet: # pylint: disable=R0903
"""A simple network setup scenario
The sample network has 2 sites (network namespaces) connected with
a veth link:
[simhost] <-veth-> [gw]
gw is set up as the default router for simhost.
simhost has addresses:
self.IP4 (IPv4), self.IP6 (IPv6), self.ip6_ll (IPv6 link local)
gw has addresses:
self.GW_IP4 (IPv4), self.GW_IP6 (IPv6),
self.gw_ip6_ll (IPv6 link local)
self.REMOTE_IP4 (IPv4), self.REMOTE_IP6 (IPv6)
The "remote" addresses are on a different subnet from the others,
so the only way for simhost to reach them is via its default
route. This helps to exercise that we're actually using that,
rather than just local net routes.
"""
def __init__(self, hostsite, gwsite):
self.simhost = typecheck(hostsite, Site)
self.gw = typecheck(gwsite, Site)
self.gw_ifname = 'gw' + IFNAME
self.simhost.veth(IFNAME, self.gw_ifname, self.gw)
self.gw.ifup('lo')
self.gw.ifup(self.gw_ifname, GW_IP4, GW_IP6, REMOTE_IP4, REMOTE_IP6)
self.simhost.ifup('lo')
self.simhost.ifup(IFNAME, IP4, IP6)
# Once link is up on both sides, SLAAC will run
self.gw_ip6_ll = self.gw.addr_wait(self.gw_ifname,
family='inet6', scope='link')[0]
self.ip6_ll = self.simhost.addr_wait(IFNAME,
family='inet6', scope='link')[0]
# Set up the default route
self.simhost.fg(f'ip -4 route add default via {GW_IP4.ip}', sudo=True)
self.simhost.fg(
f'ip -6 route add default via {self.gw_ip6_ll.ip} dev {IFNAME}',
sudo=True
)
@contextlib.contextmanager
def simple_net():
with unshare_site('simhost', '-Ucnpf --mount-proc') as simhost, \
unshare_site('gw', '-n', parent=simhost, sudo=True) as gw:
yield __SimpleNet(simhost, gw)
@test_transfers(ip4=REMOTE_IP4.ip, ip6=REMOTE_IP6.ip, port=10000)
@contextlib.contextmanager
def simple_net_transfers():
with simple_net() as net:
yield (net.simhost, net.gw)
|