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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| | #! /usr/bin/python3
# SPDX-License-Identifier: GPL-2.0-or-later
#
# tasst - Test A Simple Socket Transport
# library of test helpers for passt & pasta
#
# tasst/ndp.py - Helpers for testing NDP
#
# Copyright Red Hat
# Author: David Gibson <david@gibson.dropbear.id.au>
import ipaddress
import os
from tasst import Tasst, TasstSubData
from tasst.address import IpiAllocator, TEST_NET6_TASST_A
from tasst.nstool import UnshareSite
class BaseNdpTasst(Tasst):
"""
Test NDP behaviour.
:avocado: disable
"""
def subsetup(self, site, ifname, net, gw):
Tasst.subsetup(self, BaseNdpTasst,
TasstSubData(site=site, ifname=ifname, net=net, gw=gw))
def test_addr(self):
sub = self.get_subsetup(BaseNdpTasst)
# Wait for NDP to do its thing
(addr,) = sub.site.addr_wait(sub.ifname, family='inet6', scope='global')
# The SLAAC address is derived from the guest ns MAC, so
# probably won't exactly match the host address (we need
# DHCPv6 for that). It should be in the right network though.
self.assertEquals(addr.network, sub.net)
def test_route(self):
sub = self.get_subsetup(BaseNdpTasst)
defroutes = sub.site.routes6(dst='default')
while not defroutes:
defroutes = sub.site.routes6(dst='default')
self.assertEquals(len(defroutes), 1)
gateway = ipaddress.ip_address(defroutes[0]['gateway'])
self.assertEquals(gateway, sub.gw)
class MetaNdpTasst(BaseNdpTasst):
"""Ugly workaround for
https://github.com/avocado-framework/avocado/issues/5680.
Explicitly apply the "meta" tag to inherited tests
:avocado: disable
:avocado: tags=meta
"""
def test_addr(self):
super().test_addr()
def test_route(self):
super().test_route()
class RadvdNdpTasst(MetaNdpTasst):
timeout = 15.0
def setUp(self):
super().setUp()
ifname = 'clientif'
router_ifname = 'routerif'
prefix = TEST_NET6_TASST_A
self.client = UnshareSite(self.__class__.__name__ + '.client', '-Un')
self.router = UnshareSite(self.__class__.__name__ + '.router', '-n',
parent=self.client, sudo=True)
self.router.require_cmds('radvd')
self.client.veth(ifname, router_ifname, self.router)
# Configure the simulated router
ipa = IpiAllocator(prefix)
(router_ip6,) = ipa.next_ipis()
confpath = os.path.join(self.workdir, 'radvd.conf')
self.pidpath = os.path.join(self.workdir, 'radvd.pid')
open(confpath, 'w').write(
'''
interface {} {{
AdvSendAdvert on;
prefix {} {{
}};
}};
'''.format(router_ifname, prefix))
self.router.ifup('lo')
self.router.ifup('routerif', router_ip6)
# Configure the client
self.client.ifup('lo')
self.client.ifup(ifname)
# Get the router's link-local-address
(self.router_ll,) = self.router.addr_wait(router_ifname,
family='inet6', scope='link')
# Run radvd
self.router.fg('radvd -c -C {}'.format(confpath))
self.radvd = self.router.bg('radvd -C {} -p {} -n -d 5'.format(confpath, self.pidpath),
sudo=True)
BaseNdpTasst.subsetup(self, self.client, ifname, prefix, self.router_ll.ip)
def tearDown(self):
pid = int(open(self.pidpath).read())
self.router.fg('kill {}'.format(pid))
status = self.radvd.wait()
self.assertEquals(status, 0)
self.router.close()
self.client.close()
super().tearDown()
|