#! /usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0-or-later # # Copyright Red Hat # Author: David Gibson """ Test A Simple Socket Transport scenario/simple.py - Smallest sensible network to use passt/pasta """ import contextlib from .. import address, nstool, transfer class __SimpleNet: # pylint: disable=R0903 """A simple network setup scenario The sample network has 2 snhs (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. """ IFNAME = 'veth' ipa_local = address.IpiAllocator() (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() def __init__(self, simhost, gw): self.simhost = simhost self.gw = gw ifname = self.IFNAME self.gw_ifname = 'gw' + ifname self.simhost.veth(self.IFNAME, self.gw_ifname, self.gw) self.gw.ifup('lo') self.gw.ifup(self.gw_ifname, self.GW_IP4, self.GW_IP6, self.REMOTE_IP4, self.REMOTE_IP6) self.simhost.ifup('lo') self.simhost.ifup(ifname, self.IP4, self.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('ip', '-4', 'route', 'add', 'default', 'via', f'{self.GW_IP4.ip}', capable=True) self.simhost.fg('ip', '-6', 'route', 'add', 'default', 'via', f'{self.gw_ip6_ll.ip}', 'dev', f'{ifname}', capable=True) @contextlib.contextmanager def simple_net(): with nstool.unshare_snh('simhost', '-Ucnpf', '--mount-proc') as simhost, \ nstool.unshare_snh('gw', '-n', parent=simhost, capable=True) as gw: yield __SimpleNet(simhost, gw) @contextlib.contextmanager def simple_transfer4_setup(): with simple_net() as snet: yield transfer.TransferTestScenario(client=snet.simhost, server=snet.gw, connect_ip=snet.REMOTE_IP4.ip, connect_port=10000) transfer.transfer_tests(simple_transfer4_setup) @contextlib.contextmanager def simple_transfer6_setup(): with simple_net() as snet: yield transfer.TransferTestScenario(client=snet.simhost, server=snet.gw, connect_ip=snet.REMOTE_IP6.ip, connect_port=10000) transfer.transfer_tests(simple_transfer6_setup)