From 3f6d68eb7e1450fcf0258f1673c2fa3f2be56f1f Mon Sep 17 00:00:00 2001 From: Tibor Frank Date: Mon, 8 Feb 2021 17:19:32 +0100 Subject: [PATCH] Geneve: Re-write the creation of tunnels in python Change-Id: I8b20134ad10abd9c021270b98c3110bd186946d5 Signed-off-by: Tibor Frank --- resources/libraries/python/GeneveUtil.py | 72 ++++++++++++++++++++++++++++++- resources/libraries/robot/ip/geneve.robot | 41 ++---------------- 2 files changed, 75 insertions(+), 38 deletions(-) diff --git a/resources/libraries/python/GeneveUtil.py b/resources/libraries/python/GeneveUtil.py index 3c8ebeebb3..d7266f58fa 100644 --- a/resources/libraries/python/GeneveUtil.py +++ b/resources/libraries/python/GeneveUtil.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 Cisco and/or its affiliates. +# Copyright (c) 2021 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -18,6 +18,7 @@ from ipaddress import ip_address from resources.libraries.python.Constants import Constants from resources.libraries.python.InterfaceUtil import InterfaceUtil from resources.libraries.python.IPAddress import IPAddress +from resources.libraries.python.IPUtil import IPUtil from resources.libraries.python.PapiExecutor import PapiSocketExecutor from resources.libraries.python.topology import Topology @@ -124,3 +125,72 @@ class GeneveUtil: u"geneve_tunnel_dump", ] PapiSocketExecutor.dump_and_log(node, cmds) + + @staticmethod + def vpp_geneve_add_multiple_tunnels( + node, gen_tunnel, n_tunnels, dut_if1, dut_if2, tg_if1_ip4, + tg_if2_ip4, tg_pf2_mac, next_idx): + """Create multiple GENEVE tunnels. + + :param node: DUT node. + :param gen_tunnel: Parameters of the GENEVE tunnel. + :param n_tunnels: Number of tunnels. + :param dut_if1: The first DUT interface. + :param dut_if2: The second DUT interface. + :param tg_if1_ip4: TG interface 1 IP address. + :param tg_if2_ip4: TG interface 2 IP address. + :param tg_pf2_mac: TG interface 2 MAC address. + :param next_idx: The index of the next node. + :type node: dict + :type gen_tunnel: dict + :type n_tunnels: int + :type dut_if1: str + :type dut_if2: str + :type tg_if1_ip4: str + :type tg_if2_ip4: str + :type tg_pf2_mac: str + :type next_idx: int + """ + + src_ip_int = IPUtil.ip_to_int(gen_tunnel[u"src_ip"]) + dst_ip_int = IPUtil.ip_to_int(gen_tunnel[u"dst_ip"]) + if_ip_int = IPUtil.ip_to_int(gen_tunnel[u"if_ip"]) + + for idx in range(n_tunnels): + src_ip = IPUtil.int_to_ip(src_ip_int + idx * 256) + dst_ip = IPUtil.int_to_ip(dst_ip_int + idx * 256) + if_ip = IPUtil.int_to_ip(if_ip_int + idx * 256) + + IPUtil.vpp_route_add( + node, src_ip, gen_tunnel[u"ip_mask"], + gateway=tg_if1_ip4, interface=dut_if1 + ) + tunnel_sw_index = GeneveUtil.add_geneve_tunnel( + node, gen_tunnel[u"local"], gen_tunnel[u"remote"], + gen_tunnel[u"vni"] + idx, l3_mode=True, next_index=next_idx + ) + tunnel_if_key = Topology.get_interface_by_sw_index( + node, tunnel_sw_index + ) + tunnel_if_mac = Topology.get_interface_mac( + node, tunnel_if_key + ) + IPUtil.vpp_interface_set_ip_address(node, tunnel_if_key, if_ip, 24) + IPUtil.vpp_add_ip_neighbor( + node, tunnel_if_key, tg_if2_ip4, tg_pf2_mac + ) + IPUtil.vpp_route_add( + node, dst_ip, gen_tunnel[u"ip_mask"], + gateway=tg_if2_ip4, interface=tunnel_if_key + ) + IPUtil.vpp_route_add( + node, gen_tunnel[u"remote"], 32, + gateway=tg_if2_ip4, interface=dut_if2 + ) + IPUtil.vpp_add_ip_neighbor( + node, tunnel_if_key, gen_tunnel[u"local"], tunnel_if_mac + ) + IPUtil.vpp_route_add( + node, gen_tunnel[u"local"], 32, gateway=if_ip + ) + InterfaceUtil.set_interface_state(node, tunnel_if_key, u"up") diff --git a/resources/libraries/robot/ip/geneve.robot b/resources/libraries/robot/ip/geneve.robot index ffbd506f1d..5edf4f4c17 100644 --- a/resources/libraries/robot/ip/geneve.robot +++ b/resources/libraries/robot/ip/geneve.robot @@ -20,8 +20,6 @@ | Initialize GENEVE L3 mode in circular topology | | [Documentation] | Initialization of GENEVE L3 mode on DUT1. | | -| | [Arguments] | ${with_bypass}=${False} -| | | | Set interfaces in path up | | | | VPP Interface Set IP Address @@ -35,40 +33,9 @@ | | ${next_index}= | VPP Add Graph Node Next | | ... | ${dut1} | geneve4-input | ethernet-input | | -| | ${src_ip_int} = | IP To Int | ${gen_tunnel.src_ip} -| | ${dst_ip_int} = | IP To Int | ${gen_tunnel.dst_ip} -| | ${if_ip_int} = | IP To Int | ${gen_tunnel.if_ip} +| | VPP GENEVE Add Multiple Tunnels +| | ... | ${dut1} | ${gen_tunnel} | ${n_tunnels} | ${DUT1_${int}1}[0] +| | ... | ${DUT1_${int}2}[0] | ${tg_if1_ip4} | ${tg_if2_ip4} +| | ... | ${TG_pf2_mac}[0] | ${next_index} | | -| | FOR | ${nr} | IN RANGE | 0 | ${n_tunnels} -| | | ${src_ip} = | Int To IP | ${${src_ip_int} + ${nr} * 256} -| | | ${dst_ip} = | Int To IP | ${${dst_ip_int} + ${nr} * 256} -| | | ${if_ip} = | Int To IP | ${${if_ip_int} + ${nr} * 256} -| | | Vpp Route Add -| | | ... | ${dut1} | ${src_ip} | ${gen_tunnel.ip_mask} -| | | ... | gateway=${tg_if1_ip4} | interface=${DUT1_${int}1}[0] -| | | ${tunnel_sw_index}= | Add Geneve Tunnel -| | | ... | ${dut1} | ${gen_tunnel.local} | ${gen_tunnel.remote} -| | | ... | ${${gen_tunnel.vni} + ${nr}} | l3_mode=${True} -| | | ... | next_index=${next_index} -| | | ${tunnel_if_key}= | Get Interface By SW Index -| | | ... | ${dut1} | ${tunnel_sw_index} -| | | ${tunnel_if_mac}= | Get Interface MAC -| | | ... | ${dut1} | ${tunnel_if_key} -| | | VPP Interface Set IP Address -| | | ... | ${dut1} | ${tunnel_if_key} | ${if_ip} | 24 -| | | VPP Add IP Neighbor -| | | ... | ${dut1} | ${tunnel_if_key} | ${tg_if2_ip4} | ${TG_pf2_mac}[0] -| | | Vpp Route Add -| | | ... | ${dut1} | ${dst_ip} | ${gen_tunnel.ip_mask} -| | | ... | gateway=${tg_if2_ip4} | interface=${tunnel_if_key} -| | | Vpp Route Add -| | | ... | ${dut1} | ${gen_tunnel.remote} | 32 -| | | ... | gateway=${tg_if2_ip4} | interface=${DUT1_${int}2}[0] -| | | VPP Add IP Neighbor -| | | ... | ${dut1} | ${tunnel_if_key} | ${gen_tunnel.local} | ${tunnel_if_mac} -| | | Vpp Route Add -| | | ... | ${dut1} | ${gen_tunnel.local} | 32 | gateway=${if_ip} -| | | Set Interface State -| | | ... | ${dut1} | ${tunnel_if_key} | up -| | END | | All VPP Interfaces Ready Wait | ${nodes} | retries=${60} -- 2.16.6