#! /usr/bin/env avocado-runner-avocado-classless # SPDX-License-Identifier: GPL-2.0-or-later # # Copyright Red Hat # Author: David Gibson """ Test A Simple Socket Transport ndp.py - Helpers for testing NDP """ import contextlib import ipaddress import os import tempfile import exeter from . import address, nstool class NdpTestScenario: def __init__(self, *, client, ifname, network, gateway): self.client = client self.ifname = ifname self.network = network self.gateway = gateway def test_ndp_addr(setup): with setup as scn: # Wait for NDP to do its thing (addr,) = scn.client.addr_wait(scn.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. exeter.assert_eq(addr.network, scn.network) def test_ndp_route(setup): with setup as scn: defroutes = scn.client.routes6(dst='default') while not defroutes: defroutes = scn.client.routes6(dst='default') exeter.assert_eq(len(defroutes), 1) gw = ipaddress.ip_address(defroutes[0]['gateway']) exeter.assert_eq(gw, scn.gateway) NDP_TESTS = [test_ndp_addr, test_ndp_route] def ndp_tests(setup): for t in NDP_TESTS: testid = f'{setup.__qualname__}|{t.__qualname__}' exeter.register_pipe(testid, setup, t) IFNAME = 'clientif' NETWORK = address.TEST_NET6_TASST_A ipa = address.IpiAllocator(NETWORK) (ROUTER_IP6,) = ipa.next_ipis() @contextlib.contextmanager def setup_radvd(): router_ifname = 'routerif' with nstool.unshare_snh('client', '-Un') as client, \ nstool.unshare_snh('router', '-n', parent=client, capable=True) as router: with tempfile.TemporaryDirectory() as tmpdir: client.veth(IFNAME, router_ifname, router) # Configure the simulated router confpath = os.path.join(tmpdir, 'radvd.conf') pidfile = os.path.join(tmpdir, 'radvd.pid') open(confpath, 'w', encoding='UTF-8').write( f''' interface {router_ifname} {{ AdvSendAdvert on; prefix {NETWORK} {{ }}; }}; ''' ) router.ifup('lo') router.ifup('routerif', ROUTER_IP6) # Configure the client client.ifup('lo') client.ifup(IFNAME) # Get the router's link-local-address (router_ll,) = router.addr_wait(router_ifname, family='inet6', scope='link') # Run radvd router.fg('radvd', '-c', '-C', f'{confpath}') radvd_cmd = ['radvd', '-C', f'{confpath}', '-n', '-p', f'{pidfile}', '-d', '5'] with router.bg(*radvd_cmd, capable=True) as radvd: yield NdpTestScenario(client=client, ifname=IFNAME, network=NETWORK, gateway=router_ll.ip) radvd.terminate() ndp_tests(setup_radvd)