From 721f39743c31003ccbdad3c27ffcc3145bfccf90 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Thu, 7 Jul 2016 23:00:04 +0200 Subject: [PATCH] CSIT-199: Use static adjacencies in LISP dp tests Switch to using static adjacencies and remote mappings instead of only the latter in LISP data plane tests. Change-Id: Ia2a05165425ac68fa7839f9c8f402033b8274fcf Signed-off-by: Florin Coras --- resources/libraries/python/LispSetup.py | 59 ++++++++++++++++ resources/libraries/python/LispUtil.py | 2 +- ...c_mapping.robot => lisp_static_adjacency.robot} | 53 ++++++++------ .../templates/vat/lisp/add_lisp_adjacency.vat | 1 + .../lisp_static_adjacency.py} | 80 +++++++++++----------- tests/func/lisp/lisp_dataplane_untagged.robot | 29 ++++---- 6 files changed, 149 insertions(+), 75 deletions(-) rename resources/libraries/robot/lisp/{lisp_static_mapping.robot => lisp_static_adjacency.robot} (61%) create mode 100644 resources/templates/vat/lisp/add_lisp_adjacency.vat rename resources/test_data/lisp/{static_mapping/lisp_static_mapping.py => static_adjacency/lisp_static_adjacency.py} (59%) diff --git a/resources/libraries/python/LispSetup.py b/resources/libraries/python/LispSetup.py index 82e1a9787a..13d0501abb 100644 --- a/resources/libraries/python/LispSetup.py +++ b/resources/libraries/python/LispSetup.py @@ -103,6 +103,65 @@ class LispRemoteMapping(object): seid=seid, seid_prefix=seid_prefix, rloc=rloc) +class LispAdjacency(object): + """Class for lisp adjacency API.""" + + def __init__(self): + pass + + @staticmethod + def vpp_add_lisp_adjacency(node, vni, deid, deid_prefix, seid, + seid_prefix): + """Add lisp adjacency on the VPP node in topology. + + :param node: VPP node. + :param vni: Vni. + :param deid: Destination eid address. + :param deid_predix: Destination eid address prefix_len. + :param seid: Source eid address. + :param seid_prefix: Source eid address prefix_len. + :type node: dict + :type vni: int + :type deid: str + :type deid_prefix: int + :type seid: str + :type seid_prefix: int + """ + + VatExecutor.cmd_from_template(node, + 'lisp/add_lisp_adjacency.vat', + vni=vni, + deid=deid, + deid_prefix=deid_prefix, + seid=seid, + seid_prefix=seid_prefix) + + @staticmethod + def vpp_del_lisp_adjacency(node, vni, deid, deid_prefix, seid, + seid_prefix): + """Delete lisp adjacency on the VPP node in topology. + + :param node: VPP node. + :param vni: Vni. + :param deid: Destination eid address. + :param deid_predix: Destination eid address prefix_len. + :param seid: Source eid address. + :param seid_prefix: Source eid address prefix_len. + :type node: dict + :type vni: int + :type deid: str + :type deid_prefix: int + :type seid: str + :type seid_prefix: int + """ + + VatExecutor.cmd_from_template(node, + 'lisp/del_lisp_adjacency.vat', + vni=vni, + deid=deid, + deid_predix=deid_prefix, + seid=seid, + seid_prefix=seid_prefix) class LispGpeIface(object): diff --git a/resources/libraries/python/LispUtil.py b/resources/libraries/python/LispUtil.py index b21e1ae511..157702ade0 100644 --- a/resources/libraries/python/LispUtil.py +++ b/resources/libraries/python/LispUtil.py @@ -101,7 +101,7 @@ class LispUtil(object): for tmp in lisp_val1: if tmp not in lisp_val2: - raise RuntimeError('Value {} is not find in vpp:\n' + raise RuntimeError('Value {} not found in vpp:\n' '{}'.format(tmp, lisp_val2)) def lisp_locator_s_should_be_equal(self, locator_set1, locator_set2): diff --git a/resources/libraries/robot/lisp/lisp_static_mapping.robot b/resources/libraries/robot/lisp/lisp_static_adjacency.robot similarity index 61% rename from resources/libraries/robot/lisp/lisp_static_mapping.robot rename to resources/libraries/robot/lisp/lisp_static_adjacency.robot index 3c0668831d..79e26c5dc9 100644 --- a/resources/libraries/robot/lisp/lisp_static_mapping.robot +++ b/resources/libraries/robot/lisp/lisp_static_adjacency.robot @@ -12,16 +12,17 @@ # limitations under the License. *** Settings *** -| Documentation | Lisp State mapping suite keywords +| Documentation | Lisp static adjacency suite keywords | Resource | resources/libraries/robot/lisp/lisp_api.robot | Library | resources.libraries.python.LispSetup.LispLocatorSet | Library | resources.libraries.python.LispSetup.LispLocator | Library | resources.libraries.python.LispSetup.LispLocalEid +| Library | resources.libraries.python.LispSetup.LispAdjacency | Library | resources.libraries.python.LispSetup.LispRemoteMapping *** Keywords *** | Set up Lisp topology -| | [Documentation] | Set up Lisp static remote mapping topology. +| | [Documentation] | Set up Lisp static adjacency topology. | | ... | | ... | *Arguments:* | | ... | - dut1_node - DUT1 node. Type: dictionary @@ -30,11 +31,11 @@ | | ... | - dut2_node - DUT2 node. Type: dictionary | | ... | - dut2_int_name - DUT2 node interface name. Type: string | | ... | - dut2_int_index - DUT2 node interface index. Type: integer -| | ... | - locator_set - Locator set values. Type: dict -| | ... | - dut1_eid - Dut1 node eid address. Type: dict -| | ... | - dut2_eid - Dut2 node eid address. Type: dict -| | ... | - dut1_static_mapping - Dut1 static mapping address. Type: dict -| | ... | - dut2_static_mapping - Dut2 static mapping address. Type: dict +| | ... | - locator_set - Locator set values. Type: dictionary +| | ... | - dut1_eid - Dut1 node eid address. Type: dictionary +| | ... | - dut2_eid - Dut2 node eid address. Type: dictionary +| | ... | - dut1_static_adjacency - Dut1 static adjacency. Type: dictionary +| | ... | - dut2_static_adjacency - Dut2 static address. Type: dictionary | | ... | | ... | *Return:* | | ... | - No value returned @@ -43,12 +44,12 @@ | | ... | \| Set up Lisp topology \| ${dut1_node} \| ${interface_name} \ | | ... | \| None \| ${dut2_node} \| ${interface_name} \| None \ | | ... | \| ${locator_set} \| ${dut1_eid} \| ${dut2_eid} \ -| | ... | \| ${dut1_static_mapping} \| ${dut2_static_mapping} \| +| | ... | \| ${dut1_static_adjacency} \| ${dut2_static_adjacency} \| | | ... | | [Arguments] | ${dut1_node} | ${dut1_int_name} | ${dut1_int_index} | | ... | ${dut2_node} | ${dut2_int_name} | ${dut2_int_index} | | ... | ${locator_set} | ${dut1_eid} | ${dut2_eid} -| | ... | ${dut1_static_mapping} | ${dut2_static_mapping} +| | ... | ${dut1_static_adjacency} | ${dut2_static_adjacency} | | ${dut1_int_index}= | Run Keyword If | ${dut1_int_index} is None | | | ... | Get Interface Sw Index | ${dut1_node} | | | ... | ${dut1_int_name} @@ -65,12 +66,17 @@ | | Vpp Add Lisp Local Eid | ${dut1_node} | ${dut1_eid['locator_name']} | | ... | ${dut1_eid['vni']} | ${dut1_eid['eid']} | | ... | ${dut1_eid['prefix']} -| | Vpp Add Lisp Remote Mapping | ${dut1_node} | ${dut1_static_mapping['vni']} -| | ... | ${dut1_static_mapping['deid']} -| | ... | ${dut1_static_mapping['prefix']} -| | ... | ${dut1_static_mapping['seid']} -| | ... | ${dut1_static_mapping['prefix']} -| | ... | ${dut1_static_mapping['rloc']} +| | Vpp Add Lisp Remote Mapping | ${dut1_node} | ${dut1_static_adjacency['vni']} +| | ... | ${dut1_static_adjacency['deid']} +| | ... | ${dut1_static_adjacency['prefix']} +| | ... | ${dut1_static_adjacency['seid']} +| | ... | ${dut1_static_adjacency['prefix']} +| | ... | ${dut1_static_adjacency['rloc']} +| | Vpp Add Lisp Adjacency | ${dut1_node} | ${dut1_static_adjacency['vni']} +| | ... | ${dut1_static_adjacency['deid']} +| | ... | ${dut1_static_adjacency['prefix']} +| | ... | ${dut1_static_adjacency['seid']} +| | ... | ${dut1_static_adjacency['prefix']} | | Enable Lisp | ${dut2_node} | | Vpp Add Lisp Locator Set | ${dut2_node} | ${locator_set['locator_name']} | | Vpp Add Lisp Locator | ${dut2_node} | ${locator_set['locator_name']} @@ -79,9 +85,14 @@ | | Vpp Add Lisp Local Eid | ${dut2_node} | ${dut2_eid['locator_name']} | | ... | ${dut2_eid['vni']} | ${dut2_eid['eid']} | | ... | ${dut2_eid['prefix']} -| | Vpp Add Lisp Remote Mapping | ${dut2_node} | ${dut2_static_mapping['vni']} -| | ... | ${dut2_static_mapping['deid']} -| | ... | ${dut2_static_mapping['prefix']} -| | ... | ${dut2_static_mapping['seid']} -| | ... | ${dut2_static_mapping['prefix']} -| | ... | ${dut2_static_mapping['rloc']} \ No newline at end of file +| | Vpp Add Lisp Remote Mapping | ${dut2_node} | ${dut2_static_adjacency['vni']} +| | ... | ${dut2_static_adjacency['deid']} +| | ... | ${dut2_static_adjacency['prefix']} +| | ... | ${dut2_static_adjacency['seid']} +| | ... | ${dut2_static_adjacency['prefix']} +| | ... | ${dut2_static_adjacency['rloc']} +| | Vpp Add Lisp Adjacency | ${dut2_node} | ${dut2_static_adjacency['vni']} +| | ... | ${dut2_static_adjacency['deid']} +| | ... | ${dut2_static_adjacency['prefix']} +| | ... | ${dut2_static_adjacency['seid']} +| | ... | ${dut2_static_adjacency['prefix']} \ No newline at end of file diff --git a/resources/templates/vat/lisp/add_lisp_adjacency.vat b/resources/templates/vat/lisp/add_lisp_adjacency.vat new file mode 100644 index 0000000000..cdc993674c --- /dev/null +++ b/resources/templates/vat/lisp/add_lisp_adjacency.vat @@ -0,0 +1 @@ +lisp_add_del_adjacency add vni {vni} deid {deid}/{deid_prefix} seid {seid}/{seid_prefix} diff --git a/resources/test_data/lisp/static_mapping/lisp_static_mapping.py b/resources/test_data/lisp/static_adjacency/lisp_static_adjacency.py similarity index 59% rename from resources/test_data/lisp/static_mapping/lisp_static_mapping.py rename to resources/test_data/lisp/static_adjacency/lisp_static_adjacency.py index 94ff2c529c..de7aff068d 100644 --- a/resources/test_data/lisp/static_mapping/lisp_static_mapping.py +++ b/resources/test_data/lisp/static_adjacency/lisp_static_adjacency.py @@ -29,16 +29,16 @@ dut2_to_tg_ip4 = '6.0.2.1' tg1_ip4 = '6.0.1.2' tg2_ip4 = '6.0.2.2' prefix4 = 24 -dut1_ip4_static_mapping = {'vni': 0, - 'deid': '6.0.2.0', - 'seid': '6.0.1.0', - 'rloc': '6.0.3.2', - 'prefix': 24} -dut2_ip4_static_mapping = {'vni': 0, - 'deid': '6.0.1.0', - 'seid': '6.0.2.0', - 'rloc': '6.0.3.1', - 'prefix': 24} +dut1_to_dut2_ip4_static_adjacency = {'vni': 0, + 'deid': '6.0.2.0', + 'seid': '6.0.1.0', + 'rloc': '6.0.3.2', + 'prefix': 24} +dut2_to_dut1_ip4_static_adjacency = {'vni': 0, + 'deid': '6.0.1.0', + 'seid': '6.0.2.0', + 'rloc': '6.0.3.1', + 'prefix': 24} dut1_ip4_eid = {'locator_name': locator_name, 'vni': 0, 'eid': '6.0.1.0', @@ -56,16 +56,16 @@ dut2_to_tg_ip6 = '6:0:2::1' tg1_ip6 = '6:0:1::2' tg2_ip6 = '6:0:2::2' prefix6 = 64 -dut1_ip6_static_mapping = {'vni': 0, - 'deid': '6:0:2::0', - 'seid': '6:0:1::0', - 'rloc': '6:0:3::2', - 'prefix': 64} -dut2_ip6_static_mapping = {'vni': 0, - 'deid': '6:0:1::0', - 'seid': '6:0:2::0', - 'rloc': '6:0:3::1', - 'prefix': 64} +dut1_to_dut2_ip6_static_adjacency = {'vni': 0, + 'deid': '6:0:2::0', + 'seid': '6:0:1::0', + 'rloc': '6:0:3::2', + 'prefix': 64} +dut2_to_dut1_ip6_static_adjacency = {'vni': 0, + 'deid': '6:0:1::0', + 'seid': '6:0:2::0', + 'rloc': '6:0:3::1', + 'prefix': 64} dut1_ip6_eid = {'locator_name': locator_name, 'vni': 0, 'eid': '6:0:1::0', @@ -84,16 +84,16 @@ tg1_ip4o6 = '6.0.1.2' tg2_ip4o6 = '6.0.2.2' tg_prefix4o6 = 24 dut_prefix4o6 = 64 -dut1_ip4o6_static_mapping = {'vni': 0, - 'deid': '6.0.2.0', - 'seid': '6.0.1.0', - 'rloc': '6:0:3::2', - 'prefix': 24} -dut2_ip4o6_static_mapping = {'vni': 0, - 'deid': '6.0.1.0', - 'seid': '6.0.2.0', - 'rloc': '6:0:3::1', - 'prefix': 24} +dut1_ip4o6_static_adjacency = {'vni': 0, + 'deid': '6.0.2.0', + 'seid': '6.0.1.0', + 'rloc': '6:0:3::2', + 'prefix': 24} +dut2_ip4o6_static_adjacency = {'vni': 0, + 'deid': '6.0.1.0', + 'seid': '6.0.2.0', + 'rloc': '6:0:3::1', + 'prefix': 24} dut1_ip4o6_eid = {'locator_name': locator_name, 'vni': 0, 'eid': '6.0.1.0', @@ -112,16 +112,16 @@ tg1_ip6o4 = '6:0:1::2' tg2_ip6o4 = '6:0:2::2' tg_prefix6o4 = 64 dut_prefix6o4 = 24 -dut1_ip6o4_static_mapping = {'vni': 0, - 'deid': '6:0:2::0', - 'seid': '6:0:1::0', - 'rloc': '6.0.3.2', - 'prefix': 64} -dut2_ip6o4_static_mapping = {'vni': 0, - 'deid': '6:0:1::0', - 'seid': '6:0:2::0', - 'rloc': '6.0.3.1', - 'prefix': 64} +dut1_ip6o4_static_adjacency = {'vni': 0, + 'deid': '6:0:2::0', + 'seid': '6:0:1::0', + 'rloc': '6.0.3.2', + 'prefix': 64} +dut2_ip6o4_static_adjacency = {'vni': 0, + 'deid': '6:0:1::0', + 'seid': '6:0:2::0', + 'rloc': '6.0.3.1', + 'prefix': 64} dut1_ip6o4_eid = {'locator_name': locator_name, 'vni': 0, 'eid': '6:0:1::0', diff --git a/tests/func/lisp/lisp_dataplane_untagged.robot b/tests/func/lisp/lisp_dataplane_untagged.robot index 0808d366c6..1b33b4312e 100644 --- a/tests/func/lisp/lisp_dataplane_untagged.robot +++ b/tests/func/lisp/lisp_dataplane_untagged.robot @@ -16,13 +16,13 @@ | Resource | resources/libraries/robot/testing_path.robot | Resource | resources/libraries/robot/ipv4.robot | Resource | resources/libraries/robot/traffic.robot -| Resource | resources/libraries/robot/lisp/lisp_static_mapping.robot +| Resource | resources/libraries/robot/lisp/lisp_static_adjacency.robot | Resource | resources/libraries/robot/l2_traffic.robot | Library | resources.libraries.python.IPUtil | Library | resources.libraries.python.Trace | Library | resources.libraries.python.IPv4Util.IPv4Util # import additional Lisp settings from resource file -| Variables | resources/test_data/lisp/static_mapping/lisp_static_mapping.py +| Variables | resources/test_data/lisp/static_adjacency/lisp_static_adjacency.py | Force Tags | 3_NODE_SINGLE_LINK_TOPO | 3_NODE_DOUBLE_LINK_TOPO | ... | VM_ENV | HW_ENV | Test Setup | Run Keywords | Setup all DUTs before test @@ -30,7 +30,7 @@ | ... | AND | Update All Interface Data On All Nodes | ${nodes} | Test Teardown | Run Keywords | Show Packet Trace on All DUTs | ${nodes} | ... | AND | Show vpp trace dump on all DUTs -| Documentation | *LISP static remote mapping test cases* +| Documentation | *LISP static adjacency test cases* | ... | ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology | ... | with single links between nodes. @@ -55,7 +55,7 @@ | | [Documentation] | | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-LISP-IPv4-ICMPv4 on \ | | ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn. [Cfg] On DUT1 and DUT2 -| | ... | configure IPv4 LISP remote static mappings. [Ver] Make TG send +| | ... | configure IPv4 LISP static adjacencies. [Ver] Make TG send | | ... | ICMPv4 Echo Req between its interfaces across both DUTs and LISP | | ... | tunnel between them; verify IPv4 headers on received packets are | | ... | correct. [Ref] RFC6830. @@ -82,7 +82,8 @@ | | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE} | | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE} | | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid} -| | ... | ${dut1_ip4_static_mapping} | ${dut2_ip4_static_mapping} +| | ... | ${dut1_to_dut2_ip4_static_adjacency} +| | ... | ${dut2_to_dut1_ip4_static_adjacency} | | Then Send Packet And Check Headers | | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4} | | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} @@ -96,7 +97,7 @@ | | [Documentation] | | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv6-LISP-IPv6-ICMPv6 on \ | | ... | DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUTn. [Cfg] On DUT1 and DUT2 -| | ... | configure IPv6 LISP remote static mappings. [Ver] Make TG send +| | ... | configure IPv6 LISP static adjacencies. [Ver] Make TG send | | ... | ICMPv6 Echo Req between its interfaces across both DUTs and LISP | | ... | tunnel between them; verify IPv4 headers on received packets are | | ... | correct. [Ref] RFC6830. @@ -123,7 +124,8 @@ | | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE} | | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE} | | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid} -| | ... | ${dut1_ip6_static_mapping} | ${dut2_ip6_static_mapping} +| | ... | ${dut1_to_dut2_ip6_static_adjacency} +| | ... | ${dut2_to_dut1_ip6_static_adjacency} | | Then Send Packet And Check Headers | | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6} | | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} @@ -137,7 +139,7 @@ | | [Documentation] | | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv6-LISP-IPv4-ICMPv4 on \ | | ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn. [Cfg] On DUT1 and DUT2 -| | ... | configure IPv6 LISP remote static mappings. [Ver] Make TG send +| | ... | configure IPv6 LISP static adjacencies. [Ver] Make TG send | | ... | ICMPv4 Echo Req between its interfaces across both DUTs and LISP | | ... | tunnel between them; verify IPv4 headers on received packets are | | ... | correct. [Ref] RFC6830. @@ -164,7 +166,7 @@ | | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE} | | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE} | | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid} -| | ... | ${dut1_ip4o6_static_mapping} | ${dut2_ip4o6_static_mapping} +| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency} | | Then Send Packet And Check Headers | | ... | ${tg_node} | ${tg1_ip4o6} | ${tg2_ip4o6} | | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} @@ -178,7 +180,7 @@ | | [Documentation] | | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-LISP-IPv6-ICMPv6 on \ | | ... | DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUTn. [Cfg] On DUT1 and DUT2 -| | ... | configure IPv4 LISP remote static mappings. [Ver] Make TG send +| | ... | configure IPv4 LISP static adjacencies. [Ver] Make TG send | | ... | ICMPv6 Echo Req between its interfaces across both DUTs and LISP | | ... | tunnel between them; verify IPv4 headers on received packets are | | ... | correct. [Ref] RFC6830. @@ -205,7 +207,7 @@ | | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE} | | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE} | | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid} -| | ... | ${dut1_ip6o4_static_mapping} | ${dut2_ip6o4_static_mapping} +| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency} | | Then Send Packet And Check Headers | | ... | ${tg_node} | ${tg1_ip6o4} | ${tg2_ip6o4} | | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} @@ -219,7 +221,7 @@ | | [Documentation] | | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-LISP-IPv4-ICMPv4 on \ | | ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn. [Cfg1] On DUT1 and DUT2 -| | ... | configure IPv4 LISP remote static mappings. [Ver1] Make TG send +| | ... | configure IPv4 LISP static adjacencies. [Ver1] Make TG send | | ... | ICMPv4 Echo Req between its interfaces across both DUTs and LISP | | ... | tunnel between them; verify IPv4 headers on received packets are | | ... | correct. [Cfg2] Disable LISP. [Ver2] verify packets are not @@ -248,7 +250,8 @@ | | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE} | | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE} | | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid} -| | ... | ${dut1_ip4_static_mapping} | ${dut2_ip4_static_mapping} +| | ... | ${dut1_to_dut2_ip4_static_adjacency} +| | ... | ${dut2_to_dut1_ip4_static_adjacency} | | Then Send Packet And Check Headers | | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4} | | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} -- 2.16.6