diff options
| -rw-r--r-- | .github/CODEOWNERS (renamed from CODEOWNERS) | 0 | ||||
| -rw-r--r-- | interface-definitions/vpp.xml.in | 7 | ||||
| -rw-r--r-- | smoketest/config-tests/vpp | 48 | ||||
| -rw-r--r-- | smoketest/configs/vpp | 121 | ||||
| -rwxr-xr-x | smoketest/scripts/cli/test_vpp.py | 27 | ||||
| -rwxr-xr-x | src/conf_mode/vpp.py | 17 |
6 files changed, 216 insertions, 4 deletions
diff --git a/CODEOWNERS b/.github/CODEOWNERS index a744441f6..a744441f6 100644 --- a/CODEOWNERS +++ b/.github/CODEOWNERS diff --git a/interface-definitions/vpp.xml.in b/interface-definitions/vpp.xml.in index 4c25c10f7..77a461242 100644 --- a/interface-definitions/vpp.xml.in +++ b/interface-definitions/vpp.xml.in @@ -450,8 +450,11 @@ <format>ethN</format> <description>Interface name</description> </valueHelp> + <completionHelp> + <script>${vyos_completion_dir}/list_interfaces --type ethernet</script> + </completionHelp> <constraint> - <regex>((eth|lan)[0-9]+|(eno|ens|enp|enx).+)</regex> + <validator name="ethernet-interface"/> </constraint> <constraintErrorMessage>Invalid interface name</constraintErrorMessage> </properties> @@ -847,7 +850,7 @@ <tagNode name="kernel-interfaces" owner="${vyos_conf_scripts_dir}/vpp_kernel-interfaces.py"> <properties> <help>VPP kernel interface settings</help> - <priority>305</priority> + <priority>308</priority> <valueHelp> <format>vpptapN</format> <description>Kernel interface name</description> diff --git a/smoketest/config-tests/vpp b/smoketest/config-tests/vpp new file mode 100644 index 000000000..eb6682817 --- /dev/null +++ b/smoketest/config-tests/vpp @@ -0,0 +1,48 @@ +set interfaces ethernet eth0 description 'WAN' +set interfaces ethernet eth0 offload gro +set interfaces ethernet eth0 offload gso +set interfaces ethernet eth0 offload sg +set interfaces ethernet eth0 offload tso +set interfaces ethernet eth1 address '192.0.2.1/30' +set interfaces ethernet eth1 address '192.0.2.21/30' +set interfaces ethernet eth1 description 'WAN' +set interfaces ethernet eth2 +set interfaces ethernet eth3 +set interfaces ethernet eth4 description 'Bonding' +set interfaces loopback lo +set system config-management commit-revisions '100' +set system console device ttyS0 speed '115200' +set system host-name 'r16' +set system login user vyos authentication encrypted-password '$6$rounds=656000$FZBlGpWsmSrV2Rvq$YPNAPtk4k6u99FAMxR6cw4DUPCgOomwCgRZRSO5rAoJK8RlMSCkVAFVF3ozL/3mZMfxcuCnwvd5HX6f9V5KzO.' +set system name-server '203.0.113.1' +set system option time-format '24-hour' +set system syslog global facility all level 'info' +set system syslog global facility local7 level 'debug' +set vpp interfaces bonding bond0 hash-policy 'layer2+3' +set vpp interfaces bonding bond0 member interface 'eth4' +set vpp interfaces bonding bond0 mode '802.3ad' +set vpp interfaces gre gre10 description 'Layer-3' +set vpp interfaces gre gre10 mode 'point-to-point' +set vpp interfaces gre gre10 remote '192.0.2.2' +set vpp interfaces gre gre10 source-address '192.0.2.1' +set vpp interfaces gre gre10 tunnel-type 'l3' +set vpp interfaces gre gre11 description 'L2-bridge-to-eth2' +set vpp interfaces gre gre11 remote '192.0.2.123' +set vpp interfaces gre gre11 source-address '192.0.2.1' +set vpp interfaces gre gre11 tunnel-type 'teb' +set vpp interfaces gre gre12 description 'Multipoint' +set vpp interfaces gre gre12 mode 'point-to-multipoint' +set vpp interfaces gre gre12 remote '0.0.0.0' +set vpp interfaces gre gre12 source-address '192.0.2.21' +set vpp interfaces gre gre12 tunnel-type 'l3' +set vpp interfaces ipip ipip20 remote '192.0.2.2' +set vpp interfaces ipip ipip20 source-address '192.0.2.1' +set vpp interfaces loopback lo12 description 'Loop12' +set vpp interfaces vxlan vxlan10 remote '192.0.2.2' +set vpp interfaces vxlan vxlan10 source-address '192.0.2.1' +set vpp interfaces vxlan vxlan10 vni '10' +set vpp settings interface eth1 driver 'dpdk' +set vpp settings interface eth2 driver 'dpdk' +set vpp settings interface eth3 driver 'dpdk' +set vpp settings interface eth4 driver 'dpdk' +set vpp settings unix poll-sleep-usec '12' diff --git a/smoketest/configs/vpp b/smoketest/configs/vpp new file mode 100644 index 000000000..e2223bc02 --- /dev/null +++ b/smoketest/configs/vpp @@ -0,0 +1,121 @@ +interfaces { + ethernet eth0 { + description "WAN" + offload { + gro + gso + sg + tso + } + } + ethernet eth1 { + address "192.0.2.1/30" + address "192.0.2.21/30" + description "WAN" + } + ethernet eth2 { + } + ethernet eth3 { + } + ethernet eth4 { + description "Bonding" + } + loopback lo { + } +} +system { + config-management { + commit-revisions "100" + } + console { + device ttyS0 { + speed "115200" + } + } + host-name "r16" + login { + user vyos { + authentication { + encrypted-password "$6$rounds=656000$FZBlGpWsmSrV2Rvq$YPNAPtk4k6u99FAMxR6cw4DUPCgOomwCgRZRSO5rAoJK8RlMSCkVAFVF3ozL/3mZMfxcuCnwvd5HX6f9V5KzO." + } + } + } + name-server "203.0.113.1" + option { + time-format "24-hour" + } + syslog { + global { + facility all { + level "info" + } + facility local7 { + level "debug" + } + } + } +} +vpp { + interfaces { + bonding bond0 { + hash-policy "layer2+3" + member { + interface "eth4" + } + mode "802.3ad" + } + gre gre10 { + description "Layer-3" + mode "point-to-point" + remote "192.0.2.2" + source-address "192.0.2.1" + tunnel-type "l3" + } + gre gre11 { + description "L2-bridge-to-eth2" + remote "192.0.2.123" + source-address "192.0.2.1" + tunnel-type "teb" + } + gre gre12 { + description "Multipoint" + mode "point-to-multipoint" + remote "0.0.0.0" + source-address "192.0.2.21" + tunnel-type "l3" + } + ipip ipip20 { + remote "192.0.2.2" + source-address "192.0.2.1" + } + loopback lo12 { + description "Loop12" + } + vxlan vxlan10 { + remote "192.0.2.2" + source-address "192.0.2.1" + vni "10" + } + } + settings { + interface eth1 { + driver "dpdk" + } + interface eth2 { + driver "dpdk" + } + interface eth3 { + driver "dpdk" + } + interface eth4 { + driver "dpdk" + } + unix { + poll-sleep-usec "12" + } + } +} + +// Warning: Do not remove the following line. +// vyos-config-version: "bgp@5:broadcast-relay@1:cluster@2:config-management@1:conntrack@5:conntrack-sync@2:container@2:dhcp-relay@2:dhcp-server@11:dhcpv6-server@6:dns-dynamic@4:dns-forwarding@4:firewall@18:flow-accounting@2:https@7:ids@1:interfaces@33:ipoe-server@4:ipsec@13:isis@3:l2tp@9:lldp@2:mdns@1:monitoring@2:nat@8:nat66@3:nhrp@1:ntp@3:openconnect@3:openvpn@4:ospf@2:pim@1:policy@8:pppoe-server@11:pptp@5:qos@3:quagga@12:reverse-proxy@2:rip@1:rpki@2:salt@1:snmp@3:ssh@2:sstp@6:system@28:vpp@1:vrf@3:vrrp@4:vyos-accel-ppp@2:wanloadbalance@3:webproxy@2" +// Release version: 1.5-rolling-202502030007 diff --git a/smoketest/scripts/cli/test_vpp.py b/smoketest/scripts/cli/test_vpp.py index ca7689c5e..8f812d520 100755 --- a/smoketest/scripts/cli/test_vpp.py +++ b/smoketest/scripts/cli/test_vpp.py @@ -522,6 +522,7 @@ class TestVPP(VyOSUnitTestSHIM.TestCase): self.cli_set(base_path + ['interfaces', 'loopback', interface_loopback]) self.cli_commit() + @unittest.skip("Skipping temporary bonding, sometimes get recursion T7117") def test_06_vpp_bonding(self): interface_bond = 'bond23' interface_kernel = 'vpptun23' @@ -977,6 +978,32 @@ class TestVPP(VyOSUnitTestSHIM.TestCase): for option, value in dpdk_options.items(): self.assertIn(f'{option} {value}', config) + def test_11_vpp_cpu_settings(self): + main_core = '0' + workers = '2' + + self.cli_set(base_path + ['settings', 'cpu', 'workers', workers]) + + # "cpu workers" reqiures main-core to be set + # expect raise ConfigError + with self.assertRaises(ConfigSessionError): + self.cli_commit() + + self.cli_set(base_path + ['settings', 'cpu', 'main-core', main_core]) + + self.cli_commit() + + config_entries = ( + f'main-core {main_core}', + f'workers {workers}', + 'dev 0000:00:00.0', + ) + + # Check configured options + config = read_file(VPP_CONF) + for config_entry in config_entries: + self.assertIn(config_entry, config) + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/src/conf_mode/vpp.py b/src/conf_mode/vpp.py index db135c53e..0b2d4cbe8 100755 --- a/src/conf_mode/vpp.py +++ b/src/conf_mode/vpp.py @@ -397,10 +397,22 @@ def verify(config): if 'cpu' in config['settings']: if ( 'corelist_workers' in config['settings']['cpu'] - and 'main_core' not in config['settings']['cpu'] - ): + or 'workers' in config['settings']['cpu'] + ) and 'main_core' not in config['settings']['cpu']: raise ConfigError('"cpu main-core" is required but not set!') + cpus = int(get_core_count()) + if 'workers' in config['settings']['cpu']: + # number of worker threads must be not more than + # available CPUs in the system - 2 (1 for main thread and at least 1 for system processes) + workers = int(config['settings']['cpu']['workers']) + available_workers = cpus - 2 + if workers > available_workers: + raise ConfigError( + f'The system does not have enough CPUs for {workers} VPP workers ' + f'(reduce to {available_workers} or less)' + ) + verify_memory(config['settings']) # Check if deleted interfaces are not xconnect memebrs @@ -444,6 +456,7 @@ def generate(config): def apply(config): + # Open persistent config # It is required for operations with interfaces persist_config = JSONStorage('vpp_conf') |
