aboutsummaryrefslogtreecommitdiffstats
path: root/tests/vpp
diff options
context:
space:
mode:
authorTibor Frank <tifrank@cisco.com>2017-06-20 13:57:08 +0200
committerTibor Frank <tifrank@cisco.com>2017-06-29 12:17:28 +0000
commit6721e7f09aa95bff6622068332a3f56afad9c87b (patch)
tree37ef7f40e53f740a62830ab46142aa87342dc56b /tests/vpp
parent859157b5db45927c7b4bb0b2d575e68805777a86 (diff)
CSIT-687: Directory structure reorganization
Change-Id: I772c9e214be2461adf58124998d272e7d795220f Signed-off-by: Tibor Frank <tifrank@cisco.com> Signed-off-by: Maciek Konstantynowicz <mkonstan@cisco.com>
Diffstat (limited to 'tests/vpp')
-rw-r--r--tests/vpp/func/__init__.robot20
-rw-r--r--tests/vpp/func/crypto/eth2p-ethip4ipsectnl-ip4base-func.robot523
-rw-r--r--tests/vpp/func/crypto/eth2p-ethip4ipsectpt-ip4base-func.robot487
-rw-r--r--tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip4base-func.robot269
-rw-r--r--tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip6base-func.robot160
-rw-r--r--tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip6basevrf-func.robot133
-rw-r--r--tests/vpp/func/crypto/eth2p-ethip6ipsectnl-ip6base-func.robot523
-rw-r--r--tests/vpp/func/crypto/eth2p-ethip6ipsectpt-ip6base-func.robot487
-rw-r--r--tests/vpp/func/crypto/eth2p-ethip6ipsectptlispgpe-ip4base-func.robot158
-rw-r--r--tests/vpp/func/crypto/eth2p-ethip6ipsectptlispgpe-ip6base-func.robot174
-rw-r--r--tests/vpp/func/honeycomb/__init__.robot27
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-acl-apihc-apivat-func.robot169
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-dhcp-apihc-apivat-func.robot131
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-int-apihcnc-func.robot76
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-int-subint-apihc-apivat-func.robot609
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-intip4-intip6-apihc-apivat-func.robot293
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-inttap-apihc-apivat-func.robot79
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-intvhost-apihc-apivat-func.robot163
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-l2bd-apihc-apivat-func.robot116
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-l2fib-apihc-apivat-func.robot232
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-lisp-apihc-apivat-func.robot224
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-nsh-apihc-apivat-func.robot147
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-pbb-apihc-apivat-func.robot86
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot742
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-policer-apihc-func.robot144
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-proxyarp-apihc-func.robot89
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-proxynd6-apihc-func.robot117
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-routing-apihc-apivat-func.robot231
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot138
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-snat44-apihc-apivat-func.robot105
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot260
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-vxlan-apihc-apivat-func.robot139
-rw-r--r--tests/vpp/func/honeycomb/mgmt-cfg-vxlangpe-apihc-apivat-func.robot168
-rw-r--r--tests/vpp/func/honeycomb/mgmt-notif-apihcnc-func.robot68
-rw-r--r--tests/vpp/func/honeycomb/mgmt-statepersist-apihc-func.robot169
-rw-r--r--tests/vpp/func/interfaces/api-crud-tap-func.robot72
-rw-r--r--tests/vpp/func/interfaces/eth2p-eth-l2bdbasemaclrn-eth-2tap-func.robot88
-rw-r--r--tests/vpp/func/interfaces/eth2p-eth-l2bdbasemaclrn-l2shg-eth-2tap-func.robot176
-rw-r--r--tests/vpp/func/interfaces/eth2p-ethip4-ip4base-eth-1tap-func.robot126
-rw-r--r--tests/vpp/func/ip4/eth2p-dot1q-ip4base-func.robot107
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-copblklistbase-func.robot92
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-copwhlistbase-func.robot92
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-func.robot138
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-iaclbase-func.robot524
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4arp-func.robot82
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpclient-func.robot117
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpproxy-func.robot93
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4ecmp-func.robot74
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4proxyarp-func.robot156
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-ipolicemarkbase-func.robot162
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-rpf-func.robot134
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4basevrf-func.robot391
-rw-r--r--tests/vpp/func/ip4_tunnels/gre/eth2p-ethip4gre-ip4base-func.robot306
-rw-r--r--tests/vpp/func/ip4_tunnels/lisp/api-crud-lisp-func.robot116
-rw-r--r--tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lisp-ip4base-func.robot124
-rw-r--r--tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lisp-l2bdbasemaclrn-func.robot95
-rw-r--r--tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip4base-func.robot104
-rw-r--r--tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip4basevrf-func.robot109
-rw-r--r--tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip6base-func.robot120
-rw-r--r--tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip6basevrf-func.robot110
-rw-r--r--tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swirelw46-func.robot209
-rw-r--r--tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swiremape-func.robot483
-rw-r--r--tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swiremapt-func.robot135
-rw-r--r--tests/vpp/func/ip4_tunnels/vxlan/eth2p-dot1qip4vxlan-l2bdbasemaclrn-func.robot74
-rw-r--r--tests/vpp/func/ip4_tunnels/vxlan/eth2p-ethip4vxlan-l2bdbasemaclrn-func.robot78
-rw-r--r--tests/vpp/func/ip4_tunnels/vxlan/eth2p-ethip4vxlan-l2xcbase-func.robot66
-rw-r--r--tests/vpp/func/ip4_tunnels/vxlan/eth4p-ethip4vxlan-l2bdbasemaclrn-l2shg-func.robot200
-rw-r--r--tests/vpp/func/ip6/eth2p-ethip6-ip6base-copblklistbase-func.robot101
-rw-r--r--tests/vpp/func/ip6/eth2p-ethip6-ip6base-copwhlistbase-func.robot101
-rw-r--r--tests/vpp/func/ip6/eth2p-ethip6-ip6base-func.robot120
-rw-r--r--tests/vpp/func/ip6/eth2p-ethip6-ip6base-iaclbase-func.robot577
-rw-r--r--tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6dhcpproxy-func.robot66
-rw-r--r--tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6ecmp-func.robot74
-rw-r--r--tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6ra-func.robot107
-rw-r--r--tests/vpp/func/ip6/eth2p-ethip6-ip6base-ipolicemarkbase-func.robot161
-rw-r--r--tests/vpp/func/ip6/eth2p-ethip6-ip6basevrf-func.robot409
-rw-r--r--tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lisp-l2bdbasemaclrn-func.robot96
-rw-r--r--tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip4base-func.robot108
-rw-r--r--tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip6base-func.robot107
-rw-r--r--tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip6basevrf-func.robot112
-rw-r--r--tests/vpp/func/ip6_tunnels/vxlan/eth2p-ethip6vxlan-l2bdbasemaclrn-func.robot80
-rw-r--r--tests/vpp/func/ip6_tunnels/vxlan/eth4p-ethip6vxlan-l2bdbasemaclrn-l2shg-func.robot203
-rw-r--r--tests/vpp/func/l2bd/eth2p-dot1ad--dot1q-l2bdbasemaclrn-vlantrans21-func.robot221
-rw-r--r--tests/vpp/func/l2bd/eth2p-dot1ad-l2bdbasemaclrn-vlantrans22-func.robot405
-rw-r--r--tests/vpp/func/l2bd/eth2p-dot1q--dot1ad-l2bdbasemaclrn-vlantrans12-func.robot394
-rw-r--r--tests/vpp/func/l2bd/eth2p-dot1q-l2bdbasemaclrn-vlantrans11-func.robot206
-rw-r--r--tests/vpp/func/l2bd/eth2p-eth-l2bdbasemaclrn-func.robot91
-rw-r--r--tests/vpp/func/l2bd/eth2p-eth-l2bdbasemacstc-func.robot85
-rw-r--r--tests/vpp/func/l2bd/eth4p-eth-l2bdbasemaclrn-l2shg-func.robot86
-rw-r--r--tests/vpp/func/l2xc/eth2p-dot1ad--dot1q-l2xcbase-vlantrans21-func.robot189
-rw-r--r--tests/vpp/func/l2xc/eth2p-dot1ad-l2xcbase-func.robot69
-rw-r--r--tests/vpp/func/l2xc/eth2p-dot1ad-l2xcbase-vlantrans22-func.robot346
-rw-r--r--tests/vpp/func/l2xc/eth2p-dot1q--dot1ad-l2xcbase-vlantrans12-func.robot335
-rw-r--r--tests/vpp/func/l2xc/eth2p-dot1q-l2xcbase-vlantrans11-func.robot171
-rw-r--r--tests/vpp/func/l2xc/eth2p-eth-l2xcbase-func.robot74
-rw-r--r--tests/vpp/func/l2xc/eth2p-eth-l2xcbase-iaclbase-func.robot144
-rw-r--r--tests/vpp/func/telemetry/eth2p-ethip4-ip4base-ip4ipfixbase-func.robot201
-rw-r--r--tests/vpp/func/telemetry/eth2p-ethip4-ip4base-ip4ipfixscale-func.robot111
-rw-r--r--tests/vpp/func/telemetry/eth2p-ethip4-ip4base-spanrx-func.robot79
-rw-r--r--tests/vpp/func/telemetry/eth2p-ethip6-ip6base-ip6ipfixbase-func.robot198
-rw-r--r--tests/vpp/func/telemetry/eth2p-ethip6-ip6base-ip6ipfixscale-func.robot127
-rw-r--r--tests/vpp/func/telemetry/eth2p-ethip6-ip6base-spanrx-func.robot64
-rw-r--r--tests/vpp/func/vm_vhost/ip4/eth2p-ethip4-ip4base-eth-2vhost-1vm.robot98
-rw-r--r--tests/vpp/func/vm_vhost/ip4/eth2p-ethip4ipsectptlispgpe-ip4base-eth-2vhost-1vm-func.robot209
-rw-r--r--tests/vpp/func/vm_vhost/ip4/eth2p-ethip4ipsectptlispgpe-ip6base-eth-2vhost-1vm-func.robot185
-rw-r--r--tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip4base-eth-2vhost-1vm-func.robot121
-rw-r--r--tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip4basevrf-eth-2vhost-1vm-func.robot133
-rw-r--r--tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip6base-eth-2vhost-1vm-func.robot117
-rw-r--r--tests/vpp/func/vm_vhost/ip6/eth2p-ethip6ipsectptlispgpe-ip4base-eth-2vhost-1vm-func.robot183
-rw-r--r--tests/vpp/func/vm_vhost/ip6/eth2p-ethip6ipsectptlispgpe-ip6base-eth-2vhost-1vm-func.robot201
-rw-r--r--tests/vpp/func/vm_vhost/ip6/eth2p-ethip6lispgpe-ip6base-eth-2vhost-1vm-func.robot131
-rw-r--r--tests/vpp/func/vm_vhost/ip6/eth2p-ethip6lispgpe-ip6basevrf-eth-2vhost-1vm-func.robot138
-rw-r--r--tests/vpp/func/vm_vhost/l2bd/eth2p-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-func.robot145
-rw-r--r--tests/vpp/func/vm_vhost/l2bd/eth2p-dot1q-l2bdbasemaclrn-eth-4vhost-2vm-fds-provider-nets-func.robot341
-rw-r--r--tests/vpp/func/vm_vhost/l2bd/eth2p-eth-l2bdbasemaclrn-eth-2vhost-1vm-func.robot110
-rw-r--r--tests/vpp/func/vm_vhost/l2bd/eth2p-eth-l2bdbasemacstc-eth-2vhost-1vm-func.robot151
-rw-r--r--tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4-l2bdbase-vhost-client-reconnect-2vm-func.robot231
-rw-r--r--tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4vxlan-l2bdbasemaclrn--eth-4vhost-2vm-fds-tenant-nets-func.robot333
-rw-r--r--tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot116
-rw-r--r--tests/vpp/func/vm_vhost/l2bd/eth2p-ethip6vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot119
-rw-r--r--tests/vpp/func/vm_vhost/l2xc/eth2p-eth-l2xcbase-eth-2vhost-1vm-func.robot93
-rw-r--r--tests/vpp/perf/__init__.robot45
-rw-r--r--tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrpdrdisc.robot337
-rw-r--r--tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot333
-rw-r--r--tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot361
-rw-r--r--tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot357
-rw-r--r--tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrpdrdisc.robot337
-rw-r--r--tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot333
-rw-r--r--tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot361
-rw-r--r--tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot357
-rw-r--r--tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrpdrdisc.robot374
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrchk.robot260
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrpdrdisc.robot569
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-iacldstbase-ndrchk.robot332
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-iacldstbase-ndrpdrdisc.robot713
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ipolicemarkbase-ndrchk.robot226
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ipolicemarkbase-ndrpdrdisc.robot517
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ndrchk.robot198
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ndrpdrdisc.robot489
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-pdrchk.robot190
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-snat-ndrpdrdisc.robot227
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale200k-ndrchk.robot201
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale200k-ndrpdrdisc.robot457
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale20k-ndrchk.robot210
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale20k-ndrpdrdisc.robot457
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-ndrchk.robot210
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-ndrpdrdisc.robot457
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-pdrchk.robot185
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4base-udpsrcscale15-snat-ndrpdrdisc.robot229
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale10-udpsrcscale15-snat-ndrpdrdisc.robot230
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale100-udpsrcscale15-snat-ndrpdrdisc.robot230
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale1000-udpsrcscale15-snat-ndrpdrdisc.robot230
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale2000-udpsrcscale15-snat-ndrpdrdisc.robot124
-rw-r--r--tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale4000-udpsrcscale15-snat-ndrpdrdisc.robot124
-rw-r--r--tests/vpp/perf/ip4/40ge2p1xl710-ethip4-ip4base-ndrpdrdisc.robot257
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-ndrchk.robot266
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-ndrpdrdisc.robot595
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-pdrchk.robot193
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-ndrchk.robot266
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-ndrpdrdisc.robot596
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-pdrchk.robot193
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-ndrpdrdisc.robot487
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-pdrchk.robot186
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-ndrchk.robot190
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-ndrpdrdisc.robot432
-rw-r--r--tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-pdrchk.robot186
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrchk.robot256
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrpdrdisc.robot565
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-iacldstbase-ndrchk.robot210
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-iacldstbase-ndrpdrdisc.robot474
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-ndrchk.robot191
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-ndrpdrdisc.robot436
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-pdrchk.robot183
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale200k-ndrchk.robot201
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale200k-ndrpdrdisc.robot457
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale20k-ndrchk.robot201
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale20k-ndrpdrdisc.robot457
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-ndrchk.robot210
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-ndrpdrdisc.robot457
-rw-r--r--tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-pdrchk.robot185
-rw-r--r--tests/vpp/perf/ip6/40ge2p1xl710-ethip6-ip6base-ndrpdrdisc.robot183
-rw-r--r--tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-ndrchk.robot266
-rw-r--r--tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-ndrpdrdisc.robot596
-rw-r--r--tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-pdrchk.robot193
-rw-r--r--tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-ndrchk.robot266
-rw-r--r--tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-ndrpdrdisc.robot596
-rw-r--r--tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-pdrchk.robot193
-rw-r--r--tests/vpp/perf/l2/10ge2p1vic1227-eth-l2bdbasemaclrn-ndrpdrdisc.robot288
-rw-r--r--tests/vpp/perf/l2/10ge2p1x520-dot1ad-l2xcbase-ndrchk.robot279
-rw-r--r--tests/vpp/perf/l2/10ge2p1x520-dot1ad-l2xcbase-ndrpdrdisc.robot606
-rw-r--r--tests/vpp/perf/l2/10ge2p1x520-dot1q-l2xcbase-ndrchk.robot266
-rw-r--r--tests/vpp/perf/l2/10ge2p1x520-dot1q-l2xcbase-ndrpdrdisc.robot584
-rw-r--r--tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-ndrchk.robot192
-rw-r--r--tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-ndrpdrdisc.robot274
-rw-r--r--tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-pdrchk.robot184
-rw-r--r--tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-ndrchk.robot192
-rw-r--r--tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-ndrpdrdisc.robot483
-rw-r--r--tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-pdrchk.robot184
-rw-r--r--tests/vpp/perf/l2/10ge2p1x710-eth-l2bdbasemaclrn-ndrpdrdisc.robot274
-rw-r--r--tests/vpp/perf/l2/40ge2p1vic1385-eth-l2bdbasemaclrn-ndrpdrdisc.robot352
-rw-r--r--tests/vpp/perf/l2/40ge2p1xl710-eth-l2bdbasemaclrn-ndrpdrdisc.robot232
-rw-r--r--tests/vpp/perf/l2/40ge2p1xl710-eth-l2xcbase-ndrpdrdisc.robot251
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot705
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk.robot212
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot684
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk.robot209
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot623
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot548
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot621
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-pdrchk.robot208
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot549
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-ndrpdrdisc.robot658
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-pdrchk.robot209
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot550
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot675
-rw-r--r--tests/vpp/perf/vm_vhost/10ge2p1x710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot658
-rw-r--r--tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot660
-rw-r--r--tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot588
-rw-r--r--tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot588
-rw-r--r--tests/vpp/perf/vm_vhost/40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot588
220 files changed, 56839 insertions, 0 deletions
diff --git a/tests/vpp/func/__init__.robot b/tests/vpp/func/__init__.robot
new file mode 100644
index 0000000000..0e4c9d6a82
--- /dev/null
+++ b/tests/vpp/func/__init__.robot
@@ -0,0 +1,20 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Library | resources.libraries.python.SetupFramework
+| Suite Setup | Run Keywords | Setup Framework | ${nodes}
+| ... | AND | Setup All DUTs | ${nodes}
+| ... | AND | Update All Interface Data On All Nodes | ${nodes}
diff --git a/tests/vpp/func/crypto/eth2p-ethip4ipsectnl-ip4base-func.robot b/tests/vpp/func/crypto/eth2p-ethip4ipsectnl-ip4base-func.robot
new file mode 100644
index 0000000000..814d8ee45c
--- /dev/null
+++ b/tests/vpp/func/crypto/eth2p-ethip4ipsectnl-ip4base-func.robot
@@ -0,0 +1,523 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | 3_NODE_DOUBLE_LINK_TOPO
+| ... | VM_ENV | HW_ENV | SKIP_VPP_PATCH
+| ...
+| Test Setup | Set up IPv4 IPSec functional test
+| ...
+| Test Teardown | Tear down IPSec functional test | ${dut_node}
+| ...
+| Documentation | *IPv4 IPsec tunnel mode test suite.*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1 2-node topology with one link\
+| ... | between nodes.
+| ... | *[Cfg] DUT configuration:* On DUT1 create loopback interface, configure\
+| ... | loopback an physical interface IPv4 addresses, static ARP record, route\
+| ... | and IPsec manual keyed connection in tunnel mode.
+| ... | *[Ver] TG verification:* ESP packet is sent from TG to DUT1. ESP packet\
+| ... | is received on TG from DUT1.
+| ... | *[Ref] Applicable standard specifications:* RFC4303.
+
+*** Variables ***
+| ${tg_spi}= | ${1000}
+| ${dut_spi}= | ${1001}
+| ${ESP_PROTO}= | ${50}
+| ${tg_if_ip4}= | 192.168.100.2
+| ${dut_if_ip4}= | 192.168.100.3
+| ${tg_lo_ip4}= | 192.168.3.3
+| ${dut_lo_ip4}= | 192.168.4.4
+| ${ip4_plen}= | ${24}
+
+*** Test Cases ***
+| TC01: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC02: VPP process ESP packet in Tunnel Mode with AES-CBC-192 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC03: VPP process ESP packet in Tunnel Mode with AES-CBC-256 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC04: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-256-128 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC05: VPP process ESP packet in Tunnel Mode with AES-CBC-192 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-256-128 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC06: VPP process ESP packet in Tunnel Mode with AES-CBC-256 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-256-128 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC07: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-384-192 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC08: VPP process ESP packet in Tunnel Mode with AES-CBC-192 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-384-192 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC09: VPP process ESP packet in Tunnel Mode with AES-CBC-256 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-384-192 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC10: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-512-256 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC11: VPP process ESP packet in Tunnel Mode with AES-CBC-192 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-512-256 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC12: VPP process ESP packet in Tunnel Mode with AES-CBC-256 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-512-256 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC13: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity - different encryption alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send an ESP packet encrypted by encryption key different from\
+| | ... | encryption key stored on VPP node from TG to VPP node and expect no\
+| | ... | response to be received on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC14: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity - different integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key different\
+| | ... | from integrity key stored on VPP node from TG to VPP node and expect\
+| | ... | no response to be received on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC15: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity - different encryption and integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key and encrypted\
+| | ... | by encryption key different from integrity and encryption keys stored\
+| | ... | on VPP node from TG to VPP node and expect no response to be received\
+| | ... | on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC16: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node before\
+| | ... | and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${new_encr_key} | ${auth_alg} | ${new_auth_key}
+| | ... | ${tg_spi} | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC17: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different encryption alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet encrypted by encryption key different from\
+| | ... | encryption key stored on VPP node from TG to VPP node and expect no\
+| | ... | response to be received on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${new_auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC18: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key different\
+| | ... | from integrity key stored on VPP node from TG to VPP node and expect\
+| | ... | no response to be received on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${new_encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC19: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different encryption and integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key and encrypted\
+| | ... | by encryption key different from integrity and encryption keys stored\
+| | ... | on VPP node from TG to VPP node and expect no response to be received\
+| | ... | on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+*** Keywords ***
+| Get Second Random String
+| | [Arguments] | ${req_alg} | ${req_type}
+| | ${req_key_len}= | Run Keyword | Get ${req_type} Alg Key Len | ${req_alg}
+| | ${key}= | Set Variable If | '${req_type}' == 'Crypto' | ${encr_key}
+| | ... | '${req_type}' == 'Integ' | ${auth_key}
+| | :FOR | ${index} | IN RANGE | 100
+| | | ${req_key}= | Generate Random String | ${req_key_len}
+| | | Return From Keyword If | '${req_key}' != '${key}' | ${req_key}
diff --git a/tests/vpp/func/crypto/eth2p-ethip4ipsectpt-ip4base-func.robot b/tests/vpp/func/crypto/eth2p-ethip4ipsectpt-ip4base-func.robot
new file mode 100644
index 0000000000..e599cf9506
--- /dev/null
+++ b/tests/vpp/func/crypto/eth2p-ethip4ipsectpt-ip4base-func.robot
@@ -0,0 +1,487 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | 3_NODE_DOUBLE_LINK_TOPO
+| ... | VM_ENV | HW_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up IPv4 IPSec functional test
+| ...
+| Test Teardown | Tear down IPSec functional test | ${dut_node}
+| ...
+| Documentation | *IPv4 IPsec transport mode test suite.*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1 2-node topology with one link\
+| ... | between nodes.
+| ... | *[Cfg] DUT configuration:* On DUT1 create loopback interface, configure\
+| ... | loopback an physical interface IPv4 addresses, static ARP record, route\
+| ... | and IPsec manual keyed connection in transport mode.
+| ... | *[Ver] TG verification:* ESP packet is sent from TG to DUT1. ESP packet\
+| ... | is received on TG from DUT1.
+| ... | *[Ref] Applicable standard specifications:* RFC4303.
+
+*** Variables ***
+| ${tg_spi}= | ${1000}
+| ${dut_spi}= | ${1001}
+| ${ESP_PROTO}= | ${50}
+| ${tg_if_ip4}= | 192.168.100.2
+| ${dut_if_ip4}= | 192.168.100.3
+| ${tg_lo_ip4}= | 192.168.3.3
+| ${dut_lo_ip4}= | 192.168.4.4
+| ${ip4_plen}= | ${24}
+
+*** Test Cases ***
+| TC01: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC02: VPP process ESP packet in Transport Mode with AES-CBC-192 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA1-96 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC03: VPP process ESP packet in Transport Mode with AES-CBC-256 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA1-96 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC04: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-256-128 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC05: VPP process ESP packet in Transport Mode with AES-CBC-192 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-256-128 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC06: VPP process ESP packet in Transport Mode with AES-CBC-256 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-256-128 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC07: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-384-192 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC08: VPP process ESP packet in Transport Mode with AES-CBC-192 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-384-192 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC09: VPP process ESP packet in Transport Mode with AES-CBC-256 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-384-192 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC10: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-512-256 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC11: VPP process ESP packet in Transport Mode with AES-CBC-192 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-512-256 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC12: VPP process ESP packet in Transport Mode with AES-CBC-256 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-512-256 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+
+| TC13: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity - different encryption alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode.
+| | ... | [Ver] Send an ESP packet encrypted by encryption key different from\
+| | ... | encryption key stored on VPP node from TG to VPP node and expect no\
+| | ... | response to be received on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC14: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity - different integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key different\
+| | ... | from integrity key stored on VPP node from TG to VPP node and expect\
+| | ... | no response to be received on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC15: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity - different encryption and integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key and encrypted\
+| | ... | by encryption key different from integrity and encryption keys stored\
+| | ... | on VPP node from TG to VPP node and expect no response to be received\
+| | ... | on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC16: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node before\
+| | ... | and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${new_encr_key} | ${auth_alg} | ${new_auth_key}
+| | ... | ${tg_spi} | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC17: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different encryption alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet encrypted by encryption key different from\
+| | ... | encryption key stored on VPP node from TG to VPP node and expect no\
+| | ... | response to be received on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${new_auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC18: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key different\
+| | ... | from integrity key stored on VPP node from TG to VPP node and expect\
+| | ... | no response to be received on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${new_encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC19: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different encryption and integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key and encrypted\
+| | ... | by encryption key different from integrity and encryption keys stored\
+| | ... | on VPP node from TG to VPP node and expect no response to be received\
+| | ... | on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+*** Keywords ***
+| Get Second Random String
+| | [Arguments] | ${req_alg} | ${req_type}
+| | ${req_key_len}= | Run Keyword | Get ${req_type} Alg Key Len | ${req_alg}
+| | ${key}= | Set Variable If | '${req_type}' == 'Crypto' | ${encr_key}
+| | ... | '${req_type}' == 'Integ' | ${auth_key}
+| | :FOR | ${index} | IN RANGE | 100
+| | | ${req_key}= | Generate Random String | ${req_key_len}
+| | | Return From Keyword If | '${req_key}' != '${key}' | ${req_key}
diff --git a/tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip4base-func.robot b/tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip4base-func.robot
new file mode 100644
index 0000000000..c77fb69c5c
--- /dev/null
+++ b/tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip4base-func.robot
@@ -0,0 +1,269 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.QemuUtils
+| Library | resources.libraries.python.VPPUtil
+| Library | resources.libraries.python.IPsecUtil
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/overlay/l2lisp.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv4_ipsec_lispgpe_ipv4/ipv4_ipsec_lispgpe_ipv4.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP | SKIP_VPP_PATCH
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test
+| ...
+| Documentation | *IPv4-ip4-ipsec-lispgpe-ip4 - main fib, vrf (gpe_vni-to-vrf)*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* ICMPv4-IPv4-IPSec-LISPGPE-IPv4-ICMPv4.
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with LISP and IPsec.\
+| ... | IPsec is in transport mode. Tests cases are for IPsec configured both\
+| ... | on RLOC interface or lisp_gpe0 interface.
+| ... | *[Ver] TG verification:* Packet is send from TG(if1) across the DUT1 to\
+| ... | DUT2 where it is forwarded to TG(if2).
+| ... | *[Ref] Applicable standard specifications:* RFC6830, RFC4303.
+
+*** Variables ***
+| ${dut2_spi}= | ${1000}
+| ${dut1_spi}= | ${1001}
+
+| ${ESP_PROTO}= | ${50}
+
+| ${bid}= | 10
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using IPsec (transport) on RLOC Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-IPSec-LISPGPE-IPv4-ICMPv4 on DUT1-DUT2,\
+| | ... | Eth-IPv4-ICMPv4 on TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTs.
+| | ... | [Ver] Case: ip4-lispgpe-ipsec-ip4 - main fib
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup 3-node Topology
+| | And Add IP Neighbors
+| | And Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip4} | ${dut2_to_dut1_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip4} | ${dut1_to_dut2_ip4}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+| TC02: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using IPsec (transport) lisp_gpe0 Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-IPSec-LISPGPE-IPv4-ICMPv4 on DUT1-DUT2,\
+| | ... | Eth-IPv4-ICMPv4 on TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTs.
+| | ... | [Ver] Case: ip4-ipsec-lispgpe-ip4 - main fib
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup 3-node Topology
+| | And Add IP Neighbors
+| | And Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | ${lisp_if_idx}= | resources.libraries.python.InterfaceUtil.Get sw if index
+| | ... | ${dut1_node} | lisp_gpe0
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${lisp_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi} | ${tg1_ip4}
+| | ... | ${tg2_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${lisp_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi} | ${tg2_ip4}
+| | ... | ${tg1_ip4}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+| TC03: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using IPsec (transport) on RLOC Int and VRF on EID is enabled.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-IPSec-LISPGPE-IPv4-ICMPv4 on DUT1-DUT2,\
+| | ... | Eth-IPv4-ICMPv4 on TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTs.
+| | ... | [Ver] Case: ip4-lispgpe-ipsec-ip4 - vrf, main fib
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup 3-node Topology | ${fib_table_1}
+| | And Add IP Neighbors
+| | When Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | ... | ${dut1_dut2_vni} | ${fib_table_1}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip4} | ${dut2_to_dut1_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip4} | ${dut1_to_dut2_ip4}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+| TC04: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using IPsec (transport) on lisp_gpe0 Int and VRF is enabled.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-IPSec-LISPGPE-IPv4-ICMPv4 on DUT1-DUT2,\
+| | ... | Eth-IPv4-ICMPv4 on TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTs.
+| | ... | [Ver] Case: ip4-ipsec-lispgpe-ip4 - vrf, main fib
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup 3-node Topology | ${fib_table_1}
+| | And Add IP Neighbors
+| | And Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | ... | ${dut1_dut2_vni} | ${fib_table_1}
+| | When Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${lisp_if_idx}= | resources.libraries.python.InterfaceUtil.Get sw if index
+| | ... | ${dut1_node} | lisp_gpe0
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${lisp_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi} | ${tg1_ip4}
+| | ... | ${tg2_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${lisp_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi} | ${tg2_ip4}
+| | ... | ${tg1_ip4}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup 3-node Topology
+| | [Documentation]
+| | ... | Setup 3-node topology for this test suite. Set all physical\
+| | ... | interfaces up and assing IP adresses to them.\
+| | ... | You can specify fib table ID where the DUT-TG interfaces assign to.\
+| | ... | Default is 0.
+| | ...
+| | [Arguments] | ${fib_table}=0
+| | Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Set interfaces in 3-node circular topology up
+| | Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${fib_table}
+| | Assign Interface To Fib Table | ${dut2_node}
+| | ... | ${dut2_to_tg} | ${fib_table}
+| | Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip4}
+| | ... | ${prefix4}
+| | Set Interface Address | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip4}
+| | ... | ${prefix4}
+| | Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip4}
+| | ... | ${prefix4}
+| | Set Interface Address | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip4}
+| | ... | ${prefix4}
+
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | ... | ${dut1_to_dut2_mac}
diff --git a/tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip6base-func.robot b/tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip6base-func.robot
new file mode 100644
index 0000000000..550c9405cc
--- /dev/null
+++ b/tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip6base-func.robot
@@ -0,0 +1,160 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.L2Util
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.IPsecUtil
+| Library | resources.libraries.python.VatJsonUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.QemuUtils
+| Library | resources.libraries.python.VPPUtil
+| Library | String
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv6_lispgpe_ipv4/ipv6_lispgpe_ipsec_ipv4.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP | SKIP_VPP_PATCH
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test
+| ...
+| Documentation | *IPv6 - ip4-ipsec-lispgpe-ip6 - main fib, vrf, virt2lisp,\
+| ... | phy2lisp*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISPGPE-IPSec-IPv6-ICMP,\
+| ... | Eth-IPv4-IPSec-LISPGPE-IPv6-ICMP
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with LISP and IPsec.\
+| ... | IPsec is in transport mode. Tests cases are for IPsec configured both\
+| ... | on RLOC interface or lisp_gpe0 interface.
+| ... | *[Ver] TG verification:* Packet is send from TG(if1) across the DUT1 to\
+| ... | DUT2 where it is forwarded to TG(if2).
+| ... | *[Ref] Applicable standard specifications:* RFC6830, RFC4303.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using IPsec (transport) on RLOC Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-LISPGPE-IPSec-IPv6-ICMP on DUT1-DUT2, Eth-IPv6-ICMP\
+| | ... | on TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology And Lisp
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip4} | ${dut2_to_dut1_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip4} | ${dut1_to_dut2_ip4}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+| TC02: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using IPsec (transport) on lisp_gpe0 Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-IPSec-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMP\
+| | ... | on TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology And Lisp
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${lisp_if_idx}= | resources.libraries.python.InterfaceUtil.get sw if index
+| | ... | ${dut1_node} | ${lisp_gpe_int}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${lisp_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip4} | ${dut2_to_dut1_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${lisp_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip4} | ${dut1_to_dut2_ip4}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Topology And Lisp
+| | [Documentation] | Setup IPs and neighbors for interfaces on DUT1 and DUT2\
+| | ... | and then setup LISP.
+| | [Arguments] | ${fib_table}=0 | ${vni_table}=0 | ${ip6}=${FALSE}
+| | Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Set interfaces in 3-node circular topology up
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip4}
+| | ... | ${prefix4}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip4}
+| | ... | ${prefix4}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6}
+| | ... | ${prefix6}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | ... | ${dut1_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6}
+| | ... | ${tg_to_dut1_mac}
+| | Vpp All RA Suppress Link Layer | ${nodes}
+| | Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip_static_adjacency}
+| | ... | ${dut2_to_dut1_ip_static_adjacency}
+| | ... | ${vni_table} | ${fib_table}
diff --git a/tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip6basevrf-func.robot b/tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip6basevrf-func.robot
new file mode 100644
index 0000000000..e85ef57d1f
--- /dev/null
+++ b/tests/vpp/func/crypto/eth2p-ethip4ipsectptlispgpe-ip6basevrf-func.robot
@@ -0,0 +1,133 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.L2Util
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.IPsecUtil
+| Library | resources.libraries.python.VatJsonUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.QemuUtils
+| Library | resources.libraries.python.VPPUtil
+| Library | String
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv6_lispgpe_ipv4/ipv6_lispgpe_ipsec_ipv4.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP | SKIP_VPP_PATCH
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test
+| ...
+| Documentation | *IPv6 - ip4-ipsec-lispgpe-ip6 - main fib, vrf, virt2lisp,\
+| ... | phy2lisp*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISPGPE-IPSec-IPv6-ICMP,\
+| ... | Eth-IPv4-IPSec-LISPGPE-IPv6-ICMP
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with LISP and IPsec.\
+| ... | IPsec is in transport mode. Tests cases are for IPsec configured both\
+| ... | on RLOC interface or lisp_gpe0 interface.
+| ... | *[Ver] TG verification:* Packet is send from TG(if1) across the DUT1 to\
+| ... | DUT2 where it is forwarded to TG(if2).
+| ... | *[Ref] Applicable standard specifications:* RFC6830, RFC4303.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 bidirectionally over LISP GPE tunnel using physical interfaces and VRF is enabled
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-IPSec-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2,\
+| | ... | Eth-IPv6-ICMPv6, on TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Case: ip4-ipsec-lispgpe-ip6 - vrf, phy2lisp
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${fib_table_1} | ip6=${TRUE}
+| | Assign Interface To Fib Table | ${dut2_node}
+| | ... | ${dut2_to_tg} | ${fib_table_1} | ip6=${TRUE}
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip4} | ${dut2_to_dut1_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip4} | ${dut1_to_dut2_ip4}
+| | Setup Topology And Lisp | ${fib_table_1} | ${dut1_dut2_vni}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Topology And Lisp
+| | [Documentation] | Setup IPs and neighbors for interfaces on DUT1 and DUT2\
+| | ... | and then setup LISP.
+| | [Arguments] | ${fib_table}=0 | ${vni_table}=0 | ${ip6}=${FALSE}
+| | Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Set interfaces in 3-node circular topology up
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip4}
+| | ... | ${prefix4}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip4}
+| | ... | ${prefix4}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6}
+| | ... | ${prefix6}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | ... | ${dut1_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6}
+| | ... | ${tg_to_dut1_mac}
+| | Vpp All RA Suppress Link Layer | ${nodes}
+| | Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip_static_adjacency}
+| | ... | ${dut2_to_dut1_ip_static_adjacency}
+| | ... | ${vni_table} | ${fib_table}
diff --git a/tests/vpp/func/crypto/eth2p-ethip6ipsectnl-ip6base-func.robot b/tests/vpp/func/crypto/eth2p-ethip6ipsectnl-ip6base-func.robot
new file mode 100644
index 0000000000..26d109a0b7
--- /dev/null
+++ b/tests/vpp/func/crypto/eth2p-ethip6ipsectnl-ip6base-func.robot
@@ -0,0 +1,523 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | 3_NODE_DOUBLE_LINK_TOPO
+| ... | VM_ENV | HW_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up IPv6 IPSec functional test
+| ...
+| Test Teardown | Tear down IPSec functional test | ${dut_node}
+| ...
+| Documentation | *IPv6 IPsec tunnel mode test suite.*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1 2-node topology with one link\
+| ... | between nodes.
+| ... | *[Cfg] DUT configuration:* On DUT1 create loopback interface, configure
+| ... | loopback an physical interface IPv6 addresses, static ARP record, route
+| ... | and IPsec manual keyed connection in tunnel mode.
+| ... | *[Ver] TG verification:* ESP packet is sent from TG to DUT1. ESP packet
+| ... | is received on TG from DUT1.
+| ... | *[Ref] Applicable standard specifications:* RFC4303.
+
+*** Variables ***
+| ${tg_spi}= | ${1000}
+| ${dut_spi}= | ${1001}
+| ${ESP_PROTO}= | ${50}
+| ${tg_if_ip6}= | 3ffe:5f::1
+| ${dut_if_ip6}= | 3ffe:5f::2
+| ${tg_lo_ip6}= | 3ffe:60::3
+| ${dut_lo_ip6}= | 3ffe:60::4
+| ${ip6_plen}= | ${64}
+| ${ip6_plen_rt}= | ${128}
+
+*** Test Cases ***
+| TC01: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC02: VPP process ESP packet in Tunnel Mode with AES-CBC-192 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC03: VPP process ESP packet in Tunnel Mode with AES-CBC-256 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC04: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-256-128 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC05: VPP process ESP packet in Tunnel Mode with AES-CBC-192 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-256-128 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC06: VPP process ESP packet in Tunnel Mode with AES-CBC-256 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-256-128 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC07: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-384-192 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC08: VPP process ESP packet in Tunnel Mode with AES-CBC-192 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-384-192 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC09: VPP process ESP packet in Tunnel Mode with AES-CBC-256 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-384-192 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC10: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-512-256 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC11: VPP process ESP packet in Tunnel Mode with AES-CBC-192 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-512-256 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC12: VPP process ESP packet in Tunnel Mode with AES-CBC-256 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-512-256 in tunnel\
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC13: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity - different encryption alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send an ESP packet encrypted by encryption key different from\
+| | ... | encryption key stored on VPP node from TG to VPP node and expect no\
+| | ... | response to be received on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC14: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity - different integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key different\
+| | ... | from integrity key stored on VPP node from TG to VPP node and expect\
+| | ... | no response to be received on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC15: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity - different encryption and integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel mode.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key and encrypted\
+| | ... | by encryption key different from integrity and encryption keys stored\
+| | ... | on VPP node from TG to VPP node and expect no response to be received\
+| | ... | on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC16: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node before\
+| | ... | and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${new_encr_key} | ${auth_alg} | ${new_auth_key}
+| | ... | ${tg_spi} | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC17: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different encryption alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet encrypted by encryption key different from\
+| | ... | encryption key stored on VPP node from TG to VPP node and expect no\
+| | ... | response to be received on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${new_auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC18: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key different\
+| | ... | from integrity key stored on VPP node from TG to VPP node and expect\
+| | ... | no response to be received on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${new_encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+| TC19: VPP process ESP packet in Tunnel Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different encryption and integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in tunnel\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key and encrypted\
+| | ... | by encryption key different from integrity and encryption keys stored\
+| | ... | on VPP node from TG to VPP node and expect no response to be received\
+| | ... | on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_src_ip} | ${tg_src_ip}
+| | ... | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_src_ip} | ${dut_src_ip} | ${tg_tun_ip}
+| | ... | ${dut_tun_ip}
+
+*** Keywords ***
+| Get Second Random String
+| | [Arguments] | ${req_alg} | ${req_type}
+| | ${req_key_len}= | Run Keyword | Get ${req_type} Alg Key Len | ${req_alg}
+| | ${key}= | Set Variable If | '${req_type}' == 'Crypto' | ${encr_key}
+| | ... | '${req_type}' == 'Integ' | ${auth_key}
+| | :FOR | ${index} | IN RANGE | 100
+| | | ${req_key}= | Generate Random String | ${req_key_len}
+| | | Return From Keyword If | '${req_key}' != '${key}' | ${req_key}
diff --git a/tests/vpp/func/crypto/eth2p-ethip6ipsectpt-ip6base-func.robot b/tests/vpp/func/crypto/eth2p-ethip6ipsectpt-ip6base-func.robot
new file mode 100644
index 0000000000..e36630b681
--- /dev/null
+++ b/tests/vpp/func/crypto/eth2p-ethip6ipsectpt-ip6base-func.robot
@@ -0,0 +1,487 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | 3_NODE_DOUBLE_LINK_TOPO
+| ... | VM_ENV | HW_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up IPv6 IPSec functional test
+| ...
+| Test Teardown | Tear down IPSec functional test | ${dut_node}
+| ...
+| Documentation | *IPv6 IPsec transport mode test suite.*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1 2-node topology with one link\
+| ... | between nodes.
+| ... | *[Cfg] DUT configuration:* On DUT1 create loopback interface, configure
+| ... | loopback an physical interface IPv6 addresses, static ARP record, route
+| ... | and IPsec manual keyed connection in transport mode.
+| ... | *[Ver] TG verification:* ESP packet is sent from TG to DUT1. ESP packet
+| ... | is received on TG from DUT1.
+| ... | *[Ref] Applicable standard specifications:* RFC4303.
+
+*** Variables ***
+| ${tg_spi}= | ${1000}
+| ${dut_spi}= | ${1001}
+| ${ESP_PROTO}= | ${50}
+| ${tg_if_ip6}= | 3ffe:5f::1
+| ${dut_if_ip6}= | 3ffe:5f::2
+| ${tg_lo_ip6}= | 3ffe:60::3
+| ${dut_lo_ip6}= | 3ffe:60::4
+| ${ip6_plen}= | ${64}
+| ${ip6_plen_rt}= | ${128}
+
+*** Test Cases ***
+| TC01: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC02: VPP process ESP packet in Transport Mode with AES-CBC-192 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA1-96 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC03: VPP process ESP packet in Transport Mode with AES-CBC-256 encryption and SHA1-96 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA1-96 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC04: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-256-128 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC05: VPP process ESP packet in Transport Mode with AES-CBC-192 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-256-128 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC06: VPP process ESP packet in Transport Mode with AES-CBC-256 encryption and SHA-256-128 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-256-128 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 256 128
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC07: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-384-192 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC08: VPP process ESP packet in Transport Mode with AES-CBC-192 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-384-192 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC09: VPP process ESP packet in Transport Mode with AES-CBC-256 encryption and SHA-384-192 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-384-192 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 384 192
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC10: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA-512-256 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC11: VPP process ESP packet in Transport Mode with AES-CBC-192 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-192 and integrity algorithm SHA-512-256 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | [Tags] | SKIP_PATCH
+| | ${encr_alg}= | Crypto Alg AES CBC 192
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC12: VPP process ESP packet in Transport Mode with AES-CBC-256 encryption and SHA-512-256 integrity
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-256 and integrity algorithm SHA-512-256 in transport
+| | ... | mode.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node.
+| | ${encr_alg}= | Crypto Alg AES CBC 256
+| | ${auth_alg}= | Integ Alg SHA 512 256
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC13: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity - different encryption alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode.
+| | ... | [Ver] Send an ESP packet encrypted by encryption key different from\
+| | ... | encryption key stored on VPP node from TG to VPP node and expect no\
+| | ... | response to be received on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC14: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity - different integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key different\
+| | ... | from integrity key stored on VPP node from TG to VPP node and expect\
+| | ... | no response to be received on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC15: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity - different encryption and integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key and encrypted\
+| | ... | by encryption key different from integrity and encryption keys stored\
+| | ... | on VPP node from TG to VPP node and expect no response to be received\
+| | ... | on TG.
+| | ... | [Ref] RFC4303.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC16: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send and receive ESP packet between TG and VPP node before\
+| | ... | and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${new_encr_key} | ${auth_alg} | ${new_auth_key}
+| | ... | ${tg_spi} | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC17: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different encryption alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet encrypted by encryption key different from\
+| | ... | encryption key stored on VPP node from TG to VPP node and expect no\
+| | ... | response to be received on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${new_auth_key} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC18: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key different\
+| | ... | from integrity key stored on VPP node from TG to VPP node and expect\
+| | ... | no response to be received on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${new_encr_key} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+| TC19: VPP process ESP packet in Transport Mode with AES-CBC-128 encryption and SHA1-96 integrity with update SA keys - different encryption and integrity alogrithms used
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC4303.
+| | ... | [Cfg] On DUT1 configure IPsec manual keyed connection with encryption\
+| | ... | algorithm AES-CBC-128 and integrity algorithm SHA1-96 in transport\
+| | ... | mode. Then update SA keys - use new keys.
+| | ... | [Ver] Send an ESP packet authenticated by integrity key and encrypted\
+| | ... | by encryption key different from integrity and encryption keys stored\
+| | ... | on VPP node from TG to VPP node and expect no response to be received\
+| | ... | on TG before and after SA keys update.
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut_node} | ${dut_if} | ${encr_alg} | ${encr_key} | ${auth_alg}
+| | ... | ${auth_key} | ${dut_spi} | ${tg_spi} | ${dut_tun_ip} | ${tg_tun_ip}
+| | ${encr_key2}= | And Get Second Random String | ${encr_alg} | Crypto
+| | ${auth_key2}= | And Get Second Random String | ${auth_alg} | Integ
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+| | ${new_encr_key}= | Given Get Second Random String | ${encr_alg} | Crypto
+| | ${new_auth_key}= | And Get Second Random String | ${auth_alg} | Integ
+| | When Update IPSec SA keys | ${dut_node} | ${l_sa_id} | ${r_sa_id}
+| | ... | ${new_encr_key} | ${new_auth_key}
+| | Then Run Keyword And Expect Error | ESP packet Rx timeout
+| | ... | Send IPsec Packet and verify ESP encapsulation in received packet
+| | ... | ${tg_node} | ${tg_if} | ${dut_if_mac}
+| | ... | ${encr_alg} | ${encr_key2} | ${auth_alg} | ${auth_key2} | ${tg_spi}
+| | ... | ${dut_spi} | ${tg_tun_ip} | ${dut_tun_ip}
+
+*** Keywords ***
+| Get Second Random String
+| | [Arguments] | ${req_alg} | ${req_type}
+| | ${req_key_len}= | Run Keyword | Get ${req_type} Alg Key Len | ${req_alg}
+| | ${key}= | Set Variable If | '${req_type}' == 'Crypto' | ${encr_key}
+| | ... | '${req_type}' == 'Integ' | ${auth_key}
+| | :FOR | ${index} | IN RANGE | 100
+| | | ${req_key}= | Generate Random String | ${req_key_len}
+| | | Return From Keyword If | '${req_key}' != '${key}' | ${req_key}
diff --git a/tests/vpp/func/crypto/eth2p-ethip6ipsectptlispgpe-ip4base-func.robot b/tests/vpp/func/crypto/eth2p-ethip6ipsectptlispgpe-ip4base-func.robot
new file mode 100644
index 0000000000..f3bc2e28b1
--- /dev/null
+++ b/tests/vpp/func/crypto/eth2p-ethip6ipsectptlispgpe-ip4base-func.robot
@@ -0,0 +1,158 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.L2Util
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.IPsecUtil
+| Library | resources.libraries.python.VatJsonUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.QemuUtils
+| Library | String
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv4_lispgpe_ipv6/ipv4_lispgpe_ipsec_ipv6.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP | SKIP_VPP_PATCH
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down functional test
+| ...
+| Documentation | *IPv6 - ip4-ipsec-lispgpe-ip6 - main fib, virt2lisp, phy2lisp*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISPGPE-IPSec-IPv4-ICMP,\
+| ... | Eth-IPv6-IPSec-LISPGPE-IPv4-ICMP
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with LISP and IPsec.\
+| ... | IPsec is in transport mode. Tests cases are for IPsec configured both\
+| ... | on RLOC interface or lisp_gpe0 interface.
+| ... | *[Ver] TG verification:* Packet is send from TG(if1) across the DUT1 to\
+| ... | DUT2 where it is forwarded to TG(if2).
+| ... | *[Ref] Applicable standard specifications:* RFC6830, RFC4303.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using IPsec (transport) on RLOC Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-LISPGPE-IPSec-IPv4-ICMP on DUT1-DUT2, Eth-IPv4-ICMP\
+| | ... | on TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology And Lisp
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip6} | ${dut2_to_dut1_ip6}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip6} | ${dut1_to_dut2_ip6}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+| TC02: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using IPsec (transport) on lisp_gpe0 Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-IPSec-LISPGPE-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMP\
+| | ... | on TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology And Lisp
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | ${lisp_if_idx}= | resources.libraries.python.InterfaceUtil.get sw if index
+| | ... | ${dut1_node} | ${lisp_gpe_int}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${lisp_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip6} | ${dut2_to_dut1_ip6}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${lisp_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip6} | ${dut1_to_dut2_ip6}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Topology And Lisp
+| | [Documentation] | Setup IPs and neighbors for interfaces on DUT1 and DUT2\
+| | ... | and then setup LISP.
+| | Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Set interfaces in 3-node circular topology up
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip4}
+| | ... | ${prefix4}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip4}
+| | ... | ${prefix4}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6}
+| | ... | ${dut1_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | Vpp All RA Suppress Link Layer | ${nodes}
+| | Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip_static_adjacency}
+| | ... | ${dut2_to_dut1_ip_static_adjacency}
diff --git a/tests/vpp/func/crypto/eth2p-ethip6ipsectptlispgpe-ip6base-func.robot b/tests/vpp/func/crypto/eth2p-ethip6ipsectptlispgpe-ip6base-func.robot
new file mode 100644
index 0000000000..ca81b425c8
--- /dev/null
+++ b/tests/vpp/func/crypto/eth2p-ethip6ipsectptlispgpe-ip6base-func.robot
@@ -0,0 +1,174 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.L2Util
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.VPPUtil
+| Library | resources.libraries.python.IPsecUtil
+| Library | resources.libraries.python.VatJsonUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.QemuUtils
+| Library | String
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv6_lispgpe_ipv6/ipv6_lispgpe_ipsec_ipv6.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP | SKIP_VPP_PATCH
+| ...
+| Test Setup | Run Keywords | Set up functional test
+| ... | AND | Vpp All Ra Suppress Link Layer | ${nodes}
+| ...
+| Test Teardown | Tear down functional test
+| ...
+| Documentation | *IPv6 - ip6-ipsec-lispgpe-ip6 - main fib,
+| ... | vrf (gpe_vni-to-vrf), phy2lisp, virt2lisp*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-IPSec-LISPGPE-IPv6-ICMPv6,\
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with LISP and IPsec.\
+| ... | IPsec is in transport mode. Tests cases are for IPsec configured both\
+| ... | on RLOC interface or lisp_gpe0 interface.
+| ... | *[Ver] TG verification:* Packet is send from TG(if1) across the DUT1\
+| ... | to DUT2 where it is forwarded to TG(if2).
+| ... | *[Ref] Applicable standard specifications:* RFC6830, RFC4303.
+
+*** Variables ***
+| ${dut2_spi}= | ${1000}
+| ${dut1_spi}= | ${1001}
+
+| ${ESP_PROTO}= | ${50}
+
+| ${bid}= | 10
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 bidirectionally over LISP GPE tunnel using IPsec (transport) on RLOC Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-IPSec-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2,\
+| | ... | Eth-IPv6-ICMPv6 on TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Case: ip6-lispgpe-ipsec-ip6 - main fib, phys2lisp\
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology
+| | And Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip6_static_adjacency}
+| | ... | ${dut2_to_dut1_ip6_static_adjacency}
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip6} | ${dut2_to_dut1_ip6}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip6} | ${dut1_to_dut2_ip6}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+| TC02: DUT1 and DUT2 route IPv6 bidirectionally over LISP GPE tunnel using IPsec (transport) lisp_gpe0 Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-IPSec-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2,\
+| | ... | Eth-IPv6-ICMPv6 on TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Case: ip6-ipsec-lispgpe-ip6 - main fib, phys2lisp\
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology
+| | And Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip6_static_adjacency}
+| | ... | ${dut2_to_dut1_ip6_static_adjacency}
+| | ${lisp_if_idx}= | resources.libraries.python.InterfaceUtil.get sw if index
+| | ... | ${dut1_node} | lisp_gpe0
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${lisp_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi} | ${tg1_ip6}
+| | ... | ${tg2_ip6}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${lisp_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi} | ${tg2_ip6}
+| | ... | ${tg1_ip6}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Topology
+| | Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Set interfaces in 3-node circular topology up
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6}
+| | ... | ${prefix6}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6}
+| | ... | ${dut1_to_dut2_mac}
+| | Vpp All RA Suppress Link Layer | ${nodes}
diff --git a/tests/vpp/func/honeycomb/__init__.robot b/tests/vpp/func/honeycomb/__init__.robot
new file mode 100644
index 0000000000..b7f0c1d7b9
--- /dev/null
+++ b/tests/vpp/func/honeycomb/__init__.robot
@@ -0,0 +1,27 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables***
+# Honeycomb node to run tests on.
+| ${node}= | ${nodes['DUT1']}
+
+*** Settings ***
+| Library | resources/libraries/python/honeycomb/HcPersistence.py
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| ...
+| Suite Setup | Run Keywords | Configure all DUTs before test | AND
+| ... | Set Global Variable | ${node} | AND
+| ... | Stop Honeycomb service on DUTs | ${node}
+| ...
+| Suite Teardown | Archive Honeycomb log file | ${node}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-acl-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-acl-apihc-apivat-func.robot
new file mode 100644
index 0000000000..3f209e3562
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-acl-apihc-apivat-func.robot
@@ -0,0 +1,169 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+# Interface to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/access_control_lists.robot
+| Variables | resources/test_data/honeycomb/acl.py
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Documentation | *Honeycomb access control lists test suite.*
+| ...
+| Force Tags | HC_FUNC
+
+*** Test Cases ***
+| TC01: Honeycomb can create ACL classify table
+| | [Documentation] | Check if Honeycomb API can create an ACL table.
+| | ...
+| | Given ACL table from Honeycomb should not exist
+| | ... | ${node} | ${hc_acl_table['name']}
+| | And ACL table from VAT should not exist
+| | ... | ${node} | ${table_index}
+| | When Honeycomb creates ACL table
+| | ... | ${node} | ${hc_acl_table}
+| | Then ACL table from Honeycomb should be | ${node} | ${hc_acl_table_oper}
+| | And ACL table from VAT should be
+| | ... | ${node} | ${table_index} | ${vat_acl_table}
+
+| TC02: Honeycomb can remove ACL table
+| | [Documentation] | Check if Honeycomb API can delete an ACL table.
+| | ...
+| | Given ACL table from Honeycomb should be | ${node} | ${hc_acl_table_oper}
+| | And ACL table from VAT should be
+| | ... | ${node} | ${table_index} | ${vat_acl_table}
+| | When Honeycomb removes ACL table | ${node} | ${hc_acl_table['name']}
+| | Then ACL table from Honeycomb should not exist
+| | ... | ${node} | ${hc_acl_table['name']}
+| | And ACL table from VAT should not exist
+| | ... | ${node} | ${table_index}
+
+| TC03: Honeycomb manages more than one ACL table
+| | [Documentation] | Check if Honeycomb API can create another ACL table.
+| | ...
+| | Given ACL table from Honeycomb should not exist
+| | ... | ${node} | ${hc_acl_table['name']}
+| | And ACL table from VAT should not exist
+| | ... | ${node} | ${table_index}
+| | When Honeycomb creates ACL table | ${node} | ${hc_acl_table}
+| | And Honeycomb creates ACL table | ${node} | ${hc_acl_table2}
+| | Then ACL table from Honeycomb should be | ${node} | ${hc_acl_table_oper}
+| | And ACL table from VAT should be
+| | ... | ${node} | ${table_index} | ${vat_acl_table}
+| | And ACL table from Honeycomb should be | ${node} | ${hc_acl_table2_oper}
+| | And ACL table from VAT should be
+| | ... | ${node} | ${table_index2} | ${vat_acl_table2}
+
+| TC04: Honeycomb can add ACL session to table
+| | [Documentation] | Check if Honeycomb API can add an ACL session to a table.
+| | ...
+| | Given ACL table from Honeycomb should be | ${node} | ${hc_acl_table_oper}
+| | And ACL table from VAT should be
+| | ... | ${node} | ${table_index} | ${vat_acl_table}
+| | When Honeycomb adds ACL session
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session}
+| | Then ACL session from Honeycomb should be
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session}
+| | And ACL session from VAT should be
+| | ... | ${node} | ${table_index} | ${session_index} | ${vat_acl_session}
+
+| TC05: Honeycomb can remove ACL session
+| | [Documentation] | Check if Honeycomb API can remove an ACL session.
+| | ...
+| | Given ACL session from Honeycomb should be
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session}
+| | And ACL session from VAT should be
+| | ... | ${node} | ${table_index} | ${session_index} | ${vat_acl_session}
+| | When Honeycomb removes ACL session
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session['match']}
+| | Then ACL session from Honeycomb should not exist
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session['match']}
+| | And ACL session from VAT should not exist
+| | ... | ${node} | ${table_index} | ${session_index}
+
+| TC06: Honeycomb manages more than one ACL session on one table
+| | [Documentation] | Check if Honeycomb API can add another ACL session\
+| | ... | to a table.
+| | ...
+| | Given ACL session from Honeycomb should not exist
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session['match']}
+| | And ACL session from VAT should not exist
+| | ... | ${node} | ${table_index} | ${session_index}
+| | When Honeycomb adds ACL session
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session}
+| | And Honeycomb adds ACL session
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session2}
+| | Then ACL session from Honeycomb should be
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session}
+| | And ACL session from VAT should be
+| | ... | ${node} | ${table_index} | ${session_index} | ${vat_acl_session}
+| | And ACL session from Honeycomb should be
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session2}
+| | And ACL session from VAT should be
+| | ... | ${node} | ${table_index} | ${session_index2} | ${vat_acl_session2}
+
+| TC07: Honeycomb enables ACL on interface
+| | [Documentation] | Check if Honeycomb API can enable ACL on an interface.
+| | ...
+| | Given ACL table from Honeycomb should be | ${node} | ${hc_acl_table_oper}
+| | And ACL table from VAT should be
+| | ... | ${node} | ${table_index} | ${vat_acl_table}
+| | And ACL session from Honeycomb should be
+| | ... | ${node} | ${hc_acl_table['name']} | ${hc_acl_session}
+| | And ACL session from VAT should be
+| | ... | ${node} | ${table_index} | ${session_index} | ${vat_acl_session}
+| | When Honeycomb enables ACL on interface
+| | ... | ${node} | ${interface} | ${hc_acl_table['name']}
+| | Then Interface ACL configuration from Honeycomb should be
+| | ... | ${node} | ${interface} | ${hc_acl_table['name']}
+| | And Interface ACL configuration from VAT should be
+| | ... | ${node} | ${interface} | ${table_index}
+
+| TC08: Honeycomb disables ACL on interface
+| | [Documentation] | Check if Honeycomb API can disable ACL on an interface.
+| | ...
+| | Given Interface ACL configuration from Honeycomb should be
+| | ... | ${node} | ${interface} | ${hc_acl_table['name']}
+| | And Interface ACL configuration from VAT should be
+| | ... | ${node} | ${interface} | ${table_index}
+| | When Honeycomb disables ACL on interface | ${node} | ${interface}
+| | Then Interface ACL configuration from Honeycomb should be empty
+| | ... | ${node} | ${interface}
+| | And Interface ACL configuration from VAT should be empty
+| | ... | ${node} | ${interface}
+
+| TC09: Honeycomb can remove one out of multiple ACL tables
+| | [Documentation] | Check if Honeycomb API can delete an ACL table if more\
+| | ... | than one table exists.
+| | ...
+| | Given ACL table from Honeycomb should be | ${node} | ${hc_acl_table_oper}
+| | And ACL table from VAT should be
+| | ... | ${node} | ${table_index} | ${vat_acl_table}
+| | And ACL table from Honeycomb should be | ${node} | ${hc_acl_table2_oper}
+| | And ACL table from VAT should be
+| | ... | ${node} | ${table_index2} | ${vat_acl_table2}
+| | When Honeycomb removes ACL table | ${node} | ${hc_acl_table2['name']}
+| | Then ACL table from Honeycomb should be | ${node} | ${hc_acl_table_oper}
+| | And ACL table from VAT should be
+| | ... | ${node} | ${table_index} | ${vat_acl_table}
+| | And ACL table from Honeycomb should not exist
+| | ... | ${node} | ${hc_acl_table2['name']}
+| | And ACL table from VAT should not exist
+| | ... | ${node} | ${table_index2}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-dhcp-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-dhcp-apihc-apivat-func.robot
new file mode 100644
index 0000000000..958b27fd32
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-dhcp-apihc-apivat-func.robot
@@ -0,0 +1,131 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/features/dhcp_proxy.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/dhcp.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPv4Setup
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.IPv6Util
+| Library | resources.libraries.python.Routing
+| Variables | resources/test_data/honeycomb/dhcp_relay.py
+| ...
+| ...
+| Documentation | *Honeycomb DHCP relay test suite.*
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+
+*** Test Cases ***
+| TC01: Honeycomb can configure DHCP relay entry
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-DHCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 configure IP addresses\
+| | ... | neighbors and configure DHCP relay.
+| | ... | [Ver] Send DHCP packets from TG interface to DUT. Receive all packets\
+| | ... | on the second TG interface and verify required fields.
+| | ...
+| | [Teardown] | Run Keywords | Show Packet Trace on All DUTs | ${nodes}
+| | ... | AND | Log DHCP relay configuration from VAT | ${node} | ipv4
+| | ...
+| | Given DHCP relay Operational Data From Honeycomb Should Be empty | ${node}
+| | When Honeycomb configures DHCP relay | ${node} | ${relay1} | ipv4 | ${0}
+| | Then DHCP relay configuration from Honeycomb should contain
+| | ... | ${node} | ${relay1_oper}
+| | When DHCP relay test setup
+| | Then Send DHCP messages and check answer | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${dhcp_server1_ip} | ${tg_to_dut_if2_mac}
+| | ... | ${client_ip} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_ip}
+
+| TC02: Honeycomb can remove DHCP relay entry
+| | [Documentation] | Remove DHCP relay configuration, and verify that\
+| | ... | it was removed.
+| | ...
+| | Given DHCP relay configuration from Honeycomb should contain
+| | ... | ${node} | ${relay1_oper}
+| | When Honeycomb clears DHCP relay configuration | ${node}
+| | Then DHCP relay Operational Data From Honeycomb Should Be empty | ${node}
+
+| TC03: Honeycomb can configure multiple DHCP relay servers.
+| | [Documentation] | Configure multiple DHCP relay servers and verify\
+| | ... | their configuration using operational data.
+| | ...
+| | [Teardown] | Honeycomb clears DHCP relay configuration | ${node}
+| | ...
+| | Given DHCP relay Operational Data From Honeycomb Should Be empty | ${node}
+| | And Honeycomb configures DHCP relay | ${node} | ${relay2} | ipv4 | ${0}
+| | Then DHCP relay configuration from Honeycomb should contain
+| | ... | ${node} | ${relay2_oper}
+
+| TC04: Honeycomb can configure DHCP relay entry with ipv6
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv6-DHCPv6.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 configure IP addresses\
+| | ... | neighbors and configure DHCP relay.
+| | ... | [Ver] Send DHCPv6 packets from TG interface to DUT. Receive all\
+| | ... | packets on the second TG interface and verify required fields.
+| | ...
+| | [Teardown] | Run Keywords | Show Packet Trace on All DUTs | ${nodes}
+| | ... | AND | Log DHCP relay configuration from VAT | ${node} | ipv6
+| | ... | AND | Honeycomb clears DHCP relay configuration | ${node}
+| | ...
+| | Given DHCP relay Operational Data From Honeycomb Should Be empty | ${node}
+| | When Honeycomb configures DHCP relay | ${node} | ${relay_v6} | ipv6 | ${0}
+| | Then DHCP relay configuration from Honeycomb should contain
+| | ... | ${node} | ${relay_v6_oper}
+| | When DHCP relay test setup IPv6
+| | Then Send DHCPv6 Messages | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if1_ip6} | ${dut_to_tg_if1_mac} | ${dhcp_server_ip6}
+| | ... | ${tg_to_dut_if2_mac} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if2_mac}
+
+*** Keywords ***
+| DHCP relay test setup
+| | Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2} | up
+| | Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | Add ARP on DUT | ${dut_node} | ${dut_to_tg_if2} | ${dhcp_server1_ip}
+| | ... | ${tg_to_dut_if2_mac}
+| | Add ARP on DUT | ${dut_node} | ${dut_to_tg_if2} | ${dhcp_server2_ip}
+| | ... | ${tg_to_dut_if2_mac}
+| | And VPP Route Add | ${dut_node} | 255.255.255.255 | 32 | ${NONE} | local
+| | ... | ${FALSE} | ${NONE}
+
+| DHCP relay test setup IPv6
+| | Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2} | up
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Honeycomb sets interface IPv6 address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip6} | ${prefix_length_v6}
+| | Honeycomb sets interface IPv6 address | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip6} | ${prefix_length_v6}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if2} | ${dhcp_server_ip6}
+| | ... | ${tg_to_dut_if2_mac}
+| | And VPP Route Add | ${dut_node} | ff02::1:2 | 128 | ${NONE} | local
+| | ... | ${FALSE} | ${NONE}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-int-apihcnc-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-int-apihcnc-func.robot
new file mode 100644
index 0000000000..2ba904449a
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-int-apihcnc-func.robot
@@ -0,0 +1,76 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/netconf.robot
+| Resource | resources/libraries/robot/honeycomb/bridge_domain.robot
+| Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
+| ... | WITH NAME | InterfaceAPI
+| Variables | resources/test_data/honeycomb/netconf/triggers.py
+| ...
+| Documentation | *Netconf test suite. Contains test cases that need to bypass\
+| ... | REST API.*
+| ...
+| Force Tags | HC_FUNC | HC_REST_ONLY
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+
+*** Variables ***
+| ${interface}= | ${node['interfaces']['port1']['name']}
+| &{bd_settings}= | flood=${True} | forward=${True} | learn=${True}
+| ... | unknown-unicast-flood=${True} | arp-termination=${True}
+
+*** Test Cases ***
+| TC01: Honeycomb can create and delete interfaces
+| | [Documentation] | Repeatedly create and delete an interface through Netconf\
+| | ... | and check the reply for any errors.
+| | ...
+| | Given Netconf session should be established | ${node}
+| | And Honeycomb creates first L2 bridge domain
+| | ... | ${node} | bd_netconf | ${bd_settings}
+| | :FOR | ${index} | IN RANGE | 20
+| | | When Error trigger is sent | ${trigger_105}
+| | | Then Replies should not contain RPC errors
+
+| TC02: Transaction revert test case 1
+| | [Documentation] | Configure two conflicting VxLAN tunnels, then verify\
+| | ... | that neither tunnel exists.
+| | ...
+| | Given Netconf session should be established | ${node}
+| | ${if_data}= | And InterfaceAPI.Get all interfaces oper data | ${node}
+| | When Error trigger is sent | ${trigger_revert1}
+| | ${if_data_new}= | And InterfaceAPI.Get all interfaces oper data | ${node}
+| | Then Should be equal | ${if_data} | ${if_data_new}
+
+| TC03: Transaction revert test case 2
+| | [Documentation] | Configure two conflicting TAP interfaces, then verify\
+| | ... | that neither interface exists.
+| | ...
+| | Given Netconf session should be established | ${node}
+| | ${if_data}= | And InterfaceAPI.Get all interfaces oper data | ${node}
+| | When Error trigger is sent | ${trigger_revert1}
+| | ${if_data_new}= | And InterfaceAPI.Get all interfaces oper data | ${node}
+| | Then Should be equal | ${if_data} | ${if_data_new}
+
+| TC04: Vlan subinterface creation
+| | [Documentation] | Configure a Vlan sub-interface under a physical interface.
+| | ...
+| | Given Netconf session should be established | ${node}
+| | When Error Trigger Is Sent
+| | ... | ${trigger_vlan} | interface=${interface}
+| | Then Replies should not contain RPC errors
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-int-subint-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-int-subint-apihc-apivat-func.robot
new file mode 100644
index 0000000000..a37f538d2d
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-int-subint-apihc-apivat-func.robot
@@ -0,0 +1,609 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/sub_interface.robot
+| Resource | resources/libraries/robot/honeycomb/bridge_domain.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Variables | resources/test_data/honeycomb/sub_interfaces.py
+| ...
+| Suite Setup | Run Keywords
+| ... | Set Up Honeycomb Functional Test Suite | ${node} | AND
+| ... | Add Interface local0 To Topology | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Documentation | *Honeycomb sub-interface management test suite.*
+
+*** Variables ***
+# Test interfaces and their sub-interface parameters:
+| ${super_if}= | ${node['interfaces']['port1']['name']}
+| ${super_if2}= | ${node['interfaces']['port3']['name']}
+| ${sub_if_id}= | ${sub_if_1_settings['identifier']}
+| ${sub_if_name}= | ${super_if}.${sub_if_id}
+| ${sub_if2_name}= | ${super_if2}.${sub_if_id}
+
+*** Test Cases ***
+| TC01: Honeycomb creates sub-interface
+| | [Documentation] | Check if Honeycomb creates a sub-interface.
+| | ...
+| | Given Honeycomb configures interface state | ${node} | ${super_if} | down
+| | And sub-interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And interface Operational Data From VAT Should Be empty
+| | ... | ${node} | ${sub_if_name}
+| | When Honeycomb creates sub-interface | ${node} | ${super_if}
+| | ... | ${sub_if_1_match} | ${sub_if_1_tags} | ${sub_if_1_settings}
+| | Then Sub-interface Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${sub_if_1_oper}
+| | And Sub-interface Operational Data From VAT Should Be
+| | ... | ${node} | ${sub_if_name} | ${sub_if_1_oper}
+| | And sub-interface indices from Honeycomb and VAT should correspond
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+
+| TC02: Honeycomb sets interface and sub-interface up
+| | [Documentation] | Honeycomb changes the state of interface\
+| | ... | and of its sub-interface to up.
+| | ...
+| | Given interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | down
+| | And interface state from VAT should be
+| | ... | ${node} | ${super_if} | down
+| | Sub-interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | down | down
+| | Sub-interface state from VAT should be
+| | ... | ${node} | ${sub_if_name} | down | down
+| | When Honeycomb configures interface state
+| | ... | ${node} | ${super_if} | up
+| | Then interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | up
+| | And interface state from VAT should be
+| | ... | ${node} | ${super_if} | up
+| | When Honeycomb sets the sub-interface up
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | Then Sub-interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | up | up
+| | And sub-interface state from VAT should be
+| | ... | ${node} | ${sub_if_name} | up | up
+
+| TC03: Honeycomb sets sub-interface down while its super-interface is up
+| | [Documentation] | Honeycomb sets the sub-interface down while its \
+| | ... | super-interface is up. It must be possible.
+| | ...
+| | [Teardown] | Set super and sub interfaces up
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given sub-interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | up | up
+| | And sub-interface state from VAT should be
+| | ... | ${node} | ${sub_if_name} | up | up
+| | And interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | up
+| | And interface state from VAT should be
+| | ... | ${node} | ${super_if} | up
+| | When Honeycomb sets the sub-interface down
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | Then interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | up
+| | And interface state from VAT should be
+| | ... | ${node} | ${super_if} | up
+| | And sub-interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | down | up
+| | And sub-interface state from VAT should be
+| | ... | ${node} | ${sub_if_name} | down | up
+
+| TC04: Honeycomb sets interface and sub-interface down
+| | [Documentation] | Honeycomb changes the state of interface down and then \
+| | ... | changes the state of its sub-interface down, in this order.
+| | ...
+| | [Teardown] | Set super and sub interfaces down
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | up
+| | And interface state from VAT should be
+| | ... | ${node} | ${super_if} | up
+| | When Honeycomb configures interface state
+| | ... | ${node} | ${super_if} | down
+| | Then interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | down
+| | And interface state from VAT should be
+| | ... | ${node} | ${super_if} | down
+| | Given sub-interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | up | down
+| | And sub-interface state from VAT should be
+| | ... | ${node} | ${sub_if_name} | up | down
+| | When Honeycomb sets the sub-interface down
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | Then sub-interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | down | down
+| | And sub-interface state from VAT should be
+| | ... | ${node} | ${sub_if_name} | down | down
+
+| TC05: Honeycomb fails to set sub-interface up while its super-interface is down
+| | [Documentation] | Honeycomb tries to set the sub-interface up while its \
+| | ... | super-interface is down. It must not be possible.
+| | ...
+| | Given interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | down
+| | And interface state from VAT should be
+| | ... | ${node} | ${super_if} | down
+| | And sub-interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | down | down
+| | And sub-interface state from VAT should be
+| | ... | ${node} | ${sub_if_name} | down | down
+| | When Honeycomb fails to set sub-interface up
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | Then interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | down
+| | And interface state from VAT should be
+| | ... | ${node} | ${super_if} | down
+| | And sub-interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | down | down
+| | And sub-interface state from VAT should be
+| | ... | ${node} | ${sub_if_name} | down | down
+
+| TC06: Honeycomb fails to delete sub-interface
+| | [Documentation] | Check if Honeycomb can delete an existing sub-interface.
+| | ...
+| | [Setup] | Set super and sub interfaces down
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given sub-interface Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${sub_if_1_oper}
+| | And sub-interface Operational Data From VAT Should Be
+| | ... | ${node} | ${sub_if_name} | ${sub_if_1_oper}
+| | When Honeycomb fails to remove all sub-interfaces
+| | ... | ${node} | ${super_if}
+| | Then sub-interface Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${sub_if_1_oper}
+| | And sub-interface Operational Data From VAT Should Be
+| | ... | ${node} | ${sub_if_name} | ${sub_if_1_oper}
+
+| TC07: Honeycomb adds sub-interface to new bridge domain
+| | [Documentation] | Check if Honeycomb adds a sub-interface to bridge domain.
+| | ...
+| | [Setup] | Set super and sub interfaces down
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given sub-interface Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${sub_if_1_oper}
+| | And sub-interface Operational Data From VAT Should Be
+| | ... | ${node} | ${sub_if_name} | ${sub_if_1_oper}
+| | When Honeycomb creates first L2 bridge domain
+| | ... | ${node} | ${bd_name} | ${bd_settings}
+| | Then bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${bd_name} | ${bd_settings}
+| | When Honeycomb adds sub-interface to bridge domain
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${sub_bd_settings}
+| | Then sub-interface bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${sub_bd_settings}
+| | And sub-interface bridge domain Operational Data From VAT Should Be
+| | ... | ${node} | ${sub_if_name} | ${sub_bd_settings}
+| | And sub-interface Operational Data From VAT Should Be
+| | ... | ${node} | ${sub_if_name} | ${sub_if_1_oper}
+
+| TC08: Honeycomb enables tag-rewrite pop 1
+| | [Documentation] | Check if Honeycomb enables tag-rewrite and sets its \
+| | ... | parameters correctly. Case: pop 1.
+| | ...
+| | [Teardown] | Honeycomb disables tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given rewrite tag from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | When Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_pop_1}
+| | Then rewrite tag from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_pop_1_oper}
+| | And rewrite tag from VAT should be
+| | ... | ${node} | ${sub_if_name} | ${tag_rewrite_pop_1_VAT}
+
+| TC09: Honeycomb enables tag-rewrite push
+| | [Documentation] | Check if Honeycomb enables tag-rewrite and sets its \
+| | ... | parameters correctly. Case: push.
+| | ...
+| | [Teardown] | Honeycomb disables tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given rewrite tag from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | When Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_push}
+| | Then rewrite tag from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_push_oper}
+| | And rewrite tag from VAT should be
+| | ... | ${node} | ${sub_if_name} | ${tag_rewrite_push_VAT}
+
+| TC10: Honeycomb enables tag-rewrite translate 1-2
+| | [Documentation] | Check if Honeycomb enables tag-rewrite and sets its \
+| | ... | parameters correctly. Case: translate 1-2.
+| | ...
+| | [Teardown] | Honeycomb disables tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given rewrite tag from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | When Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_translate_1_2}
+| | Then rewrite tag from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${tag_rewrite_translate_1_2_oper}
+| | And rewrite tag from VAT should be
+| | ... | ${node} | ${sub_if_name} | ${tag_rewrite_translate_1_2_VAT}
+
+| TC11: Honeycomb disables tag-rewrite
+| | [Documentation] | Check if Honeycomb disables the tag-rewrite.
+| | ...
+| | [Teardown] | Honeycomb disables tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | When Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_pop_1}
+| | Then rewrite tag from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_pop_1_oper}
+| | When Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_disabled}
+| | Then rewrite tag from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And rewrite tag from VAT should be
+| | ... | ${node} | ${sub_if_name} | ${tag_rewrite_disabled_VAT}
+
+| TC12: Honeycomb enables tag-rewrite pop 1 again
+| | [Documentation] | Check if Honeycomb can enable tag-rewrite again, once it \
+| | ... | was disabled by Honeycomb.
+| | ...
+| | [Teardown] | Honeycomb disables tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given rewrite tag from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | When Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_pop_1}
+| | Then rewrite tag from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_pop_1_oper}
+| | And rewrite tag from VAT should be
+| | ... | ${node} | ${sub_if_name} | ${tag_rewrite_pop_1_VAT}
+
+| TC13: Honeycomb modifies the tag-rewrite
+| | [Documentation] | Honeycomb sets the tag-rewrite:
+| | ... | 1. pop 1, then
+| | ... | 2. push, then
+| | ... | 3. translate 1 - 2
+| | ... | Then Honeycomb disables the tag-rewrite.
+| | ...
+| | [Teardown] | Honeycomb disables tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given rewrite tag from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | When Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_pop_1}
+| | Then rewrite tag from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_pop_1_oper}
+| | And rewrite tag from VAT should be
+| | ... | ${node} | ${sub_if_name} | ${tag_rewrite_pop_1_VAT}
+| | When Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_push}
+| | Then rewrite tag from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_push_oper}
+| | And rewrite tag from VAT should be
+| | ... | ${node} | ${sub_if_name} | ${tag_rewrite_push_VAT}
+| | When Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_translate_1_2}
+| | Then rewrite tag from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${tag_rewrite_translate_1_2_oper}
+| | And rewrite tag from VAT should be
+| | ... | ${node} | ${sub_if_name} | ${tag_rewrite_translate_1_2_VAT}
+| | When Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_disabled}
+| | Then rewrite tag from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And rewrite tag from VAT should be
+| | ... | ${node} | ${sub_if_name} | ${tag_rewrite_disabled_VAT}
+
+| TC14: Honeycomb fails to set wrong vlan-type in tag-rewrite
+| | [Documentation] | Check that Honeycomb does not accept wrong values of \
+| | ... | vlan-type in tag-rewrite.
+| | ...
+| | Given rewrite tag from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | When Honeycomb fails to set wrong rewrite tag
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${tag_rewrite_translate_1_2_wrong}
+| | Then rewrite tag from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And rewrite tag from VAT should be
+| | ... | ${node} | ${sub_if_name} | ${tag_rewrite_disabled_VAT}
+
+| TC15: Honeycomb configures sub-interface ipv4 address
+| | [Documentation] | Check if Honeycomb can configure an ipv4 address on the\
+| | ... | sub-interface.
+| | ...
+| | Given sub-interface ipv4 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv4 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+| | When Honeycomb sets sub-interface ipv4 address
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | Then sub-interface ipv4 address from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And sub-interface ipv4 address from VAT should be
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+
+| TC16: Honeycomb removes sub-interface ipv4 address
+| | [Documentation] | Check if Honeycomb can remove configured ipv4 addresses\
+| | ... | from the sub-interface.
+| | ...
+| | Given sub-interface ipv4 address from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | Run Keyword And Continue On Failure
+| | ... | And sub-interface ipv4 address from VAT should be
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | When Honeycomb removes all sub-interface ipv4 addresses
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | Then sub-interface ipv4 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv4 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+
+| TC17: Honeycomb modifies existing sub-interface ipv4 address
+| | [Documentation] | Check if Honeycomb can modify an ipv4 address already\
+| | ... | configured on the sub-interface.
+| | ...
+| | [Teardown] | Honeycomb removes all sub-interface ipv4 addresses
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given sub-interface ipv4 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv4 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+| | When Honeycomb sets sub-interface ipv4 address
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And Honeycomb sets sub-interface ipv4 address
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4_2['address']} | ${ipv4_2['prefix-length']}
+| | Then sub-interface ipv4 address from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4_2['address']} | ${ipv4_2['prefix-length']}
+| | And sub-interface ipv4 address from VAT should be
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv4_2['address']} | ${ipv4_2['prefix-length']}
+
+| TC18: Honeycomb modifies sub-interface exact tag match
+| | [Documentation] | Check if Honeycomb can modify a sub-interface with exact\
+| | ... | tag match.
+| | ...
+| | Given Honeycomb configures interface state | ${node} | ${super_if2} | down
+| | And sub-interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${super_if2} | ${sub_if_id}
+| | And interface Operational Data From VAT Should Be empty
+| | ... | ${node} | ${sub_if2_name}
+| | When Honeycomb creates sub-interface | ${node} | ${super_if2}
+| | ... | ${sub_if_2_match} | ${sub_if_2_tags} | ${sub_if_2_settings}
+| | Then Sub-interface Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${super_if2} | ${sub_if_id} | ${sub_if_2_oper}
+| | And Sub-interface Operational Data From VAT Should Be
+| | ... | ${node} | ${sub_if2_name} | ${sub_if_2_oper}
+| | And sub-interface indices from Honeycomb and VAT should correspond
+| | ... | ${node} | ${super_if2} | ${sub_if_id}
+
+| TC19: Honeycomb configures sub-interface ipv6 address
+| | [Documentation] | Check if Honeycomb can configure an ipv6 address on the\
+| | ... | sub-interface.
+| | ...
+| | Given sub-interface ipv6 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv6 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+| | When Honeycomb sets sub-interface ipv6 address
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv6['address']} | ${ipv6['prefix-length']}
+| | Then sub-interface IPv6 address from Honeycomb should contain
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv6['address']} | ${ipv6['prefix-length']}
+| | And sub-interface IPv6 address from VAT should contain
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv6['address']} | ${ipv6['prefix-length']}
+
+| TC20: Honeycomb removes sub-interface ipv6 address
+| | [Documentation] | Check if Honeycomb can remove configured ipv6 addresses\
+| | ... | from the sub-interface.
+| | ...
+| | Given sub-interface IPv6 address from Honeycomb should contain
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv6['address']} | ${ipv6['prefix-length']}
+| | Run Keyword And Continue On Failure
+| | ... | And sub-interface IPv6 address from VAT should contain
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv6['address']} | ${ipv6['prefix-length']}
+| | When Honeycomb removes all sub-interface ipv6 addresses
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | Then sub-interface ipv6 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv6 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+
+| TC21: Honeycomb modifies existing sub-interface ipv6 address
+| | [Documentation] | Check if Honeycomb can modify an ipv6 address already\
+| | ... | configured on the sub-interface.
+| | ...
+| | [Teardown] | Honeycomb removes all sub-interface ipv6 addresses
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Given sub-interface ipv6 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv6 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+| | When Honeycomb sets sub-interface ipv6 address
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv6['address']} | ${ipv6['prefix-length']}
+| | And Honeycomb sets sub-interface ipv6 address
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv6_2['address']} | ${ipv6_2['prefix-length']}
+| | Then sub-interface IPv6 address from Honeycomb should contain
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv6_2['address']} | ${ipv6_2['prefix-length']}
+| | And sub-interface IPv6 address from VAT should contain
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv6_2['address']} | ${ipv6_2['prefix-length']}
+
+| TC22: Honeycomb can configure unnumbered sub-interface
+| | [Documentation] | Check if Honeycomb can configure an unnumbered interface\
+| | ... | on a sub-interface, borrowing the IP address of 'local0'.
+| | ...
+| | Given sub-interface ipv4 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv4 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+| | And Honeycomb sets interface IPv4 address | ${node}
+| | ... | local0 | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | When Honeycomb adds unnumbered configuration to interface
+| | ... | ${node} | ${super_if}.${sub_if_id} | local0
+| | Then IPv4 address from Honeycomb should be
+| | ... | ${node} | local0 | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | local0
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']} | ${ipv4['netmask']}
+| | And sub-interface ipv4 address from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And sub-interface ipv4 address from VAT should be
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+
+| TC23: Honeycomb removes sub-interface unnumbered configuration
+| | [Documentation] | Check if Honeycomb can remove unnumbered configuration\
+| | ... | from a sub-interface.
+| | ...
+| | [Teardown] | Honeycomb removes interface IPv4 addresses | ${node}
+| | ... | local0
+| | ...
+| | Given IPv4 address from Honeycomb should be
+| | ... | ${node} | local0 | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | local0
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']} | ${ipv4['netmask']}
+| | And sub-interface ipv4 address from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And sub-interface ipv4 address from VAT should be
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | When Honeycomb removes unnumbered configuration from interface
+| | ... | ${node} | ${super_if}.${sub_if_id}
+| | Then IPv4 address from Honeycomb should be
+| | ... | ${node} | local0 | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | local0
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']} | ${ipv4['netmask']}
+| | And sub-interface ipv4 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv4 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+
+| TC24: Honeycomb can configure unnumbered interface using a sub-interface
+| | [Documentation] | Check if Honeycomb can configure an unnumbered interface\
+| | ... | on an interface, borrowing the IP address of a sub-interface.
+| | ...
+| | Given IPv4 address from Honeycomb should be empty | ${node} | local0
+| | And ipv4 address from VAT should be empty | ${node} | local0
+| | And sub-interface ipv4 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv4 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+| | And Honeycomb sets sub-interface ipv4 address
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | When Honeycomb adds unnumbered configuration to interface
+| | ... | ${node} | local0 | ${super_if}.${sub_if_id}
+| | Then IPv4 address from Honeycomb should be
+| | ... | ${node} | local0 | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | local0
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']} | ${ipv4['netmask']}
+| | And sub-interface ipv4 address from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And sub-interface ipv4 address from VAT should be
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+
+*** Keywords ***
+| Set super and sub interfaces up
+| | [Documentation] | Honeycomb sets super-interface and sub-interface up, in \
+| | ... | this order.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Information about a DUT node. Type: dictionary
+| | ... | - super_interface - Super interface. Type: string
+| | ... | - identifier - Sub-interface identifier. Type: integer or string
+| | ...
+| | ... | *Example:*
+| | ... | \| Set super and sub interfaces up\
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| 1 \|
+| | ...
+| | [Arguments] | ${node} | ${super_interface} | ${identifier}
+| | ...
+| | Honeycomb configures interface state
+| | ... | ${node} | ${super_interface} | up
+| | Honeycomb sets the sub-interface up
+| | ... | ${node} | ${super_interface} | ${identifier}
+
+| Set super and sub interfaces down
+| | [Documentation] | Honeycomb sets super-interface and sub-interface down, in\
+| | ... | this order.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Information about a DUT node. Type: dictionary
+| | ... | - super_interface - Super interface. Type: string
+| | ... | - identifier - Sub-interface identifier. Type: integer or string
+| | ...
+| | ... | *Example:*
+| | ... | \| Set super and sub interfaces down\
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| 1 \|
+| | ...
+| | [Arguments] | ${node} | ${super_interface} | ${identifier}
+| | ...
+| | Honeycomb configures interface state
+| | ... | ${node} | ${super_interface} | down
+| | Honeycomb sets the sub-interface down
+| | ... | ${node} | ${super_interface} | ${identifier}
+
+| Honeycomb disables tag rewrite
+| | [Documentation] |
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Information about a DUT node. Type: dictionary
+| | ... | - super_if - Super-interface. Type: string
+| | ... | - identifier - Sub-interface ID. Type: integer or string
+| | ...
+| | ... | *Example:*
+| | ... | \| Honeycomb disables tag rewrite \
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| 1 \|
+| | ...
+| | [Arguments] | ${node} | ${super_if} | ${sub_if_id}
+| | ...
+| | Honeycomb configures tag rewrite
+| | ... | ${node} | ${super_if} | ${sub_if_id} | ${tag_rewrite_disabled}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-intip4-intip6-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-intip4-intip6-apihc-apivat-func.robot
new file mode 100644
index 0000000000..f0f6e4e6ad
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-intip4-intip6-apihc-apivat-func.robot
@@ -0,0 +1,293 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+# Interface to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Variables | resources/test_data/honeycomb/interface_ip.py
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Documentation | *Honeycomb interface management test suite.*
+
+*** Test Cases ***
+| TC01: Honeycomb configures and reads interface state
+| | [Documentation] | Check if Honeycomb API can modify the admin state of\
+| | ... | VPP interfaces.
+| | ...
+| | Given Interface state from Honeycomb should be
+| | ... | ${node} | ${interface} | down
+| | And Interface state from VAT should be | ${node} | ${interface} | down
+| | When Honeycomb configures interface state | ${node} | ${interface} | up
+| | Then Interface state from Honeycomb should be
+| | ... | ${node} | ${interface} | up
+| | And Interface state from VAT should be | ${node} | ${interface} | up
+| | When Honeycomb configures interface state | ${node} | ${interface} | down
+| | Then Interface state from Honeycomb should be
+| | ... | ${node} | ${interface} | down
+| | And Interface state from VAT should be | ${node} | ${interface} | down
+
+| TC02: Honeycomb modifies interface IPv4 address with netmask
+| | [Documentation] | Check if Honeycomb API can configure interfaces for ipv4\
+| | ... | with address and netmask provided.
+| | ...
+| | Given IPv4 address from Honeycomb should be empty | ${node} | ${interface}
+| | And ipv4 address from VAT should be empty | ${node} | ${interface}
+| | When Honeycomb sets interface IPv4 address | ${node} | ${interface}
+| | ... | ${ipv4_address} | ${ipv4_mask}
+| | Then IPv4 address from Honeycomb should be
+| | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | ${interface} | ${ipv4_address}
+| | ... | ${ipv4_prefix} | ${ipv4_mask}
+
+| TC03: Honeycomb removes IPv4 address from interface
+| | [Documentation] | Check if Honeycomb API can remove configured ipv4\
+| | ... | addresses from interface.
+| | ...
+| | Given IPv4 address from Honeycomb should be
+| | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | ${interface} | ${ipv4_address}
+| | ... | ${ipv4_prefix} | ${ipv4_mask}
+| | When Honeycomb removes interface IPv4 addresses | ${node} | ${interface}
+| | Then IPv4 address from Honeycomb should be empty | ${node} | ${interface}
+| | And ipv4 address from VAT should be empty | ${node} | ${interface}
+
+| TC04: Honeycomb modifies interface IPv4 address with prefix
+| | [Documentation] | Check if Honeycomb API can configure interfaces for ipv4\
+| | ... | with address and prefix provided.
+| | ...
+| | [Teardown] | Honeycomb removes interface IPv4 addresses | ${node}
+| | ... | ${interface}
+| | ...
+| | Given IPv4 address from Honeycomb should be empty | ${node} | ${interface}
+| | And ipv4 address from VAT should be empty | ${node} | ${interface}
+| | When Honeycomb sets interface IPv4 address with prefix
+| | ... | ${node} | ${interface} | ${ipv4_address2} | ${ipv4_prefix}
+| | Then IPv4 address from Honeycomb should be
+| | ... | ${node} | ${interface} | ${ipv4_address2} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | ${interface} | ${ipv4_address2}
+| | ... | ${ipv4_prefix} | ${ipv4_mask}
+
+| TC05: Honeycomb modifies IPv4 neighbor table
+| | [Documentation] | Check if Honeycomb API can add and remove ARP entries.
+| | ...
+| | [Teardown] | Honeycomb clears all interface IPv4 neighbors
+| | ... | ${node} | ${interface}
+| | ...
+| | Given IPv4 neighbor from Honeycomb should be empty
+| | ... | ${node} | ${interface}
+| | When Honeycomb adds interface IPv4 neighbor
+| | ... | ${node} | ${interface} | ${ipv4_neighbor} | ${neighbor_mac}
+| | Then IPv4 neighbor from Honeycomb should be
+| | ... | ${node} | ${interface} | ${ipv4_neighbor} | ${neighbor_mac}
+
+| TC06: Honeycomb modifies interface configuration - IPv6
+| | [Documentation] | Check if Honeycomb API can configure interfaces for ipv6.
+| | ...
+| | [Teardown] | Honeycomb removes interface IPv6 addresses | ${node}
+| | ... | ${interface}
+| | ...
+| | Given IPv6 address from Honeycomb should be empty
+| | ... | ${node} | ${interface}
+| | And IPv6 address from VAT should be empty
+| | ... | ${node} | ${interface}
+| | When Honeycomb sets interface IPv6 address
+| | ... | ${node} | ${interface} | ${ipv6_address} | ${ipv6_prefix}
+| | Then IPv6 address from Honeycomb should contain
+| | ... | ${node} | ${interface} | ${ipv6_address} | ${ipv6_prefix}
+| | And IPv6 address from VAT should contain
+| | ... | ${node} | ${interface} | ${ipv6_address} | ${ipv6_prefix}
+
+| TC07: Honeycomb modifies IPv6 neighbor table
+| | [Documentation] | Check if Honeycomb API can add and remove ARP entries.
+| | ...
+| | [Teardown] | Honeycomb clears all interface IPv6 neighbors
+| | ... | ${node} | ${interface}
+| | ...
+| | Given IPv6 neighbor from Honeycomb should be empty
+| | ... | ${node} | ${interface}
+| | When Honeycomb adds interface IPv6 neighbor
+| | ... | ${node} | ${interface} | ${ipv6_neighbor} | ${neighbor_mac}
+| | Then IPv6 neighbor from Honeycomb should be
+| | ... | ${node} | ${interface} | ${ipv6_neighbor} | ${neighbor_mac}
+
+| TC08: Honeycomb modifies interface configuration - MTU
+| | [Documentation] | Check if Honeycomb API can configure interface\
+| | ... | MTU value.
+| | ...
+| | When Honeycomb sets interface ethernet configuration
+| | ... | ${node} | ${interface} | ${ethernet}
+| | Then Interface ethernet Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${interface} | ${ethernet}
+| | And Interface ethernet Operational Data From VAT Should Be
+| | ... | ${node} | ${interface} | ${ethernet['mtu']}
+
+| TC09: Honeycomb modifies interface configuration - vrf
+| | [Documentation] | Check if Honeycomb API can configure interface\
+| | ... | vrf ID.
+| | ...
+| | [Teardown] | Honeycomb sets interface VRF ID
+| | ... | ${node} | ${interface} | ${0} | ipv4
+| | ...
+| | When Honeycomb sets interface VRF ID
+| | ... | ${node} | ${interface} | ${1} | ipv4
+| | Then Interface VRF ID from Honeycomb should be
+| | ... | ${node} | ${interface} | ${1} | ipv4
+| | And Interface VRF ID from VAT should be
+| | ... | ${node} | ${interface} | ${1}
+
+| TC10: Honeycomb can configure multiple IP addresses on one interface
+| | [Documentation] | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-ICMP; Eth-IPv6-ICMPv6
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 set two IPv4 addresses\
+| | ... | and two IPv6 addresses on first interfaces to TG and add ARP entries\
+| | ... | for each address.
+| | ... | [Ver] Send ICMP packets from TG to DUT, using different sets\
+| | ... | of source and destination IP addresses. Receive an ICMP reply\
+| | ... | for every packet sent.
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | When Honeycomb sets interface IPv4 address with prefix
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${ipv4_address} | ${ipv4_prefix}
+| | And Honeycomb adds interface IPv4 address
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${ipv4_address2} | ${ipv4_prefix}
+| | And Honeycomb sets interface IPv6 address
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${ipv6_address} | ${ipv6_prefix}
+| | And Honeycomb adds interface IPv6 address
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${ipv6_address2} | ${ipv6_prefix}
+| | Then IPv4 address from Honeycomb should be
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${ipv4_address} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${ipv4_address}
+| | ... | ${ipv4_prefix} | ${ipv4_mask}
+| | And IPv6 address from Honeycomb should contain
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${ipv6_address} | ${ipv6_prefix}
+| | And IPv6 address from VAT should contain
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${ipv6_address} | ${ipv6_prefix}
+| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
+| | And Honeycomb adds interface IPv4 neighbor | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${ipv4_neighbor} | ${neighbor_mac}
+| | And Honeycomb adds interface IPv4 neighbor | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${ipv4_neighbor2} | ${neighbor_mac2}
+| | And Honeycomb adds interface IPv6 neighbor | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${ipv6_neighbor} | ${neighbor_mac}
+| | And Honeycomb adds interface IPv6 neighbor | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${ipv6_neighbor2} | ${neighbor_mac2}
+| | And Suppress ICMPv6 router advertisement message | ${nodes}
+| | Then Ping and Verify IP address | ${nodes['TG']}
+| | ... | ${ipv4_neighbor} | ${ipv4_address}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac}
+| | And Ping and Verify IP address | ${nodes['TG']}
+| | ... | ${ipv4_neighbor2} | ${ipv4_address2}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac}
+| | And Ping and Verify IP address | ${nodes['TG']}
+| | ... | ${ipv6_neighbor} | ${ipv6_address}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac}
+| | And Ping and Verify IP address | ${nodes['TG']}
+| | ... | ${ipv6_neighbor2} | ${ipv6_address2}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac}
+
+| TC11: Honeycomb can configure unnumbered interface
+| | [Documentation] | Check if Honeycomb can configure an unnumbered interface\
+| | ... | on a physical interface, borrowing the IP address of 'local0'.
+| | ...
+| | Given Honeycomb sets interface IPv4 address | ${node}
+| | ... | local0 | ${ipv4_address} | ${ipv4_prefix}
+| | When Honeycomb adds unnumbered configuration to interface
+| | ... | ${node} | ${interface} | local0
+| | Then IPv4 address from Honeycomb should be
+| | ... | ${node} | local0 | ${ipv4_address} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | local0 | ${ipv4_address}
+| | ... | ${ipv4_prefix} | ${ipv4_mask}
+| | And IPv4 address from Honeycomb should be
+| | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | ${interface} | ${ipv4_address}
+| | ... | ${ipv4_prefix} | ${ipv4_mask}
+
+| TC12: Honeycomb removes interface unnumbered configuration
+| | [Documentation] | Check if Honeycomb can remove unnumbered configuration\
+| | ... | from an interface.
+| | ...
+| | Given IPv4 address from Honeycomb should be
+| | ... | ${node} | local0 | ${ipv4_address} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | local0 | ${ipv4_address}
+| | ... | ${ipv4_prefix} | ${ipv4_mask}
+| | And IPv4 address from Honeycomb should be
+| | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | ${interface} | ${ipv4_address}
+| | ... | ${ipv4_prefix} | ${ipv4_mask}
+| | When Honeycomb removes unnumbered configuration from interface
+| | ... | ${node} | ${interface}
+| | Then IPv4 address from Honeycomb should be
+| | ... | ${node} | local0 | ${ipv4_address} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | local0 | ${ipv4_address}
+| | ... | ${ipv4_prefix} | ${ipv4_mask}
+| | And IPv4 address from Honeycomb should be empty | ${node} | ${interface}
+| | And ipv4 address from VAT should be empty | ${node} | ${interface}
+
+| TC13: Honeycomb fails to configure two IPv4 addresses from the same subnet
+| | [Documentation] | Check if Honeycomb can configure two IPv4 addresses in\
+| | ... | the same subnet onto a single interface. It should not be possible.
+| | ...
+| | [Teardown] | Honeycomb removes interface IPv4 addresses | ${node}
+| | ... | ${interface}
+| | ...
+| | [Tags] | EXPECTED_FAILING
+| | ...
+# VPP API does not configure the second address, but returns success. VPP-649
+| | When Honeycomb sets interface IPv4 address with prefix
+| | ... | ${node} | ${interface} | 192.168.0.1 | ${9}
+| | Then Honeycomb fails to add interface IPv4 address
+| | ... | ${node} | ${interface} | 192.168.0.2 | ${9}
+| | And Honeycomb fails to add interface IPv4 address
+| | ... | ${node} | ${interface} | 192.232.0.2 | ${9}
+
+| TC14: Honeycomb fails to configure two IPv6 addresses from the same subnet
+| | [Documentation] | Check if Honeycomb can configure two IPv6 addresses in\
+| | ... | the same subnet onto a single interface. It should not be possible.
+| | ...
+| | [Tags] | EXPECTED_FAILING
+| | ...
+# VPP API does not configure the second address, but returns success. VPP-649
+| | [Teardown] | Honeycomb removes interface IPv6 addresses | ${node}
+| | ... | ${interface}
+| | When Honeycomb sets interface IPv6 address
+| | ... | ${node} | ${interface} | 10::FF10 | ${64}
+| | Then Honeycomb fails to add interface IPv6 address
+| | ... | ${node} | ${interface} | 10::FF11 | ${64}
+| | And Honeycomb fails to add interface IPv6 address
+| | ... | ${node} | ${interface} | 10::FFFF | ${64}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-inttap-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-inttap-apihc-apivat-func.robot
new file mode 100644
index 0000000000..cffec5b246
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-inttap-apihc-apivat-func.robot
@@ -0,0 +1,79 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+# Interfaces to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+| ${tap_interface}= | tap_test
+# Configuration which will be set and verified during tests.
+| &{tap_settings}= | tap-name=tap_test | mac=08:00:27:c0:5d:37
+| ... | device-instance=${1}
+| &{tap_settings2}= | tap-name=tap_test | mac=08:00:27:60:26:ab
+| ... | device-instance=${2}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/tap.robot
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Documentation | *Honeycomb TAP management test suite.*
+
+*** Test Cases ***
+| TC01: Honeycomb configures TAP interface
+| | [Documentation] | Check if Honeycomb API can configure a TAP interface.
+| | ...
+| | Given TAP Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${tap_interface}
+| | And TAP Operational Data From VAT Should Be empty
+| | ... | ${node} | ${tap_interface}
+| | When Honeycomb creates TAP interface
+| | ... | ${node} | ${tap_interface} | ${tap_settings}
+| | Then TAP Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${tap_interface} | ${tap_settings}
+| | And TAP Operational Data From VAT Should Be
+| | ... | ${node} | ${tap_interface} | ${tap_settings}
+
+| TC02: Honeycomb modifies existing TAP interface configuration
+| | [Documentation] | Check if Honeycomb API can re-configure and existing TAP\
+| | ... | interface with new settings.
+| | ...
+| | Given TAP Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${tap_interface} | ${tap_settings}
+| | And TAP Operational Data From VAT Should Be
+| | ... | ${node} | ${tap_interface} | ${tap_settings}
+| | When Honeycomb configures TAP interface
+| | ... | ${node} | ${tap_interface} | ${tap_settings2}
+| | Then TAP Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${tap_interface} | ${tap_settings2}
+| | And TAP Operational Data From VAT Should Be
+| | ... | ${node} | ${tap_interface} | ${tap_settings2}
+
+| TC03: Honeycomb removes TAP interface
+| | [Documentation] | Check if Honeycomb API can remove TAP interface.
+| | ...
+| | Given TAP Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${tap_interface} | ${tap_settings2}
+| | And TAP Operational Data From VAT Should Be
+| | ... | ${node} | ${tap_interface} | ${tap_settings2}
+| | When Honeycomb removes TAP interface | ${node} | ${tap_interface}
+| | Then TAP Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${tap_interface}
+| | And TAP Operational Data From VAT Should Be empty
+| | ... | ${node} | ${tap_interface}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-intvhost-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-intvhost-apihc-apivat-func.robot
new file mode 100644
index 0000000000..c5cbe6ea4a
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-intvhost-apihc-apivat-func.robot
@@ -0,0 +1,163 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+| ${interface}= | ${node['interfaces']['port1']['name']}
+| ${vhost_interface}= | test_vhost
+| &{vhost_user_server}= | socket=/tmp/soc1 | role=server
+| &{vhost_user_server_edit_1}= | socket=/tmp/soc12 | role=server
+| &{vhost_user_server_edit_2}= | socket=/tmp/soc12 | role=client
+| &{vhost_user_client}= | socket=/tmp/soc2 | role=client
+| &{vhost_user_client_edit_1}= | socket=/tmp/soc22 | role=client
+| &{vhost_user_client_edit_2}= | socket=/tmp/soc22 | role=server
+| &{vhost_user_wrong}= | socket=/tmp/soc2 | role=wrong
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/vhost_user.robot
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Documentation | *Honeycomb vhost-user interface management test suite.*
+
+*** Test Cases ***
+| TC01: Honeycomb creates vhost-user interface - server
+| | [Documentation] | Check if Honeycomb creates a vhost-user interface, role:\
+| | ... | server.
+| | ...
+| | Given vhost-user Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vhost_interface}
+| | When Honeycomb creates vhost-user interface
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_server}
+| | Then vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_server}
+| | And vhost-user Operational Data From VAT Should Be
+| | ... | ${node} | ${vhost_user_server}
+
+| TC02: Honeycomb modifies vhost-user interface - server
+| | [Documentation] | Check if Honeycomb can modify properties of existing\
+| | ... | vhost-user interface, role: server.
+| | ...
+| | Given vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_server}
+| | When Honeycomb configures vhost-user interface
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_server_edit_1}
+| | Then vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_server_edit_1}
+| | And vhost-user Operational Data From VAT Should Be
+| | ... | ${node} | ${vhost_user_server_edit_1}
+| | When Honeycomb configures vhost-user interface
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_server_edit_2}
+| | Then vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_server_edit_2}
+| | And vhost-user Operational Data From VAT Should Be
+| | ... | ${node} | ${vhost_user_server_edit_2}
+| | When Honeycomb configures vhost-user interface
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_server}
+| | Then vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_server}
+| | And vhost-user Operational Data From VAT Should Be
+| | ... | ${node} | ${vhost_user_server}
+
+| TC03: Honeycomb deletes vhost-user interface - server
+| | [Documentation] | Check if Honeycomb can delete an existing vhost-user\
+| | ... | interface, role: server.
+| | ...
+| | Given vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_server}
+| | When Honeycomb removes vhost-user interface
+| | ... | ${node} | ${vhost_interface}
+| | Then vhost-user Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vhost_interface}
+| | And vhost-user Operational Data From VAT Should Be empty
+| | ... | ${node}
+
+| TC04: Honeycomb creates vhost-user interface - client
+| | [Documentation] | Check if Honeycomb creates a vhost-user interface, role:\
+| | ... | client.
+| | ...
+| | Given vhost-user Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vhost_interface}
+| | When Honeycomb creates vhost-user interface
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_client}
+| | Then vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_client}
+| | And vhost-user Operational Data From VAT Should Be
+| | ... | ${node} | ${vhost_user_client}
+
+| TC05: Honeycomb modifies vhost-user interface - client
+| | [Documentation] | Check if Honeycomb can modify properties of existing\
+| | ... | vhost-user interface, role: client.
+| | ...
+| | Given vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_client}
+| | When Honeycomb configures vhost-user interface
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_client_edit_1}
+| | Then vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_client_edit_1}
+| | And vhost-user Operational Data From VAT Should Be
+| | ... | ${node} | ${vhost_user_client_edit_1}
+| | When Honeycomb configures vhost-user interface
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_client_edit_2}
+| | Then vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_client_edit_2}
+| | And vhost-user Operational Data From VAT Should Be
+| | ... | ${node} | ${vhost_user_client_edit_2}
+| | When Honeycomb configures vhost-user interface
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_client}
+| | Then vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_client}
+| | And vhost-user Operational Data From VAT Should Be
+| | ... | ${node} | ${vhost_user_client}
+
+| TC06: Honeycomb deletes vhost-user interface - client
+| | [Documentation] | Check if Honeycomb can delete an existing vhost-user\
+| | ... | interface, role: client.
+| | ...
+| | Given vhost-user Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_client}
+| | When Honeycomb removes vhost-user interface
+| | ... | ${node} | ${vhost_interface}
+| | Then vhost-user Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vhost_interface}
+| | And vhost-user Operational Data From VAT Should Be empty
+| | ... | ${node}
+
+| TC07: Honeycomb does not set vhost-user configuration on another interface type
+| | [Documentation] | Check if Honeycomb refuses to set vhost-user\
+| | ... | configuration for interface which is not v3po:vhost-user type.
+| | ...
+| | When Honeycomb fails setting vhost-user on different interface type
+| | ... | ${node} | ${interface} | ${vhost_user_server}
+| | Then vhost-user Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${interface}
+| | And vhost-user Operational Data From VAT Should Be empty
+| | ... | ${node}
+
+| TC08: Honeycomb does not set invalid vhost-user configuration
+| | [Documentation] | Check if Honeycomb refuses to set invalid parameters to\
+| | ... | vhost-user interface.
+| | ...
+| | Given vhost-user Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vhost_interface}
+| | When Honeycomb fails setting invalid vhost-user configuration
+| | ... | ${node} | ${vhost_interface} | ${vhost_user_wrong}
+| | Then vhost-user Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vhost_interface}
+| | And vhost-user Operational Data From VAT Should Be empty
+| | ... | ${node}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-l2bd-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-l2bd-apihc-apivat-func.robot
new file mode 100644
index 0000000000..a869e96c11
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-l2bd-apihc-apivat-func.robot
@@ -0,0 +1,116 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+# Interfaces to run tests on.
+| @{interfaces}= | ${node['interfaces']['port1']['name']}
+| ... | ${node['interfaces']['port3']['name']}
+# Configuration which will be set and verified during tests.
+| ${bd1_name}= | bd-01
+| ${bd2_name}= | bd-02
+| &{bd_settings}= | flood=${True} | forward=${True} | learn=${True}
+| ... | unknown-unicast-flood=${True} | arp-termination=${True}
+| &{if_settings}= | split_horizon_group=${1} | bvi=${False}
+| &{if_settings2}= | split_horizon_group=${2} | bvi=${True}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/bridge_domain.robot
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Documentation | *Honeycomb bridge domain management test suite.*
+
+*** Test Cases ***
+| TC01: Honeycomb sets up l2 bridge domain
+| | [Documentation] | Check if Honeycomb can create bridge domains on VPP node.
+| | ...
+| | When Honeycomb creates first l2 bridge domain
+| | ... | ${node} | ${bd1_name} | ${bd_settings}
+| | Then Bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${bd1_name} | ${bd_settings}
+| | And Bridge domain Operational Data From VAT Should Be
+| | ... | ${node} | ${0} | ${bd_settings}
+
+| TC02: Honeycomb manages multiple bridge domains on node
+| | [Documentation] | Check if Honeycomb can manage multiple bridge domains on\
+| | ... | a single node.
+| | ...
+| | Given Bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${bd1_name} | ${bd_settings}
+| | When Honeycomb creates l2 bridge domain
+| | ... | ${node} | ${bd2_name} | ${bd_settings}
+| | Then Bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${bd1_name} | ${bd_settings}
+| | And Bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${bd2_name} | ${bd_settings}
+| | And Bridge domain Operational Data From VAT Should Be
+| | ... | ${node} | ${0} | ${bd_settings}
+| | And Bridge domain Operational Data From VAT Should Be
+| | ... | ${node} | ${1} | ${bd_settings}
+
+| TC03: Honeycomb removes bridge domains
+| | [Documentation] | Check if Honeycomb can remove bridge domains from a VPP\
+| | ... | node.
+| | ...
+| | Given Bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${bd1_name} | ${bd_settings}
+| | When Honeycomb removes all bridge domains | ${node}
+| | Then Honeycomb should show no bridge domains | ${node}
+| | And VAT should show no bridge domains | ${node}
+
+| TC04: Honeycomb assigns interfaces to bridge domain
+| | [Documentation] | Check if Honeycomb can assign VPP interfaces to an\
+| | ... | existing bridge domain.
+| | ...
+| | Given Honeycomb creates first l2 bridge domain
+| | ... | ${node} | ${bd1_name} | ${bd_settings}
+| | When Honeycomb adds interfaces to bridge domain
+| | ... | ${node} | @{interfaces} | ${bd1_name} | ${if_settings}
+| | Then Bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${bd1_name} | ${bd_settings}
+| | And Bridge domain Operational Data From VAT Should Be
+| | ... | ${node} | ${0} | ${bd_settings}
+| | And Honeycomb should show interfaces assigned to bridge domain
+| | ... | ${node} | @{interfaces} | ${bd1_name} | ${if_settings}
+| | And VAT should show interfaces assigned to bridge domain
+| | ... | ${node} | ${0} | @{interfaces} | ${if_settings}
+
+| TC05: Honeycomb cannot remove bridge domain with an interface assigned
+| | [Documentation] | Check if Honeycomb can remove a bridge domain that has an\
+| | ... | interface assigned to it. Expect to fail with code 500.
+| | ...
+| | Given Bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${bd1_name} | ${bd_settings}
+| | And Bridge domain Operational Data From VAT Should Be
+| | ... | ${node} | ${0} | ${bd_settings}
+| | And Honeycomb should show interfaces assigned to bridge domain
+| | ... | ${node} | @{interfaces} | ${bd1_name} | ${if_settings}
+| | And VAT should show interfaces assigned to bridge domain
+| | ... | ${node} | ${0} | @{interfaces} | ${if_settings}
+| | When Run keyword and expect error | HoneycombError* Status code: 500.
+| | ... | Honeycomb removes all bridge domains | ${node}
+| | Then Bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${bd1_name} | ${bd_settings}
+| | And Bridge domain Operational Data From VAT Should Be
+| | ... | ${node} | ${0} | ${bd_settings}
+| | And Honeycomb should show interfaces assigned to bridge domain
+| | ... | ${node} | @{interfaces} | ${bd1_name} | ${if_settings}
+| | And VAT should show interfaces assigned to bridge domain
+| | ... | ${node} | ${0} | @{interfaces} | ${if_settings}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-l2fib-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-l2fib-apihc-apivat-func.robot
new file mode 100644
index 0000000000..c243af28f9
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-l2fib-apihc-apivat-func.robot
@@ -0,0 +1,232 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/bridge_domain.robot
+| Resource | resources/libraries/robot/honeycomb/l2_fib.robot
+| Variables | resources/test_data/honeycomb/l2_fib.py | ${node} | ${interface}
+| ... | ${interface2}
+| ...
+| Documentation | *Honeycomb L2 FIB management test suite.*
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force tags | HC_FUNC
+
+*** Variables ***
+# Interface to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+| ${interface2}= | ${node['interfaces']['port3']['name']}
+
+*** Test Cases ***
+| TC01: Honeycomb adds L2 FIB entry (forward)
+| | [Documentation] | Honeycomb creates a bridge domain and assignes an \
+| | ... | interface to it. Then adds an L2 FIB entry (forward) to the bridge \
+| | ... | domain.
+| | ...
+| | [Teardown] | Honeycomb removes L2 FIB entry
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_oper['phys-address']}
+| | ...
+| | Given Interface state from Honeycomb should be
+| | ... | ${node} | ${interface} | down
+| | When Honeycomb configures interface state
+| | ... | ${node} | ${interface} | up
+| | Then Interface state from Honeycomb should be
+| | ... | ${node} | ${interface} | up
+| | When Honeycomb creates first l2 bridge domain
+| | ... | ${node} | ${bd_name} | ${bd_settings}
+| | Then Bridge domain Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${bd_name} | ${bd_settings}
+| | Given Bridge domain Operational Interface Assignment should be empty
+| | ... | ${node} | ${interface}
+| | When Honeycomb adds interface to bridge domain
+| | ... | ${node} | ${interface} | ${bd_name} | ${if_bd_settings}
+| | Then Bridge domain Operational Interface Assignment should be
+| | ... | ${node} | ${interface} | ${if_bd_settings}
+| | Given L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+| | When Honeycomb adds L2 FIB entry to bridge domain
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_cfg}
+| | Then L2 FIB Entry from Honeycomb should be
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_oper}
+| | And L2 FIB entry from VAT should be
+| | ... | ${node} | ${bd_index} | ${l2_fib_forward_vat}
+
+| TC02: Honeycomb adds L2 FIB entry (static, forward)
+| | [Documentation] | Honeycomb adds an L2 FIB entry (static, forward) to the \
+| | ... | bridge domain.
+| | ...
+| | [Teardown] | Honeycomb removes L2 FIB entry
+| | ... | ${node} | ${bd_name} | ${l2_fib_static_forward_oper['phys-address']}
+| | ...
+| | Given Bridge domain Operational Interface Assignment should be
+| | ... | ${node} | ${interface} | ${if_bd_settings}
+| | And L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+| | When Honeycomb adds L2 FIB entry to bridge domain
+| | ... | ${node} | ${bd_name} | ${l2_fib_static_forward_cfg}
+| | Then L2 FIB Entry from Honeycomb should be
+| | ... | ${node} | ${bd_name} | ${l2_fib_static_forward_oper}
+| | And L2 FIB entry from VAT should be
+| | ... | ${node} | ${bd_index} | ${l2_fib_static_forward_vat}
+
+| TC03: Honeycomb adds L2 FIB entry (static, filter)
+| | [Documentation] | Honeycomb adds an L2 FIB entry (static, filter) to the \
+| | ... | bridge domain.
+| | ...
+| | [Teardown] | Honeycomb removes L2 FIB entry
+| | ... | ${node} | ${bd_name} | ${l2_fib_filter_oper['phys-address']}
+| | ...
+| | Given Bridge domain Operational Interface Assignment should be
+| | ... | ${node} | ${interface} | ${if_bd_settings}
+| | And L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+| | When Honeycomb adds L2 FIB entry to bridge domain
+| | ... | ${node} | ${bd_name} | ${l2_fib_filter_cfg}
+| | Then L2 FIB Entry from Honeycomb should be
+| | ... | ${node} | ${bd_name} | ${l2_fib_filter_oper}
+| | And L2 FIB entry from VAT should be
+| | ... | ${node} | ${bd_index} | ${l2_fib_filter_vat}
+
+| TC04: Honeycomb adds and removes L2 FIB entry (forward)
+| | [Documentation] | Honeycomb adds an L2 FIB entry (forward) to the bridge \
+| | ... | domain and then Honeycomb removes it from the bridge domain.
+| | ...
+| | [Teardown] | Honeycomb removes L2 FIB entry
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_oper['phys-address']}
+| | ...
+| | Given Bridge domain Operational Interface Assignment should be
+| | ... | ${node} | ${interface} | ${if_bd_settings}
+| | And L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+| | When Honeycomb adds L2 FIB entry to bridge domain
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_cfg}
+| | Then L2 FIB Entry from Honeycomb should be
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_oper}
+| | And L2 FIB entry from VAT should be
+| | ... | ${node} | ${bd_index} | ${l2_fib_forward_vat}
+| | When Honeycomb removes L2 FIB entry
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_oper['phys-address']}
+| | Then L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+
+| TC05: Honeycomb adds more than one L2 FIB entry
+| | [Documentation] | Honeycomb adds three L2 FIB entries to the bridge domain.
+| | ...
+| | [Teardown] | Honeycomb removes all L2 FIB entries
+| | ... | ${node} | ${bd_name}
+| | ...
+| | Given Bridge domain Operational Interface Assignment should be
+| | ... | ${node} | ${interface} | ${if_bd_settings}
+| | And L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+| | When Honeycomb adds L2 FIB entry to bridge domain
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_cfg}
+| | And Honeycomb adds L2 FIB entry to bridge domain
+| | ... | ${node} | ${bd_name} | ${l2_fib_static_forward_cfg}
+| | And Honeycomb adds L2 FIB entry to bridge domain
+| | ... | ${node} | ${bd_name} | ${l2_fib_filter_cfg}
+| | Then L2 FIB Entry from Honeycomb should be
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_oper}
+| | And L2 FIB Entry from Honeycomb should be
+| | ... | ${node} | ${bd_name} | ${l2_fib_static_forward_oper}
+| | And L2 FIB Entry from Honeycomb should be
+| | ... | ${node} | ${bd_name} | ${l2_fib_filter_oper}
+| | And L2 FIB entry from VAT should be
+| | ... | ${node} | ${bd_index} | ${l2_fib_forward_vat}
+| | And L2 FIB entry from VAT should be
+| | ... | ${node} | ${bd_index} | ${l2_fib_static_forward_vat}
+| | And L2 FIB entry from VAT should be
+| | ... | ${node} | ${bd_index} | ${l2_fib_filter_vat}
+
+| TC06: Honeycomb fails to set wrong L2 FIB entry
+| | [Documentation] | Honeycomb tries to add an L2 FIB entry with wrong \
+| | ... | parameters to the bridge domain. It must fail.
+| | ...
+| | [Teardown] | Honeycomb removes all L2 FIB entries
+| | ... | ${node} | ${bd_name}
+| | ...
+| | Given Bridge domain Operational Interface Assignment should be
+| | ... | ${node} | ${interface} | ${if_bd_settings}
+| | And L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+| | When Honeycomb fails to add wrong L2 FIB entry
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_cfg_wrong_mac}
+| | Then L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+| | When Honeycomb fails to add wrong L2 FIB entry
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_cfg_wrong_if}
+| | Then L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+| | When Honeycomb fails to add wrong L2 FIB entry
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_cfg_wrong_action}
+| | Then L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+
+| TC07: Honeycomb fails to modify existing L2 FIB entry
+| | [Documentation] | Honeycomb tries to modify an existing L2 FIB entry. It \
+| | ... | must fail.
+| | ...
+| | [Teardown] | Honeycomb removes all L2 FIB entries
+| | ... | ${node} | ${bd_name}
+| | ...
+| | Given Bridge domain Operational Interface Assignment should be
+| | ... | ${node} | ${interface} | ${if_bd_settings}
+| | And L2 FIB Table from Honeycomb should be empty
+| | ... | ${node} | ${bd_name}
+| | And L2 FIB Table from VAT should be empty
+| | ... | ${node} | ${bd_index}
+| | When Honeycomb adds L2 FIB entry to bridge domain
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_cfg}
+| | Then L2 FIB Entry from Honeycomb should be
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_oper}
+| | When Honeycomb fails to modify L2 FIB entry
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_oper['phys-address']}
+| | ... | outgoing-interface
+| | ... | ${l2_fib_forward_modified_cfg['outgoing-interface']}
+| | Then L2 FIB Entry from Honeycomb should be
+| | ... | ${node} | ${bd_name} | ${l2_fib_forward_oper}
+| | And L2 FIB entry from VAT should be
+| | ... | ${node} | ${bd_index} | ${l2_fib_forward_vat}
+
+*** Keywords ***
+| Set test interface down
+| | [Documentation] | Set the interface used in tests down.
+| | ...
+| | Honeycomb configures interface state
+| | ... | ${node} | ${interface} | down
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-lisp-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-lisp-apihc-apivat-func.robot
new file mode 100644
index 0000000000..ac5af9ab83
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-lisp-apihc-apivat-func.robot
@@ -0,0 +1,224 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables***
+| ${ip_address}= | 192.168.0.4
+| @{ip_addresses}= | 192.168.0.4 | 192.168.0.5 | 192.168.0.6 | 192.168.0.7
+| ${state}= | enabled
+| ${interface}= | ${node['interfaces']['port1']['name']}
+| ${bd_name}= | bd_lisp
+| ${bd2_name}= | bd2_lisp
+| &{bd_settings}= | flood=${True} | forward=${True} | learn=${True}
+| ... | unknown-unicast-flood=${True} | arp-termination=${True}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/lisp.robot
+| Resource | resources/libraries/robot/honeycomb/bridge_domain.robot
+| Variables | resources/test_data/honeycomb/lisp.py
+| ...
+| Documentation | *Honeycomb Lisp test suite.*
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+
+*** Test Cases ***
+| TC01: Honeycomb enables LISP feature
+| | [Documentation] | Check if Honeycomb can enable the Lisp feature.
+| | ...
+| | Given Lisp Should Not Be Configured | ${node}
+| | When Honeycomb enables LISP | ${node}
+| | Then LISP state from Honeycomb should be | ${node} | ${state}
+| | And LISP state from VAT should be | ${node} | ${state}
+
+| TC02: Honeycomb adds locator set and locator
+| | [Documentation] | Check if Honeycomb can configure a locator set.
+| | ...
+| | Given LISP state from Honeycomb should be | ${node} | ${state}
+| | When Honeycomb adds locator set | ${node} | ${interface} | ${locator_set}
+| | Then Locator Set From Honeycomb Should Be
+| | ... | ${node} | ${interface} | ${locator_set}
+
+| TC03: Honeycomb configures Lisp - remote mapping - Bridge Domain
+| | [Documentation] | Check if Honeycomb can configure a remote Lisp mapping\
+| | ... | with a bridge domain.
+| | ...
+| | Given LISP state from Honeycomb should be | ${node} | ${state}
+| | And Honeycomb creates first l2 bridge domain
+| | ... | ${node} | ${bd_name} | ${bd_settings}
+| | When Honeycomb adds LISP mapping | ${node} | ${lisp_settings_remote_bd}
+| | Then LISP mapping from Honeycomb should be
+| | ... | ${node} | ${remote_bd_subtable}
+| | And LISP mapping from VAT should be
+| | ... | ${node} | ${vat_remote_bd}
+
+| TC04: Honeycomb can remove Lisp mapping
+| | [Documentation] | Check if Honeycomb can remove a configured Lisp mapping.
+| | ...
+| | Given LISP mapping from Honeycomb should be
+| | ... | ${node} | ${remote_bd_subtable}
+| | And LISP mapping from VAT should be
+| | ... | ${node} | ${vat_remote_bd}
+| | When Honeycomb removes all lisp mappings | ${node}
+| | Then LISP mappings from Honeycomb should not exist
+| | ... | ${node}
+| | And LISP mappings from VAT should not exist
+| | ... | ${node}
+
+| TC05: Honeycomb configures Lisp - remote mapping - VRF
+| | [Documentation] | Check if Honeycomb can configure a remote Lisp mapping\
+| | ... | with VRF.
+| | ...
+| | [Teardown] | Honeycomb removes all lisp mappings | ${node}
+| | ...
+| | Given LISP mappings from Honeycomb should not exist
+| | ... | ${node}
+| | And LISP mappings from VAT should not exist
+| | ... | ${node}
+| | When Honeycomb adds LISP mapping | ${node} | ${lisp_settings_remote_vrf}
+| | Then LISP mapping from Honeycomb should be
+| | ... | ${node} | ${remote_vrf_subtable}
+| | And LISP mapping from VAT should be | ${node} | ${vat_remote_vrf}
+
+| TC06: Honeycomb configures Lisp - local mapping - Bridge Domain
+| | [Documentation] | Check if Honeycomb can configure a local Lisp mapping\
+| | ... | with a bridge domain.
+| | ...
+| | [Teardown] | Honeycomb removes all lisp mappings | ${node}
+| | ...
+| | Given Locator Set From Honeycomb Should Be
+| | ... | ${node} | ${interface} | ${locator_set}
+| | And LISP mappings from Honeycomb should not exist
+| | ... | ${node}
+| | And LISP mappings from VAT should not exist
+| | ... | ${node}
+| | And Honeycomb creates first l2 bridge domain
+| | ... | ${node} | ${bd2_name} | ${bd_settings}
+| | When Honeycomb adds LISP mapping | ${node} | ${lisp_settings_local_bd}
+| | Then LISP mapping from Honeycomb should be | ${node} | ${local_bd_subtable}
+| | And LISP mapping from VAT should be | ${node} | ${vat_local_bd}
+
+| TC07: Honeycomb configures Lisp - local mapping - VRF
+| | [Documentation] | Check if Honeycomb can configure a local Lisp mapping\
+| | ... | with VRF.
+| | ...
+| | [Teardown] | Honeycomb removes all lisp mappings | ${node}
+| | ...
+| | Given Locator Set From Honeycomb Should Be
+| | ... | ${node} | ${interface} | ${locator_set}
+| | And LISP mappings from Honeycomb should not exist
+| | ... | ${node}
+| | And LISP mappings from VAT should not exist
+| | ... | ${node}
+| | When Honeycomb adds LISP mapping | ${node} | ${lisp_settings_local_vrf}
+| | Then LISP mapping from Honeycomb should be | ${node} | ${local_vrf_subtable}
+| | And LISP mapping from VAT should be | ${node} | ${vat_local_vrf}
+
+| TC08: Honeycomb configures Lisp mapping with adjacency
+| | [Documentation] | Check if Honeycomb can configure local and remote Lisp\
+| | ... | mappings with VRF, and configure adjacency.
+| | ...
+| | [Teardown] | Honeycomb removes all lisp mappings | ${node}
+| | ...
+| | Given Locator Set From Honeycomb Should Be
+| | ... | ${node} | ${interface} | ${locator_set}
+| | And Honeycomb creates first l2 bridge domain
+| | ... | ${node} | ${bd2_name} | ${bd_settings}
+| | And LISP mappings from Honeycomb should not exist
+| | ... | ${node}
+| | And LISP mappings from VAT should not exist
+| | ... | ${node}
+| | And Honeycomb adds LISP mapping | ${node} | ${lisp_settings_both_vrf}
+| | When Honeycomb adds LISP adjacency | ${node} | ${7} | remote_map_vrf
+| | ... | adj01 | ${vrf_adjacency}
+| | Then Lisp mapping from Honeycomb should be
+| | ... | ${node} | ${adj_subtable}
+
+| TC09: Honeycomb configures Lisp Map Resolver
+| | [Documentation] | Check if Honeycomb can configure a Lisp Map Resolver.
+| | ...
+| | Given LISP state from Honeycomb should be | ${node} | ${state}
+| | And LISP state from VAT should be | ${node} | ${state}
+| | When Honeycomb adds Lisp Map Resolver | ${node} | ${ip_address}
+| | Then Map Resolver from Honeycomb should be | ${node} | ${ip_address}
+| | And Map Resolver from VAT should be | ${node} | ${ip_address}
+
+| TC10: Honeycomb configures Lisp Map Server
+| | [Documentation] | Check if Honeycomb can configure a Lisp Map Server.
+| | ...
+| | Given LISP state from Honeycomb should be | ${node} | ${state}
+| | And LISP state from VAT should be | ${node} | ${state}
+| | When Honeycomb adds Lisp Map Server | ${node} | @{ip_addresses}
+| | Then Map Server from Honeycomb should be | ${node} | @{ip_addresses}
+| | And Map Server from VAT should be | ${node} | @{ip_addresses}
+
+| TC11: Honeycomb configures Lisp PETR configuration
+| | [Documentation] | Check if Honeycomb can configure Lisp
+| | ... | PETR configuration.
+| | ...
+| | Given LISP state from Honeycomb should be | ${node} | ${state}
+| | And LISP state from VAT should be | ${node} | ${state}
+| | When Honeycomb enables LISP PETR feature | ${node} | ${ip_address}
+| | Then PETR configuration from Honeycomb should be | ${node} | ${ip_address}
+| | And PETR configuration from VAT should be | ${node} | enabled
+
+| TC12: Honeycomb configures Lisp RLOC Probing
+| | [Documentation] | Check if Honeycomb can configure Lisp RLOC Probing.
+| | ...
+| | Given LISP state from Honeycomb should be | ${node} | ${state}
+| | And LISP state from VAT should be | ${node} | ${state}
+| | When Honeycomb enables LISP RLOC feature | ${node}
+| | Then RLOC Probing from Honeycomb should be | ${node} | ${True}
+| | And RLOC Probing from VAT should be | ${node} | enabled
+
+| TC13: Honeycomb configures Lisp Map Register
+| | [Documentation] | Check if Honeycomb can configure a Lisp Map Register.
+| | ...
+| | Given LISP state from Honeycomb should be | ${node} | ${state}
+| | And LISP state from VAT should be | ${node} | ${state}
+| | When Honeycomb adds Lisp Map Register | ${node} | ${True}
+| | Then Map Register from Honeycomb should be | ${node} | ${True}
+| | And Map Register from VAT should be | ${node} | enabled
+
+| TC14: Honeycomb enabled Lisp PITR feature
+| | [Documentation] | Check if Honeycomb can configure the Lisp PITR feature.
+| | ...
+| | Given Locator Set From Honeycomb Should Be
+| | ... | ${node} | ${interface} | ${locator_set}
+| | When Honeycomb enables LISP PITR feature | ${node} | ${locator_set}
+| | Then PITR config from Honeycomb should be | ${node} | ${locator_set}
+| | And PITR config from VAT should be | ${node} | ${locator_set}
+
+| TC15: Honeycomb can remove configuration of Lisp features
+| | [Documentation] | Check if Honeycomb can disable all Lisp features.
+| | ...
+| | Given Map resolver from Honeycomb should be | ${node} | ${ip_address}
+| | And PITR config from Honeycomb should be | ${node} | ${locator_set}
+| | When Honeycomb disables all LISP features | ${node}
+| | Then Lisp Should Not Be Configured | ${node}
+
+| TC16: Honeycomb configures Lisp Map Request Mode
+| | [Documentation] | Check if Honeycomb can configure Lisp Map Request mode.
+| | ... | Note: Map Request Mode cannot be removed once configured.
+| | ...
+| | [Teardown] | Honeycomb disables LISP | ${node}
+| | ...
+| | Given Honeycomb enables LISP | ${node}
+| | When Honeycomb sets Lisp Map Request Mode | ${node} | ${True}
+| | Then Map Request Mode from Honeycomb should be
+| | ... | ${node} | source-destination
+| | And Map Request Mode from VAT should be | ${node} | src-dst
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-nsh-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-nsh-apihc-apivat-func.robot
new file mode 100644
index 0000000000..b5048944f5
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-nsh-apihc-apivat-func.robot
@@ -0,0 +1,147 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables***
+| ${super_if}= | ${node['interfaces']['port1']['name']}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/nsh.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/vxlan_gpe.robot
+| Variables | resources/test_data/honeycomb/nsh.py
+| Variables | resources/test_data/honeycomb/vxlan_gpe.py
+| ...
+| Documentation | *Honeycomb NSH test suite.*
+| ...
+| Suite Setup | Run Keywords
+| ... | Enable Honeycomb Feature | ${node} | NSH | AND
+| ... | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Run Keywords
+| ... | Tear Down Honeycomb Functional Test Suite | ${node} | AND
+| ... | Disable Honeycomb Feature | ${node} | NSH
+| ...
+| Force Tags | honeycomb_sanity | honeycomb_odl
+
+*** Test Cases ***
+| TC01: Honeycomb can configure NSH entry
+| | [Documentation] | Check if Honeycomb can configure an NSH entry.
+| | ...
+| | Given NSH Operational Data From Honeycomb Should Be empty | ${node}
+| | When Honeycomb adds NSH entry | ${node} | entry1 | ${nsh_entry1}
+| | Then NSH entry from Honeycomb should be
+| | ... | ${node} | entry1 | ${nsh_entry1_oper}
+
+| TC02: Honeycomb can remove NSH entry
+| | [Documentation] | Check if Honeycomb can remove an existing NSH entry.
+| | ...
+| | Given NSH entry from Honeycomb should be
+| | ... | ${node} | entry1 | ${nsh_entry1_oper}
+| | When Honeycomb removes NSH entry | ${node} | entry1
+| | Then NSH Operational Data From Honeycomb Should Be empty | ${node}
+
+| TC03: Honeycomb can configure new NSH entry
+| | [Documentation] | Check if Honeycomb can configure an NSH antry after one\
+| | ... | has been deleted.
+| | ...
+| | [Teardown] | Honeycomb removes NSH entry | ${node} | entry2
+| | ...
+| | Given NSH Operational Data From Honeycomb Should Be empty | ${node}
+| | When Honeycomb adds NSH entry | ${node} | entry2 | ${nsh_entry2}
+| | Then NSH entry from Honeycomb should be
+| | ... | ${node} | entry2 | ${nsh_entry2_oper}
+
+| TC04: Honeycomb can configure multiple NSH entries at the same time
+| | [Documentation] | Check if Honeycomb can configure an NSH entry when one\
+| | ... | already exists.
+| | ...
+| | [Teardown] | Honeycomb clears NSH configuration | ${node}
+| | ...
+| | Given NSH Operational Data From Honeycomb Should Be empty | ${node}
+| | When Honeycomb adds NSH entry | ${node} | entry1 | ${nsh_entry1}
+| | And Honeycomb adds NSH entry | ${node} | entry2 | ${nsh_entry2}
+| | Then NSH entry from Honeycomb should be
+| | ... | ${node} | entry1 | ${nsh_entry1_oper}
+| | And NSH entry from Honeycomb should be
+| | ... | ${node} | entry2 | ${nsh_entry2_oper}
+
+| TC05: Honeycomb can configure NSH map
+| | [Documentation] | Check if Honeycomb can configure an NSH map.
+| | ...
+| | Given NSH Operational Data From Honeycomb Should Be empty | ${node}
+| | And Honeycomb creates VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | ... | ${vxlan_gpe_base_settings1} | ${vxlan_gpe_settings1}
+| | When Honeycomb adds NSH entry | ${node} | entry1 | ${nsh_entry1}
+| | And Honeycomb adds NSH map | ${node} | map1 | ${nsh_map1}
+| | Then NSH map from Honeycomb should be | ${node} | map1 | ${nsh_map1_oper}
+
+| TC06: Honeycomb can remove NSH map
+| | [Documentation] | Check if Honeycomb can remove an existing NSH map.
+| | ...
+| | Given NSH entry from Honeycomb should be
+| | ... | ${node} | entry1 | ${nsh_entry1_oper}
+| | And VxLAN GPE Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | ... | ${vxlan_gpe_base_settings1} | ${vxlan_gpe_settings1}
+| | And NSH map from Honeycomb should be | ${node} | map1 | ${nsh_map1_oper}
+| | When Honeycomb removes NSH map | ${node} | map1
+| | Then NSH map from Honeycomb should not exist | ${node} | map1
+| | And NSH entry from Honeycomb should be
+| | ... | ${node} | entry1 | ${nsh_entry1_oper}
+
+| TC07: Honeycomb can modify existing NSH map
+| | [Documentation] | Check if Honeycomb can configure an NSH map after one\
+| | ... | has been deleted.
+| | ...
+| | [Teardown] | Honeycomb removes NSH map | ${node} | map1_edit
+| | ...
+| | Given NSH map from Honeycomb should not exist | ${node} | map1_edit
+| | And NSH entry from Honeycomb should be
+| | ... | ${node} | entry1 | ${nsh_entry1_oper}
+| | And VxLAN GPE Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | ... | ${vxlan_gpe_base_settings1} | ${vxlan_gpe_settings1}
+| | When Honeycomb adds NSH map | ${node} | map1_edit | ${nsh_map1_edit}
+| | Then NSH map from Honeycomb should be
+| | ... | ${node} | map1_edit | ${nsh_map1_edit_oper}
+| | And NSH entry from Honeycomb should be
+| | ... | ${node} | entry1 | ${nsh_entry1_oper}
+
+| TC08: Honeycomb can configure multiple NSH maps at the same time
+| | [Documentation] | Check if Honeycomb can configure and NSH map when one\
+| | ... | already exists.
+| | ...
+| | [Teardown] | Run Keywords
+| | ... | Honeycomb clears NSH configuration | ${node} | AND
+| | ... | Honeycomb removes VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_if1} | AND
+| | ... | Honeycomb removes VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_if2}
+| | ...
+| | Given NSH map from Honeycomb should not exist | ${node} | map2
+| | And NSH entry from Honeycomb should be
+| | ... | ${node} | entry1 | ${nsh_entry1_oper}
+| | And VxLAN GPE Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | ... | ${vxlan_gpe_base_settings1} | ${vxlan_gpe_settings1}
+| | And Honeycomb creates VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_if2}
+| | ... | ${vxlan_gpe_base_settings2} | ${vxlan_gpe_settings2}
+| | When Honeycomb adds NSH map | ${node} | map1 | ${nsh_map1}
+| | And Honeycomb adds NSH map | ${node} | map2 | ${nsh_map2}
+| | Then NSH map from Honeycomb should be
+| | ... | ${node} | map1 | ${nsh_map1_oper}
+| | And NSH map from Honeycomb should be
+| | ... | ${node} | map2 | ${nsh_map2_oper}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-pbb-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-pbb-apihc-apivat-func.robot
new file mode 100644
index 0000000000..4547c0c4bf
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-pbb-apihc-apivat-func.robot
@@ -0,0 +1,86 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables***
+| ${super_if}= | ${node['interfaces']['port1']['name']}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/provider_backbone_bridge.robot
+| Variables | resources/test_data/honeycomb/pbb/pbb.py
+| ...
+| Documentation | *Honeycomb provider backbone bridge test suite.*
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+
+*** Test Cases ***
+# TODO: add verifications once operational data or VPP dump is available.
+| TC01: Honeycomb sets PBB sub-interface
+| | [Documentation] | Honeycomb creates a new PBB sub-interface.
+| | ...
+| | Honeycomb creates PBB sub-interface | ${node} | ${super_if}
+| | ... | ${cfg_pbb_sub_if_1}
+
+| TC02: Honeycomb modifies existing PBB sub-interface
+| | [Documentation] | Honeycomb modifies an existing PBB sub-interface.
+| | ...
+| | Honeycomb creates PBB sub-interface | ${node} | ${super_if}
+| | ... | ${cfg_pbb_sub_if_1_mod}
+
+| TC03: Honeycomb deletes existing PBB sub-interface
+| | [Documentation] | Honeycomb deletes an existing PBB sub-interface.
+| | ...
+| | Honeycomb removes PBB sub-interface
+| | ... | ${node} | ${super_if}
+
+| TC04: Honeycomb fails to set wrong destination-address for new PBB sub-interface
+| | [Documentation] | Honeycomb fails to create a new PBB sub-interface with\
+| | ... | wrong value of parameter destination-address, type yang:mac-address.
+| | ...
+| | Honeycomb fails to create PBB sub-interface | ${node} | ${super_if}
+| | ... | ${cfg_pbb_sub_if_wrong_dst_addr}
+
+| TC05: Honeycomb fails to set wrong source-address for new PBB sub-interface
+| | [Documentation] | Honeycomb fails to create a new PBB sub-interface with\
+| | ... | wrong value of parameter source-address, type yang:mac-address.
+| | ...
+| | Honeycomb fails to create PBB sub-interface | ${node} | ${super_if}
+| | ... | ${cfg_pbb_sub_if_wrong_src_addr}
+
+| TC06: Honeycomb fails to set wrong b-vlan-tag-vlan-id for new PBB sub-interface
+| | [Documentation] | Honeycomb fails to create a new PBB sub-interface with\
+| | ... | wrong value of parameter b-vlan-tag-vlan-id, type uint16, 12 bit\
+| | ... | range, range 1..4095.
+| | ...
+| | Honeycomb fails to create PBB sub-interface | ${node} | ${super_if}
+| | ... | ${cfg_pbb_sub_if_wrong_vlan_tag}
+
+| TC07: Honeycomb fails to set wrong i-tag-isid for new PBB sub-interface
+| | [Documentation] | Honeycomb fails to create a new PBB sub-interface with\
+| | ... | wrong value of parameter i-tag-isid, type uint32, 24 bit range,\
+| | ... | range 1..16777215.
+| | ...
+| | Honeycomb fails to create PBB sub-interface | ${node} | ${super_if}
+| | ... | ${cfg_pbb_sub_if_wrong_i_tag}
+
+| TC08: Honeycomb fails to create new PBB sub-interface without vlan tag
+| | [Documentation] | Honeycomb fails to create a new PBB sub-interface without\
+| | ... | parameter b-vlan-tag-vlan-id.
+| | ...
+| | Honeycomb fails to create PBB sub-interface | ${node} | ${super_if}
+| | ... | ${cfg_pbb_sub_if_no_vlan_tag}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot
new file mode 100644
index 0000000000..a08aecc050
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot
@@ -0,0 +1,742 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+| &{if_settings}= | enabled=True
+# Bridge domain settings
+| ${bd_name}= | bd1
+| &{bd_settings}= | flood=${True} | forward=${True} | learn=${True}
+| ... | unknown-unicast-flood=${True} | arp-termination=${False}
+| &{bd_if_settings}= | split_horizon_group=${0} | bvi=${False}
+# Names for AC lists
+| ${acl_name_macip}= | macip
+| ${acl_name_l3_ip4}= | acl_l3_ip4
+| ${acl_name_l3_ip6}= | acl_l3_ip6
+| ${acl_name_l4}= | acl_l4
+| ${acl_name_mixed}= | acl_mixed
+| ${acl_name_icmp}= | acl_icmp
+| ${acl_name_icmpv6}= | acl_icmpv6
+| ${acl_name_reflex}= | acl_reflex
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/bridge_domain.robot
+| Resource | resources/libraries/robot/honeycomb/access_control_lists.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.honeycomb.HcAPIKwACL.ACLKeywords
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPv4Setup
+| Library | resources.libraries.python.IPv4Util
+| Library | resources.libraries.python.IPv6Util
+| Library | resources.libraries.python.Routing
+| ...
+| Test Setup | Clear Packet Trace on All DUTs | ${nodes}
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Documentation | *Honeycomb access control lists test suite for ACL plugin.*
+| ...
+# Failing due to HC2VPP-173: cannot clean up ACLs in test teardown
+| Force Tags | HC_FUNC | EXPECTED_FAILING
+
+*** Test Cases ***
+| TC01: ACL MAC filtering through plugin-acl node - bridged
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 bridge both interfaces to TG\
+| | ... | and configure L2 MAC ACL on ingress interface.
+| | ... | [Ver] Send simple TCP packets from one TG interface to the other,\
+| | ... | using different MACs. Receive all packets except those with\
+| | ... | MACs in the filtered ranges.
+| | ...
+| | [Teardown] | Bridged ACL test teardown
+| | ...
+| | Given Setup Interfaces And Bridge Domain For plugin-acl Test
+| | ... | macip | ${acl_name_macip}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_macip} | ${acl_settings} | macip=${True}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_macip}
+| | ... | ingress | macip=${True}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${classify_src}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${classify_src2}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+
+| TC02: ACL IPv4 filtering through plugin-acl node - bridged
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 bridge both interfaces to TG\
+| | ... | and configure L3 IPv4 ACL on ingress interface with src/dst IP
+| | ... | and protocol number.
+| | ... | [Ver] Send simple TCP and UDP packets from one TG interface\
+| | ... | to the other, using different IPv4 IPs. Receive all packets except\
+| | ... | those with IPs in the filtered ranges and UDP protocol payload.
+| | ...
+| | [Teardown] | Bridged ACL test teardown
+| | ...
+| | Given Setup Interfaces And Bridge Domain For plugin-acl Test
+| | ... | l3_ip4 | ${acl_name_l3_ip4}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_l3_ip4} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_l3_ip4} | ingress
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | UDP | ${src_port} | ${dst_port}
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | UDP | ${src_port} | ${dst_port}
+
+| TC03: ACL IPv6 filtering through plugin-acl node - bridged
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv6-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 bridge both interfaces to TG\
+| | ... | and configure L3 IPv6 ACL on ingress interface with src/dst IP
+| | ... | and protocol number.
+| | ... | [Ver] Send simple TCP and UDP packets from one TG interface\
+| | ... | to the other, using different IPv6 IPs. Receive all packets except\
+| | ... | those with IPs in the filtered ranges and UDP protocol payload.
+| | ...
+| | [Teardown] | Bridged ACL test teardown
+| | ...
+| | Given Setup interfaces and bridge domain for plugin-acl test
+| | ... | l3_ip6 | ${acl_name_l3_ip6}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_l3_ip6} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_l3_ip6} | ingress
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | UDP | ${src_port} | ${dst_port}
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | UDP | ${src_port} | ${dst_port}
+
+| TC04: ACL port filtering through plugin-acl node - bridged
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 bridge both interfaces to TG\
+| | ... | and and configure L4 port ACL on ingress interface
+| | ... | with src/dst port ranges.
+| | ... | [Ver] Send simple TCP and UDP packets from one TG interface\
+| | ... | to the other, using different ports. Receive all packets except\
+| | ... | those with ports in the filtered ranges.
+| | ...
+| | [Teardown] | Bridged ACL test teardown
+| | ...
+| | Given Setup interfaces and bridge domain for plugin-acl test
+| | ... | L4 | ${acl_name_l4}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_l4} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_l4} | ingress
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${classify_src} | ${classify_dst}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${classify_src+5} | ${classify_dst+5}
+
+| TC05: ACL filtering with IPv4 address and TCP port in one rule - bridged
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 bridge both interfaces to TG\
+| | ... | and configure a mixed rule with src/dst IP, TCP protocol
+| | ... | and port ranges.
+| | ... | [Ver] Send simple TCP packets from one TG interface to the other,\
+| | ... | using IPs and ports. Receive all packets except those with\
+| | ... | both IPs and ports in the filtered ranges.
+| | ...
+| | [Teardown] | Bridged ACL test teardown
+| | ...
+| | Given Setup Interfaces And Bridge Domain For plugin-acl Test
+| | ... | mixed | ${acl_name_mixed}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_mixed} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_mixed} | ingress
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src_ip} | ${classify_dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src_ip} | ${classify_dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${classify_src_port} | ${classify_dst_port}
+
+| TC06: ACL ICMP packet filtering - bridged
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-ICMP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 bridge both interfaces to TG\
+| | ... | and configure a ICMP protocol filtering by ICMP type and code.
+| | ... | [Ver] Send ICMP packets from one TG interface\
+| | ... | to the other, using different codes and types. Receive all packets\
+| | ... | except those with types and codes in the filtered ranges.
+| | ...
+| | [Teardown] | Bridged ACL test teardown
+| | ...
+| | Given Setup interfaces and bridge domain for plugin-acl test
+| | ... | icmp | ${acl_name_icmp}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_icmp} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_icmp} | ingress
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${icmp_type} | ${icmp_code}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${classify_type} | ${icmp_code}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${classify_type} | ${classify_code}
+
+| TC07: ACL ICMPv6 packet filtering - bridged
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv6-ICMP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 bridge both interfaces to TG\
+| | ... | and configure a ICMPv6 protocol filtering by ICMPv6 type and code.
+| | ... | [Ver] Send ICMPv6 packets from one TG interface\
+| | ... | to the other, using different codes and types. Receive all packets\
+| | ... | except those with the filtered type and code.
+| | ...
+| | [Teardown] | Bridged ACL test teardown
+| | ...
+| | Given Setup interfaces and bridge domain for plugin-acl test
+| | ... | icmpv6 | ${acl_name_icmpv6}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_icmpv6} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_icmpv6} | ingress
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${icmp_type} | ${icmp_code}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${classify_type} | ${icmp_code}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${classify_type} | ${classify_code}
+
+| TC08: ACL reflexive IPv4 filtering through plugin-acl node - bridged
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 bridge both interfaces to TG,\
+| | ... | configure a "drop all" ACL on ingress and reflexive ACL on egress.
+| | ... | [Ver] Send a simple TCP packet to VPP interface 1 and do not receive\
+| | ... | it back. Then send the packet with reversed src/dst IP address\
+| | ... | to VPP interface 2 and receive it from interface 1(this should create\
+| | ... | a reflexive "permit" rule) Finally, send the original packet again\
+| | ... | and receive it from interface 2.
+| | ...
+| | [Teardown] | Bridged ACL test teardown
+| | ...
+| | Given Setup Interfaces And Bridge Domain For plugin-acl Test
+| | ... | reflex | ${acl_name_reflex}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_reflex} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_reflex} | egress
+| | And Import Variables | resources/test_data/honeycomb/plugin_acl.py
+| | ... | block_all | block_all
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | block_all | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | block_all | ingress
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_dst} | ${classify_src}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if2_mac}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if2_mac}
+| | ... | TCP | ${dst_port} | ${src_port}
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+
+# Routing section
+# ===============
+
+| TC09: ACL IPv4 filtering through plugin-acl node - routed
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 set IPv4 addresses on both\
+| | ... | interfaces to TG, add ARP entry and routes, and configure L3 IPv4 ACL\
+| | ... | on ingress interface with src/dst IP and protocol.
+| | ... | [Ver] Send simple TCP and UDP packets from one TG interface\
+| | ... | to the other, using different IPv4 IPs. Receive all packets except\
+| | ... | those with IPs in the filtered ranges and UDP protocol payload.
+| | ...
+| | [Teardown] | Routed ACL test teardown - ipv4
+| | ...
+| | Given Setup Interface IPs And Routes For IPv4 plugin-acl Test
+| | ... | l3_ip4 | ${acl_name_l3_ip4}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_l3_ip4} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_l3_ip4} | ingress
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | UDP | ${src_port} | ${dst_port}
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | UDP | ${src_port} | ${dst_port}
+
+| TC10: ACL IPv6 filtering through plugin-acl node - routed
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv6-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 set IPv6 addresses on both\
+| | ... | interfaces to TG, add IP neighbor entry and routes, and configure\
+| | ... | L3 IPv6 ACL on ingress interface with src/dst IP and next-header.
+| | ... | [Ver] Send simple TCP and UDP packets from one TG interface\
+| | ... | to the other, using different IPv6 IPs. Receive all packets except\
+| | ... | those with IPs in the filtered ranges and UDP protocol payload.
+| | ...
+| | [Teardown] | Routed ACL test teardown - ipv6
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Import Variables | resources/test_data/honeycomb/plugin_acl.py
+| | ... | L3_IP6 | ${acl_name_l3_ip6}
+| | And Honeycomb configures interface state
+| | ... | ${dut_node} | ${dut_to_tg_if1} | up
+| | And Honeycomb configures interface state
+| | ... | ${dut_node} | ${dut_to_tg_if2} | up
+| | And Honeycomb sets interface IPv6 address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | And Honeycomb sets interface IPv6 address | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | And VPP RA suppress link layer | ${dut_node} | ${dut_to_tg_if2}
+| | And Honeycomb adds interface IPv6 neighbor
+| | ... | ${node} | ${dut_to_tg_if2} | ${gateway} | ${tg_to_dut_if2_mac}
+| | And VPP Route Add | ${node} | ${dst_net} | ${prefix_length}
+| | ... | ${gateway} | interface=${dut_to_tg_if2} | use_sw_index=False
+| | And VPP Route Add | ${node} | ${classify_dst_net} | ${prefix_length}
+| | ... | ${gateway} | interface=${dut_to_tg_if2} | use_sw_index=False
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_l3_ip6} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_l3_ip6} | ingress
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | UDP | ${src_port} | ${dst_port}
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | UDP | ${src_port} | ${dst_port}
+
+| TC11: ACL port filtering through plugin-acl node - routed
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 set IPv4 addresses on both\
+| | ... | interfaces to TG, add ARP entry and routes, and configure L4 port ACL\
+| | ... | on ingress interface with src/dst port ranges.
+| | ... | [Ver] Send simple TCP and UDP packets from one TG interface\
+| | ... | to the other, using different ports. Receive all packets except\
+| | ... | those with ports in the filtered ranges.
+| | ...
+| | [Teardown] | Routed ACL test teardown - ipv4
+| | ...
+| | Given Setup Interface IPs And Routes For IPv4 plugin-acl Test
+| | ... | L4 | ${acl_name_l4}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_l4} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_l4} | ingress
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${classify_src} | ${classify_dst}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${classify_src+5} | ${classify_dst+5}
+
+| TC12: ACL filtering with IPv4 address and TCP port in one rule - routed
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 set IPv4 addresses on both\
+| | ... | interfaces to TG, add ARP entry and routes and configure a mixed
+| | ... | rule with src/dst IP, TCP protocol and port ranges.
+| | ... | [Ver] Send simple TCP packets from one TG interface to the other,\
+| | ... | using IPs and ports. Receive all packets except those with\
+| | ... | both IPs and ports in the filtered ranges.
+| | ...
+| | [Teardown] | Routed ACL test teardown - ipv4
+| | ...
+| | Given Setup Interface IPs And Routes For IPv4 plugin-acl Test
+| | ... | mixed | ${acl_name_mixed}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_mixed} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_mixed} | ingress
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src_ip} | ${classify_dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src_ip} | ${classify_dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dst_mac}
+| | ... | TCP | ${classify_src_port} | ${classify_dst_port}
+
+| TC13: ACL ICMP packet filtering - routed
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 set IPv4 addresses on both\
+| | ... | interfaces to TG, add ARP entry and routes, and configure ICMP ACL\
+| | ... | on ingress interface with ICMP type and code.
+| | ... | [Ver] Send ICMP packets from one TG interface\
+| | ... | to the other, using different codes and types. Receive all packets\
+| | ... | except those with the filtered type and code.
+| | ...
+| | [Teardown] | Routed ACL test teardown - ipv4
+| | ...
+| | Given Setup Interface IPs And Routes For IPv4 plugin-acl Test
+| | ... | icmp | ${acl_name_icmp}
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_icmp} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_icmp} | ingress
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${icmp_type} | ${icmp_code}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${classify_type} | ${icmp_code}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${classify_type} | ${classify_code}
+
+| TC14: ACL ICMPv6 packet filtering - routed
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 set IPv6 addresses on both\
+| | ... | interfaces to TG, add ARP entry and routes, and configure ICMP ACL\
+| | ... | on ingress interface with ICMPv6 type and code.
+| | ... | [Ver] Send ICMPv6 packets from one TG interface\
+| | ... | to the other, using different codes and types. Receive all packets\
+| | ... | except those with the filtered type and code.
+| | ...
+| | [Teardown] | Routed ACL test teardown - ipv6
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Import Variables | resources/test_data/honeycomb/plugin_acl.py
+| | ... | icmpv6 | ${acl_name_icmpv6}
+| | And Honeycomb configures interface state
+| | ... | ${dut_node} | ${dut_to_tg_if1} | up
+| | And Honeycomb configures interface state
+| | ... | ${dut_node} | ${dut_to_tg_if2} | up
+| | And Honeycomb sets interface IPv6 address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | And Honeycomb sets interface IPv6 address | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | And Honeycomb adds interface IPv6 neighbor
+| | ... | ${node} | ${dut_to_tg_if2} | ${gateway} | ${tg_to_dut_if2_mac}
+| | And VPP RA suppress link layer | ${dut_node} | ${dut_to_tg_if2}
+| | And VPP Route Add | ${node} | ${dst_net} | ${prefix_length}
+| | ... | ${gateway} | interface=${dut_to_tg_if2} | use_sw_index=False
+| | And VPP Route Add | ${node} | ${classify_dst_net} | ${prefix_length}
+| | ... | ${gateway} | interface=${dut_to_tg_if2} | use_sw_index=False
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_icmpv6} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_icmpv6} | ingress
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${icmp_type} | ${icmp_code}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${classify_type} | ${icmp_code}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${classify_type} | ${classify_code}
+
+| TC15: ACL reflexive IPv4 filtering through plugin-acl node - routed
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-TCP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 set IPv4 addresses on both\
+| | ... | interfaces to TG, add ARP entries and routes,\
+| | ... | configure a "drop all" ACL on ingress and reflexive ACL on egress.
+| | ... | [Ver] Send a simple TCP packet to VPP interface 1 and do not receive\
+| | ... | it back. Then send the packet with reversed src/dst IP address\
+| | ... | to VPP interface 2 and receive it from interface 1(this should create\
+| | ... | a reflexive "permit" rule) Finally, send the original packet again\
+| | ... | and receive it from interface 2.
+| | ...
+| | [Teardown] | Routed ACL test teardown - ipv4
+| | ...
+| | Given Setup Interface IPs And Routes For IPv4 plugin-acl Test
+| | ... | reflex | ${acl_name_reflex}
+| | And Add ARP on DUT
+| | ... | ${node} | ${dut_to_tg_if1} | ${gateway2} | ${tg_to_dut_if1_mac}
+| | And VPP Route Add
+| | ... | ${node} | ${src_net} | ${prefix_length} | ${gateway2}
+| | ... | interface=${dut_to_tg_if1} | use_sw_index=False
+| | And VPP Route Add
+| | ... | ${node} | ${classify_src_net} | ${prefix_length} | ${gateway2}
+| | ... | interface=${dut_to_tg_if1} | use_sw_index=False
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | ${acl_name_reflex} | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_reflex} | egress
+| | And Import Variables | resources/test_data/honeycomb/plugin_acl.py
+| | ... | block_all | block_all
+| | When Honeycomb Creates ACL Chain Through ACL plugin
+| | ... | ${dut_node} | block_all | ${acl_settings}
+| | And Honeycomb Assigns plugin-acl Chain To Interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | block_all | ingress
+| | And Run Keyword And Expect Error | TCP/UDP Rx timeout
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_dst} | ${classify_src}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if2_mac}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if2_mac}
+| | ... | TCP | ${dst_port} | ${src_port}
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${classify_src} | ${classify_dst}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | TCP | ${src_port} | ${dst_port}
+
+*** Keywords ***
+| Setup interface IPs and routes for IPv4 plugin-acl test
+| | [Documentation] | Import test variables, set interfaces up,
+| | ... | configure IPv4 addresses, add neighbor entry and routes.
+| | ...
+| | [Arguments] | ${test_data_id} | ${acl_name}
+| | ...
+| | Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Import Variables | resources/test_data/honeycomb/plugin_acl.py
+| | ... | ${test_data_id} | ${acl_name}
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2} | up
+| | Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | And Honeycomb adds interface IPv4 neighbor
+| | ... | ${node} | ${dut_to_tg_if2} | ${gateway} | ${tg_to_dut_if2_mac}
+| | VPP Route Add
+| | ... | ${node} | ${dst_net} | ${prefix_length} | ${gateway}
+| | ... | interface=${dut_to_tg_if2} | use_sw_index=False
+| | VPP Route Add
+| | ... | ${node} | ${classify_dst_net} | ${prefix_length} | ${gateway}
+| | ... | interface=${dut_to_tg_if2} | use_sw_index=False
+
+| Setup interfaces and bridge domain for plugin-acl test
+| | [Documentation] | Import test variables, set interfaces up and bridge them.
+| | ...
+| | [Arguments] | ${test_data_id} | ${acl_name}
+| | ...
+| | Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Import Variables | resources/test_data/honeycomb/plugin_acl.py
+| | ... | ${test_data_id} | ${acl_name}
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2} | up
+| | Honeycomb Creates first L2 Bridge Domain
+| | ... | ${dut_node} | ${bd_name} | ${bd_settings}
+| | Honeycomb Adds Interfaces To Bridge Domain
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_to_tg_if2}
+| | ... | ${bd_name} | ${bd_if_settings}
+
+| Bridged ACL test teardown
+| | [Documentation] | Log packet trace and ACL settings,
+| | ... | then clean up bridge domains.
+| | ...
+| | Show Packet Trace on All DUTs | ${nodes}
+| | Read plugin-ACL configuration from VAT | ${node}
+| | Clear plugin-ACL configuration | ${node} | ${dut_to_tg_if1}
+| | Honeycomb Removes All Bridge Domains
+| | ... | ${node} | ${dut_to_tg_if1} | ${dut_to_tg_if2}
+
+| Routed ACL test teardown - ipv4
+| | [Documentation] | Log packet trace and ACL settings,
+| | ... | then clean up IPv4 addresses and neighbors.
+| | ...
+| | Show Packet Trace on All DUTs | ${nodes}
+| | Read plugin-ACL configuration from VAT | ${node}
+| | Clear plugin-ACL configuration | ${node} | ${dut_to_tg_if1}
+| | Honeycomb removes interface IPv4 addresses | ${node} | ${dut_to_tg_if1}
+| | Honeycomb clears all interface IPv4 neighbors | ${node} | ${dut_to_tg_if1}
+
+| Routed ACL test teardown - ipv6
+| | [Documentation] | Log packet trace and ACL settings,
+| | ... | then clean up IPv6 addresses and neighbors.
+| | ...
+| | Show Packet Trace on All DUTs | ${nodes}
+| | Clear plugin-ACL configuration | ${node} | ${dut_to_tg_if1}
+| | Read plugin-ACL configuration from VAT | ${node}
+| | Honeycomb removes interface IPv6 addresses | ${node} | ${dut_to_tg_if1}
+| | Honeycomb clears all interface IPv6 neighbors | ${node} | ${dut_to_tg_if1}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-policer-apihc-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-policer-apihc-func.robot
new file mode 100644
index 0000000000..7f61780fb5
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-policer-apihc-func.robot
@@ -0,0 +1,144 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+| ${interface}= | ${node['interfaces']['port1']['name']}
+| ${tg_to_dut_if1_ip}= | 192.168.122.1
+| ${dut_to_tg_if1_ip}= | 192.168.122.2
+| ${dut_to_tg_if2_ip}= | 192.168.123.1
+| ${tg_to_dut_if2_ip}= | 192.168.123.2
+| ${prefix_length}= | ${24}
+| ${dscp_number}= | ${20}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/policer.robot
+| Resource | resources/libraries/robot/honeycomb/access_control_lists.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Library | resources.libraries.python.Trace
+| Variables | resources/test_data/honeycomb/policer_variables.py
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Documentation | *Honeycomb Policer management test suite.*
+
+*** Test Cases ***
+| TC01: Honeycomb can configure Policer
+| | [Documentation] | Checks if Honeycomb can configure Policer.
+| | ...
+| | Given Policer Operational Data From Honeycomb Should Be empty | ${node}
+| | When Honeycomb configures Policer | ${node} | ${policer_data}
+| | Then Policer Operational Data From Honeycomb Should Be | ${node}
+| | ... | ${policer_data_oper}
+
+| TC02: Honeycomb can disable Policer
+| | [Documentation] | Checks if Honeycomb can disable Policer.
+| | ...
+| | Given Policer Operational Data From Honeycomb Should Be | ${node}
+| | ... | ${policer_data_oper}
+| | When Honeycomb removes Policer configuration | ${node}
+| | Then Policer Operational Data From Honeycomb Should Be empty | ${node}
+
+| TC03: Honeycomb can configure Policer with increased values of CIR (900kbps)
+| | [Documentation] | Checks if Honeycomb can configure Policer\
+| | ... | with increased values of CIR.
+| | ...
+| | [Teardown] | Tear down policer test | ${node}
+| | ...
+| | Given Policer Operational Data From Honeycomb Should Be empty | ${node}
+| | When Honeycomb configures Policer | ${node} | ${policer_data_2}
+| | Then Policer Operational Data From Honeycomb Should Be | ${node}
+| | ... | ${policer_data_oper_2}
+
+| TC04: Honeycomb can configure Packets-Per-Second Based Policer
+| | [Documentation] | Checks if Honeycomb can configure Policer\
+| | ... | based on rate-type measured in pps.
+| | ...
+| | [Teardown] | Tear down policer test | ${node}
+| | ...
+| | Given Policer Operational Data From Honeycomb Should Be empty | ${node}
+| | When Honeycomb configures Policer | ${node} | ${policer_data_3}
+| | Then Policer Operational Data From Honeycomb Should Be | ${node}
+| | ... | ${policer_data_oper_3}
+
+| TC05: Configure Policer on Interface
+| | [Documentation] | Honeycomb can configure Policer on a given interface.
+| | ...
+| | [Teardown] | Run Keywords
+| | ... | Honeycomb disables Policer on interface | ${node} | ${interface} | AND
+| | ... | Honeycomb removes ACL session | ${node}
+| | ... | ${acl_tables['hc_acl_table']['name']}
+| | ... | ${acl_tables['hc_acl_session']['match']} | AND
+| | ... | Honeycomb removes ACL table | ${node}
+| | ... | ${acl_tables['hc_acl_table']['name']} | AND
+| | ... | Tear down policer test | ${node}
+| | ...
+| | Given Honeycomb configures Policer | ${node} | ${policer_data}
+| | And ACL table from Honeycomb should not exist
+| | ... | ${node} | ${acl_tables['hc_acl_table']['name']}
+| | When Honeycomb creates ACL table
+| | ... | ${node} | ${acl_tables['hc_acl_table']}
+| | And Honeycomb adds ACL session
+| | ... | ${node} | ${acl_tables['hc_acl_table']['name']}
+| | ... | ${acl_tables['hc_acl_session']}
+| | Then Honeycomb enables policer on interface
+| | ... | ${node} | ${interface} | ${acl_tables['hc_acl_table']['name']}
+
+| TC06: VPP policer 2R3C Color-aware marks packet
+# Pending rework
+| | [Tags] | EXPECTED_FAILING
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Ref] RFC2474, RFC2698.
+| | ... | [Cfg] Configure 2R3C color-aware policer on DUT1 on the first\
+| | ... | interface.
+| | ... | [Ver] TG sends IPv4 TCP packet on the first link to DUT1.\
+| | ... | Packet on DUT1 is marked with DSCP tag. Verifies if DUT1 sends\
+| | ... | correct IPv4 TCP packet with correct DSCP on the second link to TG.
+| | ...
+| | [Teardown] | Show Packet Trace on All DUTs | ${nodes}
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Honeycomb configures Policer | ${dut_node} | ${policer_data_3}
+| | And ACL table from Honeycomb should not exist
+| | ... | ${dut_node} | ${acl_tables['hc_acl_table']['name']}
+| | When Honeycomb creates ACL table
+| | ... | ${dut_node} | ${acl_tables['hc_acl_table']}
+| | And Honeycomb adds ACL session
+| | ... | ${dut_node} | ${acl_tables['hc_acl_table']['name']}
+| | ... | ${acl_tables['hc_acl_session']}
+| | And Honeycomb enables policer on interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_tables['hc_acl_table']['name']}
+| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1}
+| | ... | up
+| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2}
+| | ... | up
+| | And Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | And Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | And Honeycomb adds interface IPv4 neighbor
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${tg_to_dut_if2_ip}
+| | ... | ${tg_to_dut_if2_mac}
+| | And VPP Node Interfaces Ready Wait | ${dut_node}
+| | Then Honeycomb Send packet and verify marking | ${tg_node}
+| | ... | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if2_ip} | ${dscp_number}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-proxyarp-apihc-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-proxyarp-apihc-func.robot
new file mode 100644
index 0000000000..1404633acd
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-proxyarp-apihc-func.robot
@@ -0,0 +1,89 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+# Interface to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+| &{proxyarp_settings_ipv4}= | vrf-id=${0}
+| ... | low-addr=192.168.1.2 | high-addr=192.168.1.10
+| ${tg_to_dut_ip}= | 10.0.0.100
+| ${dut_to_tg_ip}= | 10.0.0.1
+| ${prefix_length}= | ${24}
+| ${test_ip}= | 192.168.1.5
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/proxyarp.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Documentation | *Honeycomb proxyARP management test suite.*
+
+*** Test Cases ***
+# TODO: Add operational data and VAT dump verification if/when avaliable
+| TC01: Honeycomb can configure ipv4 proxyARP
+| | [Documentation] | Check if Honeycomb can configure the proxyARP feature.
+| | ...
+| | [Teardown] | Honeycomb removes proxyARP configuration | ${node}
+| | ...
+| | Honeycomb configures proxyARP | ${node} | ${proxyarp_settings_ipv4}
+
+| TC02: Honeycomb can enable proxyarp on an interface
+| | [Documentation] | Check if Honeycomb can enable the proxyARP feature\
+| | ... | on an interface.
+| | ...
+| | [Teardown] | Honeycomb disables proxyARP on interface
+| | ... | ${node} | ${interface}
+| | ...
+| | Honeycomb enables proxyARP on interface | ${node} | ${interface}
+
+| TC03: DUT sends ARP reply on behalf of another machine from the IP range
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC1027.
+| | ... | [Cfg] On DUT1 configure interface IPv4 address and proxy ARP
+| | ... | for IP range, using Honeycomb API.
+| | ... | [Ver] Make TG send ARP request to DUT1 interface,
+| | ... | verify if DUT1 sends correct ARP reply on behalf of machine whose
+| | ... | IP is in the configured range.
+| | ...
+| | [Teardown] | Run Keywords
+| | ... | Show Packet Trace on all DUTs | ${nodes}
+| | ... | AND | Honeycomb removes proxyARP configuration | ${node}
+| | ... | AND | Honeycomb configures interface state
+| | ... | ${dut_node} | ${dut_to_tg_if1} | down
+| | ... | AND | Honeycomb removes interface IPv4 addresses
+| | ... | ${node} | ${interface}
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | ${dut_to_tg_name}= | Get interface name | ${dut_node} | ${dut_to_tg_if1}
+| | ${tg_to_dut_name}= | Get interface name | ${tg_node} | ${tg_to_dut_if1}
+| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
+| | And Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_ip} | ${prefix_length}
+| | When Honeycomb configures proxyARP | ${dut_node} | ${proxyarp_settings_ipv4}
+| | And Honeycomb enables proxyARP on interface | ${node} | ${dut_to_tg_name}
+| | Then Send ARP Request | ${tg_node} | ${tg_to_dut_name}
+| | ... | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_ip} | ${test_ip}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-proxynd6-apihc-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-proxynd6-apihc-func.robot
new file mode 100644
index 0000000000..4425750add
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-proxynd6-apihc-func.robot
@@ -0,0 +1,117 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+# Interface to run configuration tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+# IPv6 addresses to configure on DUT.
+| ${dut_to_tg_if1_ip}= | 10::1
+| ${dut_to_tg_if2_ip}= | 11::1
+# IPv6 addresses used for TG interfaces.
+| ${test_src_ip}= | 10::2
+| ${test_dst_ip}= | 11::2
+| ${test_dst_ip2}= | 11::3
+# IPv6 subnet prefix length
+| ${prefix_length}= | 64
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/proxyarp.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/features/dhcp_proxy.robot
+| Library | resources.libraries.python.Trace
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Documentation | *Honeycomb IPv6 neighbor discovery proxy test suite.*
+
+*** Test Cases ***
+| TC01: Honeycomb can configure IPv6 ND proxy on an interface
+| | [Documentation] | Check if Honeycomb can configure the IPv6 ND proxy\
+| | ... | feature on an interface.
+| | ...
+| | Given IPv6 ND proxy from Honeycomb should be empty | ${node} | ${interface}
+| | And Honeycomb configures interface state | ${node} | ${interface} | up
+| | When Honeycomb configures IPv6 ND proxy on interface
+| | ... | ${node} | ${interface} | ${test_dst_ip}
+| | Then IPv6 ND proxy from Honeycomb should be
+| | ... | ${node} | ${interface} | ${test_dst_ip}
+
+| TC02: Honeycomb can disable IPv6 ND proxy on an interface
+| | [Documentation] | Check if Honeycomb can remove IPv6 ND proxy feature\
+| | ... | configuration from an interface.
+| | ...
+| | Given IPv6 ND proxy from Honeycomb should be
+| | ... | ${node} | ${interface} | ${test_dst_ip}
+| | When Honeycomb disables IPv6 ND proxy on interface | ${node} | ${interface}
+| | Then IPv6 ND proxy from Honeycomb should be empty | ${node} | ${interface}
+
+| TC03: Honeycomb can configure multiple IPv6 ND proxies on an interface
+| | [Documentation] | Check if Honeycomb can configure two ND proxies\
+| | ... | on one interface.
+| | ...
+| | [Teardown] | Honeycomb disables IPv6 ND proxy on interface
+| | ... | ${node} | ${interface}
+| | ...
+| | Given IPv6 ND proxy from Honeycomb should be empty | ${node} | ${interface}
+| | And Honeycomb configures interface state | ${node} | ${interface} | up
+| | When Honeycomb configures IPv6 ND proxy on interface
+| | ... | ${node} | ${interface} | ${test_dst_ip} | ${test_dst_ip2}
+| | Then IPv6 ND proxy from Honeycomb should be
+| | ... | ${node} | ${interface} | ${test_dst_ip} | ${test_dst_ip2}
+
+| TC04: VPP proxies valid ICMPv6 Neighbor Discovery request
+| | [Documentation] |
+| | ... | [Top] TG=DUT
+| | ... | [Cfg] On DUT configure IPv6 addresses and neighbors, supress router\
+| | ... | advertisement and configure IPv6 Neighbor Discovery proxy.
+| | ... | [Ver] Make TG send a neighbor solicitation packet to it's other\
+| | ... | interface through DUT, verify DUT responds to the packet instead\
+| | ... | of forwarding it. Then exchange ICMPv6 Echo request/reply to verify\
+| | ... | connectivity between interfaces.
+| | ... | [Ref] RFC 4389
+| | ...
+| | [Teardown] | Run Keywords
+| | ... | Show Packet Trace on All DUTs | ${nodes} | AND
+| | ... | Honeycomb disables IPv6 ND proxy on interface
+| | ... | ${dut_node} | ${dut_to_tg_if2}
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2} | up
+| | Honeycomb sets interface IPv6 address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | Honeycomb sets interface IPv6 address | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | And Vpp Ra Suppress Link Layer | ${dut_node} | ${dut_to_tg_if1}
+| | And Vpp Ra Suppress Link Layer | ${dut_node} | ${dut_to_tg_if2}
+| | And Honeycomb adds interface IPv6 neighbor | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${test_src_ip} | ${tg_to_dut_if1_mac}
+| | And Honeycomb adds interface IPv6 neighbor | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${test_dst_ip} | ${tg_to_dut_if2_mac}
+| | When Honeycomb configures IPv6 ND proxy on interface
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${test_dst_ip}
+| | Then Verify IPv6ND proxy | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${test_src_ip} | ${test_dst_ip}
+| | ... | ${tg_to_dut_if1_mac} | ${tg_to_dut_if2_mac}
+| | ... | ${dut_to_tg_if1_mac} | ${dut_to_tg_if2_mac}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-routing-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-routing-apihc-apivat-func.robot
new file mode 100644
index 0000000000..9f2dbc0ae6
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-routing-apihc-apivat-func.robot
@@ -0,0 +1,231 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.honeycomb.Routing.RoutingKeywords
+| Library | resources.libraries.python.Trace.Trace
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/routing.robot
+| ...
+| Test Setup | Clear Packet Trace on All DUTs | ${nodes}
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Test Teardown | Honeycomb routing test teardown | ${node} | ${table}
+| ...
+| Documentation | *Honeycomb routing test suite.*
+| ...
+| Force Tags | HC_FUNC
+
+*** Test Cases ***
+| TC01: Single hop IPv4 route
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-ICMP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 add ARP entries to both TG\
+| | ... | interfaces and configure route with TG-if2 as next-hop.
+| | ... | [Ver] Send ICMP packet from first TG interface to configured route
+| | ... | destination. Receive packet on the second TG interface.
+| | ...
+| | ${table}= | Set Variable | table1
+| | Given Setup interfaces and neighbors for IPv4 routing test
+| | When Honeycomb configures routing table
+| | ... | ${node} | table1 | ipv4 | ${table1} | ${1}
+| | Then Routing data from Honeycomb should contain
+| | ... | ${node} | table1 | ipv4 | ${table1_oper}
+| | And Verify route IPv4 | ${nodes['TG']}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+
+| TC02: Multi hop IPv4 route
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-ICMP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 add ARP entries to both TG\
+| | ... | interfaces and configure two routes through the second DUT interface.
+| | ... | [Ver] Send 100 ICMP packets from first TG interface to configured
+| | ... | route destination. Receive all packets on the second TG interface and\
+| | ... | verify that each destination MAC was used by exactly 50 packets.
+| | ... | Receive packet on the second TG interface.
+| | ...
+| | ${table}= | Set Variable | table2
+| | Given Setup interfaces and neighbors for IPv4 routing test
+| | And Honeycomb adds interface IPv4 neighbor | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${next_hop1} | ${next_hop_mac1}
+| | And Honeycomb adds interface IPv4 neighbor | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${next_hop2} | ${next_hop_mac2}
+| | When Honeycomb configures routing table
+| | ... | ${node} | table2 | ipv4 | ${table2} | ${1}
+| | Then Routing data from Honeycomb should contain
+| | ... | ${node} | table2 | ipv4 | ${table2_oper}
+| | And Verify multipath Route | ${nodes['TG']}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${dut_to_tg_if2_mac} | ${next_hop_mac1} | ${next_hop_mac2}
+
+| TC03: Special hop - blackhole IPv4 route
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv4-ICMP.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 add ARP entries to both TG\
+| | ... | interfaces and configure route with special rule blackhole.
+| | ... | [Ver] Send ICMP packet from first TG interface to configured route
+| | ... | destination. Make sure no packet is received on the second TG\
+| | ... | interface.
+| | ...
+| | ${table}= | Set Variable | table3
+| | Given Setup interfaces and neighbors for IPv4 routing test
+| | When Honeycomb configures routing table
+| | ... | ${node} | table3 | ipv4 | ${table3} | ${1} | special=${TRUE}
+| | Then Routing data from Honeycomb should contain
+| | ... | ${node} | table3 | ipv4 | ${table3_oper}
+| | And Run keyword and Expect Error | ICMP echo Rx timeout
+| | ... | Verify route IPv4 | ${nodes['TG']}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+
+| TC04: Single hop IPv6 route
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 add ARP entries to both TG\
+| | ... | interfaces and configure route with TG-if2 as next-hop.
+| | ... | [Ver] Send ICMP packet from first TG interface to configured route
+| | ... | destination. Receive packet on the second TG interface.
+| | ...
+| | ${table}= | Set Variable | table4
+| | Given Setup interfaces and neighbors for IPv6 routing test
+| | When Honeycomb configures routing table
+| | ... | ${node} | table4 | ipv6 | ${table4} | ${1}
+| | Then Routing data from Honeycomb should contain
+| | ... | ${node} | table4 | ipv6 | ${table4_oper}
+| | And Verify route IPv6 | ${nodes['TG']}
+| | ... | ${src_ip} | ${next_hop}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+
+| TC05: Multi hop IPv6 route
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 add ARP entries to both TG\
+| | ... | interfaces and configure two routes through the second DUT interface.
+| | ... | [Ver] Send 100 ICMP packets from first TG interface to configured
+| | ... | route destination. Receive all packets on the second TG interface and\
+| | ... | verify that each destination MAC was used by exactly 50 packets.
+| | ... | Receive packet on the second TG interface.
+| | ...
+| | ${table}= | Set Variable | table5
+| | Given Setup interfaces and neighbors for IPv6 routing test
+| | And Honeycomb adds interface IPv6 neighbor | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${next_hop1} | ${next_hop_mac1}
+| | And Honeycomb adds interface IPv6 neighbor | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${next_hop2} | ${next_hop_mac2}
+| | When Honeycomb configures routing table
+| | ... | ${node} | table5 | ipv6 | ${table5} | ${1}
+| | Then Routing data from Honeycomb should contain
+| | ... | ${node} | table5 | ipv6 | ${table5_oper}
+| | And Verify multipath Route | ${nodes['TG']}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+| | ... | ${dut_to_tg_if2_mac} | ${next_hop_mac1} | ${next_hop_mac2}
+
+| TC06: Special hop - blackhole IPv6 route
+| | [Documentation]
+| | ... | [Top] TG=DUT1=TG.
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] (Using Honeycomb API) On DUT1 add ARP entries to both TG\
+| | ... | interfaces and configure route with special rule blackhole.
+| | ... | [Ver] Send ICMP packet from first TG interface to configured route
+| | ... | destination. Make sure no packet is received on the second TG\
+| | ... | interface.
+| | ...
+| | ${table}= | Set Variable | table6
+| | Given Setup interfaces and neighbors for IPv6 routing test
+| | When Honeycomb configures routing table
+| | ... | ${node} | table6 | ipv6 | ${table6} | ${1} | special=${TRUE}
+| | Then Routing data from Honeycomb should contain
+| | ... | ${node} | table6 | ipv6 | ${table6_oper}
+| | And Run keyword and Expect Error | ICMP echo Rx timeout
+| | ... | Verify route IPv6 | ${nodes['TG']}
+| | ... | ${src_ip} | ${dst_ip}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
+
+*** Keywords ***
+| Setup interfaces and neighbors for IPv4 routing test
+| | Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Import Variables | resources/test_data/honeycomb/routing.py
+| | ... | ${nodes['DUT1']} | ipv4 | ${dut_to_tg_if2}
+| | Setup vrf IDs | ${dut_node} | ${dut_to_tg_if1} | ${1}
+| | Setup vrf IDs | ${dut_node} | ${dut_to_tg_if2} | ${1}
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2} | up
+| | Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_len}
+| | Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_len}
+| | Honeycomb adds interface IPv4 neighbor | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${src_ip} | ${tg_to_dut_if1_mac}
+| | Honeycomb adds interface IPv4 neighbor | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${next_hop} | ${tg_to_dut_if2_mac}
+
+| Setup interfaces and neighbors for IPv6 routing test
+| | Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Import Variables | resources/test_data/honeycomb/routing.py
+| | ... | ${nodes['DUT1']} | ipv6 | ${dut_to_tg_if2}
+| | Honeycomb sets interface VRF ID
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${1} | ipv6
+| | Honeycomb sets interface VRF ID
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${1} | ipv6
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
+| | Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2} | up
+| | Honeycomb sets interface IPv6 address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_len}
+| | Honeycomb sets interface IPv6 address | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_len}
+| | Honeycomb adds interface IPv6 neighbor | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${src_ip} | ${tg_to_dut_if1_mac}
+| | Honeycomb adds interface IPv6 neighbor | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${next_hop} | ${tg_to_dut_if2_mac}
+| | Vpp all ra suppress link layer | ${nodes}
+
+| Honeycomb routing test teardown
+| | ...
+| | [arguments] | ${node} | ${routing_table}
+| | ...
+| | Show Packet Trace on All DUTs | ${nodes}
+| | Log routing configuration from VAT | ${node}
+| | Honeycomb removes routing configuration | ${node} | ${routing_table}
+
+| Setup vrf IDs
+| | ...
+| | [Arguments] | ${node} | ${interface} | ${vrf}
+| | ...
+| | Honeycomb sets interface VRF ID
+| | ... | ${node} | ${interface} | ${vrf} | ipv4
+| | Honeycomb sets interface VRF ID
+| | ... | ${node} | ${interface} | ${vrf} | ipv6 \ No newline at end of file
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot
new file mode 100644
index 0000000000..3b5f365758
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot
@@ -0,0 +1,138 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+# Interface to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/slaac.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Documentation | *Honeycomb SLAAC management test suite.*
+| ...
+| Variables | resources/test_data/honeycomb/slaac_variables.py
+
+*** Test Cases ***
+| TC01: Honeycomb can configure SLAAC
+| | [Documentation] | Checks if Honeycomb can congigure SLAAC.
+| | ...
+| | Given SLAAC Operational Data From Honeycomb Should Be empty | ${node}
+| | ... | ${interface}
+| | And Honeycomb Configures Interface State | ${node} | ${interface} | up
+| | And Honeycomb sets interface IPv6 address | ${node} | ${interface}
+| | ... | ${address} | ${prefix}
+| | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data}
+| | Then SLAAC Operational Data From Honeycomb Should Be | ${node}
+| | ... | ${interface} | ${slaac_data}
+
+| TC02: Honeycomb can disable SLAAC
+| | [Documentation] | Checks if Honeycomb can disable SLAAC.
+| | ...
+| | Given SLAAC Operational Data From Honeycomb Should Be | ${node}
+| | ... | ${interface} | ${slaac_data}
+| | When Honeycomb removes SLAAC configuration | ${node} | ${interface}
+| | Then SLAAC Operational Data From Honeycomb Should Be empty | ${node}
+| | ... | ${interface}
+
+| TC03: Honeycomb can configure SLAAC with suppress link layer disabled
+| | [Documentation] | Checks if Honeycomb can congigure SLAAC.
+| | ...
+| | [Teardown] | SLAAC test teardown | ${node} | ${interface}
+| | ...
+| | Given SLAAC Operational Data From Honeycomb Should Be empty | ${node}
+| | ... | ${interface}
+| | And Honeycomb Configures Interface State | ${node} | ${interface} | up
+| | And Honeycomb sets interface IPv6 address | ${node} | ${interface}
+| | ... | ${address} | ${prefix}
+| | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data}
+| | Then SLAAC Operational Data From Honeycomb Should Be | ${node}
+| | ... | ${interface} | ${slaac_data}
+
+| TC04: Honeycomb can configure SLAAC with sending RA packets disabled
+| | [Documentation] | Checks if Honeycomb can configure SLAAC\
+| | ... | with given settings.
+| | ...
+| | [Teardown] | SLAAC test teardown | ${node} | ${interface}
+| | ...
+| | Given SLAAC Operational Data From Honeycomb Should Be empty | ${node}
+| | ... | ${interface}
+| | And Honeycomb Configures Interface State | ${node} | ${interface} | up
+| | And Honeycomb sets interface IPv6 address | ${node} | ${interface}
+| | ... | ${address} | ${prefix}
+| | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data_01}
+| | Then SLAAC Operational Data From Honeycomb Should Be | ${node}
+| | ... | ${interface} | ${slaac_data_01}
+
+| TC05: Honeycomb can configure SLAAC with min interval values
+| | [Documentation] | Checks if Honeycomb can configure SLAAC\
+| | ... | with given settings.
+| | ...
+| | [Teardown] | SLAAC test teardown | ${node} | ${interface}
+| | ...
+| | Given SLAAC Operational Data From Honeycomb Should Be empty | ${node}
+| | ... | ${interface}
+| | And Honeycomb Configures Interface State | ${node} | ${interface} | up
+| | And Honeycomb sets interface IPv6 address | ${node} | ${interface}
+| | ... | ${address} | ${prefix}
+| | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data_02}
+| | Then SLAAC Operational Data From Honeycomb Should Be | ${node}
+| | ... | ${interface} | ${slaac_data_02}
+
+| TC06: Honeycomb can configure SLAAC with max interval values
+| | [Documentation] | Checks if Honeycomb can configure SLAAC\
+| | ... | with given settings.
+| | ...
+| | [Teardown] | SLAAC test teardown | ${node} | ${interface}
+| | ...
+| | Given SLAAC Operational Data From Honeycomb Should Be empty | ${node}
+| | ... | ${interface}
+| | And Honeycomb Configures Interface State | ${node} | ${interface} | up
+| | And Honeycomb sets interface IPv6 address | ${node} | ${interface}
+| | ... | ${address} | ${prefix}
+| | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data_03}
+| | Then SLAAC Operational Data From Honeycomb Should Be | ${node}
+| | ... | ${interface} | ${slaac_data_03}
+
+| TC07: DUT retransmits RA on IPv6 enabled interface after a set interval
+# Traffic test failing in VIRL
+| | [Tags] | EXPECTED_FAILING
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Cfg] On DUT1 configure IPv6 interface on the link to TG.
+| | ... | [Ver] Make TG wait for two IPv6 Router Advertisement packets\
+| | ... | to be sent by DUT1 and verify the received RA packets are correct.
+| | ...
+| | [Teardown] | SLAAC test teardown | ${dut_node} | ${dut_to_tg_if1}
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Honeycomb sets interface IPv6 address
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${address} | ${prefix}
+| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1}
+| | ... | up
+| | When Honeycomb configures SLAAC | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${slaac_data}
+| | :FOR | ${n} | IN RANGE | ${2}
+| | | Then Receive and verify router advertisement packet
+| | | ... | ${tg_node} | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac} | ${20}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-snat44-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-snat44-apihc-apivat-func.robot
new file mode 100644
index 0000000000..2ce02c6aa1
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-snat44-apihc-apivat-func.robot
@@ -0,0 +1,105 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables***
+| ${interface}= | ${node['interfaces']['port1']['name']}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/nat.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Variables | resources/test_data/honeycomb/nat.py | ${node} | ${interface}
+| ...
+| Documentation | *Honeycomb NAT test suite.*
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+
+*** Test Cases ***
+| TC01: Honeycomb configures NAT entry
+| | [Documentation] | Honeycomb configures a static NAT entry.
+| | ...
+| | Given NAT Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${nat_empty}
+| | When Honeycomb Configures NAT Entry | ${node} | ${entry1}
+| | Then NAT Entries From Honeycomb Should Be | ${node} | ${entry1}
+
+| TC02: Honeycomb removes NAT entry
+| | [Documentation] | Honeycomb removes a configured static NAT entry.
+| | ...
+| | Given NAT Entries From Honeycomb Should Be | ${node} | ${entry1}
+| | When Honeycomb Configures NAT Entry | ${node} | ${NONE}
+| | Then NAT Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${nat_empty}
+
+| TC03: Honeycomb configures multiple NAT entries
+| | [Documentation] | Honeycomb configures two static NAT entries.
+| | ...
+| | [Teardown] | Honeycomb Configures NAT Entry | ${node} | ${NONE}
+| | ...
+| | Given NAT Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${nat_empty}
+| | When Honeycomb Configures NAT Entry | ${node} | ${entry1} | ${0} | ${1}
+| | And Honeycomb Configures NAT Entry | ${node} | ${entry2} | ${0} | ${2}
+| | Then NAT Entries From Honeycomb Should Be
+| | ... | ${node} | ${entry1_2_oper} | ${0}
+
+| TC04: Honeycomb enables NAT on interface - inbound
+| | [Documentation] | Honeycomb configures NAT on an interface\
+| | ... | in inbound direction.
+| | ...
+| | Given NAT Interface Operational Data From Honeycomb Should Be Empty
+| | ... | ${node} | ${interface} | inbound
+| | And NAT Interface Operational Data From Honeycomb Should Be Empty
+| | ... | ${node} | ${interface} | outbound
+| | When Honeycomb Configures NAT On Interface
+| | ... | ${node} | ${interface} | inbound
+| | Then NAT Interface Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${interface} | inbound
+| | And NAT Interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${interface} | outbound
+
+| TC05: Honeycomb removes NAT interface configuration
+| | [Documentation] | Honeycomb removes NAT configuration from an interface.
+| | ...
+| | Given NAT Interface Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${interface} | inbound
+| | And NAT Interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${interface} | outbound
+| | When Honeycomb removes NAT interface configuration
+| | ... | ${node} | ${interface} | inbound
+| | Then NAT Interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${interface} | inbound
+| | And NAT Interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${interface} | outbound
+
+| TC06: Honeycomb enables NAT on interface - outbound
+| | [Documentation] | Honeycomb configures NAT on an interface\
+| | ... | in outbound direction.
+| | ...
+| | [Teardown] | Honeycomb removes NAT interface configuration
+| | ... | ${node} | ${interface} | outbound
+| | ...
+| | Given NAT Interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${interface} | inbound
+| | And NAT Interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${interface} | outbound
+| | When Honeycomb Configures NAT on Interface
+| | ... | ${node} | ${interface} | outbound
+| | Then NAT Interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${interface} | inbound
+| | And NAT Interface Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${interface} | outbound
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot
new file mode 100644
index 0000000000..2bad2d7507
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot
@@ -0,0 +1,260 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/port_mirroring.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/sub_interface.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/telemetry/span.robot
+| Variables | resources/test_data/honeycomb/span.py
+| ... | ${node['interfaces']['port1']['name']}
+| ... | ${node['interfaces']['port3']['name']}
+| ... | local0
+| Variables | resources/test_data/honeycomb/sub_interfaces.py
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Suite Setup | Run Keywords
+| ... | Set Up Honeycomb Functional Test Suite | ${node} | AND
+| ... | Add Interface local0 To Topology | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Documentation | *Honeycomb port mirroring test suite.*
+
+*** Test Cases ***
+| TC01: Honeycomb can configure SPAN on an interface - receive
+| | [Documentation] | Honeycomb configures SPAN on interface and verifies
+| | ... | against VPP SPAN dump in state receive.
+| | ...
+| | When Honeycomb configures SPAN on interface
+| | ... | ${node} | ${interface1} | ${settings_receive}
+| | Then Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${settings_receive}
+
+| TC02: Honeycomb can configure SPAN on an interface - transmit
+| | [Documentation] | Honeycomb configures SPAN on interface and verifies
+| | ... | against VPP SPAN dump in state transmit.
+| | ...
+| | When Honeycomb configures SPAN on interface
+| | ... | ${node} | ${interface1} | ${settings_transmit}
+| | Then Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${settings_transmit}
+
+| TC03: Honeycomb can configure SPAN on an interface - both
+| | [Documentation] | Honeycomb configures SPAN on interface and verifies
+| | ... | against VPP SPAN dump in state both.
+| | ...
+| | When Honeycomb configures SPAN on interface
+| | ... | ${node} | ${interface1} | ${settings_both}
+| | Then Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${settings_both}
+
+| TC04: Honeycomb can configure SPAN on an interface with two source interfaces
+| | [Documentation] | Honeycomb configures SPAN on interface and verifies
+| | ... | against VPP SPAN dump in state both.
+| | ...
+| | When Honeycomb configures SPAN on interface
+| | ... | ${node} | ${interface1} | ${settings_both} | ${settings_if2}
+| | Then Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${settings_both} | ${settings_if2}
+
+| TC05: Honeycomb can disable SPAN on interface
+| | [Documentation] | Honeycomb removes existing SPAN configuration
+| | ... | from interface.
+| | ...
+| | Given Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${settings_both} | ${settings_if2}
+| | When Honeycomb removes interface SPAN configuration
+| | ... | ${node} | ${interface1}
+| | Then Interface SPAN Operational Data from Honeycomb should be empty
+| | ... | ${node} | ${interface1}
+
+| TC06: Honeycomb can configure SPAN with two destination interfaces from the same source
+| | [Documentation] | Honeycomb configures SPAN on two interfaces and verifies
+| | ... | against VPP SPAN dump.
+| | ...
+| | [Teardown] | Run Keywords
+| | ... | Honeycomb removes interface SPAN configuration
+| | ... | ${node} | ${interface1} | AND
+| | ... | Honeycomb removes interface SPAN configuration
+| | ... | ${node} | ${interface2}
+| | ...
+| | When Honeycomb configures SPAN on interface
+| | ... | ${node} | ${interface1} | ${settings_if2}
+| | And Honeycomb configures SPAN on interface
+| | ... | ${node} | ${interface2} | ${settings_if2}
+| | Then Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${settings_if2}
+| | Then Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface2} | ${settings_if2}
+
+| TC07: DUT mirrors IPv4 packets from one interface to another
+# Pending rework
+| | [Tags] | EXPECTED_FAILING
+| | [Documentation]
+| | ... | [Top] TG=DUT1
+| | ... | [Cfg] (using Honeycomb) On DUT1 configure IPv4 address and set SPAN\
+| | ... | mirroring from one DUT interface to the other.
+| | ... | [Ver] Make TG send an ARP packet to DUT through one interface,\
+| | ... | then receive a copy of sent packet and of DUT's ARP reply\
+| | ... | on the second interface.
+| | ...
+| | [Teardown] | Run Keywords
+| | ... | Show Packet Trace on All DUTs | ${nodes} | AND
+| | ... | Honeycomb clears all interface IPv4 neighbors
+| | ... | ${dut_node} | ${dut_to_tg_if1} | AND
+| | ... | Honeycomb removes interface IPv4 addresses
+| | ... | ${dut_node} | ${dut_to_tg_if1} | AND
+| | ... | Honeycomb removes interface SPAN configuration
+| | ... | ${node} | ${dut_to_tg_if2}
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1}
+| | ... | up
+| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2}
+| | ... | up
+| | And Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix}
+| | And Honeycomb adds interface IPv4 neighbor | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if1_mac}
+| | ${settings_5}= | create dictionary | state=both
+| | ... | iface-ref=${dut_to_tg_if1}
+| | And All Vpp Interfaces Ready Wait | ${nodes}
+| | When Honeycomb configures SPAN on interface
+| | ... | ${node} | ${dut_to_tg_if2} | ${settings_5}
+| | Then Send Packet And Check Received Copies | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${dut_to_tg_if1_mac} | ${tg_to_dut_if2}
+| | ... | ${tg_to_dut_if1_ip} | ${dut_to_tg_if1_ip} | ICMP
+
+| TC08: Honeycomb can configure SPAN on a sub-interface - receive
+| | [Documentation] | Honeycomb configures SPAN on sub-interface and verifies
+| | ... | against VPP SPAN dump in state receive.
+| | ...
+| | Given Honeycomb creates sub-interface | ${node} | ${interface1}
+| | ... | ${sub_if_1_match} | ${sub_if_1_tags} | ${sub_if_1_settings}
+| | When Honeycomb Configures SPAN on sub-interface
+| | ... | ${node} | ${interface1} | ${1} | ${settings_receive}
+| | Then sub-Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${1} | ${settings_receive}
+
+| TC09: Honeycomb can configure SPAN on a sub-interface - transmit
+| | [Documentation] | Honeycomb configures SPAN on sub-interface and verifies
+| | ... | against VPP SPAN dump in state transmit.
+| | ...
+| | Given Sub-interface state from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${1} | down | up
+| | When Honeycomb Configures SPAN on sub-interface
+| | ... | ${node} | ${interface1} | ${1} | ${settings_transmit}
+| | Then sub-Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${1} | ${settings_transmit}
+
+| TC10: Honeycomb can configure SPAN on a sub-interface - both
+| | [Documentation] | Honeycomb configures SPAN on sub-interface and verifies
+| | ... | against VPP SPAN dump in state both.
+| | ...
+| | Given Sub-interface state from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${1} | down | up
+| | When Honeycomb Configures SPAN on sub-interface
+| | ... | ${node} | ${interface1} | ${1} | ${settings_both}
+| | Then sub-Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${1} | ${settings_both}
+
+| TC11: Honeycomb can configure SPAN on a sub-interface with two source interfaces
+| | [Documentation] | Honeycomb configures SPAN on sub-interface and verifies
+| | ... | against VPP SPAN dump in state both.
+| | ...
+| | Given Sub-interface state from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${1} | down | up
+| | When Honeycomb Configures SPAN on sub-interface
+| | ... | ${node} | ${interface1} | ${1} | ${settings_both} | ${settings_if2}
+| | Then sub-Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${1} | ${settings_both} | ${settings_if2}
+
+| TC12: Honeycomb can disable SPAN on interface
+| | [Documentation] | Honeycomb removes existing SPAN configuration
+| | ... | from sub-interface.
+| | ...
+| | Given Sub-interface state from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${1} | down | up
+| | Given sub-Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${1} | ${settings_both} | ${settings_if2}
+| | When Honeycomb removes sub-interface SPAN configuration
+| | ... | ${node} | ${interface1} | ${1}
+| | Then sub-Interface SPAN Operational Data from Honeycomb should be empty
+| | ... | ${node} | ${interface1} | ${1}
+
+| TC13: Honeycomb can configure SPAN with two destination sub-interfaces from the same source
+| | [Documentation] | Honeycomb configures SPAN on two sub-interfaces
+| | ... | and verifies against VPP SPAN dump.
+| | ...
+| | [Teardown] | Run Keywords
+| | ... | Honeycomb removes sub-interface SPAN configuration
+| | ... | ${node} | ${interface1} | ${1} | AND
+| | ... | Honeycomb removes sub-interface SPAN configuration
+| | ... | ${node} | ${interface2} | ${1}
+| | ...
+| | Given Honeycomb creates sub-interface | ${node} | ${interface2}
+| | ... | ${sub_if_2_match} | ${sub_if_2_tags} | ${sub_if_2_settings}
+| | When Honeycomb Configures SPAN on sub-interface
+| | ... | ${node} | ${interface1} | ${1} | ${settings_if2}
+| | And Honeycomb Configures SPAN on sub-interface
+| | ... | ${node} | ${interface2} | ${1} | ${settings_if2}
+| | Then Sub-Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface1} | ${1} | ${settings_if2}
+| | Then Sub-Interface SPAN Operational Data from Honeycomb should be
+| | ... | ${node} | ${interface2} | ${1} | ${settings_if2}
+
+| TC14: DUT mirrors IPv4 packets from an interface to a sub-interface
+# Pending rework
+| | [Tags] | EXPECTED_FAILING
+| | [Documentation]
+| | ... | [Top] TG=DUT1
+| | ... | [Cfg] (using Honeycomb) On DUT1 configure IPv4 address and set SPAN\
+| | ... | mirroring from one DUT interface to a sub-interface on the other\
+| | ... | interface.
+| | ... | [Ver] Make TG send an ARP packet to DUT through one interface,\
+| | ... | then receive a copy of sent packet and of DUT's ARP reply\
+| | ... | on the sub-interface.
+| | ...
+| | [Teardown] | Show Packet Trace on All DUTs | ${nodes}
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Sub-interface state from Honeycomb should be
+| | ... | ${dut_node} | ${interface1} | ${1} | down | up
+| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1}
+| | ... | up
+| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2}
+| | ... | up
+| | And Honeycomb sets the sub-interface up
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${1}
+| | And Honeycomb sets interface IPv4 address with prefix | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix}
+| | And And Honeycomb adds interface IPv4 neighbor
+| | ... | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${tg_to_dut_if2_ip} | ${tg_to_dut_if2_mac}
+| | ${settings_5}= | create dictionary | state=both
+| | ... | iface-ref=${dut_to_tg_if2}
+| | And All Vpp Interfaces Ready Wait | ${nodes}
+| | When Honeycomb Configures SPAN on sub-interface
+| | ... | ${node} | ${dut_to_tg_if1} | ${1} | ${settings_5}
+| | Then Send Packet And Check Received Copies | ${tg_node}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if2_mac}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2_ip} | ${dut_to_tg_if2_ip} | ICMP
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-vxlan-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-vxlan-apihc-apivat-func.robot
new file mode 100644
index 0000000000..e40f9ff9cd
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-vxlan-apihc-apivat-func.robot
@@ -0,0 +1,139 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+# Interfaces to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+| ${vx_interface}= | vx_tunnel_test
+# Configuration which will be set and verified during tests.
+| &{vxlan_settings}= | src=192.168.0.2 | dst=192.168.0.3 | vni=${88}
+| ... | encap-vrf-id=${0}
+| &{vxlan_settings2}= | src=192.168.0.4 | dst=192.168.0.5 | vni=${47}
+| ... | encap-vrf-id=${0}
+| &{vxlan_settings_ipv6}= | src=10::10 | dst=10::11 | vni=${88}
+| ... | encap-vrf-id=${0}
+| &{vxlan_settings_ipv6_long}= | src=10:0:0:0:0:0:0:10 | dst=10:0:0:0:0:0:0:11
+| ... | vni=${88} | encap-vrf-id=${0}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/vxlan.robot
+# import additional VxLAN settings from resource file
+| Variables | resources/test_data/honeycomb/vxlan.py
+| ...
+| Force Tags | HC_FUNC
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Documentation | *Honeycomb VxLAN management test suite.*
+
+*** Test Cases ***
+| TC01: Honeycomb configures VxLAN tunnel
+| | [Documentation] | Check if Honeycomb API can configure VxLAN settings.
+| | ...
+| | Given VxLAN Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vx_interface}
+| | And VxLAN Operational Data From VAT Should Be empty | ${node}
+| | When Honeycomb sets interface VxLAN configuration
+| | ... | ${node} | ${vx_interface} | ${vxlan_settings}
+| | Then VxLAN Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vx_interface} | ${vxlan_settings}
+| | And VxLAN Operational Data From VAT Should Be
+| | ... | ${node} | ${vxlan_settings}
+| | ${vxlan_index}= | Get interface index from oper data
+| | ... | ${node} | ${vx_interface}
+| | Set Suite Variable | ${vxlan_index}
+
+| TC02: Honeycomb disables VxLAN tunnel
+| | [Documentation] | Check if Honeycomb API can reset VxLAN configuration.
+| | ...
+| | Given VxLAN Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vx_interface} | ${vxlan_settings}
+| | And Honeycomb should not show disabled interface in oper data
+| | ... | ${node} | ${vxlan_index}
+| | And VxLAN Operational Data From VAT Should Be
+| | ... | ${node} | ${vxlan_settings}
+| | When Honeycomb removes VxLAN tunnel settings | ${node} | ${vx_interface}
+| | Then VxLAN Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vx_interface}
+| | And Honeycomb should show disabled interface in oper data
+| | ... | ${node} | ${vxlan_index}
+| | And VxLAN Operational Data From VAT Should Be empty | ${node}
+
+| TC03: Honeycomb can configure VXLAN tunnel after one has been disabled
+| | [Documentation] | Check if Honeycomb API can configure VxLAN settings again\
+| | ... | after previous settings have been removed.
+| | ...
+| | [Teardown] | Honeycomb removes VxLAN tunnel settings
+| | ... | ${node} | ${vx_interface}
+| | ...
+| | Given VxLAN Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vx_interface}
+| | And Honeycomb should show disabled interface in oper data
+| | ... | ${node} | ${vxlan_index}
+| | And VxLAN Operational Data From VAT Should Be empty | ${node}
+| | When Honeycomb sets interface VxLAN configuration
+| | ... | ${node} | ${vx_interface} | ${vxlan_settings2}
+| | Then VxLAN Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vx_interface} | ${vxlan_settings2}
+| | And Honeycomb should not show disabled interface in oper data
+| | ... | ${node} | ${vxlan_index}
+| | And VxLAN Operational Data From VAT Should Be
+| | ... | ${node} | ${vxlan_settings2}
+
+| TC04: Honeycomb does not set VxLAN configuration on another interface type
+| | [Documentation] | Check if Honeycomb API prevents setting VxLAN\
+| | ... | on incorrect interface.
+| | ...
+| | Given VxLAN Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${interface}
+| | And VxLAN Operational Data From VAT Should Be empty | ${node}
+| | When Honeycomb fails setting VxLan on different interface type
+| | ... | ${node} | ${interface} | ${vxlan_settings2}
+| | Then VxLAN Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${interface}
+| | And VxLAN Operational Data From VAT Should Be empty
+| | ... | ${node}
+
+| TC05: Honeycomb does not set invalid VxLAN configuration
+| | [Documentation] | Check if Honeycomb API prevents setting incorrect VxLAN\
+| | ... | settings.
+| | ...
+| | Given VxLAN Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vx_interface}
+| | And VxLAN Operational Data From VAT Should Be empty | ${node}
+| | When Honeycomb fails setting invalid VxLAN configuration
+| | ... | ${node} | ${vx_interface} | ${vxlan_invalid}
+| | Then VxLAN Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vx_interface}
+
+| TC06: Honeycomb configures VxLAN tunnel with ipv6
+| | [Documentation] | Check if Honeycomb API can configure VxLAN with\
+| | ... | ipv6 settings.
+| | ...
+| | [Teardown] | Honeycomb removes VxLAN tunnel settings
+| | ... | ${node} | ${vx_interface}
+| | ...
+| | Given VxLAN Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vx_interface}
+| | And VxLAN Operational Data From VAT Should Be empty | ${node}
+| | When Honeycomb sets interface VxLAN configuration
+| | ... | ${node} | ${vx_interface} | ${vxlan_settings_ipv6}
+| | Then VxLAN Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vx_interface} | ${vxlan_settings_ipv6_long}
+| | And VxLAN Operational Data From VAT Should Be
+| | ... | ${node} | ${vxlan_settings_ipv6}
diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-vxlangpe-apihc-apivat-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-vxlangpe-apihc-apivat-func.robot
new file mode 100644
index 0000000000..680baf1130
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-cfg-vxlangpe-apihc-apivat-func.robot
@@ -0,0 +1,168 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+# Interface to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+
+# Parameters to be set on existing interface
+| ${vxlan_gpe_existing_if}= | ${interface}
+| &{vxlan_gpe_base_wrong_interface_settings}=
+| ... | name=${vxlan_gpe_existing_if}
+| ... | type=iana-if-type:ethernetCsmacd
+| ... | description=for testing purposes
+| ... | enabled=true
+| ... | link-up-down-trap-enable=enabled
+| &{vxlan_gpe_wrong_interface_settings}=
+| ... | local=192.168.50.77
+| ... | remote=192.168.50.72
+| ... | vni=${9}
+| ... | next-protocol=wrong_ipv4
+| ... | encap-vrf-id=${0}
+| ... | decap-vrf-id=${0}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/vxlan_gpe.robot
+# Import additional VxLAN GPE settings from resource file
+| Variables | resources/test_data/honeycomb/vxlan_gpe.py
+| ...
+| Documentation | *Honeycomb VxLAN-GPE management test suite.*
+| ...
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+# Disabled due to VPP-875: Configuring VxLAN GPE tunnel crashes VPP
+#| Force Tags | HC_FUNC
+
+*** Test Cases ***
+| TC01: Honeycomb creates VxLAN GPE tunnel
+| | [Documentation] | Check if Honeycomb API can configure a VxLAN GPE tunnel.
+| | ...
+| | Given interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | And interface Operational Data From VAT Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | When Honeycomb creates VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | ... | ${vxlan_gpe_base_settings} | ${vxlan_gpe_settings}
+| | Then VxLAN GPE Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | ... | ${vxlan_gpe_base_settings} | ${vxlan_gpe_settings}
+| | And VxLAN GPE Operational Data From VAT Should Be
+| | ... | ${node} | ${vxlan_gpe_if1} | ${vxlan_gpe_settings}
+| | And VxLAN GPE Interface indices from Honeycomb and VAT should correspond
+| | ... | ${node} | ${vxlan_gpe_if1}
+
+| TC02: Honeycomb removes VxLAN GPE tunnel
+| | [Documentation] | Check if Honeycomb API can remove VxLAN GPE tunnel.
+| | ...
+| | Given VxLAN GPE Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | ... | ${vxlan_gpe_base_settings} | ${vxlan_gpe_settings}
+| | VxLAN GPE Operational Data From VAT Should Be
+| | ... | ${node} | ${vxlan_gpe_if1} | ${vxlan_gpe_settings}
+| | When Honeycomb removes VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | Then VxLAN GPE Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if1}
+| | And VxLAN GPE Operational Data From VAT Should Be empty
+| | ... | ${node}
+
+| TC03: Honeycomb sets wrong interface type while creating VxLAN GPE tunnel
+| | [Documentation] | Check if Honeycomb refuses to create a VxLAN GPE tunnel\
+| | ... | with a wrong interface type set.
+| | ...
+| | Given interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if2}
+| | And interface Operational Data From VAT Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if2}
+| | When Honeycomb fails to create VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_if2}
+| | ... | ${vxlan_gpe_wrong_type_base_settings} | ${vxlan_gpe_settings}
+| | Then interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if2}
+| | And interface Operational Data From VAT Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if2}
+
+| TC04: Honeycomb sets wrong protocol while creating VxLAN GPE tunnel
+| | [Documentation] | Check if Honeycomb refuses to create a VxLAN GPE tunnel\
+| | ... | with a wrong next-protocol set.
+| | ...
+| | Given interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if3}
+| | And interface Operational Data From VAT Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if3}
+| | When Honeycomb fails to create VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_if3}
+| | ... | ${vxlan_gpe_wrong_protocol_base_settings}
+| | ... | ${vxlan_gpe_wrong_protocol_settings}
+| | Then interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if3}
+| | And interface Operational Data From VAT Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if3}
+
+| TC05: Honeycomb sets VxLAN GPE tunnel on existing interface with wrong type
+| | [Documentation] | Check if Honeycomb refuses to create a VxLAN GPE tunnel\
+| | ... | on existing interface with wrong type.
+| | ...
+| | Given VxLAN GPE Operational Data From VAT Should Be empty
+| | ... | ${node}
+| | When Honeycomb fails to create VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_existing_if}
+| | ... | ${vxlan_gpe_base_wrong_interface_settings}
+| | ... | ${vxlan_gpe_wrong_interface_settings}
+| | Then VxLAN GPE Operational Data From VAT Should Be empty
+| | ... | ${node}
+
+| TC06: Honeycomb creates VxLAN GPE tunnel with ipv6
+| | [Documentation] | Check if Honeycomb API can configure a VxLAN GPE tunnel\
+| | ... | with IPv6 addresses.
+| | ...
+| | Given VxLAN GPE Operational Data From VAT Should Be empty
+| | ... | ${node}
+| | And VxLAN GPE Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if5}
+| | When Honeycomb creates VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_if5}
+| | ... | ${vxlan_gpe_base_ipv6_settings} | ${vxlan_gpe_ipv6_settings}
+| | Then VxLAN GPE Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vxlan_gpe_if5}
+| | ... | ${vxlan_gpe_base_ipv6_settings} | ${vxlan_gpe_ipv6_settings}
+| | And Run Keyword And Continue On Failure
+| | ... | VxLAN GPE Operational Data From VAT Should Be
+| | ... | ${node} | ${vxlan_gpe_if5} | ${vxlan_gpe_ipv6_settings}
+| | And VxLAN GPE Interface indices from Honeycomb and VAT should correspond
+| | ... | ${node} | ${vxlan_gpe_if5}
+
+| TC07: Honeycomb creates a second VxLAN GPE tunnel with ipv6
+| | [Documentation] | Check if Honeycomb API can configure another VxLAN\
+| | ... | GPE tunnel with IPv6 addresses.
+| | ...
+| | Given interface Operational Data From Honeycomb Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if6}
+| | And interface Operational Data From VAT Should Be empty
+| | ... | ${node} | ${vxlan_gpe_if6}
+| | When Honeycomb creates VxLAN GPE interface
+| | ... | ${node} | ${vxlan_gpe_if6}
+| | ... | ${vxlan_gpe_base_ipv6_settings2} | ${vxlan_gpe_ipv6_settings2}
+| | Then VxLAN GPE Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${vxlan_gpe_if6}
+| | ... | ${vxlan_gpe_base_ipv6_settings2} | ${vxlan_gpe_ipv6_settings2}
+| | And VxLAN GPE Operational Data From VAT Should Be
+| | ... | ${node} | ${vxlan_gpe_if6} | ${vxlan_gpe_ipv6_settings2}
+| | And VxLAN GPE Interface indices from Honeycomb and VAT should correspond
+| | ... | ${node} | ${vxlan_gpe_if6}
diff --git a/tests/vpp/func/honeycomb/mgmt-notif-apihcnc-func.robot b/tests/vpp/func/honeycomb/mgmt-notif-apihcnc-func.robot
new file mode 100644
index 0000000000..5320a7fcb7
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-notif-apihcnc-func.robot
@@ -0,0 +1,68 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables ***
+# Interfaces to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+| ${tap_interface}= | tap_test
+| &{tap_settings}= | tap-name=tap_test | mac=08:00:27:c0:5d:37
+| ... | device-instance=${1}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/tap.robot
+| Resource | resources/libraries/robot/honeycomb/notifications.robot
+| ...
+| Documentation | *Honeycomb notifications test suite.*
+| ...
+| Suite Setup | Set Up Honeycomb Notifications Functional Test Suite
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
+| Force Tags | HC_FUNC
+
+*** Test Cases ***
+| TC01: Honeycomb sends notification on interface state change
+| | [Documentation] | Check if Honeycomb sends a state-changed notification\
+| | ... | when the state of an interface is changed.
+| | ...
+| | Given Interface state from Honeycomb should be
+| | ... | ${node} | ${interface} | down
+| | And Interface state from VAT should be | ${node} | ${interface} | down
+| | And Notification listener should be established | ${node}
+| | When Honeycomb configures interface state | ${node} | ${interface} | up
+| | Then Honeycomb should send interface state notification | ${interface} | up
+| | When Honeycomb configures interface state | ${node} | ${interface} | down
+| | And Honeycomb should send interface state notification | ${interface} | down
+
+| TC02: Honeycomb sends notification on interface deletion
+| | [Documentation] | Check if Honeycomb sends an interface-deleted notification
+| | ... | when an interface is deleted.
+| | ...
+| | Given TAP Operational Data From Honeycomb Should Be
+| | ... | ${node} | ${tap_interface} | ${tap_settings}
+| | And TAP Operational Data From VAT Should Be
+| | ... | ${node} | ${tap_interface} | ${tap_settings}
+| | And Notification listener should be established | ${node}
+| | When Honeycomb removes TAP interface | ${node} | ${tap_interface}
+| | Then Honeycomb should send interface deleted notification | ${tap_interface}
+
+*** Keywords ***
+| Set Up Honeycomb Notifications Functional Test Suite
+| | Set Up Honeycomb Functional Test Suite | ${node}
+| | Honeycomb configures interface state
+| | ... | ${node} | ${interface} | down
+| | Honeycomb creates TAP interface
+| | ... | ${node} | ${tap_interface} | ${tap_settings} \ No newline at end of file
diff --git a/tests/vpp/func/honeycomb/mgmt-statepersist-apihc-func.robot b/tests/vpp/func/honeycomb/mgmt-statepersist-apihc-func.robot
new file mode 100644
index 0000000000..1d3ce02e05
--- /dev/null
+++ b/tests/vpp/func/honeycomb/mgmt-statepersist-apihc-func.robot
@@ -0,0 +1,169 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Variables***
+# Interface to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/honeycomb/persistence.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/bridge_domain.robot
+| Resource | resources/libraries/robot/honeycomb/l2_fib.robot
+| ...
+| Suite Setup | Run Keywords
+| ... | Configure Persistence | ${node} | enable | AND
+| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ...
+| Suite Teardown | Configure Persistence | ${node} | disable
+| ...
+| Force Tags | HC_PERSIST | HC_REST_ONLY
+| ...
+| Documentation | *Honeycomb configuration persistence test suite.*
+
+*** Test Cases ***
+# multi-feature cases
+# ===================
+| TC01: Honeycomb persists configuration through restart of both Honeycomb and VPP
+| | [Documentation] | Checks if Honeycomb maintains configuration after both\
+| | ... | Restart Honeycomb and VPP.
+| | ...
+# Failing due to HC2VPP-47
+| | [Tags] | HC_FUNC | EXPECTED_FAILING
+| | ...
+| | [Teardown]
+| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ...
+| | Given Multi-Feature Persistence test configuration | ${node} | ${interface}
+| | And Multi-Feature persistence Test Verification | ${node} | ${interface}
+| | And Log persisted configuration on node | ${node}
+| | When Restart Honeycomb and VPP in pesistence test | ${node}
+| | Then Multi-Feature persistence Test Verification | ${node} | ${interface}
+
+| TC02: Honeycomb reverts to defaults if persistence files are invalid
+| | [Documentation] | Checks if Honeycomb reverts to default configuration when\
+| | ... | persistence files are damaged or invalid.
+| | ...
+| | [Tags] | HC_FUNC
+| | ...
+| | [Teardown]
+| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ...
+| | Given Multi-Feature Persistence test configuration | ${node} | ${interface}
+| | And Multi-Feature persistence Test Verification | ${node} | ${interface}
+| | When Persistence file is damaged during restart | ${node}
+| | Then Honeycomb and VPP should have default configuration | ${node}
+
+| TC03: Honeycomb persists configuration through restart of Honeycomb
+| | [Documentation] | Checks if Honeycomb maintains configuration after it\
+| | ... | is restarted.
+| | ...
+| | [Teardown]
+| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ...
+| | Given Multi-Feature Persistence test configuration | ${node} | ${interface}
+| | And Multi-Feature persistence Test Verification | ${node} | ${interface}
+| | And Log persisted configuration on node | ${node}
+| | When Restart Honeycomb | ${node}
+| | Then Multi-Feature persistence Test Verification | ${node} | ${interface}
+
+| TC04: Honeycomb persists configuration through restart of VPP
+| | [Documentation] | Checks if Honeycomb updates VPP settings after VPP is\
+| | ... | restarted.
+| | ...
+| | [Teardown]
+| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ...
+| | Given Multi-Feature Persistence test configuration | ${node} | ${interface}
+| | And Multi-Feature persistence Test Verification | ${node} | ${interface}
+| | And Log persisted configuration on node | ${node}
+| | When Restart VPP | ${node}
+| | Then Multi-Feature persistence Test Verification | ${node} | ${interface}
+
+# single-feature cases
+# ====================
+
+| TC05: Persist configuration of IP addresses and neighbors - HC and VPP restart
+| | [Documentation] | Verify persistence of interface state, IPv4 address
+| | ... | and neighbor entries through restart of both Honeycomb and VPP.
+| | ...
+| | [Teardown]
+| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ...
+| | Given Interface Persistence Setup | ${node}
+| | And Interface Persistence Check | ${node}
+| | When Restart Honeycomb and VPP in pesistence test | ${node}
+| | Then Interface Persistence Check | ${node}
+
+| TC06: Persist configuration of IP addresses and neighbors - HC restart
+| | [Documentation] | Verify persistence of interface state, IPv4 address
+| | ... | and neighbor entries through restart of Honeycomb.
+| | ...
+| | [Teardown]
+| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ...
+| | Given Interface Persistence Setup | ${node}
+| | And Interface Persistence Check | ${node}
+| | When Restart Honeycomb | ${node}
+| | Then Interface Persistence Check | ${node}
+
+| TC07: Persist configuration of IP addresses and neighbors - VPP restart
+| | [Documentation] | Verify persistence of interface state, IPv4 address
+| | ... | and neighbor entries through restart of VPP.
+| | ...
+| | [Teardown]
+| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ...
+| | Given Interface Persistence Setup | ${node}
+| | And Interface Persistence Check | ${node}
+| | When Restart VPP | ${node}
+| | Then Interface Persistence Check | ${node}
+
+| TC08: Honeycomb persists configuration of bridge domains - HC and VPP restart
+| | [Documentation] | Verify persistence of bridge domain, L2-FIB entry
+| | ... | and Bridge domain Operational Interface Assignment through restart
+| | ... | of both Honeycomb and VPP.
+| | ...
+| | [Teardown]
+| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ...
+| | Given Bridge Domain Persistence Setup | ${node}
+| | When Restart Honeycomb and VPP in pesistence test | ${node}
+| | Then Bridge Domain Persistence Check | ${node}
+
+| TC09: Honeycomb persists configuration of bridge domains - HC restart
+| | [Documentation] | Verify persistence of bridge domain, L2-FIB entry
+| | ... | and Bridge domain Operational Interface Assignment through restart
+| | ... | of Honeycomb.
+| | ...
+| | [Teardown]
+| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ...
+| | Given Bridge Domain Persistence Setup | ${node}
+| | When Restart Honeycomb | ${node}
+| | Then Bridge Domain Persistence Check | ${node}
+
+| TC10: Honeycomb persists configuration of bridge domains - VPP restart
+| | [Documentation] | Verify persistence of bridge domain, L2-FIB entry
+| | ... | and Bridge domain Operational Interface Assignment through restart
+| | ... | of VPP.
+| | ...
+| | [Teardown]
+| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ...
+| | Given Bridge Domain Persistence Setup | ${node}
+| | When Restart VPP | ${node}
+| | Then Bridge Domain Persistence Check | ${node}
+
+#TODO: All other features
diff --git a/tests/vpp/func/interfaces/api-crud-tap-func.robot b/tests/vpp/func/interfaces/api-crud-tap-func.robot
new file mode 100644
index 0000000000..8116f9d60d
--- /dev/null
+++ b/tests/vpp/func/interfaces/api-crud-tap-func.robot
@@ -0,0 +1,72 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.Tap
+| Library | resources.libraries.python.Namespaces
+| Library | resources.libraries.python.IPUtil
+| ...
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| ...
+| Test Setup | Set up TAP functional test
+| ...
+| Test Teardown | Tear down TAP functional test
+| ...
+| Documentation | *Tap Interface CRUD Tests*
+| ... | *[Top] Network Topologies:* TG=DUT1 2-node topology with two links
+| ... | between nodes.
+| ... | *[Enc] Packet Encapsulations:* No packet sent.
+| ... | *[Cfg] DUT configuration:* Add/Modify/Delete linux-TAP on DUT1.
+| ... | *[Ver] Verification:* Check dump of tap interfaces for correctness.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${tap_int1}= | tap_int1
+| ${tap_int2}= | tap_int2
+| ${mod_tap_name}= | tap_int1MOD
+
+*** Test Cases ***
+| TC01: Tap Interface Modify And Delete
+| | [Documentation]
+| | ... | [Top] TG-DUT1-TG.
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] Set two TAP interfaces.
+| | ... | [Ver] Verify that TAP interface can be modified, deleted, and no\
+| | ... | other TAP interface is affected.
+| | ...
+| | Given Configure path in 2-node circular topology | ${nodes['TG']}
+| | ... | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${int1}= | And Add Tap Interface | ${dut_node} | ${tap_int1}
+| | ${int2}= | And Add Tap Interface | ${dut_node} | ${tap_int2}
+| | And Set Interface State | ${dut_node} | ${int1} | up
+| | And Set Interface State | ${dut_node} | ${int2} | up
+| | When Modify Tap Interface | ${dut_node} | ${int1} | ${mod_tap_name}
+| | Then Check Tap Present | ${dut_node} | ${mod_tap_name}
+| | When Delete Tap Interface | ${dut_node} | ${int1}
+| | Then Run Keyword And Expect Error
+| | ... | Tap interface :${mod_tap_name} does not exist
+| | ... | Check Tap Present | ${dut_node} | ${mod_tap_name}
+| | And Check Tap Present | ${dut_node} | ${tap_int2}
+| | When Delete Tap Interface | ${dut_node} | ${int2}
+| | Then Run Keyword And Expect Error
+| | ... | ValueError: No JSON object could be decoded
+| | ... | Check Tap Present | ${dut_node} | ${tap_int2}
diff --git a/tests/vpp/func/interfaces/eth2p-eth-l2bdbasemaclrn-eth-2tap-func.robot b/tests/vpp/func/interfaces/eth2p-eth-l2bdbasemaclrn-eth-2tap-func.robot
new file mode 100644
index 0000000000..3b69f05698
--- /dev/null
+++ b/tests/vpp/func/interfaces/eth2p-eth-l2bdbasemaclrn-eth-2tap-func.robot
@@ -0,0 +1,88 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.Tap
+| Library | resources.libraries.python.Namespaces
+| Library | resources.libraries.python.IPUtil
+| ...
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| ...
+| Test Setup | Set up TAP functional test
+| ...
+| Test Teardown | Tear down TAP functional test with Linux bridge | ${bid_TAP}
+| ...
+| Documentation | *Tap Interface Traffic Tests*
+| ... | *[Top] Network Topologies:* TG=DUT1 2-node topology with two links
+| ... | between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of
+| ... | IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) MAC learning enabled; Split Horizon Groups (SHG)
+| ... | are set depending on test case; Namespaces (NM)
+| ... | are set on DUT1 with attached linux-TAP.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets
+| ... | are sent by TG on link to DUT1; On receipt TG verifies packets
+| ... | for correctness and their IPv4 src-addr, dst-addr, and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${bid_from_TG}= | 19
+| ${bid_to_TG}= | 20
+| ${bid_TAP}= | tapBr
+
+| ${tap_int1}= | tap_int1
+| ${tap_int2}= | tap_int2
+
+*** Test Cases ***
+| TC01: Tap Interface Simple BD
+| | [Documentation]
+| | ... | [Top] TG-DUT1-TG.
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] On DUT1 configure two L2BD with two if's for each L2BD with MAC\
+| | ... | learning and one L2BD joining two linux-TAP interfaces created by VPP\
+| | ... | located in namespace.
+| | ... | [Ver] Packet sent from TG is passed through all L2BD and received\
+| | ... | back on TG. Then src_ip, dst_ip and MAC are checked.
+| | ...
+| | Given Configure path in 2-node circular topology | ${nodes['TG']}
+| | ... | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${int1}= | And Add Tap Interface | ${dut_node} | ${tap_int1}
+| | ${int2}= | And Add Tap Interface | ${dut_node} | ${tap_int2}
+| | And Set Interface State | ${dut_node} | ${int1} | up
+| | And Set Interface State | ${dut_node} | ${int2} | up
+| | And Create bridge domain | ${dut_node}
+| | ... | ${bid_from_TG} | learn=${TRUE}
+| | And Create bridge domain | ${dut_node}
+| | ... | ${bid_to_TG} | learn=${TRUE}
+| | And Linux Add Bridge | ${dut_node}
+| | ... | ${bid_TAP} | ${tap_int1} | ${tap_int2}
+| | And Add interface to bridge domain | ${dut_node}
+| | ... | ${int1} | ${bid_to_TG} | 0
+| | And Add interface to bridge domain | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${bid_to_TG} | 0
+| | And Add interface to bridge domain | ${dut_node}
+| | ... | ${int2} | ${bid_from_TG} | 0
+| | And Add interface to bridge domain | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${bid_from_TG} | 0
+| | Then Send ICMP packet and verify received packet | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if2}
diff --git a/tests/vpp/func/interfaces/eth2p-eth-l2bdbasemaclrn-l2shg-eth-2tap-func.robot b/tests/vpp/func/interfaces/eth2p-eth-l2bdbasemaclrn-l2shg-eth-2tap-func.robot
new file mode 100644
index 0000000000..515596b147
--- /dev/null
+++ b/tests/vpp/func/interfaces/eth2p-eth-l2bdbasemaclrn-l2shg-eth-2tap-func.robot
@@ -0,0 +1,176 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.Tap
+| Library | resources.libraries.python.Namespaces
+| Library | resources.libraries.python.IPUtil
+| ...
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| ...
+| Test Setup | Set up TAP functional test
+| ...
+| Test Teardown | Tear down TAP functional test
+| ...
+| Documentation | *Tap Interface Traffic Tests*
+| ... | *[Top] Network Topologies:* TG=DUT1 2-node topology with two links
+| ... | between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of
+| ... | IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) MAC learning enabled; Split Horizon Groups (SHG)
+| ... | are set depending on test case; Namespaces (NM)
+| ... | are set on DUT1 with attached linux-TAP.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets
+| ... | are sent by TG on link to DUT1; On receipt TG verifies packets
+| ... | for correctness and their IPv4 src-addr, dst-addr, and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${tap1_NM_ip}= | 16.0.10.2
+| ${tap2_NM_SHG}= | 16.0.10.3
+
+| ${bd_id1}= | 21
+| ${shg1}= | 2
+| ${shg2}= | 3
+
+| ${tap1_NM_mac}= | 02:00:00:00:00:02
+| ${tap2_NM_mac}= | 02:00:00:00:00:04
+
+| ${tap_int1}= | tap_int1
+| ${tap_int2}= | tap_int2
+
+| ${namespace1}= | nmspace1
+| ${namespace2}= | nmspace2
+
+| ${tg_ip_address_SHG}= | 16.0.10.20
+| ${prefix}= | 24
+
+*** Test Cases ***
+| TC01: Tap Interface BD - Different Split Horizon
+| | [Documentation]
+| | ... | [Top] TG-DUT1-TG.
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] On DUT1 configure one if into L2BD with MAC learning. Add two\
+| | ... | TAP interfaces into this L2BD and assign them different SHG. Setup\
+| | ... | two namespaces and assign two linux-TAP interfaces to it respectively.
+| | ... | [Ver] Packet is sent from TG to both linux-TAP interfaces and reply\
+| | ... | is checked. Ping from First linux-TAP to another should pass.
+| | ...
+| | Given Configure path in 2-node circular topology | ${nodes['TG']}
+| | ... | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${int1}= | And Add Tap Interface | ${dut_node} | ${tap_int1}
+| | ${int2}= | And Add Tap Interface | ${dut_node} | ${tap_int2}
+| | And Set Interface State | ${dut_node} | ${int1} | up
+| | And Set Interface State | ${dut_node} | ${int2} | up
+| | When Create Namespace | ${dut_node} | ${namespace1}
+| | And Attach Interface To Namespace | ${dut_node}
+| | ... | ${namespace1} | ${tap_int1}
+| | And Create Namespace | ${dut_node} | ${namespace2}
+| | And Attach Interface To Namespace | ${dut_node}
+| | ... | ${namespace2} | ${tap_int2}
+| | And Set Linux Interface IP | ${dut_node} | ${tap_int1}
+| | ... | ${tap1_NM_ip} | ${prefix} | ${namespace1}
+| | And Set Linux Interface IP | ${dut_node} | ${tap_int2}
+| | ... | ${tap2_NM_SHG} | ${prefix} | ${namespace2}
+| | And Set Linux Interface MAC | ${dut_node}
+| | ... | ${tap_int1} | ${tap1_NM_mac} | ${namespace1}
+| | And Set Linux Interface MAC | ${dut_node}
+| | ... | ${tap_int2} | ${tap2_NM_mac} | ${namespace2}
+| | And Set Linux Interface ARP | ${dut_node} | ${tap_int1}
+| | ... | ${tg_ip_address_SHG} | ${tg_to_dut_if1_mac} | ${namespace1}
+| | And Set Linux Interface ARP | ${dut_node} | ${tap_int2}
+| | ... | ${tg_ip_address_SHG} | ${tg_to_dut_if1_mac} | ${namespace2}
+| | And Create bridge domain | ${dut_node}
+| | ... | ${bd_id1} | learn=${TRUE}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${int1}
+| | ... | ${bd_id1} | ${shg1}
+| | And Add interface to bridge domain | ${dut_node} | ${int2}
+| | ... | ${bd_id1} | ${shg2}
+| | Then Send ICMP echo request and verify answer | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tap1_NM_mac} | ${tg_to_dut_if1_mac}
+| | ... | ${tap1_NM_ip} | ${tg_ip_address_SHG}
+| | And Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tap2_NM_mac} | ${tg_to_dut_if1_mac}
+| | ... | ${tap2_NM_SHG} | ${tg_ip_address_SHG}
+| | And Send Ping From Node To Dst | ${dut_node} | ${tap1_NM_ip}
+| | ... | namespace=${namespace2}
+| | And Send Ping From Node To Dst | ${dut_node} | ${tap2_NM_SHG}
+| | ... | namespace=${namespace1}
+
+| TC02: Tap Interface BD - Same Split Horizon
+| | [Documentation]
+| | ... | [Top] TG-DUT1-TG.
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] On DUT1 configure one if into L2BD with MAC learning. Add two\
+| | ... | TAP interfaces into this L2BD and assign them same SHG. Setup two\
+| | ... | namespaces and assign two linux-TAP interfaces to it respectively.
+| | ... | [Ver] Packet is sent from TG to both linux-TAP interfaces and reply\
+| | ... | is checked. Ping from First linux-TAP to another should fail.
+| | ...
+| | Given Configure path in 2-node circular topology | ${nodes['TG']}
+| | ... | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${int1}= | And Add Tap Interface | ${dut_node} | ${tap_int1}
+| | ${int2}= | And Add Tap Interface | ${dut_node} | ${tap_int2}
+| | And Set Interface State | ${dut_node} | ${int1} | up
+| | And Set Interface State | ${dut_node} | ${int2} | up
+| | When Create Namespace | ${dut_node} | ${namespace1}
+| | And Attach Interface To Namespace | ${dut_node}
+| | ... | ${namespace1} | ${tap_int1}
+| | And Create Namespace | ${dut_node} | ${namespace2}
+| | And Attach Interface To Namespace | ${dut_node}
+| | ... | ${namespace2} | ${tap_int2}
+| | And Set Linux Interface IP | ${dut_node} | ${tap_int1}
+| | ... | ${tap1_NM_ip} | ${prefix} | ${namespace1}
+| | And Set Linux Interface IP | ${dut_node} | ${tap_int2}
+| | ... | ${tap2_NM_SHG} | ${prefix} | ${namespace2}
+| | And Set Linux Interface MAC | ${dut_node}
+| | ... | ${tap_int1} | ${tap1_NM_mac} | ${namespace1}
+| | And Set Linux Interface MAC | ${dut_node}
+| | ... | ${tap_int2} | ${tap2_NM_mac} | ${namespace2}
+| | And Set Linux Interface ARP | ${dut_node} | ${tap_int1}
+| | ... | ${tg_ip_address_SHG} | ${tg_to_dut_if1_mac} | ${namespace1}
+| | And Set Linux Interface ARP | ${dut_node} | ${tap_int2}
+| | ... | ${tg_ip_address_SHG} | ${tg_to_dut_if1_mac} | ${namespace2}
+| | And Create bridge domain | ${dut_node}
+| | ... | ${bd_id1} | learn=${TRUE}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${int1}
+| | ... | ${bd_id1} | ${shg1}
+| | And Add interface to bridge domain | ${dut_node} | ${int2}
+| | ... | ${bd_id1} | ${shg1}
+| | Then Send ICMP echo request and verify answer | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tap1_NM_mac} | ${tg_to_dut_if1_mac}
+| | ... | ${tap1_NM_ip} | ${tg_ip_address_SHG}
+| | And Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tap2_NM_mac} | ${tg_to_dut_if1_mac}
+| | ... | ${tap2_NM_SHG} | ${tg_ip_address_SHG}
+| | And Run Keyword And Expect Error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${dut_node} | ${tap2_NM_SHG}
+| | ... | namespace=${namespace1}
+| | And Run Keyword And Expect Error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${dut_node} | ${tap1_NM_ip}
+| | ... | namespace=${namespace2}
diff --git a/tests/vpp/func/interfaces/eth2p-ethip4-ip4base-eth-1tap-func.robot b/tests/vpp/func/interfaces/eth2p-ethip4-ip4base-eth-1tap-func.robot
new file mode 100644
index 0000000000..a870b89d1d
--- /dev/null
+++ b/tests/vpp/func/interfaces/eth2p-ethip4-ip4base-eth-1tap-func.robot
@@ -0,0 +1,126 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.Tap
+| Library | resources.libraries.python.Namespaces
+| Library | resources.libraries.python.IPUtil
+| ...
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| ...
+| Test Setup | Set up TAP functional test
+| ...
+| Test Teardown | Tear down TAP functional test
+| ...
+| Documentation | *Tap Interface Traffic Tests*
+| ... | *[Top] Network Topologies:* TG=DUT1 2-node topology with two links
+| ... | between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of
+| ... | IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) MAC learning enabled; Split Horizon Groups (SHG)
+| ... | are set depending on test case; Namespaces (NM)
+| ... | are set on DUT1 with attached linux-TAP.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets
+| ... | are sent by TG on link to DUT1; On receipt TG verifies packets
+| ... | for correctness and their IPv4 src-addr, dst-addr, and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${tap1_VPP_ip}= | 16.0.10.1
+| ${tap1_NM_ip}= | 16.0.10.2
+| ${tap1_NM_mac}= | 02:00:00:00:00:02
+| ${tap_int1}= | tap_int1
+
+| ${namespace1}= | nmspace1
+
+| ${dut_ip_address}= | 192.168.0.1
+| ${tg_ip_address}= | 192.168.0.2
+| ${tg_ip_address_GW}= | 192.168.0.0
+| ${prefix}= | 24
+
+*** Test Cases ***
+| TC01: Tap Interface IP Ping Without Namespace
+| | [Documentation]
+| | ... | [Top] TG-DUT1-TG.
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] On DUT1 configure two interface addresses with IPv4 of which\
+| | ... | one is TAP interface (dut_to_tg_if and TAP) and one is linux-TAP.
+| | ... | [Ver] Packet sent from TG gets to the destination and ICMP-reply is\
+| | ... | received on TG.
+| | ...
+| | Given Configure path in 2-node circular topology | ${nodes['TG']}
+| | ... | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${int1}= | And Add Tap Interface | ${dut_node} | ${tap_int1} |
+| | And Set Interface Address
+| | ... | ${dut_node} | ${int1} | ${tap1_VPP_ip} | ${prefix}
+| | And Set Interface Address
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip_address} | ${prefix}
+| | And Set Interface State | ${dut_node} | ${int1} | up
+| | And Set Linux Interface MAC | ${dut_node} | ${tap_int1} | ${tap1_NM_mac}
+| | And Set Linux Interface IP | ${dut_node}
+| | ... | ${tap_int1} | ${tap1_NM_ip} | ${prefix}
+| | And Add Route | ${dut_node}
+| | ... | ${tg_ip_address_GW} | ${prefix} | ${tap1_VPP_ip}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${tg_ip_address} | ${tg_to_dut_if1_mac}
+| | And Add Arp On Dut | ${dut_node} | ${int1}
+| | ... | ${tap1_NM_ip} | ${tap1_NM_mac}
+| | Then Send ICMP echo request and verify answer | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac} | ${tg_to_dut_if1_mac}
+| | ... | ${tap1_NM_ip} | ${tg_ip_address}
+
+| TC02: Tap Interface IP Ping With Namespace
+| | [Documentation]
+| | ... | [Top] TG-DUT1-TG.
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] On DUT1 configure two interface addresses with IPv4 of which\
+| | ... | one is TAP interface (dut_to_tg_if and TAP) and one is linux-TAP in\
+| | ... | namespace.
+| | ... | [Ver] Packet sent from TG gets to the destination and ICMP-reply is\
+| | ... | received on TG.
+| | ...
+| | Given Configure path in 2-node circular topology | ${nodes['TG']}
+| | ... | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${int1}= | And Add Tap Interface | ${dut_node} | ${tap_int1} |
+| | And Set Interface Address
+| | ... | ${dut_node} | ${int1} | ${tap1_VPP_ip} | ${prefix}
+| | And Set Interface Address
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip_address} | ${prefix}
+| | And Set Interface State | ${dut_node} | ${int1} | up
+| | When Create Namespace | ${dut_node} | ${namespace1}
+| | And Attach Interface To Namespace | ${dut_node}
+| | ... | ${namespace1} | ${tap_int1}
+| | And Set Linux Interface MAC | ${dut_node}
+| | ... | ${tap_int1} | ${tap1_NM_mac} | ${namespace1}
+| | And Set Linux Interface IP | ${dut_node}
+| | ... | ${tap_int1} | ${tap1_NM_ip} | ${prefix} | ${namespace1}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${tg_ip_address} | ${tg_to_dut_if1_mac}
+| | And Add Arp On Dut | ${dut_node} | ${int1}
+| | ... | ${tap1_NM_ip} | ${tap1_NM_mac}
+| | And Add Route | ${dut_node}
+| | ... | ${tg_ip_address_GW} | ${prefix} | ${tap1_VPP_ip} | ${namespace1}
+| | Then Send ICMP echo request and verify answer | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac} | ${tg_to_dut_if1_mac}
+| | ... | ${tap1_NM_ip} | ${tg_ip_address}
diff --git a/tests/vpp/func/ip4/eth2p-dot1q-ip4base-func.robot b/tests/vpp/func/ip4/eth2p-dot1q-ip4base-func.robot
new file mode 100644
index 0000000000..f206fe3d64
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-dot1q-ip4base-func.robot
@@ -0,0 +1,107 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPv6Util
+| Force Tags | 3_NODE_DOUBLE_LINK_TOPO | VM_ENV | HW_ENV | VPP_VM_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *IPv4 with VLAN subinterfaces*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-TG 2-node circular topology
+| ... | with double links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-IPv4-ICMPv4 on TG-DUT1-IF1,
+| ... | Eth-dot1q-IPv4-ICMPv4 on TG-DUT1-IF2.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with 2 Vlan subinterfaces
+| ... | on DUT1-IF2. The subinterfaces and DUT1-IF1 have IP addresses set and
+| ... | corresponding IP neighbor entries are configured.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1q.
+
+*** Variables ***
+
+| ${ip4_net0_1}= | 192.168.0.1
+| ${ip4_net0_2}= | 192.168.0.2
+| ${ip4_net1_1}= | 192.168.100.1
+| ${ip4_net1_2}= | 192.168.100.2
+| ${ip4_net2_1}= | 192.168.200.1
+| ${ip4_net2_2}= | 192.168.200.2
+| ${ip4_prefix}= | 24
+| ${tag_1}= | ${10}
+| ${tag_2}= | ${20}
+
+*** Test Cases ***
+| TC01: Process untagged send tagged
+| | Given Vlan Test Setup
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${ip4_net0_2} | ${ip4_net2_2} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2_mac}
+| | ... | encaps_rx=Dot1q | vlan_rx=${tag_2}
+
+| TC02: Process tagged send untagged
+# It doesn't work with virtio
+| | [Tags] | EXPECTED_FAILING
+| | Given Vlan Test Setup
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${ip4_net2_2} | ${ip4_net0_2} | ${tg_to_dut_if2}
+| | ... | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac} | ${tg_to_dut_if1}
+| | ... | ${dut_to_tg_if1_mac} | ${tg_to_dut_if1_mac}
+| | ... | encaps_tx=Dot1q | vlan_tx=${tag_2}
+
+| TC03: Process tagged send tagged
+# It doesn't work with virtio
+| | [Tags] | EXPECTED_FAILING
+| | Given Vlan Test Setup
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${ip4_net1_2} | ${ip4_net2_2} | ${tg_to_dut_if2}
+| | ... | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2_mac}
+| | ... | encaps_tx=Dot1q | vlan_tx=${tag_1}
+| | ... | encaps_rx=Dot1q | vlan_rx=${tag_2}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${ip4_net2_2} | ${ip4_net1_2} | ${tg_to_dut_if2}
+| | ... | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2_mac}
+| | ... | encaps_tx=Dot1q | vlan_tx=${tag_2}
+| | ... | encaps_rx=Dot1q | vlan_rx=${tag_1}
+
+*** Keywords ***
+| Vlan Test Setup
+| | Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Set interfaces in 2-node circular topology up
+| |
+| | ${vlan1_name} | ${vlan1_index}= | Create vlan sub-interface
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${tag_1}
+| | ${vlan2_name} | ${vlan2_index}= | Create vlan sub-interface
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${tag_2}
+| |
+| | Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${ip4_net0_1} | ${ip4_prefix}
+| | Set Interface Address | ${dut_node}
+| | ... | ${vlan1_index} | ${ip4_net1_1} | ${ip4_prefix}
+| | Set Interface Address | ${dut_node}
+| | ... | ${vlan2_index} | ${ip4_net2_1} | ${ip4_prefix}
+| |
+| | Add IP Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${ip4_net0_2}
+| | ... | ${tg_to_dut_if1_mac}
+| | Add IP Neighbor | ${dut_node} | ${vlan1_index} | ${ip4_net1_2}
+| | ... | ${tg_to_dut_if2_mac}
+| | Add IP Neighbor | ${dut_node} | ${vlan2_index} | ${ip4_net2_2}
+| | ... | ${tg_to_dut_if2_mac}
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-copblklistbase-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-copblklistbase-func.robot
new file mode 100644
index 0000000000..9ff3d2df75
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-copblklistbase-func.robot
@@ -0,0 +1,92 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.Cop
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Variables | resources/libraries/python/IPv4NodeAddress.py | ${nodes}
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *COP Security IPv4 Blacklist Tests*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 on all links.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv4 routing and
+| ... | static routes. COP security black-lists are applied on DUT1 ingress
+| ... | interface from TG. DUT2 is configured with L2XC.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent in
+| ... | one direction by TG on link to DUT1; on receive TG verifies packets for
+| ... | correctness and drops as applicable.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${tg_node}= | ${nodes['TG']}
+| ${dut1_node}= | ${nodes['DUT1']}
+| ${dut2_node}= | ${nodes['DUT2']}
+
+| ${dut1_if1_ip}= | 192.168.1.1
+| ${dut1_if2_ip}= | 192.168.2.1
+| ${dut1_if1_ip_GW}= | 192.168.1.2
+| ${dut1_if2_ip_GW}= | 192.168.2.2
+
+| ${test_dst_ip}= | 32.0.0.1
+| ${test_src_ip}= | 16.0.0.1
+
+| ${cop_dut_ip}= | 16.0.0.0
+
+| ${ip_prefix}= | 24
+| ${nodes_ipv4_addresses}= | ${nodes_ipv4_addr}
+
+| ${fib_table_number}= | 1
+
+*** Test Cases ***
+| TC01: DUT drops IPv4 pkts with COP blacklist set with IPv4 src-addr
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-ICMPv4. [Cfg] On DUT1 \
+| | ... | configure interface IPv4 addresses and routes in the main
+| | ... | routing domain, add COP blacklist on interface to TG with IPv4
+| | ... | src-addr matching packets generated by TG; on DUT2 configure L2
+| | ... | xconnect. [Ver] Make TG send ICMPv4 Echo Req on its interface to
+| | ... | DUT1; verify no ICMPv4 Echo Req pkts are received. [Ref]
+| | Given Configure path in 3-node circular topology
+| | ... | ${tg_node} | ${dut1_node} | ${dut2_node} | ${tg_node}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_if1_ip} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if2_ip} | ${ip_prefix}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_if1_ip_GW} | ${tg_to_dut1_mac}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if2_ip_GW} | ${tg_to_dut2_mac}
+| | And Vpp Route Add | ${dut1_node}
+| | ... | ${test_dst_ip} | ${ip_prefix} | ${dut1_if2_ip_GW} | ${dut1_to_dut2}
+| | And Add fib table | ${dut1_node}
+| | ... | ${cop_dut_ip} | ${ip_prefix} | ${fib_table_number} | drop
+| | When COP Add whitelist Entry
+| | ... | ${dut1_node} | ${dut1_to_tg} | ip4 | ${fib_table_number}
+| | And COP interface enable or disable | ${dut1_node} | ${dut1_to_tg} | enable
+| | Then Packet transmission from port to port should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2} | ${dut1_to_dut2_mac}
+| | ... | ${tg_to_dut2_mac}
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-copwhlistbase-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-copwhlistbase-func.robot
new file mode 100644
index 0000000000..775cbae579
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-copwhlistbase-func.robot
@@ -0,0 +1,92 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.Cop
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Variables | resources/libraries/python/IPv4NodeAddress.py | ${nodes}
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *COP Security IPv4 Whitelist Tests*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 on all links.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv4 routing and
+| ... | static routes. COP security white-lists are applied on DUT1 ingress
+| ... | interface from TG. DUT2 is configured with L2XC.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent in
+| ... | one direction by TG on link to DUT1; on receive TG verifies packets for
+| ... | correctness and drops as applicable.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${tg_node}= | ${nodes['TG']}
+| ${dut1_node}= | ${nodes['DUT1']}
+| ${dut2_node}= | ${nodes['DUT2']}
+
+| ${dut1_if1_ip}= | 192.168.1.1
+| ${dut1_if2_ip}= | 192.168.2.1
+| ${dut1_if1_ip_GW}= | 192.168.1.2
+| ${dut1_if2_ip_GW}= | 192.168.2.2
+
+| ${test_dst_ip}= | 32.0.0.1
+| ${test_src_ip}= | 16.0.0.1
+
+| ${cop_dut_ip}= | 16.0.0.0
+
+| ${ip_prefix}= | 24
+| ${nodes_ipv4_addresses}= | ${nodes_ipv4_addr}
+
+| ${fib_table_number}= | 1
+
+*** Test Cases ***
+| TC01: DUT permits IPv4 pkts with COP whitelist set with IPv4 src-addr
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-ICMPv4. [Cfg] On DUT1 \
+| | ... | configure interface IPv4 addresses and routes in the main
+| | ... | routing domain, add COP whitelist on interface to TG with IPv4
+| | ... | src-addr matching packets generated by TG; on DUT2 configure L2
+| | ... | xconnect. [Ver] Make TG send ICMPv4 Echo Req on its interface to
+| | ... | DUT1; verify received ICMPv4 Echo Req pkts are correct. [Ref]
+| | Given Configure path in 3-node circular topology
+| | ... | ${tg_node} | ${dut1_node} | ${dut2_node} | ${tg_node}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_if1_ip} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if2_ip} | ${ip_prefix}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_if1_ip_GW} | ${tg_to_dut1_mac}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if2_ip_GW} | ${tg_to_dut2_mac}
+| | And Vpp Route Add | ${dut1_node}
+| | ... | ${test_dst_ip} | ${ip_prefix} | ${dut1_if2_ip_GW} | ${dut1_to_dut2}
+| | And Add fib table | ${dut1_node}
+| | ... | ${cop_dut_ip} | ${ip_prefix} | ${fib_table_number} | local
+| | When COP Add whitelist Entry
+| | ... | ${dut1_node} | ${dut1_to_tg} | ip4 | ${fib_table_number}
+| | And COP interface enable or disable | ${dut1_node} | ${dut1_to_tg} | enable
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2} | ${dut1_to_dut2_mac}
+| | ... | ${tg_to_dut2_mac}
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-func.robot
new file mode 100644
index 0000000000..a8fb58d754
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-func.robot
@@ -0,0 +1,138 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | SKIP_VPP_PATCH
+| Suite Setup | Run Keywords
+| ... | Configure all DUTs before test | AND
+| ... | Configure all TGs for traffic script | AND
+| ... | Update All Interface Data On All Nodes | ${nodes} | AND
+| ... | Configure DUT nodes for IPv4 testing
+| Test Setup | Run Keywords | Save VPP PIDs | AND
+| ... | Reset VAT History On All DUTs | ${nodes} | AND
+| ... | Clear interface counters on all vpp nodes in topology | ${nodes}
+| Test Teardown | Run Keywords
+| ... | Show packet trace on all DUTs | ${nodes} | AND
+| ... | Show VAT History On All DUTs | ${nodes} | AND
+| ... | Verify VPP PID in Teardown
+| Documentation | *IPv4 routing test cases*
+| ...
+| ... | RFC791 IPv4, RFC826 ARP, RFC792 ICMPv4. Encapsulations: Eth-IPv4-ICMPv4
+| ... | on links TG-DUT1, TG-DUT2, DUT1-DUT2. IPv4 routing tests use circular
+| ... | 3-node topology TG - DUT1 - DUT2 - TG with one link between the nodes.
+| ... | DUT1 and DUT2 are configured with IPv4 routing and static routes. Test
+| ... | ICMPv4 Echo Request packets are sent in both directions by TG on links
+| ... | to DUT1 and DUT2 and received on TG links on the other side of circular
+| ... | topology. On receive TG verifies packets IPv4 src-addr, dst-addr and MAC
+| ... | addresses.
+
+*** Test Cases ***
+
+| TC01: DUT replies to ICMPv4 Echo Req to its ingress interface
+| | [Documentation]
+| | ... | Make TG send ICMPv4 Echo Req to DUT ingress interface. Make TG\
+| | ... | verify ICMP Echo Reply is correct.
+| | [Tags] | VM_ENV
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']}
+| | Compute Path
+| | ${src_port} | ${src_node}= | First Interface
+| | ${dst_port} | ${dst_node}= | Last Interface
+| | ${hops}= | Set Variable | ${0}
+| | Route traffic from interface '${src_port}' on node '${src_node}' to interface '${dst_port}' on node '${dst_node}' '${hops}' hops away using IPv4
+
+| TC02: DUT routes IPv4 to its egress interface
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv4 Echo Req towards DUT1 egress interface\
+| | ... | connected to DUT2. Make TG verify ICMPv4 Echo Reply is correct.
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
+| | Compute Path
+| | ${src_port} | ${src_node}= | First Interface
+| | ${dst_port} | ${dst_node}= | Last Egress Interface
+| | ${hops}= | Set Variable | ${0}
+| | Route traffic from interface '${src_port}' on node '${src_node}' to interface '${dst_port}' on node '${dst_node}' '${hops}' hops away using IPv4
+
+| TC03: DUT1 routes IPv4 to DUT2 ingress interface
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv4 Echo Req towards DUT2 ingress interface\
+| | ... | connected to DUT1. Make TG verify ICMPv4 Echo Reply is correct.
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
+| | Compute Path
+| | ${src_port} | ${src_node}= | First Interface
+| | ${dst_port} | ${dst_node}= | Last Interface
+| | ${hops}= | Set Variable | ${1}
+| | Route traffic from interface '${src_port}' on node '${src_node}' to interface '${dst_port}' on node '${dst_node}' '${hops}' hops away using IPv4
+
+| TC04: DUT1 routes IPv4 to DUT2 egress interface
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv4 Echo Req towards DUT2 egress interface\
+| | ... | connected to TG. Make TG verify ICMPv4 Echo Reply is correct.
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Compute Path
+| | ${src_port} | ${src_node}= | First Interface
+| | ${dst_port} | ${dst_node}= | Last Egress Interface
+| | ${hops}= | Set Variable | ${1}
+| | Route traffic from interface '${src_port}' on node '${src_node}' to interface '${dst_port}' on node '${dst_node}' '${hops}' hops away using IPv4
+
+| TC05: DUT1 and DUT2 route IPv4 between TG interfaces
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across DUT1\
+| | ... | and DUT2. Make TG verify ICMPv4 Echo Replies are correct.
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Compute Path
+| | ${src_port} | ${src_node}= | First Interface
+| | ${dst_port} | ${dst_node}= | Last Interface
+| | ${hops}= | Set Variable | ${2}
+| | Route traffic from interface '${src_port}' on node '${src_node}' to interface '${dst_port}' on node '${dst_node}' '${hops}' hops away using IPv4
+
+| TC06: DUT replies to ICMPv4 Echo Reqs with size 64B-to-1500B-incr-1B
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv4 Echo Reqs to DUT ingress interface,\
+| | ... | incrementating frame size from 64B to 1500B with increment step
+| | ... | of 1Byte. Make TG verify ICMP Echo Replies are correct.
+| | Execute IPv4 ICMP echo sweep | ${nodes['TG']} | ${nodes['DUT1']} | 0 | 1452 | 1
+
+| TC07: DUT replies to ICMPv4 Echo Reqs with size 1500B-to-9000B-incr-10B
+| | [Documentation]
+| | ... | Make TG send ICMPv4 Echo Reqs to DUT ingress interface,\
+| | ... | incrementating frame size from 1500B to 9000B with increment
+| | ... | step of 10Bytes. Make TG verify ICMPv4 Echo Replies are correct.
+| | [Setup] | Configure MTU on TG based on MTU on DUT | ${nodes['TG']} | ${nodes['DUT1']}
+| | [Teardown] | Run keywords
+| | ... | Set default Ethernet MTU on all interfaces on node | ${nodes['TG']}
+| | ... | AND | Verify VPP PID in Teardown
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']}
+| | Compute Path
+| | ${dut_port} | ${dut_node}= | Last Interface
+| | ${mtu}= | Get Interface MTU | ${dut_node} | ${dut_port}
+| | # ICMP payload size is frame size minus size of Ehternet header, FCS,
+| | # IPv4 header and ICMP header
+| | ${end_size}= | Evaluate | ${mtu} - 14 - 4 - 20 - 8
+| | Run Keyword If | ${mtu} > 1518
+| | ... | Execute IPv4 ICMP echo sweep | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | 1452 | ${end_size} | 10
+
+| TC08: DUT replies to ARP request
+| | [Tags] | VM_ENV | SKIP_VPP_PATCH
+| | [Documentation]
+| | ... | Make TG send ARP Request to DUT and verify ARP Reply is correct.\
+| | Send ARP request and verify response | ${nodes['TG']} | ${nodes['DUT1']}
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-iaclbase-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-iaclbase-func.robot
new file mode 100644
index 0000000000..5afa75b55e
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-iaclbase-func.robot
@@ -0,0 +1,524 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/counters.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Classify.Classify
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *IPv4 routing with ingress ACL test cases*
+| ...
+| ... | Encapsulations: Eth-IPv4 on links TG-DUT1, TG-DUT2, DUT1-DUT2. IPv4
+| ... | ingress ACL (iACL) tests use 3-node topology TG - DUT1 - DUT2 - TG with
+| ... | one link between the nodes. DUT1 and DUT2 are configured with IPv4
+| ... | routing and static routes. DUT1 is configured with iACL on link to TG,
+| ... | iACL classification and permit/deny action are configured on a per test
+| ... | case basis. Test ICMPv4 Echo Request packets are sent in one direction
+| ... | by TG on link to DUT1 and received on TG link to DUT2. On receive TG
+| ... | verifies if packets are dropped, or if received verifies packet IPv4
+| ... | src-addr, dst-addr and MAC addresses.
+
+*** Variables ***
+| ${dut1_to_tg_ip}= | 192.168.1.1
+| ${dut1_to_dut2_ip}= | 192.168.2.1
+| ${dut1_to_dut2_ip_GW}= | 192.168.2.2
+| ${test_dst_ip}= | 32.0.0.1
+| ${test_src_ip}= | 16.0.0.1
+| ${non_drop_dst_ip}= | 33.0.0.1
+| ${non_drop_src_ip}= | 15.0.0.1
+| ${prefix_length}= | 24
+| ${ip_version}= | ip4
+| ${l2_table}= | l2
+
+*** Test Cases ***
+| TC01: DUT with iACL IPv4 src-addr drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add source IPv4 address to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${non_drop_src_ip} | ${test_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table L3 | ${dut1_node}
+| | ... | ${ip_version} | src
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${ip_version} | src | ${test_src_ip}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then Packet transmission from port to port should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${non_drop_src_ip} | ${test_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+
+| TC02: DUT with iACL IPv4 dst-addr drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add destination IPv4 address to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${non_drop_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${non_drop_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table L3 | ${dut1_node}
+| | ... | ${ip_version} | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${ip_version} | dst | ${test_dst_ip}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then Packet transmission from port to port should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${non_drop_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+
+| TC03: DUT with iACL IPv4 src-addr and dst-addr drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add source and destination IPv4 addresses to classify table\
+| | ... | with 'deny'. Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${non_drop_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${non_drop_src_ip} | ${non_drop_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | ${table_index_1} | ${skip_n_1} | ${match_n_1}=
+| | ... | When Vpp Creates Classify Table L3 | ${dut1_node}
+| | ... | ${ip_version} | src
+| | ${table_index_2} | ${skip_n_2} | ${match_n_2}=
+| | ... | And Vpp Creates Classify Table L3 | ${dut1_node} | ${ip_version} | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1_node} | deny | ${table_index_1} | ${skip_n_1} | ${match_n_2}
+| | ... | ${ip_version} | src | ${test_src_ip}
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1_node} | deny | ${table_index_2} | ${skip_n_2} | ${match_n_2}
+| | ... | ${ip_version} | dst | ${test_dst_ip}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index_1}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index_2}
+| | Then Packet transmission from port to port should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${non_drop_src_ip} | ${non_drop_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+
+| TC04: DUT with iACL IPv4 protocol set to TCP drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add protocol mask and TCP protocol (0x06) to classify table\
+| | ... | with 'deny'. Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex
+| | ... | ${dut1_node} | 0000000000000000000000000000000000000000000000FF
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | 000000000000000000000000000000000000000000000006
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+
+| TC05: DUT with iACL IPv4 protocol set to UDP drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add protocol mask and UDP protocol (0x11) to classify table\
+| | ... | with 'deny'. Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex
+| | ... | ${dut1_node} | 0000000000000000000000000000000000000000000000FF
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | 000000000000000000000000000000000000000000000011
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+
+| TC06: DUT with iACL IPv4 TCP src-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add TCP source ports to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 110 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | TCP | source
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 80 | 0
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 110 | 20
+
+| TC07: DUT with iACL IPv4 TCP dst-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add TCP destination ports to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 20 | 110
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 20 | 80
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | TCP | destination
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 0 | 80
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 20 | 80
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 20 | 110
+
+| TC08: DUT with iACL IPv4 TCP src-ports and dst-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add TCP source and destination ports to classify table\
+| | ... | with 'deny'. Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 110 | 25
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | TCP
+| | ... | source + destination
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 80 | 20
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 110 | 25
+
+| TC09: DUT with iACL IPv4 UDP src-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add UDP source ports to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 110 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | UDP | source
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 80 | 0
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 110 | 20
+
+| TC10: DUT with iACL IPv4 UDP dst-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add TCP destination ports to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 20 | 110
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 20 | 80
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | UDP | destination
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 0 | 80
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 20 | 80
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 20 | 110
+
+| TC11: DUT with iACL IPv4 UDP src-ports and dst-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add UDP source and destination ports to classify table\
+| | ... | with 'deny'. Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 110 | 25
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | UDP
+| | ... | source + destination
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 80 | 20
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 110 | 25
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4arp-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4arp-func.robot
new file mode 100644
index 0000000000..8d93aec58a
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4arp-func.robot
@@ -0,0 +1,82 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/counters.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *IPv4 ARP test cases*
+| ...
+| ... | RFC826 ARP: Eth-IPv4 and Eth-ARP on links TG-DUT1, TG-DUT2, DUT1-DUT2:
+| ... | IPv4 ARP tests use 3-node topology TG - DUT1 - DUT2 - TG with one link
+| ... | between the nodes. DUT1 and DUT2 are configured with IPv4 routing and
+| ... | static routes. DUT ARP functionality is tested by making TG send ICMPv4
+| ... | Echo Requests towards its other interface via DUT1 and DUT2.
+
+*** Variables ***
+| ${dut1_to_tg_ip}= | 192.168.1.1
+| ${dut1_to_dut2_ip}= | 192.168.2.1
+| ${dut1_to_dut2_ip_GW}= | 192.168.2.2
+| ${test_dst_ip}= | 32.0.0.1
+| ${test_src_ip}= | 16.0.0.1
+| ${prefix_length}= | 24
+
+*** Test Cases ***
+| TC01: DUT sends ARP Request for unresolved locally connected IPv4 address
+| | [Documentation]
+| | ... | Make TG send test packet destined to IPv4 address of its other\
+| | ... | interface connected to DUT2. Make TG verify DUT2 sends ARP
+| | ... | Request for locally connected TG IPv4 address.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | When Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | Then Send packet and verify ARP request | ${tg_node}
+| | ... | ${test_src_ip} | ${dut1_to_dut2_ip_GW} | ${tg_to_dut1}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2} | ${dut1_to_dut2_mac}
+| | ... | ${dut1_to_dut2_ip} | ${dut1_to_dut2_ip_GW}
+
+| TC02: DUT sends ARP Request for route next hop IPv4 address
+| | [Documentation] |
+| | ... | Make TG send test packet destined to IPv4 address matching\
+| | ... | static route on DUT2. Make TG verify DUT2 sends ARP Request for
+| | ... | next hop of the static route.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | When Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2} | resolve_attempts=${NONE}
+| | Then Send packet and verify ARP request | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2} | ${dut1_to_dut2_mac}
+| | ... | ${dut1_to_dut2_ip} | ${dut1_to_dut2_ip_GW}
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpclient-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpclient-func.robot
new file mode 100644
index 0000000000..5960e83797
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpclient-func.robot
@@ -0,0 +1,117 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/features/dhcp_client.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *DHCPv4 Client related test cases*
+
+*** Variables ***
+| ${client_hostname}= | dhcp-client
+| ${client_ip}= | 192.168.23.10
+| ${client_mask}= | 255.255.255.0
+| ${server_ip}= | 192.168.23.1
+| ${own_xid}= | 11112222
+| ${lease_time}= | ${15}
+
+*** Test Cases ***
+| TC01: VPP sends a DHCP DISCOVER
+| | [Documentation] | Configure DHCPv4 client on interface to TG without
+| | ... | hostname and check if DHCPv4 DISCOVER message contains all
+| | ... | required fields with expected values.
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | When Set DHCP client on Interface | ${dut_node} | ${dut_to_tg_if1}
+| | Then Verify DHCP DISCOVER header | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac}
+
+| TC02: VPP sends a DHCPv4 DISCOVER with hostname
+| | [Documentation] | Configure DHCPv4 client on interface to TG with hostname
+| | ... | and check if DHCPv4 DISCOVER message contains all required
+| | ... | fields with expected values.
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | When Set DHCP client on Interface | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${client_hostname}
+| | Then Verify DHCP DISCOVER header | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac} | ${client_hostname}
+
+| TC03: VPP sends DHCPv4 REQUEST after OFFER
+| | [Documentation] | Configure DHCPv4 client on interface to TG and check if
+| | ... | DHCPv4 REQUEST message contains all required fields.
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And VPP Route Add | ${dut_node} | 255.255.255.255 | 32 | ${NONE} | local
+| | ... | ${FALSE} | ${NONE}
+| | When Set DHCP client on Interface | ${dut_node} | ${dut_to_tg_if1}
+| | Then Verify DHCP REQUEST after OFFER | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if1_mac} | ${server_ip}
+| | ... | ${dut_to_tg_if1_mac} | ${client_ip} | ${client_mask}
+
+| TC04: VPP doesn't send DHCPv4 REQUEST after OFFER with wrong XID
+| | [ Tags ] | EXPECTED_FAILING
+| | [Documentation] | Configure DHCPv4 client on interface to TG. If server
+| | ... | sends DHCPv4 OFFER with different XID as in DHCPv4
+| | ... | DISCOVER, DHCPv4 REQUEST message shouldn't be sent.
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And VPP Route Add | ${dut_node} | 255.255.255.255 | 32 | ${NONE} | local
+| | ... | ${FALSE} | ${NONE}
+| | When Set DHCP client on Interface | ${dut_node} | ${dut_to_tg_if1}
+| | Then Run Keyword And Expect Error | DHCP REQUEST Rx timeout
+| | ... | Verify DHCP REQUEST after OFFER | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if1_mac} | ${server_ip}
+| | ... | ${dut_to_tg_if1_mac} | ${client_ip} | ${client_mask}
+| | ... | offer_xid=${own_xid}
+
+| TC05: VPP honors DHCPv4 lease time
+| | [Documentation] | Send IP configuration to the VPP client via DHCPv4.
+| | ... | Address is checked with ICMP echo request and there should
+| | ... | be no reply for echo request when lease has expired.
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And VPP Route Add | ${dut_node} | 255.255.255.255 | 32 | ${NONE} | local
+| | ... | ${FALSE} | ${NONE}
+| | When Set DHCP client on Interface | ${dut_node} | ${dut_to_tg_if1}
+| | And Configure IP on client via DHCP
+| | ... | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if1_mac} | ${server_ip}
+| | ... | ${client_ip} | ${client_mask}
+| | ... | ${lease_time}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if1} | ${server_ip}
+| | ... | ${tg_to_dut_if1_mac}
+| | Then Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${dut_to_tg_if1_mac} | ${tg_to_dut_if1_mac} | ${client_ip}
+| | ... | ${server_ip}
+| | And Sleep | ${lease_time}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac} | ${tg_to_dut_if1_mac}
+| | ... | ${client_ip} | ${server_ip}
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpproxy-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpproxy-func.robot
new file mode 100644
index 0000000000..9df4174ba9
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpproxy-func.robot
@@ -0,0 +1,93 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/features/dhcp_proxy.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *DHCPv4 proxy test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG = DUT
+| ... | with two links between the nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP-BOOTP-DHCP
+| ... | *[Cfg] DUT configuration:* DUT is configured with DHCPv4 proxy.
+| ... | *[Ver] TG verification:* Test DHCPv4 packets are sent
+| ... | on TG on first link to DUT and received on TG on second link.
+| ... | On receive TG verifies if DHCPv4 packets are valid.
+
+*** Variables ***
+| ${dut_to_tg_if1_ip}= | 172.16.0.1
+| ${dut_to_tg_if2_ip}= | 192.168.0.1
+| ${dhcp_server_ip}= | 192.168.0.100
+| ${client_ip}= | 172.16.0.2
+| ${prefix_length}= | 24
+
+| ${discover_src_ip}= | 0.0.0.0
+| ${valid_discover_dst_ip}= | 255.255.255.255
+| ${invalid_discover_dst_ip}= | 255.255.255.1
+
+*** Test Cases ***
+| TC01: VPP proxies valid DHCPv4 request to DHCPv4 server
+| | [Documentation] |
+| | ... | [Top] TG=DUT \
+| | ... | [Enc] Eth-IPv4-UDP-BOOTP-DHCP
+| | ... | [Cfg] On DUT setup DHCPv4 proxy.
+| | ... | [Ver] Make TG verify matching DHCPv4 packets between client and DHCPv4
+| | ... | server through DHCP proxy.
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And VPP Route Add | ${dut_node} | 255.255.255.255 | 32 | ${NONE} | local
+| | ... | ${FALSE} | ${NONE}
+| | And Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if2} | ${dhcp_server_ip}
+| | ... | ${tg_to_dut_if2_mac}
+| | When DHCP Proxy Config | ${dut_node} | ${dhcp_server_ip}
+| | ... | ${dut_to_tg_if1_ip}
+| | Then Send DHCP messages and check answer | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${dhcp_server_ip} | ${tg_to_dut_if2_mac}
+| | ... | ${client_ip} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_ip}
+
+| TC02: VPP proxy ignores invalid DHCPv4 request
+| | [Documentation] |
+| | ... | [Top] TG=DUT \
+| | ... | [Enc] Eth-IPv4-UDP-BOOTP-DHCP
+| | ... | [Cfg] On DUT setup DHCPv4 proxy.
+| | ... | [Ver] Make TG verify matching invalid DHCPv4 packets are dropped.
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And VPP Route Add | ${dut_node} | 255.255.255.255 | 32 | ${NONE} | local
+| | ... | ${FALSE} | ${NONE}
+| | And Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if2} | ${dhcp_server_ip}
+| | ... | ${tg_to_dut_if2_mac}
+| | When DHCP Proxy Config | ${dut_node} | ${dhcp_server_ip}
+| | ... | ${dut_to_tg_if1_ip}
+| | Then Send DHCP DISCOVER and check answer | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${discover_src_ip} | ${valid_discover_dst_ip}
+| | And DHCP DISCOVER should fail | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${discover_src_ip} | ${invalid_discover_dst_ip}
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4ecmp-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4ecmp-func.robot
new file mode 100644
index 0000000000..67640443c7
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4ecmp-func.robot
@@ -0,0 +1,74 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/counters.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *Ipv4 Multipath routing test cases*
+| ...
+| ... | *[Top] Network topologies:* TG=DUT 2-node topology with two links\
+| ... | between nodes.
+| ... | *[Cfg] DUT configuration:* On DUT configure interfaces IPv4 adresses,\
+| ... | and multipath routing.
+| ... | *[Ver] TG verification:* Test packets are sent from TG on the first\
+| ... | link to DUT. Packet is received on TG on the second link from DUT1.
+
+
+*** Variables ***
+| ${ip_1}= | 192.168.1.1
+| ${ip_2}= | 192.168.2.1
+| ${test_dst_ip}= | 32.0.0.1
+| ${test_src_ip}= | 16.0.0.1
+| ${prefix_length}= | 24
+| ${neighbor_1_ip}= | 192.168.2.10
+| ${neighbor_1_mac}= | 02:00:00:00:00:02
+| ${neighbor_2_ip}= | 192.168.2.20
+| ${neighbor_2_mac}= | 02:00:00:00:00:03
+
+*** Test Cases ***
+| TC01: IPv4 Equal-cost multipath routing
+| | [Documentation]
+| | ... | [Top] TG=DUT
+| | ... | [Cfg] On DUT configure multipath routing wiht two equal-cost paths.
+| | ... | [Ver] TG sends 100 IPv4 ICMP packets traffic on the first link to\
+| | ... | DUT. On second link to TG verify if traffic is divided into two paths.
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${ip_1} | ${prefix_length}
+| | And Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${ip_2} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${neighbor_1_ip} | ${neighbor_1_mac}
+| | And Add Arp On Dut
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${neighbor_2_ip} | ${neighbor_2_mac}
+| | When Vpp Route Add
+| | ... | ${dut_node} | ${test_dst_ip} | ${prefix_length} | ${neighbor_1_ip}
+| | ... | ${dut_to_tg_if1} | resolve_attempts=${NONE} | multipath=${TRUE}
+| | And Vpp Route Add
+| | ... | ${dut_node} | ${test_dst_ip} | ${prefix_length} | ${neighbor_2_ip}
+| | ... | ${dut_to_tg_if1} | resolve_attempts=${NONE} | multipath=${TRUE}
+| | Then Send packets and verify multipath routing | ${tg_node}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1} | ${test_src_ip} | ${test_dst_ip}
+| | ... | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${neighbor_1_mac} | ${neighbor_2_mac}
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4proxyarp-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4proxyarp-func.robot
new file mode 100644
index 0000000000..8097526ccf
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4proxyarp-func.robot
@@ -0,0 +1,156 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.ProxyArp
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *RFC1027 Proxy ARP test cases*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1 2-node topology with
+| ... | single link between nodes.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with Proxy ARP
+| ... | *[Ver] TG verification:* Test ARP Request packet is sent
+| ... | from TG on link to DUT1; on receive TG verifies ARP reply packet
+| ... | for correctness and their IPv4 src-addr, dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC1027.
+
+*** Variables ***
+| ${tg_to_dut1_ip}= | 10.0.0.100
+| ${dut1_to_tg_ip}= | 10.0.0.1
+| ${prefix_length}= | 24
+| ${lo_ip4_addr}= | 192.168.1.2
+| ${hi_ip4_addr}= | 192.168.1.10
+| ${pass_test_ip}= | 192.168.1.5
+| ${pass_test_lo_ip}= | 192.168.1.2
+| ${pass_test_hi_ip}= | 192.168.1.10
+| ${fail_test_lo_ip}= | 192.168.1.1
+| ${fail_test_hi_ip}= | 192.168.1.11
+
+*** Test Cases ***
+| TC01: DUT sends ARP reply on behalf of another machine from the IP range
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC1027.
+| | ... | [Cfg] On DUT1 configure interface IPv4 address and proxy ARP
+| | ... | for IP range.
+| | ... | [Ver] Make TG send ARP request to DUT1 interface,
+| | ... | verify if DUT1 sends correct ARP reply on behalf of machine which
+| | ... | IP is in range.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${dut1_to_tg_name}= | Get interface name | ${dut1_node} | ${dut1_to_tg}
+| | ${tg_to_dut1_name}= | Get interface name | ${tg_node} | ${tg_to_dut1}
+| | When Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Add Proxy ARP | ${dut1_node} | ${lo_ip4_addr} | ${hi_ip4_addr}
+| | And Vpp Proxy ARP Interface Enable | ${dut1_node} | ${dut1_to_tg_name}
+| | Then Send ARP Request | ${tg_node} | ${tg_to_dut1_name}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut1_ip} | ${pass_test_ip}
+
+| TC02: DUT sends ARP reply on behalf of another machine from beginning of the IP range
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC1027.
+| | ... | [Cfg] On DUT1 configure interface IPv4 address and proxy ARP
+| | ... | for IP range.
+| | ... | [Ver] Make TG send ARP request to DUT1 interface,
+| | ... | verify if DUT1 sends correct ARP reply on behalf of machine which
+| | ... | IP is from beginning of the IP range.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${dut1_to_tg_name}= | Get interface name | ${dut1_node} | ${dut1_to_tg}
+| | ${tg_to_dut1_name}= | Get interface name | ${tg_node} | ${tg_to_dut1}
+| | When Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Add Proxy ARP | ${dut1_node} | ${lo_ip4_addr} | ${hi_ip4_addr}
+| | And Vpp Proxy ARP Interface Enable | ${dut1_node} | ${dut1_to_tg_name}
+| | Then Send ARP Request | ${tg_node} | ${tg_to_dut1_name}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut1_ip} | ${pass_test_lo_ip}
+
+| TC03: DUT sends ARP reply on behalf of another machine from end of the IP range
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC1027.
+| | ... | [Cfg] On DUT1 configure interface IPv4 address and proxy ARP
+| | ... | for IP range.
+| | ... | [Ver] Make TG send ARP request to DUT1 interface,
+| | ... | verify if DUT1 sends correct ARP reply on behalf of machine which
+| | ... | IP is from end of the IP range.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${dut1_to_tg_name}= | Get interface name | ${dut1_node} | ${dut1_to_tg}
+| | ${tg_to_dut1_name}= | Get interface name | ${tg_node} | ${tg_to_dut1}
+| | When Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Add Proxy ARP | ${dut1_node} | ${lo_ip4_addr} | ${hi_ip4_addr}
+| | And Vpp Proxy ARP Interface Enable | ${dut1_node} | ${dut1_to_tg_name}
+| | Then Send ARP Request | ${tg_node} | ${tg_to_dut1_name}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut1_ip} | ${pass_test_hi_ip}
+
+| TC04: DUT does not send ARP reply on behalf of another machine from below of the IP range
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC1027.
+| | ... | [Cfg] On DUT1 configure interface IPv4 address and proxy ARP
+| | ... | for IP range.
+| | ... | [Ver] Make TG send ARP request to DUT1 interface,
+| | ... | verify if DUT1 does not send ARP reply on behalf of machine which
+| | ... | IP is from below of the IP range.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${dut1_to_tg_name}= | Get interface name | ${dut1_node} | ${dut1_to_tg}
+| | ${tg_to_dut1_name}= | Get interface name | ${tg_node} | ${tg_to_dut1}
+| | When Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Add Proxy ARP | ${dut1_node} | ${lo_ip4_addr} | ${hi_ip4_addr}
+| | And Vpp Proxy ARP Interface Enable | ${dut1_node} | ${dut1_to_tg_name}
+| | Then ARP request should fail | ${tg_node} | ${tg_to_dut1_name}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut1_ip} | ${fail_test_lo_ip}
+
+| TC05: DUT does not send ARP reply on behalf of another machine from above of the IP range
+| | [Documentation]
+| | ... | [Top] TG-DUT1.
+| | ... | [Ref] RFC1027.
+| | ... | [Cfg] On DUT1 configure interface IPv4 address and proxy ARP
+| | ... | for IP range.
+| | ... | [Ver] Make TG send ARP request to DUT1 interface,
+| | ... | verify if DUT1 does not send ARP reply on behalf of machine which
+| | ... | IP is from above of the IP range.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${dut1_to_tg_name}= | Get interface name | ${dut1_node} | ${dut1_to_tg}
+| | ${tg_to_dut1_name}= | Get interface name | ${tg_node} | ${tg_to_dut1}
+| | When Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Add Proxy ARP | ${dut1_node} | ${lo_ip4_addr} | ${hi_ip4_addr}
+| | And Vpp Proxy ARP Interface Enable | ${dut1_node} | ${dut1_to_tg_name}
+| | Then ARP request should fail | ${tg_node} | ${tg_to_dut1_name}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut1_ip} | ${fail_test_hi_ip}
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ipolicemarkbase-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ipolicemarkbase-func.robot
new file mode 100644
index 0000000000..60e480c287
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ipolicemarkbase-func.robot
@@ -0,0 +1,162 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Force Tags | 3_NODE_DOUBLE_LINK_TOPO | VM_ENV | HW_ENV
+| Resource | resources/libraries/robot/features/policer.robot
+| Library | resources.libraries.python.Trace
+| Test Setup | Run Keywords | Set up functional test
+| ... | AND | Configure topology for IPv4 policer test
+| Test Teardown | Tear down functional test
+| Documentation | *IPv4 policer test cases*
+| ...
+| ... | *[Top] Network topologies:* TG=DUT1 2-node topology with two links\
+| ... | between nodes.
+| ... | *[Cfg] DUT configuration:* On DUT1 configure interfaces IPv4 adresses,\
+| ... | and static ARP record on the second interface.
+| ... | *[Ver] TG verification:* Test packet is sent from TG on the first link\
+| ... | to DUT1. Packet is received on TG on the second link from DUT1.
+| ... | *[Ref] Applicable standard specifications:* RFC2474, RFC2697, RFC2698.
+
+*** Variables ***
+| ${tg_to_dut_if1_ip4}= | 192.168.122.2
+| ${tg_to_dut_if2_ip4}= | 192.168.123.2
+| ${dut_to_tg_if1_ip4}= | 192.168.122.1
+| ${dut_to_tg_if2_ip4}= | 192.168.123.1
+| ${ip4_plen}= | ${24}
+
+| ${cir}= | ${100}
+| ${eir}= | ${150}
+| ${cb}= | ${200}
+| ${eb}= | ${300}
+
+*** Test Cases ***
+| TC01: VPP policer 2R3C Color-aware marks packet
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Ref] RFC2474, RFC2698.
+| | ... | [Cfg] On DUT1 configure 2R3C color-aware policer on the first\
+| | ... | interface.
+| | ... | [Ver] TG sends IPv4 TCP packet on the first link to DUT1.\
+| | ... | On DUT1 packet is marked with DSCP tag. Verify if DUT1 sends\
+| | ... | correct IPv4 TCP packet with correct DSCP on the second link to TG.
+| | ${dscp}= | DSCP AF22
+| | Given Policer Set Name | policer1
+| | And Policer Set Node | ${dut_node}
+| | And Policer Set CIR | ${cir}
+| | And Policer Set EIR | ${eir}
+| | And Policer Set CB | ${cb}
+| | And Policer Set EB | ${eb}
+| | And Policer Set Rate Type pps
+| | And Policer Set Round Type Closest
+| | And Policer Set Type 2R3C 2698
+| | And Policer Set Conform Action Transmit
+| | And Policer Set Exceed Action Mark and Transmit | ${dscp}
+| | And Policer Set Violate Action Drop
+| | And Policer Enable Color Aware
+| | And Policer Classify Set Precolor Exceed
+| | And Policer Classify Set Interface | ${dut_to_tg_if1}
+| | And Policer Classify Set Match IP | ${tg_to_dut_if1_ip}
+| | When Policer Set Configuration
+| | Then Send packet and verify marking | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if2_ip} | ${dscp}
+
+| TC02: VPP policer 2R3C Color-blind marks packet
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Ref] RFC2474, RFC2698.
+| | ... | [Cfg] On DUT1 configure 2R3C color-blind policer on the first\
+| | ... | interface.
+| | ... | [Ver] TG sends IPv4 TCP packet on the first link to DUT1.\
+| | ... | On DUT1 packet is marked with DSCP tag. Verify if DUT1 sends\
+| | ... | correct IPv4 TCP packet with correct DSCP on the second link to TG.
+| | ${dscp}= | DSCP AF22
+| | Given Policer Set Name | policer1
+| | And Policer Set Node | ${dut_node}
+| | And Policer Set CIR | ${cir}
+| | And Policer Set EIR | ${eir}
+| | And Policer Set CB | ${cb}
+| | And Policer Set EB | ${eb}
+| | And Policer Set Rate Type pps
+| | And Policer Set Round Type Closest
+| | And Policer Set Type 2R3C 2698
+| | And Policer Set Conform Action Mark and Transmit | ${dscp}
+| | And Policer Set Exceed Action Transmit
+| | And Policer Set Violate Action Drop
+| | And Policer Classify Set Precolor Conform
+| | And Policer Classify Set Interface | ${dut_to_tg_if1}
+| | And Policer Classify Set Match IP | ${tg_to_dut_if1_ip}
+| | When Policer Set Configuration
+| | Then Send packet and verify marking | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if2_ip} | ${dscp}
+
+| TC03: VPP policer 1R3C Color-aware marks packet
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Ref] RFC2474, RFC2697.
+| | ... | [Cfg] On DUT1 configure 1R3C color-aware policer on the first\
+| | ... | interface.
+| | ... | [Ver] TG sends IPv4 TCP packet on the first link to DUT1.\
+| | ... | On DUT1 packet is marked with DSCP tag. Verify if DUT1 sends\
+| | ... | correct IPv4 TCP packet with correct DSCP on the second link to TG.
+| | ${dscp}= | DSCP AF22
+| | Given Policer Set Name | policer1
+| | And Policer Set Node | ${dut_node}
+| | And Policer Set CIR | ${1}
+| | And Policer Set CB | ${2}
+| | And Policer Set EB | ${eb}
+| | And Policer Set Rate Type pps
+| | And Policer Set Round Type Closest
+| | And Policer Set Type 1R3C
+| | And Policer Set Conform Action Transmit
+| | And Policer Set Exceed Action Mark and Transmit | ${dscp}
+| | And Policer Set Violate Action Drop
+| | And Policer Enable Color Aware
+| | And Policer Classify Set Precolor Exceed
+| | And Policer Classify Set Interface | ${dut_to_tg_if1}
+| | And Policer Classify Set Match IP | ${tg_to_dut_if1_ip}
+| | When Policer Set Configuration
+| | Then Send packet and verify marking | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if2_ip} | ${dscp}
+
+| TC04: VPP policer 1R3C Color-blind marks packet
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Ref] RFC2474, RFC2697.
+| | ... | [Cfg] On DUT1 configure 1R3C color-blind policer on the first\
+| | ... | interface.
+| | ... | [Ver] TG sends IPv4 TCP packet on the first link to DUT1.\
+| | ... | On DUT1 packet is marked with DSCP tag. Verify if DUT1 sends\
+| | ... | correct IPv4 TCP packet with correct DSCP on the second link to TG.
+| | ${dscp}= | DSCP AF22
+| | Given Policer Set Name | policer1
+| | And Policer Set Node | ${dut_node}
+| | And Policer Set CIR | ${cir}
+| | And Policer Set CB | ${cb}
+| | And Policer Set EB | ${eb}
+| | And Policer Set Rate Type pps
+| | And Policer Set Round Type Closest
+| | And Policer Set Type 1R3C
+| | And Policer Set Conform Action Mark and Transmit | ${dscp}
+| | And Policer Set Exceed Action Transmit
+| | And Policer Set Violate Action Drop
+| | And Policer Classify Set Precolor Conform
+| | And Policer Classify Set Interface | ${dut_to_tg_if1}
+| | And Policer Classify Set Match IP | ${tg_to_dut_if1_ip}
+| | When Policer Set Configuration
+| | Then Send packet and verify marking | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if2_ip} | ${dscp} \ No newline at end of file
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-rpf-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-rpf-func.robot
new file mode 100644
index 0000000000..71246c2c57
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-rpf-func.robot
@@ -0,0 +1,134 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/counters.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *Source RPF check on IPv4 test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG - DUT1 - DUT2 - TG
+| ... | with one link between the nodes.
+| ... | *[Cfg] DUT configuration:* DUT2 is configured with L2 Cross connect.
+| ... | DUT1 is configured with IP source check on link to TG,
+| ... | *[Ver] TG verification:* Test ICMP Echo Request packets are sent
+| ... | in one direction by TG on link to DUT1 and received on TG link
+| ... | to DUT2. On receive TG verifies if packets which source address
+| ... | is not in routes are dropped.
+
+*** Variables ***
+| ${dut1_to_tg_ip}= | 192.168.1.1
+| ${dut1_to_tg_ip_GW}= | 192.168.1.2
+| ${dut1_to_dut2_ip}= | 192.168.2.1
+| ${dut1_to_dut2_ip_GW}= | 192.168.2.2
+| ${test_dst_ip}= | 32.0.0.1
+| ${pass_test_src_ip}= | 16.0.0.1
+| ${drop_test_src_ip}= | 24.0.0.1
+| ${prefix_length}= | 24
+
+*** Test Cases ***
+| TC01: VPP source RPF check on IPv4 src-addr
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG
+| | ... | [Cfg] On DUT1 setup IP source check.
+| | ... | [Ver] Make TG verify matching packets which source address
+| | ... | is not in routes are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2} | resolve_attempts=${NONE}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip_GW}
+| | ... | ${tg_to_dut1_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${pass_test_src_ip} | ${prefix_length}
+| | ... | ${dut1_to_tg_ip_GW} | ${dut1_to_tg} | resolve_attempts=${NONE}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${pass_test_src_ip} | ${test_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${drop_test_src_ip} | ${test_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | ${dut1_to_tg_name}= | Get Interface Name | ${dut1_node} | ${dut1_to_tg}
+| | When VPP IP Source Check Setup | ${dut1_node} | ${dut1_to_tg_name}
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${pass_test_src_ip} | ${test_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${dut1_to_tg_ip_GW} | ${test_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Packet transmission from port to port should fail | ${tg_node}
+| | ... | ${drop_test_src_ip} | ${test_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+
+| TC02: VPP pass traffic on non-enabled RPF interface
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG
+| | ... | [Cfg] On DUT1 setup IP source check.
+| | ... | [Ver] Make TG verify matching packets on non-enabled RPF interface
+| | ... | are passed.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2} | resolve_attempts=${NONE}
+| | And Add Arp On Dut
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip_GW}
+| | ... | ${tg_to_dut1_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${pass_test_src_ip} | ${prefix_length}
+| | ... | ${dut1_to_tg_ip_GW} | ${dut1_to_tg} | resolve_attempts=${NONE}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | ${dut1_to_tg_name}= | Get Interface Name | ${dut1_node} | ${dut1_to_tg}
+| | When VPP IP Source Check Setup | ${dut1_node} | ${dut1_to_tg_name}
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${test_dst_ip} | ${pass_test_src_ip} | ${tg_to_dut2}
+| | ... | ${tg_to_dut2_mac} | ${dut1_to_dut2_mac} | ${tg_to_dut1}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${test_dst_ip} | ${dut1_to_tg_ip_GW} | ${tg_to_dut2}
+| | ... | ${tg_to_dut2_mac} | ${dut1_to_dut2_mac} | ${tg_to_dut1}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4basevrf-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4basevrf-func.robot
new file mode 100644
index 0000000000..b520d4df6c
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4basevrf-func.robot
@@ -0,0 +1,391 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *Vpn routed forwarding - baseline IPv4*
+| ... | *[Top] Network Topologies:* TG=DUT1=DUT2=TG 3-node topology with two
+| ... | links in between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of
+| ... | IPv4.
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with two VRF tables;
+| ... | Separation of traffic is tested by IP packets; Basic ARP and ROUTES are
+| ... | set on DUT nodes; IP addresses are set on DUT interfaces.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets
+| ... | are sent by TG on link to DUT1, DUT2 or back to TG; On receipt TG
+| ... | verifies packets for correctness and their IPv4 src-addr, dst-addr,
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${fib_table_1}= | 9
+| ${fib_table_2}= | 99
+
+| ${dut1_to_tg_ip1}= | 10.0.0.3
+| ${dut1_to_tg_ip2}= | 10.0.0.4
+| ${dut2_to_tg_ip1}= | 30.0.0.3
+| ${dut2_to_tg_ip2}= | 30.0.0.4
+
+| ${dut1_to_dut2_ip1}= | 20.0.0.1
+| ${dut1_to_dut2_ip2}= | 20.0.0.2
+| ${dut2_to_dut1_ip1}= | 20.0.0.3
+| ${dut2_to_dut1_ip2}= | 20.0.0.4
+
+| ${tg_dut1_ip1}= | 10.0.0.1
+| ${tg_dut1_ip2}= | 10.0.0.2
+| ${tg_dut2_ip1}= | 30.0.0.1
+| ${tg_dut2_ip2}= | 30.0.0.2
+
+| ${ip_prefix}= | 24
+
+*** Test Cases ***
+| TC01: TG packets routed to DUT ingress interface, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. On every ingress
+| | ... | and egress port on DUT is configured ARP and each DUT is configured
+| | ... | with one route.
+| | ... | [Ver] Packet is send from TG->DUT1-if1 to DUT1->TG-if1 and from
+| | ... | TG->DUT1-if2 to DUT1->TG-if2 and checked if arrived.
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Send ICMP echo request and verify answer | ${tg_node}
+| | ... | ${tg_to_dut1_if1} | ${dut1_to_tg_if1_mac}
+| | ... | ${tg_to_dut1_if1_mac} | ${dut1_to_tg_ip1} | ${tg_dut1_ip1} | 5
+| | And Send ICMP echo request and verify answer | ${tg_node}
+| | ... | ${tg_to_dut1_if2} | ${dut1_to_tg_if2_mac}
+| | ... | ${tg_to_dut1_if2_mac} | ${dut1_to_tg_ip2} | ${tg_dut1_ip2} | 5
+
+| TC02: TG packets routed to DUT egress interface, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. On every ingress
+| | ... | and egress port on DUT is configured ARP and each DUT is configured
+| | ... | with one route.
+| | ... | [Ver] Packet is send from TG->DUT1-if1 to DUT1->DUT2-if1 and from
+| | ... | TG->DUT1-if2 to DUT1->DUT2-if2 and checked if arrived.
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut1_to_dut2_ip1} | ${tg_dut1_ip1} | 5
+| | And Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if2}
+| | ... | ${dut1_to_tg_if2_mac} | ${tg_to_dut1_if2_mac}
+| | ... | ${dut1_to_dut2_ip2} | ${tg_dut1_ip2} | 5
+
+| TC03: TG packets routed to DUT2 ingress interface through DUT1, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. On every ingress
+| | ... | and egress port on DUT is configured ARP and each DUT is configured
+| | ... | with one route.
+| | ... | [Ver] Packet is send from TG->DUT1-if1 to DUT2->DUT1-if1 and from
+| | ... | TG->DUT1-if2 to DUT2->DUT1-if2 and checked if arrived.
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut2_to_dut1_ip1} | ${tg_dut1_ip1} | 5
+| | And Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if2}
+| | ... | ${dut1_to_tg_if2_mac} | ${tg_to_dut1_if2_mac}
+| | ... | ${dut2_to_dut1_ip2} | ${tg_dut1_ip2} | 5
+
+| TC04: TG packets routed to DUT2 egress interface through DUT1, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. On every ingress
+| | ... | and egress port on DUT is configured ARP and each DUT is configured
+| | ... | with one route.
+| | ... | [Ver] Packet is send from TG->DUT1-if1 to DUT2->TG-if1 and from
+| | ... | TG->DUT1-if2 to DUT2->TG-if2 and checked if arrived.
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut2_to_tg_ip1} | ${tg_dut1_ip1} | 5
+| | And Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if2}
+| | ... | ${dut1_to_tg_if2_mac} | ${tg_to_dut1_if2_mac}
+| | ... | ${dut2_to_tg_ip2} | ${tg_dut1_ip2} | 5
+
+| TC05: TG packets routed to TG through DUT1 and DUT2, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. On every ingress
+| | ... | and egress port on DUT is configured ARP and each DUT is configured
+| | ... | with one route.
+| | ... | [Ver] Packet is send from TG->DUT1-if1 to TG->DUT2-if1 and from
+| | ... | TG->DUT1-if2 to TG->DUT2-if2 and checked if arrived.
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Send packet and verify headers | ${tg_node} | ${tg_dut1_ip1}
+| | ... | ${tg_dut2_ip1} | ${tg_to_dut1_if1} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut2_if1} | ${dut2_to_tg_if1_mac}
+| | ... | ${tg_to_dut2_if1_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${tg_dut1_ip2} | ${tg_dut2_ip2} | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut1_if2_mac} | ${dut1_to_tg_if2_mac} | ${tg_to_dut2_if2}
+| | ... | ${dut2_to_tg_if2_mac} | ${tg_to_dut2_if2_mac}
+
+| TC06: TG packets not routed to DUT ingress interface in different VRF, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. On every ingress
+| | ... | and egress port on DUT is configured ARP and each DUT is configured
+| | ... | with one route.
+| | ... | [Ver] Packet is send from TG->DUT1-if1 to DUT1->TG-if2 where it
+| | ... | should not arrive.
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut1_to_tg_ip2} | ${tg_dut1_ip1} | 5
+
+| TC07: TG packets not routed to DUT egress interface in different VRF, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. On every ingress
+| | ... | and egress port on DUT is configured ARP and each DUT is configured
+| | ... | with one route.
+| | ... | [Ver] Packet is send from TG->DUT1-if1 to DUT1->DUT2-if2 where it
+| | ... | should not arrive.
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut1_to_dut2_ip2} | ${tg_dut1_ip1} | 5
+
+| TC08: TG packets not routed to DUT2 ingress interface in different VRF through DUT1, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. On every ingress
+| | ... | and egress port on DUT is configured ARP and each DUT is configured
+| | ... | with one route.
+| | ... | [Ver] Packet is send from TG->DUT1-if1 to DUT2->DUT1-if2 where it
+| | ... | should not arrive.
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut2_to_dut1_ip2} | ${tg_dut1_ip1} | 5
+
+| TC09: TG packets not routed to DUT2 egress interface in different VRF through DUT1, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. On every ingress
+| | ... | and egress port on DUT is configured ARP and each DUT is configured
+| | ... | with one route.
+| | ... | [Ver] Packet is send from TG->DUT1-if1 to DUT2->TG-if2 where it
+| | ... | should not arrive.
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut2_to_tg_ip2} | ${tg_dut1_ip1} | 5
+
+| TC10: TG packets not routed to TG in different VRF through DUT1 and DUT2, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG.
+| | ... | [Enc] Eth-IPv4-ICMPv4.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. On every ingress
+| | ... | and egress port on DUT is configured ARP and each DUT is configured
+| | ... | with one route.
+| | ... | [Ver] Packet is send from TG->DUT1-if1 to TG->DUT2-if2 where it
+| | ... | should not arrive.
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send packet and verify headers | ${tg_node} | ${tg_dut1_ip1}
+| | ... | ${tg_dut2_ip2} | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut1_if1_mac} | ${dut1_to_tg_if1_mac} | ${tg_to_dut2_if2}
+| | ... | ${dut2_to_tg_if2_mac} | ${tg_to_dut2_if2_mac}
+
+*** Keywords ***
+| Setup Env - 2xVRF Each Node
+| | [Documentation]
+| | ... | Environment is set up with 2 fib tables on each DUT. DUT1-TG-IF1 and \
+| | ... | DUT1-DUT2-IF1 are assigned to FIB1, and DUT1-TG-IF2 and DUT1-DUT2-IF2
+| | ... | are assigned to FIB2 (the some done on DUT2, just opposite). IP
+| | ... | addresses are subsequently set on interfaces, and ARP is set for
+| | ... | neighbors. The last setting is route for each fib table.
+| | ...
+| | ${dut1_if1_idx}= | Get Interface SW Index
+| | ... | ${dut1_node} | ${dut1_to_dut2_if1}
+| | ${dut1_if2_idx}= | Get Interface SW Index
+| | ... | ${dut1_node} | ${dut1_to_dut2_if2}
+| | ${dut2_if1_idx}= | Get Interface SW Index
+| | ... | ${dut2_node} | ${dut2_to_dut1_if1}
+| | ${dut2_if2_idx}= | Get Interface SW Index
+| | ... | ${dut2_node} | ${dut2_to_dut1_if2}
+| | And Add fib table | ${dut1_node}
+| | ... | ${tg_dut2_ip1} | ${ip_prefix} | ${fib_table_1}
+| | ... | via ${dut2_to_dut1_ip1} sw_if_index ${dut1_if1_idx} multipath
+| | And Add fib table | ${dut1_node}
+| | ... | ${tg_dut2_ip2} | ${ip_prefix} | ${fib_table_2}
+| | ... | via ${dut1_to_dut2_ip2} sw_if_index ${dut1_if2_idx} multipath
+| | And Add fib table | ${dut2_node}
+| | ... | ${tg_dut1_ip1} | ${ip_prefix} | ${fib_table_1}
+| | ... | via ${dut2_to_dut1_ip1} sw_if_index ${dut2_if1_idx} multipath
+| | And Add fib table | ${dut2_node}
+| | ... | ${tg_dut1_ip2} | ${ip_prefix} | ${fib_table_2}
+| | ... | via ${dut2_to_dut1_ip2} sw_if_index ${dut2_if2_idx} multipath
+
+| | Assign Interface To Fib Table
+| | ... | ${dut1_node} | ${dut1_to_dut2_if1} | ${fib_table_1}
+| | Assign Interface To Fib Table
+| | ... | ${dut1_node} | ${dut1_to_dut2_if2} | ${fib_table_2}
+| | Assign Interface To Fib Table
+| | ... | ${dut1_node} | ${dut1_to_tg_if1} | ${fib_table_1}
+| | Assign Interface To Fib Table
+| | ... | ${dut1_node} | ${dut1_to_tg_if2} | ${fib_table_2}
+
+| | Assign Interface To Fib Table
+| | ... | ${dut2_node} | ${dut2_to_dut1_if1} | ${fib_table_1}
+| | Assign Interface To Fib Table
+| | ... | ${dut2_node} | ${dut2_to_dut1_if2} | ${fib_table_2}
+| | Assign Interface To Fib Table
+| | ... | ${dut2_node} | ${dut2_to_tg_if1} | ${fib_table_1}
+| | Assign Interface To Fib Table
+| | ... | ${dut2_node} | ${dut2_to_tg_if2} | ${fib_table_2}
+
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_tg_if1} | ${dut1_to_tg_ip1} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_tg_if2} | ${dut1_to_tg_ip2} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_dut2_if1}
+| | ... | ${dut1_to_dut2_ip1} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_dut2_if2}
+| | ... | ${dut1_to_dut2_ip2} | ${ip_prefix}
+
+| | And Set Interface Address
+| | ... | ${dut2_node} | ${dut2_to_tg_if1} | ${dut2_to_tg_ip1} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut2_node} | ${dut2_to_tg_if2} | ${dut2_to_tg_ip2} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut2_node} | ${dut2_to_dut1_if1}
+| | ... | ${dut2_to_dut1_ip1} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut2_node} | ${dut2_to_dut1_if2}
+| | ... | ${dut2_to_dut1_ip2} | ${ip_prefix}
+
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_tg_if1}
+| | ... | ${tg_dut1_ip1} | ${tg_to_dut1_if1_mac}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_dut2_if1}
+| | ... | ${dut2_to_dut1_ip1} | ${dut2_to_dut1_if1_mac}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_tg_if1}
+| | ... | ${tg_dut2_ip1} | ${tg_to_dut2_if1_mac}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_dut1_if1}
+| | ... | ${dut1_to_dut2_ip1} | ${dut1_to_dut2_if1_mac}
+
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_tg_if2}
+| | ... | ${tg_dut1_ip2} | ${tg_to_dut1_if2_mac}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_dut2_if2}
+| | ... | ${dut2_to_dut1_ip2} | ${dut2_to_dut1_if2_mac}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_tg_if2}
+| | ... | ${tg_dut2_ip2} | ${tg_to_dut2_if2_mac}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_dut1_if2}
+| | ... | ${dut1_to_dut2_ip2} | ${dut1_to_dut2_if2_mac}
+
+| | And Vpp Route Add | ${dut1_node} | ${tg_dut2_ip1} | ${ip_prefix}
+| | ... | ${dut2_to_dut1_ip1} | ${dut1_to_dut2_if1} | vrf=${fib_table_1}
+| | And Vpp Route Add | ${dut2_node} | ${tg_dut1_ip1} | ${ip_prefix}
+| | ... | ${dut1_to_dut2_ip1} | ${dut2_to_dut1_if1} | vrf=${fib_table_1}
+
+| | And Vpp Route Add | ${dut1_node} | ${tg_dut2_ip2} | ${ip_prefix}
+| | ... | ${dut2_to_dut1_ip2} | ${dut1_to_dut2_if2} | vrf=${fib_table_2}
+| | And Vpp Route Add | ${dut2_node} | ${tg_dut1_ip2} | ${ip_prefix}
+| | ... | ${dut1_to_dut2_ip2} | ${dut2_to_dut1_if2} | vrf=${fib_table_2}
diff --git a/tests/vpp/func/ip4_tunnels/gre/eth2p-ethip4gre-ip4base-func.robot b/tests/vpp/func/ip4_tunnels/gre/eth2p-ethip4gre-ip4base-func.robot
new file mode 100644
index 0000000000..a4e7dbbbb0
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/gre/eth2p-ethip4gre-ip4base-func.robot
@@ -0,0 +1,306 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/overlay/gre.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.Trace
+| Force Tags | VM_ENV | HW_ENV | 3_NODE_DOUBLE_LINK_TOPO | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *GREoIPv4 test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG=DUT1 2-node topology with two links
+| ... | between nodes; TG-DUT1-DUT2-TG 3-node circular topology with single
+| ... | links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-GRE-IPv4-ICMPv4 on DUT1-DUT2,
+| ... | Eth-IPv4-ICMPv4 on TG-DUTn for routing over GRE tunnel; Eth-IPv4-ICMPv4
+| ... | on TG_if1-DUT, Eth-IPv4-GRE-IPv4-ICMPv4 on TG_if2_DUT for GREoIPv4
+| ... | encapsulation and decapsulation verification.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4 routing
+| ... | and static routes. GREoIPv4 tunnel is configured between DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 (or ICMPv6) Echo Request packets are
+| ... | sent in both directions by TG on links to DUT1 and DUT2; GREoIPv4
+| ... | encapsulation and decapsulation are verified separately by TG; on
+| ... | receive TG verifies packets for correctness and their IPv4 (IPv6)
+| ... | src-addr, dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC2784.
+
+*** Variables ***
+| ${net1_address}= | 192.168.0.0
+| ${net1_host_address}= | 192.168.0.100
+| ${net1_gw_address}= | 192.168.0.1
+| ${net2_address}= | 192.168.2.0
+| ${net2_host_address}= | 192.168.2.100
+| ${net3_address}= | 192.168.3.0
+| ${net3_host_address}= | 192.168.3.100
+| ${net2_gw_address}= | 192.168.2.1
+| ${dut1_ip_address}= | 192.168.1.1
+| ${dut2_ip_address}= | 192.168.1.2
+| ${dut1_gre_ip}= | 172.16.0.1
+| ${dut2_gre_ip}= | 172.16.0.2
+| ${dut_tun0_ip1}= | 172.16.0.1
+| ${dut_tun0_ip2}= | 172.16.0.2
+| ${dut_tun1_ip1}= | 172.16.1.1
+| ${dut_tun1_ip2}= | 172.16.1.2
+| ${dut1_lo_address}= | 10.0.0.1
+| ${tun0_dst}= | 10.0.0.2
+| ${tun1_dst}= | 10.0.0.3
+| ${prefix}= | 24
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route over GREoIPv4 tunnel between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-GRE-IPv4-ICMPv4 on \
+| | ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn. [Cfg] On DUT1 and DUT2
+| | ... | configure GREoIPv4 tunnel with IPv4 routes towards each other.
+| | ... | [Ver] Make TG send ICMPv4 Echo Req between its interfaces across
+| | ... | both DUTs and GRE tunnel between them; verify IPv4 headers on
+| | ... | received packets are correct. [Ref] RFC2784.
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path in 3-node circular topology | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_ip_address} | ${prefix}
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${net1_gw_address} | ${prefix}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_ip_address} | ${prefix}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${net2_gw_address} | ${prefix}
+| | And VPP IP Probe | ${dut1_node} | ${dut1_to_dut2} | ${dut2_ip_address}
+| | And VPP IP Probe | ${dut2_node} | ${dut2_to_dut1} | ${dut1_ip_address}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_tg} | ${net2_host_address}
+| | ... | ${tg_to_dut2_mac}
+| | ${dut1_gre_interface} | ${dut1_gre_index}=
+| | ... | When Create GRE tunnel interface and set it up
+| | ... | ${dut1_node} | ${dut1_ip_address} | ${dut2_ip_address}
+| | ${dut2_gre_interface} | ${dut2_gre_index}=
+| | ... | And Create GRE tunnel interface and set it up
+| | ... | ${dut2_node} | ${dut2_ip_address} | ${dut1_ip_address}
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_gre_index} | ${dut1_gre_ip} | ${prefix}
+| | ... | ${dut2_node} | ${dut2_gre_index} | ${dut2_gre_ip} | ${prefix}
+| | And Vpp Route Add | ${dut1_node} | ${net2_address} | ${prefix}
+| | ... | ${dut2_gre_ip} | ${dut1_gre_index}
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${net1_host_address} | ${net2_host_address}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+
+| TC02: DUT encapsulates IPv4 into GREoIPv4 tunnel - GRE header verification
+| | [Documentation]
+| | ... | [Top] TG=DUT1. [Enc] Eth-IPv4-ICMPv4 on TG_if1-DUT, \
+| | ... | Eth-IPv4-GRE-IPv4-ICMPv4 on TG_if2_DUT. [Cfg] On DUT1 configure
+| | ... | GREoIPv4 tunnel with IPv4 route towards TG. [Ver] Make TG send
+| | ... | non-encapsulated ICMPv4 Echo Req to DUT; verify TG received
+| | ... | GREoIPv4 encapsulated packet is correct. [Ref] RFC2784.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut1_ip_address} | ${prefix}
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${net1_gw_address} | ${prefix}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if2} | ${dut2_ip_address}
+| | ... | ${tg_to_dut_if2_mac}
+| | ${dut1_gre_interface} | ${dut1_gre_index}=
+| | ... | When Create GRE tunnel interface and set it up
+| | ... | ${dut_node} | ${dut1_ip_address} | ${dut2_ip_address}
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut1_gre_index} | ${dut1_gre_ip} | ${prefix}
+| | And Vpp Route Add | ${dut_node} | ${net2_address} | ${prefix}
+| | ... | ${dut2_gre_ip} | ${dut1_gre_index}
+| | Then Send ICMPv4 and check received GRE header
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if1_mac} | ${tg_to_dut_if2_mac}
+| | ... | ${net1_host_address} | ${net2_host_address}
+| | ... | ${dut1_ip_address} | ${dut2_ip_address}
+
+| TC03: DUT decapsulates IPv4 from GREoIPv4 tunnel - IPv4 header verification
+| | [Documentation]
+| | ... | [Top] TG=DUT1. [Enc] Eth-IPv4-ICMPv4 on TG_if1-DUT, \
+| | ... | Eth-IPv4-GRE-IPv4-ICMPv4 on TG_if2_DUT. [Cfg] On DUT1 configure
+| | ... | GREoIPv4 tunnel towards TG. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | encapsulated into GREoIPv4 towards VPP; verify TG received IPv4
+| | ... | de-encapsulated packet is correct. [Ref] RFC2784.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut1_ip_address} | ${prefix}
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${net1_gw_address} | ${prefix}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if1} | ${net1_host_address}
+| | ... | ${tg_to_dut_if1_mac}
+| | ${dut1_gre_interface} | ${dut1_gre_index}=
+| | ... | When Create GRE tunnel interface and set it up
+| | ... | ${dut_node} | ${dut1_ip_address} | ${dut2_ip_address}
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut1_gre_index} | ${dut1_gre_ip} | ${prefix}
+| | Then Send GRE and check received ICMPv4 header
+| | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if1}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if1_mac}
+| | ... | ${net2_host_address} | ${net1_host_address}
+| | ... | ${dut2_ip_address} | ${dut1_ip_address}
+
+| TC04: DUT encapsulates IPv4 into GREoIPv4 different tunnels - GRE header verification
+| | [Documentation]
+| | ... | [Top] TG=DUT1. [Enc] Eth-IPv4-ICMPv4 on TG_if1-DUT, \
+| | ... | Eth-IPv4-GRE-IPv4-ICMPv4 on TG_if2_DUT. [Cfg] On DUT1 configure two
+| | ... | GRE tunnels with loopback's source address. Destination address of
+| | ... | tunnels are routed via next hop address of DUT's to TG if2, where
+| | ... | should be only GRE encapsulated packets. Each tunnel has IPv4 address
+| | ... | and configured prefix routed through the tunnel. [Ver] Make TG send
+| | ... | non-encapsulated ICMPv4 Echo Req to DUT; verify TG received GREoIPv4
+| | ... | encapsulated packet is correct for each tunnel. [Ref] RFC2784.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${dut1_lo_index}= | And VPP Create loopback | ${dut_node}
+| | And Set Interface State | ${dut_node} | ${dut1_lo_index} | up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut1_ip_address} | ${prefix}
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${net1_gw_address} | ${prefix}
+| | ... | ${dut_node} | ${dut1_lo_index} | ${dut1_lo_address} | ${32}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if2} | ${dut2_ip_address}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add | ${dut_node} | ${tun0_dst} | ${32}
+| | ... | ${dut2_ip_address} | ${dut_to_tg_if2}
+| | And Vpp Route Add | ${dut_node} | ${tun1_dst} | ${32}
+| | ... | ${dut2_ip_address} | ${dut_to_tg_if2}
+| | ${dut1_gre0_interface} | ${dut1_gre0_index}=
+| | ... | When Create GRE tunnel interface and set it up
+| | ... | ${dut_node} | ${dut1_lo_address} | ${tun0_dst}
+| | ${dut1_gre1_interface} | ${dut1_gre1_index}=
+| | ... | And Create GRE tunnel interface and set it up
+| | ... | ${dut_node} | ${dut1_lo_address} | ${tun1_dst}
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut1_gre0_index} | ${dut_tun0_ip1} | ${prefix}
+| | ... | ${dut_node} | ${dut1_gre1_index} | ${dut_tun1_ip1} | ${prefix}
+| | And Vpp Route Add | ${dut_node} | ${net2_address} | ${prefix}
+| | ... | ${dut_tun0_ip2} | ${dut1_gre0_index}
+| | And Vpp Route Add | ${dut_node} | ${net3_address} | ${prefix}
+| | ... | ${dut_tun1_ip2} | ${dut1_gre1_index}
+| | Then Send ICMPv4 and check received GRE header
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if1_mac} | ${tg_to_dut_if2_mac}
+| | ... | ${net1_host_address} | ${net2_host_address}
+| | ... | ${dut1_lo_address} | ${tun0_dst}
+| | And Send ICMPv4 and check received GRE header
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if1_mac} | ${tg_to_dut_if2_mac}
+| | ... | ${net1_host_address} | ${net3_host_address}
+| | ... | ${dut1_lo_address} | ${tun1_dst}
+
+| TC05: DUT re-encapsulates IPv4 GRE into other GRE tunnel - GRE header verification
+| | [Documentation]
+| | ... | [Top] TG=DUT1. [Enc] Eth-IPv4-ICMPv4 on TG_if1-DUT, \
+| | ... | Eth-IPv4-GRE-IPv4-ICMPv4 on TG_if2_DUT. [Cfg] On DUT1 configure two
+| | ... | GRE tunnels with loopback's source address. Destination address of
+| | ... | tunnels are routed via next hop address of DUT's to TG if2, where
+| | ... | should be only GRE encapsulated packets. Each tunnel has IPv4 address
+| | ... | and configured prefix routed through the tunnel. [Ver] Make TG send
+| | ... | encapsulated IPv4 UDP to DUT; Encapsulated IP source is behind
+| | ... | configured tunnel same as destination; verify TG received GREoIPv4
+| | ... | encapsulated packet is correct. [Ref] RFC2784.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${dut1_lo_index}= | And VPP Create loopback | ${dut_node}
+| | And Set Interface State | ${dut_node} | ${dut1_lo_index} | up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut1_ip_address} | ${prefix}
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${net1_gw_address} | ${prefix}
+| | ... | ${dut_node} | ${dut1_lo_index} | ${dut1_lo_address} | ${32}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if2} | ${dut2_ip_address}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add | ${dut_node} | ${tun0_dst} | ${32}
+| | ... | ${dut2_ip_address} | ${dut_to_tg_if2}
+| | And Vpp Route Add | ${dut_node} | ${tun1_dst} | ${32}
+| | ... | ${dut2_ip_address} | ${dut_to_tg_if2}
+| | ${dut1_gre0_interface} | ${dut1_gre0_index}=
+| | ... | When Create GRE tunnel interface and set it up
+| | ... | ${dut_node} | ${dut1_lo_address} | ${tun0_dst}
+| | ${dut1_gre1_interface} | ${dut1_gre1_index}=
+| | ... | And Create GRE tunnel interface and set it up
+| | ... | ${dut_node} | ${dut1_lo_address} | ${tun1_dst}
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut1_gre0_index} | ${dut_tun0_ip1} | ${prefix}
+| | ... | ${dut_node} | ${dut1_gre1_index} | ${dut_tun1_ip1} | ${prefix}
+| | And Vpp Route Add | ${dut_node} | ${net2_address} | ${prefix}
+| | ... | ${dut_tun0_ip2} | ${dut1_gre0_index}
+| | And Vpp Route Add | ${dut_node} | ${net3_address} | ${prefix}
+| | ... | ${dut_tun1_ip2} | ${dut1_gre1_index}
+| | Then Send GRE and check received GRE header
+| | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2_mac}
+| | ... | ${dut1_lo_address} | ${tun0_dst}
+| | ... | ${net3_host_address} | ${net2_host_address}
+| | ... | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac}
+| | ... | ${tun1_dst} | ${dut1_lo_address}
+
+| TC06: DUT do not process GRE with wrong tunnel destination IP
+| | [Documentation]
+| | ... | [Top] TG=DUT1. [Enc] Eth-IPv4-ICMPv4 on TG_if1-DUT, \
+| | ... | Eth-IPv4-GRE-IPv4-ICMPv4 on TG_if2_DUT. [Cfg] On DUT1 configure two
+| | ... | GRE tunnels with loopback's source address. Destination address of
+| | ... | tunnels are routed via next hop address of DUT's to TG if2, where
+| | ... | should be only GRE encapsulated packets. On DUT's to TG if1 interface
+| | ... | is configured test destination host MAC address. [Ver] Make TG send
+| | ... | GRE encapsulated ICMPv4 Echo Req to DUT; verify TG received
+| | ... | de-capsulated packet is correct, then send packet with wrong tunnel
+| | ... | destination address. [Ref] RFC2784.
+| | ... |
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${dut1_lo_index}= | And VPP Create loopback | ${dut_node}
+| | And Set Interface State | ${dut_node} | ${dut1_lo_index} | up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut1_ip_address} | ${prefix}
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${net1_gw_address} | ${prefix}
+| | ... | ${dut_node} | ${dut1_lo_index} | ${dut1_lo_address} | ${32}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if1} | ${net1_host_address}
+| | ... | ${tg_to_dut_if1_mac}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if2} | ${dut2_ip_address}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add | ${dut_node} | ${tun0_dst} | ${32}
+| | ... | ${dut2_ip_address} | ${dut_to_tg_if2}
+| | And Vpp Route Add | ${dut_node} | ${tun1_dst} | ${32}
+| | ... | ${dut2_ip_address} | ${dut_to_tg_if2}
+| | ${dut1_gre0_interface} | ${dut1_gre0_index}=
+| | ... | When Create GRE tunnel interface and set it up
+| | ... | ${dut_node} | ${dut1_lo_address} | ${tun0_dst}
+| | ${dut1_gre1_interface} | ${dut1_gre1_index}=
+| | ... | And Create GRE tunnel interface and set it up
+| | ... | ${dut_node} | ${dut1_lo_address} | ${tun1_dst}
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut1_gre0_index} | ${dut_tun0_ip1} | ${prefix}
+| | ... | ${dut_node} | ${dut1_gre1_index} | ${dut_tun1_ip1} | ${prefix}
+| | Then Send GRE and check received ICMPv4 header
+| | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if1}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if1_mac}
+| | ... | ${net2_host_address} | ${net1_host_address}
+| | ... | ${tun0_dst} | ${dut1_lo_address}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send GRE and check received ICMPv4 header |
+| | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if1}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if1_mac}
+| | ... | ${net2_host_address} | ${net1_host_address}
+| | ... | ${tun0_dst} | ${dut1_ip_address}
diff --git a/tests/vpp/func/ip4_tunnels/lisp/api-crud-lisp-func.robot b/tests/vpp/func/ip4_tunnels/lisp/api-crud-lisp-func.robot
new file mode 100644
index 0000000000..118d657515
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/lisp/api-crud-lisp-func.robot
@@ -0,0 +1,116 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.LispUtil
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/overlay/lisp_api.robot
+# import additional Lisp settings from resource file
+| Variables | resources/test_data/lisp/api/lisp_api_resources.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | 3_NODE_DOUBLE_LINK_TOPO
+| ... | VM_ENV | HW_ENV
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down functional test
+| ...
+| Documentation | *API test cases*
+| ...
+| ... | *[Top] Network Topologies:* DUT1 1-node topology.
+| ... | *[Enc] Packet Encapsulations:* None.
+| ... | *[Cfg] DUT configuration:* DUT1 gets configured with all LISP
+| ... | parameters.
+| ... | *[Ver] Verification:* DUT1 operational data gets verified following
+| ... | configuration.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Variables ***
+| ${locator_set_num}= | 3
+
+*** Test Cases ***
+
+| TC01: DUT can enable and disable LISP
+| | [Documentation]
+| | ... | [Top] DUT1. [Enc] None. [Cfg1] Test LISP enable/disable API; On \
+| | ... | DUT1 enable LISP. [Ver1] Check DUT1 if LISP is enabled. [Cfg2]
+| | ... | Then disable LISP. [Ver2] Check DUT1 if LISP is disabled. [Ref]
+| | ... | RFC6830.
+| | When Enable LISP | ${nodes['DUT1']}
+| | Then LISP should be enabled | ${nodes['DUT1']} | ${lisp_status}
+| | When Disable LISP | ${nodes['DUT1']}
+| | Then LISP Should be disabled | ${nodes['DUT1']} | ${lisp_status}
+
+| TC02: DUT can add and delete locator_set
+| | [Documentation]
+| | ... | [Top] DUT1. [Enc] None. [Cfg1] Test LISP locator_set API; on \
+| | ... | DUT1 configure locator_set and locator. [Ver1] Check DUT1
+| | ... | configured locator_set and locator are correct. [Cfg2] Then
+| | ... | remove locator_set and locator. [Ver2] check DUT1 locator_set
+| | ... | and locator are removed. [Ref] RFC6830.
+| | Given Generate LISP locator_set data
+| | ... | ${nodes['DUT1']} | ${locator_set_num}
+| | And Enable LISP | ${nodes['DUT1']}
+| | When Configure LISP locator_set data | ${nodes['DUT1']}
+| | Then LISP locator_set shpuld be configured correctly | ${nodes['DUT1']}
+| | When Delete all LISP locator_set from VPP | ${nodes['DUT1']}
+| | Then LISP locator_set should be unset | ${nodes['DUT1']}
+
+| TC03: DUT can add, reset and delete locator_set
+| | [Documentation]
+| | ... | [Top] DUT1. [Enc] None. [Cfg1] Test LISP locator_set API; on \
+| | ... | DUT1 configure locator_set and locator. [Ver1] Check DUT1
+| | ... | locator_set and locator are correct. [Cfg2] Then reset
+| | ... | locator_set and set it again. [Ver2] Check DUT1 locator_set and
+| | ... | locator are correct. [Cfg3] Then remove locator_set and locator.
+| | ... | [Ver3] Check DUT1 all locator_set and locators are removed.
+| | ... | [Ref] RFC6830.
+| | Given Lisp locator_set data use for test reset locator_set are prepared
+| | ... | ${nodes['DUT1']} | ${locator_set_num}
+| | And Enable LISP | ${nodes['DUT1']}
+| | When Configure LISP locator_set data | ${nodes['DUT1']}
+| | Then LISP locator_set shpuld be configured correctly | ${nodes['DUT1']}
+| | When Delete all LISP locator_set from VPP | ${nodes['DUT1']}
+| | Then LISP locator_set should be unset | ${nodes['DUT1']}
+
+| TC04: DUT can add and delete eid address
+| | [Documentation]
+| | ... | [Top] DUT1. [Enc] None. [Cfg1] Test LISP eid API; on DUT1 \
+| | ... | configure LISP eid IP address. [Ver1] Check DUT1 configured data
+| | ... | is correct. [Cfg2] Remove configured data. [Ver2] Check DUT1 all
+| | ... | eid IP addresses are removed. [Ref] RFC6830.
+| | Given Enable LISP | ${nodes['DUT1']}
+| | When Configure LISP eid address | ${nodes['DUT1']} | ${eid_table}
+| | Then LISP eid address should be set correctly to eid table
+| | ... | ${nodes['DUT1']} | ${eid_table_vat}
+| | When Delete all LISP eid address from VPP | ${nodes['DUT1']} | ${eid_table}
+| | Then LISP eid table should be empty | ${nodes['DUT1']}
+
+| TC05: DUT can add and delete LISP map resolver address
+| | [Documentation]
+| | ... | [Top] DUT1. [Enc] None. [Cfg1] Test LISP map resolver address \
+| | ... | API; on DUT1 configure LISP map resolver address. [Ver1] Check
+| | ... | DUT1 configured data is correct. [Cfg2] Remove configured data.
+| | ... | [Ver2] Check DUT1 all map resolver addresses are removed. [Ref]
+| | ... | RFC6830.
+| | Given Enable LISP | ${nodes['DUT1']}
+| | When Configure LISP map resolver address | ${nodes['DUT1']} | ${map_resolver}
+| | Then LISP map resolver address should be configured correctly
+| | ... | ${nodes['DUT1']} | ${map_resolver}
+| | When Delete all LISP map resolver address from VPP
+| | ... | ${nodes['DUT1']} | ${map_resolver}
+| | Then LISP map resolver address should be empty | ${nodes['DUT1']}
diff --git a/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lisp-ip4base-func.robot b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lisp-ip4base-func.robot
new file mode 100644
index 0000000000..ae9485c3b8
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lisp-ip4base-func.robot
@@ -0,0 +1,124 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.Trace
+# import additional Lisp settings from resource file
+| 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 | Set up functional test
+| ...
+| Test Teardown | Tear down functional test
+| ...
+| Documentation | *IP AFI independent functional tests.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv4-ICMPv4 on DUT1-DUT2,\
+| ... | Eth-IPv4-ICMPv4 on TG-DUTn for IPv4 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv4 tunnel is\
+| ... | configured between DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets\
+| ... | are sent in both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv4 src-addr,\
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 over LISPoIPv4 tunnel after disable-enable
+| | [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 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 received via LISP tunnel.
+| | ... | [Cfg3] Re-enable LISP.
+| | ... | [Ver3] Verify packets are received again via LISP tunnel.
+| | ... | [Ref] RFC6830.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${dut1_to_dut2_ip4} | ${prefix4}
+| | ... | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${dut1_to_tg_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_dut1}
+| | ... | ${dut2_to_dut1_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And VPP IP Probe | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | And VPP IP Probe | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4}
+| | ... | ${tg_to_dut2_mac}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | When Configure LISP topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+| | When Disable Lisp | ${dut1_node}
+| | Then Packet transmission from port to port should fail
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Packet transmission from port to port should fail
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+| | When Enable Lisp | ${dut1_node}
+| | And Vpp Add Lisp Adjacency | ${dut1_node}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency['vni']}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency['deid']}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency['prefix']}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency['seid']}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency['prefix']}
+| | And Vpp Add Lisp Adjacency | ${dut2_node}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency['vni']}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency['deid']}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency['prefix']}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency['seid']}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency['prefix']}
+| | Then Wait Until Keyword Succeeds | 2x | 5s | Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Wait Until Keyword Succeeds | 2x | 5s | Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
diff --git a/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lisp-l2bdbasemaclrn-func.robot b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lisp-l2bdbasemaclrn-func.robot
new file mode 100644
index 0000000000..98602fc45f
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lisp-l2bdbasemaclrn-func.robot
@@ -0,0 +1,95 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.L2Util
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/overlay/l2lisp.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/l2/l2_ipv4.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down functional test
+| ...
+| Documentation | *ip4-lispgpe-ip4 encapsulation test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4-LISPGpe-IP4
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between\
+| ... | DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent in\
+| ... | both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv4 src-addr, dst-addr\
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: Route IPv4 packet through LISP with Bridge Domain setup.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-ICMPv4-LISPGpe-IP4
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2. Also\
+| | ... | configure BD and assign it to LISP VNI.
+| | ... | [Ver] Make TG send ICMPv4 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP tunnel between them; verify IPv4, Ether headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip4} | ${prefix4}
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4}
+| | ... | ${tg_to_dut2_mac}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_dut1_mac}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | ... | ${dut1_to_dut2_mac}
+| | When Create L2 BD | ${dut1_node} | ${vpp_bd_id}
+| | And Add Interface To L2 BD | ${dut1_node} | ${dut1_to_tg} | ${vpp_bd_id}
+| | And Create L2 BD | ${dut2_node} | ${vpp_bd_id}
+| | And Add Interface To L2 BD | ${dut2_node} | ${dut2_to_tg} | ${vpp_bd_id}
+| | And Configure L2 LISP on DUT | ${dut1_node}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${lisp_dut_settings}
+| | And Configure L2 LISP on DUT | ${dut2_node}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | ... | ${lisp_dut_settings}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_if1_mac} | ${tg_if2_mac}
+| | ... | ${tg_to_dut2} | ${tg_if1_mac} | ${tg_if2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_if2_mac} | ${tg_if1_mac}
+| | ... | ${tg_to_dut1} | ${tg_if2_mac} | ${tg_if1_mac}
diff --git a/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip4base-func.robot b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip4base-func.robot
new file mode 100644
index 0000000000..90a0ae1599
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip4base-func.robot
@@ -0,0 +1,104 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.VPPUtil
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.VhostUser
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv4_lispgpe_ipv4/ipv4_lispgpe_ipv4.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test
+| ...
+| Documentation | *ip4-lispgpe-ip4 encapsulation test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv4-ICMPv4 on DUT1-DUT2,\
+| ... | Eth-IPv4-ICMPv4 on TG-DUTn for IPv4 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between\
+| ... | DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent in\
+| ... | both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv4 src-addr, dst-addr\
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using physical interfaces
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-LISPGPE-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on\
+| | ... | TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2.
+| | ... | [Ver] Case: ip4-lispgpe-ip4 - phy2lisp
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip4} | ${prefix4}
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Add IP Neighbors
+| | When Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | ... | ${dut1_to_dut2_mac}
diff --git a/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip4basevrf-func.robot b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip4basevrf-func.robot
new file mode 100644
index 0000000000..f41be5fecc
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip4basevrf-func.robot
@@ -0,0 +1,109 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.VPPUtil
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.VhostUser
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv4_lispgpe_ipv4/ipv4_lispgpe_ipv4.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test
+| ...
+| Documentation | *ip4-lispgpe-ip4 encapsulation test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv4-ICMPv4 on DUT1-DUT2,\
+| ... | Eth-IPv4-ICMPv4 on TG-DUTn for IPv4 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between\
+| ... | DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent in\
+| ... | both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv4 src-addr, dst-addr\
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using physical interfaces and VRF is enabled
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-LISPGPE-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on\
+| | ... | TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2.
+| | ... | [Ver] Case: ip4-lispgpe-ip4 - vrf, phy2lisp
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${fib_table_1}
+| | And Assign Interface To Fib Table | ${dut2_node}
+| | ... | ${dut2_to_tg} | ${fib_table_1}
+| | And Add IP Neighbors
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip4} | ${prefix4}
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip4} | ${prefix4}
+| | When Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | ... | ${dut1_dut2_vni} | ${fib_table_1}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | ... | ${dut1_to_dut2_mac}
diff --git a/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip6base-func.robot b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip6base-func.robot
new file mode 100644
index 0000000000..7e97aca29e
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip6base-func.robot
@@ -0,0 +1,120 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.VPPUtil
+# import additional Lisp settings from resource file
+| 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 | Set up functional test
+| ...
+| Test Teardown | Tear down functional test
+| ...
+| Documentation | *LISP static adjacency test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv6-ICMPv6 on DUT1-DUT2,\
+| ... | Eth-IPv6-ICMPv6 on TG-DUTn for IPv6 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured\
+| ... | between DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets\
+| ... | are sent in both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv6 src-addr,\
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 bidirectionally over LISPoIPv4 tunnel
+| | [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 static adjacencies.
+| | ... | [Ver] Make TG send ICMPv6 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP tunnel between them; verify IPv6 headers on received\
+| | ... | packets are correct.
+| | ... | [Cfg2] Reconf LISP.
+| | ... | [Ver2] Verify packets are received again via LISP tunnel.
+| | ... | [Ref] RFC6830.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut_prefix6o4}
+| | ... | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${dut1_to_tg_ip6o4} | ${tg_prefix6o4}
+| | ... | ${dut2_node} | ${dut2_to_dut1}
+| | ... | ${dut2_to_dut1_ip6o4} | ${dut_prefix6o4}
+| | ... | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4}
+| | And Add IP Neighbors
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | When Configure LISP topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6o4} | ${tg2_ip6o4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6o4} | ${tg1_ip6o4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+| | When Change LISP Configuration | ${dut1_node} | ${dut2_node}
+| | ... | ${dut1_to_dut2} | ${dut2_to_dut1} | ${dut1_to_dut2_mac}
+| | ... | ${dut2_to_dut1_mac} | ${dut1_to_dut2_ip6o4}
+| | ... | ${dut2_to_dut1_ip6o4_reconf} | ${dut_prefix6o4}
+| | ... | ${dut1_ip6o4_static_adjacency}
+| | ... | ${dut1_ip6o4_static_adjacency_reconf}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6o4} | ${tg2_ip6o4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6o4} | ${tg1_ip6o4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6o4}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6o4}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6o4}
+| | ... | ${dut1_to_dut2_mac}
diff --git a/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip6basevrf-func.robot b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip6basevrf-func.robot
new file mode 100644
index 0000000000..668e870ff0
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/lisp/eth2p-ethip4lispgpe-ip6basevrf-func.robot
@@ -0,0 +1,110 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.VPPUtil
+# import additional Lisp settings from resource file
+| 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 | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test
+| ...
+| Documentation | *LISP static adjacency test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv6-ICMPv6 on DUT1-DUT2,\
+| ... | Eth-IPv6-ICMPv6 on TG-DUTn for IPv6 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured\
+| ... | between DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets\
+| ... | are sent in both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv6 src-addr,\
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 bidirectionally over LISP GPE tunnel using physical interfaces and VRF is enabled
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on\
+| | ... | TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2.
+| | ... | [Ver] Case: ip6-lispgpe-ip4 - vrf, phy2lisp
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${fib_table_1} | ip6=${TRUE}
+| | And Assign Interface To Fib Table | ${dut2_node}
+| | ... | ${dut2_to_tg} | ${fib_table_1} | ip6=${TRUE}
+| | And Add IP Neighbors
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6o4}
+| | ... | ${dut_prefix6o4}
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6o4} | ${tg_prefix6o4}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut_prefix6o4}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4}
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | When Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency}
+| | ... | ${dut2_ip6o4_static_adjacency}
+| | ... | ${dut1_dut2_vni} | ${fib_table_1}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6o4} | ${tg2_ip6o4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6o4} | ${tg1_ip6o4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6o4}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6o4}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6o4}
+| | ... | ${dut1_to_dut2_mac}
diff --git a/tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swirelw46-func.robot b/tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swirelw46-func.robot
new file mode 100644
index 0000000000..378accb922
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swirelw46-func.robot
@@ -0,0 +1,209 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/ip/map.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *Lightweight 4 over 6 test cases*
+| ...
+| ... | LW4o6 is a subset of MAP-E, with per-subscriber rules. It uses the
+| ... | same tunneling mechanism and configuration as MAP-E. It does not use
+| ... | embedded address bits.
+| ...
+| ... | *[Top] Network Topologies:* TG=DUT1 2-node topology with two links
+| ... | between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP on TG_if1-DUT,
+| ... | Eth-IPv6-IPv4-UDP on TG_if2_DUT.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured as lwAFTR.
+| ... | *[Ver] TG verification:* Test UDP ICMP Echo Request in IPv4 are
+| ... | sent to lwAFTR and are verified by TG for correctness their
+| ... | encapsulation in IPv6 src-addr, dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC7596 RFC7597.
+
+*** Variables ***
+| ${dut_ip4}= | 10.0.0.1
+| ${dut_ip6}= | 2001:0::1
+| ${tg_ip6}= | 2001:0::2
+| ${ipv4_prefix_len}= | 24
+| ${ipv6_prefix_len}= | 64
+
+| ${lw_ipv4_pfx}= | 20.0.0.1/32
+| ${lw_ipv6_pfx}= | 2001:1::/64
+| ${lw_ipv6_src}= | 2001:1::1
+| ${lw_psid_length}= | ${8}
+| ${lw_psid_offset}= | ${6}
+| ${lw_rule_psid}= | ${52}
+| ${lw_rule_ipv6_dst}= | 2001:1::2
+| ${lw_rule_2_psid}= | ${22}
+| ${lw_rule_2_ipv6_dst}= | 2001:1::3
+| ${test_ipv4_inside}= | 20.0.0.1
+| ${test_ipv4_outside}= | 10.0.0.100
+# test_port depends on psid, length, offset
+| ${test_port}= | ${1232}
+| ${test_icmp_id}= | ${1232}
+| ${test_2_port}= | ${6232}
+
+*** Test Cases ***
+| TC01: Encapsulate IPv4 into IPv6. IPv6 dst depends on IPv4 and UDP destination
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Enc] Eth-IPv4-UDP on TG_if1-DUT, Eth-IPv6-IPv4-UDP on TG_if2_DUT.
+| | ... | [Cfg] On DUT1 configure Map domain and Map rule.
+| | ... | [Ver] Make TG send non-encapsulated UDP to DUT; verify TG received
+| | ... | IPv4oIPv6 encapsulated packet is correct.
+| | ... | [Ref] RFC7596 RFC7597
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | And Add IP Neighbor
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${tg_ip6}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add
+| | ... | ${dut_node} | ${lw_rule_ipv6_dst} | 128
+| | ... | ${tg_ip6} | ${dut_to_tg_if2} | resolve_attempts=${NONE}
+| | ${domain_index}=
+| | ... | When Map Add Domain
+| | ... | ${dut_node} | ${lw_ipv4_pfx} | ${lw_ipv6_pfx}
+| | ... | ${lw_ipv6_src} | 0 | ${lw_psid_offset}
+| | ... | ${lw_psid_length}
+| | And Map Add Rule
+| | ... | ${dut_node} | ${domain_index} | ${lw_rule_psid}
+| | ... | ${lw_rule_ipv6_dst}
+| | Then Send IPv4 UDP and check headers for lightweight 4over6
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if1_mac} | ${test_ipv4_inside} | ${test_ipv4_outside}
+| | ... | ${test_port} | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac}
+| | ... | ${lw_rule_ipv6_dst} | ${lw_ipv6_src}
+
+TC02: Encapsulate IPv4 ICMP into IPv6. IPv6 dst depends on IPv4 addr and ICMP ID
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Enc] Eth-IPv4-ICMP(type 0 and 8) on TG_if1-DUT, Eth-IPv6-IPv4-ICMP
+| | ... | on TG_if2_DUT.
+| | ... | [Cfg] On DUT1 configure Map domain and Map rule.
+| | ... | [Ver] Make TG send non-encapsulated ICMP to DUT; verify TG received
+| | ... | IPv4oIPv6 encapsulated packet is correct. Checks IPv6
+| | ... | destination based on ICMP Identifier field.
+| | ... | [Ref] RFC7596 section 8.1
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | And Add IP Neighbor
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${tg_ip6}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add
+| | ... | ${dut_node} | ${lw_rule_ipv6_dst} | 128
+| | ... | ${tg_ip6} | ${dut_to_tg_if2} | resolve_attempts=${NONE}
+| | ${domain_index}=
+| | ... | When Map Add Domain
+| | ... | ${dut_node} | ${lw_ipv4_pfx} | ${lw_ipv6_pfx}
+| | ... | ${lw_ipv6_src} | 0 | ${lw_psid_offset}
+| | ... | ${lw_psid_length}
+| | And Map Add Rule
+| | ... | ${dut_node} | ${domain_index} | ${lw_rule_psid}
+| | ... | ${lw_rule_ipv6_dst}
+| | Then Send IPv4 ICMP and check headers for lightweight 4over6
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if1_mac} | ${test_ipv4_inside} | ${test_ipv4_outside}
+| | ... | ${test_icmp_id} | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac}
+| | ... | ${lw_rule_ipv6_dst} | ${lw_ipv6_src}
+
+TC03: Decapsulate IPv4 UDP from IPv6.
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Enc] Eth-IPv6-IPv4-UDP on TG_if2_DUT, Eth-IPv4-UDP on TG_if1-DUT.
+| | ... | [Cfg] On DUT1 configure Map domain and Map rule.
+| | ... | [Ver] Make TG send encapsulated UDP to DUT; verify TG received
+| | ... | IPv4 non-encapsulated packet is correct.
+| | ... | [Ref] RFC7596 RFC7597
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | And Add Arp on DUT
+| | ... | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${test_ipv4_outside}
+| | ... | ${tg_to_dut_if1_mac}
+| | ${domain_index}=
+| | ... | When Map Add Domain
+| | ... | ${dut_node} | ${lw_ipv4_pfx} | ${lw_ipv6_pfx}
+| | ... | ${lw_ipv6_src} | 0 | ${lw_psid_offset}
+| | ... | ${lw_psid_length}
+| | And Map Add Rule
+| | ... | ${dut_node} | ${domain_index} | ${lw_rule_psid}
+| | ... | ${lw_rule_ipv6_dst}
+| | Then Send IPv4 UDP in IPv6 and check headers for lightweight 4over6
+| | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if1}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2_mac}
+| | ... | ${lw_ipv6_src} | ${lw_rule_ipv6_dst}
+| | ... | ${test_ipv4_outside} | ${test_ipv4_inside} | ${test_port}
+| | ... | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+
+TC04: Hairpinning of traffic between two lwB4
+| | [Documentation]
+| | ... | [Top] DUT1-TG.
+| | ... | [Enc] Eth-IPv6-IPv4-UDP on TG_if2_DUT, Eth-IPv6-IPv4-UDP on TG_if2_DUT.
+| | ... | [Cfg] On DUT1 configure Map domain and two Map rules.
+| | ... | [Ver] Make TG send encapsulated UDP to DUT; verify TG received
+| | ... | encapsulated packet is correct.
+| | ... | [Ref] RFC7596 RFC7597
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | And Add IP Neighbor
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${tg_ip6}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add
+| | ... | ${dut_node} | ${lw_rule_2_ipv6_dst} | 128
+| | ... | ${tg_ip6} | ${dut_to_tg_if2} | resolve_attempts=${NONE}
+| | ${domain_index}=
+| | ... | When Map Add Domain
+| | ... | ${dut_node} | ${lw_ipv4_pfx} | ${lw_ipv6_pfx}
+| | ... | ${lw_ipv6_src} | 0 | ${lw_psid_offset}
+| | ... | ${lw_psid_length}
+| | And Map Add Rule
+| | ... | ${dut_node} | ${domain_index} | ${lw_rule_psid}
+| | ... | ${lw_rule_ipv6_dst}
+| | And Map Add Rule
+| | ... | ${dut_node} | ${domain_index} | ${lw_rule_2_psid}
+| | ... | ${lw_rule_2_ipv6_dst}
+| | Then Send IPv4 UDP in IPv6 and check headers for lightweight hairpinning
+| | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if2_mac}
+| | ... | ${lw_ipv6_src} | ${lw_rule_ipv6_dst}
+| | ... | ${test_ipv4_inside} | ${test_ipv4_inside}
+| | ... | ${test_2_port} | ${test_port}
+| | ... | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac}
+| | ... | ${lw_rule_2_ipv6_dst} | ${lw_ipv6_src}
diff --git a/tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swiremape-func.robot b/tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swiremape-func.robot
new file mode 100644
index 0000000000..95e61db654
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swiremape-func.robot
@@ -0,0 +1,483 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/ip/map.robot
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.Trace
+| Variables | resources/test_data/softwire/map_e_domains.py | ${5}
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *Test for Basic mapping rule for MAP-E*\
+| ... | *[Top] Network Topologies:* TG - DUT1 - TG with two links between the
+| ... | nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP on TG-to-DUT-if1.
+| ... | Eth-IPv6-IPv4-UDP on TG-to-DUT-if2.
+| ... | *[Cfg] DUT configuration:* DUT is configured with IPv4 on one DUT-to-TG
+| ... | interface and IPv6 address on second DUT-to-TG interface. MAP-E domain
+| ... | is configured in test template based on test parameters.
+| ... | *[Ver] TG verification:* UDP packets in IPv4 are sent by TG to
+| ... | destination in MAP domain. IPv6 packets with encapsulated IPv4 are
+| ... | received on TG interface.
+| ... | *[Ref] Applicable standard specifications:* RFC7597.
+
+
+*** Variables ***
+| ${dut_ip4}= | 10.0.0.1
+| ${dut_ip6}= | 2001:0::1
+| ${dut_ip4_gw}= | 10.0.0.2
+| ${dut_ip6_gw}= | 2001:0::2
+| ${ipv4_prefix_len}= | 24
+| ${ipv6_prefix_len}= | 64
+| ${ipv6_br_src}= | 2001:db8:ffff::1
+| ${ipv4_outside}= | 1.0.0.1
+
+
+*** Test Cases ***
+| TC01: BMR, then an IPv4 prefix is assigned
+| | [Documentation]
+| | ... | Basic Mapping Rule https://tools.ietf.org/html/rfc7597#section-5.2\
+| | ... | IPv4 prefix length + ea bits length < 32 (o + r < 32)
+| | ... | psid_length = 0, ip6_prefix < 64, ip4_prefix <= 32
+| | ...
+| | ... | Arguments:
+| | ...
+| | ... | - ipv4_pfx
+| | ... | - ipv6_pfx
+| | ... | - ipv6_src
+| | ... | - ea_bit_len
+| | ... | - psid_offset
+| | ... | - psid_len
+| | ... | - ipv4_dst
+| | ... | - dst_port
+| | ... | - expected_ipv6_dst
+| | ...
+# TODO: replace setup when VPP-312 fixed
+#| | [Setup] | Set Interfaces IP Addresses And Routes
+| | [Setup] | Run Keywords
+| | ... | Set up functional test | AND
+| | ... | Set Interfaces IP Addresses And Routes
+| | [Template] | Check MAP Configuration With Traffic Script
+# |=================|===============|================|============|=============|==========|================|==========|==================================|
+# | ipv4_pfx | ipv6_pfx | ipv6_src | ea_bit_len | psid_offset | psid_len | ipv4_dst | dst_port | expected_ipv6_dst |
+# |=================|===============|================|============|=============|==========|================|==========|==================================|
+| | 20.0.0.0/8 | 2001:db8::/32 | ${ipv6_br_src} | ${4} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:a000::14a0:0:0 |
+| | 20.0.0.0/8 | 2001:db8::/32 | ${ipv6_br_src} | ${8} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:a900::14a9:0:0 |
+| | 20.0.0.0/8 | 2001:db8::/32 | ${ipv6_br_src} | ${10} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:a9c0::14a9:c000:0 |
+| | 20.0.0.0/8 | 2001:db8::/32 | ${ipv6_br_src} | ${16} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:a9c9::14a9:c900:0 |
+| | 20.0.0.0/8 | 2001:db8::/32 | ${ipv6_br_src} | ${20} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:a9c9:d000:0:14a9:c9d0:0 |
+| | 20.0.0.0/8 | 2001:db8::/32 | ${ipv6_br_src} | ${23} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:a9c9:da00:0:14a9:c9da:0 |
+| | 20.169.201.0/24 | 2001:db8::/32 | ${ipv6_br_src} | ${4} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:d000::14a9:c9d0:0 |
+| | 20.169.201.0/24 | 2001:db8::/32 | ${ipv6_br_src} | ${7} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:da00::14a9:c9da:0 |
+
+
+| TC02: BMR, full IPv4 address is to be assigned
+| | [Documentation]
+| | ... | Basic Mapping Rule https://tools.ietf.org/html/rfc7597#section-5.2\
+| | ... | IPv4 prefix length + ea bits length == 32 (o + r == 32)
+| | ... | psid_length = 0, ip6_prefix < 64, ip4_prefix <= 32
+| | ...
+| | ... | Arguments:
+| | ...
+| | ... | - ipv4_pfx
+| | ... | - ipv6_pfx
+| | ... | - ipv6_src
+| | ... | - ea_bit_len
+| | ... | - psid_offset
+| | ... | - psid_len
+| | ... | - ipv4_dst
+| | ... | - dst_port
+| | ... | - expected_ipv6_dst
+| | ...
+# TODO: replace setup when VPP-312 fixed
+#| | [Setup] | Set Interfaces IP Addresses And Routes
+| | [Setup] | Run Keywords
+| | ... | Set up functional test | AND
+| | ... | Set Interfaces IP Addresses And Routes
+| | [Template] | Check MAP Configuration With Traffic Script
+# |===================|===============|================|============|=============|==========|================|==========|==================================|
+# | ipv4_pfx | ipv6_pfx | ipv6_src | ea_bit_len | psid_offset | psid_len | ipv4_dst | dst_port | expected_ipv6_dst |
+# |===================|===============|================|============|=============|==========|================|==========|==================================|
+| | 20.0.0.0/8 | 2001:db8::/32 | ${ipv6_br_src} | ${24} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:a9c9:db00:0:14a9:c9db:0 |
+| | 20.160.0.0/12 | 2001:db8::/32 | ${ipv6_br_src} | ${20} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:9c9d:b000:0:14a9:c9db:0 |
+| | 20.169.0.0/16 | 2001:db8::/32 | ${ipv6_br_src} | ${16} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:c9db::14a9:c9db:0 |
+| | 20.169.200.0/22 | 2001:db8::/32 | ${ipv6_br_src} | ${10} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:76c0::14a9:c9db:0 |
+| | 20.169.201.0/24 | 2001:db8::/32 | ${ipv6_br_src} | ${8} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:db00::14a9:c9db:0 |
+| | 20.169.201.208/28 | 2001:db8::/32 | ${ipv6_br_src} | ${4} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:b000::14a9:c9db:0 |
+| | 20.169.201.219/32 | 2001:db8::/32 | ${ipv6_br_src} | ${0} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8::14a9:c9db:0 |
+| | 20.0.0.0/8 | 2001:db8::/40 | ${ipv6_br_src} | ${24} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:a9:c9db:0:14a9:c9db:0 |
+| | 20.160.0.0/12 | 2001:db8::/44 | ${ipv6_br_src} | ${20} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:9:c9db:0:14a9:c9db:0 |
+| | 20.169.0.0/16 | 2001:db8::/48 | ${ipv6_br_src} | ${16} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:0:c9db:0:14a9:c9db:0 |
+| | 20.169.200.0/22 | 2001:db8::/54 | ${ipv6_br_src} | ${10} | ${0} | ${0} | 20.169.201.219 | ${1232} | 2001:db8:0:1db:0:14a9:c9db:0 |
+
+
+| TC03: BMR, shared IPv4 address is to be assigned
+| | [Documentation]
+| | ... | Basic Mapping Rule https://tools.ietf.org/html/rfc7597#section-5.2\
+| | ... | IPv4 prefix length + ea bits length > 32 (o + r > 32)
+| | ... | ip6_prefix < 64, ip4_prefix <= 32
+| | ...
+| | ... | Arguments:
+| | ...
+| | ... | - ipv4_pfx
+| | ... | - ipv6_pfx
+| | ... | - ipv6_src
+| | ... | - ea_bit_len
+| | ... | - psid_offset
+| | ... | - psid_len
+| | ... | - ipv4_dst
+| | ... | - dst_port
+| | ... | - expected_ipv6_dst
+| | ...
+# TODO: replace setup when VPP-312 fixed
+#| | [Setup] | Set Interfaces IP Addresses And Routes
+| | [Setup] | Run Keywords
+| | ... | Set up functional test | AND
+| | ... | Set Interfaces IP Addresses And Routes
+| | [Template] | Check MAP Configuration With Traffic Script
+# |===================|===============|================|============|=============|==========|================|==========|===================================|
+# | ipv4_pfx | ipv6_pfx | ipv6_src | ea_bit_len | psid_offset | psid_len | ipv4_dst | dst_port | expected_ipv6_dst |
+# |===================|===============|================|============|=============|==========|================|==========|===================================|
+| | 20.0.0.0/8 | 2001::/16 | ${ipv6_br_src} | ${48} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:a9c9:db34::14a9:c9db:34 |
+| | 20.169.0.0/16 | 2001::/16 | ${ipv6_br_src} | ${48} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:c9db:3400::14a9:c9db:34 |
+| | 20.169.201.0/24 | 2001::/16 | ${ipv6_br_src} | ${48} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db34::14a9:c9db:34 |
+| | 20.169.201.219/32 | 2001::/16 | ${ipv6_br_src} | ${48} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:3400::14a9:c9db:34 |
+
+| | 20.0.0.0/8 | 2001::/24 | ${ipv6_br_src} | ${40} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:a9:c9db:3400:0:14a9:c9db:34 |
+| | 20.169.0.0/16 | 2001::/24 | ${ipv6_br_src} | ${40} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:c9:db34::14a9:c9db:34 |
+| | 20.169.201.0/24 | 2001::/24 | ${ipv6_br_src} | ${40} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db:3400::14a9:c9db:34 |
+| | 20.169.201.219/32 | 2001::/24 | ${ipv6_br_src} | ${40} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:34::14a9:c9db:34 |
+| | 20.169.0.0/16 | 2001::/16 | ${ipv6_br_src} | ${40} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:c9db:3400::14a9:c9db:34 |
+| | 20.169.201.219/32 | 2001::/16 | ${ipv6_br_src} | ${40} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:3400::14a9:c9db:34 |
+
+| | 20.0.0.0/8 | 2001:db8::/32 | ${ipv6_br_src} | ${32} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db8:a9c9:db34:0:14a9:c9db:34 |
+| | 20.169.0.0/16 | 2001:db8::/32 | ${ipv6_br_src} | ${32} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db8:c9db:3400:0:14a9:c9db:34 |
+| | 20.169.201.0/24 | 2001:db8::/32 | ${ipv6_br_src} | ${32} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db8:db34::14a9:c9db:34 |
+| | 20.169.201.219/32 | 2001:db8::/32 | ${ipv6_br_src} | ${32} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db8:3400::14a9:c9db:34 |
+| | 20.169.0.0/16 | 2001::/24 | ${ipv6_br_src} | ${32} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:c9:db34::14a9:c9db:34 |
+| | 20.169.201.0/24 | 2001::/24 | ${ipv6_br_src} | ${32} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db:3400::14a9:c9db:34 |
+| | 20.169.0.0/16 | 2001::/16 | ${ipv6_br_src} | ${32} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:c9db:3400::14a9:c9db:34 |
+| | 20.169.201.0/24 | 2001::/16 | ${ipv6_br_src} | ${32} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db34::14a9:c9db:34 |
+
+| | 20.160.0.0/12 | 2001:db8::/32 | ${ipv6_br_src} | ${25} | ${6} | ${5} | 20.169.201.219 | ${1232} | 2001:db8:9c9d:b300:0:14a9:c9db:6 |
+| | 20.169.0.0/16 | 2001:db8::/32 | ${ipv6_br_src} | ${25} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db8:c9db:3400:0:14a9:c9db:34 |
+| | 20.169.201.0/24 | 2001:db8::/32 | ${ipv6_br_src} | ${25} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db8:db34::14a9:c9db:34 |
+| | 20.169.201.219/32 | 2001:db8::/32 | ${ipv6_br_src} | ${25} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db8:3400::14a9:c9db:34 |
+
+| | 20.169.192.0/20 | 2001:db8::/32 | ${ipv6_br_src} | ${17} | ${6} | ${5} | 20.169.201.219 | ${1232} | 2001:db8:9db3::14a9:c9db:6 |
+| | 20.169.201.0/24 | 2001:db8::/32 | ${ipv6_br_src} | ${17} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db8:db34::14a9:c9db:34 |
+| | 20.169.201.219/32 | 2001:db8::/32 | ${ipv6_br_src} | ${17} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db8:3400::14a9:c9db:34 |
+
+| | 20.169.201.0/24 | 2001:db8::/32 | ${ipv6_br_src} | ${12} | ${6} | ${4} | 20.169.201.219 | ${1232} | 2001:db8:db30::14a9:c9db:3 |
+| | 20.169.201.219/32 | 2001:db8::/32 | ${ipv6_br_src} | ${12} | ${6} | ${8} | 20.169.201.219 | ${1232} | 2001:db8:3400::14a9:c9db:34 |
+
+
+| TC04: End user IPv6 prefix is 64
+| | [Documentation]
+| | ... | Supported End-User IPv6 prefix length is 64 bit.
+| | ...
+| | ... | Arguments:
+| | ...
+| | ... | - ipv4_pfx
+| | ... | - ipv6_pfx
+| | ... | - ipv6_src
+| | ... | - ea_bit_len
+| | ... | - psid_offset
+| | ... | - psid_len
+| | ... | - ipv4_dst
+| | ... | - dst_port
+| | ...
+# TODO: replace setup when VPP-312 fixed
+#| | [Setup] | Set Interfaces IP Addresses And Routes
+| | [Setup] | Run Keywords
+| | ... | Set up functional test | AND
+| | ... | Set Interfaces IP Addresses And Routes
+| | [Template] | Check MAP Configuration With Traffic Script
+# |===================|=========================|================|============|=============|==========|================|==========|
+# | ipv4_pfx | ipv6_pfx | ipv6_src | ea_bit_len | psid_offset | psid_len | ipv4_dst | dst_port |
+# |===================|=========================|================|============|=============|==========|================|==========|
+| | 20.0.0.0/8 | 2001:db8:0012:3400::/56 | ${ipv6_br_src} | ${8} | ${0} | ${0} | 20.169.201.219 | ${1232} |
+| | 20.169.201.208/28 | 2001:db8:0012:3400::/56 | ${ipv6_br_src} | ${8} | ${5} | ${4} | 20.169.201.219 | ${3280} |
+| | 20.0.0.0/8 | 2001:db8:0012:3400::/64 | ${ipv6_br_src} | ${0} | ${0} | ${0} | 20.169.201.219 | ${1232} |
+| | 20.169.201.219/32 | 2001:db8:0012:3400::/64 | ${ipv6_br_src} | ${0} | ${0} | ${0} | 20.169.201.219 | ${1232} |
+
+
+| TC05: IPv4 prefix is 0
+| | [Tags] | EXPECTED_FAILING
+# TODO: replace setup when VPP-312 fixed
+#| | [Setup] | Set Interfaces IP Addresses And Routes
+| | [Setup] | Run Keywords
+| | ... | Set up functional test | AND
+| | ... | Set Interfaces IP Addresses And Routes
+| | [Template] | Check MAP Configuration With Traffic Script
+# |===================|=========================|================|============|=============|==========|================|==========|
+# | ipv4_pfx | ipv6_pfx | ipv6_src | ea_bit_len | psid_offset | psid_len | ipv4_dst | dst_port |
+# |===================|=========================|================|============|=============|==========|================|==========|
+| | 0.0.0.0/0 | 2001:db8:0000::/40 | ${ipv6_br_src} | ${8} | ${0} | ${0} | 20.169.201.219 | ${1232} |
+| | 0.0.0.0/0 | 2001:db8:0000::/40 | ${ipv6_br_src} | ${16} | ${0} | ${0} | 20.169.201.219 | ${1232} |
+| | 0.0.0.0/0 | 2001:db8::/32 | ${ipv6_br_src} | ${32} | ${0} | ${0} | 20.169.201.219 | ${1232} |
+| | 0.0.0.0/0 | 2001:d00::/24 | ${ipv6_br_src} | ${40} | ${6} | ${8} | 20.169.201.219 | ${1232} |
+| | 0.0.0.0/0 | 2001::/16 | ${ipv6_br_src} | ${40} | ${6} | ${8} | 20.169.201.219 | ${1232} |
+
+
+| TC06: Multiple domain and check with traffic script IPv4 source IPv6 destination
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Cfg] Multiple MAP-E domains are configured, values from variable\
+| | ... | file.
+| | ... | [Ver] Send IPv4 to destination in configured domain and receive IPv6\
+| | ... | packet.
+| | ... | [Ref] RFC7597.
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | And Vpp Route Add | ${dut_node} | :: | 0 | ${dut_ip6_gw}
+| | ... | ${dut_to_tg_if2} | resolve_attempts=${NONE} | count=${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6_gw}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add | ${dut_node} | 0.0.0.0 | 0 | ${dut_ip4_gw}
+| | ... | ${dut_to_tg_if1} | resolve_attempts=${NONE} | count=${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4_gw}
+| | ... | ${tg_to_dut_if1_mac}
+| | :FOR | ${domain_set} | IN | @{domain_sets}
+| | | When Map Add Domain | ${dut_node} | @{domain_set}
+| | :FOR | ${ip_set} | IN | @{ip_sets}
+| | | ${ipv4}= | Get From List | ${ip_set} | 0
+| | | ${ipv6}= | Get From List | ${ip_set} | 1
+| | | ${port}= | Get From List | ${ip_set} | 2
+| | | ${ipv6_br}= | Get From List | ${ip_set} | 3
+| | | Then Send IPv4 UDP And Check Headers For Lightweight 4over6
+| | | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | | ... | ${dut_to_tg_if1_mac} | ${ipv4} | ${ipv4_outside} | ${port}
+| | | ... | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac} | ${ipv6} | ${ipv6_br}
+| | | And Send IPv4 UDP In IPv6 And Check Headers For Lightweight 4over6
+| | | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if1}
+| | | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2_mac} | ${ipv6_br} | ${ipv6}
+| | | ... | ${ipv4_outside} | ${ipv4} | ${port} | ${tg_to_dut_if1_mac}
+| | | ... | ${dut_to_tg_if1_mac}
+
+
+| TC07: Multiple domain and check with traffic script IPv6 source IPv6 destination
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Cfg] Multiple MAP-E domains are configured, values from variable\
+| | ... | file.
+| | ... | [Ver] Send IPv4 encapsulated in IPv6. Source and destination are from\
+| | ... | configured domains. Check if VPP translate IPv6 addresses.
+| | ... | [Ref] RFC7597.
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | And Vpp Route Add | ${dut_node} | :: | 0 | ${dut_ip6_gw}
+| | ... | ${dut_to_tg_if2} | resolve_attempts=${NONE} | count=${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6_gw}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add | ${dut_node} | 0.0.0.0 | 0 | ${dut_ip4_gw}
+| | ... | ${dut_to_tg_if1} | resolve_attempts=${NONE} | count=${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4_gw}
+| | ... | ${tg_to_dut_if1_mac}
+| | :FOR | ${domain_set} | IN | @{domain_sets}
+| | | When Map Add Domain | ${dut_node} | @{domain_set}
+| | ${ip_set_A}= | Get From List | ${ip_sets} | 0
+| | ${ip_set_B}= | Get From List | ${ip_sets} | 1
+| | ${ipv6_br}= | Get From List | ${ip_set_A} | 3
+| | ${port_A}= | Get From List | ${ip_set_A} | 2
+| | ${port_B}= | Get From List | ${ip_set_B} | 2
+| | ${ipv6_A}= | Get From List | ${ip_set_A} | 1
+| | ${ipv6_B}= | Get From List | ${ip_set_B} | 1
+| | ${ipv4_A}= | Get From List | ${ip_set_A} | 0
+| | ${ipv4_B}= | Get From List | ${ip_set_B} | 0
+| | Then Send IPv4 UDP In IPv6 And Check Headers For Lightweight Hairpinning
+| | ... | ${tg_node} | ${tg_to_dut_if2}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if2_mac}
+| | ... | ${ipv6_br} | ${ipv6_A}
+| | ... | ${ipv4_B} | ${ipv4_A}
+| | ... | ${port_B} | ${port_A}
+| | ... | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac}
+| | ... | ${ipv6_B} | ${ipv6_br}
+
+
+| TC08: Encapsulate IPv4 ICMP into IPv6
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Enc] Eth-IPv4-ICMP(type 0 and 8) on TG_if1-DUT, Eth-IPv6-IPv4-ICMP\
+| | ... | on TG_if2_DUT.
+| | ... | [Cfg] Multiple MAP-E domains are configured, values from variable\
+| | ... | file.
+| | ... | [Ver] Make TG send non-encapsulated ICMP to DUT; verify TG received\
+| | ... | IPv4oIPv6 encapsulated packet is correct. Checks IPv6 destination\
+| | ... | based on ICMP Identifier field.
+| | ... | [Ref] RFC7597 section 8.2.
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | And Vpp Route Add | ${dut_node} | :: | 0 | ${dut_ip6_gw}
+| | ... | ${dut_to_tg_if2} | resolve_attempts=${NONE} | count=${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6_gw}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add | ${dut_node} | 0.0.0.0 | 0 | ${dut_ip4_gw}
+| | ... | ${dut_to_tg_if1} | resolve_attempts=${NONE} | count=${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4_gw}
+| | ... | ${tg_to_dut_if1_mac}
+| | :FOR | ${domain_set} | IN | @{domain_sets}
+| | | When Map Add Domain | ${dut_node} | @{domain_set}
+| | ${ip_set_A}= | Get From List | ${ip_sets} | 0
+| | ${ipv4_A}= | Get From List | ${ip_set_A} | 0
+| | ${ipv6_A}= | Get From List | ${ip_set_A} | 1
+| | ${icmp_id_A}= | Get From List | ${ip_set_A} | 2
+| | ${ipv6_br}= | Get From List | ${ip_set_A} | 3
+| | Then Send IPv4 ICMP And Check Headers For Lightweight 4over6
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if1_mac} | ${ipv4_A} | ${ipv4_outside}
+| | ... | ${icmp_id_A} | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac}
+| | ... | ${ipv6_A} | ${ipv6_br}
+
+
+| TC09: Repeated ip neighbor command doesnt put FIB to broken state
+| | [Documentation] |
+| | ... | Original issue described in https://jira.fd.io/browse/VPP-312.
+| | ... | [Top] TG=DUT1.
+| | ... | [Cfg] IP address are set on interfaces, ip neighbor multiple times
+| | ... | [Ver] FIB is not in broken state. The steps are add route, \
+| | ... | check with traffic then add same route
+| | ... | again and check with traffic script.
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | When Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | And Vpp Route Add | ${dut_node} | 2001:: | 16 | ${dut_ip6_gw}
+| | ... | ${dut_to_tg_if2} | resolve_attempts=${NONE} | count=${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6_gw}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add | ${dut_node} | 0.0.0.0 | 0 | ${dut_ip4_gw}
+| | ... | ${dut_to_tg_if1} | resolve_attempts=${NONE} | count=${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4_gw}
+| | ... | ${tg_to_dut_if1_mac}
+| | Then Check MAP Configuration With Traffic Script
+| | ... | 20.0.0.0/8 | 2001::/16 | ${ipv6_br_src} | ${48} | ${6} | ${8}
+| | ... | 20.169.201.219 | ${1232} | 2001:a9c9:db34::14a9:c9db:34
+| | When Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | And Vpp Route Add | ${dut_node} | 2001:: | 16 | ${dut_ip6_gw}
+| | ... | ${dut_to_tg_if2} | resolve_attempts=${NONE} | count=${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6_gw}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp Route Add | ${dut_node} | 0.0.0.0 | 0 | ${dut_ip4_gw}
+| | ... | ${dut_to_tg_if1} | resolve_attempts=${NONE} | count=${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4_gw}
+| | ... | ${tg_to_dut_if1_mac}
+| | Then Check MAP Configuration With Traffic Script
+| | ... | 20.0.0.0/8 | 2001::/16 | ${ipv6_br_src} | ${48} | ${6} | ${8}
+| | ... | 20.169.201.219 | ${1232} | 2001:a9c9:db34::14a9:c9db:34
+
+
+| Bug: VPP-318
+| | [Tags] | EXPECTED_FAILING
+| | [Documentation] | qlen < psid length
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | Then Run Keyword And Expect Error | Unable to add map domain *
+| | ... | Map Add Domain | ${dut_node} | 20.169.0.0/16 | 2001:db8::/32
+| | ... | ${ipv6_br_src} | ${20} | ${6} | ${8}
+
+
+*** Keywords ***
+| Set Interfaces IP Addresses And Routes
+| | Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Set interfaces in 2-node circular topology up
+| | Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | Vpp Route Add | ${dut_node} | :: | 0 | ${dut_ip6_gw} | ${dut_to_tg_if2}
+| | ... | resolve_attempts=${NONE} | count=${NONE}
+| | Add IP Neighbor | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6_gw}
+| | ... | ${tg_to_dut_if2_mac}
+| | Vpp Route Add | ${dut_node} | ${ipv4_outside} | 32 | ${dut_ip4_gw}
+| | ... | ${dut_to_tg_if1} | resolve_attempts=${NONE} | count=${NONE}
+| | Add IP Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4_gw}
+| | ... | ${tg_to_dut_if1_mac}
+
+| Check MAP Configuration With Traffic Script
+| | [Documentation]
+| | ... | Used as a test case template.\
+| | ... | Configure MAP-E domain with given parameters, with traffic script send
+| | ... | UDP in IPv4 packet to given UDP destination port and IP destination
+| | ... | address and check if correctly received IPv6 packet. Vice versa send
+| | ... | IPv6 packet and check if received IPv4 packet with correct source
+| | ... | address.
+| | ... | The MAP domain is deleted in teardown.
+| | ... | The expected IPv6 address is compared with computed IPv6 address.
+| | [Arguments] | ${ipv4_pfx} | ${ipv6_pfx} | ${ipv6_br_src} | ${ea_bit_len}
+| | ... | ${psid_offset} | ${psid_len} | ${ipv4_dst} | ${dst_port}
+| | ... | ${expected_ipv6_dst}=${EMPTY}
+| | ${domain_index}= | Map Add Domain | ${dut_node} | ${ipv4_pfx} | ${ipv6_pfx}
+| | ... | ${ipv6_br_src} | ${ea_bit_len} | ${psid_offset} | ${psid_len}
+| | ${computed_ipv6_dst}= | Compute IPv6 Map Destination Address
+| | ... | ${ipv4_pfx} | ${ipv6_pfx} | ${ea_bit_len} | ${psid_offset}
+| | ... | ${psid_len} | ${ipv4_dst} | ${dst_port}
+| | ${ipv6_dst}= | Run Keyword If | "${expected_ipv6_dst}" == "${EMPTY}"
+| | ... | Set Variable | ${computed_ipv6_dst}
+| | ... | ELSE | Set Variable | ${expected_ipv6_dst}
+| | Run Keyword If | "${expected_ipv6_dst}" != "${EMPTY}"
+| | ... | IP Addresses Should Be Equal
+| | ... | ${computed_ipv6_dst} | ${expected_ipv6_dst}
+| | ${ipv6_dst}= | Set Variable | ${computed_ipv6_dst}
+| | Check Encapsulation With Traffic Script
+| | ... | ${ipv4_dst} | ${dst_port} | ${ipv6_dst}
+| | Check Decapsulation With Traffic Script
+| | ... | ${ipv6_dst} | ${ipv4_dst} | ${dst_port}
+| | [Teardown] | Run Keywords
+| | ... | Map Del Domain | ${dut_node} | ${domain_index} | AND
+| | ... | Show Packet Trace On All DUTs | ${nodes} | AND
+| | ... | Clear Packet Trace On All DUTs | ${nodes} | AND
+| | ... | Verify VPP PID in Teardown
+
+| Check Encapsulation With Traffic Script
+| | [Arguments] | ${ipv4_dst} | ${dst_port} | ${ipv6_dst}
+| | Send IPv4 UDP And Check Headers For Lightweight 4over6
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if1_mac} | ${ipv4_dst} | ${ipv4_outside}
+| | ... | ${dst_port} | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac}
+| | ... | ${ipv6_dst} | ${ipv6_br_src}
+
+| Check Decapsulation With Traffic Script
+| | [Arguments] | ${ipv6_ce_addr} | ${ipv4_inside} | ${port}
+| | Send IPv4 UDP In IPv6 And Check Headers For Lightweight 4over6
+| | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if1}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2_mac}
+| | ... | ${ipv6_br_src} | ${ipv6_ce_addr}
+| | ... | ${ipv4_outside} | ${ipv4_inside} | ${port}
+| | ... | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
diff --git a/tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swiremapt-func.robot b/tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swiremapt-func.robot
new file mode 100644
index 0000000000..89ff28af38
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/softwire/eth2p-ethip4--ethip6ip4-ip4base--ip6base-swiremapt-func.robot
@@ -0,0 +1,135 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/ip/map.robot
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| Test Setup | Run Keywords | Set up functional test
+| ... | AND | Set interfaces IP addresses and routes
+| Test Teardown | Tear down functional test
+| Documentation | *Test for Basic mapping rule for MAP-T*\
+| ... | *[Top] Network Topologies:* TG - DUT1 - TG with two links between the
+| ... | nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP on TG-to-DUT-if1.
+| ... | Eth-IPv6-UDP on TG-to-DUT-if2.
+| ... | *[Cfg] DUT configuration:* DUT is configured with IPv4 on one DUT-to-TG
+| ... | interface and IPv6 address on second DUT-to-TG interface. MAP-T domain
+| ... | is configured in test template based on test parameters.
+| ... | *[Ver] TG verification:* UDP packets in IPv4 are sent by TG to
+| ... | destination in MAP domain. IPv6 packets with translated IPv4 addresses
+| ... | are received on TG interface.
+| ... | *[Ref] Applicable standard specifications:* RFC7599
+
+
+*** Variables ***
+| ${dut_ip4}= | 10.0.0.1
+| ${dut_ip6}= | 2001:0::1
+| ${dut_ip4_gw}= | 10.0.0.2
+| ${dut_ip6_gw}= | 2001:0::2
+| ${ipv4_prefix_len}= | 24
+| ${ipv6_prefix_len}= | 64
+| ${ipv6_br_src}= | 2001:db8:ffff::/96
+
+
+*** Test Cases ***
+| TC01: MAP-T test
+| | [Documentation] |
+| | ... | Test to check map-t address translation.
+| | ...
+| | ... | Arguments:
+| | ...
+| | ... | - ipv4_pfx
+| | ... | - ipv6_dst_pfx
+| | ... | - ipv6_src_pfx
+| | ... | - ea_bit_len
+| | ... | - psid_offset
+| | ... | - psid_len
+| | ... | - ipv4_src
+| | ... | - ipv4_dst
+| | ... | - dst_port
+| | ...
+| | [Template] | Check MAP-T configuration with traffic script
+# |===================|===============|================|============|=============|==========|===========|================|==========|
+# | ipv4_pfx | ipv6_dst_pfx | ipv6_src_pfx | ea_bit_len | psid_offset | psid_len | ipv4_src | ipv4_dst | dst_port |
+# |===================|===============|================|============|=============|==========|===========|================|==========|
+| | 20.169.0.0/16 | 2001::/16 | ${ipv6_br_src} | ${40} | ${0} | ${0} | 100.0.0.1 | 20.169.201.219 | ${1232} |
+| | 20.169.201.219/32 | 2001:db8::/32 | ${ipv6_br_src} | ${0} | ${0} | ${0} | 100.0.0.1 | 20.169.201.219 | ${1232} |
+| | 20.0.0.0/8 | 2001:db8::/40 | ${ipv6_br_src} | ${24} | ${0} | ${0} | 100.0.0.1 | 20.169.201.219 | ${1232} |
+#| | 20.169.201.0/32 | 2001:db8::/32 | ${ipv6_br_src} | ${0} | ${6} | ${8} | 100.0.0.1 | 20.169.201.219 | ${1232} |
+#| | 20.169.201.0/24 | 2001:db8::/32 | ${ipv6_br_src} | ${0} | ${6} | ${8} | 100.0.0.1 | 20.169.201.219 | ${1232} |
+
+
+*** Keywords ***
+| Set interfaces IP addresses and routes
+| | Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Set interfaces in 2-node circular topology up
+| | Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4} | ${ipv4_prefix_len}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6} | ${ipv6_prefix_len}
+| | Vpp Route Add | ${dut_node} | :: | 0 | ${dut_ip6_gw} | ${dut_to_tg_if2}
+| | ... | resolve_attempts=${NONE} | count=${NONE}
+| | Add IP neighbor | ${dut_node} | ${dut_to_tg_if2} | ${dut_ip6_gw}
+| | ... | ${tg_to_dut_if2_mac}
+| | Vpp Route Add | ${dut_node} | 0.0.0.0 | 0 | ${dut_ip4_gw} | ${dut_to_tg_if1}
+| | ... | resolve_attempts=${NONE} | count=${NONE}
+| | Add IP neighbor | ${dut_node} | ${dut_to_tg_if1} | ${dut_ip4_gw}
+| | ... | ${tg_to_dut_if1_mac}
+
+| Check MAP-T configuration with traffic script
+| | [Documentation] |
+| | ... | Used as a test case template.\
+| | ... | Configure MAP-T domain with given parameters, with traffic script send
+| | ... | UDP in IPv4 packet to given UDP destination port and IP destination
+| | ... | address and check if correctly received IPv6 packet with translated
+| | ... | source and destination addresses. Vice versa send IPv6 packet and
+| | ... | check if received IPv4 packet with correct source and destination
+| | ... | addresses.
+| | ... | The MAP domain is deleted in teardown.
+| | [Arguments] | ${ipv4_pfx} | ${ipv6_dst_pfx} | ${ipv6_src_pfx}
+| | ... | ${ea_bit_len} | ${psid_offset} | ${psid_len}
+| | ... | ${ipv4_outside} | ${ipv4_inside} | ${dst_port}
+| | ${domain_index}= | Map Add Domain | ${dut_node} | ${ipv4_pfx}
+| | ... | ${ipv6_dst_pfx} | ${ipv6_src_pfx} | ${ea_bit_len} | ${psid_offset}
+| | ... | ${psid_len} | ${TRUE}
+| | ${ipv6_ce_addr}= | Compute IPv6 map destination address
+| | ... | ${ipv4_pfx} | ${ipv6_dst_pfx} | ${ea_bit_len} | ${psid_offset}
+| | ... | ${psid_len} | ${ipv4_inside} | ${dst_port}
+| | ${ipv6_br_addr}= | Compute IPv6 map source address
+| | ... | ${ipv6_src_pfx} | ${ipv4_outside}
+# Check translation from v4 to v6 with traffic script
+| | Send IPv4 UDP and check IPv6 headers for MAP-T
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if1_mac} | ${ipv4_inside} | ${ipv4_outside} | ${dst_port}
+| | ... | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac}
+| | ... | ${ipv6_ce_addr} | ${ipv6_br_addr}
+# Check translation from v6 to v4 with traffic script
+| | Send IPv6 UDP and check IPv4 headers for MAP-T
+| | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if1}
+| | ... | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2_mac}
+| | ... | ${ipv6_br_addr} | ${ipv6_ce_addr}
+| | ... | ${dst_port}
+| | ... | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${ipv4_outside} | ${ipv4_inside}
+| | [Teardown] | Run Keywords
+| | ... | Map Del Domain | ${dut_node} | ${domain_index} | AND
+| | ... | Show packet trace on all DUTs | ${nodes} | AND
+| | ... | Clear packet trace on all DUTs | ${nodes} | AND
+| | ... | Verify VPP PID in Teardown
diff --git a/tests/vpp/func/ip4_tunnels/vxlan/eth2p-dot1qip4vxlan-l2bdbasemaclrn-func.robot b/tests/vpp/func/ip4_tunnels/vxlan/eth2p-dot1qip4vxlan-l2bdbasemaclrn-func.robot
new file mode 100644
index 0000000000..e4c8c25f0a
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/vxlan/eth2p-dot1qip4vxlan-l2bdbasemaclrn-func.robot
@@ -0,0 +1,74 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/overlay/vxlan.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | HW_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *RFC7348 VXLAN: Bridge-domain with VXLAN over VLAN test cases*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1-DUT2-TG 3-node circular topology with
+| ... | single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1q-IPv4-VXLAN-Eth-IPv4-ICMPv4 on
+| ... | DUT1-DUT2, Eth-dot1q-IPv4-ICMPv4 on TG-DUTn for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) switching combined with static MACs, MAC learning
+| ... | enabled and Split Horizon Groups (SHG) depending on test case; VXLAN
+| ... | tunnels are configured between L2BDs on DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are
+| ... | sent in both directions by TG on links to DUT1 and DUT2; on receive TG
+| ... | verifies packets for correctness and their IPv4 src-addr, dst-addr and
+| ... | MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC7348.
+
+*** Variables ***
+| ${VNI}= | 23
+| ${BID}= | 23
+| ${VLAN}= | 10
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD and VXLANoIPv4oVLAN tunnels switch ICMPv4 between TG links
+| | [Tags] | EXPECTED_FAILING
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-VXLAN-Eth-IPv4-ICMPv4 on\
+| | ... | DUT1-DUT2; Eth-IPv4-ICMPv4 on TG-DUTn. [Cfg] On DUT1 and DUT2
+| | ... | configure L2 bridge-domain (MAC learning enabled), each with one
+| | ... | interface to TG and one VXLAN tunnel interface towards the other DUT
+| | ... | over VLAN sub-interface. [Ver] Make TG send ICMPv4 Echo Req between
+| | ... | two of its interfaces, verify all packets are received. [Ref] RFC7348.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Create vlan interfaces for VXLAN | ${VLAN}
+| | ... | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${dut2_node} | ${dut2_to_dut1}
+| | And Configure IP addresses and neighbors on interfaces
+| | ... | ${dut1_node} | ${dut1s_vlan_name} | ${dut1s_vlan_index}
+| | ... | ${dut2_node} | ${dut2s_vlan_name} | ${dut2s_vlan_index}
+| | ${dut1s_vxlan}= | When Create VXLAN interface | ${dut1_node} | ${VNI}
+| | | ... | ${dut1s_ip_address} | ${dut2s_ip_address}
+| | And Set Interface State | ${dut1_node} | ${dut1s_vxlan} | up
+| | And Add interfaces to L2BD | ${dut1_node} | ${BID}
+| | ... | ${dut1_to_tg} | ${dut1s_vxlan}
+| | ${dut2s_vxlan}= | And Create VXLAN interface | ${dut2_node} | ${VNI}
+| | | ... | ${dut2s_ip_address} | ${dut1s_ip_address}
+| | And Set Interface State | ${dut2_node} | ${dut2s_vxlan} | up
+| | And Add interfaces to L2BD | ${dut2_node} | ${BID}
+| | ... | ${dut2_to_tg} | ${dut2s_vxlan}
+| | Then Send ICMPv4 bidirectionally and verify received packets
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
diff --git a/tests/vpp/func/ip4_tunnels/vxlan/eth2p-ethip4vxlan-l2bdbasemaclrn-func.robot b/tests/vpp/func/ip4_tunnels/vxlan/eth2p-ethip4vxlan-l2bdbasemaclrn-func.robot
new file mode 100644
index 0000000000..32014e5985
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/vxlan/eth2p-ethip4vxlan-l2bdbasemaclrn-func.robot
@@ -0,0 +1,78 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/overlay/vxlan.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/vm/double_qemu_setup.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | HW_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *Bridge-domain with VXLAN test cases - IPv4*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-IPv4-VXLAN-Eth-IPv4-ICMPv4 on
+| ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) switching combined with MAC learning enabled;
+| ... | VXLAN tunnels are configured between L2BDs on DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent
+| ... | in both directions by TG on links to DUT1 and DUT2; on receive TG
+| ... | verifies packets for correctness and their IPv4 src-addr, dst-addr
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC7348.
+
+*** Variables ***
+| ${vni_1}= | 23
+| ${vni_2}= | 35
+
+| ${bd_id1}= | 10
+| ${bd_id2}= | 20
+| ${bd_id3}= | 30
+| ${shg1}= | 1
+| ${shg2}= | 2
+
+| ${ip4_addr1}= | 172.16.0.1
+| ${ip4_addr2}= | 172.16.0.2
+| ${ip4_prefix}= | 24
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD and VXLANoIPv4 tunnels switch ICMPv4 between TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-VXLAN-Eth-IPv4-ICMPv4 on \
+| | ... | DUT1-DUT2; Eth-IPv4-ICMPv4 on TG-DUTn. [Cfg] On DUT1 and DUT2
+| | ... | configure two i/fs into L2BD with MAC learning. [Ver] Make TG
+| | ... | verify ICMPv4 Echo Req pkts are switched thru DUT1 and DUT2 in
+| | ... | both directions and are correct on receive. [Ref] RFC7348.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${dut1_to_dut2_name}= | Get interface name | ${dut1_node} | ${dut1_to_dut2}
+| | ${dut2_to_dut1_name}= | Get interface name | ${dut2_node} | ${dut2_to_dut1}
+| | And Configure IP addresses and neighbors on interfaces | ${dut1_node} | ${dut1_to_dut2_name} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1_name} | ${NONE}
+| | ${dut1s_vxlan}= | When Create VXLAN interface | ${dut1_node} | ${vni_1}
+| | | ... | ${dut1s_ip_address} | ${dut2s_ip_address}
+| | And Add interfaces to L2BD | ${dut1_node} | ${bd_id1}
+| | ... | ${dut1_to_tg} | ${dut1s_vxlan}
+| | ${dut2s_vxlan}= | And Create VXLAN interface | ${dut2_node} | ${vni_1}
+| | | ... | ${dut2s_ip_address} | ${dut1s_ip_address}
+| | And Add interfaces to L2BD | ${dut2_node} | ${bd_id1}
+| | ... | ${dut2_to_tg} | ${dut2s_vxlan}
+| | Then Send ICMPv4 bidirectionally and verify received packets
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
diff --git a/tests/vpp/func/ip4_tunnels/vxlan/eth2p-ethip4vxlan-l2xcbase-func.robot b/tests/vpp/func/ip4_tunnels/vxlan/eth2p-ethip4vxlan-l2xcbase-func.robot
new file mode 100644
index 0000000000..aa88be5731
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/vxlan/eth2p-ethip4vxlan-l2xcbase-func.robot
@@ -0,0 +1,66 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/overlay/vxlan.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | HW_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *RFC7348 VXLAN: L2 cross-connect with VXLAN test cases*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-IPv4-VXLAN-Eth-IPv4-ICMPv4 on
+| ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | cross-connect (L2XC) switching; VXLAN tunnels are configured between
+| ... | L2XCs on DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets
+| ... | are sent in both directions by TG on links to DUT1 and DUT2; on receive
+| ... | TG verifies packets for correctness and their IPv4 src-addr, dst-addr
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC7348.
+
+*** Variables ***
+| ${VNI}= | 24
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2XC and VXLANoIPv4 tunnels switch ICMPv4 between TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-VXLAN-Eth-IPv4-ICMPv4 on \
+| | ... | [Ref] RFC7348.DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn. [Cfg] On
+| | ... | DUT1 and DUT2 configure L2 cross-connect (L2XC), each with one
+| | ... | interface to TG and one VXLAN tunnel interface towards the other
+| | ... | DUT. [Ver] Make TG send ICMPv4 Echo Req between two of its
+| | ... | interfaces; verify all packets are received. [Ref] RFC7348.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${dut1_to_dut2_name}= | Get interface name | ${dut1_node} | ${dut1_to_dut2}
+| | ${dut2_to_dut1_name}= | Get interface name | ${dut2_node} | ${dut2_to_dut1}
+| | And Configure IP addresses and neighbors on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2_name} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1_name} | ${NONE}
+| | ${dut1s_vxlan}= | When Create VXLAN interface | ${dut1_node} | ${VNI}
+| | | ... | ${dut1s_ip_address} | ${dut2s_ip_address}
+| | And Configure L2XC | ${dut1_node} | ${dut1_to_tg} | ${dut1s_vxlan}
+| | ${dut2s_vxlan}= | And Create VXLAN interface | ${dut2_node} | ${VNI}
+| | | ... | ${dut2s_ip_address} | ${dut1s_ip_address}
+| | And Configure L2XC | ${dut2_node} | ${dut2_to_tg} | ${dut2s_vxlan}
+| | Then Send ICMPv4 bidirectionally and verify received packets
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
diff --git a/tests/vpp/func/ip4_tunnels/vxlan/eth4p-ethip4vxlan-l2bdbasemaclrn-l2shg-func.robot b/tests/vpp/func/ip4_tunnels/vxlan/eth4p-ethip4vxlan-l2bdbasemaclrn-l2shg-func.robot
new file mode 100644
index 0000000000..8fd608eada
--- /dev/null
+++ b/tests/vpp/func/ip4_tunnels/vxlan/eth4p-ethip4vxlan-l2bdbasemaclrn-l2shg-func.robot
@@ -0,0 +1,200 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/overlay/vxlan.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/vm/double_qemu_setup.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | HW_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2BD with SHG combined with VXLAN test cases - IPv4*
+| ...
+| ... | *[Top] Network topologies:* TG=DUT1=DUT2=TG 3-node circular topology
+| ... | with double parallel links.
+| ... | *[Enc] Packet encapsulations:* Eth-IPv4-VXLAN-Eth-IPv4-ICMPv4 on
+| ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) switching combined with MAC learning enabled
+| ... | and Split Horizon Groups (SHG); VXLAN tunnels are configured
+| ... | between L2BDs on DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent
+| ... | in both directions by TG on links to DUT1 and DUT2; on receive TG
+| ... | verifies packets for correctness and their IPv4 src-addr, dst-addr
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC7348.
+
+*** Variables ***
+| ${vni_1}= | 23
+| ${vni_2}= | 35
+
+| ${bd_id1}= | 10
+| ${bd_id2}= | 20
+| ${bd_id3}= | 30
+| ${shg1}= | 1
+| ${shg2}= | 2
+
+| ${ip4_addr1}= | 172.16.0.1
+| ${ip4_addr2}= | 172.16.0.2
+| ${ip4_prefix}= | 24
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD and VXLANoIPv4 tunnels in SHG switch ICMPv4 between TG links
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG. [Enc] Eth-IPv4-VXLAN-Eth-IPv4-ICMPv4 on \
+| | ... | DUT1-DUT2; Eth-IPv4-ICMPv4 on TG-DUTn. [Cfg] On DUT1 configure L2
+| | ... | bridge-domain (MAC learning enabled) with two untagged interfaces
+| | ... | to TG and two VXLAN interfaces towards the DUT2 and put both VXLAN
+| | ... | interfaces into the same Split-Horizon-Group (SHG). On DUT2 configure
+| | ... | two L2 bridge-domain (MAC learning enabled), each with one untagged
+| | ... | interface to TG and one VXLAN interface towards the DUT1. [Ver] Make
+| | ... | TG send ICMPv4 Echo Reqs between all four of its interfaces to be
+| | ... | switched by DUT1 and DUT2; verify packets are not switched between
+| | ... | TG interfaces connected to DUT2 that are isolated by SHG on DUT1.
+| | ... | [Ref] RFC7348.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path for 3-node BD-SHG test | ${nodes['TG']}
+| | ... | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']}
+| | And Set interfaces in 3-node BD-SHG test up
+| | And Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${ip4_addr1}
+| | ... | ${ip4_prefix}
+| | And Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${ip4_addr2}
+| | ... | ${ip4_prefix}
+| | And VPP IP Probe | ${dut1_node} | ${dut1_to_dut2} | ${ip4_addr2}
+| | And VPP IP Probe | ${dut2_node} | ${dut2_to_dut1} | ${ip4_addr1}
+| | ${dut1s_vxlan1}= | When Create VXLAN interface | ${dut1_node} | ${vni_1}
+| | | ... | ${ip4_addr1} | ${ip4_addr2}
+| | ${dut1s_vxlan2}= | And Create VXLAN interface | ${dut1_node} | ${vni_2}
+| | | ... | ${ip4_addr1} | ${ip4_addr2}
+| | ${dut2s_vxlan1}= | And Create VXLAN interface | ${dut2_node} | ${vni_1}
+| | | ... | ${ip4_addr2} | ${ip4_addr1}
+| | ${dut2s_vxlan2}= | And Create VXLAN interface | ${dut2_node} | ${vni_2}
+| | | ... | ${ip4_addr2} | ${ip4_addr1}
+| | And Set Interface State | ${dut1_node} | ${dut1s_vxlan1} | up
+| | And Set Interface State | ${dut1_node} | ${dut1s_vxlan2} | up
+| | And Set Interface State | ${dut2_node} | ${dut2s_vxlan1} | up
+| | And Set Interface State | ${dut2_node} | ${dut2s_vxlan2} | up
+| | And Vpp Node Interfaces Ready Wait | ${dut1_node}
+| | And Vpp Node Interfaces Ready Wait | ${dut2_node}
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg_if2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1s_vxlan1}
+| | ... | ${bd_id1} | ${shg1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1s_vxlan2}
+| | ... | ${bd_id1} | ${shg1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg_if1}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2s_vxlan1}
+| | ... | ${bd_id2}
+| | And Create bridge domain | ${dut2_node} | ${bd_id3}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg_if2}
+| | ... | ${bd_id3}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2s_vxlan2}
+| | ... | ${bd_id3}
+| | Then Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut2_if1}
+| | And Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut2_if2}
+| | And Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut2_if1}
+| | And Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut2_if2}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMPv4 bidirectionally and verify received packets
+| | | ... | ${tg_node} | ${tg_to_dut2_if1}
+| | | ... | ${tg_to_dut2_if2}
+
+| TC01: DUT1 and DUT2 with L2BD and VXLANoIPv4 tunnels in different SHGs switch ICMPv4 between TG links
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG.[Enc] Eth-IPv4-VXLAN-Eth-IPv4-ICMPv4 on \
+| | ... | DUT1-DUT2; Eth-IPv4-ICMPv4 on TG-DUTn. [Cfg] On DUT1 configure L2
+| | ... | bridge-domain (MAC learning enabled) with two untagged interfaces
+| | ... | to TG and two VXLAN interfaces towards the DUT2 and put both VXLAN
+| | ... | interfaces into the different Split-Horizon-Group (SHGs). On DUT2
+| | ... | configure two L2 bridge-domain (MAC learning enabled), each with one
+| | ... | untagged interface to TG and one VXLAN interface towards the DUT1.
+| | ... | [Ver] Make TG send ICMPv4 Echo Req between all four of its interfaces
+| | ... | to be switched by DUT1 and DUT2; verify packets are switched between
+| | ... | all TG interfaces. [Ref] RFC7348.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path for 3-node BD-SHG test | ${nodes['TG']}
+| | ... | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']}
+| | And Set interfaces in 3-node BD-SHG test up
+| | And Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${ip4_addr1}
+| | ... | ${ip4_prefix}
+| | And Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${ip4_addr2}
+| | ... | ${ip4_prefix}
+| | And VPP IP Probe | ${dut1_node} | ${dut1_to_dut2} | ${ip4_addr2}
+| | And VPP IP Probe | ${dut2_node} | ${dut2_to_dut1} | ${ip4_addr1}
+| | ${dut1s_vxlan1}= | When Create VXLAN interface | ${dut1_node} | ${vni_1}
+| | | ... | ${ip4_addr1} | ${ip4_addr2}
+| | ${dut1s_vxlan2}= | And Create VXLAN interface | ${dut1_node} | ${vni_2}
+| | | ... | ${ip4_addr1} | ${ip4_addr2}
+| | ${dut2s_vxlan1}= | And Create VXLAN interface | ${dut2_node} | ${vni_1}
+| | | ... | ${ip4_addr2} | ${ip4_addr1}
+| | ${dut2s_vxlan2}= | And Create VXLAN interface | ${dut2_node} | ${vni_2}
+| | | ... | ${ip4_addr2} | ${ip4_addr1}
+| | And Set Interface State | ${dut1_node} | ${dut1s_vxlan1} | up
+| | And Set Interface State | ${dut1_node} | ${dut1s_vxlan2} | up
+| | And Set Interface State | ${dut2_node} | ${dut2s_vxlan1} | up
+| | And Set Interface State | ${dut2_node} | ${dut2s_vxlan2} | up
+| | And Vpp Node Interfaces Ready Wait | ${dut1_node}
+| | And Vpp Node Interfaces Ready Wait | ${dut2_node}
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg_if2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1s_vxlan1}
+| | ... | ${bd_id1} | ${shg1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1s_vxlan2}
+| | ... | ${bd_id1} | ${shg2}
+| | And Create bridge domain | ${dut2_node} | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg_if1}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2s_vxlan1}
+| | ... | ${bd_id2}
+| | And Create bridge domain | ${dut2_node} | ${bd_id3}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg_if2}
+| | ... | ${bd_id3}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2s_vxlan2}
+| | ... | ${bd_id3}
+| | Then Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut2_if1}
+| | And Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut2_if2}
+| | And Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut2_if1}
+| | And Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut2_if2}
+| | And Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut2_if1}
+| | ... | ${tg_to_dut2_if2}
diff --git a/tests/vpp/func/ip6/eth2p-ethip6-ip6base-copblklistbase-func.robot b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-copblklistbase-func.robot
new file mode 100644
index 0000000000..f4314500e5
--- /dev/null
+++ b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-copblklistbase-func.robot
@@ -0,0 +1,101 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.Cop
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Variables | resources/libraries/python/IPv6NodesAddr.py | ${nodes}
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *COP Security IPv6 Blacklist Tests*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-ICMPv6 on all links.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv6 routing and
+| ... | static routes. COP security black-lists are applied on DUT1 ingress
+| ... | interface from TG. DUT2 is configured with L2XC.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets are sent in
+| ... | one direction by TG on link to DUT1; on receive TG verifies packets for
+| ... | correctness and drops as applicable.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${tg_node}= | ${nodes['TG']}
+| ${dut1_node}= | ${nodes['DUT1']}
+| ${dut2_node}= | ${nodes['DUT2']}
+
+| ${dut1_if1_ip}= | 3ffe:62::1
+| ${dut1_if2_ip}= | 3ffe:63::1
+| ${dut1_if1_ip_GW}= | 3ffe:62::2
+| ${dut1_if2_ip_GW}= | 3ffe:63::2
+
+| ${dut2_if1_ip}= | 3ffe:72::1
+| ${dut2_if2_ip}= | 3ffe:73::1
+
+| ${test_dst_ip}= | 3ffe:64::1
+| ${test_src_ip}= | 3ffe:61::1
+
+| ${cop_dut_ip}= | 3ffe:61::
+
+| ${ip_prefix}= | 64
+
+| ${nodes_ipv6_addresses}= | ${nodes_ipv6_addr}
+
+| ${fib_table_number}= | 1
+
+*** Test Cases ***
+| TC01: DUT drops IPv6 pkts with COP blacklist set with IPv6 src-addr
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv6-ICMPv6. [Cfg] On DUT1 \
+| | ... | configure interface IPv6 addresses and routes in the main
+| | ... | routing domain, add COP blacklist on interface to TG with IPv6
+| | ... | src-addr matching packets generated by TG; on DUT2 configure L2
+| | ... | xconnect. [Ver] Make TG send ICMPv6 Echo Req on its interface to
+| | ... | DUT1; verify no ICMPv6 Echo Req pkts are received. [Ref]
+| | Given Configure path in 3-node circular topology
+| | ... | ${tg_node} | ${dut1_node} | ${dut2_node} | ${tg_node}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And VPP Set IF IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_if1_ip} | ${ip_prefix}
+| | And VPP Set IF IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if2_ip} | ${ip_prefix}
+| | And VPP Set IF IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_if1_ip} | ${ip_prefix}
+| | And VPP Set IF IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_if2_ip} | ${ip_prefix}
+| | And Add IP Neighbor
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_if1_ip_GW} | ${tg_to_dut1_mac}
+| | And Add IP Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if2_ip_GW} | ${tg_to_dut2_mac}
+| | And Vpp Route Add | ${dut1_node}
+| | ... | ${test_dst_ip} | ${ip_prefix} | ${dut1_if2_ip_GW} | ${dut1_to_dut2}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | And Add fib table | ${dut1_node}
+| | ... | ${cop_dut_ip} | ${ip_prefix} | ${fib_table_number} | drop
+| | When COP Add whitelist Entry
+| | ... | ${dut1_node} | ${dut1_to_tg} | ip6 | ${fib_table_number}
+| | And COP interface enable or disable | ${dut1_node} | ${dut1_to_tg} | enable
+| | Then Packet transmission from port to port should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2} | ${dut1_to_dut2_mac}
+| | ... | ${tg_to_dut2_mac}
diff --git a/tests/vpp/func/ip6/eth2p-ethip6-ip6base-copwhlistbase-func.robot b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-copwhlistbase-func.robot
new file mode 100644
index 0000000000..a60aa7760c
--- /dev/null
+++ b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-copwhlistbase-func.robot
@@ -0,0 +1,101 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.Cop
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Variables | resources/libraries/python/IPv6NodesAddr.py | ${nodes}
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *COP Security IPv6 Whitelist Tests*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-ICMPv6 on all links.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv6 routing and
+| ... | static routes. COP security white-lists are applied on DUT1 ingress
+| ... | interface from TG. DUT2 is configured with L2XC.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets are sent in
+| ... | one direction by TG on link to DUT1; on receive TG verifies packets for
+| ... | correctness and drops as applicable.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${tg_node}= | ${nodes['TG']}
+| ${dut1_node}= | ${nodes['DUT1']}
+| ${dut2_node}= | ${nodes['DUT2']}
+
+| ${dut1_if1_ip}= | 3ffe:62::1
+| ${dut1_if2_ip}= | 3ffe:63::1
+| ${dut1_if1_ip_GW}= | 3ffe:62::2
+| ${dut1_if2_ip_GW}= | 3ffe:63::2
+
+| ${dut2_if1_ip}= | 3ffe:72::1
+| ${dut2_if2_ip}= | 3ffe:73::1
+
+| ${test_dst_ip}= | 3ffe:64::1
+| ${test_src_ip}= | 3ffe:61::1
+
+| ${cop_dut_ip}= | 3ffe:61::
+
+| ${ip_prefix}= | 64
+
+| ${nodes_ipv6_addresses}= | ${nodes_ipv6_addr}
+
+| ${fib_table_number}= | 1
+
+*** Test Cases ***
+| TC01: DUT permits IPv6 pkts with COP whitelist set with IPv6 src-addr
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv6-ICMPv6. [Cfg] On DUT1 \
+| | ... | configure interface IPv6 addresses and routes in the main
+| | ... | routing domain, add COP whitelist on interface to TG with IPv6
+| | ... | src-addr matching packets generated by TG; on DUT2 configure L2
+| | ... | xconnect. [Ver] Make TG send ICMPv6 Echo Req on its interface to
+| | ... | DUT1; verify received ICMPv6 Echo Req pkts are correct. [Ref]
+| | Given Configure path in 3-node circular topology
+| | ... | ${tg_node} | ${dut1_node} | ${dut2_node} | ${tg_node}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And VPP Set IF IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_if1_ip} | ${ip_prefix}
+| | And VPP Set IF IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if2_ip} | ${ip_prefix}
+| | And VPP Set IF IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_if1_ip} | ${ip_prefix}
+| | And VPP Set IF IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_if2_ip} | ${ip_prefix}
+| | And Add IP Neighbor
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_if1_ip_GW} | ${tg_to_dut1_mac}
+| | And Add IP Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if2_ip_GW} | ${tg_to_dut2_mac}
+| | And Vpp Route Add | ${dut1_node}
+| | ... | ${test_dst_ip} | ${ip_prefix} | ${dut1_if2_ip_GW} | ${dut1_to_dut2}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | And Add fib table | ${dut1_node} | ${cop_dut_ip} | ${ip_prefix} |
+| | ... | ${fib_table_number} | local
+| | When COP Add whitelist Entry | ${dut1_node} | ${dut1_to_tg} | ip6 |
+| | ... | ${fib_table_number}
+| | And COP interface enable or disable | ${dut1_node} | ${dut1_to_tg} | enable
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2} | ${dut1_to_dut2_mac}
+| | ... | ${tg_to_dut2_mac}
diff --git a/tests/vpp/func/ip6/eth2p-ethip6-ip6base-func.robot b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-func.robot
new file mode 100644
index 0000000000..bd0b2a6b64
--- /dev/null
+++ b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-func.robot
@@ -0,0 +1,120 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.Trace
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/counters.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Variables | resources/libraries/python/IPv6NodesAddr.py | ${nodes}
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | SKIP_VPP_PATCH
+| Suite Setup | Run Keywords
+| ... | Configure IPv6 on all DUTs in topology | ${nodes} | ${nodes_ipv6_addr} | AND
+| ... | Suppress ICMPv6 router advertisement message | ${nodes} | AND
+| ... | Configure IPv6 routing on all DUTs | ${nodes} | ${nodes_ipv6_addr} | AND
+| ... | Configure all TGs for traffic script
+| Test Setup | Run Keywords | Save VPP PIDs | AND
+| ... | Reset VAT History On All DUTs | ${nodes} | AND
+| ... | Clear interface counters on all vpp nodes in topology | ${nodes}
+| Test Teardown | Run Keywords
+| ... | Show packet trace on all DUTs | ${nodes} | AND
+| ... | Show VAT History On All DUTs | ${nodes} | AND
+| ... | Verify VPP PID in Teardown
+| Documentation | *IPv6 routing test cases*
+| ...
+| ... | RFC2460 IPv6, RFC4443 ICMPv6, RFC4861 Neighbor Discovery.
+| ... | Encapsulations: Eth-IPv6-ICMPv6 on links TG-DUT1, TG-DUT2, DUT1-DUT2;
+| ... | Eth-IPv6-NS/NA on links TG-DUT. IPv6 routing tests use circular 3-node
+| ... | topology TG - DUT1 - DUT2 - TG with one link between the nodes. DUT1 and
+| ... | DUT2 are configured with IPv6 routing and static routes. Test ICMPv6
+| ... | Echo Request packets are sent in both directions by TG on links to DUT1
+| ... | and DUT2 and received on TG links on the other side of circular
+| ... | topology. On receive TG verifies packets IPv6 src-addr, dst-addr and MAC
+| ... | addresses.
+
+*** Test Cases ***
+| TC01: DUT replies to ICMPv6 Echo Req to its ingress interface
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv6 Echo Req to DUT ingress interface. Make TG\
+| | ... | verify ICMPv6 Echo Reply is correct.
+| | Send IPv6 icmp echo request to DUT1 ingress inteface and verify answer | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes_ipv6_addr}
+
+| TC02: DUT replies to ICMPv6 Echo Req pkt with size 64B-to-1500B-incr-1B
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv6 Echo Reqs to DUT ingress interface,\
+| | ... | incrementating frame size from 64B to 1500B with increment step
+| | ... | of 1Byte. Make TG verify ICMP Echo Replies are correct.
+| | Execute IPv6 ICMP echo sweep | ${nodes['TG']} | ${nodes['DUT1']} | 0 | 1452 | 1 | ${nodes_ipv6_addr}
+
+| TC03: DUT replies to ICMPv6 Echo Req pkt with size 1500B-to-9000B-incr-10B
+| | [Documentation]
+| | ... | Make TG send ICMPv6 Echo Reqs to DUT ingress interface,\
+| | ... | incrementating frame size from 1500B to 9000B with increment
+| | ... | step of 10Bytes. Make TG verify ICMPv6 Echo Replies are correct.
+| | [Setup] | Configure MTU on TG based on MTU on DUT | ${nodes['TG']} | ${nodes['DUT1']}
+| | [Teardown] | Run keywords
+| | ... | Set default Ethernet MTU on all interfaces on node | ${nodes['TG']}
+| | ... | AND | Verify VPP PID in Teardown
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']}
+| | Compute Path
+| | ${dut_port} | ${dut_node}= | Last Interface
+| | ${mtu}= | Get Interface MTU | ${dut_node} | ${dut_port}
+| | # ICMPv6 payload size is frame size minus size of Ehternet header, FCS,
+| | # IPv6 header and ICMPv6 header
+| | ${end_size}= | Evaluate | ${mtu} - 14 - 4 - 40 - 8
+| | Run Keyword If | ${mtu} > 1518
+| | ... | Execute IPv6 ICMP echo sweep | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | 1452 | ${end_size} | 10 | ${nodes_ipv6_addr}
+
+| TC04: DUT routes to its egress interface
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv6 Echo Req towards DUT1 egress interface\
+| | ... | connected to DUT2. Make TG verify ICMPv6 Echo Reply is correct.
+| | Send IPv6 ICMP echo request to DUT1 egress interface and verify answer | ${nodes['TG']} | ${nodes['DUT1']} |
+| | ... | ${nodes['DUT2']} | ${nodes_ipv6_addr}
+
+| TC05: DUT1 routes to DUT2 ingress interface
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv6 Echo Req towards DUT2 ingress interface\
+| | ... | connected to DUT1. Make TG verify ICMPv6 Echo Reply is correct.
+| | Send IPv6 ICMP echo request to DUT2 via DUT1 and verify answer | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes_ipv6_addr}
+
+| TC06: DUT1 routes to DUT2 egress interface
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv6 Echo Req towards DUT2 egress interface\
+| | ... | connected to TG. Make TG verify ICMPv6 Echo Reply is correct.
+| | Send IPv6 ICMP echo request to DUT2 egress interface via DUT1 and verify answer | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes_ipv6_addr}
+
+| TC07: DUT1 and DUT2 route between TG interfaces
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across DUT1\
+| | ... | and DUT2. Make TG verify ICMPv6 Echo Replies are correct.
+| | Ipv6 tg to tg routed | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
+| | ... | ${nodes_ipv6_addr}
+
+| TC08: DUT replies to IPv6 Neighbor Solicitation
+| | [Tags] | VM_ENV
+| | [Documentation]
+| | ... | On DUT configure interface IPv6 address in the main routing\
+| | ... | domain. Make TG send Neighbor Solicitation message on the link
+| | ... | to DUT and verify DUT Neighbor Advertisement reply is correct.
+| | Send IPv6 neighbor solicitation and verify answer | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes_ipv6_addr}
diff --git a/tests/vpp/func/ip6/eth2p-ethip6-ip6base-iaclbase-func.robot b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-iaclbase-func.robot
new file mode 100644
index 0000000000..e0862ab9ef
--- /dev/null
+++ b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-iaclbase-func.robot
@@ -0,0 +1,577 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/counters.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Classify.Classify
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *IPv6 routing with ingress ACL test cases*
+| ...
+| ... | Encapsulations: Eth-IPv6 on links TG-DUT1, TG-DUT2, DUT1-DUT2. IPv6
+| ... | ingress ACL (iACL) tests use 3-node topology TG - DUT1 - DUT2 - TG with
+| ... | one link between the nodes. DUT1 and DUT2 are configured with IPv6
+| ... | routing and static routes. DUT1 is configured with iACL on link to TG,
+| ... | iACL classification and permit/deny action are configured on a per test
+| ... | case basis. Test ICMPv6 Echo Request packets are sent in one direction
+| ... | by TG on link to DUT1 and received on TG link to DUT2. On receive TG
+| ... | verifies if packets are dropped, or if received verifies packet IPv6
+| ... | src-addr, dst-addr and MAC addresses.
+
+*** Variables ***
+| ${dut1_to_tg_ip}= | 3ffe:62::1
+| ${dut1_to_dut2_ip}= | 3ffe:63::1
+| ${dut1_to_dut2_ip_GW}= | 3ffe:63::2
+| ${dut2_to_dut1_ip}= | 3ffe:72::1
+| ${dut2_to_tg_ip}= | 3ffe:73::1
+| ${test_dst_ip}= | 3ffe:64::1
+| ${test_src_ip}= | 3ffe:61::1
+| ${non_drop_dst_ip}= | 3ffe:54::1
+| ${non_drop_src_ip}= | 3ffe:51::1
+| ${prefix_length}= | 64
+| ${ip_version}= | ip6
+| ${l2_table}= | l2
+
+*** Test Cases ***
+| TC01: DUT with iACL IPv6 src-addr drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add source IPv6 address to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${non_drop_src_ip} | ${test_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table L3 | ${dut1_node}
+| | ... | ${ip_version} | src
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${ip_version} | src | ${test_src_ip}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then Packet transmission from port to port should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${non_drop_src_ip} | ${test_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+
+| TC02: DUT with iACL IPv6 dst-addr drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add destination IPv6 address to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${non_drop_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${non_drop_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table L3 | ${dut1_node}
+| | ... | ${ip_version} | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${ip_version} | dst | ${test_dst_ip}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then Packet transmission from port to port should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${non_drop_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+
+| TC03: DUT with iACL IPv6 src-addr and dst-addr drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add source and destination IPv6 addresses to classify table\
+| | ... | with 'deny'. Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${non_drop_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send packet and verify headers | ${tg_node}
+| | ... | ${non_drop_src_ip} | ${non_drop_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | ${table_index_1} | ${skip_n_1} | ${match_n_1}=
+| | ... | When Vpp Creates Classify Table L3 | ${dut1_node}
+| | ... | ${ip_version} | src
+| | ${table_index_2} | ${skip_n_2} | ${match_n_2}=
+| | ... | And Vpp Creates Classify Table L3 | ${dut1_node} | ${ip_version} | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1_node} | deny | ${table_index_1} | ${skip_n_1} | ${match_n_2}
+| | ... | ${ip_version} | src | ${test_src_ip}
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1_node} | deny | ${table_index_2} | ${skip_n_2} | ${match_n_2}
+| | ... | ${ip_version} | dst | ${test_dst_ip}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index_1}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index_2}
+| | Then Packet transmission from port to port should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${non_drop_src_ip} | ${non_drop_dst_ip} | ${tg_to_dut1}
+| | ... | ${tg_to_dut1_mac} | ${dut1_to_tg_mac} | ${tg_to_dut2}
+| | ... | ${dut1_to_dut2_mac} | ${tg_to_dut2_mac}
+
+| TC04: DUT with iACL IPv6 protocol set to TCP drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add protocol mask and TCP protocol (0x06) to classify table\
+| | ... | with 'deny'. Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex
+| | ... | ${dut1_node} | 0000000000000000000000000000000000000000FF
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | 000000000000000000000000000000000000000006
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+
+| TC05: DUT with iACL IPv6 protocol set to UDP drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add protocol mask and UDP protocol (0x11) to classify table\
+| | ... | with 'deny'. Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex
+| | ... | ${dut1_node} | 0000000000000000000000000000000000000000FF
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | 000000000000000000000000000000000000000011
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+
+| TC06: DUT with iACL IPv6 TCP src-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add TCP source ports to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 110 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | TCP | source
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 80 | 0
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 110 | 20
+
+| TC07: DUT with iACL IPv6 TCP dst-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add TCP destination ports to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 20 | 110
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 20 | 80
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | TCP | destination
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 0 | 80
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 20 | 80
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 20 | 110
+
+| TC08: DUT with iACL IPv6 TCP src-ports and dst-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add TCP source and destination ports to classify table\
+| | ... | with 'deny'. Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 110 | 25
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | TCP
+| | ... | source + destination
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 80 | 20
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | TCP | 110 | 25
+
+| TC09: DUT with iACL IPv6 UDP src-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add UDP source ports to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 110 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | UDP | source
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 80 | 0
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 110 | 20
+
+| TC10: DUT with iACL IPv6 UDP dst-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add TCP destination ports to classify table with 'deny'.\
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 20 | 110
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 20 | 80
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | UDP | destination
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 0 | 80
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 20 | 80
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 20 | 110
+
+| TC11: DUT with iACL IPv6 UDP src-ports and dst-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add UDP source and destination ports to classify table\
+| | ... | with 'deny'. Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_dut2} | ${dut1_to_dut2_ip} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip_GW}
+| | ... | ${tg_to_dut2_mac}
+| | And Vpp Route Add
+| | ... | ${dut1_node} | ${test_dst_ip} | ${prefix_length}
+| | ... | ${dut1_to_dut2_ip_GW} | ${dut1_to_dut2}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 110 | 25
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | UDP
+| | ... | source + destination
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 80 | 20
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${ip_version} | ${table_index}
+| | Then TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 110 | 25
+
+| TC12: DUT with iACL MAC src-addr and iACL IPv6 UDP src-ports and dst-ports drops matching pkts
+| | [Documentation]
+| | ... | On DUT1 add source MAC address to classify (L2) table and add UDP\
+| | ... | source and destination ports to classify (hex) table with 'deny'.
+| | ... | Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_tg}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 110 | 25
+| | And Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table L2 | ${dut1_node} | src
+| | And Vpp Configures Classify Session L2
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | src | ${tg_to_dut1_mac}
+| | ${hex_mask}= | Compute Classify Hex Mask | ${ip_version} | UDP
+| | ... | source + destination
+| | ${hex_value}= | Compute Classify Hex Value | ${hex_mask} | 80 | 20
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex | ${dut1_node} | ${hex_mask}
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | ${hex_value}
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${l2_table} | ${table_index}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 110 | 25
+| | And TCP or UDP packet transmission should fail | ${tg_node}
+| | ... | ${test_src_ip} | ${test_dst_ip} | ${tg_to_dut1} | ${tg_to_dut1_mac}
+| | ... | ${tg_to_dut2} | ${dut1_to_tg_mac} | UDP | 80 | 20
diff --git a/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6dhcpproxy-func.robot b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6dhcpproxy-func.robot
new file mode 100644
index 0000000000..2858f3743e
--- /dev/null
+++ b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6dhcpproxy-func.robot
@@ -0,0 +1,66 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/features/dhcp_proxy.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *DHCPv6 proxy test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG = DUT
+| ... | with two links between the nodes.
+| ... | *[Cfg] DUT configuration:* DUT is configured with DHCPv6 proxy.
+| ... | *[Ver] TG verification:* Test DHCPv6 packets are sent
+| ... | on TG on first link to DUT and received on TG on second link.
+| ... | On receive TG verifies if DHCPv6 packets are valid
+| ... | *[Ref] Applicable standard specifications:* RFC 3315
+
+
+*** Variables ***
+| ${dut_to_tg_if1_ip}= | 3ffe:62::1
+| ${dut_to_tg_if2_ip}= | 3ffe:63::1
+| ${dhcp_server_ip}= | 3ffe:63::2
+| ${prefix_length}= | 64
+
+
+*** Test Cases ***
+| TC01: VPP proxies valid DHCPv6 request to DHCPv6 server
+| | [Documentation] |
+| | ... | [Top] TG=DUT
+| | ... | [Cfg] On DUT setup DHCP proxy.
+| | ... | [Ver] Make TG verify matching DHCPv6 packets between client and \
+| | ... | DHCPv6 server through DHCPv6 proxy.
+| | ... | [Ref] RFC 3315
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | And VPP Route Add | ${dut_node} | ff02::1:2 | 128 | ${NONE} | local
+| | ... | ${FALSE} | ${NONE}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if2} | ${dhcp_server_ip}
+| | ... | ${tg_to_dut_if2_mac}
+| | And Vpp All Ra Suppress Link Layer | ${nodes}
+| | When DHCP Proxy Config | ${dut_node} | ${dhcp_server_ip}
+| | ... | ${dut_to_tg_if1_ip}
+| | Then Send DHCPv6 Messages | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+| | ... | ${dut_to_tg_if1_ip} | ${dut_to_tg_if1_mac} | ${dhcp_server_ip}
+| | ... | ${tg_to_dut_if2_mac} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if2_mac}
diff --git a/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6ecmp-func.robot b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6ecmp-func.robot
new file mode 100644
index 0000000000..1f4b6c7270
--- /dev/null
+++ b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6ecmp-func.robot
@@ -0,0 +1,74 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/counters.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *Ipv6 Multipath routing test cases*
+| ...
+| ... | *[Top] Network topologies:* TG=DUT 2-node topology with two links\
+| ... | between nodes.
+| ... | *[Cfg] DUT configuration:* On DUT configure interfaces IPv4 adresses,\
+| ... | and multipath routing.
+| ... | *[Ver] TG verification:* Test packets are sent from TG on the first\
+| ... | link to DUT. Packet is received on TG on the second link from DUT1.
+
+*** Variables ***
+| ${ip_1}= | 3ffe:61::1
+| ${ip_2}= | 3ffe:62::1
+| ${test_dst_ip}= | 3ffe:71::1
+| ${test_src_ip}= | 3ffe:51::1
+| ${prefix_length}= | 64
+| ${neighbor_1_ip}= | 3ffe:62::2
+| ${neighbor_1_mac}= | 02:00:00:00:00:02
+| ${neighbor_2_ip}= | 3ffe:62::3
+| ${neighbor_2_mac}= | 02:00:00:00:00:03
+
+*** Test Cases ***
+| TC01: IPv6 Equal-cost multipath routing
+| | [Documentation]
+| | ... | [Top] TG=DUT
+| | ... | [Cfg] On DUT configure multipath routing wiht two equal-cost paths.
+| | ... | [Ver] TG sends 100 IPv6 ICMP packets traffic on the first link to\
+| | ... | DUT. On second link to TG verify if traffic is divided into two paths.
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${ip_1} | ${prefix_length}
+| | And Vpp Set If Ipv6 Addr | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${ip_2} | ${prefix_length}
+| | And Add Ip Neighbor
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${neighbor_1_ip} | ${neighbor_1_mac}
+| | And Add Ip Neighbor
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${neighbor_2_ip} | ${neighbor_2_mac}
+| | And Suppress ICMPv6 router advertisement message | ${nodes}
+| | When Vpp Route Add
+| | ... | ${dut_node} | ${test_dst_ip} | ${prefix_length} | ${neighbor_1_ip}
+| | ... | ${dut_to_tg_if1} | resolve_attempts=${NONE} | multipath=${TRUE}
+| | And Vpp Route Add
+| | ... | ${dut_node} | ${test_dst_ip} | ${prefix_length} | ${neighbor_2_ip}
+| | ... | ${dut_to_tg_if1} | resolve_attempts=${NONE} | multipath=${TRUE}
+| | Then Send packets and verify multipath routing | ${tg_node}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1} | ${test_src_ip} | ${test_dst_ip}
+| | ... | ${tg_to_dut_if2_mac} | ${dut_to_tg_if2_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${neighbor_1_mac} | ${neighbor_2_mac}
diff --git a/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6ra-func.robot b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6ra-func.robot
new file mode 100644
index 0000000000..20fa1bd876
--- /dev/null
+++ b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ip6ra-func.robot
@@ -0,0 +1,107 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/counters.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *IPv6 Router Advertisement test cases*
+| ...
+| ... | RFC4861 Neighbor Discovery. Encapsulations: Eth-IPv6-RA on links
+| ... | TG-DUT1. IPv6 Router Advertisement tests use 3-node topology TG - DUT1 -
+| ... | DUT2 - TG with one link between the nodes. DUT1 and DUT2 are configured
+| ... | with IPv6 routing and static routes. TG verifies received RA packets.
+
+
+*** Variables ***
+| ${dut1_to_tg_ip}= | 3ffe:62::1
+| ${tg_to_dut1_ip}= | 3ffe:62::2
+| ${prefix_length}= | 64
+| ${interval}= | 2
+
+*** Test Cases ***
+| TC01: DUT transmits RA on IPv6 enabled interface
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Cfg] On DUT1 configure IPv6 interface on the link to TG.
+| | ... | [Ver] Make TG wait for IPv6 Router Advertisement packet to be sent\
+| | ... | by DUT1 and verify the received RA packet is correct.
+| | [Tags] | EXPECTED_FAILING
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | When Vpp RA Send After Interval | ${dut1_node} | ${dut1_to_tg}
+| | Then Receive and verify router advertisement packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${dut1_to_tg_mac}
+
+| TC02: DUT retransmits RA on IPv6 enabled interface after a set interval
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Cfg] On DUT1 configure IPv6 interface on the link to TG.
+| | ... | [Ver] Make TG wait for two IPv6 Router Advertisement packets\
+| | ... | to be sent by DUT1 and verify the received RA packets are correct.
+| | [Tags] | EXPECTED_FAILING
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | When Vpp RA Send After Interval | ${dut1_node} | ${dut1_to_tg}
+| | ... | interval=${interval}
+| | :FOR | ${n} | IN RANGE | ${2}
+| | | Then Receive and verify router advertisement packet
+| | | ... | ${tg_node} | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${interval}
+
+| TC03: DUT responds to Router Solicitation request
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Cfg] On DUT1 configure IPv6 interface on the link to TG and suppress\
+| | ... | sending of Router Advertisement packets periodically.
+| | ... | [Ver] Make TG send IPv6 Router Solicitation request to DUT1, listen\
+| | ... | for response from DUT1 and verify the received RA packet is correct.
+| | [Tags] | EXPECTED_FAILING
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | When VPP RA Suppress Link Layer | ${dut1_node} | ${dut1_to_tg}
+| | Then Send router solicitation and verify response
+| | ... | ${tg_node} | ${dut1_node} | ${tg_to_dut1} | ${dut1_to_tg}
+| | ... | ${tg_to_dut1_ip}
+
+| TC04: DUT responds to Router Solicitation request sent from link local address
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Cfg] On DUT1 configure IPv6 interface on the link to TG and suppress\
+| | ... | sending of Router Advertisement packets periodically.
+| | ... | [Ver] Make TG send IPv6 Router Solicitation request to DUT1, listen\
+| | ... | for response from DUT1 and verify the received RA packet is correct.
+| | [Tags] | EXPECTED_FAILING
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If Ipv6 Addr | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | When VPP RA Suppress Link Layer | ${dut1_node} | ${dut1_to_tg}
+| | Then Send router solicitation and verify response
+| | ... | ${tg_node} | ${dut1_node} | ${tg_to_dut1} | ${dut1_to_tg}
diff --git a/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ipolicemarkbase-func.robot b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ipolicemarkbase-func.robot
new file mode 100644
index 0000000000..788d74ba92
--- /dev/null
+++ b/tests/vpp/func/ip6/eth2p-ethip6-ip6base-ipolicemarkbase-func.robot
@@ -0,0 +1,161 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Force Tags | 3_NODE_DOUBLE_LINK_TOPO | VM_ENV | HW_ENV
+| Resource | resources/libraries/robot/features/policer.robot
+| Library | resources.libraries.python.Trace
+| Test Setup | Run Keywords | Set up functional test
+| ... | AND | Configure topology for IPv6 policer test
+| Test Teardown | Tear down functional test
+| Documentation | *IPv6 policer test cases*
+| ...
+| ... | *[Top] Network topologies:* TG=DUT1 2-node topology with two links\
+| ... | between nodes.
+| ... | *[Cfg] DUT configuration:* On DUT1 configure interfaces IPv6 adresses,\
+| ... | and static neighbor record on the second interface.
+| ... | *[Ver] TG verification:* Test packet is sent from TG on the first link\
+| ... | to DUT1. Packet is received on TG on the second link from DUT1.
+| ... | *[Ref] Applicable standard specifications:* RFC2474, RFC2697, RFC2698.
+
+*** Variables ***
+| ${tg_to_dut_if1_ip6}= | 3ffe:5f::2
+| ${tg_to_dut_if2_ip6}= | 3ffe:60::2
+| ${dut_to_tg_if1_ip6}= | 3ffe:5f::1
+| ${dut_to_tg_if2_ip6}= | 3ffe:60::1
+| ${ip6_plen}= | ${64}
+
+| ${cir}= | ${100}
+| ${eir}= | ${150}
+| ${cb}= | ${200}
+| ${eb}= | ${300}
+
+*** Test Cases ***
+| TC01: VPP policer 2R3C Color-aware marks packet
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Ref] RFC2474, RFC2698.
+| | ... | [Cfg] On DUT1 configure 2R3C color-aware policer on the first\
+| | ... | interface.
+| | ... | [Ver] TG sends IPv6 TCP packet on the first link to DUT1.\
+| | ... | On DUT1 packet is marked with DSCP tag. Verify if DUT1 sends\
+| | ... | correct IPv6 TCP packet with correct DSCP on the second link to TG.
+| | ${dscp}= | DSCP AF22
+| | Given Policer Set Name | policer1
+| | And Policer Set Node | ${dut_node}
+| | And Policer Set CIR | ${cir}
+| | And Policer Set EIR | ${eir}
+| | And Policer Set CB | ${cb}
+| | And Policer Set EB | ${eb}
+| | And Policer Set Rate Type pps
+| | And Policer Set Round Type Closest
+| | And Policer Set Type 2R3C 2698
+| | And Policer Set Conform Action Transmit
+| | And Policer Set Exceed Action Mark and Transmit | ${dscp}
+| | And Policer Set Violate Action Drop
+| | And Policer Enable Color Aware
+| | And Policer Classify Set Precolor Exceed
+| | And Policer Classify Set Interface | ${dut_to_tg_if1}
+| | And Policer Classify Set Match IP | ${tg_to_dut_if1_ip}
+| | When Policer Set Configuration
+| | Then Send packet and verify marking | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if2_ip} | ${dscp}
+
+| TC02: VPP policer 2R3C Color-blind marks packet
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Ref] RFC2474, RFC2698.
+| | ... | [Cfg] On DUT1 configure 2R3C color-blind policer on the first\
+| | ... | interface.
+| | ... | [Ver] TG sends IPv6 TCP packet on the first link to DUT1.\
+| | ... | On DUT1 packet is marked with DSCP tag. Verify if DUT1 sends\
+| | ... | correct IPv6 TCP packet with correct DSCP on the second link to TG.
+| | ${dscp}= | DSCP AF22
+| | Given Policer Set Name | policer1
+| | And Policer Set Node | ${dut_node}
+| | And Policer Set CIR | ${cir}
+| | And Policer Set EIR | ${eir}
+| | And Policer Set CB | ${cb}
+| | And Policer Set EB | ${eb}
+| | And Policer Set Rate Type pps
+| | And Policer Set Round Type Closest
+| | And Policer Set Type 2R3C 2698
+| | And Policer Set Conform Action Mark and Transmit | ${dscp}
+| | And Policer Set Exceed Action Transmit
+| | And Policer Set Violate Action Drop
+| | And Policer Classify Set Precolor Conform
+| | And Policer Classify Set Interface | ${dut_to_tg_if1}
+| | And Policer Classify Set Match IP | ${tg_to_dut_if1_ip}
+| | When Policer Set Configuration
+| | Then Send packet and verify marking | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if2_ip} | ${dscp}
+
+| TC03: VPP policer 1R3C Color-aware marks packet
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Ref] RFC2474, RFC2697.
+| | ... | [Cfg] On DUT1 configure 1R3C color-aware policer on the first\
+| | ... | interface.
+| | ... | [Ver] TG sends IPv6 TCP packet on the first link to DUT1.\
+| | ... | On DUT1 packet is marked with DSCP tag. Verify if DUT1 sends\
+| | ... | correct IPv6 TCP packet with correct DSCP on the second link to TG.
+| | ${dscp}= | DSCP AF22
+| | Given Policer Set Name | policer1
+| | And Policer Set Node | ${dut_node}
+| | And Policer Set CIR | ${1}
+| | And Policer Set CB | ${2}
+| | And Policer Set EB | ${eb}
+| | And Policer Set Rate Type pps
+| | And Policer Set Round Type Closest
+| | And Policer Set Type 1R3C
+| | And Policer Set Conform Action Transmit
+| | And Policer Set Exceed Action Mark and Transmit | ${dscp}
+| | And Policer Set Violate Action Drop
+| | And Policer Enable Color Aware
+| | And Policer Classify Set Precolor Exceed
+| | And Policer Classify Set Interface | ${dut_to_tg_if1}
+| | And Policer Classify Set Match IP | ${tg_to_dut_if1_ip}
+| | When Policer Set Configuration
+| | Then Send packet and verify marking | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if2_ip} | ${dscp}
+
+| TC04: VPP policer 1R3C Color-blind marks packet
+| | [Documentation]
+| | ... | [Top] TG=DUT1.
+| | ... | [Ref] RFC2474, RFC2697.
+| | ... | [Cfg] On DUT1 configure 1R3C color-blind policer on the first\
+| | ... | interface.
+| | ... | [Ver] TG sends IPv6 TCP packet on the first link to DUT1.\
+| | ... | On DUT1 packet is marked with DSCP tag. Verify if DUT1 sends\
+| | ... | correct IPv6 TCP packet with correct DSCP on the second link to TG.
+| | ${dscp}= | DSCP AF22
+| | Given Policer Set Name | policer1
+| | And Policer Set Node | ${dut_node}
+| | And Policer Set CIR | ${cir}
+| | And Policer Set CB | ${cb}
+| | And Policer Set Rate Type pps
+| | And Policer Set Round Type Closest
+| | And Policer Set Type 1R3C
+| | And Policer Set Conform Action Mark and Transmit | ${dscp}
+| | And Policer Set Exceed Action Transmit
+| | And Policer Set Violate Action Drop
+| | And Policer Classify Set Precolor Conform
+| | And Policer Classify Set Interface | ${dut_to_tg_if1}
+| | And Policer Classify Set Match IP | ${tg_to_dut_if1_ip}
+| | When Policer Set Configuration
+| | Then Send packet and verify marking | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if2_ip} | ${dscp}
diff --git a/tests/vpp/func/ip6/eth2p-ethip6-ip6basevrf-func.robot b/tests/vpp/func/ip6/eth2p-ethip6-ip6basevrf-func.robot
new file mode 100644
index 0000000000..cf0ed43a4a
--- /dev/null
+++ b/tests/vpp/func/ip6/eth2p-ethip6-ip6basevrf-func.robot
@@ -0,0 +1,409 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *Vpn routed forwarding - baseline IPv6*
+| ... | *[Top] Network Topologies:* TG=DUT1=DUT2=TG 3-node topology with two
+| ... | links in between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-ICMPv6
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with two VRF tables;
+| ... | Separation of traffic is tested by IP packets; Neighbors and Routes are
+| ... | set on DUT nodes; IP addresses are set on DUT interfaces.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets
+| ... | are sent by TG on link to DUT1, DUT2 or back to TG; On receipt TG
+| ... | verifies packets for correctness and their IPv6 src-addr, dst-addr,
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${fib_table_1}= | 9
+| ${fib_table_2}= | 99
+
+| ${dut1_to_tg_ip1}= | 2001:62::3
+| ${dut1_to_tg_ip2}= | 2001:62::4
+| ${dut2_to_tg_ip1}= | 2003:62::3
+| ${dut2_to_tg_ip2}= | 2003:62::4
+
+| ${dut1_to_dut2_ip1}= | 2002:62::1
+| ${dut1_to_dut2_ip2}= | 2002:62::2
+| ${dut2_to_dut1_ip1}= | 2002:62::3
+| ${dut2_to_dut1_ip2}= | 2002:62::4
+
+| ${tg_dut1_ip1}= | 2001:62::1
+| ${tg_dut1_ip2}= | 2001:62::2
+| ${tg_dut2_ip1}= | 2003:62::1
+| ${tg_dut2_ip2}= | 2003:62::2
+
+| ${ip_prefix}= | 64
+| ${timeout}= | 5
+
+*** Test Cases ***
+| TC01: TG packets routed to DUT ingress interface, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. Neighbors are
+| | ... | configured for each DUTs ingress/egress ports, and each VRF is
+| | ... | configured with just one route.
+| | ... | [Ver] Packet is sent from TG->DUT1-if1 to DUT1->TG-if1 and from
+| | ... | TG->DUT1-if2 to DUT1->TG-if2 and checked if arrived.
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Send ICMP echo request and verify answer | ${tg_node}
+| | ... | ${tg_to_dut1_if1} | ${dut1_to_tg_if1_mac}
+| | ... | ${tg_to_dut1_if1_mac} | ${dut1_to_tg_ip1}
+| | ... | ${tg_dut1_ip1} | ${timeout}
+| | And Send ICMP echo request and verify answer | ${tg_node}
+| | ... | ${tg_to_dut1_if2} | ${dut1_to_tg_if2_mac}
+| | ... | ${tg_to_dut1_if2_mac} | ${dut1_to_tg_ip2}
+| | ... | ${tg_dut1_ip2} | ${timeout}
+
+| TC02: TG packets routed to DUT egress interface, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. Neighbors are
+| | ... | configured for each DUTs ingress/egress ports, and each VRF is
+| | ... | configured with just one route.
+| | ... | [Ver] Packet is sent from TG->DUT1-if1 to DUT1->DUT2-if1 and from
+| | ... | TG->DUT1-if2 to DUT1->DUT2-if2 and checked if arrived.
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut1_to_dut2_ip1} | ${tg_dut1_ip1} | ${timeout}
+| | And Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if2}
+| | ... | ${dut1_to_tg_if2_mac} | ${tg_to_dut1_if2_mac}
+| | ... | ${dut1_to_dut2_ip2} | ${tg_dut1_ip2} | ${timeout}
+
+| TC03: TG packets routed to DUT2 ingress interface through DUT1, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. Neighbors are
+| | ... | configured for each DUTs ingress/egress ports, and each VRF is
+| | ... | configured with just one route.
+| | ... | [Ver] Packet is sent from TG->DUT1-if1 to DUT2->DUT1-if1 and from
+| | ... | TG->DUT1-if2 to DUT2->DUT1-if2 and checked if arrived.
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut2_to_dut1_ip1} | ${tg_dut1_ip1} | ${timeout}
+| | And Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if2}
+| | ... | ${dut1_to_tg_if2_mac} | ${tg_to_dut1_if2_mac}
+| | ... | ${dut2_to_dut1_ip2} | ${tg_dut1_ip2} | ${timeout}
+
+| TC04: TG packets routed to DUT2 egress interface through DUT1, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. Neighbors are
+| | ... | configured for each DUTs ingress/egress ports, and each VRF is
+| | ... | configured with just one route.
+| | ... | [Ver] Packet is sent from TG->DUT1-if1 to DUT2->TG-if1 and from
+| | ... | TG->DUT1-if2 to DUT2->TG-if2 and checked if arrived.
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut2_to_tg_ip1} | ${tg_dut1_ip1} | ${timeout}
+| | And Send ICMP echo request and verify answer | ${tg_node} | ${tg_to_dut1_if2}
+| | ... | ${dut1_to_tg_if2_mac} | ${tg_to_dut1_if2_mac}
+| | ... | ${dut2_to_tg_ip2} | ${tg_dut1_ip2} | ${timeout}
+
+| TC05: TG packets routed to TG through DUT1 and DUT2, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. Neighbors are
+| | ... | configured for each DUTs ingress/egress ports, and each VRF is
+| | ... | configured with just one route.
+| | ... | [Ver] Packet is sent from TG->DUT1-if1 to TG->DUT2-if1 and from
+| | ... | TG->DUT1-if2 to TG->DUT2-if2 and checked if arrived.
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Send packet and verify headers | ${tg_node} | ${tg_dut1_ip1}
+| | ... | ${tg_dut2_ip1} | ${tg_to_dut1_if1} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut2_if1} | ${dut2_to_tg_if1_mac}
+| | ... | ${tg_to_dut2_if1_mac}
+| | And Send packet and verify headers | ${tg_node}
+| | ... | ${tg_dut1_ip2} | ${tg_dut2_ip2} | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut1_if2_mac} | ${dut1_to_tg_if2_mac} | ${tg_to_dut2_if2}
+| | ... | ${dut2_to_tg_if2_mac} | ${tg_to_dut2_if2_mac}
+
+| TC06: TG packets not routed to DUT ingress interface in different VRF, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. Neighbors are
+| | ... | configured for each DUTs ingress/egress ports, and each VRF is
+| | ... | configured with just one route.
+| | ... | [Ver] Packet is sent from TG->DUT1-if1 to DUT1->TG-if2 where it
+| | ... | should not arrive.
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut1_to_tg_ip2} | ${tg_dut1_ip1} | ${timeout}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if2}
+| | ... | ${dut1_to_tg_if2_mac} | ${tg_to_dut1_if2_mac}
+| | ... | ${dut1_to_tg_ip1} | ${tg_dut1_ip2} | ${timeout}
+
+| TC07: TG packets not routed to DUT egress interface in different VRF, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. Neighbors are
+| | ... | configured for each DUTs ingress/egress ports, and each VRF is
+| | ... | configured with just one route.
+| | ... | [Ver] Packet is sent from TG->DUT1-if1 to DUT1->DUT2-if2 where it
+| | ... | should not arrive.
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut1_to_dut2_ip2} | ${tg_dut1_ip1} | ${timeout}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if2}
+| | ... | ${dut1_to_tg_if2_mac} | ${tg_to_dut1_if2_mac}
+| | ... | ${dut1_to_dut2_ip1} | ${tg_dut1_ip2} | ${timeout}
+
+
+| TC08: TG packets not routed to DUT2 ingress interface in different VRF through DUT1, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. Neighbors are
+| | ... | configured for each DUTs ingress/egress ports, and each VRF is
+| | ... | configured with just one route.
+| | ... | [Ver] Packet is sent from TG->DUT1-if1 to DUT2->DUT1-if2 where it
+| | ... | should not arrive.
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut2_to_dut1_ip2} | ${tg_dut1_ip1} | ${timeout}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if2}
+| | ... | ${dut1_to_tg_if2_mac} | ${tg_to_dut1_if2_mac}
+| | ... | ${dut2_to_dut1_ip1} | ${tg_dut1_ip2} | ${timeout}
+
+| TC09: TG packets not routed to DUT2 egress interface in different VRF through DUT1, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. Neighbors are
+| | ... | configured for each DUTs ingress/egress ports, and each VRF is
+| | ... | configured with just one route.
+| | ... | [Ver] Packet is sent from TG->DUT1-if1 to DUT2->TG-if2 where it
+| | ... | should not arrive.
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if1}
+| | ... | ${dut1_to_tg_if1_mac} | ${tg_to_dut1_if1_mac}
+| | ... | ${dut2_to_tg_ip2} | ${tg_dut1_ip1} | ${timeout}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP echo request and verify answer
+| | ... | ${tg_node} | ${tg_to_dut1_if2}
+| | ... | ${dut1_to_tg_if2_mac} | ${tg_to_dut1_if2_mac}
+| | ... | ${dut2_to_tg_ip1} | ${tg_dut1_ip2} | ${timeout}
+
+| TC10: TG packets not routed to TG in different VRF through DUT1 and DUT2, VPP configured with two VRFs
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG.
+| | ... | [Enc] Eth-IPv6-ICMPv6.
+| | ... | [Cfg] DUT1 and DUT2 are both configured with two fib tables. Each
+| | ... | table is assigned to 2 interfaces to separate the traffic. Interfaces
+| | ... | are configured with IP addresses from *Variables*. Neighbors are
+| | ... | configured for each DUTs ingress/egress ports, and each VRF is
+| | ... | configured with just one route.
+| | ... | [Ver] Packet is sent from TG->DUT1-if1 to TG->DUT2-if2 where it
+| | ... | should not arrive.
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in double-link 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in double-link 3-node circular topology up
+| | When Setup Env - 2xVRF Each Node
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send packet and verify headers | ${tg_node} | ${tg_dut1_ip1}
+| | ... | ${tg_dut2_ip2} | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut1_if1_mac} | ${dut1_to_tg_if1_mac} | ${tg_to_dut2_if2}
+| | ... | ${dut2_to_tg_if2_mac} | ${tg_to_dut2_if2_mac}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send packet and verify headers | ${tg_node} | ${tg_dut1_ip2}
+| | ... | ${tg_dut2_ip1} | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut1_if2_mac} | ${dut1_to_tg_if2_mac} | ${tg_to_dut2_if1}
+| | ... | ${dut2_to_tg_if1_mac} | ${tg_to_dut2_if1_mac}
+
+*** Keywords ***
+| Setup Env - 2xVRF Each Node
+| | [Documentation]
+| | ... | Environment is set up with 2 fib tables on each DUT. DUT1-TG-IF1 and \
+| | ... | DUT1-DUT2-IF1 are assigned to FIB1, and DUT1-TG-IF2 and DUT1-DUT2-IF2
+| | ... | are assigned to FIB2 (the same done on DUT2, just opposite).
+| | ... | IP addresses and IP Neighbors are subsequently set for interfaces.
+| | ... | The last setting is route for each fib table.
+| | ...
+| | ${dut1_if1_idx}= | Get Interface SW Index
+| | ... | ${dut1_node} | ${dut1_to_dut2_if1}
+| | ${dut1_if2_idx}= | Get Interface SW Index
+| | ... | ${dut1_node} | ${dut1_to_dut2_if2}
+| | ${dut2_if1_idx}= | Get Interface SW Index
+| | ... | ${dut2_node} | ${dut2_to_dut1_if1}
+| | ${dut2_if2_idx}= | Get Interface SW Index
+| | ... | ${dut2_node} | ${dut2_to_dut1_if2}
+
+| | Assign Interface To Fib Table
+| | ... | ${dut1_node} | ${dut1_to_dut2_if1} | ${fib_table_1} | ipv6=${TRUE}
+| | Assign Interface To Fib Table
+| | ... | ${dut1_node} | ${dut1_to_dut2_if2} | ${fib_table_2} | ipv6=${TRUE}
+| | Assign Interface To Fib Table
+| | ... | ${dut1_node} | ${dut1_to_tg_if1} | ${fib_table_1} | ipv6=${TRUE}
+| | Assign Interface To Fib Table
+| | ... | ${dut1_node} | ${dut1_to_tg_if2} | ${fib_table_2} | ipv6=${TRUE}
+
+| | Assign Interface To Fib Table
+| | ... | ${dut2_node} | ${dut2_to_dut1_if1} | ${fib_table_1} | ipv6=${TRUE}
+| | Assign Interface To Fib Table
+| | ... | ${dut2_node} | ${dut2_to_dut1_if2} | ${fib_table_2} | ipv6=${TRUE}
+| | Assign Interface To Fib Table
+| | ... | ${dut2_node} | ${dut2_to_tg_if1} | ${fib_table_1} | ipv6=${TRUE}
+| | Assign Interface To Fib Table
+| | ... | ${dut2_node} | ${dut2_to_tg_if2} | ${fib_table_2} | ipv6=${TRUE}
+
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_tg_if1} | ${dut1_to_tg_ip1} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_tg_if2} | ${dut1_to_tg_ip2} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_dut2_if1}
+| | ... | ${dut1_to_dut2_ip1} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_dut2_if2}
+| | ... | ${dut1_to_dut2_ip2} | ${ip_prefix}
+
+| | And Set Interface Address
+| | ... | ${dut2_node} | ${dut2_to_tg_if1} | ${dut2_to_tg_ip1} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut2_node} | ${dut2_to_tg_if2} | ${dut2_to_tg_ip2} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut2_node} | ${dut2_to_dut1_if1}
+| | ... | ${dut2_to_dut1_ip1} | ${ip_prefix}
+| | And Set Interface Address
+| | ... | ${dut2_node} | ${dut2_to_dut1_if2}
+| | ... | ${dut2_to_dut1_ip2} | ${ip_prefix}
+
+| | And Add IP Neighbor | ${dut1_node} | ${dut1_to_tg_if1}
+| | ... | ${tg_dut1_ip1} | ${tg_to_dut1_if1_mac}
+| | And Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2_if1}
+| | ... | ${dut2_to_dut1_ip1} | ${dut2_to_dut1_if1_mac}
+| | And Add IP Neighbor | ${dut2_node} | ${dut2_to_tg_if1}
+| | ... | ${tg_dut2_ip1} | ${tg_to_dut2_if1_mac}
+| | And Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1_if1}
+| | ... | ${dut1_to_dut2_ip1} | ${dut1_to_dut2_if1_mac}
+
+| | And Add IP Neighbor | ${dut1_node} | ${dut1_to_tg_if2}
+| | ... | ${tg_dut1_ip2} | ${tg_to_dut1_if2_mac}
+| | And Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2_if2}
+| | ... | ${dut2_to_dut1_ip2} | ${dut2_to_dut1_if2_mac}
+| | And Add IP Neighbor | ${dut2_node} | ${dut2_to_tg_if2}
+| | ... | ${tg_dut2_ip2} | ${tg_to_dut2_if2_mac}
+| | And Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1_if2}
+| | ... | ${dut1_to_dut2_ip2} | ${dut1_to_dut2_if2_mac}
+
+| | And Vpp Route Add | ${dut1_node} | ${tg_dut2_ip1} | ${ip_prefix}
+| | ... | ${dut2_to_dut1_ip1} | ${dut1_to_dut2_if1} | vrf=${fib_table_1}
+| | And Vpp Route Add | ${dut2_node} | ${tg_dut1_ip1} | ${ip_prefix}
+| | ... | ${dut1_to_dut2_ip1} | ${dut2_to_dut1_if1} | vrf=${fib_table_1}
+
+| | And Vpp Route Add | ${dut1_node} | ${tg_dut2_ip2} | ${ip_prefix}
+| | ... | ${dut2_to_dut1_ip2} | ${dut1_to_dut2_if2} | vrf=${fib_table_2}
+| | And Vpp Route Add | ${dut2_node} | ${tg_dut1_ip2} | ${ip_prefix}
+| | ... | ${dut1_to_dut2_ip2} | ${dut2_to_dut1_if2} | vrf=${fib_table_2}
+
+| | Vpp All RA Suppress Link Layer | ${nodes}
diff --git a/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lisp-l2bdbasemaclrn-func.robot b/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lisp-l2bdbasemaclrn-func.robot
new file mode 100644
index 0000000000..6927dacde4
--- /dev/null
+++ b/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lisp-l2bdbasemaclrn-func.robot
@@ -0,0 +1,96 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.L2Util
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/overlay/l2lisp.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/l2/l2_ipv6.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down functional test
+| ...
+| Documentation | *l2-lispgpe-ip6 encapsulation test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IP6-ICMPv6-LISPGpe-IP6
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge\
+| ... | domains and neighbors. LISPoIPv6 tunnel is configured between\
+| ... | DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets are sent in\
+| ... | both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv6 src-addr, dst-addr\
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: Route IPv6 packet through LISP with Bridge Domain setup.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IP6-ICMPv6-LISPGpe-IP6
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2. Also\
+| | ... | configure BD and assign it to LISP VNI.
+| | ... | [Ver] Make TG send ICMPv6 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP tunnel between them; verify IPv6, Ether headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6} | ${prefix6}
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6} | ${prefix6}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6} | ${prefix6}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6}
+| | ... | ${tg_to_dut2_mac}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6}
+| | ... | ${tg_to_dut1_mac}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_dut1_mac}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6}
+| | ... | ${dut1_to_dut2_mac}
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | When Create L2 BD | ${dut1_node} | ${vpp_bd_id}
+| | And Add Interface To L2 BD | ${dut1_node} | ${dut1_to_tg} | ${vpp_bd_id}
+| | And Create L2 BD | ${dut2_node} | ${vpp_bd_id}
+| | And Add Interface To L2 BD | ${dut2_node} | ${dut2_to_tg} | ${vpp_bd_id}
+| | And Configure L2 LISP on DUT | ${dut1_node}
+| | ... | ${dut1_to_dut2_ip6_static_adjacency}
+| | ... | ${lisp_dut_settings}
+| | And Configure L2 LISP on DUT | ${dut2_node}
+| | ... | ${dut2_to_dut1_ip6_static_adjacency}
+| | ... | ${lisp_dut_settings}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_if1_mac} | ${tg_if2_mac}
+| | ... | ${tg_to_dut2} | ${tg_if1_mac} | ${tg_if2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_if2_mac} | ${tg_if1_mac}
+| | ... | ${tg_to_dut1} | ${tg_if2_mac} | ${tg_if1_mac}
diff --git a/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip4base-func.robot b/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip4base-func.robot
new file mode 100644
index 0000000000..08fc5c76c6
--- /dev/null
+++ b/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip4base-func.robot
@@ -0,0 +1,108 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.Trace
+# import additional Lisp settings from resource file
+| 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 | Set up functional test
+| ...
+| Test Teardown | Tear down functional test
+| ...
+| Documentation | *LISP static adjacency test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv4-ICMPv4 on\
+| ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn for IPv4 routing over LISPoIPv6\
+| ... | tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured\
+| ... | between DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets\
+| ... | are sent in both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv4 src-addr,\
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 bidirectionally over LISPoIPv6 tunnel
+| | [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 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.
+| | ... | [Cfg2] Reconf LISP.
+| | ... | [Ver2] Verify packets are received again via LISP tunnel.
+| | ... | [Ref] RFC6830.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut_prefix4o6}
+| | ... | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${dut1_to_tg_ip4o6} | ${tg_prefix4o6}
+| | ... | ${dut2_node} | ${dut2_to_dut1}
+| | ... | ${dut2_to_dut1_ip4o6} | ${dut_prefix4o6}
+| | ... | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6}
+| | And VPP IP Probe | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4o6}
+| | And VPP IP Probe | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4o6}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4o6}
+| | ... | ${tg_to_dut2_mac}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4o6}
+| | ... | ${tg_to_dut1_mac}
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | When Configure LISP topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4o6} | ${tg2_ip4o6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4o6} | ${tg1_ip4o6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+| | When Change LISP Configuration | ${dut1_node} | ${dut2_node}
+| | ... | ${dut1_to_dut2} | ${dut2_to_dut1} | ${dut1_to_dut2_mac}
+| | ... | ${dut2_to_dut1_mac} | ${dut1_to_dut2_ip4o6}
+| | ... | ${dut2_to_dut1_ip4o6_reconf} | ${dut_prefix4o6}
+| | ... | ${dut1_ip4o6_static_adjacency}
+| | ... | ${dut1_ip4o6_static_adjacency_reconf}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4o6} | ${tg2_ip4o6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4o6} | ${tg1_ip4o6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
diff --git a/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip6base-func.robot b/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip6base-func.robot
new file mode 100644
index 0000000000..43f19740e3
--- /dev/null
+++ b/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip6base-func.robot
@@ -0,0 +1,107 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VPPUtil
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv6_lispgpe_ipv6/ipv6_lispgpe_ipv6.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP
+| ...
+| Test Setup | Run Keywords | Set up functional test
+| ... | AND | Vpp All Ra Suppress Link Layer | ${nodes}
+| ...
+| Test Teardown | Tear down LISP functional test
+| ...
+| Documentation | *ip6-lispgpe-ip6 encapsulation test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv6-ICMPv6 on DUT1-DUT2,\
+| ... | Eth-IPv6-ICMPv6 on TG-DUTn for IPv6 routing over LISPoIPv6 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured between\
+| ... | DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets are sent in\
+| ... | both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv6 src-addr, dst-addr\
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 bidirectionally over LISP GPE tunnel using physical interfaces
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on\
+| | ... | TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2.
+| | ... | [Ver] Case: ip6-lispgpe-ip6 - phy2lisp
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Add IP Neighbors
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | When Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip6_static_adjacency}
+| | ... | ${dut2_to_dut1_ip6_static_adjacency}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6}
+| | ... | ${dut1_to_dut2_mac}
diff --git a/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip6basevrf-func.robot b/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip6basevrf-func.robot
new file mode 100644
index 0000000000..5d3d969426
--- /dev/null
+++ b/tests/vpp/func/ip6_tunnels/lisp/eth2p-ethip6lispgpe-ip6basevrf-func.robot
@@ -0,0 +1,112 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VPPUtil
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv6_lispgpe_ipv6/ipv6_lispgpe_ipv6.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP
+| ...
+| Test Setup | Run Keywords | Set up functional test
+| ... | AND | Vpp All Ra Suppress Link Layer | ${nodes}
+| ...
+| Test Teardown | Tear down LISP functional test
+| ...
+| Documentation | *ip6-lispgpe-ip6 encapsulation test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv6-ICMPv6 on DUT1-DUT2,\
+| ... | Eth-IPv6-ICMPv6 on TG-DUTn for IPv6 routing over LISPoIPv6 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured between\
+| ... | DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets are sent in\
+| ... | both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv6 src-addr, dst-addr\
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 bidirectionally over LISP GPE tunnel using physical interfaces and VRF is enabled
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on\
+| | ... | TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2.
+| | ... | [Ver] Case: ip6-lispgpe-ip6 - vrf, phy2lisp
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${fib_table_1} | ipv6=${TRUE}
+| | And Assign Interface To Fib Table | ${dut2_node}
+| | ... | ${dut2_to_tg} | ${fib_table_1} | ipv6=${TRUE}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Add IP Neighbors
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | When Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip6_static_adjacency}
+| | ... | ${dut2_to_dut1_ip6_static_adjacency}
+| | ... | ${dut1_dut2_vni} | ${fib_table_1}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dut1_to_tg_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6}
+| | ... | ${dut1_to_dut2_mac}
diff --git a/tests/vpp/func/ip6_tunnels/vxlan/eth2p-ethip6vxlan-l2bdbasemaclrn-func.robot b/tests/vpp/func/ip6_tunnels/vxlan/eth2p-ethip6vxlan-l2bdbasemaclrn-func.robot
new file mode 100644
index 0000000000..165da28bd2
--- /dev/null
+++ b/tests/vpp/func/ip6_tunnels/vxlan/eth2p-ethip6vxlan-l2bdbasemaclrn-func.robot
@@ -0,0 +1,80 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/overlay/vxlan.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/vm/double_qemu_setup.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPv6Setup
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | HW_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *Bridge-domain with VXLAN test cases - IPv6*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-IPv6-VXLAN-Eth-IPv6-ICMPv6 on
+| ... | DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUTn for L2 switching of IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) switching combined with MAC learning enabled;
+| ... | VXLAN tunnels are configured between L2BDs on DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets are sent
+| ... | in both directions by TG on links to DUT1 and DUT2; on receive TG
+| ... | verifies packets for correctness and their IPv6 src-addr, dst-addr
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC7348.
+
+*** Variables ***
+| ${vni_1}= | 23
+
+| ${bd_id1}= | 10
+
+| ${ip6_addr1}= | 3ffe:64::1
+| ${ip6_addr2}= | 3ffe:64::2
+| ${ip6_prefix}= | 64
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD and VXLANoIPv6 tunnels switch ICMPv6 between TG links
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG.[Enc] Eth-IPv6-VXLAN-Eth-IPv6-ICMPv6 on \
+| | ... | DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUTn. [Cfg] On DUT1 and DUT2
+| | ... | configure L2 bridge-domain (MAC learning enabled), each with one
+| | ... | interface to TG and one VXLAN tunnel interface towards the other
+| | ... | DUT. [Ver] Make TG send ICMPv6 Echo Req between two of its
+| | ... | interfaces to be switched by DUT1 and DUT2; verify all packets
+| | ... | are received. [Ref] RFC7348.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${ip6_addr1}
+| | ... | ${ip6_prefix}
+| | And Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${ip6_addr2}
+| | ... | ${ip6_prefix}
+| | And VPP IP Probe | ${dut1_node} | ${dut1_to_dut2} | ${ip6_addr2}
+| | And VPP IP Probe | ${dut2_node} | ${dut2_to_dut1} | ${ip6_addr1}
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | ${dut1s_vxlan}= | When Create VXLAN interface | ${dut1_node} | ${vni_1}
+| | | ... | ${ip6_addr1} | ${ip6_addr2}
+| | And Add interfaces to L2BD | ${dut1_node} | ${bd_id1}
+| | ... | ${dut1_to_tg} | ${dut1s_vxlan}
+| | ${dut2s_vxlan}= | And Create VXLAN interface | ${dut2_node} | ${vni_1}
+| | | ... | ${ip6_addr2} | ${ip6_addr1}
+| | And Add interfaces to L2BD | ${dut2_node} | ${bd_id1}
+| | ... | ${dut2_to_tg} | ${dut2s_vxlan}
+| | Then Send ICMPv6 bidirectionally and verify received packets
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
diff --git a/tests/vpp/func/ip6_tunnels/vxlan/eth4p-ethip6vxlan-l2bdbasemaclrn-l2shg-func.robot b/tests/vpp/func/ip6_tunnels/vxlan/eth4p-ethip6vxlan-l2bdbasemaclrn-l2shg-func.robot
new file mode 100644
index 0000000000..115883f1b1
--- /dev/null
+++ b/tests/vpp/func/ip6_tunnels/vxlan/eth4p-ethip6vxlan-l2bdbasemaclrn-l2shg-func.robot
@@ -0,0 +1,203 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/overlay/vxlan.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/vm/double_qemu_setup.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPv6Setup
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | HW_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2BD with SHG combined with VXLAN test cases - IPv6*
+| ...
+| ... | *[Top] Network topologies:* TG=DUT1=DUT2=TG 3-node circular topology
+| ... | with double parallel links.
+| ... | *[Enc] Packet encapsulations:* th-IPv6-VXLAN-Eth-IPv6-ICMPv6 on
+| ... | DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUTn for L2 switching of IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) switching combined with MAC learning enabled
+| ... | and Split Horizon Groups (SHG); VXLAN tunnels are configured
+| ... | between L2BDs on DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent
+| ... | in both directions by TG on links to DUT1 and DUT2; on receive TG
+| ... | verifies packets for correctness and their IPv6 src-addr, dst-addr
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC7348.
+
+*** Variables ***
+| ${vni_1}= | 23
+| ${vni_2}= | 35
+
+| ${bd_id1}= | 10
+| ${bd_id2}= | 20
+| ${bd_id3}= | 30
+| ${shg1}= | 1
+| ${shg2}= | 2
+
+| ${ip6_addr1}= | 3ffe:64::1
+| ${ip6_addr2}= | 3ffe:64::2
+| ${ip6_prefix}= | 64
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD and VXLANoIPv6 tunnels in SHG switch ICMPv6 between TG links
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG. [Enc] Eth-IPv6-VXLAN-Eth-IPv6-ICMPv6 on \
+| | ... | DUT1-DUT2; Eth-IPv6-ICMPv6 on TG-DUTn. [Cfg] On DUT1 configure L2
+| | ... | bridge-domain (MAC learning enabled) with two untagged interfaces
+| | ... | to TG and two VXLAN interfaces towards the DUT2 and put both VXLAN
+| | ... | interfaces into the same Split-Horizon-Group (SHG). On DUT2 configure
+| | ... | two L2 bridge-domain (MAC learning enabled), each with one untagged
+| | ... | interface to TG and one VXLAN interface towards the DUT1. [Ver] Make
+| | ... | TG send ICMPv6 Echo Reqs between all four of its interfaces to be
+| | ... | switched by DUT1 and DUT2; verify packets are not switched between
+| | ... | TG interfaces connected to DUT2 that are isolated by SHG on DUT1.
+| | ... | [Ref] RFC7348.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path for 3-node BD-SHG test | ${nodes['TG']}
+| | ... | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']}
+| | And Set interfaces in 3-node BD-SHG test up
+| | And Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${ip6_addr1}
+| | ... | ${ip6_prefix}
+| | And Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${ip6_addr2}
+| | ... | ${ip6_prefix}
+| | And VPP IP Probe | ${dut1_node} | ${dut1_to_dut2} | ${ip6_addr2}
+| | And VPP IP Probe | ${dut2_node} | ${dut2_to_dut1} | ${ip6_addr1}
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | ${dut1s_vxlan1}= | When Create VXLAN interface | ${dut1_node} | ${vni_1}
+| | | ... | ${ip6_addr1} | ${ip6_addr2}
+| | ${dut1s_vxlan2}= | And Create VXLAN interface | ${dut1_node} | ${vni_2}
+| | | ... | ${ip6_addr1} | ${ip6_addr2}
+| | ${dut2s_vxlan1}= | And Create VXLAN interface | ${dut2_node} | ${vni_1}
+| | | ... | ${ip6_addr2} | ${ip6_addr1}
+| | ${dut2s_vxlan2}= | And Create VXLAN interface | ${dut2_node} | ${vni_2}
+| | | ... | ${ip6_addr2} | ${ip6_addr1}
+| | And Set Interface State | ${dut1_node} | ${dut1s_vxlan1} | up
+| | And Set Interface State | ${dut1_node} | ${dut1s_vxlan2} | up
+| | And Set Interface State | ${dut2_node} | ${dut2s_vxlan1} | up
+| | And Set Interface State | ${dut2_node} | ${dut2s_vxlan2} | up
+| | And Vpp Node Interfaces Ready Wait | ${dut1_node}
+| | And Vpp Node Interfaces Ready Wait | ${dut2_node}
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg_if2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1s_vxlan1}
+| | ... | ${bd_id1} | ${shg1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1s_vxlan2}
+| | ... | ${bd_id1} | ${shg1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg_if1}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2s_vxlan1}
+| | ... | ${bd_id2}
+| | And Create bridge domain | ${dut2_node} | ${bd_id3}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg_if2}
+| | ... | ${bd_id3}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2s_vxlan2}
+| | ... | ${bd_id3}
+| | Then Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut2_if1}
+| | And Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut2_if2}
+| | And Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut2_if1}
+| | And Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut2_if2}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMPv6 bidirectionally and verify received packets
+| | | ... | ${tg_node} | ${tg_to_dut2_if1}
+| | | ... | ${tg_to_dut2_if2}
+
+| TC02: DUT1 and DUT2 with L2BD and VXLANoIPv6 tunnels in different SHGs switch ICMPv6 between TG links
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG.[Enc] Eth-IPv6-VXLAN-Eth-IPv6-ICMPv6 on \
+| | ... | DUT1-DUT2; Eth-IPv6-ICMPv6 on TG-DUTn. [Cfg] On DUT1 configure L2
+| | ... | bridge-domain (MAC learning enabled) with two untagged interfaces
+| | ... | to TG and two VXLAN interfaces towards the DUT2 and put both VXLAN
+| | ... | interfaces into the different Split-Horizon-Group (SHGs). On DUT2
+| | ... | configure two L2 bridge-domain (MAC learning enabled), each with one
+| | ... | untagged interface to TG and one VXLAN interface towards the DUT1.
+| | ... | [Ver] Make TG send ICMPv6 Echo Req between all four of its interfaces
+| | ... | to be switched by DUT1 and DUT2; verify packets are switched between
+| | ... | all TG interfaces. [Ref] RFC7348.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path for 3-node BD-SHG test | ${nodes['TG']}
+| | ... | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']}
+| | And Set interfaces in 3-node BD-SHG test up
+| | And Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${ip6_addr1}
+| | ... | ${ip6_prefix}
+| | And Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${ip6_addr2}
+| | ... | ${ip6_prefix}
+| | And VPP IP Probe | ${dut1_node} | ${dut1_to_dut2} | ${ip6_addr2}
+| | And VPP IP Probe | ${dut2_node} | ${dut2_to_dut1} | ${ip6_addr1}
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | ${dut1s_vxlan1}= | When Create VXLAN interface | ${dut1_node} | ${vni_1}
+| | | ... | ${ip6_addr1} | ${ip6_addr2}
+| | ${dut1s_vxlan2}= | And Create VXLAN interface | ${dut1_node} | ${vni_2}
+| | | ... | ${ip6_addr1} | ${ip6_addr2}
+| | ${dut2s_vxlan1}= | And Create VXLAN interface | ${dut2_node} | ${vni_1}
+| | | ... | ${ip6_addr2} | ${ip6_addr1}
+| | ${dut2s_vxlan2}= | And Create VXLAN interface | ${dut2_node} | ${vni_2}
+| | | ... | ${ip6_addr2} | ${ip6_addr1}
+| | And Set Interface State | ${dut1_node} | ${dut1s_vxlan1} | up
+| | And Set Interface State | ${dut1_node} | ${dut1s_vxlan2} | up
+| | And Set Interface State | ${dut2_node} | ${dut2s_vxlan1} | up
+| | And Set Interface State | ${dut2_node} | ${dut2s_vxlan2} | up
+| | And Vpp Node Interfaces Ready Wait | ${dut1_node}
+| | And Vpp Node Interfaces Ready Wait | ${dut2_node}
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg_if2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1s_vxlan1}
+| | ... | ${bd_id1} | ${shg1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1s_vxlan2}
+| | ... | ${bd_id1} | ${shg2}
+| | And Create bridge domain | ${dut2_node} | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg_if1}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2s_vxlan1}
+| | ... | ${bd_id2}
+| | And Create bridge domain | ${dut2_node} | ${bd_id3}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg_if2}
+| | ... | ${bd_id3}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2s_vxlan2}
+| | ... | ${bd_id3}
+| | Then Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut2_if1}
+| | And Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut2_if2}
+| | And Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut2_if1}
+| | And Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut2_if2}
+| | And Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut2_if1}
+| | ... | ${tg_to_dut2_if2}
diff --git a/tests/vpp/func/l2bd/eth2p-dot1ad--dot1q-l2bdbasemaclrn-vlantrans21-func.robot b/tests/vpp/func/l2bd/eth2p-dot1ad--dot1q-l2bdbasemaclrn-vlantrans21-func.robot
new file mode 100644
index 0000000000..38f370ef34
--- /dev/null
+++ b/tests/vpp/func/l2bd/eth2p-dot1ad--dot1q-l2bdbasemaclrn-vlantrans21-func.robot
@@ -0,0 +1,221 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2BD with VLAN tag rewrite test cases - transalte-2-1*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1ad-IPv4-ICMPv4 or
+| ... | Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1, Eth-dot1q-IPv4-ICMPv4 or
+| ... | Eth-dot1q-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv4-ICMPv4 or Eth-IPv6-ICMPv6
+| ... | on TG-DUT2 for L2 switching of IPv4/IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with bridge domain (L2BD)
+| ... | switching combined with MAC learning enabled and added VLAN
+| ... | sub-interface with VLAN tag rewrite translate-2-1 method of interface
+| ... | towards TG and interface towards DUT2. DUT2 is configured with L2
+| ... | bridge domain (L2BD) switching between VLAN sub-interface with VLAN tag
+| ... | rewrite pop-1 method of interface towards DUT1 and interface towards TG.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are
+| ... | sent from TG on link to DUT1 and received in TG on link form DUT2;
+| ... | on receive TG verifies packets for correctness and their IPv4 src-addr,
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1q, IEEE 802.1ad.
+
+*** Variables ***
+| ${bd_id1}= | 1
+
+| ${subid}= | 10
+
+| ${outer_vlan_id1}= | 110
+| ${outer_vlan_id2}= | 120
+| ${outer_vlan_wrong}= | 150
+
+| ${inner_vlan_id1}= | 210
+
+| ${src_ip6}= | 3ffe:63::1
+| ${dst_ip6}= | 3ffe:63::2
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD and VLAN translate-2-1 (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1q-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one Dot1ad sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-2-1 method; on DUT2 configure L2 bridge domain (L2BD) with
+| | ... | one interface to TG and one VLAN sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-1 method. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-1 | tag1_id=${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
+
+| TC02: DUT1 and DUT2 with L2BD and VLAN translate-2-1 with wrong tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1q-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one Dot1ad sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-2-1 method to set tag different from tag set on VLAN
+| | ... | sub-interface of DUT2; on DUT2 configure L2 bridge domain (L2BD) with
+| | ... | one interface to TG and one VLAN sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-1 method. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-1 | tag1_id=${outer_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+
+| TC03: DUT1 and DUT2 with L2BD and VLAN translate-2-1 (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1q-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one Dot1ad sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-2-1 method; on DUT2 configure L2 bridge domain (L2BD) with
+| | ... | one interface to TG and one VLAN sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-1 method. [Ver] Make TG send ICMPv6 Echo Req
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-1 | tag1_id=${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | src_ip=${src_ip6}
+| | ... | dst_ip=${dst_ip6} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC04: DUT1 and DUT2 with L2BD and VLAN translate-2-1 with wrong tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1q-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one Dot1ad sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-2-1 method to set tag different from tag set on VLAN
+| | ... | sub-interface of DUT2; on DUT2 configure L2 bridge domain (L2BD) with
+| | ... | one interface to TG and one VLAN sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-1 method. [Ver] Make TG send ICMPv6 Echo Req
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-1 | tag1_id=${outer_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip6} | dst_ip=${dst_ip6} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
diff --git a/tests/vpp/func/l2bd/eth2p-dot1ad-l2bdbasemaclrn-vlantrans22-func.robot b/tests/vpp/func/l2bd/eth2p-dot1ad-l2bdbasemaclrn-vlantrans22-func.robot
new file mode 100644
index 0000000000..06a4794086
--- /dev/null
+++ b/tests/vpp/func/l2bd/eth2p-dot1ad-l2bdbasemaclrn-vlantrans22-func.robot
@@ -0,0 +1,405 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2BD with VLAN tag rewrite test cases - translate-2-2*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1ad-IPv4-ICMPv4 or
+| ... | Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1 and DUT1-DUT2, Eth-IPv4-ICMPv4 or
+| ... | Eth-IPv6-ICMPv6 on TG-DUT2 for L2 switching of IPv4/IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with bridge domain (L2BD)
+| ... | switching combined with MAC learning enabled and added VLAN
+| ... | sub-interface with VLAN tag rewrite translate-2-2 method of interface
+| ... | towards TG and interface towards DUT2. DUT2 is configured with L2
+| ... | bridge domain (L2BD) switching between VLAN sub-interface with VLAN tag
+| ... | rewrite pop-2 method of interface towards DUT1 and interface towards TG.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are
+| ... | sent from TG on link to DUT1 and received in TG on link form DUT2;
+| ... | on receive TG verifies packets for correctness and their IPv4 src-addr,
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1q, IEEE 802.1ad.
+
+*** Variables ***
+| ${bd_id1}= | 1
+
+| ${subid}= | 10
+
+| ${outer_vlan_id1}= | 110
+| ${outer_vlan_id2}= | 120
+| ${outer_vlan_wrong}= | 150
+
+| ${inner_vlan_id1}= | 210
+| ${inner_vlan_id2}= | 220
+| ${inner_vlan_wrong}= | 250
+
+| ${src_ip6}= | 3ffe:63::1
+| ${dst_ip6}= | 3ffe:63::2
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD and VLAN translate-2-2 switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method;
+| | ... | on DUT2 configure L2 bridge domain (L2BD) with one interface to TG and
+| | ... | one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite pop-2
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | method. [Ver] Make TG send ICMPv4 Echo Req via DUT1 and DUT2; verify
+| | ... | that packet is received. [Ref] IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
+
+| TC02: DUT1 and DUT2 with L2BD and VLAN translate-2-2 with wrong inner tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set inner tag different from inner tag set on Dot1ad sub-interface of
+| | ... | DUT2; on DUT2 configure L2 bridge domain (L2BD) with one interface to
+| | ... | TG and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite
+| | ... | pop-2 tagged with Dot1ad tags from one of its interfaces to another
+| | ... | one method. [Ver] Make TG send ICMPv4 Echo Req via DUT1 and DUT2;
+| | ... | verify that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC03: DUT1 and DUT2 with L2BD and VLAN translate-2-2 with wrong outer tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set outer tag different from outer tag set on Dot1ad sub-interface of
+| | ... | DUT2; on DUT2 configure L2 bridge domain (L2BD) with one interface to
+| | ... | TG and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite
+| | ... | pop-2 tagged with Dot1ad tags from one of its interfaces to another
+| | ... | one method. [Ver] Make TG send ICMPv4 Echo Req via DUT1 and DUT2;
+| | ... | verify that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC04: DUT1 and DUT2 with L2BD and VLAN translate-2-2 with wrong outer and inner tags used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set tags different from tags set on Dot1ad sub-interface of DUT2;
+| | ... | on DUT2 configure L2 bridge domain (L2BD) with one interface to TG
+| | ... | and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite pop-2
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | method. [Ver] Make TG send ICMPv4 Echo Req via DUT1 and DUT2; verify
+| | ... | that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC05: DUT1 and DUT2 with L2BD and VLAN translate-2-2 switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method;
+| | ... | on DUT2 configure L2 bridge domain (L2BD) with one interface to TG and
+| | ... | one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | method. [Ver] Make TG send ICMPv6 Echo Req via DUT1 and DUT2; verify
+| | ... | that packet is received. [Ref] IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | src_ip=${src_ip6}
+| | ... | dst_ip=${dst_ip6} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC06: DUT1 and DUT2 with L2BD and VLAN translate-2-2 with wrong inner tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set inner tag different from inner tag set on Dot1ad sub-interface of
+| | ... | DUT2; on DUT2 configure L2 bridge domain (L2BD) with one interface to
+| | ... | TG and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite
+| | ... | pop-1 tagged with Dot1ad tags from one of its interfaces to another
+| | ... | one method. [Ver] Make TG send ICMPv6 Echo Req via DUT1 and DUT2;
+| | ... | verify that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip6} | dst_ip=${dst_ip6} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
+
+| TC07: DUT1 and DUT2 with L2BD and VLAN translate-2-2 with wrong outer tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set outer tag different from outer tag set on Dot1ad sub-interface of
+| | ... | DUT2; on DUT2 configure L2 bridge domain (L2BD) with one interface to
+| | ... | TG and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite
+| | ... | pop-1 tagged with Dot1ad tags from one of its interfaces to another
+| | ... | one method. [Ver] Make TG send ICMPv6 Echo Req via DUT1 and DUT2;
+| | ... | verify that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip6} | dst_ip=${dst_ip6} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
+
+| TC08: DUT1 and DUT2 with L2BD and VLAN translate-2-2 with wrong outer and inner tags used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set tags different from tags set on Dot1ad sub-interface of DUT2;
+| | ... | on DUT2 configure L2 bridge domain (L2BD) with one interface to TG
+| | ... | and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | method. [Ver] Make TG send ICMPv6 Echo Req via DUT1 and DUT2; verify
+| | ... | that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip6} | dst_ip=${dst_ip6} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
diff --git a/tests/vpp/func/l2bd/eth2p-dot1q--dot1ad-l2bdbasemaclrn-vlantrans12-func.robot b/tests/vpp/func/l2bd/eth2p-dot1q--dot1ad-l2bdbasemaclrn-vlantrans12-func.robot
new file mode 100644
index 0000000000..e71e75f563
--- /dev/null
+++ b/tests/vpp/func/l2bd/eth2p-dot1q--dot1ad-l2bdbasemaclrn-vlantrans12-func.robot
@@ -0,0 +1,394 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2BD with VLAN tag rewrite test cases - translate-1-2*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1q-IPv4-ICMPv4 or
+| ... | Eth-dot1q-IPv6-ICMPv6 on TG-DUT1, Eth-dot1ad-IPv4-ICMPv4 or
+| ... | Eth-dot1ad-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv4-ICMPv4 or Eth-IPv6-ICMPv6
+| ... | on TG-DUT2 for L2 switching of IPv4/IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with bridge domain (L2BD)
+| ... | switching combined with MAC learning enabled and added VLAN
+| ... | sub-interface with VLAN tag rewrite translate-1-2 method of interface
+| ... | towards TG and interface towards DUT2. DUT2 is configured with L2
+| ... | bridge domain (L2BD) switching between VLAN sub-interface with VLAN tag
+| ... | rewrite pop-2 method of interface towards DUT1 and interface towards TG.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are
+| ... | sent from TG on link to DUT1 and received in TG on link form DUT2;
+| ... | on receive TG verifies packets for correctness and their IPv4 src-addr,
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1q, IEEE 802.1ad.
+
+*** Variables ***
+| ${bd_id1}= | 1
+
+| ${subid}= | 10
+
+| ${outer_vlan_id1}= | 110
+| ${outer_vlan_id2}= | 120
+| ${outer_vlan_wrong}= | 150
+
+| ${inner_vlan_id1}= | 210
+| ${inner_vlan_id2}= | 220
+| ${inner_vlan_wrong}= | 250
+
+| ${src_ip6}= | 3ffe:63::1
+| ${dst_ip6}= | 3ffe:63::2
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD and VLAN translate-1-2 (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method; on DUT2 configure L2 bridge domain (L2BD) with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | tagged with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_id1}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
+
+| TC02: DUT1 and DUT2 with L2BD and VLAN translate-1-2 with wrong inner tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set inner tag different from inner tag set on
+| | ... | Dot1ad sub-interface of DUT2; on DUT2 configure L2 bridge domain with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | tagged with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC03: DUT1 and DUT2 with L2BD and VLAN translate-1-2 with wrong outer tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set outer tag different from outer tag set on
+| | ... | Dot1ad sub-interface of DUT2; on DUT2 configure L2 bridge domain with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | tagged with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_id1}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC04: DUT1 and DUT2 with L2BD and VLAN translate-1-2 with wrong outer and inner tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set outer and inner tags different from tags
+| | ... | set on Dot1ad sub-interface of DUT2; on DUT2 configure L2
+| | ... | bridge domain with one interface to TG and one Dot1ad sub-interface
+| | ... | towards DUT1 with VLAN tag rewrite pop-2 method. [Ver] Make TG send
+| | ... | ICMPv4 Echo Req tagged with one Dot1q tag from one of its interfaces
+| | ... | to another one via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC05: DUT1 and DUT2 with L2BD and VLAN translate-1-2 (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method; on DUT2 configure L2 bridge domain (L2BD) with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv6 Echo Req
+| | ... | tagged with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | src_ip=${src_ip6}
+| | ... | dst_ip=${dst_ip6} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC06: DUT1 and DUT2 with L2BD and VLAN translate-1-2 with wrong inner tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set inner tag different from inner tag set on
+| | ... | Dot1ad sub-interface of DUT2; on DUT2 configure L2 bridge domain with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv6 Echo Req
+| | ... | tagged with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip6} | dst_ip=${dst_ip6} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
+
+| TC07: DUT1 and DUT2 with L2BD and VLAN translate-1-2 with wrong outer tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set outer tag different from outer tag set on
+| | ... | Dot1ad sub-interface of DUT2; on DUT2 configure L2 bridge domain with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv6 Echo Req
+| | ... | tagged with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip6} | dst_ip=${dst_ip6} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
+
+| TC08: DUT1 and DUT2 with L2BD and VLAN translate-1-2 with wrong outer and inner tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 bridge domain (L2BD) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set outer and inner tags different from tags
+| | ... | set on Dot1ad sub-interface of DUT2; on DUT2 configure L2
+| | ... | bridge domain with one interface to TG and one Dot1ad sub-interface
+| | ... | towards DUT1 with VLAN tag rewrite pop-2 method. [Ver] Make TG send
+| | ... | ICMPv6 Echo Req tagged with one Dot1q tag from one of its interfaces
+| | ... | to another one via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip6} | dst_ip=${dst_ip6} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
diff --git a/tests/vpp/func/l2bd/eth2p-dot1q-l2bdbasemaclrn-vlantrans11-func.robot b/tests/vpp/func/l2bd/eth2p-dot1q-l2bdbasemaclrn-vlantrans11-func.robot
new file mode 100644
index 0000000000..aba84789b1
--- /dev/null
+++ b/tests/vpp/func/l2bd/eth2p-dot1q-l2bdbasemaclrn-vlantrans11-func.robot
@@ -0,0 +1,206 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2BD with VLAN tag rewrite test cases - translate-1-1*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1q-IPv4-ICMPv4 or
+| ... | Eth-dot1q-IPv6-ICMPv6 on TG-DUT1 and DUT1-DUT2, Eth-IPv4-ICMPv4 or
+| ... | Eth-IPv6-ICMPv6 on TG-DUT2 for L2 switching of IPv4/IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with bridge domain (L2BD)
+| ... | switching combined with MAC learning enabled and added VLAN
+| ... | sub-interface with VLAN tag rewrite translate-1-1 method of interface
+| ... | towards TG and interface towards DUT2. DUT2 is configured with L2
+| ... | bridge domain (L2BD) switching between VLAN sub-interface with VLAN tag
+| ... | rewrite pop-1 method of interface towards DUT1 and interface towards TG.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are
+| ... | sent from TG on link to DUT1 and received in TG on link form DUT2;
+| ... | on receive TG verifies packets for correctness and their IPv4 src-addr,
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1q, IEEE 802.1ad.
+
+*** Variables ***
+| ${bd_id1}= | 1
+
+| ${subid}= | 10
+
+| ${outer_vlan_id1}= | 110
+| ${outer_vlan_id2}= | 120
+| ${outer_vlan_wrong}= | 150
+
+| ${inner_vlan_id1}= | 210
+| ${inner_vlan_wrong}= | 250
+
+| ${src_ip6}= | 3ffe:63::1
+| ${dst_ip6}= | 3ffe:63::2
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD and VLAN translate-1-1 (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain with one interface to DUT2 and one VLAN
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-1-1 method;
+| | ... | on DUT2 configure L2 bridge domain (L2BD) with one interface to TG
+| | ... | and one VLAN sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | method. [Ver] Make TG send ICMPv4 Echo Req tagged with one Dot1q tag
+| | ... | from one of its interfaces to another one via DUT1 and DUT2; verify
+| | ... | that packet is received. [Ref] IEEE 802.1q
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-1 | tag1_id=${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
+
+| TC02: DUT1 and DUT2 with L2BD and VLAN translate-1-1 with wrong tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one VLAN
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-1-1 method
+| | ... | to set tag different from tag set on VLAN sub-interface of DUT2;
+| | ... | on DUT2 configure L2 bridge domain (L2BD) with one interface to TG
+| | ... | and one VLAN sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | method. [Ver] Make TG send ICMPv4 Echo Req tagged with one Dot1q tag
+| | ... | from one of its interfaces to another one via DUT1 and DUT2; verify
+| | ... | that packet is not received. [Ref] IEEE 802.1q
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-1 | tag1_id=${outer_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC03: DUT1 and DUT2 with L2BD and VLAN translate-1-1 (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one VLAN
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-1-1 method;
+| | ... | on DUT2 configure L2 bridge domain (L2BD) with one interface to TG
+| | ... | and one VLAN sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | method. [Ver] Make TG send ICMPv6 Echo Req tagged with one Dot1q tag
+| | ... | from one of its interfaces to another one via DUT1 and DUT2; verify
+| | ... | that packet is received. [Ref] IEEE 802.1q
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-1 | tag1_id=${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | src_ip=${src_ip6}
+| | ... | dst_ip=${dst_ip6} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC04: DUT1 and DUT2 with L2BD and VLAN translate-1-1 with wrong tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | bridge domain (L2BD) with one interface to DUT2 and one VLAN
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-1-1 method
+| | ... | to set tag different from tag set on VLAN sub-interface of DUT2;
+| | ... | on DUT2 configure L2 bridge domain (L2BD) with one interface to TG
+| | ... | and one VLAN sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | method. [Ver] Make TG send ICMPv6 Echo Req tagged with one Dot1q tag
+| | ... | from one of its interfaces to another one via DUT1 and DUT2; verify
+| | ... | that packet is not received. [Ref] IEEE 802.1q
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-1 | tag1_id=${outer_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut2_node} | ${vlan2_index}
+| | ... | ${bd_id1}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip6} | dst_ip=${dst_ip6} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
diff --git a/tests/vpp/func/l2bd/eth2p-eth-l2bdbasemaclrn-func.robot b/tests/vpp/func/l2bd/eth2p-eth-l2bdbasemaclrn-func.robot
new file mode 100644
index 0000000000..43e092dae2
--- /dev/null
+++ b/tests/vpp/func/l2bd/eth2p-eth-l2bdbasemaclrn-func.robot
@@ -0,0 +1,91 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2 bridge-domain test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG=DUT1 2-node topology with two links
+| ... | between nodes; TG-DUT1-DUT2-TG 3-node circular topology with
+| ... | single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of
+| ... | IPv4; Eth-IPv6-ICMPv6 for L2 switching of IPv6 use. Both apply
+| ... | to all links.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) switching combined with MAC learning enabled.
+| ... | *[Ver] TG verification:* Test ICMPv4 (or ICMPv6) Echo Request packets
+| ... | are sent in both directions by TG on links to DUT1 and DUT2; on
+| ... | receive TG verifies packets for correctness and their IPv4 (IPv6)
+| ... | src-addr, dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+
+*** Test Cases ***
+| TC01: DUT reports active interfaces
+| | [Documentation]
+| | ... | [Top] TG=DUT1; TG-DUT1-DUT2-TG. [Enc] None. [Cfg] Discovered \
+| | ... | active interfaces. [Ver] Report active interfaces on DUT. [Ref]
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO | 3_NODE_SINGLE_LINK_TOPO
+| | VPP reports interfaces through VAT on '${nodes['DUT1']}'
+
+| TC02: DUT with L2BD (MAC learning) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG=DUT1. [Enc] Eth-IPv4-ICMPv4. [Cfg] On DUT1 configure \
+| | ... | two i/fs into L2BD with MAC learning. [Ver] Make TG verify
+| | ... | ICMPv4 Echo Req pkts are switched thru DUT1 in both directions
+| | ... | and are correct on receive. [Ref]
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | When Create bridge domain | ${dut_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${bd_id1}
+| | Then Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+
+| TC03: DUT1 and DUT2 with L2BD (MAC learning) switch between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-ICMPv4. [Cfg] On DUT1 and DUT2 \
+| | ... | configure two i/fs into L2BD with MAC learning. [Ver] Make TG
+| | ... | verify ICMPv4 Echo Req pkts are switched thru DUT1 and DUT2 in
+| | ... | both directions and are correct on receive. [Ref]
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | When Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_dut1}
+| | ... | ${bd_id2}
+| | Then Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1} | ${tg_to_dut2}
diff --git a/tests/vpp/func/l2bd/eth2p-eth-l2bdbasemacstc-func.robot b/tests/vpp/func/l2bd/eth2p-eth-l2bdbasemacstc-func.robot
new file mode 100644
index 0000000000..ce99a35fcb
--- /dev/null
+++ b/tests/vpp/func/l2bd/eth2p-eth-l2bdbasemacstc-func.robot
@@ -0,0 +1,85 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2 bridge-domain test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of
+| ... | IPv4; Eth-IPv6-ICMPv6 for L2 switching of IPv6 use. Both apply
+| ... | to all links.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) switching combined with static MACs.
+| ... | *[Ver] TG verification:* Test ICMPv4 (or ICMPv6) Echo Request packets
+| ... | are sent in both directions by TG on links to DUT1 and DUT2; on
+| ... | receive TG verifies packets for correctness and their IPv4 (IPv6)
+| ... | src-addr, dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD (static MACs) switch between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-ICMPv4. [Cfg] On DUT1 and \
+| | ... | DUT2 configure two i/fs into L2BD with static MACs. [Ver] Make
+| | ... | TG verify ICMPv4 Echo Req pkts are switched thru DUT1 and DUT2
+| | ... | in both directions and are correct on receive. [Ref]
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | When Create bridge domain | ${dut1_node} | ${bd_id1} | learn=${FALSE}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut1}
+| | ... | ${dut1_node}
+| | ... | ${dut1_to_tg}
+| | ... | ${bd_id1}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut2}
+| | ... | ${dut1_node}
+| | ... | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id2}
+| | ... | learn=${FALSE}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_dut1}
+| | ... | ${bd_id2}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut1}
+| | ... | ${dut2_node}
+| | ... | ${dut2_to_dut1}
+| | ... | ${bd_id2}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut2}
+| | ... | ${dut2_node}
+| | ... | ${dut2_to_tg}
+| | ... | ${bd_id2}
+| | Then Send ICMPv4 bidirectionally and verify received packets | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2}
diff --git a/tests/vpp/func/l2bd/eth4p-eth-l2bdbasemaclrn-l2shg-func.robot b/tests/vpp/func/l2bd/eth4p-eth-l2bdbasemaclrn-l2shg-func.robot
new file mode 100644
index 0000000000..04cb91376a
--- /dev/null
+++ b/tests/vpp/func/l2bd/eth4p-eth-l2bdbasemaclrn-l2shg-func.robot
@@ -0,0 +1,86 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2 bridge-domain test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG=DUT1=DUT2=TG 3-node circular topology
+| ... | with double parallel links.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of
+| ... | IPv4; Eth-IPv6-ICMPv6 for L2 switching of IPv6 use. Both apply
+| ... | to all links.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) switching combined with MAC learning enabled
+| ... | and Split Horizon Groups (SHG).
+| ... | *[Ver] TG verification:* Test ICMPv4 (or ICMPv6) Echo Request packets
+| ... | are sent in both directions by TG on links to DUT1 and DUT2; on
+| ... | receive TG verifies packets for correctness and their IPv4 (IPv6)
+| ... | src-addr, dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+
+| ${shg1}= | 3
+| ${shg2}= | 4
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2BD (MAC learn) and SHG switch between four TG links
+| | [Documentation]
+| | ... | [Top] TG=DUT1=DUT2=TG. [Enc] Eth-IPv4-ICMPv4. [Cfg] On DUT1 and \
+| | ... | DUT2 configure four i/fs into L2BD with MAC learning and the
+| | ... | same SHG on i/fs towards TG. [Ver] Make TG verify ICMPv4 Echo
+| | ... | Req pkts are switched thru DUT1 and DUT2 in both directions and
+| | ... | are correct on receive; verify no pkts are switched thru SHG
+| | ... | isolated interfaces. [Ref]
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Configure path for 3-node BD-SHG test | ${nodes['TG']}
+| | ... | ${nodes['DUT1']} | ${nodes['DUT2']}
+| | And Set interfaces in 3-node BD-SHG test up
+| | When Create bridge domain | ${dut1_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg_if1}
+| | ... | ${bd_id1} | ${shg1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_tg_if2}
+| | ... | ${bd_id1} | ${shg1}
+| | And Add interface to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut2_node} | ${bd_id2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg_if1}
+| | ... | ${bd_id2} | ${shg2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_tg_if2}
+| | ... | ${bd_id2} | ${shg2}
+| | And Add interface to bridge domain | ${dut2_node} | ${dut2_to_dut1}
+| | ... | ${bd_id2}
+| | Then Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if1} | ${tg_to_dut2_if1}
+| | And Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if1} | ${tg_to_dut2_if2}
+| | And Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if2} | ${tg_to_dut2_if1}
+| | And Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut1_if2} | ${tg_to_dut2_if2}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMPv4 bidirectionally and verify received packets
+| | | ... | ${tg_node} | ${tg_to_dut1_if1} | ${tg_to_dut1_if2}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMPv4 bidirectionally and verify received packets
+| | | ... | ${tg_node} | ${tg_to_dut2_if1} | ${tg_to_dut2_if2}
diff --git a/tests/vpp/func/l2xc/eth2p-dot1ad--dot1q-l2xcbase-vlantrans21-func.robot b/tests/vpp/func/l2xc/eth2p-dot1ad--dot1q-l2xcbase-vlantrans21-func.robot
new file mode 100644
index 0000000000..c0e8c5c899
--- /dev/null
+++ b/tests/vpp/func/l2xc/eth2p-dot1ad--dot1q-l2xcbase-vlantrans21-func.robot
@@ -0,0 +1,189 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2XC with VLAN tag rewrite test cases - translate-2-1*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1ad-IPv4-ICMPv4 or
+| ... | Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1, Eth-dot1q-IPv4-ICMPv4 or
+| ... | Eth-dot1aq-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2
+| ... | for L2 switching of IPv4/IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with L2 cross-connect
+| ... | (L2XC) switching between VLAN sub-interface with VLAN tag rewrite
+| ... | translate-2-1 method of interface towards TG and interface towards DUT2.
+| ... | DUT2 is configured configured with L2 cross-connect (L2XC) switching
+| ... | between VLAN sub-interface with VLAN tag rewrite pop-1 method
+| ... | of interface towards DUT1 and interface towards TG.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are
+| ... | sent from TG on link to DUT1 and received in TG on link form DUT2;
+| ... | on receive TG verifies packets for correctness and their IPv4 src-addr,
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1q, IEEE 802.1ad.
+
+*** Variables ***
+| ${subid}= | 10
+
+| ${outer_vlan_id1}= | 110
+| ${outer_vlan_id2}= | 120
+| ${outer_vlan_wrong}= | 150
+
+| ${inner_vlan_id1}= | 210
+
+| ${src_ip}= | 3ffe:63::1
+| ${dst_ip}= | 3ffe:63::2
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2XC and VLAN translate-2-1 (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1q-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one Dot1ad sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-2-1 method; on DUT2 configure L2 cross-connect (L2XC) with
+| | ... | one interface to TG and one VLAN sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-1 method. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-1 | tag1_id=${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
+
+| TC02: DUT1 and DUT2 with L2XC and VLAN translate-2-1 with wrong tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1q-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one Dot1ad sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-2-1 method to set tag different from tag set on VLAN
+| | ... | sub-interface of DUT2; on DUT2 configure L2 cross-connect (L2XC) with
+| | ... | one interface to TG and one VLAN sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-1 method. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-1 | tag1_id=${outer_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC03: DUT1 and DUT2 with L2XC and VLAN translate-2-1 (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1q-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one Dot1ad sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-2-1 method; on DUT2 configure L2 cross-connect (L2XC) with
+| | ... | one interface to TG and one VLAN sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-1 method. [Ver] Make TG send ICMPv6 Echo Req
+| | ... | tagegd with Dot1ad tags from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-1 | tag1_id=${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | src_ip=${src_ip}
+| | ... | dst_ip=${dst_ip} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC04: DUT1 and DUT2 with L2XC and VLAN translate-2-1 with wrong tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1q-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one Dot1ad sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-2-1 method to set tag different from tag set on VLAN
+| | ... | sub-interface of DUT2; on DUT2 configure L2 cross-connect (L2XC) with
+| | ... | one interface to TG and one VLAN sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-1 method. [Ver] Make TG send ICMPv6 Echo Req
+| | ... | tagegd with Dot1ad tags from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-1 | tag1_id=${outer_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip} | dst_ip=${dst_ip} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
diff --git a/tests/vpp/func/l2xc/eth2p-dot1ad-l2xcbase-func.robot b/tests/vpp/func/l2xc/eth2p-dot1ad-l2xcbase-func.robot
new file mode 100644
index 0000000000..f030e618f7
--- /dev/null
+++ b/tests/vpp/func/l2xc/eth2p-dot1ad-l2xcbase-func.robot
@@ -0,0 +1,69 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2 cross-connect with QinQ test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology with
+| ... | single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1ad-IPv4-ICMPv4 on DUT1-DUT2,
+| ... | Eth-IPv4-ICMPv4 on TG-DUTn for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | cross-connect (L2XC) switching with 802.1ad QinQ VLAN tag push and pop.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are
+| ... | sent in both directions by TG on links to DUT1 and DUT2; on receive TG
+| ... | verifies packets for correctness and their IPv4 src-addr, dst-addr and
+| ... | MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1ad.
+
+*** Variables ***
+| ${subid}= | 10
+| ${outer_vlan_id}= | 100
+| ${inner_vlan_id}= | 200
+| ${type_subif}= | two_tags
+| ${tag_rewrite_method}= | pop-2
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2XC and two VLAN push-pop switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on \
+| | ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn. [Cfg] On DUT1 and DUT2
+| | ... | configure L2 cross-connect (L2XC), each with one interface to TG
+| | ... | and one Ethernet interface towards the other DUT; each DUT
+| | ... | pushes two VLAN tags on packets received from local TG, and
+| | ... | popping two VLAN tags on packets transmitted to local TG. [Ver]
+| | ... | Make TG send ICMPv4 Echo Req in both directions between two of
+| | ... | its interfaces to be switched by DUT1 and DUT2; verify all
+| | ... | packets are received. [Ref] IEEE 802.1ad.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1_node} | ${subif_index_1} | ${dut2_node} | ${subif_index_2}
+| | ... | ${tag_rewrite_method}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subif_index_1}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${subif_index_2}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
diff --git a/tests/vpp/func/l2xc/eth2p-dot1ad-l2xcbase-vlantrans22-func.robot b/tests/vpp/func/l2xc/eth2p-dot1ad-l2xcbase-vlantrans22-func.robot
new file mode 100644
index 0000000000..14406da97f
--- /dev/null
+++ b/tests/vpp/func/l2xc/eth2p-dot1ad-l2xcbase-vlantrans22-func.robot
@@ -0,0 +1,346 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2XC with VLAN tag rewrite test cases - translate-2-2*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1ad-IPv4-ICMPv4 or
+| ... | Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1 and DUT1-DUT2, Eth-IPv4-ICMPv4 or
+| ... | Eth-IPv6-ICMPv6 on TG-DUT2 for L2 switching of IPv4/IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with L2 cross-connect
+| ... | (L2XC) switching between VLAN sub-interface with VLAN tag rewrite
+| ... | translate-2-2 method of interface towards TG and interface towards DUT2.
+| ... | DUT2 is configured configured with L2 cross-connect (L2XC) switching
+| ... | between VLAN sub-interface with VLAN tag rewrite pop-2 method
+| ... | of interface towards DUT1 and interface towards TG.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are
+| ... | sent from TG on link to DUT1 and received in TG on link form DUT2;
+| ... | on receive TG verifies packets for correctness and their IPv4 src-addr,
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1q, IEEE 802.1ad.
+
+*** Variables ***
+| ${subid}= | 10
+
+| ${outer_vlan_id1}= | 110
+| ${outer_vlan_id2}= | 120
+| ${outer_vlan_wrong}= | 150
+
+| ${inner_vlan_id1}= | 210
+| ${inner_vlan_id2}= | 220
+| ${inner_vlan_wrong}= | 250
+
+| ${src_ip}= | 3ffe:63::1
+| ${dst_ip}= | 3ffe:63::2
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2XC and VLAN translate-2-2 switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method;
+| | ... | on DUT2 configure L2 cross-connect (L2XC) with one interface to TG and
+| | ... | one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | method. [Ver] Make TG send ICMPv4 Echo Req via DUT1 and DUT2; verify
+| | ... | that packet is received. [Ref] IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
+
+| TC02: DUT1 and DUT2 with L2XC and VLAN translate-2-2 with wrong inner tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set inner tag different from inner tag set on Dot1ad sub-interface of
+| | ... | DUT2; on DUT2 configure L2 cross-connect (L2XC) with one interface to
+| | ... | TG and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite
+| | ... | pop-1 tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | method. [Ver] Make TG send ICMPv4 Echo Req via DUT1 and DUT2; verify
+| | ... | that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC03: DUT1 and DUT2 with L2XC and VLAN translate-2-2 with wrong outer tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set outer tag different from outer tag set on Dot1ad sub-interface of
+| | ... | DUT2; on DUT2 configure L2 cross-connect (L2XC) with one interface to
+| | ... | TG and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite
+| | ... | pop-1 tagged with Dot1ad tags from one of its interfaces to another
+| | ... | one method. [Ver] Make TG send ICMPv4 Echo Req via DUT1 and DUT2;
+| | ... | verify that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC04: DUT1 and DUT2 with L2XC and VLAN translate-2-2 with wrong outer and inner tags used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set tags different from tags set on Dot1ad sub-interface of DUT2;
+| | ... | on DUT2 configure L2 cross-connect (L2XC) with one interface to TG
+| | ... | and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | tagged with Dot1ad tags from one of its interfaces to another one
+| | ... | method. [Ver] Make TG send ICMPv4 Echo Req via DUT1 and DUT2; verify
+| | ... | that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC05: DUT1 and DUT2 with L2XC and VLAN translate-2-2 switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method;
+| | ... | on DUT2 configure L2 cross-connect (L2XC) with one interface to TG and
+| | ... | one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | tagegd with Dot1ad tags from one of its interfaces to another one
+| | ... | method. [Ver] Make TG send ICMPv6 Echo Req via DUT1 and DUT2; verify
+| | ... | that packet is received. [Ref] IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | src_ip=${src_ip}
+| | ... | dst_ip=${dst_ip} | encaps=Dot1ad | vlan1=${outer_vlan_id1}
+| | ... | vlan2=${inner_vlan_id1}
+
+| TC06: DUT1 and DUT2 with L2XC and VLAN translate-2-2 with wrong inner tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set inner tag different from inner tag set on Dot1ad sub-interface of
+| | ... | DUT2; on DUT2 configure L2 cross-connect (L2XC) with one interface to
+| | ... | TG and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite
+| | ... | pop-1 tagegd with Dot1ad tags from one of its interfaces to another one
+| | ... | method. [Ver] Make TG send ICMPv6 Echo Req via DUT1 and DUT2; verify
+| | ... | that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip} | dst_ip=${dst_ip} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
+
+| TC07: DUT1 and DUT2 with L2XC and VLAN translate-2-2 with wrong outer tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set outer tag different from outer tag set on Dot1ad sub-interface of
+| | ... | DUT2; on DUT2 configure L2 cross-connect (L2XC) with one interface to
+| | ... | TG and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite
+| | ... | pop-1 tagegd with Dot1ad tags from one of its interfaces to another
+| | ... | one method. [Ver] Make TG send ICMPv6 Echo Req via DUT1 and DUT2;
+| | ... | verify that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip} | dst_ip=${dst_ip} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
+
+| TC08: DUT1 and DUT2 with L2XC and VLAN translate-2-2 with wrong outer and inner tags used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1ad-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one Dot1ad
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-2-2 method to
+| | ... | set tags different from tags set on Dot1ad sub-interface of DUT2;
+| | ... | on DUT2 configure L2 cross-connect (L2XC) with one interface to TG
+| | ... | and one Dot1ad sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | tagegd with Dot1ad tags from one of its interfaces to another one
+| | ... | method. [Ver] Make TG send ICMPv6 Echo Req via DUT1 and DUT2; verify
+| | ... | that packet is not received. [Ref] IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create tagged sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id1} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-2-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip} | dst_ip=${dst_ip} | encaps=Dot1ad
+| | ... | vlan1=${outer_vlan_id1} | vlan2=${inner_vlan_id1}
diff --git a/tests/vpp/func/l2xc/eth2p-dot1q--dot1ad-l2xcbase-vlantrans12-func.robot b/tests/vpp/func/l2xc/eth2p-dot1q--dot1ad-l2xcbase-vlantrans12-func.robot
new file mode 100644
index 0000000000..6952d368b8
--- /dev/null
+++ b/tests/vpp/func/l2xc/eth2p-dot1q--dot1ad-l2xcbase-vlantrans12-func.robot
@@ -0,0 +1,335 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2XC with VLAN tag rewrite test cases - translate-1-2*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1q-IPv4-ICMPv4 or
+| ... | Eth-dot1q-IPv6-ICMPv6 on TG-DUT1, Eth-dot1ad-IPv4-ICMPv4 or
+| ... | Eth-dot1ad-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv4-ICMPv4 or Eth-IPv6-ICMPv6
+| ... | on TG-DUT2 for L2 switching of IPv4/IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with L2 cross-connect
+| ... | (L2XC) switching between VLAN sub-interface with VLAN tag rewrite
+| ... | translate-1-2 method of interface towards TG and interface towards DUT2.
+| ... | DUT2 is configured configured with L2 cross-connect (L2XC) switching
+| ... | between VLAN sub-interface with VLAN tag rewrite pop-2 method
+| ... | of interface towards DUT1 and interface towards TG.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are
+| ... | sent from TG on link to DUT1 and received in TG on link form DUT2;
+| ... | on receive TG verifies packets for correctness and their IPv4 src-addr,
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1q, IEEE 802.1ad.
+
+*** Variables ***
+| ${subid}= | 10
+
+| ${outer_vlan_id1}= | 110
+| ${outer_vlan_id2}= | 120
+| ${outer_vlan_wrong}= | 150
+
+| ${inner_vlan_id1}= | 210
+| ${inner_vlan_id2}= | 220
+| ${inner_vlan_wrong}= | 250
+
+| ${src_ip}= | 3ffe:63::1
+| ${dst_ip}= | 3ffe:63::2
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2XC and VLAN translate-1-2 (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method; on DUT2 configure L2 cross-connect (L2XC) with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | tagged with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_id1}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
+
+| TC02: DUT1 and DUT2 with L2XC and VLAN translate-1-2 with wrong inner tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set inner tag different from inner tag set on
+| | ... | Dot1ad sub-interface of DUT2; on DUT2 configure L2 cross-connect with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | tagged with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC03: DUT1 and DUT2 with L2XC and VLAN translate-1-2 with wrong outer tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set outer tag different from outer tag set on
+| | ... | Dot1ad sub-interface of DUT2; on DUT2 configure L2 cross-connect with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv4 Echo Req
+| | ... | tagged with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_id1}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC04: DUT1 and DUT2 with L2XC and VLAN translate-1-2 with wrong outer and inner tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set outer and inner tags different from tags
+| | ... | set on Dot1ad sub-interface of DUT2; on DUT2 configure L2
+| | ... | cross-connect with one interface to TG and one Dot1ad sub-interface
+| | ... | towards DUT1 with VLAN tag rewrite pop-2 method. [Ver] Make TG send
+| | ... | ICMPv4 Echo Req tagged with one Dot1q tag from one of its interfaces
+| | ... | to another one via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id1}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC05: DUT1 and DUT2 with L2XC and VLAN translate-1-2 (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method; on DUT2 configure L2 cross-connect (L2XC) with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv6 Echo Req
+| | ... | tagegd with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | src_ip=${src_ip}
+| | ... | dst_ip=${dst_ip} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC06: DUT1 and DUT2 with L2XC and VLAN translate-1-2 with wrong inner tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set inner tag different from inner tag set on
+| | ... | Dot1ad sub-interface of DUT2; on DUT2 configure L2 cross-connect with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv6 Echo Req
+| | ... | tagegd with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_id2} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip} | dst_ip=${dst_ip} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
+
+| TC07: DUT1 and DUT2 with L2XC and VLAN translate-1-2 with wrong outer tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set outer tag different from outer tag set on
+| | ... | Dot1ad sub-interface of DUT2; on DUT2 configure L2 cross-connect with
+| | ... | one interface to TG and one Dot1ad sub-interface towards DUT1 with
+| | ... | VLAN tag rewrite pop-2 method. [Ver] Make TG send ICMPv6 Echo Req
+| | ... | tagegd with one Dot1q tag from one of its interfaces to another one
+| | ... | via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip} | dst_ip=${dst_ip} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
+
+| TC08: DUT1 and DUT2 with L2XC and VLAN translate-1-2 with wrong outer and inner tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1, \
+| | ... | Eth-dot1ad-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2.
+| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC) with one interface to
+| | ... | DUT2 and one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | translate-1-2 method to set outer and inner tags different from tags
+| | ... | set on Dot1ad sub-interface of DUT2; on DUT2 configure L2
+| | ... | cross-connect with one interface to TG and one Dot1ad sub-interface
+| | ... | towards DUT1 with VLAN tag rewrite pop-2 method. [Ver] Make TG send
+| | ... | ICMPv6 Echo Req tagegd with one Dot1q tag from one of its interfaces
+| | ... | to another one via DUT1 and DUT2; verify that packet is not received.
+| | ... | [Ref] IEEE 802.1q, IEEE 802.1ad
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create tagged sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${subid}
+| | ... | outer_vlan_id=${outer_vlan_id2} | inner_vlan_id=${inner_vlan_id2}
+| | ... | type_subif=two_tags dot1ad
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-2 | push_dot1q=${False}
+| | ... | tag1_id=${outer_vlan_wrong} | tag2_id=${inner_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-2
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip} | dst_ip=${dst_ip} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
diff --git a/tests/vpp/func/l2xc/eth2p-dot1q-l2xcbase-vlantrans11-func.robot b/tests/vpp/func/l2xc/eth2p-dot1q-l2xcbase-vlantrans11-func.robot
new file mode 100644
index 0000000000..49039e9db9
--- /dev/null
+++ b/tests/vpp/func/l2xc/eth2p-dot1q-l2xcbase-vlantrans11-func.robot
@@ -0,0 +1,171 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2XC with VLAN tag rewrite test cases - translate-1-1*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1q-IPv4-ICMPv4 or
+| ... | Eth-dot1q-IPv6-ICMPv6 on TG-DUT1 and DUT1-DUT2, Eth-IPv4-ICMPv4 or
+| ... | Eth-IPv4-ICMPv4 on TG-DUT2 for L2 switching of IPv4/IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with L2 cross-connect
+| ... | (L2XC) switching between VLAN sub-interface with VLAN tag rewrite
+| ... | translate-1-1 method of interface towards TG and interface towards DUT2.
+| ... | DUT2 is configured configured with L2 cross-connect (L2XC) switching
+| ... | between VLAN sub-interface with VLAN tag rewrite pop-1 method
+| ... | of interface towards DUT1 and interface towards TG.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are
+| ... | sent from TG on link to DUT1 and received in TG on link form DUT2;
+| ... | on receive TG verifies packets for correctness and their IPv4 src-addr,
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1q, IEEE 802.1ad.
+
+*** Variables ***
+| ${subid}= | 10
+
+| ${outer_vlan_id1}= | 110
+| ${outer_vlan_id2}= | 120
+| ${outer_vlan_wrong}= | 150
+
+| ${src_ip}= | 3ffe:63::1
+| ${dst_ip}= | 3ffe:63::2
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2XC and VLAN translate-1-1 (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one VLAN
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-1-1 method;
+| | ... | on DUT2 configure L2 cross-connect (L2XC) with one interface to TG
+| | ... | and one VLAN sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | method. [Ver] Make TG send ICMPv4 Echo Req tagged with one Dot1q tag
+| | ... | from one of its interfaces to another one via DUT1 and DUT2; verify
+| | ... | that packet is received. [Ref] IEEE 802.1q
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-1 | tag1_id=${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
+
+| TC02: DUT1 and DUT2 with L2XC and VLAN translate-1-1 with wrong tag used (DUT1) switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv4-ICMPv4 on TG-DUT1 and \
+| | ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one VLAN tagged sub-interface to DUT2 and
+| | ... | one VLAN sub-interface towards TG with VLAN tag rewrite
+| | ... | (translate-1-1) on sub-interface to DUT2; on DUT2 configure L2XC with
+| | ... | one interface to TG and one VLAN sub-interface towards DUT1 with VLAN
+| | ... | tag pop-1. [Ver] Make TG send ICMPv4 Echo Req tagged with one dot1q
+| | ... | tag from one of its interfaces to another one via DUT1 and DUT2;
+| | ... | verify that packet is not received. [Ref] IEEE 802.1q
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-1 | tag1_id=${outer_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC03: DUT1 and DUT2 with L2XC and VLAN translate-1-1 (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one VLAN
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-1-1 method;
+| | ... | on DUT2 configure L2 cross-connect (L2XC) with one interface to TG
+| | ... | and one VLAN sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | method. [Ver] Make TG send ICMPv6 Echo Req tagegd with one Dot1q tag
+| | ... | from one of its interfaces to another one via DUT1 and DUT2; verify
+| | ... | that packet is received. [Ref] IEEE 802.1q
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-1 | tag1_id=${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2} | src_ip=${src_ip}
+| | ... | dst_ip=${dst_ip} | encaps=Dot1q | vlan1=${outer_vlan_id1}
+
+| TC04: DUT1 and DUT2 with L2XC and VLAN translate-1-1 with wrong tag used (DUT1) switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-dot1q-IPv6-ICMPv6 on TG-DUT1 and \
+| | ... | DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUT2. [Cfg] On DUT1 configure L2
+| | ... | cross-connect (L2XC) with one interface to DUT2 and one VLAN
+| | ... | sub-interface towards TG with VLAN tag rewrite translate-1-1 method
+| | ... | to set tag different from tag set on VLAN sub-interface of DUT2;
+| | ... | on DUT2 configure L2 cross-connect (L2XC) with one interface to TG
+| | ... | and one VLAN sub-interface towards DUT1 with VLAN tag rewrite pop-1
+| | ... | method. [Ver] Make TG send ICMPv6 Echo Req tagegd with one Dot1q tag
+| | ... | from one of its interfaces to another one via DUT1 and DUT2; verify
+| | ... | that packet is not received. [Ref] IEEE 802.1q
+| | [Tags] | SKIP_PATCH
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${outer_vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${outer_vlan_id2}
+| | And Configure L2 tag rewrite method on interface | ${dut1_node}
+| | ... | ${vlan1_index} | translate-1-1 | tag1_id=${outer_vlan_wrong}
+| | And Configure L2 tag rewrite method on interface | ${dut2_node}
+| | ... | ${vlan2_index} | pop-1
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${vlan1_index}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${vlan2_index}
+| | Then Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send ICMP packet and verify received packet | ${tg_node} | ${tg_to_dut1}
+| | ... | ${tg_to_dut2} | src_ip=${src_ip} | dst_ip=${dst_ip} | encaps=Dot1q
+| | ... | vlan1=${outer_vlan_id1}
diff --git a/tests/vpp/func/l2xc/eth2p-eth-l2xcbase-func.robot b/tests/vpp/func/l2xc/eth2p-eth-l2xcbase-func.robot
new file mode 100644
index 0000000000..37ccfc47cf
--- /dev/null
+++ b/tests/vpp/func/l2xc/eth2p-eth-l2xcbase-func.robot
@@ -0,0 +1,74 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.NodePath
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2 cross-connect test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of IPv4;
+| ... | Eth-IPv6-ICMPv6 for L2 switching of IPv6 use. Both apply to all links.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | cross-connect (L2XC) switching.
+| ... | *[Ver] TG verification:* Test ICMPv4 (or ICMPv6) Echo Request packets are
+| ... | sent in both directions by TG on links to DUT1 and DUT2; on receive TG
+| ... | verifies packets for correctness and their IPv4 (IPv6) src-addr,
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 with L2XC switch ICMPv4 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv4-ICMPv4. [Cfg] On DUT1 and \
+| | ... | DUT2 configure L2 cross-connect (L2XC), each with one interface
+| | ... | to TG and one Ethernet interface towards the other DUT. [Ver]
+| | ... | Make TG send ICMPv4 Echo Req in both directions between two of
+| | ... | its interfaces to be switched by DUT1 and DUT2; verify all
+| | ... | packets are received. [Ref]
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_dut2}
+| | And Configure L2XC | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | When All Vpp Interfaces Ready Wait | ${nodes}
+| | Then Send ICMPv4 bidirectionally and verify received packets
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
+
+| TC02: DUT1 and DUT2 with L2XC switch ICMPv6 between two TG links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Enc] Eth-IPv6-ICMPv6. [Cfg] On DUT1 and \
+| | ... | DUT2 configure L2 cross-connect (L2XC), each with one interface
+| | ... | to TG and one Ethernet interface towards the other DUT. [Ver]
+| | ... | Make TG send ICMPv6 Echo Req in both directions between two of
+| | ... | its interfaces to be switched by DUT1 and DUT2; verify all
+| | ... | packets are received. [Ref]
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_dut2}
+| | And Configure L2XC | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | When All Vpp Interfaces Ready Wait | ${nodes}
+| | Then Send ICMPv6 bidirectionally and verify received packets
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
diff --git a/tests/vpp/func/l2xc/eth2p-eth-l2xcbase-iaclbase-func.robot b/tests/vpp/func/l2xc/eth2p-eth-l2xcbase-iaclbase-func.robot
new file mode 100644
index 0000000000..b62f0f8731
--- /dev/null
+++ b/tests/vpp/func/l2xc/eth2p-eth-l2xcbase-iaclbase-func.robot
@@ -0,0 +1,144 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/counters.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Library | resources.libraries.python.Classify.Classify
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *Ingress ACL test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG - DUT1 - DUT2 - TG
+| ... | with one link between the nodes.
+| ... | *[Cfg] DUT configuration:* DUT2 is configured with L2 Cross connect.
+| ... | DUT1 is configured with iACL classification on link to TG,
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent
+| ... | in one direction by TG on link to DUT1 and received on TG link
+| ... | to DUT2. On receive TG verifies if packets are dropped.
+
+*** Variables ***
+| ${l2_table}= | l2
+
+*** Test Cases ***
+| TC01: DUT with iACL MAC src-addr drops matching pkts
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Cfg] On DUT1 add source MAC address to classify table with 'deny'.
+| | ... | [Ver] Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_tg}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table L2 | ${dut1_node} | src
+| | And Vpp Configures Classify Session L2
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | src | ${tg_to_dut1_mac}
+| | And Vpp Enable Input ACL Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${l2_table} | ${table_index}
+| | Then ICMP packet transmission should fail
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
+
+| TC02: DUT with iACL MAC dst-addr drops matching pkts
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Cfg] On DUT1 add destination MAC address to classify
+| | ... | table with 'deny'.
+| | ... | [Ver] Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_tg}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table L2 | ${dut1_node} | dst
+| | And Vpp Configures Classify Session L2
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | dst | ${tg_to_dut2_mac}
+| | And Vpp Enable Input ACL Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${l2_table} | ${table_index}
+| | Then ICMP packet transmission should fail
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
+
+| TC03: DUT with iACL MAC src-addr and dst-addr drops matching pkts
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Cfg] On DUT1 add source and destination MAC address to classify
+| | ... | table with 'deny'.
+| | ... | [Ver] Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_tg}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
+| | ${table_index_1} | ${skip_n_1} | ${match_n_1}=
+| | ... | When Vpp Creates Classify Table L2 | ${dut1_node} | src
+| | And Vpp Configures Classify Session L2
+| | ... | ${dut1_node} | deny | ${table_index_1} | ${skip_n_1} | ${match_n_1}
+| | ... | src | ${tg_to_dut1_mac}
+| | ${table_index_2} | ${skip_n_2} | ${match_n_2}=
+| | ... | When Vpp Creates Classify Table L2 | ${dut1_node} | dst
+| | And Vpp Configures Classify Session L2
+| | ... | ${dut1_node} | deny | ${table_index_2} | ${skip_n_2} | ${match_n_2}
+| | ... | dst | ${tg_to_dut1_mac}
+| | And Vpp Enable Input ACL Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${l2_table} | ${table_index_1}
+| | And Vpp Enable Input ACL Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${l2_table} | ${table_index_2}
+| | Then ICMP packet transmission should fail
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
+
+| TC04: DUT with iACL EtherType drops matching pkts
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Cfg] On DUT1 add EtherType IPv4(0x0800) to classify table with 'deny'.
+| | ... | [Ver] Make TG verify matching packets are dropped.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure L2XC
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_tg}
+| | And Configure L2XC
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_tg}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | When Vpp Creates Classify Table Hex
+| | ... | ${dut1_node} | 000000000000000000000000ffff
+| | And Vpp Configures Classify Session Hex
+| | ... | ${dut1_node} | deny | ${table_index} | ${skip_n} | ${match_n}
+| | ... | 0000000000000000000000000800
+| | And Vpp Enable Input ACL Interface
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${l2_table} | ${table_index}
+| | Then ICMP packet transmission should fail
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
diff --git a/tests/vpp/func/telemetry/eth2p-ethip4-ip4base-ip4ipfixbase-func.robot b/tests/vpp/func/telemetry/eth2p-ethip4-ip4base-ip4ipfixbase-func.robot
new file mode 100644
index 0000000000..d2c979a3a4
--- /dev/null
+++ b/tests/vpp/func/telemetry/eth2p-ethip4-ip4base-ip4ipfixbase-func.robot
@@ -0,0 +1,201 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/telemetry/ipfix.robot
+| Library | resources.libraries.python.Classify.Classify
+| Library | resources.libraries.python.telemetry.IPFIXSetup
+| Library | resources.libraries.python.Trace
+
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO | EXPECTED_FAILING
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *IPFIX ipv4 test cases*
+| ...
+| ... | IPFIX tests use 3-node topology TG - DUT1 - DUT2 - TG with
+| ... | one link between the nodes. DUT1 is configured with IPv4
+| ... | routing and static routes. IPFIX is configured on DUT1 with
+| ... | DUT1->TG interface as collector. Test packets are
+| ... | sent from TG to DUT1. TG listens for flow report packets
+| ... | and verifies that they contains flow record of test packets sent.
+
+*** Variables ***
+| ${dut1_to_tg_ip}= | 192.168.1.1
+| ${tg_to_dut1_ip}= | 192.168.1.2
+| ${dut2_to_dut1_ip}= | 192.168.2.1
+| ${prefix_length}= | 24
+| ${ip_version}= | ip4
+| ${port}= | 80
+
+*** Test Cases ***
+| TC01: DUT sends IPFIX template and data packets
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and a basic classify session.
+| | ... | [Ver] Make TG listen for IPFIX template and data packets, verify
+| | ... | that packet is received and correct. No packets are sent from TG.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version} | src
+| | And VPP configures classify session L3 | ${dut1_node} | permit
+| | ... | ${table_index} | ${skip_n} | ${match_n} | ${ip_version} | src
+| | ... | ${tg_to_dut1_ip}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And Setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip}
+| | ... | ${dut1_to_tg_ip} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+| | ... | count=0
+
+| TC02: DUT reports packet flow for traffic by source address
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add classify session with TG source address.
+| | ... | [Ver] Make TG send a packet to DUT1, then listen for IPFIX template
+| | ... | and data packets, verify that IPFIX reported the received packet.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version} | src
+| | And VPP configures classify session L3 | ${dut1_node} | permit
+| | ... | ${table_index} | ${skip_n} | ${match_n} | ${ip_version} | src
+| | ... | ${tg_to_dut1_ip}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And Setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip}
+| | ... | ${dut1_to_tg_ip} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+
+| TC03: DUT reports packet flow for traffic with local destination address
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add classify session with destination
+| | ... | address of DUT1.
+| | ... | [Ver] Make TG send a packet to DUT1, then listen for IPFIX template
+| | ... | and data packets, verify that IPFIX reported the received packet.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version} | dst
+| | And VPP configures classify session L3 | ${dut1_node} | permit
+| | ... | ${table_index} | ${skip_n} | ${match_n} | ${ip_version} | dst
+| | ... | ${dut1_to_tg_ip}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And Setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip}
+| | ... | ${dut1_to_tg_ip} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+
+| TC04: DUT reports packet flow for traffic with remote destination address
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add classify session with destination
+| | ... | address of DUT2.
+| | ... | [Ver] Make TG send a packet to DUT2 through DUT1, then listen
+| | ... | for IPFIX template and data packets, verify that IPFIX reported
+| | ... | the received packet.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip}
+| | ... | ${dut2_to_dut1_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version} | dst
+| | And VPP configures classify session L3 | ${dut1_node} | permit
+| | ... | ${table_index} | ${skip_n} | ${match_n} | ${ip_version} | dst
+| | ... | ${dut2_to_dut1_ip}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And Setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip}
+| | ... | ${dut1_to_tg_ip} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut2_to_dut1_ip}
+
+| TC05: DUT reports packet flow for traffic by source and destination port
+| | [Tags] | SKIP_VPP_PATCH
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add classify session with TG source address
+| | ... | and source and destination ports.
+| | ... | [Ver] Make TG send a packet to DUT1, then listen for IPFIX template
+| | ... | and data packets, verify that IPFIX reported the received packet.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version}
+| | ... | src proto l4 src_port dst_port
+| | And VPP configures classify session generic | ${dut1_node}
+| | ... | acl-hit-next permit | ${table_index} | ${skip_n} | ${match_n}
+| | ... | l3 ${ip_version} src ${tg_to_dut1_ip}
+| | ... | proto 6 l4 src_port ${port} dst_port ${port}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And Setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip}
+| | ... | ${dut1_to_tg_ip} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+| | ... | port=${port}
+
+# TODO: DUT reports packet flow when ACL is configured with wildcards
diff --git a/tests/vpp/func/telemetry/eth2p-ethip4-ip4base-ip4ipfixscale-func.robot b/tests/vpp/func/telemetry/eth2p-ethip4-ip4base-ip4ipfixscale-func.robot
new file mode 100644
index 0000000000..553996fcc2
--- /dev/null
+++ b/tests/vpp/func/telemetry/eth2p-ethip4-ip4base-ip4ipfixscale-func.robot
@@ -0,0 +1,111 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/telemetry/ipfix.robot
+| Library | resources.libraries.python.Classify.Classify
+| Library | resources.libraries.python.telemetry.IPFIXSetup
+| Library | resources.libraries.python.Trace
+
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO | EXPECTED_FAILING
+| ... | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *IPFIX ipv4 test cases*
+| ...
+| ... | IPFIX tests use 3-node topology TG - DUT1 - DUT2 - TG with
+| ... | one link between the nodes. DUT1 is configured with IPv4
+| ... | routing and static routes. IPFIX is configured on DUT1 with
+| ... | DUT1->TG interface as collector. Test packets are
+| ... | sent from TG to DUT1. TG listens for flow report packets
+| ... | and verifies that they contains flow record of test packets sent.
+
+*** Variables ***
+| ${dut1_to_tg_ip}= | 192.168.1.1
+| ${tg_to_dut1_ip}= | 192.168.1.2
+| ${prefix_length}= | 24
+| ${ip_version}= | ip4
+| ${sessions}= | 80
+
+*** Test Cases ***
+| TC01: DUT reports packet flow with a large number of packets
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add classify session with TG source address.
+| | ... | [Ver] Make TG send packets to DUT1, then listen for IPFIX template
+| | ... | and data packets, verify that IPFIX reported the received packets.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version} | src
+| | And VPP configures classify session L3 | ${dut1_node} | permit
+| | ... | ${table_index} | ${skip_n} | ${match_n} | ${ip_version} | src
+| | ... | ${tg_to_dut1_ip}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip}
+| | ... | ${dut1_to_tg_ip} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+| | ... | count=20000 | timeout=10
+
+| TC02: DUT reports packet flow when multiple sessions are configured
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add several classify sessions with different
+| | ... | ports.
+| | ... | [Ver] Make TG send packets to DUT1 using a range of ports matching
+| | ... | configured sessions, then listen for IPFIX template and data packets,
+| | ... | verify that IPFIX reported the received packets for each session.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version}
+| | ... | src proto l4 src_port dst_port
+| | :FOR | ${index} | IN RANGE | ${sessions}
+| | | VPP configures classify session generic | ${dut1_node}
+| | | ... | acl-hit-next permit | ${table_index} | ${skip_n} | ${match_n}
+| | | ... | l3 ${ip_version} src ${tg_to_dut1_ip}
+| | | ... | proto 6 l4 src_port ${index} dst_port ${index}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip}
+| | ... | ${dut1_to_tg_ip}
+| | ... | mtu=1450 | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send session sweep and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+| | ... | ${sessions} | timeout=10 | count=3
+
+# TODO: DUT reports packet flow when ACL is configured with wildcards
diff --git a/tests/vpp/func/telemetry/eth2p-ethip4-ip4base-spanrx-func.robot b/tests/vpp/func/telemetry/eth2p-ethip4-ip4base-spanrx-func.robot
new file mode 100644
index 0000000000..37e5b04662
--- /dev/null
+++ b/tests/vpp/func/telemetry/eth2p-ethip4-ip4base-spanrx-func.robot
@@ -0,0 +1,79 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/telemetry/span.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPv4Util
+| Library | resources.libraries.python.IPv4Setup
+| Library | resources.libraries.python.telemetry.SPAN
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *SPAN test suite*
+| ... | *[Top] Network Topologies:* TG=DUT1 2-node topology with two
+| ... | links between nodes.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with SPAN mirroring from
+| ... | the first DUT1-TG interface to the second one.
+| ... | *[Ver] TG verification:* Test ARP or ICMP packets are sent by TG
+| ... | on first link to DUT1; On receipt through second link TG verifies
+| ... | the copy of packet sent and the copy of DUT's reply packet.
+| ... | *[Ref] Applicable standard specifications: None?*
+
+*** Variables ***
+| ${tg_to_dut_if1_ip4}= | 192.168.1.1
+| ${dut_to_tg_if1_ip4}= | 192.168.1.2
+| ${prefix}= | 24
+
+*** Test Cases ***
+| TC01: DUT mirrors L2 packets from one interface to another
+| | [Documentation]
+| | ... | [Top] TG=DUT1
+| | ... | [Cfg] On DUT1 configure IPv4 address and set SPAN mirroring\
+| | ... | from one DUT interface to the other.
+| | ... | [Ver] Make TG send an ARP packet to DUT through one interface,\
+| | ... | then receive a copy of sent packet and of DUT's ARP reply\
+| | ... | on the second interface.
+| | Given Configure path in 2-node circular topology | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Set interface Address | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${dut_to_tg_if1_ip4} | ${prefix}
+| | And Set SPAN Mirroring | ${dut_node} | ${dut_to_tg_if1} | ${dut_to_tg_if2}
+| | Then Send Packet And Check Received Copies | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${dut_to_tg__if1_mac} | ${tg_to_dut_if2}
+| | ... | ${tg_to_dut_if1_ip4} | ${dut_to_tg_if1_ip4} | ARP
+
+| TC02: DUT mirrors IPv4 packets from one interface to another
+| | [Documentation]
+| | ... | [Top] TG=DUT1
+| | ... | [Cfg] On DUT1 configure IPv4 address, add ARP entry for one TG \
+| | ... | interface and set SPAN mirroring from one DUT interface to the other.
+| | ... | [Ver] Make TG send an ICMP packet to DUT through one interface,\
+| | ... | then receive a copy of sent packet and of DUT's ICMP reply\
+| | ... | on the other interface.
+| | Given Configure path in 2-node circular topology | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Set interface Address | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${dut_to_tg_if1_ip4} | ${prefix}
+| | And Add ARP on DUT | ${dut_node} | ${dut_to_tg_if1} | ${tg_to_dut_if1_ip4}
+| | ... | ${tg_to_dut_if1_mac}
+| | And Set SPAN Mirroring | ${dut_node} | ${dut_to_tg_if1} | ${dut_to_tg_if2}
+| | Then Send Packet And Check Received Copies | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${dut_to_tg__if1_mac} | ${tg_to_dut_if2}
+| | ... | ${tg_to_dut_if1_ip4} | ${dut_to_tg_if1_ip4} | ICMP
diff --git a/tests/vpp/func/telemetry/eth2p-ethip6-ip6base-ip6ipfixbase-func.robot b/tests/vpp/func/telemetry/eth2p-ethip6-ip6base-ip6ipfixbase-func.robot
new file mode 100644
index 0000000000..5248ff8ec0
--- /dev/null
+++ b/tests/vpp/func/telemetry/eth2p-ethip6-ip6base-ip6ipfixbase-func.robot
@@ -0,0 +1,198 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/telemetry/ipfix.robot
+| Library | resources.libraries.python.Classify.Classify
+| Library | resources.libraries.python.telemetry.IPFIXSetup
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.Trace
+
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO | EXPECTED_FAILING
+# TODO: Remove EXPECTED_FAILING tag once functionality is implemented (VPP-204)
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *IPFIX ipv6 test cases*
+| ...
+| ... | IPFIX tests use 3-node topology TG - DUT1 - DUT2 - TG with
+| ... | one link between the nodes. DUT1 is configured with IPv4 and IPV6
+| ... | routing and static routes. IPFIX is configured on DUT1 with
+| ... | DUT1->TG interface as collector.Test packets are
+| ... | sent from TG to or through DUT1. TG listens for flow report packets
+| ... | and verifies that they contains flow records of test packets sent.
+
+*** Variables ***
+| ${dut1_to_tg_ip}= | 10::10
+| ${dut2_to_dut1_ip}= | 11::10
+| ${tg_to_dut1_ip}= | 12::10
+| ${prefix_length}= | 64
+| ${ip_version}= | ip6
+| ${port}= | 80
+
+# IPv4 addresses used for IPFIX exporter. Export over IPv6 not (yet?) supported.
+| ${dut1_to_tg_ip4}= | 192.168.1.1
+| ${tg_to_dut1_ip4}= | 192.168.1.2
+
+*** Test Cases ***
+| TC01: DUT reports packet flow for traffic by source address
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add classify session with TG source address.
+| | ... | [Ver] Make TG send a packet to DUT1, then listen for IPFIX template
+| | ... | and data packets, verify that IPFIX reported the received packet.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${24}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | And VPP RA suppress link layer | ${dut1_node} | ${dut1_to_tg}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version} | src
+| | And VPP configures classify session L3 | ${dut1_node} | permit
+| | ... | ${table_index} | ${skip_n} | ${match_n} | ${ip_version} | src
+| | ... | ${tg_to_dut1_ip}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip4}
+| | ... | ${dut1_to_tg_ip4} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+
+| TC02: DUT reports packet flow for traffic with local destination address
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add classify session with destination
+| | ... | address of DUT1.
+| | ... | [Ver] Make TG send a packet to DUT1, then listen for IPFIX template
+| | ... | and data packets, verify that IPFIX reported the received packet.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${24}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | And VPP RA suppress link layer | ${dut1_node} | ${dut1_to_tg}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version} | dst
+| | And VPP configures classify session L3 | ${dut1_node} | permit
+| | ... | ${table_index} | ${skip_n} | ${match_n} | ${ip_version} | dst
+| | ... | ${dut1_to_tg_ip}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip4}
+| | ... | ${dut1_to_tg_ip4} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+
+| TC03: DUT reports packet flow for traffic with remote destination address
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add classify session with destination
+| | ... | address of DUT2.
+| | ... | [Ver] Make TG send a packet to DUT2 through DUT1, then listen
+| | ... | for IPFIX template and data packets, verify that IPFIX reported
+| | ... | the received packet.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${24}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip}
+| | ... | ${dut2_to_dut1_mac}
+| | And VPP RA suppress link layer | ${dut1_node} | ${dut1_to_tg}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version} | dst
+| | And VPP configures classify session L3 | ${dut1_node} | permit
+| | ... | ${table_index} | ${skip_n} | ${match_n} | ${ip_version} | dst
+| | ... | ${dut2_to_dut1_ip}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip4}
+| | ... | ${dut1_to_tg_ip4} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${dut2_to_dut1_ip}
+
+| TC04: DUT reports packet flow for traffic by source and destination port
+| | [Tags] | SKIP_VPP_PATCH
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add classify session with TG source address
+| | ... | and source and destination ports.
+| | ... | [Ver] Make TG send a packet to DUT1, then listen for IPFIX template
+| | ... | and data packets, verify that IPFIX reported the received packet.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${24}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | And VPP RA suppress link layer | ${dut1_node} | ${dut1_to_tg}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version}
+| | ... | src proto l4 src_port dst_port
+| | And VPP configures classify session generic | ${dut1_node}
+| | ... | acl-hit-next permit | ${table_index} | ${skip_n} | ${match_n}
+| | ... | l3 ${ip_version} src ${tg_to_dut1_ip}
+| | ... | proto 6 l4 src_port ${port} dst_port ${port}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip4}
+| | ... | ${dut1_to_tg_ip4} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+| | ... | port=${port}
+
+# TODO: DUT reports packet flow when ACL is configured with wildcards
diff --git a/tests/vpp/func/telemetry/eth2p-ethip6-ip6base-ip6ipfixscale-func.robot b/tests/vpp/func/telemetry/eth2p-ethip6-ip6base-ip6ipfixscale-func.robot
new file mode 100644
index 0000000000..4bc0f66504
--- /dev/null
+++ b/tests/vpp/func/telemetry/eth2p-ethip6-ip6base-ip6ipfixscale-func.robot
@@ -0,0 +1,127 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/telemetry/ipfix.robot
+| Library | resources.libraries.python.Classify.Classify
+| Library | resources.libraries.python.telemetry.IPFIXSetup
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.Trace
+
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_SINGLE_LINK_TOPO | EXPECTED_FAILING
+| ... | SKIP_VPP_PATCH
+# TODO: Remove EXPECTED_FAILING tag once functionality is implemented (VPP-204)
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *IPFIX ipv6 test cases*
+| ...
+| ... | IPFIX tests use 3-node topology TG - DUT1 - DUT2 - TG with
+| ... | one link between the nodes. DUT1 is configured with IPv4 and IPV6
+| ... | routing and static routes. IPFIX is configured on DUT1 with
+| ... | DUT1->TG interface as collector.Test packets are
+| ... | sent from TG to or through DUT1. TG listens for flow report packets
+| ... | and verifies that they contains flow records of test packets sent.
+
+*** Variables ***
+| ${dut1_to_tg_ip}= | 10::10
+| ${tg_to_dut1_ip}= | 12::10
+| ${prefix_length}= | 64
+| ${ip_version}= | ip6
+| ${sessions}= | 45
+
+# IPv4 addresses used for IPFIX exporter. Export over IPv6 not (yet?) supported.
+| ${dut1_to_tg_ip4}= | 192.168.1.1
+| ${tg_to_dut1_ip4}= | 192.168.1.2
+
+*** Test Cases ***
+| TC01: DUT reports packet flow with a large number of packets
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add classify session with TG source address.
+| | ... | [Ver] Make TG send packets to DUT1, then listen for IPFIX template
+| | ... | and data packets, verify that IPFIX reported the received packets.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${24}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | And VPP RA suppress link layer | ${dut1_node} | ${dut1_to_tg}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version} | src
+| | And VPP configures classify session L3 | ${dut1_node} | permit
+| | ... | ${table_index} | ${skip_n} | ${match_n} | ${ip_version} | src
+| | ... | ${tg_to_dut1_ip}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip4}
+| | ... | ${dut1_to_tg_ip4} | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send packets and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+| | ... | count=20000 | timeout=10
+
+| TC02: DUT reports packet flow when multiple sessions are configured
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG. [Cfg] On DUT1 configure IPFIX with TG interface
+| | ... | address as collector and add several classify sessions with different
+| | ... | ports.
+| | ... | [Ver] Make TG send packets to DUT1 using a range of ports matching
+| | ... | configured sessions, then listen for IPFIX template and data packets,
+| | ... | verify that IPFIX reported the received packets for each session.
+| | ... | [Ref] RFC 7011
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${24}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | And Add ARP on DUT | ${dut1_node} | ${dut1_to_tg} | ${tg_to_dut1_ip}
+| | ... | ${tg_to_dut1_mac}
+| | And VPP RA suppress link layer | ${dut1_node} | ${dut1_to_tg}
+| | ${table_index} | ${skip_n} | ${match_n}=
+| | ... | And VPP creates classify table L3 | ${dut1_node} | ${ip_version}
+| | ... | src proto l4 src_port dst_port
+| | :FOR | ${index} | IN RANGE | ${sessions}
+| | | VPP configures classify session generic | ${dut1_node}
+| | | ... | acl-hit-next permit | ${table_index} | ${skip_n} | ${match_n}
+| | | ... | l3 ${ip_version} src ${tg_to_dut1_ip}
+| | | ... | proto 6 l4 src_port ${index} dst_port ${index}
+| | When Assign interface to flow table | ${dut1_node} | ${dut1_to_tg}
+| | ... | ${table_index} | ip_version=${ip_version}
+| | And setup IPFIX exporter | ${dut1_node} | ${tg_to_dut1_ip4}
+| | ... | ${dut1_to_tg_ip4} | interval=5
+| | ... | mtu=1450 | interval=5
+| | And Set IPFIX stream | ${dut1_node} | ${1}
+| | And Assign classify table to exporter | ${dut1_node} | ${table_index}
+| | ... | ${ip_version}
+| | Then Send session sweep and verify IPFIX | ${tg_node} | ${dut1_node}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg} | ${tg_to_dut1_ip} | ${dut1_to_tg_ip}
+| | ... | ${sessions} | timeout=10 | count=3
+
+# TODO: DUT reports packet flow when ACL is configured with wildcards
diff --git a/tests/vpp/func/telemetry/eth2p-ethip6-ip6base-spanrx-func.robot b/tests/vpp/func/telemetry/eth2p-ethip6-ip6base-spanrx-func.robot
new file mode 100644
index 0000000000..48bb7cf173
--- /dev/null
+++ b/tests/vpp/func/telemetry/eth2p-ethip6-ip6base-spanrx-func.robot
@@ -0,0 +1,64 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/telemetry/span.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPv6Util
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.Routing
+| Library | resources.libraries.python.telemetry.SPAN
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *SPAN test suite*
+| ... | *[Top] Network Topologies:* TG=DUT1 2-node topology with two
+| ... | links between nodes.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with SPAN mirroring from
+| ... | the first DUT1-TG interface to the second one.
+| ... | *[Ver] TG verification:* Test ARP or ICMP packets are sent by TG
+| ... | on first link to DUT1; On receipt through second link TG verifies
+| ... | the copy of packet sent and the copy of DUT's reply packet.
+| ... | *[Ref] Applicable standard specifications: None?*
+
+*** Variables ***
+| ${tg_to_dut_if1_ip6}= | 11::1
+| ${dut_to_tg_if1_ip6}= | 10::1
+| ${prefix}= | 24
+
+*** Test Cases ***
+| TC01: DUT mirrors IPv6 packets from one interface to another
+| | [Documentation]
+| | ... | [Top] TG=DUT1
+| | ... | [Cfg] On DUT1 configure IPv6 address, add ARP entry for one TG \
+| | ... | interface and set SPAN mirroring from one DUT interface to the other.
+| | ... | [Ver] Make TG send an ICMP packet to DUT through one interface,\
+| | ... | then receive a copy of sent packet and of DUT's ICMP reply\
+| | ... | on the other interface.
+| | Given Configure path in 2-node circular topology | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Vpp Ra Suppress Link Layer | ${dut_node} | ${dut_to_tg_if1}
+| | And Vpp Set If Ipv6 Addr | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${dut_to_tg_if1_ip6} | ${prefix}
+| | And Add Ip Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${tg_to_dut_if1_ip6}
+| | ... | ${tg_to_dut_if1_mac}
+| | And Vpp Route Add | ${dut_node} | ${tg_to_dut_if1_ip6} | ${prefix}
+| | ... | ${dut_to_tg_if1_ip6} | ${dut_to_tg_if1}
+| | And Set SPAN Mirroring | ${dut_node} | ${dut_to_tg_if1} | ${dut_to_tg_if2}
+| | Then Send Packet And Check Received Copies | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
+| | ... | ${dut_to_tg__if1_mac} | ${tg_to_dut_if2}
+| | ... | ${tg_to_dut_if1_ip6} | ${dut_to_tg_if1_ip6} | ICMPv6
diff --git a/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4-ip4base-eth-2vhost-1vm.robot b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4-ip4base-eth-2vhost-1vm.robot
new file mode 100644
index 0000000000..5886454b06
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4-ip4base-eth-2vhost-1vm.robot
@@ -0,0 +1,98 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.VPPUtil
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.VhostUser
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Force Tags | VM_ENV | HW_ENV | 3_NODE_DOUBLE_LINK_TOPO
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *IPv4 routing test cases with vhost user interface*
+| ...
+| ... | RFC791 IPv4, RFC826 ARP, RFC792 ICMPv4. Encapsulations: Eth-IPv4-ICMPv4
+| ... | on links TG=DUT1. IPv4 routing tests use circular 2-node
+| ... | topology TG - DUT1 - TG with two link between the nodes. DUT is
+| ... | configured with IPv4 routing and static routes. Test sends packets
+| ... | by TG on links to DUT and received on TG link on the other side of
+| ... | circular topology. On receive TG verifies packets IPv4 src-addr,
+| ... | dst-addr and MAC addresses.
+
+*** Variables ***
+| ${net1}= | 10.0.1.0
+| ${net3}= | 10.0.3.0
+| ${net1_ip1}= | 10.0.1.1
+| ${net1_ip2}= | 10.0.1.2
+| ${net2_ip1}= | 10.0.2.1
+| ${net2_ip2}= | 10.0.2.2
+| ${net3_ip1}= | 10.0.3.1
+| ${net3_ip2}= | 10.0.3.2
+| ${prefix_length}= | 24
+| ${fib_table_2}= | 20
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+
+*** Test Cases ***
+| TC01: IPv4 forward via vhost to another VRF
+| | [Documentation]
+| | ... | Test uses VRF to route IPv4 traffic through 2 vhost user interfaces.
+| | ... | Both have IP addresses from same network. On VM is set bridge to pass
+| | ... | packet from a one vhost user interface to another one.
+| | [Teardown] | Run Keywords
+| | ... | Stop and clear QEMU | ${dut_node} | ${vm_node} | AND
+| | ... | Tear down functional test
+| |
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${vhost1}= | And Vpp Create Vhost User Interface | ${dut_node} | ${sock1}
+| | ${vhost2}= | And Vpp Create Vhost User Interface | ${dut_node} | ${sock2}
+| | And Set Interface State | ${dut_node} | ${vhost1} | up
+| | And Set Interface State | ${dut_node} | ${vhost2} | up
+| | And Assign Interface To Fib Table | ${dut_node}
+| | ... | ${vhost2} | ${fib_table_2}
+| | And Assign Interface To Fib Table | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${fib_table_2}
+| | And Configure IP addresses on interfaces
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${net1_ip1} | ${prefix_length}
+| | ... | ${dut_node} | ${vhost1} | ${net2_ip1} | ${prefix_length}
+| | ... | ${dut_node} | ${vhost2} | ${net2_ip2} | ${prefix_length}
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${net3_ip1} | ${prefix_length}
+| | ${vhost2_mac}= | And Get Vhost User Mac By SW Index
+| | ... | ${dut_node} | ${vhost2}
+| | And Vpp Route Add | ${dut_node} | ${net3} | 24 | ${net2_ip2}
+| | ... | ${vhost1} | resolve_attempts=${NONE} | count=${NONE}
+| | And Vpp Route Add | ${dut_node} | ${net1} | 24 | ${net2_ip1}
+| | ... | ${vhost2} | resolve_attempts=${NONE} | count=${NONE}
+| | ... | vrf=${fib_table_2}
+| | Add IP Neighbor | ${dut_node} | ${vhost1} | ${net2_ip2} | ${vhost2_mac}
+| | Add IP Neighbor | ${dut_node} | ${dut_to_tg_if2} | ${net3_ip2}
+| | ... | ${tg_to_dut_if2_mac}
+| | When Configure VM for vhost L2BD forwarding
+| | ... | ${dut_node} | ${sock1} | ${sock2}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${net1_ip2} | ${net3_ip2}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_to_dut_if2} | ${dut_to_tg_if2_mac} | ${tg_to_dut_if2_mac}
diff --git a/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4ipsectptlispgpe-ip4base-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4ipsectptlispgpe-ip4base-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..d23c7427fd
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4ipsectptlispgpe-ip4base-eth-2vhost-1vm-func.robot
@@ -0,0 +1,209 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.QemuUtils
+| Library | resources.libraries.python.VPPUtil
+| Library | resources.libraries.python.IPsecUtil
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/overlay/l2lisp.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv4_ipsec_lispgpe_ipv4/ipv4_ipsec_lispgpe_ipv4.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP | SKIP_VPP_PATCH
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test with QEMU | ${vm_node}
+| ...
+| Documentation | *IPv4-ip4-ipsec-lispgpe-ip4 - main fib, vrf (gpe_vni-to-vrf)*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* ICMPv4-IPv4-IPSec-LISPGPE-IPv4-ICMPv4.
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with LISP and IPsec.\
+| ... | IPsec is in transport mode. Tests cases are for IPsec configured both\
+| ... | on RLOC interface or lisp_gpe0 interface.
+| ... | *[Ver] TG verification:* Packet is send from TG(if1) across the DUT1\
+| ... | via VM to DUT2 where it is forwarded to TG(if2).
+| ... | *[Ref] Applicable standard specifications:* RFC6830, RFC4303.
+
+*** Variables ***
+| ${dut2_spi}= | ${1000}
+| ${dut1_spi}= | ${1001}
+
+| ${ESP_PROTO}= | ${50}
+
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+
+| ${bid}= | 10
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 over Vhost to LISP GPE tunnel using IPsec (transport) on RLOC Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-IPSec-LISPGPE-IPv4-ICMP on DUT1-DUT2, Eth-IPv4-ICMP\
+| | ... | on TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS. Create Qemu vm on DUT1 and configure bridge\
+| | ... | between two vhosts.
+| | ... | [Ver] Case: ip4-ipsec-lispgpe-ip4 - main fib, virt2lisp\
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup 3-node Topology
+| | And Add IP Neighbors
+| | And Setup Qemu DUT1
+| | And Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip4} | ${dut2_to_dut1_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip4} | ${dut1_to_dut2_ip4}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+| TC02: DUT1 and DUT2 route IPv4 over Vhost to LISP GPE tunnel using IPsec (transport) on lisp_gpe0 Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-IPSec-LISPGPE-IPv4-ICMPv4 on DUT1-DUT2,\
+| | ... | Eth-IPv4-ICMPv4 on TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Case: ip4-ipsec-lispgpe-ip4 - main fib, virt2lisp\
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup 3-node Topology
+| | And Add IP Neighbors
+| | And Setup Qemu DUT1
+| | And Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | ${lisp1_if_idx}= | resources.libraries.python.InterfaceUtil.Get Sw If Index
+| | ... | ${dut1_node} | lisp_gpe0
+| | ${lisp2_if_idx}= | resources.libraries.python.InterfaceUtil.Get Sw If Index
+| | ... | ${dut2_node} | lisp_gpe0
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${lisp1_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip4} | ${dut2_to_dut1_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${lisp2_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip4} | ${dut1_to_dut2_ip4}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup 3-node Topology
+| | [Documentation]
+| | ... | Setup 3-node topology for this test suite. Set all physical\
+| | ... | interfaces up and assing IP adresses to them.\
+| | ... | You can specify fib table ID where the DUT-TG interfaces assign to.\
+| | ... | Default is 0.
+| | ...
+| | [Arguments] | ${fib_table}=0
+| | Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Set interfaces in 3-node circular topology up
+| | Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${fib_table}
+| | Assign Interface To Fib Table | ${dut2_node}
+| | ... | ${dut2_to_tg} | ${fib_table}
+| | Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip4}
+| | ... | ${prefix4}
+| | Set Interface Address | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip4}
+| | ... | ${prefix4}
+| | Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip4}
+| | ... | ${prefix4}
+| | Set Interface Address | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip4}
+| | ... | ${prefix4}
+
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | ... | ${dut1_to_dut2_mac}
+
+| Setup Qemu DUT1
+| | [Documentation] | Setup Vhosts on DUT1 and setup IP to one of them. Setup \
+| | ... | Qemu and bridge the vhosts.
+| | ${vhost1}= | And Vpp Create Vhost User Interface | ${dut1_node} | ${sock1}
+| | ${vhost2}= | And Vpp Create Vhost User Interface | ${dut1_node} | ${sock2}
+| | Set Interface Address | ${dut1_node} | ${vhost2} | 6.6.1.9
+| | ... | ${prefix4}
+| | Set Interface State | ${dut1_node} | ${vhost1} | up
+| | Set Interface State | ${dut1_node} | ${vhost2} | up
+| | Create bridge domain | ${dut1_node} | ${bid} | learn=${TRUE}
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${bid} | 0
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${vhost1} | ${bid} | 0
+| | ${vhost_mac}= | Get Vhost User Mac By SW Index | ${dut1_node} | ${vhost2}
+| | Set test variable | ${dst_vhost_mac} | ${vhost_mac}
+| | Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1} | ${sock2}
diff --git a/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4ipsectptlispgpe-ip6base-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4ipsectptlispgpe-ip6base-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..144ac0ac59
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4ipsectptlispgpe-ip6base-eth-2vhost-1vm-func.robot
@@ -0,0 +1,185 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.L2Util
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.IPsecUtil
+| Library | resources.libraries.python.VatJsonUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.QemuUtils
+| Library | resources.libraries.python.VPPUtil
+| Library | String
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv6_lispgpe_ipv4/ipv6_lispgpe_ipsec_ipv4.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP | SKIP_VPP_PATCH
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test with QEMU | ${vm_node}
+| ...
+| Documentation | *IPv6 - ip4-ipsec-lispgpe-ip6 - main fib, vrf, virt2lisp,\
+| ... | phy2lisp*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISPGPE-IPSec-IPv6-ICMP,\
+| ... | Eth-IPv4-IPSec-LISPGPE-IPv6-ICMP
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with LISP and IPsec.\
+| ... | IPsec is in transport mode. Tests cases are for IPsec configured both\
+| ... | on RLOC interface or lisp_gpe0 interface.
+| ... | *[Ver] TG verification:* Packet is send from TG(if1) across the DUT1\
+| ... | via VM to DUT2 where it is forwarded to TG(if2).
+| ... | *[Ref] Applicable standard specifications:* RFC6830, RFC4303.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 over Vhost to LISP GPE tunnel using IPsec (transport) on RLOC Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-LISPGPE-IPSec-IPv6-ICMP on DUT1-DUT2, Eth-IPv6-ICMP\
+| | ... | on TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS. Create Qemu vm on DUT1 and configure bridge\
+| | ... | between two vhosts.
+| | ... | [Ver] Case: ip4-ipsec-lispgpe-ip6 - main fib, virt2lisp\
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology And Lisp
+| | And Setup Qemu DUT1
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip4} | ${dut2_to_dut1_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip4} | ${dut1_to_dut2_ip4}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+| TC02: DUT1 and DUT2 route IPv6 over Vhost to LISP GPE tunnel using IPsec (transport) on lisp_gpe0 Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-IPSec-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2,\
+| | ... | Eth-IPv6-ICMPv6, on TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Case: ip4-ipsec-lispgpe-ip6 - main fib, virt2lisp\
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology And Lisp
+| | And Setup Qemu DUT1
+| | ${lisp1_if_idx}= | resources.libraries.python.InterfaceUtil.get sw if index
+| | ... | ${dut1_node} | ${lisp_gpe_int}
+| | ${lisp2_if_idx}= | resources.libraries.python.InterfaceUtil.get sw if index
+| | ... | ${dut2_node} | ${lisp_gpe_int}
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${lisp1_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip4} | ${dut2_to_dut1_ip4}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${lisp2_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip4} | ${dut1_to_dut2_ip4}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Topology And Lisp
+| | [Documentation] | Setup IPs and neighbors for interfaces on DUT1 and DUT2\
+| | ... | and then setup LISP.
+| | [Arguments] | ${fib_table}=0 | ${vni_table}=0 | ${ip6}=${FALSE}
+| | Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Set interfaces in 3-node circular topology up
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip4}
+| | ... | ${prefix4}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip4}
+| | ... | ${prefix4}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6}
+| | ... | ${prefix6}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | ... | ${dut1_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6}
+| | ... | ${tg_to_dut1_mac}
+| | Vpp All RA Suppress Link Layer | ${nodes}
+| | Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip_static_adjacency}
+| | ... | ${dut2_to_dut1_ip_static_adjacency}
+| | ... | ${vni_table} | ${fib_table}
+
+| Setup Qemu DUT1
+| | [Documentation] | Setup Vhosts on DUT1 and setup IP to one of them. Setup\
+| | ... | Qemu and bridge the vhosts.
+| | ${vhost1}= | And Vpp Create Vhost User Interface | ${dut1_node} | ${sock1}
+| | ${vhost2}= | And Vpp Create Vhost User Interface | ${dut1_node} | ${sock2}
+| | Set Interface Address | ${dut1_node} | ${vhost2} | ${vhost_ip} | ${prefix6}
+| | Set Interface State | ${dut1_node} | ${vhost1} | up
+| | Set Interface State | ${dut1_node} | ${vhost2} | up
+| | Vpp RA Suppress Link Layer | ${dut1_node} | ${vhost2}
+| | Create bridge domain | ${dut1_node} | ${bid} | learn=${TRUE}
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${bid} | 0
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${vhost1} | ${bid} | 0
+| | ${vhost_mac}= | Get Vhost User Mac By SW Index | ${dut1_node} | ${vhost2}
+| | Set test variable | ${dst_vhost_mac} | ${vhost_mac}
+| | Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1} | ${sock2}
diff --git a/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip4base-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip4base-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..c99ba40491
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip4base-eth-2vhost-1vm-func.robot
@@ -0,0 +1,121 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.VPPUtil
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.VhostUser
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv4_lispgpe_ipv4/ipv4_lispgpe_ipv4.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test with QEMU | ${vm_node}
+| ...
+| Documentation | *ip4-lispgpe-ip4 encapsulation test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv4-ICMPv4 on DUT1-DUT2,\
+| ... | Eth-IPv4-ICMPv4 on TG-DUTn for IPv4 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between\
+| ... | DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent in\
+| ... | both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv4 src-addr, dst-addr\
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using vhost interfaces
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-LISPGPE-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on\
+| | ... | TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2.
+| | ... | [Ver] Case: ip4-lispgpe-ip4 - main fib, virt2lisp
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip4} | ${prefix4}
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4}
+| | ... | ${tg_to_dut2_mac}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_dut1_mac}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | ... | ${dut1_to_dut2_mac}
+| | When Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | And Setup Qemu DUT1
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Qemu DUT1
+| | [Documentation] | Setup Vhosts on DUT1 and setup IP on one of them. Setup\
+| | ... | Qemu and bridge the vhosts. Optionally, you can set fib table ID\
+| | ... | where the vhost2 interface should be assigned to.
+| | ...
+| | [Arguments] | ${fib_table}=0
+| | ...
+| | ${vhost1}= | Vpp Create Vhost User Interface | ${dut1_node} | ${sock1}
+| | ${vhost2}= | Vpp Create Vhost User Interface | ${dut1_node} | ${sock2}
+| | Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${vhost2} | ${fib_table}
+| | Set Interface Address | ${dut1_node} | ${vhost2} | ${vhost_ip} | ${prefix4}
+| | Set Interface State | ${dut1_node} | ${vhost1} | up
+| | Set Interface State | ${dut1_node} | ${vhost2} | up
+| | Create bridge domain | ${dut1_node} | ${bid} | learn=${TRUE}
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${bid} | 0
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${vhost1} | ${bid} | 0
+| | ${vhost_mac}= | Get Vhost User Mac By SW Index | ${dut1_node} | ${vhost2}
+| | Set test variable | ${dst_vhost_mac} | ${vhost_mac}
+| | Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1} | ${sock2}
diff --git a/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip4basevrf-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip4basevrf-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..0539bfad1c
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip4basevrf-eth-2vhost-1vm-func.robot
@@ -0,0 +1,133 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.VPPUtil
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.VhostUser
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv4_lispgpe_ipv4/ipv4_lispgpe_ipv4.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test with QEMU | ${vm_node}
+| ...
+| Documentation | *ip4-lispgpe-ip4 encapsulation test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv4-ICMPv4 on DUT1-DUT2,\
+| ... | Eth-IPv4-ICMPv4 on TG-DUTn for IPv4 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between\
+| ... | DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent in\
+| ... | both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv4 src-addr, dst-addr\
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 bidirectionally over LISP GPE tunnel using vhost interfaces and VRF is enabled
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-LISPGPE-IPv4-ICMPv4 on DUT1-DUT2, Eth-IPv4-ICMPv4 on\
+| | ... | TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2.
+| | ... | [Ver] Case: ip4-lispgpe-ip4 - vrf, virt2lisp
+| | ... | Make TG send ICMPv4 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv4 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${fib_table_1}
+| | And Assign Interface To Fib Table | ${dut2_node}
+| | ... | ${dut2_to_tg} | ${fib_table_1}
+| | And Add IP Neighbors
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip4} | ${prefix4}
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip4} | ${prefix4}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip4} | ${prefix4}
+| | When Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip4_static_adjacency}
+| | ... | ${dut2_to_dut1_ip4_static_adjacency}
+| | ... | ${dut1_dut2_vni} | ${fib_table_1}
+| | And Setup Qemu DUT1 | ${fib_table_1}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Qemu DUT1
+| | [Documentation] | Setup Vhosts on DUT1 and setup IP on one of them. Setup\
+| | ... | Qemu and bridge the vhosts. Optionally, you can set fib table ID\
+| | ... | where the vhost2 interface should be assigned to.
+| | ...
+| | [Arguments] | ${fib_table}=0
+| | ...
+| | ${vhost1}= | Vpp Create Vhost User Interface | ${dut1_node} | ${sock1}
+| | ${vhost2}= | Vpp Create Vhost User Interface | ${dut1_node} | ${sock2}
+| | Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${vhost2} | ${fib_table}
+| | Set Interface Address | ${dut1_node} | ${vhost2} | ${vhost_ip} | ${prefix4}
+| | Set Interface State | ${dut1_node} | ${vhost1} | up
+| | Set Interface State | ${dut1_node} | ${vhost2} | up
+| | Create bridge domain | ${dut1_node} | ${bid} | learn=${TRUE}
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${bid} | 0
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${vhost1} | ${bid} | 0
+| | ${vhost_mac}= | Get Vhost User Mac By SW Index | ${dut1_node} | ${vhost2}
+| | Set test variable | ${dst_vhost_mac} | ${vhost_mac}
+| | Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1} | ${sock2}
+
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip4}
+| | ... | ${dut1_to_dut2_mac}
diff --git a/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip6base-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip6base-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..811dce4b27
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/ip4/eth2p-ethip4lispgpe-ip6base-eth-2vhost-1vm-func.robot
@@ -0,0 +1,117 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.VPPUtil
+# import additional Lisp settings from resource file
+| 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 | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test with QEMU | ${vm_node}
+| ...
+| Documentation | *LISP static adjacency test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv6-ICMPv6 on DUT1-DUT2,\
+| ... | Eth-IPv6-ICMPv6 on TG-DUTn for IPv6 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured\
+| ... | between DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets\
+| ... | are sent in both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv6 src-addr,\
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 bidirectionally over LISP GPE tunnel using vhost interfaces
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on\
+| | ... | TG-DUTn.
+| | ... | [Cfg] Configure IPv4 LISP static adjacencies on DUT1 and DUT2.
+| | ... | [Ver] Case: ip6-lispgpe-ip4 - main fib, virt2lisp
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Configure IP addresses on interfaces
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6o4}
+| | ... | ${dut_prefix6o4}
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6o4} | ${tg_prefix6o4}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut_prefix6o4}
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6o4}
+| | ... | ${tg_to_dut1_mac}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6o4}
+| | ... | ${tg_to_dut2_mac}
+| | And Add Arp On Dut | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_dut1_mac}
+| | And Add Arp On Dut | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6o4}
+| | ... | ${dut1_to_dut2_mac}
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | When Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency}
+| | ... | ${dut2_ip6o4_static_adjacency}
+| | And Setup Qemu DUT1
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6o4} | ${tg2_ip6o4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6o4} | ${tg1_ip6o4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Qemu DUT1
+| | [Documentation] | Setup Vhosts on DUT1 and setup IP on one of them. Setup\
+| | ... | Qemu and bridge the vhosts.
+| | ...
+| | ${vhost1}= | Vpp Create Vhost User Interface | ${dut1_node} | ${sock1}
+| | ${vhost2}= | Vpp Create Vhost User Interface | ${dut1_node} | ${sock2}
+| | Set Interface Address | ${dut1_node} | ${vhost2} | ${vhost_ip} | ${prefix4}
+| | Set Interface State | ${dut1_node} | ${vhost1} | up
+| | Set Interface State | ${dut1_node} | ${vhost2} | up
+| | Create bridge domain | ${dut1_node} | ${bid} | learn=${TRUE}
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${bid} | 0
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${vhost1} | ${bid} | 0
+| | ${vhost_mac}= | Get Vhost User Mac By SW Index | ${dut1_node} | ${vhost2}
+| | Set test variable | ${dst_vhost_mac} | ${vhost_mac}
+| | Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1} | ${sock2}
diff --git a/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6ipsectptlispgpe-ip4base-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6ipsectptlispgpe-ip4base-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..6b5639537e
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6ipsectptlispgpe-ip4base-eth-2vhost-1vm-func.robot
@@ -0,0 +1,183 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.L2Util
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.IPsecUtil
+| Library | resources.libraries.python.VatJsonUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.QemuUtils
+| Library | resources.libraries.python.VPPUtil
+| Library | String
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv4_lispgpe_ipv6/ipv4_lispgpe_ipsec_ipv6.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP | SKIP_VPP_PATCH
+| ...
+| Test Setup | Set up functional test
+| ...
+| Test Teardown | Tear down LISP functional test with QEMU | ${vm_node}
+| ...
+| Documentation | *IPv6 - ip4-ipsec-lispgpe-ip6 - main fib, virt2lisp, phy2lisp*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISPGPE-IPSec-IPv4-ICMP,\
+| ... | Eth-IPv6-IPSec-LISPGPE-IPv4-ICMP
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with LISP and IPsec.\
+| ... | IPsec is in transport mode. Test cases are for IPsec configured both\
+| ... | on RLOC interface or lisp_gpe0 interface.
+| ... | *[Ver] TG verification:* Packet is send from TG(if1) across the DUT1 to\
+| ... | DUT2 where it is forwarded to TG(if2).
+| ... | *[Ref] Applicable standard specifications:* RFC6830, RFC4303.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv4 over Vhost to LISP GPE tunnel using IPsec (transport) on RLOC Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-LISPGPE-IPSec-IPv4-ICMP on DUT1-DUT2, Eth-IPv4-ICMP\
+| | ... | on TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS. Create Qemu vm on DUT1 and configure bridge\
+| | ... | between two vhosts.
+| | ... | [Ver] Case: ip6-ipsec-lispgpe-ip4 - main fib, virt2lisp\
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology And Lisp
+| | And Setup Qemu DUT1
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip6} | ${dut2_to_dut1_ip6}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip6} | ${dut1_to_dut2_ip6}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+| TC02: DUT1 and DUT2 route IPv4 over Vhost to LISP GPE tunnel using IPsec (transport) on lisp_gpe0 Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-IPSec-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2,\
+| | ... | Eth-IPv6-ICMPv6, on TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Case: ip6-ipsec-lispgpe-ip4 - main fib, virt2lisp\
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology And Lisp
+| | And Setup Qemu DUT1
+| | ${lisp1_if_idx}= | resources.libraries.python.InterfaceUtil.get sw if index
+| | ... | ${dut1_node} | ${lisp_gpe_int}
+| | ${lisp2_if_idx}= | resources.libraries.python.InterfaceUtil.get sw if index
+| | ... | ${dut2_node} | ${lisp_gpe_int}
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${lisp1_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip6} | ${dut2_to_dut1_ip6}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${lisp2_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip6} | ${dut1_to_dut2_ip6}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip4} | ${tg2_ip4}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip4} | ${tg1_ip4}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Topology And Lisp
+| | [Documentation] | Setup IPs and neighbors for interfaces on DUT1 and DUT2\
+| | ... | and then setup LISP.
+| | Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Set interfaces in 3-node circular topology up
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip4}
+| | ... | ${prefix4}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip4}
+| | ... | ${prefix4}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip4}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6}
+| | ... | ${dut1_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip4}
+| | ... | ${tg_to_dut1_mac}
+| | Vpp All RA Suppress Link Layer | ${nodes}
+| | Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_to_dut2_ip_static_adjacency}
+| | ... | ${dut2_to_dut1_ip_static_adjacency}
+
+| Setup Qemu DUT1
+| | [Documentation] | Setup Vhosts on DUT1 and setup IP to one of them. Setup\
+| | ... | Qemu and bridge the vhosts.
+| | ${vhost1}= | And Vpp Create Vhost User Interface | ${dut1_node} | ${sock1}
+| | ${vhost2}= | And Vpp Create Vhost User Interface | ${dut1_node} | ${sock2}
+| | Set Interface Address | ${dut1_node} | ${vhost2} | ${vhost_ip} | ${prefix4}
+| | Set Interface State | ${dut1_node} | ${vhost1} | up
+| | Set Interface State | ${dut1_node} | ${vhost2} | up
+| | Create bridge domain | ${dut1_node} | ${bid} | learn=${TRUE}
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${bid} | 0
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${vhost1} | ${bid} | 0
+| | ${vhost_mac}= | Get Vhost User Mac By SW Index | ${dut1_node} | ${vhost2}
+| | Set test variable | ${dst_vhost_mac} | ${vhost_mac}
+| | Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1} | ${sock2}
diff --git a/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6ipsectptlispgpe-ip6base-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6ipsectptlispgpe-ip6base-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..d5186ddbfd
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6ipsectptlispgpe-ip6base-eth-2vhost-1vm-func.robot
@@ -0,0 +1,201 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.L2Util
+| Library | resources.libraries.python.LispUtil
+| Library | resources.libraries.python.VPPUtil
+| Library | resources.libraries.python.IPsecUtil
+| Library | resources.libraries.python.VatJsonUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VhostUser
+| Library | resources.libraries.python.QemuUtils
+| Library | String
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv6_lispgpe_ipv6/ipv6_lispgpe_ipsec_ipv6.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP | SKIP_VPP_PATCH
+| ...
+| Test Setup | Run Keywords | Set up functional test
+| ... | AND | Vpp All Ra Suppress Link Layer | ${nodes}
+| ...
+| Test Teardown | Tear down LISP functional test with QEMU | ${vm_node}
+| ...
+| Documentation | *IPv6 - ip6-ipsec-lispgpe-ip6 - main fib,
+| ... | vrf (gpe_vni-to-vrf), phy2lisp, virt2lisp*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-IPSec-LISPGPE-IPv6-ICMPv6,\
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with LISP and IPsec.\
+| ... | IPsec is in transport mode. Tests cases are for IPsec configured both\
+| ... | on RLOC interface or lisp_gpe0 interface.
+| ... | *[Ver] TG verification:* Packet is send from TG(if1) across the DUT1\
+| ... | via VM to DUT2 where it is forwarded to TG(if2).
+| ... | *[Ref] Applicable standard specifications:* RFC6830, RFC4303.
+
+*** Variables ***
+| ${dut2_spi}= | ${1000}
+| ${dut1_spi}= | ${1001}
+
+| ${ESP_PROTO}= | ${50}
+
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+
+| ${bid}= | 10
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 over Vhost to LISP GPE tunnel using IPsec (transport) on RLOC Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-IPSec-LISPGPE-IPv6-ICMP on DUT1-DUT2, Eth-IPv6-ICMP\
+| | ... | on TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS. Create Qemu vm on DUT1 and configure bridge\
+| | ... | between two vhosts.
+| | ... | [Ver] Case: ip6-ipsec-lispgpe-ip6 - main fib, virt2lisp\
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology
+| | And Setup Qemu DUT1
+| | And Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip6_static_adjacency}
+| | ... | ${dut2_to_dut1_ip6_static_adjacency}
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip6} | ${dut2_to_dut1_ip6}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip6} | ${dut1_to_dut2_ip6}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+| TC02: DUT1 and DUT2 route IPv6 over Vhost to LISP GPE tunnel using IPsec (transport) on lisp_gpe0 Int.
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-IPSec-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2,\
+| | ... | Eth-IPv6-ICMPv6 on TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2 with\
+| | ... | IPsec in between DUTS.
+| | ... | [Ver] Case: ip6-ipsec-lispgpe-ip6 - main fib, virt2lisp\
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across\
+| | ... | both DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830, RFC4303.
+| | ...
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Setup Topology
+| | And Setup Qemu DUT1
+| | And Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip6_static_adjacency}
+| | ... | ${dut2_to_dut1_ip6_static_adjacency}
+| | ${lisp1_if_idx}= | resources.libraries.python.InterfaceUtil.get sw if index
+| | ... | ${dut1_node} | lisp_gpe0
+| | ${lisp2_if_idx}= | resources.libraries.python.InterfaceUtil.get sw if index
+| | ... | ${dut2_node} | lisp_gpe0
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | When Configure manual keyed connection for IPSec
+| | ... | ${dut1_node} | ${lisp1_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut1_spi} | ${dut2_spi}
+| | ... | ${dut1_to_dut2_ip6} | ${dut2_to_dut1_ip6}
+| | And Configure manual keyed connection for IPSec
+| | ... | ${dut2_node} | ${lisp2_if_idx} | ${encr_alg} | ${encr_key}
+| | ... | ${auth_alg} | ${auth_key} | ${dut2_spi} | ${dut1_spi}
+| | ... | ${dut2_to_dut1_ip6} | ${dut1_to_dut2_ip6}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Topology
+| | Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Set interfaces in 3-node circular topology up
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6}
+| | ... | ${prefix6}
+| | Vpp Set If IPv6 Addr | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6}
+| | ... | ${prefix6}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6}
+| | ... | ${dut1_to_dut2_mac}
+| | Vpp All RA Suppress Link Layer | ${nodes}
+
+| Setup Qemu DUT1
+| | [Documentation] | Setup Vhosts on DUT1 and setup IP to one of them. Setup \
+| | ... | Qemu and bridge the vhosts.
+| | ${vhost1}= | And Vpp Create Vhost User Interface | ${dut1_node} | ${sock1}
+| | ${vhost2}= | And Vpp Create Vhost User Interface | ${dut1_node} | ${sock2}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${vhost2} | 2001:cdba:1::9
+| | ... | ${prefix6}
+| | Set Interface State | ${dut1_node} | ${vhost1} | up
+| | Set Interface State | ${dut1_node} | ${vhost2} | up
+| | Vpp RA Suppress Link Layer | ${dut1_node} | ${vhost2}
+| | Create bridge domain | ${dut1_node} | ${bid} | learn=${TRUE}
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${bid} | 0
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${vhost1} | ${bid} | 0
+| | ${vhost_mac}= | Get Vhost User Mac By SW Index | ${dut1_node} | ${vhost2}
+| | Set test variable | ${dst_vhost_mac} | ${vhost_mac}
+| | Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1} | ${sock2}
diff --git a/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6lispgpe-ip6base-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6lispgpe-ip6base-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..073792618d
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6lispgpe-ip6base-eth-2vhost-1vm-func.robot
@@ -0,0 +1,131 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VPPUtil
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv6_lispgpe_ipv6/ipv6_lispgpe_ipv6.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP
+| ...
+| Test Setup | Run Keywords | Set up functional test
+| ... | AND | Vpp All Ra Suppress Link Layer | ${nodes}
+| ...
+| Test Teardown | Tear down LISP functional test with QEMU | ${vm_node}
+| ...
+| Documentation | *ip6-lispgpe-ip6 encapsulation test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv6-ICMPv6 on DUT1-DUT2,\
+| ... | Eth-IPv6-ICMPv6 on TG-DUTn for IPv6 routing over LISPoIPv6 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured between\
+| ... | DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets are sent in\
+| ... | both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv6 src-addr, dst-addr\
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 bidirectionally over LISP GPE tunnel using vhost interfaces
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on\
+| | ... | TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2.
+| | ... | [Ver] Case: ip6-ipsec-lispgpe-ip6 - main fib, virt2lisp
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Add IP Neighbors
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | When Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip6_static_adjacency}
+| | ... | ${dut2_to_dut1_ip6_static_adjacency}
+| | And Setup Qemu DUT1
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Qemu DUT1
+| | [Documentation] | Setup Vhosts on DUT1 and setup IP on one of them. Setup\
+| | ... | Qemu and bridge the vhosts. Optionally, you can set fib table ID\
+| | ... | where the vhost2 interface should be assigned to.
+| | ...
+| | [Arguments] | ${fib_table}=0
+| | ...
+| | ${vhost1}= | Vpp Create Vhost User Interface | ${dut1_node} | ${sock1}
+| | ${vhost2}= | Vpp Create Vhost User Interface | ${dut1_node} | ${sock2}
+| | Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${vhost2} | ${fib_table} | ipv6=${TRUE}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${vhost2} | ${vhost_ip}
+| | ... | ${prefix6}
+| | Set Interface State | ${dut1_node} | ${vhost1} | up
+| | Set Interface State | ${dut1_node} | ${vhost2} | up
+| | Create bridge domain | ${dut1_node} | ${bid} | learn=${TRUE}
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${bid} | 0
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${vhost1} | ${bid} | 0
+| | ${vhost_mac}= | Get Vhost User Mac By SW Index | ${dut1_node} | ${vhost2}
+| | Set test variable | ${dst_vhost_mac} | ${vhost_mac}
+| | Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1} | ${sock2}
+
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6}
+| | ... | ${dut1_to_dut2_mac}
diff --git a/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6lispgpe-ip6basevrf-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6lispgpe-ip6basevrf-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..e0a6cd425d
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/ip6/eth2p-ethip6lispgpe-ip6basevrf-eth-2vhost-1vm-func.robot
@@ -0,0 +1,138 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPUtil
+| Library | resources.libraries.python.IPv6Setup
+| Library | resources.libraries.python.VPPUtil
+| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/vrf.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+# Import configuration and test data:
+| Variables | resources/test_data/lisp/ipv6_lispgpe_ipv6/ipv6_lispgpe_ipv6.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | LISP
+| ...
+| Test Setup | Run Keywords | Set up functional test
+| ... | AND | Vpp All Ra Suppress Link Layer | ${nodes}
+| ...
+| Test Teardown | Tear down LISP functional test with QEMU | ${vm_node}
+| ...
+| Documentation | *ip6-lispgpe-ip6 encapsulation test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv6-ICMPv6 on DUT1-DUT2,\
+| ... | Eth-IPv6-ICMPv6 on TG-DUTn for IPv6 routing over LISPoIPv6 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured between\
+| ... | DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets are sent in\
+| ... | both directions by TG on links to DUT1 and DUT2; on receive\
+| ... | TG verifies packets for correctness and their IPv6 src-addr, dst-addr\
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Test Cases ***
+| TC01: DUT1 and DUT2 route IPv6 bidirectionally over LISP GPE tunnel using vhost interfaces and VRF is enabled
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-LISPGPE-IPv6-ICMPv6 on DUT1-DUT2, Eth-IPv6-ICMPv6 on\
+| | ... | TG-DUTn.
+| | ... | [Cfg] Configure IPv6 LISP static adjacencies on DUT1 and DUT2.
+| | ... | [Ver] Case: ip6-lispgpe-ip6 - vrf, virt2lisp
+| | ... | Make TG send ICMPv6 Echo Req between its interfaces across both\
+| | ... | DUTs and LISP GPE tunnel between them; verify IPv6 headers on\
+| | ... | received packets are correct.
+| | ... | [Ref] RFC6830.
+| | ...
+| | ...
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | And Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${fib_table_1} | ipv6=${TRUE}
+| | And Assign Interface To Fib Table | ${dut2_node}
+| | ... | ${dut2_to_tg} | ${fib_table_1} | ipv6=${TRUE}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_to_dut2_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut1_node} | ${dut1_to_tg} | ${dut1_to_tg_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_to_dut1_ip6} | ${prefix6}
+| | And Vpp Set If IPv6 Addr
+| | ... | ${dut2_node} | ${dut2_to_tg} | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Add IP Neighbors
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | When Configure LISP GPE topology in 3-node circular topology
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${NONE}
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_to_dut2_ip6_static_adjacency}
+| | ... | ${dut2_to_dut1_ip6_static_adjacency}
+| | ... | ${dut1_dut2_vni} | ${fib_table_1}
+| | And Setup Qemu DUT1 | ${fib_table_1}
+| | Then Send packet and verify headers
+| | ... | ${tg_node} | ${tg1_ip6} | ${tg2_ip6}
+| | ... | ${tg_to_dut1} | ${tg_to_dut1_mac} | ${dst_vhost_mac}
+| | ... | ${tg_to_dut2} | ${dut2_to_tg_mac} | ${tg_to_dut2_mac}
+| | And Send packet and verify headers
+| | ... | ${tg_node} | ${tg2_ip6} | ${tg1_ip6}
+| | ... | ${tg_to_dut2} | ${tg_to_dut2_mac} | ${dut2_to_tg_mac}
+| | ... | ${tg_to_dut1} | ${dut1_to_tg_mac} | ${tg_to_dut1_mac}
+
+*** Keywords ***
+| Setup Qemu DUT1
+| | [Documentation] | Setup Vhosts on DUT1 and setup IP on one of them. Setup\
+| | ... | Qemu and bridge the vhosts. Optionally, you can set fib table ID\
+| | ... | where the vhost2 interface should be assigned to.
+| | ...
+| | [Arguments] | ${fib_table}=0
+| | ...
+| | ${vhost1}= | Vpp Create Vhost User Interface | ${dut1_node} | ${sock1}
+| | ${vhost2}= | Vpp Create Vhost User Interface | ${dut1_node} | ${sock2}
+| | Assign Interface To Fib Table | ${dut1_node}
+| | ... | ${vhost2} | ${fib_table} | ipv6=${TRUE}
+| | Vpp Set If IPv6 Addr | ${dut1_node} | ${vhost2} | ${vhost_ip}
+| | ... | ${prefix6}
+| | Set Interface State | ${dut1_node} | ${vhost1} | up
+| | Set Interface State | ${dut1_node} | ${vhost2} | up
+| | Create bridge domain | ${dut1_node} | ${bid} | learn=${TRUE}
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${dut1_to_tg} | ${bid} | 0
+| | Add interface to bridge domain | ${dut1_node}
+| | ... | ${vhost1} | ${bid} | 0
+| | ${vhost_mac}= | Get Vhost User Mac By SW Index | ${dut1_node} | ${vhost2}
+| | Set test variable | ${dst_vhost_mac} | ${vhost_mac}
+| | Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1} | ${sock2}
+
+| Add IP Neighbors
+| | [Documentation]
+| | ... | Add IP neighbors to physical interfaces on DUTs.
+| | ...
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg1_ip6}
+| | ... | ${tg_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg2_ip6}
+| | ... | ${tg_to_dut2_mac}
+| | Add IP Neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_dut1_mac}
+| | Add IP Neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_to_dut2_ip6}
+| | ... | ${dut1_to_dut2_mac}
diff --git a/tests/vpp/func/vm_vhost/l2bd/eth2p-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/l2bd/eth2p-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..7eb7d3e857
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/l2bd/eth2p-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-func.robot
@@ -0,0 +1,145 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/vm/double_qemu_setup.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_DOUBLE_LINK_TOPO | HW_ENV | VM_ENV | VPP_VM_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Run Keywords | Show Packet Trace on All DUTs | ${nodes}
+| ... | AND | Show vpp trace dump on all DUTs
+| ... | AND | Stop and clear QEMU | ${dut_node} | ${vm_node}
+| ... | AND | Verify VPP PID in Teardown
+| Documentation | *L2 bridge domain with VLAN tag over VM test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG=DUT 2-node circular topology
+| ... | with double links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-dot1q-IPv4-ICMPv4 or
+| ... | Eth-dot1q-IPv6-ICMPv6 on TG=DUT and on DUT=VM.
+| ... | *[Cfg] DUT configuration:* DUT is configured with two bridge domains
+| ... | (L2BD) with MAC learning enabled; each one with added VLAN
+| ... | sub-interface towards TG and vhost-user interface to local VM. Configure
+| ... | linux bridge on VM to pass traffic between both vhost-user interfaces.
+| ... | *[Ver] TG verification:* Make TG send ICMPv4/ICMPv6 Echo Req between two
+| ... | of its interfaces to be switched by DUT via VM; verify packets are
+| ... | switched between these TG interfaces; on receive TG verifies packets for
+| ... | correctness and their IPv4 src-addr, dst-addr, MAC addresses and
+| ... | VLAN tag.
+| ... | *[Ref] Applicable standard specifications:* IEEE 802.1q.
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+
+| ${vlan_id1}= | 110
+| ${vlan_wrong}= | 150
+
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+
+| ${ip4_1}= | 192.168.100.1
+| ${ip4_2}= | 192.168.100.2
+
+| ${ip6_1}= | 3ffe:63::1
+| ${ip6_2}= | 3ffe:63::2
+
+*** Test Cases ***
+| TC01: eth2p-dot1q-l2bdbasemaclrn-eth-2vhost-1vm - ipv4
+| | [Documentation]
+| | ... | [Top] TG=DUT.
+| | ... | [Enc] Eth-dot1q-IPv4-ICMPv4 on TG=DUT and on DUT=VM.
+| | ... | [Cfg] On DUT configure two L2BDs (MAC learning enabled); first L2BD
+| | ... | with Dot1Q tagged interface to TG-if1 and vhost-user interface to
+| | ... | local VM, second one with vhost-user interface to local VM and Dot1Q
+| | ... | tagged interface towards TG-if2. Configure linux bridge on VM to pass
+| | ... | traffic between both vhost-user interfaces.
+| | ... | [Ver] Make TG send ICMPv4 Echo Req tagged with one Dot1q tag
+| | ... | from one of its interfaces to another one via DUT and VM; verify
+| | ... | that packet is received.
+| | ... | [Ref] IEEE 802.1q
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${vlan_id1}
+| | And Configure vhost interfaces for L2BD forwarding
+| | ... | ${dut_node} | ${sock1} | ${sock2}
+| | And Configure VM for vhost L2BD forwarding
+| | ... | ${dut_node} | ${sock1} | ${sock2}
+| | And Add interface to bridge domain | ${dut_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${vlan2_index}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if2}
+| | ... | ${bd_id2}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2} | ${ip4_1} | ${ip4_2}
+| | ... | encaps=Dot1q | vlan1=${vlan_id1} | encaps_rx=Dot1q
+| | And Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if1} | ${ip4_2} | ${ip4_1}
+| | ... | encaps=Dot1q | vlan1=${vlan_id1} | encaps_rx=Dot1q
+
+| TC01: eth2p-dot1q-l2bdbasemaclrn-eth-2vhost-1vm - ipv6
+| | [Documentation]
+| | ... | [Top] TG=DUT.
+| | ... | [Enc] Eth-dot1q-IPv6-ICMPv6 on TG=DUT and on DUT=VM.
+| | ... | [Cfg] On DUT configure two L2BDs (MAC learning enabled); first L2BD
+| | ... | with Dot1Q tagged interface to TG-if1 and vhost-user interface to
+| | ... | local VM, second one with vhost-user interface to local VM and Dot1Q
+| | ... | tagged interface towards TG-if2. Configure linux bridge on VM to pass
+| | ... | traffic between both vhost-user interfaces.
+| | ... | [Ver] Make TG send ICMPv6 Echo Req tagged with one Dot1q tag
+| | ... | from one of its interfaces to another one via DUT and VM; verify
+| | ... | that packet is received.
+| | ... | [Ref] IEEE 802.1q
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | ${vlan1_name} | ${vlan1_index}= | When Create vlan sub-interface
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${vlan_id1}
+| | ${vlan2_name} | ${vlan2_index}= | And Create vlan sub-interface
+| | ... | ${dut_node} | ${dut_to_tg_if2} | ${vlan_id1}
+| | And Configure vhost interfaces for L2BD forwarding
+| | ... | ${dut_node} | ${sock1} | ${sock2}
+| | And Configure VM for vhost L2BD forwarding
+| | ... | ${dut_node} | ${sock1} | ${sock2}
+| | And Add interface to bridge domain | ${dut_node} | ${vlan1_index}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${vlan2_index}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if2}
+| | ... | ${bd_id2}
+| | Then Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2} | ${ip6_1} | ${ip6_2}
+| | ... | encaps=Dot1q | vlan1=${vlan_id1} | encaps_rx=Dot1q
+| | And Send ICMP packet and verify received packet
+| | ... | ${tg_node} | ${tg_to_dut_if2} | ${tg_to_dut_if1} | ${ip6_2} | ${ip6_1}
+| | ... | encaps=Dot1q | vlan1=${vlan_id1} | encaps_rx=Dot1q
+
+
+
+
diff --git a/tests/vpp/func/vm_vhost/l2bd/eth2p-dot1q-l2bdbasemaclrn-eth-4vhost-2vm-fds-provider-nets-func.robot b/tests/vpp/func/vm_vhost/l2bd/eth2p-dot1q-l2bdbasemaclrn-eth-4vhost-2vm-fds-provider-nets-func.robot
new file mode 100644
index 0000000000..6bf594c0df
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/l2bd/eth2p-dot1q-l2bdbasemaclrn-eth-4vhost-2vm-fds-provider-nets-func.robot
@@ -0,0 +1,341 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/double_qemu_setup.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/fds/default.robot
+| Library | resources.libraries.python.Trace
+| ...
+| Force Tags | HW_ENV | VM_ENV | SKIP_PATCH
+| ...
+| Test Setup | Set up FDS functional test | ${nodes}
+| ...
+| Test Teardown | Tear down FDS functional test | ${nodes}
+| ... | ${dut1_node} | ${qemu_node1} | ${dut2_node} | ${qemu_node2}
+| ...
+| Documentation | *Provider network FDS related.*
+| ...
+| ... | Test suite uses 3-node topology TG - DUT1 - DUT2 - TG
+| ... | with one link between nodes. Test packets are sent in both directions
+| ... | between namespaces in DUT1 and DUT2 with both positive and negative
+| ... | scenarios tested.
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${shg1}= | 3
+| ${shg2}= | 4
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+| ${sock3}= | /tmp/sock3
+| ${sock4}= | /tmp/sock4
+
+| ${bid_b}= | 23
+| ${bid_r}= | 24
+
+| ${vlan_red}= | 50
+| ${vlan_blue}= | 60
+
+| ${dut1_if_ip}= | 16.0.0.1
+| ${dut2_if_ip}= | 16.0.0.2
+
+| ${dut1_blue1}= | 16.0.10.1
+| ${dut1_blue2}= | 16.0.10.2
+| ${dut1_red1}= | 16.0.10.3
+| ${dut1_red2}= | 16.0.10.4
+
+| ${dut2_blue1}= | 16.0.20.1
+| ${dut2_blue2}= | 16.0.20.2
+| ${dut2_red1}= | 16.0.20.3
+| ${dut2_red2}= | 16.0.20.4
+
+| ${namespace1}= | nmspace1
+| ${namespace2}= | nmspace2
+| ${namespace3}= | nmspace3
+| ${namespace4}= | nmspace4
+
+| ${prefix_length}= | 16
+
+*** Test Cases ***
+| Provider network test cases with provider physical networks (VLAN)
+| | [Documentation] | Ping among all ports inside the same network should pass.
+| | ... | a) test l2 connectivity inside every network
+| | ... | b) test l2 connectivity between networks
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO | VPP_VM_ENV
+| | Given Configure path in 3-node circular topology | ${nodes['TG']}
+| | ... | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if_ip}
+| | ... | ${prefix_length}
+| | And Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${dut2_if_ip}
+| | ... | ${prefix_length}
+| | And Set Interface State | ${dut1_node} | ${dut1_to_dut2} | up
+| | And Set Interface State | ${dut2_node} | ${dut2_to_dut1} | up
+| | ${vhost_if1_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock1}
+| | ${vhost_if2_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock2}
+| | ${vhost_if3_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock3}
+| | ${vhost_if4_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock4}
+| | ${dut1_vhosts}= | And Create List | ${vhost_if1_DUT1} | ${vhost_if2_DUT1}
+| | ... | ${vhost_if3_DUT1} | ${vhost_if4_DUT1}
+| | ${vhost_if1_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock1}
+| | ${vhost_if2_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock2}
+| | ${vhost_if3_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock3}
+| | ${vhost_if4_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock4}
+| | ${dut2_vhosts}= | And Create List | ${vhost_if1_DUT2} | ${vhost_if2_DUT2}
+| | ... | ${vhost_if3_DUT2} | ${vhost_if4_DUT2}
+| | When Configure QEMU vhost and run it | ${dut1_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | ... | ${sock3}
+| | ... | ${sock4}
+| | ... | ${dut1_blue1}
+| | ... | ${dut1_blue2}
+| | ... | ${dut1_red1}
+| | ... | ${dut1_red2}
+| | ... | ${prefix_length}
+| | ... | qemu_node1
+| | ... | 04
+| | And Configure QEMU vhost and run it | ${dut2_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | ... | ${sock3}
+| | ... | ${sock4}
+| | ... | ${dut2_blue1}
+| | ... | ${dut2_blue2}
+| | ... | ${dut2_red1}
+| | ... | ${dut2_red2}
+| | ... | ${prefix_length}
+| | ... | qemu_node2
+| | ... | 06
+| | And Setup VLAN and BD on Dut | ${dut1_node} | ${dut1_to_dut2}
+| | ... | @{dut1_vhosts}
+| | And Setup VLAN and BD on Dut | ${dut2_node} | ${dut2_to_dut1}
+| | ... | @{dut2_vhosts}
+| | Then Positive Scenario Ping From DUT1 - Intra network
+| | And Positive Scenario Ping From DUT1 - Inter network
+| | And Positive Scenario Ping From DUT2 - Intra network
+| | And Positive Scenario Ping From DUT2 - Inter network
+| | And Negative Scenario Ping From DUT1 - Intra network
+| | And Negative Scenario Ping From DUT1 - Inter network
+| | And Negative Scenario Ping From DUT2 - Intra network
+| | And Negative Scenario Ping From DUT2 - Inter network
+
+*** Keywords ***
+| Setup VLAN and BD on Dut
+| | [Documentation] | Setup VLAN and bridge domain on specific DUT and
+| | ... | subsequently interconnect them properly. Also set VLAN tag
+| | ... | rewrite on vhosts.
+| | ...
+| | ... | *Arguments:*
+| | ... | - dut_node - Node where to setup VLAN and BD. Type: dict
+| | ... | - interface - Interface where to create VLAN sub-interface.
+| | ... | Type: string
+| | ... | - vhosts - List containing vhost interfaces.
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Setup VLAN and BD on Dut \| ${dut_node} \| GigabitEthernet0/6/0 \
+| | ... | \| @{vhosts} \|
+| | ...
+| | [Arguments] | ${dut_node} | ${interface} | @{vhosts}
+| | Create bridge domain | ${dut_node} | ${bid_b} | learn=${TRUE}
+| | Create bridge domain | ${dut_node} | ${bid_r} | learn=${TRUE}
+| | ${interface_name}= | Get interface name | ${dut_node} | ${interface}
+| | ${vlan1_name} | ${vlan1_index}= | Create Vlan Subinterface
+| | ... | ${dut_node} | ${interface_name} | ${vlan_blue}
+| | ${vlan2_name} | ${vlan2_index}= | Create Vlan Subinterface
+| | ... | ${dut_node} | ${interface_name} | ${vlan_red}
+| | L2 Vlan Tag Rewrite | ${dut_node} | @{vhosts}[0] | push-1
+| | ... | tag1_id=${vlan_blue}
+| | L2 Vlan Tag Rewrite | ${dut_node} | @{vhosts}[1] | push-1
+| | ... | tag1_id=${vlan_blue}
+| | L2 Vlan Tag Rewrite | ${dut_node} | @{vhosts}[2] | push-1
+| | ... | tag1_id=${vlan_red}
+| | L2 Vlan Tag Rewrite | ${dut_node} | @{vhosts}[3] | push-1
+| | ... | tag1_id=${vlan_red}
+| | Add interface to bridge domain | ${dut_node}
+| | ... | ${vlan1_index} | ${bid_b} | 0
+| | Add interface to bridge domain | ${dut_node}
+| | ... | @{vhosts}[0] | ${bid_b} | 0
+| | Add interface to bridge domain | ${dut_node}
+| | ... | @{vhosts}[1] | ${bid_b} | 0
+| | Add interface to bridge domain | ${dut_node}
+| | ... | ${vlan2_index} | ${bid_r} | 0
+| | Add interface to bridge domain | ${dut_node}
+| | ... | @{vhosts}[2] | ${bid_r} | 0
+| | Add interface to bridge domain | ${dut_node}
+| | ... | @{vhosts}[3] | ${bid_r} | 0
+
+| Positive Scenario Ping From DUT1 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1} | ${namespace4}
+
+| Positive Scenario Ping From DUT1 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1} | ${namespace4}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2} | ${namespace4}
+
+| Positive Scenario Ping From DUT2 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1} | ${namespace4}
+
+| Positive Scenario Ping From DUT2 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1} | ${namespace4}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2} | ${namespace4}
+
+| Negative Scenario Ping From DUT1 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2}
+| | ... | ${namespace4}
+
+| Negative Scenario Ping From DUT1 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2}
+| | ... | ${namespace4}
+
+| Negative Scenario Ping From DUT2 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2}
+| | ... | ${namespace4}
+
+| Negative Scenario Ping From DUT2 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2}
+| | ... | ${namespace4}
diff --git a/tests/vpp/func/vm_vhost/l2bd/eth2p-eth-l2bdbasemaclrn-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/l2bd/eth2p-eth-l2bdbasemaclrn-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..678e268235
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/l2bd/eth2p-eth-l2bdbasemaclrn-eth-2vhost-1vm-func.robot
@@ -0,0 +1,110 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_DOUBLE_LINK_TOPO | HW_ENV | VM_ENV | VPP_VM_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2 bridge-domain test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG=DUT=VM 3-node topology with VM
+| ... | and double parallel links.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of
+| ... | IPv4; Eth-IPv6-ICMPv6 for L2 switching of IPv6 use. Both apply
+| ... | to all links.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with two L2 bridge-domains
+| ... | (L2BD) switching combined with MAC learning enabled.
+| ... | *[Ver] TG verification:* Test ICMPv4 (or ICMPv6) Echo Request packets
+| ... | are sent in both directions by TG on links to DUT1 via VM; on
+| ... | receive TG verifies packets for correctness and their IPv4 (IPv6)
+| ... | src-addr, dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+
+*** Test Cases ***
+| TC01: DUT with two L2BDs (MAC learn) switches ICMPv4 between TG and VM links
+| | [Documentation]
+| | ... | [Top] TG=DUT=VM. [Enc] Eth-IPv4-ICMPv4. [Cfg] On DUT1 configure \
+| | ... | two L2BDs with MAC learning, each with vhost-user i/f to local
+| | ... | VM and i/f to TG; configure VM to loop pkts back betwen its two
+| | ... | virtio i/fs. [Ver] Make TG verify ICMPv4 Echo Req pkts are
+| | ... | switched thru DUT1 and VM in both directions and are correct on
+| | ... | receive. [Ref]
+| | ...
+| | [Teardown] | Run Keywords | Stop and clear QEMU | ${dut_node} | ${vm_node}
+| | ... | AND | Tear down functional test
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | When Configure vhost interfaces for L2BD forwarding | ${dut_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | And Create bridge domain | ${dut_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if1}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut_node} | ${bd_id2}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if2}
+| | ... | ${bd_id2}
+| | And Configure VM for vhost L2BD forwarding | ${dut_node} | ${sock1}
+| | ... | ${sock2}
+| | Then Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+
+| TC02: DUT with two L2BDs (MAC learn) switches ICMPv6 between TG and VM links
+| | [Documentation]
+| | ... | [Top] TG=DUT=VM. [Enc] Eth-IPv6-ICMPv6. [Cfg] On DUT1 configure \
+| | ... | two L2BDs with MAC learning, each with vhost-user i/f to local
+| | ... | VM and i/f to TG; configure VM to loop pkts back betwen its two
+| | ... | virtio i/fs. [Ver] Make TG verify ICMPv6 Echo Req pkts are
+| | ... | switched thru DUT1 and VM in both directions and are correct on
+| | ... | receive. [Ref]
+| | ...
+| | [Teardown] | Run Keywords | Stop and clear QEMU | ${dut_node} | ${vm_node}
+| | ... | AND | Tear down functional test
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | When Configure vhost interfaces for L2BD forwarding | ${dut_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | And Create bridge domain | ${dut_node} | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if1}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut_node} | ${bd_id2}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if2}
+| | ... | ${bd_id2}
+| | And Configure VM for vhost L2BD forwarding | ${dut_node} | ${sock1}
+| | ... | ${sock2}
+| | Then Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if2}
diff --git a/tests/vpp/func/vm_vhost/l2bd/eth2p-eth-l2bdbasemacstc-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/l2bd/eth2p-eth-l2bdbasemacstc-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..22ec61d395
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/l2bd/eth2p-eth-l2bdbasemacstc-eth-2vhost-1vm-func.robot
@@ -0,0 +1,151 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_DOUBLE_LINK_TOPO | HW_ENV | VM_ENV | VPP_VM_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2 bridge-domain test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG=DUT=VM 3-node topology with VM
+| ... | and double parallel links.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of
+| ... | IPv4; Eth-IPv6-ICMPv6 for L2 switching of IPv6 use. Both apply
+| ... | to all links.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with two L2 bridge-domains
+| ... | (L2BD) switching combined with static MACs.
+| ... | *[Ver] TG verification:* Test ICMPv4 (or ICMPv6) Echo Request packets
+| ... | are sent in both directions by TG on links to DUT1 via VM; on
+| ... | receive TG verifies packets for correctness and their IPv4 (IPv6)
+| ... | src-addr, dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+
+*** Test Cases ***
+| TC01: DUT with two L2BDs (static MACs) switches ICMPv4 between TG and VM links
+| | [Documentation]
+| | ... | [Top] TG=DUT=VM. [Enc] Eth-IPv4-ICMPv4. [Cfg] On DUT1 configure \
+| | ... | two L2BDs with static MACs, each with vhost-user i/f to local VM
+| | ... | and i/f to TG; configure VM to loop pkts back betwen its two
+| | ... | virtio i/fs. [Ver] Make TG verify ICMPv4 Echo Req pkts are
+| | ... | switched thru DUT1 and VM in both directions and are correct on
+| | ... | receive. [Ref]
+| | ...
+| | [Teardown] | Run Keywords | Stop and clear QEMU | ${dut_node} | ${vm_node}
+| | ... | AND | Tear down functional test
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | When Configure vhost interfaces for L2BD forwarding | ${dut_node}
+| | ... | ${sock1} | ${sock2}
+| | And Create bridge domain | ${dut_node} | ${bd_id1}
+| | ... | learn=${FALSE}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if1} | ${bd_id1}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut_if1}
+| | ... | ${dut_node}
+| | ... | ${dut_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut_if2}
+| | ... | ${dut_node}
+| | ... | ${vhost_if1}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut_node} | ${bd_id2}
+| | ... | learn=${FALSE}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if2}
+| | ... | ${bd_id2}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut_if2}
+| | ... | ${dut_node}
+| | ... | ${dut_to_tg_if2}
+| | ... | ${bd_id2}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut_if1}
+| | ... | ${dut_node}
+| | ... | ${vhost_if2}
+| | ... | ${bd_id2}
+| | And Configure VM for vhost L2BD forwarding | ${dut_node} | ${sock1}
+| | ... | ${sock2}
+| | Then Send ICMPv4 bidirectionally and verify received packets
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+
+| TC02: DUT with two L2BDs (static MACs) switches ICMPv6 between TG and VM links
+| | [Documentation]
+| | ... | [Top] TG=DUT=VM. [Enc] Eth-IPv6-ICMPv6. [Cfg] On DUT1 configure \
+| | ... | two L2BDs with static MACs, each with vhost-user i/f to local VM
+| | ... | and i/f to TG; configure VM to loop pkts back betwen its two
+| | ... | virtio i/fs. [Ver] Make TG verify ICMPv6 Echo Req pkts are
+| | ... | switched thru DUT1 and VM in both directions and are correct on
+| | ... | receive. [Ref]
+| | ...
+| | [Teardown] | Run Keywords | Stop and clear QEMU | ${dut_node} | ${vm_node}
+| | ... | AND | Tear down functional test
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | When Configure vhost interfaces for L2BD forwarding | ${dut_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | And Create bridge domain | ${dut_node} | ${bd_id1}
+| | ... | learn=${FALSE}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if1}
+| | ... | ${bd_id1}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut_if1}
+| | ... | ${dut_node}
+| | ... | ${dut_to_tg_if1}
+| | ... | ${bd_id1}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut_if2}
+| | ... | ${dut_node}
+| | ... | ${vhost_if1}
+| | ... | ${bd_id1}
+| | And Create bridge domain | ${dut_node} | ${bd_id2}
+| | ... | learn=${FALSE}
+| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if2}
+| | ... | ${bd_id2}
+| | And Add interface to bridge domain | ${dut_node} | ${vhost_if2} | ${bd_id2}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut_if2}
+| | ... | ${dut_node}
+| | ... | ${dut_to_tg_if2}
+| | ... | ${bd_id2}
+| | And Add destination port to L2FIB | ${tg_node}
+| | ... | ${tg_to_dut_if1}
+| | ... | ${dut_node}
+| | ... | ${vhost_if2}
+| | ... | ${bd_id2}
+| | And Configure VM for vhost L2BD forwarding | ${dut_node} | ${sock1}
+| | ... | ${sock2}
+| | Then Send ICMPv6 bidirectionally and verify received packets
+| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2}
diff --git a/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4-l2bdbase-vhost-client-reconnect-2vm-func.robot b/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4-l2bdbase-vhost-client-reconnect-2vm-func.robot
new file mode 100644
index 0000000000..4609aa10d2
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4-l2bdbase-vhost-client-reconnect-2vm-func.robot
@@ -0,0 +1,231 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/overlay/vxlan.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO | VPP_VM_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Run Keywords
+| ... | resources.libraries.python.QemuUtils.Qemu Kill All | ${dut_node} | AND
+| ... | Tear down functional test
+| Documentation | *Vhost-User Interface Traffic Tests*
+| ... | *[Top] Network Topologies:* TG=DUT1 2-node topology with two links
+| ... | between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-VXLAN-ETH-IP on TG-DUT link.
+| ... | ETH-IP on VirtualEthernet-VM interface.
+| ... | *[Cfg] DUT configuration:* On DUT is running 2 VM with 2 vhost-user
+| ... | interface on each VM. DUT is configured with VXLAN and vhost-user
+| ... | interfaces in bridge-domain (L2BD).
+| ... | *[Cfg] VM configuration:* VM has both vhost-user interfaces added into
+| ... | Linux Bridge.
+| ... | *[Ver] TG verification:*
+| ... | VXLAN packet is send to DUT where is decapsulated and send bridged to
+| ... | vhost-user inteface. VM forwards frame to its second interface and VPP
+| ... | encapsulates it to another VXLAN tunnel. Packets
+| ... | are sent and received by TG on link to DUT.
+
+*** Variables ***
+| ${tg_if1_ip}= | 192.168.0.1
+| ${dut_if1_ip}= | 192.168.0.2
+| ${prefix_length}= | ${24}
+
+| ${sock_vm1_1}= | /tmp/sock1
+| ${sock_vm1_2}= | /tmp/sock2
+| ${sock_vm2_1}= | /tmp/sock3
+| ${sock_vm2_2}= | /tmp/sock4
+
+*** Test Cases ***
+| TC01: Qemu reconnects to VPPs vhost-user when Qemu is killed and restarted
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Set Interface Address | ${dut_node} | ${dut_to_tg_if1} | ${dut_if1_ip}
+| | ... | ${prefix_length}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${tg_if1_ip}
+| | ... | ${tg_to_dut_if1_mac}
+| | ${vxlan1}= | And Create VXLAN interface | ${dut_node} | ${101}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | ${vxlan2}= | And Create VXLAN interface | ${dut_node} | ${102}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | ${vxlan3}= | And Create VXLAN interface | ${dut_node} | ${103}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | ${vxlan4}= | And Create VXLAN interface | ${dut_node} | ${104}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | And Set Interface State | ${dut_node} | ${vxlan1} | up
+| | And Set Interface State | ${dut_node} | ${vxlan2} | up
+| | And Set Interface State | ${dut_node} | ${vxlan3} | up
+| | And Set Interface State | ${dut_node} | ${vxlan4} | up
+| | ${vhost_if1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut_node} | ${sock_vm1_1}
+| | ${vhost_if2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut_node} | ${sock_vm1_2}
+| | ${vhost_if3}= | And Vpp Create Vhost User Interface
+| | ... | ${dut_node} | ${sock_vm2_1}
+| | ${vhost_if4}= | And Vpp Create Vhost User Interface
+| | ... | ${dut_node} | ${sock_vm2_2}
+| | And Set Interface State | ${dut_node} | ${vhost_if1} | up
+| | And Set Interface State | ${dut_node} | ${vhost_if2} | up
+| | And Set Interface State | ${dut_node} | ${vhost_if3} | up
+| | And Set Interface State | ${dut_node} | ${vhost_if4} | up
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${101} | ${vxlan1}
+| | ... | ${vhost_if1}
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${102} | ${vxlan2}
+| | ... | ${vhost_if2}
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${103} | ${vxlan3}
+| | ... | ${vhost_if3}
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${104} | ${vxlan4}
+| | ... | ${vhost_if4}
+| | And Configure QEMU vhost and run it VM | ${dut_node} | ${sock_vm1_1}
+| | ... | ${sock_vm1_2} | ${1}
+| | And Configure QEMU vhost and run it VM | ${dut_node} | ${sock_vm2_1}
+| | ... | ${sock_vm2_2} | ${2}
+| | And Check traffic through VM
+| | When Run keyword | qemu-1.Qemu Kill
+| | ${vm1}= | And Run Keyword | qemu-1.Qemu Start
+| | ${vhost_int_1}= | And Get Vhost User If Name By Sock | ${vm1}
+| | ... | ${sock_vm1_1}
+| | ${vhost_int_2}= | And Get Vhost User If Name By Sock | ${vm1}
+| | ... | ${sock_vm1_2}
+| | And Linux Add Bridge | ${vm1} | br0 | ${vhost_int_1} | ${vhost_int_2}
+| | And Set Interface State | ${vm1} | ${vhost_int_1} | up | if_type=name
+| | And Set Interface State | ${vm1} | ${vhost_int_2} | up | if_type=name
+| | Then Check traffic through VM
+
+
+| TC02: VPP reconnects to Qemu vhost-user when Restart VPP and reconfigured
+| | [Tags] | EXPECTED_FAILING
+| | [Documentation]
+| | ... | *Failing:* Qemu doesn't support reconnect prior to version 2.7.
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And Set Interface Address | ${dut_node} | ${dut_to_tg_if1} | ${dut_if1_ip}
+| | ... | ${prefix_length}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${tg_if1_ip}
+| | ... | ${tg_to_dut_if1_mac}
+| | ${vxlan1}= | And Create VXLAN interface | ${dut_node} | ${101}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | ${vxlan2}= | And Create VXLAN interface | ${dut_node} | ${102}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | ${vxlan3}= | And Create VXLAN interface | ${dut_node} | ${103}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | ${vxlan4}= | And Create VXLAN interface | ${dut_node} | ${104}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | And Set Interface State | ${dut_node} | ${vxlan1} | up
+| | And Set Interface State | ${dut_node} | ${vxlan2} | up
+| | And Set Interface State | ${dut_node} | ${vxlan3} | up
+| | And Set Interface State | ${dut_node} | ${vxlan4} | up
+| | ${vhost_if1}= | And Vpp Create Vhost User Interface | ${dut_node}
+| | ... | ${sock_vm1_1}
+| | ${vhost_if2}= | And Vpp Create Vhost User Interface | ${dut_node}
+| | ... | ${sock_vm1_2}
+| | ${vhost_if3}= | And Vpp Create Vhost User Interface | ${dut_node}
+| | ... | ${sock_vm2_1}
+| | ${vhost_if4}= | And Vpp Create Vhost User Interface | ${dut_node}
+| | ... | ${sock_vm2_2}
+| | And Set Interface State | ${dut_node} | ${vhost_if1} | up
+| | And Set Interface State | ${dut_node} | ${vhost_if2} | up
+| | And Set Interface State | ${dut_node} | ${vhost_if3} | up
+| | And Set Interface State | ${dut_node} | ${vhost_if4} | up
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${101} | ${vxlan1}
+| | ... | ${vhost_if1}
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${102} | ${vxlan2}
+| | ... | ${vhost_if2}
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${103} | ${vxlan3}
+| | ... | ${vhost_if3}
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${104} | ${vxlan4}
+| | ... | ${vhost_if4}
+| | And Configure QEMU vhost and run it VM | ${dut_node} | ${sock_vm1_1}
+| | ... | ${sock_vm1_2} | ${1}
+| | And Configure QEMU vhost and run it VM | ${dut_node} | ${sock_vm2_1}
+| | ... | ${sock_vm2_2} | ${2}
+| | And Check traffic through VM
+| | And Verify VPP PID in Teardown
+| | When Setup All Duts | ${nodes}
+| | And Save VPP PIDs
+| | And Set interfaces in 2-node circular topology up
+| | And Set Interface Address | ${dut_node} | ${dut_to_tg_if1} | ${dut_if1_ip}
+| | ... | ${prefix_length}
+| | And Add IP Neighbor | ${dut_node} | ${dut_to_tg_if1} | ${tg_if1_ip}
+| | ... | ${tg_to_dut_if1_mac}
+| | ${vxlan1}= | And Create VXLAN interface | ${dut_node} | ${101}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | ${vxlan2}= | And Create VXLAN interface | ${dut_node} | ${102}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | ${vxlan3}= | And Create VXLAN interface | ${dut_node} | ${103}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | ${vxlan4}= | And Create VXLAN interface | ${dut_node} | ${104}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip}
+| | And Set Interface State | ${dut_node} | ${vxlan1} | up
+| | And Set Interface State | ${dut_node} | ${vxlan2} | up
+| | And Set Interface State | ${dut_node} | ${vxlan3} | up
+| | And Set Interface State | ${dut_node} | ${vxlan4} | up
+| | ${vhost_if1}= | And Vpp Create Vhost User Interface | ${dut_node}
+| | ... | ${sock_vm1_1}
+| | ${vhost_if2}= | And Vpp Create Vhost User Interface | ${dut_node}
+| | ... | ${sock_vm1_2}
+| | ${vhost_if3}= | And Vpp Create Vhost User Interface | ${dut_node}
+| | ... | ${sock_vm2_1}
+| | ${vhost_if4}= | And Vpp Create Vhost User Interface | ${dut_node}
+| | ... | ${sock_vm2_2}
+| | And Set Interface State | ${dut_node} | ${vhost_if1} | up
+| | And Set Interface State | ${dut_node} | ${vhost_if2} | up
+| | And Set Interface State | ${dut_node} | ${vhost_if3} | up
+| | And Set Interface State | ${dut_node} | ${vhost_if4} | up
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${101} | ${vxlan1}
+| | ... | ${vhost_if1}
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${102} | ${vxlan2}
+| | ... | ${vhost_if2}
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${103} | ${vxlan3}
+| | ... | ${vhost_if3}
+| | And Vpp Add L2 Bridge Domain | ${dut_node} | ${104} | ${vxlan4}
+| | ... | ${vhost_if4}
+| | Then Check traffic through VM
+
+
+*** Keywords ***
+| Configure QEMU vhost and run it VM
+| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${qemu_id}
+| | Import Library | resources.libraries.python.QemuUtils | qemu_id=${qemu_id}
+| | ... | WITH NAME | qemu-${qemu_id}
+| | ${q_add_vhost}= | Replace Variables | qemu-${qemu_id}.Qemu Add Vhost User If
+| | ${q_set_node}= | Replace Variables | qemu-${qemu_id}.Qemu Set Node
+| | ${q_start}= | Replace Variables | qemu-${qemu_id}.Qemu Start
+| | Run keyword | ${q_set_node} | ${dut_node}
+| | Run keyword | ${q_add_vhost} | ${sock1}
+| | Run keyword | ${q_add_vhost} | ${sock2}
+| | ${vm}= | Run keyword | ${q_start}
+| | ${vhost1}= | Get Vhost User If Name By Sock | ${vm} | ${sock1}
+| | ${vhost2}= | Get Vhost User If Name By Sock | ${vm} | ${sock2}
+| | Linux Add Bridge | ${vm} | br0 | ${vhost1} | ${vhost2}
+| | Set Interface State | ${vm} | ${vhost1} | up | if_type=name
+| | Set Interface State | ${vm} | ${vhost2} | up | if_type=name
+| | Set Test Variable | ${qemu-${qemu_id}} | ${vm}
+
+| Check traffic through VM
+| | [Documentation] | Send VXLAN traffic through both configured VMs.
+| | Send VXLAN encapsulated packet and verify received packet | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_if1_ip} | ${dut_if1_ip} | ${101}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip} | ${102}
+| | Send VXLAN encapsulated packet and verify received packet | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
+| | ... | ${tg_if1_ip} | ${dut_if1_ip} | ${103}
+| | ... | ${dut_if1_ip} | ${tg_if1_ip} | ${104}
diff --git a/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4vxlan-l2bdbasemaclrn--eth-4vhost-2vm-fds-tenant-nets-func.robot b/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4vxlan-l2bdbasemaclrn--eth-4vhost-2vm-fds-tenant-nets-func.robot
new file mode 100644
index 0000000000..e58e6ed7c2
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4vxlan-l2bdbasemaclrn--eth-4vhost-2vm-fds-tenant-nets-func.robot
@@ -0,0 +1,333 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/vm/double_qemu_setup.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/fds/default.robot
+| Library | resources.libraries.python.Trace
+| ...
+| Force Tags | HW_ENV | VM_ENV | SKIP_PATCH
+| ...
+| Test Setup | Set up FDS functional test | ${nodes}
+| ...
+| Test Teardown | Tear down FDS functional test | ${nodes}
+| ... | ${dut1_node} | ${qemu_node1} | ${dut2_node} | ${qemu_node2}
+| ...
+| Documentation | *Tenant network FDS related.*
+| ...
+| ... | Test suite uses 3-node topology TG - DUT1 - DUT2 - TG
+| ... | with one link between nodes. Test packets are sent in both directions
+| ... | between namespaces in DUT1 and DUT2 with both positive and negative
+| ... | scenarios tested.
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${shg1}= | 3
+| ${shg2}= | 4
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+| ${sock3}= | /tmp/sock3
+| ${sock4}= | /tmp/sock4
+
+| ${vni_blue}= | 23
+| ${vni_red}= | 24
+
+| ${bid_b}= | 23
+| ${bid_r}= | 24
+
+| ${dut1_if_ip}= | 16.0.0.1
+| ${dut2_if_ip}= | 16.0.0.2
+
+| ${dut1_blue1}= | 16.0.10.1
+| ${dut1_blue2}= | 16.0.10.2
+| ${dut1_red1}= | 16.0.10.3
+| ${dut1_red2}= | 16.0.10.4
+
+| ${dut2_blue1}= | 16.0.20.1
+| ${dut2_blue2}= | 16.0.20.2
+| ${dut2_red1}= | 16.0.20.3
+| ${dut2_red2}= | 16.0.20.4
+
+| ${namespace1}= | nmspace1
+| ${namespace2}= | nmspace2
+| ${namespace3}= | nmspace3
+| ${namespace4}= | nmspace4
+
+| ${prefix_length}= | 16
+
+*** Test Cases ***
+| L2 test cases with tenant networks (VXLAN)
+| | [Documentation] | Ping among all ports inside the same network should pass.
+| | ... | a) test l2 connectivity inside every network
+| | ... | b) test l2 connectivity between networks
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO | VPP_VM_ENV
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if_ip} | ${prefix_length}
+| | And Set Interface Address
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_if_ip} | ${prefix_length}
+| | And Set Interface State | ${dut1_node} | ${dut1_to_dut2} | up
+| | And Set Interface State | ${dut2_node} | ${dut2_to_dut1} | up
+| | ${vhost_if1_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock1}
+| | ${vhost_if2_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock2}
+| | ${vhost_if3_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock3}
+| | ${vhost_if4_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock4}
+| | ${dut1_vhosts}= | And Create List | ${vhost_if1_DUT1} | ${vhost_if2_DUT1}
+| | ... | ${vhost_if3_DUT1} | ${vhost_if4_DUT1}
+| | ${vhost_if1_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock1}
+| | ${vhost_if2_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock2}
+| | ${vhost_if3_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock3}
+| | ${vhost_if4_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock4}
+| | ${dut2_vhosts}= | And Create List | ${vhost_if1_DUT2} | ${vhost_if2_DUT2}
+| | ... | ${vhost_if3_DUT2} | ${vhost_if4_DUT2}
+| | When Configure QEMU vhost and run it | ${dut1_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | ... | ${sock3}
+| | ... | ${sock4}
+| | ... | ${dut1_blue1}
+| | ... | ${dut1_blue2}
+| | ... | ${dut1_red1}
+| | ... | ${dut1_red2}
+| | ... | ${prefix_length}
+| | ... | qemu_node1
+| | ... | 04
+| | And Configure QEMU vhost and run it | ${dut2_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | ... | ${sock3}
+| | ... | ${sock4}
+| | ... | ${dut2_blue1}
+| | ... | ${dut2_blue2}
+| | ... | ${dut2_red1}
+| | ... | ${dut2_red2}
+| | ... | ${prefix_length}
+| | ... | qemu_node2
+| | ... | 06
+| | And Setup VXLAN and BD on Dut | ${dut1_node} | ${dut1_if_ip} | ${dut2_if_ip}
+| | ... | @{dut1_vhosts}
+| | And Setup VXLAN and BD on Dut | ${dut2_node} | ${dut2_if_ip} | ${dut1_if_ip}
+| | ... | @{dut2_vhosts}
+| | Then Positive Scenario Ping From DUT1 - Intra network
+| | And Positive Scenario Ping From DUT1 - Inter network
+| | And Positive Scenario Ping From DUT2 - Intra network
+| | And Positive Scenario Ping From DUT2 - Inter network
+| | And Negative Scenario Ping From DUT1 - Intra network
+| | And Negative Scenario Ping From DUT1 - Inter network
+| | And Negative Scenario Ping From DUT2 - Intra network
+| | And Negative Scenario Ping From DUT2 - Inter network
+
+*** Keywords ***
+| Setup VXLAN and BD on Dut
+| | [Documentation] | Setup VXLAN and bridge domain on specific DUT and
+| | ... | subsequently interconnect them properly.
+| | ...
+| | ... | *Arguments:*
+| | ... | - dut_node - Node where to setup vxlan and BD. Type: dict
+| | ... | - src_ip - Source IP for VXLAN. Type: string
+| | ... | - dst_ip - Destination IP for vxlan. Type: string
+| | ... | - vhosts - List containing vhost interfaces.
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Setup VXLAN and BD on Dut \| ${dut_node} \| 16.0.0.1 \| 16.0.0.1 \
+| | ... | \| @{vhosts} \|
+| | ...
+| | [Arguments] | ${dut_node} | ${src_ip} | ${dst_ip} | @{vhosts}
+| | Create bridge domain
+| | ... | ${dut_node} | ${bid_b} | learn=${TRUE}
+| | Create bridge domain
+| | ... | ${dut_node} | ${bid_r} | learn=${TRUE}
+| | ${vxlan1_if}= | Create VXLAN interface | ${dut_node} | ${vni_blue}
+| | ... | ${src_ip} | ${dst_ip}
+| | ${vxlan2_if}= | Create VXLAN interface | ${dut_node} | ${vni_red}
+| | ... | ${src_ip} | ${dst_ip}
+| | Add interface to bridge domain
+| | ... | ${dut_node} | ${vxlan1_if} | ${bid_b} | 0
+| | Add interface to bridge domain
+| | ... | ${dut_node} | @{vhosts}[0] | ${bid_b} | 0
+| | Add interface to bridge domain
+| | ... | ${dut_node} | @{vhosts}[1] | ${bid_b} | 0
+| | Add interface to bridge domain
+| | ... | ${dut_node} | ${vxlan2_if} | ${bid_r} | 0
+| | Add interface to bridge domain
+| | ... | ${dut_node} | @{vhosts}[2] | ${bid_r} | 0
+| | Add interface to bridge domain
+| | ... | ${dut_node} | @{vhosts}[3] | ${bid_r} | 0
+
+| Positive Scenario Ping From DUT1 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1} | ${namespace4}
+
+| Positive Scenario Ping From DUT1 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1} | ${namespace4}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2} | ${namespace4}
+
+| Positive Scenario Ping From DUT2 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1} | ${namespace4}
+
+| Positive Scenario Ping From DUT2 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1} | ${namespace4}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2} | ${namespace4}
+
+| Negative Scenario Ping From DUT1 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2}
+| | ... | ${namespace4}
+
+| Negative Scenario Ping From DUT1 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2}
+| | ... | ${namespace4}
+
+| Negative Scenario Ping From DUT2 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2}
+| | ... | ${namespace4}
+
+| Negative Scenario Ping From DUT2 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ... | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2}
+| | ... | ${namespace4}
diff --git a/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..d6f4e57143
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot
@@ -0,0 +1,116 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/overlay/vxlan.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/vm/double_qemu_setup.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | HW_ENV | VPP_VM_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Run Keywords | Tear down functional test
+| ... | AND | Run keyword | Tear down QEMU | ${dut1_node}
+| ... | ${${qemu1}} | ${qemu1}
+| ... | AND | Run keyword | Tear down QEMU | ${dut2_node}
+| ... | ${${qemu2}} | ${qemu2}
+| Documentation | *L2BD with VM combined with VXLAN test cases - IPv4*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-IPv4-VXLAN-Eth-IPv4-ICMPv4 on
+| ... | DUT1-DUT2, Eth-IPv4-ICMPv4 on TG-DUTn for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) switching combined with MAC learning enabled;
+| ... | VXLAN tunnels are configured between L2BDs on DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent
+| ... | in both directions by TG on links to DUT1 and DUT2; on receive TG
+| ... | verifies packets for correctness and their IPv4 src-addr, dst-addr
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC7348.
+
+*** Variables ***
+| ${vni_1}= | 23
+
+| ${bd_id1}= | 10
+| ${bd_id2}= | 20
+
+| ${ip4_addr1}= | 172.16.0.1
+| ${ip4_addr2}= | 172.16.0.2
+| ${ip4_prefix}= | 24
+
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+
+| ${qemu1}= | qemu_instance_1
+| ${qemu2}= | qemu_instance_2
+
+| ${dut1_vhost1}= | dut1_vhost_if1
+| ${dut1_vhost2}= | dut1_vhost_if2
+| ${dut2_vhost1}= | dut2_vhost_if1
+| ${dut2_vhost2}= | dut2_vhost_if2
+
+*** Test Cases ***
+| TC01:DUT1 and DUT2 with two L2BDs and VXLANoIPv4 tunnel switch ICMPv4 between TG links and VM links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-VM-DUT1-DUT2-VM-DUT2-TG.
+| | ... | [Enc] Eth-IPv4-VXLAN-Eth-IPv4-ICMPv4 on DUT1-DUT2; Eth-IPv4-ICMPv4
+| | ... | on TG-DUTn and DUTn=VM.
+| | ... | [Cfg] On both DUTs configure two L2BDs (MAC learning enabled); first
+| | ... | L2BD with untagged interface to TG and vhost-user interface to local
+| | ... | VM, second one with vhost-user interface to local VM and VXLAN
+| | ... | interface towards the other DUT. Configure linux bridge on both VMs
+| | ... | to pass traffic between both vhost-user interfaces.
+| | ... | [Ver] Make TG send ICMPv4 Echo Req between two of its interfaces to
+| | ... | be switched by DUT1 and DUT2; verify packets are switched between
+| | ... | these TG interfaces.
+| | ... | [Ref] RFC7348.
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | When Configure vhost interfaces for L2BD forwarding | ${dut1_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | ... | ${dut1_vhost1}
+| | ... | ${dut1_vhost2}
+| | And Configure vhost interfaces for L2BD forwarding | ${dut2_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | ... | ${dut2_vhost1}
+| | ... | ${dut2_vhost2}
+| | And Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1}
+| | ... | ${sock2} | ${qemu1}
+| | And Configure VM for vhost L2BD forwarding | ${dut2_node} | ${sock1}
+| | ... | ${sock2} | ${qemu2}
+| | And Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${ip4_addr1}
+| | ... | ${ip4_prefix}
+| | And Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${ip4_addr2}
+| | ... | ${ip4_prefix}
+| | And VPP IP Probe | ${dut1_node} | ${dut1_to_dut2} | ${ip4_addr2}
+| | And VPP IP Probe | ${dut2_node} | ${dut2_to_dut1} | ${ip4_addr1}
+| | ${dut1s_vxlan}= | And Create VXLAN interface | ${dut1_node} | ${vni_1}
+| | | ... | ${ip4_addr1} | ${ip4_addr2}
+| | ${dut2s_vxlan}= | And Create VXLAN interface | ${dut2_node} | ${vni_1}
+| | | ... | ${ip4_addr2} | ${ip4_addr1}
+| | And Add interfaces to L2BD | ${dut1_node} | ${bd_id1}
+| | ... | ${dut1_to_tg} | ${${dut1_vhost1}}
+| | And Add interfaces to L2BD | ${dut1_node} | ${bd_id2}
+| | ... | ${dut1s_vxlan} | ${${dut1_vhost2}}
+| | And Add interfaces to L2BD | ${dut2_node} | ${bd_id1}
+| | ... | ${dut2_to_tg} | ${${dut2_vhost1}}
+| | And Add interfaces to L2BD | ${dut2_node} | ${bd_id2}
+| | ... | ${dut2s_vxlan} | ${${dut2_vhost2}}
+| | Then Send ICMPv4 bidirectionally and verify received packets
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
diff --git a/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip6vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip6vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..cde7bd8aff
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/l2bd/eth2p-ethip6vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot
@@ -0,0 +1,119 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/overlay/vxlan.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/vm/double_qemu_setup.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.IPv6Setup
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | VM_ENV | HW_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Run Keywords | Tear down functional test
+| ... | AND | Run keyword | Tear down QEMU | ${dut1_node}
+| ... | ${${qemu1}} | ${qemu1}
+| ... | AND | Run keyword | Tear down QEMU | ${dut2_node}
+| ... | ${${qemu2}} | ${qemu2}
+| Documentation | *L2BD with VM combined with VXLAN test cases - IPv6*
+| ...
+| ... | *[Top] Network topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet encapsulations:* Eth-IPv6-VXLAN-Eth-IPv6-ICMPv6 on
+| ... | DUT1-DUT2, Eth-IPv6-ICMPv6 on TG-DUTn for L2 switching of IPv6.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2
+| ... | bridge-domain (L2BD) switching combined with MAC learning enabled;
+| ... | VXLAN tunnels are configured between L2BDs on DUT1 and DUT2.
+| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets are sent
+| ... | in both directions by TG on links to DUT1 and DUT2; on receive TG
+| ... | verifies packets for correctness and their IPv6 src-addr, dst-addr
+| ... | and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:* RFC7348.
+
+*** Variables ***
+| ${vni_1}= | 23
+
+| ${bd_id1}= | 10
+| ${bd_id2}= | 20
+
+| ${ip6_addr1}= | 3ffe:64::1
+| ${ip6_addr2}= | 3ffe:64::2
+| ${ip6_prefix}= | 64
+
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+
+| ${qemu1}= | qemu_instance_1
+| ${qemu2}= | qemu_instance_2
+
+| ${dut1_vhost1}= | dut1_vhost_if1
+| ${dut1_vhost2}= | dut1_vhost_if2
+| ${dut2_vhost1}= | dut2_vhost_if1
+| ${dut2_vhost2}= | dut2_vhost_if2
+
+*** Test Cases ***
+| TC01:DUT1 and DUT2 with two L2BDs and VXLANoIPv6 tunnel switch ICMPv6 between TG links and VM links
+| | [Documentation]
+| | ... | [Top] TG-DUT1-VM-DUT1-DUT2-VM-DUT2-TG.
+| | ... | [Enc] Eth-IPv6-VXLAN-Eth-IPv6-ICMPv6 on DUT1-DUT2; Eth-IPv4-ICMPv4
+| | ... | on TG-DUTn and DUTn=VM.
+| | ... | [Cfg] On both DUTs configure two L2BDs (MAC learning enabled); first
+| | ... | L2BD with untagged interface to TG and vhost-user interface to local
+| | ... | VM, second one with vhost-user interface to local VM and VXLAN
+| | ... | interface towards the other DUT. Configure linux bridge on both VMs
+| | ... | to pass traffic between both vhost-user interfaces.
+| | ... | [Ver] Make TG send ICMPv6 Echo Req between two of its interfaces to
+| | ... | be switched by DUT1 and DUT2; verify packets are switched between
+| | ... | these TG interfaces.
+| | ... | [Ref] RFC7348.
+| | [Tags] | VPP_VM_ENV
+| | Given Configure path in 3-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set interfaces in 3-node circular topology up
+| | When Configure vhost interfaces for L2BD forwarding | ${dut1_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | ... | ${dut1_vhost1}
+| | ... | ${dut1_vhost2}
+| | And Configure vhost interfaces for L2BD forwarding | ${dut2_node}
+| | ... | ${sock1}
+| | ... | ${sock2}
+| | ... | ${dut2_vhost1}
+| | ... | ${dut2_vhost2}
+| | And Configure VM for vhost L2BD forwarding | ${dut1_node} | ${sock1}
+| | ... | ${sock2} | ${qemu1}
+| | And Configure VM for vhost L2BD forwarding | ${dut2_node} | ${sock1}
+| | ... | ${sock2} | ${qemu2}
+| | And Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${ip6_addr1}
+| | ... | ${ip6_prefix}
+| | And Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${ip6_addr2}
+| | ... | ${ip6_prefix}
+| | And VPP IP Probe | ${dut1_node} | ${dut1_to_dut2} | ${ip6_addr2}
+| | And VPP IP Probe | ${dut2_node} | ${dut2_to_dut1} | ${ip6_addr1}
+| | And Vpp All RA Suppress Link Layer | ${nodes}
+| | ${dut1s_vxlan}= | And Create VXLAN interface | ${dut1_node} | ${vni_1}
+| | | ... | ${ip6_addr1} | ${ip6_addr2}
+| | ${dut2s_vxlan}= | And Create VXLAN interface | ${dut2_node} | ${vni_1}
+| | | ... | ${ip6_addr2} | ${ip6_addr1}
+| | And Add interfaces to L2BD | ${dut1_node} | ${bd_id1}
+| | ... | ${dut1_to_tg} | ${${dut1_vhost1}}
+| | And Add interfaces to L2BD | ${dut1_node} | ${bd_id2}
+| | ... | ${dut1s_vxlan} | ${${dut1_vhost2}}
+| | And Add interfaces to L2BD | ${dut2_node} | ${bd_id1}
+| | ... | ${dut2_to_tg} | ${${dut2_vhost1}}
+| | And Add interfaces to L2BD | ${dut2_node} | ${bd_id2}
+| | ... | ${dut2s_vxlan} | ${${dut2_vhost2}}
+| | Then Send ICMPv6 bidirectionally and verify received packets
+| | ... | ${tg_node} | ${tg_to_dut1} | ${tg_to_dut2}
diff --git a/tests/vpp/func/vm_vhost/l2xc/eth2p-eth-l2xcbase-eth-2vhost-1vm-func.robot b/tests/vpp/func/vm_vhost/l2xc/eth2p-eth-l2xcbase-eth-2vhost-1vm-func.robot
new file mode 100644
index 0000000000..759d7cba23
--- /dev/null
+++ b/tests/vpp/func/vm_vhost/l2xc/eth2p-eth-l2xcbase-eth-2vhost-1vm-func.robot
@@ -0,0 +1,93 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Resource | resources/libraries/robot/l2/l2_traffic.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/vm/qemu.robot
+| Library | resources.libraries.python.Trace
+| Library | resources.libraries.python.NodePath
+| Force Tags | 3_NODE_DOUBLE_LINK_TOPO | HW_ENV | VM_ENV | VPP_VM_ENV
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *L2 cross-connect test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG=DUT=VM 3-node topology with VM and
+| ... | double parallel links.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of IPv4;
+| ... | Eth-IPv6-ICMPv6 for L2 switching of IPv6 use. Both apply to all links.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with L2 cross-connect
+| ... | (L2XC) switching.
+| ... | *[Ver] TG verification:* Test ICMPv4 (or ICMPv6) Echo Request packets are
+| ... | sent in both directions by TG on links to DUT1 via VM; on receive TG
+| ... | verifies packets for correctness and their IPv4 (IPv6) src-addr,
+| ... | dst-addr and MAC addresses.
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+
+*** Test Cases ***
+| TC01: DUT with two L2XCs switches ICMPv4 between TG and local VM links
+| | [Documentation]
+| | ... | [Top] TG=DUT=VM. [Enc] Eth-IPv4-ICMPv4. [Cfg] On DUT configure \
+| | ... | two L2 cross-connects (L2XC), each with one untagged interface
+| | ... | to TG and untagged i/f to local VM over vhost-user. [Ver] Make
+| | ... | TG send ICMPv4 Echo Reqs in both directions between two of its
+| | ... | i/fs to be switched by DUT to and from VM; verify all packets
+| | ... | are received. [Ref]
+| | ...
+| | [Teardown] | Run Keywords | Stop and clear QEMU | ${dut_node} | ${vm_node}
+| | ... | AND | Tear down functional test
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | When Configure vhost interfaces for L2BD forwarding | ${dut_node}
+| | ... | ${sock1} | ${sock2}
+| | And Configure L2XC | ${dut_node} | ${dut_to_tg_if1} | ${vhost_if1}
+| | And Configure L2XC | ${dut_node} | ${dut_to_tg_if2} | ${vhost_if2}
+| | And Configure VM for vhost L2BD forwarding | ${dut_node} | ${sock1}
+| | ... | ${sock2}
+| | Then Send ICMPv4 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+
+| TC02: DUT with two L2XCs switches ICMPv6 between TG and local VM links
+| | [Documentation]
+| | ... | [Top] TG=DUT=VM. [Enc] Eth-IPv6-ICMPv6. [Cfg] On DUT configure \
+| | ... | two L2 cross-connects (L2XC), each with one untagged i/f to TG
+| | ... | and untagged i/f to local VM over vhost-user. [Ver] Make TG send
+| | ... | ICMPv6 Echo Reqs in both directions between two of its i/fs to
+| | ... | be switched by DUT to and from VM; verify all packets are
+| | ... | received. [Ref]
+| | ...
+| | [Teardown] | Run Keywords | Stop and clear QEMU | ${dut_node} | ${vm_node}
+| | ... | AND | Tear down functional test
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | When Configure vhost interfaces for L2BD forwarding | ${dut_node}
+| | ... | ${sock1} | ${sock2}
+| | And Configure L2XC | ${dut_node} | ${dut_to_tg_if1} | ${vhost_if1}
+| | And Configure L2XC | ${dut_node} | ${dut_to_tg_if2} | ${vhost_if2}
+| | And Configure VM for vhost L2BD forwarding | ${dut_node} | ${sock1}
+| | ... | ${sock2}
+| | Then Send ICMPv6 bidirectionally and verify received packets | ${tg_node}
+| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if2}
+
diff --git a/tests/vpp/perf/__init__.robot b/tests/vpp/perf/__init__.robot
new file mode 100644
index 0000000000..0dfc31f07e
--- /dev/null
+++ b/tests/vpp/perf/__init__.robot
@@ -0,0 +1,45 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
+| Library | resources.libraries.python.SetupFramework
+| Library | resources.libraries.python.CpuUtils
+| Suite Setup | Run Keywords | Setup performance global Variables
+| ... | AND | Setup Framework | ${nodes}
+| ... | AND | Setup All DUTs | ${nodes}
+| ... | AND | Get CPU Layout from all nodes | ${nodes}
+| ... | AND | Update All Interface Data On All Nodes
+| ... | ${nodes} | skip_tg=${True} | numa_node=${True}
+
+*** Keywords ***
+| Setup performance global Variables
+| | [Documentation]
+| | ... | Setup suite Variables. Variables are used across performance testing.
+| | ...
+| | ... | _NOTE:_ This KW sets following suite variables:
+| | ... | - perf_trial_duration - Duration of traffic run [s]
+| | ... | - perf_pdr_loss_acceptance - Loss acceptance treshold
+| | ... | - perf_pdr_loss_acceptance_type - Loss acceptance treshold type
+| | ... | - perf_vm_image - Guest VM disk image
+| | ... | - perf_qemu_bin - Path to QEMU binary
+| | ... | - perf_qemu_qsz - QEMU virtio queue size
+| | ...
+| | Set Global Variable | ${perf_trial_duration} | 10
+| | Set Global Variable | ${perf_pdr_loss_acceptance} | 0.5
+| | Set Global Variable | ${perf_pdr_loss_acceptance_type} | percentage
+| | Set Global Variable | ${perf_vm_image} | /var/lib/vm/csit-nested-1.6.img
+| | Set Global Variable | ${perf_qemu_bin}
+| | ... | /opt/qemu-2.5.0/bin/qemu-system-x86_64
+| | Set Global Variable | ${perf_qemu_qsz} | 1024
diff --git a/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrpdrdisc.robot b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..86670fecc6
--- /dev/null
+++ b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrpdrdisc.robot
@@ -0,0 +1,337 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | IP4FWD | IPSEC | IPSECHW | IPSECTUN | NIC_Intel-XL710 | BASE
+| ...
+| Suite Setup | Set up IPSec performance test suite | L3 | Intel-XL710
+| ...
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *IPv4 IPsec tunnel mode performance test suite.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 on TG-DUTn,
+| ... | Eth-IPv4-IPSec on DUT1-DUT2
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with multiple
+| ... | IPsec tunnels between them. DUTs get IPv4 traffic from TG, encrypt it
+| ... | and send to another DUT, where packets are decrypted and sent back to TG
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in number
+| ... | of packets transmitted. NDR is discovered for different
+| ... | number of IPsec tunnels using binary search algorithms with configured
+| ... | starting rate and final step that determines throughput measurement
+| ... | resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, number of flows per flow-group equals to
+| ... | number of IPSec tunnels) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC4303 and RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+| ${tg_if1_ip4}= | 192.168.10.2
+| ${dut1_if1_ip4}= | 192.168.10.1
+| ${dut1_if2_ip4}= | 172.168.1.1
+| ${dut2_if1_ip4}= | 172.168.1.2
+| ${dut2_if2_ip4}= | 192.168.20.1
+| ${tg_if2_ip4}= | 192.168.20.2
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${32}
+| ${ipsec_overhead_gcm}= | ${54}
+| ${n_tunnels}= | ${1}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${framesize + ${ipsec_overhead_gcm}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${framesize + ${ipsec_overhead_gcm}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${imix_size} + ${ipsec_overhead_gcm}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${imix_size} + ${ipsec_overhead_gcm}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot
new file mode 100644
index 0000000000..c78d3ca67d
--- /dev/null
+++ b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot
@@ -0,0 +1,333 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | IP4FWD | IPSEC | IPSECHW | IPSECTUN | NIC_Intel-XL710 | BASE
+| ...
+| Suite Setup | Set up IPSec performance test suite | L3 | Intel-XL710
+| ...
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *IPv4 IPsec tunnel mode performance test suite.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 on TG-DUTn,
+| ... | Eth-IPv4-IPSec on DUT1-DUT2
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with multiple
+| ... | IPsec tunnels between them. DUTs get IPv4 traffic from TG, encrypt it
+| ... | and send to another DUT, where packets are decrypted and sent back to TG
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in number
+| ... | of packets transmitted. NDR is discovered for different
+| ... | number of IPsec tunnels using binary search algorithms with configured
+| ... | starting rate and final step that determines throughput measurement
+| ... | resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, number of flows per flow-group equals to
+| ... | number of IPSec tunnels) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC4303 and RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+| ${tg_if1_ip4}= | 192.168.10.2
+| ${dut1_if1_ip4}= | 192.168.10.1
+| ${dut1_if2_ip4}= | 172.168.1.1
+| ${dut2_if1_ip4}= | 172.168.1.2
+| ${dut2_if2_ip4}= | 192.168.20.1
+| ${tg_if2_ip4}= | 192.168.20.2
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${32}
+| ${ipsec_overhead}= | ${58}
+| ${n_tunnels}= | ${1}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..85ddc9f663
--- /dev/null
+++ b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot
@@ -0,0 +1,361 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | IP4FWD | IPSEC | IPSECHW | IPSECTUN | NIC_Intel-XL710 | BASE
+| ...
+| Suite Setup | Set up IPSec performance test suite | L3 | Intel-XL710
+| ...
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *IPv4 IPsec tunnel mode performance test suite.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 on TG-DUTn,
+| ... | Eth-IPv4-IPSec on DUT1-DUT2
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with multiple
+| ... | IPsec tunnels between them. DUTs get IPv4 traffic from TG, encrypt it
+| ... | and send to another DUT, where packets are decrypted and sent back to TG
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in number
+| ... | of packets transmitted. NDR is discovered for different
+| ... | number of IPsec tunnels using binary search algorithms with configured
+| ... | starting rate and final step that determines throughput measurement
+| ... | resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, number of flows per flow-group equals to
+| ... | number of IPSec tunnels) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC4303 and RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+| ${tg_if1_ip4}= | 192.168.10.2
+| ${dut1_if1_ip4}= | 192.168.10.1
+| ${dut1_if2_ip4}= | 172.168.1.1
+| ${dut2_if1_ip4}= | 172.168.1.2
+| ${dut2_if2_ip4}= | 192.168.20.1
+| ${tg_if2_ip4}= | 192.168.20.2
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${32}
+| ${ipsec_overhead_gcm}= | ${54}
+| ${n_tunnels}= | ${1}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${framesize + ${ipsec_overhead_gcm}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${framesize + ${ipsec_overhead_gcm}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${imix_size} + ${ipsec_overhead_gcm}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${imix_size} + ${ipsec_overhead_gcm}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel AES GCM in each direction, configured\
+| | ... | with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot
new file mode 100644
index 0000000000..1002f53e5d
--- /dev/null
+++ b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot
@@ -0,0 +1,357 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | IP4FWD | IPSEC | IPSECHW | IPSECTUN | NIC_Intel-XL710 | BASE
+| ...
+| Suite Setup | Set up IPSec performance test suite | L3 | Intel-XL710
+| ...
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *IPv4 IPsec tunnel mode performance test suite.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 on TG-DUTn,
+| ... | Eth-IPv4-IPSec on DUT1-DUT2
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with multiple
+| ... | IPsec tunnels between them. DUTs get IPv4 traffic from TG, encrypt it
+| ... | and send to another DUT, where packets are decrypted and sent back to TG
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in number
+| ... | of packets transmitted. NDR is discovered for different
+| ... | number of IPsec tunnels using binary search algorithms with configured
+| ... | starting rate and final step that determines throughput measurement
+| ... | resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, number of flows per flow-group equals to
+| ... | number of IPSec tunnels) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC4303 and RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+| ${tg_if1_ip4}= | 192.168.10.2
+| ${dut1_if1_ip4}= | 192.168.10.1
+| ${dut1_if2_ip4}= | 172.168.1.1
+| ${dut2_if1_ip4}= | 172.168.1.2
+| ${dut2_if2_ip4}= | 192.168.20.1
+| ${tg_if2_ip4}= | 192.168.20.2
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${32}
+| ${ipsec_overhead}= | ${58}
+| ${n_tunnels}= | ${1}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\
+| | ... | with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrpdrdisc.robot b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..ac8f8603b9
--- /dev/null
+++ b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrpdrdisc.robot
@@ -0,0 +1,337 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | SCALE | NDRPDRDISC
+| ... | IP4FWD | IPSEC | IPSECHW | IPSECTUN | NIC_Intel-XL710 | TNL_1000
+| ...
+| Suite Setup | Set up IPSec performance test suite | L3 | Intel-XL710
+| ...
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *IPv4 IPsec tunnel mode performance test suite.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 on TG-DUTn,
+| ... | Eth-IPv4-IPSec on DUT1-DUT2
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with multiple
+| ... | IPsec tunnels between them. DUTs get IPv4 traffic from TG, encrypt it
+| ... | and send to another DUT, where packets are decrypted and sent back to TG
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in number
+| ... | of packets transmitted. NDR is discovered for different
+| ... | number of IPsec tunnels using binary search algorithms with configured
+| ... | starting rate and final step that determines throughput measurement
+| ... | resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, number of flows per flow-group equals to
+| ... | number of IPSec tunnels) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC4303 and RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+| ${tg_if1_ip4}= | 192.168.10.2
+| ${dut1_if1_ip4}= | 192.168.10.1
+| ${dut1_if2_ip4}= | 172.168.1.1
+| ${dut2_if1_ip4}= | 172.168.1.2
+| ${dut2_if2_ip4}= | 192.168.20.1
+| ${tg_if2_ip4}= | 192.168.20.2
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${32}
+| ${ipsec_overhead_gcm}= | ${54}
+| ${n_tunnels}= | ${1000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${framesize + ${ipsec_overhead_gcm}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnel AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${framesize + ${ipsec_overhead_gcm}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${imix_size} + ${ipsec_overhead_gcm}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${imix_size} + ${ipsec_overhead_gcm}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot
new file mode 100644
index 0000000000..c46da5a82d
--- /dev/null
+++ b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot
@@ -0,0 +1,333 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | SCALE | NDRPDRDISC
+| ... | IP4FWD | IPSEC | IPSECHW | IPSECTUN | NIC_Intel-XL710 | TNL_1000
+| ...
+| Suite Setup | Set up IPSec performance test suite | L3 | Intel-XL710
+| ...
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *IPv4 IPsec tunnel mode performance test suite.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 on TG-DUTn,
+| ... | Eth-IPv4-IPSec on DUT1-DUT2
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with multiple
+| ... | IPsec tunnels between them. DUTs get IPv4 traffic from TG, encrypt it
+| ... | and send to another DUT, where packets are decrypted and sent back to TG
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in number
+| ... | of packets transmitted. NDR is discovered for different
+| ... | number of IPsec tunnels using binary search algorithms with configured
+| ... | starting rate and final step that determines throughput measurement
+| ... | resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, number of flows per flow-group equals to
+| ... | number of IPSec tunnels) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC4303 and RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+| ${tg_if1_ip4}= | 192.168.10.2
+| ${dut1_if1_ip4}= | 192.168.10.1
+| ${dut1_if2_ip4}= | 172.168.1.1
+| ${dut2_if1_ip4}= | 172.168.1.2
+| ${dut2_if2_ip4}= | 192.168.20.1
+| ${tg_if2_ip4}= | 192.168.20.2
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${32}
+| ${ipsec_overhead}= | ${58}
+| ${n_tunnels}= | ${1000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnel CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Create Tunnel Interfaces
+| | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4}
+| | ... | ${raddr_ip4} | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..6e5a7dfbd9
--- /dev/null
+++ b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot
@@ -0,0 +1,361 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | SCALE | NDRPDRDISC
+| ... | IP4FWD | IPSEC | IPSECHW | IPSECTUN | NIC_Intel-XL710 | TNL_1000
+| ...
+| Suite Setup | Set up IPSec performance test suite | L3 | Intel-XL710
+| ...
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *IPv4 IPsec tunnel mode performance test suite.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 on TG-DUTn,
+| ... | Eth-IPv4-IPSec on DUT1-DUT2
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with multiple
+| ... | IPsec tunnels between them. DUTs get IPv4 traffic from TG, encrypt it
+| ... | and send to another DUT, where packets are decrypted and sent back to TG
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in number
+| ... | of packets transmitted. NDR is discovered for different
+| ... | number of IPsec tunnels using binary search algorithms with configured
+| ... | starting rate and final step that determines throughput measurement
+| ... | resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, number of flows per flow-group equals to
+| ... | number of IPSec tunnels) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC4303 and RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+| ${tg_if1_ip4}= | 192.168.10.2
+| ${dut1_if1_ip4}= | 192.168.10.1
+| ${dut1_if2_ip4}= | 172.168.1.1
+| ${dut2_if1_ip4}= | 172.168.1.2
+| ${dut2_if2_ip4}= | 192.168.20.1
+| ${tg_if2_ip4}= | 192.168.20.2
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${32}
+| ${ipsec_overhead_gcm}= | ${54}
+| ${n_tunnels}= | ${1000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${framesize + ${ipsec_overhead_gcm}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnel AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${framesize + ${ipsec_overhead_gcm}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${imix_size} + ${ipsec_overhead_gcm}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G}
+| | ... | ${imix_size} + ${ipsec_overhead_gcm}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels AES GCM in each direction,\
+| | ... | configured with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES GCM 128
+| | ${auth_alg}= | Integ Alg AES GCM 128
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot
new file mode 100644
index 0000000000..cceaaf846a
--- /dev/null
+++ b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot
@@ -0,0 +1,357 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | SCALE | NDRPDRDISC
+| ... | IP4FWD | IPSEC | IPSECHW | IPSECTUN | NIC_Intel-XL710 | TNL_1000
+| ...
+| Suite Setup | Set up IPSec performance test suite | L3 | Intel-XL710
+| ...
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *IPv4 IPsec tunnel mode performance test suite.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 on TG-DUTn,
+| ... | Eth-IPv4-IPSec on DUT1-DUT2
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with multiple
+| ... | IPsec tunnels between them. DUTs get IPv4 traffic from TG, encrypt it
+| ... | and send to another DUT, where packets are decrypted and sent back to TG
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in number
+| ... | of packets transmitted. NDR is discovered for different
+| ... | number of IPsec tunnels using binary search algorithms with configured
+| ... | starting rate and final step that determines throughput measurement
+| ... | resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, number of flows per flow-group equals to
+| ... | number of IPSec tunnels) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC4303 and RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+| ${tg_if1_ip4}= | 192.168.10.2
+| ${dut1_if1_ip4}= | 192.168.10.1
+| ${dut1_if2_ip4}= | 172.168.1.1
+| ${dut2_if1_ip4}= | 172.168.1.2
+| ${dut2_if2_ip4}= | 192.168.20.1
+| ${tg_if2_ip4}= | 192.168.20.2
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${32}
+| ${ipsec_overhead}= | ${58}
+| ${n_tunnels}= | ${1000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnel CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find NDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUTs run 1000 IPsec tunnels CBC-SHA1 in each direction,\
+| | ... | configured with 2 thread, 2 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps and loss tolerance of 0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPSec in 3-node circular topology
+| | Vpp Route Add | ${dut1} | ${raddr_ip4} | 8 | ${dut2_if1_ip4} | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | ${laddr_ip4} | 8 | ${dut1_if2_ip4} | ${dut2_if1}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${dut1} | ${dut2} | ${dut1_if2} | ${dut2_if1} | ${n_tunnels}
+| | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key}
+| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${laddr_ip4} | ${raddr_ip4}
+| | ... | ${addr_range}
+| | Then Find PDR using binary search and pps | ${framesize}
+| | ... | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrpdrdisc.robot b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrpdrdisc.robot
new file mode 100644
index 0000000000..141d3f7ce1
--- /dev/null
+++ b/tests/vpp/perf/crypto/40ge2p1xl710-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrpdrdisc.robot
@@ -0,0 +1,374 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/overlay/lispgpe.robot
+| ...
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC | IP4FWD
+| ... | LISPGPE | IPSEC | IPSECHW | IPSECTRAN | ENCAP | IP4UNRLAY | IP4OVRLAY
+| ... | NIC_Intel-XL710
+| ...
+| Suite Setup | Set up IPSec performance test suite | L3 | Intel-XL710
+| ...
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *IPv4 IPsec transport mode performance test suite.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 on TG-DUTn,\
+| ... | Eth-IPv4-IPSec-LISPGPE-IPv4 on DUT1-DUT2
+| ... | *[Cfg] DUT configuration:* Each DUT is configured with LISP and IPsec\
+| ... | in each direction. IPsec is in transport mode. DUTs get IPv4 traffic\
+| ... | from TG, encrypt it and send to another DUT, where packets are\
+| ... | decrypted and sent back to TG.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop\
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in number\
+| ... | of packets transmitted. NDR is discovered for different\
+| ... | number of IPsec tunnels using binary search algorithms with configured\
+| ... | starting rate and final step that determines throughput measurement\
+| ... | resolution. Test packets are generated by TG on\
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups\
+| ... | (flow-group per direction, number of flows per flow-group equals to\
+| ... | number of IPSec tunnels) with all packets\
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and\
+| ... | static payload. MAC addresses are matching MAC addresses of the TG\
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address)\
+| ... | field is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC6830, RFC4303 and\
+| ... | RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+| ${dut2_spi}= | ${1000}
+| ${dut1_spi}= | ${1001}
+| ${ESP_PROTO}= | ${50}
+| ${ipsec_overhead}= | ${54}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] Each DUT is configured with LISP and IPsec in each direction.\
+| | ... | IPsec is in transport mode. DUTs are configured with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP GPE IPv4 over IPsec in 3-node circular topology
+| | ... | ${encr_alg} | ${auth_alg}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] Each DUT is configured with LISP and IPsec in each direction.\
+| | ... | IPsec is in transport mode. DUTs are configured with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP GPE IPv4 over IPsec in 3-node circular topology
+| | ... | ${encr_alg} | ${auth_alg}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] Each DUT is configured with LISP and IPsec in each direction.\
+| | ... | IPsec is in transport mode. DUTs are configured with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP GPE IPv4 over IPsec in 3-node circular topology
+| | ... | ${encr_alg} | ${auth_alg}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] Each DUT is configured with LISP and IPsec in each direction.\
+| | ... | IPsec is in transport mode. DUTs are configured with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP GPE IPv4 over IPsec in 3-node circular topology
+| | ... | ${encr_alg} | ${auth_alg}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] Each DUT is configured with LISP and IPsec in each direction.\
+| | ... | IPsec is in transport mode. DUTs are configured with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP GPE IPv4 over IPsec in 3-node circular topology
+| | ... | ${encr_alg} | ${auth_alg}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] Each DUT is configured with LISP and IPsec in each direction.\
+| | ... | IPsec is in transport mode. DUTs are configured with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${imix_size}= | Get Frame Size | ${framesize}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add cryptodev to all DUTs | ${1}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP GPE IPv4 over IPsec in 3-node circular topology
+| | ... | ${encr_alg} | ${auth_alg}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] Each DUT is configured with LISP and IPsec in each direction.\
+| | ... | IPsec is in transport mode. DUTs are configured with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP GPE IPv4 over IPsec in 3-node circular topology
+| | ... | ${encr_alg} | ${auth_alg}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] Each DUT is configured with LISP and IPsec in each direction.\
+| | ... | IPsec is in transport mode. DUTs are configured with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${2}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP GPE IPv4 over IPsec in 3-node circular topology
+| | ... | ${encr_alg} | ${auth_alg}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] Each DUT is configured with LISP and IPsec in each direction.\
+| | ... | IPsec is in transport mode. DUTs are configured with 4 threads, 4 phy\
+| | ... | cores, 2 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${4}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP GPE IPv4 over IPsec in 3-node circular topology
+| | ... | ${encr_alg} | ${auth_alg}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] Each DUT is configured with LISP and IPsec in each direction.\
+| | ... | IPsec is in transport mode. DUTs are configured with 4 threads, 4 phy\
+| | ... | cores, 2 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 40GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${encr_alg}= | Crypto Alg AES CBC 128
+| | ${auth_alg}= | Integ Alg SHA1 96
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Generate keys for IPSec | ${encr_alg} | ${auth_alg}
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add cryptodev to all DUTs | ${4}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP GPE IPv4 over IPsec in 3-node circular topology
+| | ... | ${encr_alg} | ${auth_alg}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrchk.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrchk.robot
new file mode 100644
index 0000000000..5dc941725f
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrchk.robot
@@ -0,0 +1,260 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.Cop
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT1']}
+| ... | WITH NAME | dut1_v4
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT2']}
+| ... | WITH NAME | dut2_v4
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | COPWHLIST
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv4 whitelist verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing, two static IPv4 /24 routes and IPv4 COP security whitelist
+| ... | ingress /24 filter entries applied on links TG - DUT1 and DUT2 - TG.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 64 Byte frames using single trial throughput test
+| | ... | at 2x 4.1mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 4.1mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip4-ip4base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip4-ip4base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-ethip4-ip4base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 64 Byte frames using single trial throughput test
+| | ... | at 2x 7.2mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 7.2mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip4-ip4base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip4-ip4base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-ethip4-ip4base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 thread, 4 phy core, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 64 Byte frames using single trial throughput test
+| | ... | at 2x 10.4mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip4-ip4base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 thread, 4 phy core, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip4-ip4base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 thread, 4 phy core, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrpdrdisc.robot
new file mode 100644
index 0000000000..2afbb093c8
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrpdrdisc.robot
@@ -0,0 +1,569 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.Cop
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT1']}
+| ... | WITH NAME | dut1_v4
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT2']}
+| ... | WITH NAME | dut2_v4
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | COPWHLIST
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 whitelist test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing, two static IPv4 /24 routes and IPv4 COP security whitelist
+| ... | ingress /24 filter entries applied on links TG - DUT1 and DUT2 - TG.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4-ip4base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4-ip4base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4-ip4base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4-ip4base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4-ip4base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4-ip4base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4-ip4base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4-ip4base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4-ip4base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4-ip4base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4-ip4base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4-ip4base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4-ip4base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4-ip4base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 10.10.10.0 | 24 | 1 | local
+| | And Add fib table | ${dut2} | 20.20.20.0 | 24 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip4 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip4 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-iacldstbase-ndrchk.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-iacldstbase-ndrchk.robot
new file mode 100644
index 0000000000..3a070f8eaf
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-iacldstbase-ndrchk.robot
@@ -0,0 +1,332 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.Classify.Classify
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT1']}
+| ... | WITH NAME | dut1_v4
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT2']}
+| ... | WITH NAME | dut2_v4
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | IACLDST
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv4 whitelist verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing, two static IPv4 /24 routes and IPv4 iAcl security whitelist
+| ... | ingress /24 filter entries applied on links TG - DUT1 and DUT2 - TG.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 64 Byte frames using single trial throughput test
+| | ... | at 2x 3.6mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 3.6mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip4-ip4base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip4-ip4base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-ethip4-ip4base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 64 Byte frames using single trial throughput test
+| | ... | at 2x 6.3mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 6.3mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip4-ip4base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip4-ip4base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-ethip4-ip4base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 thread, 4 phy core, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 64 Byte frames using single trial throughput test
+| | ... | at 2x 9.7mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 9.7mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip4-ip4base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 thread, 4 phy core, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip4-ip4base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 thread, 4 phy core, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-iacldstbase-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-iacldstbase-ndrpdrdisc.robot
new file mode 100644
index 0000000000..5d63633383
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-iacldstbase-ndrpdrdisc.robot
@@ -0,0 +1,713 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.Classify.Classify
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT1']}
+| ... | WITH NAME | dut1_v4
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT2']}
+| ... | WITH NAME | dut2_v4
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | IACLDST
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 iAcl whitelist test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing, two static IPv4 /24 routes and IPv4 iAcl security whitelist
+| ... | ingress /24 filter entries applied on links TG - DUT1 and DUT2 - TG.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4-ip4base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4-ip4base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4-ip4base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4-ip4base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4-ip4base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4-ip4base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4-ip4base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4-ip4base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4-ip4base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4-ip4base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 64 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4-ip4base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4-ip4base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4-ip4base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4-ip4base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut1} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut1} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 20.20.20.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut1} | ${dut1_if1} | ip4 | ${table_idx}
+| | ${table_idx} | ${skip_n} | ${match_n}= | And Vpp Creates Classify Table L3
+| | ... | ${dut2} | ip4 | dst
+| | And Vpp Configures Classify Session L3
+| | ... | ${dut2} | permit | ${table_idx} | ${skip_n} | ${match_n}
+| | ... | ip4 | dst | 10.10.10.2
+| | And Vpp Enable Input Acl Interface
+| | ... | ${dut2} | ${dut2_if2} | ip4 | ${table_idx}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ipolicemarkbase-ndrchk.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ipolicemarkbase-ndrchk.robot
new file mode 100644
index 0000000000..69c0f60cfc
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ipolicemarkbase-ndrchk.robot
@@ -0,0 +1,226 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.Policer
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT1']}
+| ... | WITH NAME | dut1_v4
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT2']}
+| ... | WITH NAME | dut2_v4
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | IP4FWD | BASE | DOT1Q
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv4 policer verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 route entries and policer with 2R3C
+| ... | color-aware configuration. Policer is applied on links TG - DUT1 and
+| ... | DUT2 - TG. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC2698.
+
+*** Variables ***
+| ${cir}= | ${100}
+| ${eir}= | ${150}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-ipolicemarkbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 1 thread, 1 phy \
+| | ... | core, 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 \
+| | ... | Byte frames using single trial throughput test at 2x 3.6mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 3.6mpps
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip4-ip4base-ipolicemarkbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 1 thread, 1 phy \
+| | ... | core, 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 \
+| | ... | Byte frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip4-ip4base-ipolicemarkbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 1 thread, 1 phy \
+| | ... | core, 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 \
+| | ... | Byte frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-ethip4-ip4base-ipolicemarkbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 2 threads, 2 \
+| | ... | phy cores, 1 receive queue per NIC port. [Ver] Verify ref-NDR for \
+| | ... | 64 Byte frames using single trial throughput test at 2x 6.2mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 6.2mpps
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip4-ip4base-ipolicemarkbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 2 threads, 2 \
+| | ... | phy cores, 1 receive queue per NIC port. [Ver] Verify ref-NDR for \
+| | ... | 1518 Byte frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip4-ip4base-ipolicemarkbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 2 threads, 2 \
+| | ... | phy cores, 1 receive queue per NIC port. [Ver] Verify ref-NDR for \
+| | ... | 9000 Byte frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-ethip4-ip4base-ipolicemarkbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 4 thread, 4 \
+| | ... | phy core, 2 receive queue per NIC port. [Ver] Verify ref-NDR for 64 \
+| | ... | Byte frames using single trial throughput test at 2x 10.4mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip4-ip4base-ipolicemarkbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 4 thread, 4 \
+| | ... | phy core, 2 receive queue per NIC port. [Ver] Verify ref-NDR for \
+| | ... | 1518 Byte frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip4-ip4base-ipolicemarkbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 4 thread, 4 \
+| | ... | phy core, 2 receive queue per NIC port. [Ver] Verify ref-NDR for \
+| | ... | 9000 Byte frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ipolicemarkbase-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ipolicemarkbase-ndrpdrdisc.robot
new file mode 100644
index 0000000000..2400a58d12
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ipolicemarkbase-ndrpdrdisc.robot
@@ -0,0 +1,517 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.Policer
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT1']}
+| ... | WITH NAME | dut1_v4
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT2']}
+| ... | WITH NAME | dut2_v4
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | IP4FWD | BASE | DOT1Q
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 policer test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 route entries and policer with 2R3C
+| ... | color-aware configuration. Policer is applied on links TG - DUT1 and
+| ... | DUT2 - TG. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | generated payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC2698.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+| ${cir}= | ${100}
+| ${eir}= | ${150}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-ipolicemarkbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 1 thread, 1 \
+| | ... | phy core, 1 receive queue per NIC port. [Ver] Find NDR for 64 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4base-ipolicemarkbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 1 thread, 1 \
+| | ... | phy core, 1 receive queue per NIC port. [Ver] Find PDR for 64 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4base-ipolicemarkbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 1 thread, 1 \
+| | ... | phy core, 1 receive queue per NIC port. [Ver] Find NDR for 1518 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4base-ipolicemarkbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 1 thread, 1 \
+| | ... | phy core, 1 receive queue per NIC port. [Ver] Find PDR for 1518 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4-ip4base-ipolicemarkbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 1 thread, 1 \
+| | ... | phy core, 1 receive queue per NIC port. [Ver] Find NDR for 9000 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4-ip4base-ipolicemarkbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 1 thread, 1 \
+| | ... | phy core, 1 receive queue per NIC port. [Ver] Find PDR for 9000 \
+| | ... | Byte frames using binary search start at 10GE linerate, step 5kpps, \
+| | ... | LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4-ip4base-ipolicemarkbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 2 threads, 2 \
+| | ... | phy cores, 1 receive queue per NIC port. [Ver] Find NDR for 64 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4-ip4base-ipolicemarkbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 2 threads, 2 \
+| | ... | phy cores, 1 receive queue per NIC port. [Ver] Find PDR for 64 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4-ip4base-ipolicemarkbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 2 threads, 2 \
+| | ... | phy cores, 1 receive queue per NIC port. [Ver] Find NDR for 1518 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4-ip4base-ipolicemarkbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 2 threads, 2 \
+| | ... | phy cores, 1 receive queue per NIC port. [Ver] Find PDR for 1518 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4-ip4base-ipolicemarkbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 2 threads, 2 \
+| | ... | phy cores, 1 receive queue per NIC port. [Ver] Find NDR for 9000 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4-ip4base-ipolicemarkbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 2 threads, 2 \
+| | ... | phy cores, 1 receive queue per NIC port. [Ver] Find PDR for 9000 \
+| | ... | Byte frames using binary search start at 10GE linerate, step 5kpps, \
+| | ... | LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4-ip4base-ipolicemarkbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 4 threads, 4 \
+| | ... | phy cores, 2 receive queue per NIC port. [Ver] Find NDR for 64 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4-ip4base-ipolicemarkbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 4 threads, 4 \
+| | ... | phy cores, 2 receive queue per NIC port. [Ver] Find PDR for 64 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4-ip4base-ipolicemarkbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 4 threads, 4 \
+| | ... | phy cores, 2 receive queue per NIC port. [Ver] Find NDR for 1518 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4-ip4base-ipolicemarkbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 4 threads, 4 \
+| | ... | phy cores, 2 receive queue per NIC port. [Ver] Find PDR for 1518 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4-ip4base-ipolicemarkbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 4 threads, 4 \
+| | ... | phy cores, 2 receive queue per NIC port. [Ver] Find NDR for 9000 \
+| | ... | Byte frames using binary search start at 10GE linerate, step \
+| | ... | 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4-ip4base-ipolicemarkbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and policer config with 4 threads, 4 \
+| | ... | phy cores, 2 receive queue per NIC port. [Ver] Find PDR for 9000 \
+| | ... | Byte frames using binary search start at 10GE linerate, step 5kpps, \
+| | ... | LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Variable | ${cb} | ${framesize}
+| | Set Test Variable | ${eb} | ${framesize}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding in 3-node circular topology
+| | And Initialize IPv4 policer 2r3c-'ca' in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ndrchk.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ndrchk.robot
new file mode 100644
index 0000000000..01dcedb4b8
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ndrchk.robot
@@ -0,0 +1,198 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT1']}
+| ... | WITH NAME | dut1_v4
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT2']}
+| ... | WITH NAME | dut2_v4
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | BASE | IP4BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv4 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 route entries. DUT1 and DUT2 tested with
+| ... | 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 4.6mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 4.6mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-ethip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 10.4mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-ethip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 10.4mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-9000B-4t4c-ethip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ndrpdrdisc.robot
new file mode 100644
index 0000000000..edf5ca0691
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-ndrpdrdisc.robot
@@ -0,0 +1,489 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT1']}
+| ... | WITH NAME | dut1_v4
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT2']}
+| ... | WITH NAME | dut2_v4
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | BASE | IP4BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 route entries. DUT1 and DUT2 tested with
+| ... | 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc19-IMIX-1t1c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame size
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc20-IMIX-1t1c-ethip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame size
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-pdrchk.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-pdrchk.robot
new file mode 100644
index 0000000000..3c49d6ba72
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-pdrchk.robot
@@ -0,0 +1,190 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT1']}
+| ... | WITH NAME | dut1_v4
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT2']}
+| ... | WITH NAME | dut2_v4
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | BASE | IP4BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput IPv4 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 route entries. DUT1 and DUT2 tested with
+| ... | 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-PDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-PDR value is periodically updated acording to
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Keywords ***
+| Check PDR for IPv4 routing
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with ${wt} thread(s), ${wt}\
+| | ... | phy core(s), ${rxq} receive queue(s) per NIC port.
+| | ... | [Ver] Verify ref-PDR for ${framesize} frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte\
+| | ... | frames using single trial throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${64} | rate=4.7mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-ethip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${1518} | rate=400000pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-ethip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${9000} | rate=60000pps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-ethip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 thread, 2 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${64} | rate=7.4mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-ethip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 thread, 2 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${1518} | rate=400000pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-ethip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 thread, 2 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${9000} | rate=60000pps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-ethip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 thread, 4 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${64} | rate=7.4mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-ethip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 thread, 4 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${1518} | rate=400000pps | wt=4 | rxq=2
+
+| tc08-9000B-4t4c-ethip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 thread, 4 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${9000} | rate=60000pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-snat-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-snat-ndrpdrdisc.robot
new file mode 100644
index 0000000000..89aa2788ef
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4base-snat-ndrpdrdisc.robot
@@ -0,0 +1,227 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/ip/snat.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | SNAT | BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test with SNAT
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *SNAT performance test cases*
+| ...
+| ... | *High level description*
+| ...
+| ... | - NDR and PDR tests
+| ... | - 3-node topology, TG-DUT1-DUT2-TG, SNAT is enabled between DUTs.
+| ... | - Cores / threads: 1t1c and 2t2c
+| ... | - Framesize: 64B, 1518B, IMIX
+| ... | - Packet: ETH / IP(src, dst) / UDP(src_port, dst_port) / payload
+| ...
+| ... | *Low level description*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 and IPv4/20 route entries. DUT1 and DUT2
+| ... | tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, one flow per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with UDP header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4udp-1u1p
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-snat-1u-1p-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 1 port (session) per user.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4base-snat-1u-1p-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 1 port (session) per user.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4base-snat-1u-1p-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 1 port (session) per user.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4base-snat-1u-1p-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 1 port (session) per user.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4-ip4base-snat-1u-1p-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 1 port (session) per user.
+| | ... | [Ver] Find NDR for IMIX frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4-ip4base-snat-1u-1p-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 1 port (session) per user.
+| | ... | [Ver] Find PDR for IMIX frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale200k-ndrchk.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale200k-ndrchk.robot
new file mode 100644
index 0000000000..abb34c2794
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale200k-ndrchk.robot
@@ -0,0 +1,201 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | SCALE | FIB_200K
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv4 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and 2x100k static IPv4 /32 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT confiiguration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 100k flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. Incrementing of IP.dst (IPv4 destination address)
+| ... | field is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${rts_per_flow}= | ${100000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 4.3mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 4.3mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip4-ip4scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip4-ip4scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-ethip4-ip4scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 9.1mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 9.1mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip4-ip4scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip4-ip4scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-ethip4-ip4scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 10.4mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip4-ip4scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip4-ip4scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale200k-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale200k-ndrpdrdisc.robot
new file mode 100644
index 0000000000..6d0034338f
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale200k-ndrpdrdisc.robot
@@ -0,0 +1,457 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | SCALE | FIB_200K
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and 2x100k static IPv4 /32 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 100k flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+| ${rts_per_flow}= | 100000
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4-ip4scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4-ip4scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4-ip4scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4-ip4scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4-ip4scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4-ip4scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4-ip4scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4-ip4scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4-ip4scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4-ip4scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4-ip4scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4-ip4scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4-ip4scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4-ip4scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale20k-ndrchk.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale20k-ndrchk.robot
new file mode 100644
index 0000000000..8303a4e139
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale20k-ndrchk.robot
@@ -0,0 +1,210 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | SCALE | FIB_20K
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv4 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and 2x10k static IPv4 /32 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT confiiguration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 10k flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. Incrementing of IP.dst (IPv4 destination address)
+| ... | field is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${rts_per_flow}= | ${10000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 4.3mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 4.3mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip4-ip4scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip4-ip4scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc04-64B-2t2c-ethip4-ip4scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 9.0mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 9.0mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip4-ip4scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip4-ip4scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc07-64B-4t4c-ethip4-ip4scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 10.4mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip4-ip4scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip4-ip4scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale20k-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale20k-ndrpdrdisc.robot
new file mode 100644
index 0000000000..a4c5b31bd7
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale20k-ndrpdrdisc.robot
@@ -0,0 +1,457 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | SCALE | FIB_20K
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and 2x10k static IPv4 /32 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 10k flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+| ${rts_per_flow}= | ${10000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4-ip4scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4-ip4scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4-ip4scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4-ip4scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4-ip4scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4-ip4scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4-ip4scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4-ip4scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4-ip4scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4-ip4scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4-ip4scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4-ip4scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4-ip4scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4-ip4scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-ndrchk.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-ndrchk.robot
new file mode 100644
index 0000000000..84fc806d23
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-ndrchk.robot
@@ -0,0 +1,210 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | SCALE | FIB_2M
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv4 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and 2x1M static IPv4 /32 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT confiiguration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 1M flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. Incrementing of IP.dst (IPv4 destination address)
+| ... | field is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${rts_per_flow}= | ${1000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 3.7mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 3.7mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip4-ip4scale2m-ndrchk
+| | [Documentation]
+| | ... | Verify ref-NDR for 1518 Byte frames using single trial throughput
+| | ... | test. DUT runs IPv4 routing config with 1 thread, 1 phy core, 1
+| | ... | receive queue per NIC port at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip4-ip4scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc04-64B-2t2c-ethip4-ip4scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 7.6mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 7.6mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip4-ip4scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip4-ip4scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc07-64B-4t4c-ethip4-ip4scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 10.4mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip4-ip4scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip4-ip4scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-ndrpdrdisc.robot
new file mode 100644
index 0000000000..920bb8f42d
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-ndrpdrdisc.robot
@@ -0,0 +1,457 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | SCALE | FIB_2M
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and 2x1M static IPv4 /32 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 1M flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) field
+| ... | is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+| ${rts_per_flow}= | ${1000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4-ip4scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4-ip4scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4-ip4scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4-ip4scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4-ip4scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4-ip4scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4-ip4scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4-ip4scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4-ip4scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4-ip4scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4-ip4scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4-ip4scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4-ip4scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4-ip4scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-pdrchk.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-pdrchk.robot
new file mode 100644
index 0000000000..0a5133aff1
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4-ip4scale2m-pdrchk.robot
@@ -0,0 +1,185 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | SCALE | FIB_2M
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput IPv4 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and 2x1M static IPv4 /32 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG verifies throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. Ref-PDR value is periodically updated acording
+| ... | to formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 1M flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. Incrementing of IP.dst (IPv4 destination address)
+| ... | field is applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${rts_per_flow}= | ${1000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${rts_per_flow}
+
+*** Keywords ***
+| Check PDR for IPv4 routing
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with ${wt} thread, ${wt} phy\
+| | ... | core, ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${64} | rate=3.0mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-ethip4-ip4scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | trial throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${1518} | rate=600000pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-ethip4-ip4scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${9000} | rate=100000pps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-ethip4-ip4scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${64} | rate=7.0mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-ethip4-ip4scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${1518} | rate=500000pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-ethip4-ip4scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${9000} | rate=100000pps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-ethip4-ip4scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${64} | rate=10.0mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-ethip4-ip4scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${1518} | rate=500000pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-ethip4-ip4scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing
+| | framesize=${9000} | rate=100000pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4base-udpsrcscale15-snat-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4base-udpsrcscale15-snat-ndrpdrdisc.robot
new file mode 100644
index 0000000000..4eb3862e0f
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4base-udpsrcscale15-snat-ndrpdrdisc.robot
@@ -0,0 +1,229 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/ip/snat.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | SNAT | BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test with SNAT
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *SNAT performance test cases*
+| ...
+| ... | *High level description*
+| ...
+| ... | - NDR and PDR tests
+| ... | - 3-node topology, TG-DUT1-DUT2-TG, SNAT is enabled between DUTs.
+| ... | - Cores / threads: 1t1c and 2t2c
+| ... | - Framesize: 64B, 1518B, IMIX
+| ... | - Packet: ETH / IP(src, dst) / UDP(src_port, dst_port) / payload
+| ... | - scale: src: 1 user, 10 users, 100 users, ..., 4000 up to the memory
+| ... | limit; 15 ports per user
+| ...
+| ... | *Low level description*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 and IPv4/20 route entries. DUT1 and DUT2
+| ... | tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, one flow per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with UDP header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4udp-1u15p
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4udp-ip4base-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4udp-ip4base-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4udp-ip4base-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4udp-ip4base-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4udp-ip4base-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for IMIX frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4udp-ip4base-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1 user and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for IMIX frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale10-udpsrcscale15-snat-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale10-udpsrcscale15-snat-ndrpdrdisc.robot
new file mode 100644
index 0000000000..28b44ebfc6
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale10-udpsrcscale15-snat-ndrpdrdisc.robot
@@ -0,0 +1,230 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/ip/snat.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | SNAT | SRC_USER_10
+| ... | SCALE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test with SNAT
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *SNAT performance test cases*
+| ...
+| ... | *High level description*
+| ...
+| ... | - NDR and PDR tests
+| ... | - 3-node topology, TG-DUT1-DUT2-TG, SNAT is enabled between DUTs.
+| ... | - Cores / threads: 1t1c and 2t2c
+| ... | - Framesize: 64B, 1518B, IMIX
+| ... | - Packet: ETH / IP(src, dst) / UDP(src_port, dst_port) / payload
+| ... | - scale: src: 1 user, 10 users, 100 users, ..., 4000 up to the memory
+| ... | limit; 15 ports per user
+| ...
+| ... | *Low level description*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 and IPv4/20 route entries. DUT1 and DUT2
+| ... | tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, one flow per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with UDP header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4udp-10u15p
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4udp-ip4scale10-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 10 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4udp-ip4scale10-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 10 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4udp-ip4scale10-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 10 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4udp-ip4scale10-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 10 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4udp-ip4scale10-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 10 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for IMIX frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4udp-ip4scale10-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 10 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for IMIX frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale100-udpsrcscale15-snat-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale100-udpsrcscale15-snat-ndrpdrdisc.robot
new file mode 100644
index 0000000000..9f683679e2
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale100-udpsrcscale15-snat-ndrpdrdisc.robot
@@ -0,0 +1,230 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/ip/snat.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | SNAT | SRC_USER_100
+| ... | SCALE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test with SNAT
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *SNAT performance test cases*
+| ...
+| ... | *High level description*
+| ...
+| ... | - NDR and PDR tests
+| ... | - 3-node topology, TG-DUT1-DUT2-TG, SNAT is enabled between DUTs.
+| ... | - Cores / threads: 1t1c and 2t2c
+| ... | - Framesize: 64B, 1518B, IMIX
+| ... | - Packet: ETH / IP(src, dst) / UDP(src_port, dst_port) / payload
+| ... | - scale: src: 1 user, 10 users, 100 users, ..., 4000 up to the memory
+| ... | limit; 15 ports per user
+| ...
+| ... | *Low level description*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 and IPv4/20 route entries. DUT1 and DUT2
+| ... | tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, one flow per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with UDP header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4udp-100u15p
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4udp-ip4scale100-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 100 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4udp-ip4scale100-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 100 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4udp-ip4scale100-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 100 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4udp-ip4scale100-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 100 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4udp-ip4scale100-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 100 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for IMIX frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4udp-ip4scale100-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 100 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for IMIX frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale1000-udpsrcscale15-snat-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale1000-udpsrcscale15-snat-ndrpdrdisc.robot
new file mode 100644
index 0000000000..73ede552b2
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale1000-udpsrcscale15-snat-ndrpdrdisc.robot
@@ -0,0 +1,230 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/ip/snat.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | SNAT | SRC_USER_1000
+| ... | SCALE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test with SNAT
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *SNAT performance test cases*
+| ...
+| ... | *High level description*
+| ...
+| ... | - NDR and PDR tests
+| ... | - 3-node topology, TG-DUT1-DUT2-TG, SNAT is enabled between DUTs.
+| ... | - Cores / threads: 1t1c and 2t2c
+| ... | - Framesize: 64B, 1518B, IMIX
+| ... | - Packet: ETH / IP(src, dst) / UDP(src_port, dst_port) / payload
+| ... | - scale: src: 1 user, 10 users, 100 users, ..., 4000 up to the memory
+| ... | limit; 15 ports per user
+| ...
+| ... | *Low level description*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 and IPv4/20 route entries. DUT1 and DUT2
+| ... | tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, one flow per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with UDP header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4udp-1000u15p
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4udp-ip4scale1000-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1000 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4udp-ip4scale1000-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1000 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4udp-ip4scale1000-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1000 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4udp-ip4scale1000-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1000 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4udp-ip4scale1000-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1000 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for IMIX frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4udp-ip4scale1000-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 1000 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for IMIX frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale2000-udpsrcscale15-snat-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale2000-udpsrcscale15-snat-ndrpdrdisc.robot
new file mode 100644
index 0000000000..bce900f0ec
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale2000-udpsrcscale15-snat-ndrpdrdisc.robot
@@ -0,0 +1,124 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/ip/snat.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | SNAT | SRC_USER_2000
+| ... | SCALE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test with SNAT
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *SNAT performance test cases*
+| ...
+| ... | *High level description*
+| ...
+| ... | - NDR and PDR tests
+| ... | - 3-node topology, TG-DUT1-DUT2-TG, SNAT is enabled between DUTs.
+| ... | - Cores / threads: 1t1c and 2t2c
+| ... | - Framesize: 64B, 1518B, IMIX
+| ... | - Packet: ETH / IP(src, dst) / UDP(src_port, dst_port) / payload
+| ... | - scale: src: 1 user, 10 users, 100 users, ..., 4000 up to the memory
+| ... | limit; 15 ports per user
+| ...
+| ... | *Low level description*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 and IPv4/20 route entries. DUT1 and DUT2
+| ... | tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, one flow per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with UDP header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4udp-2000u15p
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4udp-ip4scale2000-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 2000 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4udp-ip4scale2000-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 2000 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale4000-udpsrcscale15-snat-ndrpdrdisc.robot b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale4000-udpsrcscale15-snat-ndrpdrdisc.robot
new file mode 100644
index 0000000000..2b91618470
--- /dev/null
+++ b/tests/vpp/perf/ip4/10ge2p1x520-ethip4udp-ip4scale4000-udpsrcscale15-snat-ndrpdrdisc.robot
@@ -0,0 +1,124 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/ip/snat.robot
+| Resource | resources/libraries/robot/shared/traffic.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | FEATURE | SNAT | SRC_USER_4000
+| ... | SCALE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test with SNAT
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *SNAT performance test cases*
+| ...
+| ... | *High level description*
+| ...
+| ... | - NDR and PDR tests
+| ... | - 3-node topology, TG-DUT1-DUT2-TG, SNAT is enabled between DUTs.
+| ... | - Cores / threads: 1t1c and 2t2c
+| ... | - Framesize: 64B, 1518B, IMIX
+| ... | - Packet: ETH / IP(src, dst) / UDP(src_port, dst_port) / payload
+| ... | - scale: src: 1 user, 10 users, 100 users, ..., 4000 up to the memory
+| ... | limit; 15 ports per user
+| ...
+| ... | *Low level description*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 and IPv4/20 route entries. DUT1 and DUT2
+| ... | tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, one flow per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with UDP header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4udp-4000u15p
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4udp-ip4scale4000-udpsrcscale15-snat-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 4000 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4udp-ip4scale4000-udpsrcscale15-snat-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. SNAT is configured between DUTs -\
+| | ... | 4000 users and 15 ports (sessions) per user.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Add SNAT to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize SNAT in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4/40ge2p1xl710-ethip4-ip4base-ndrpdrdisc.robot b/tests/vpp/perf/ip4/40ge2p1xl710-ethip4-ip4base-ndrpdrdisc.robot
new file mode 100644
index 0000000000..1dbda15832
--- /dev/null
+++ b/tests/vpp/perf/ip4/40ge2p1xl710-ethip4-ip4base-ndrpdrdisc.robot
@@ -0,0 +1,257 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT1']}
+| ... | WITH NAME | dut1_v4
+| Library | resources.libraries.python.IPv4Setup.Dut | ${nodes['DUT2']}
+| ... | WITH NAME | dut2_v4
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-XL710 | ETH | IP4FWD | BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-XL710
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 route entries. DUT1 and DUT2 tested with
+| ... | 2p40GE NIC XL710 by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 18.75Mpps rate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc03-1518B-1t1c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 24.5G rate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc07-64B-2t2c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 18.75Mpps rate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc09-1518B-2t2c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 24.5G rate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc13-64B-4t4c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 18.75Mpps rate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc15-1518B-4t4c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 24.5G rate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc19-IMIX-1t1c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame size
+| | ... | using binary search start at 24.5G rate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc20-IMIX-2t2c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 thread, 2 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame size
+| | ... | using binary search start at 24.5G rate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc21-IMIX-4t4c-ethip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 thread, 4 phy core, \
+| | ... | 2 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame size
+| | ... | using binary search start at 24.5G rate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv4 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-ndrchk.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-ndrchk.robot
new file mode 100644
index 0000000000..79f0bbc772
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-ndrchk.robot
@@ -0,0 +1,266 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | IP4FWD | ENCAP | LISP | IP4UNRLAY | IP4OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput Lisp tunnel verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv4 on DUT1-DUT2\
+| ... | Eth-IPv4 on TG-DUTn for IPv4 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between\
+| ... | DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520\
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies\
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet\
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to\
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long\
+| ... | performance tests for the same DUT confiiguration. Test packets are\
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3\
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with\
+| ... | all packets containing Ethernet header, IPv4 header with\
+| ... | IP protocol=61 and generated payload.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4lispip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial throughput\
+| | ... | test at 2x 1.9mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 1.9mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1480B-1t1c-ethip4lispip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1480 Byte frames using single trial\
+| | ... | throughput test at 2x 740000pps.
+| | [Tags] | 1480B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1480}
+| | ${rate}= | Set Variable | 740000pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip4lispip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-ethip4lispip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x 3.6mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 3.6mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1480B-2t2c-ethip4lispip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1480 Byte frames using single trial\
+| | ... | throughput test at 2x 740000pps.
+| | [Tags] | 1480B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1480}
+| | ${rate}= | Set Variable | 740000pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip4lispip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-ethip4lispip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x 3.5mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 3.5mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1480B-4t4c-ethip4lispip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1480 Byte frames using single trial\
+| | ... | throughput test at 2x 740000pps.
+| | [Tags] | 1480B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1480}
+| | ${rate}= | Set Variable | 740000pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip4lispip4-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-ndrpdrdisc.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-ndrpdrdisc.robot
new file mode 100644
index 0000000000..2dc5be4981
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-ndrpdrdisc.robot
@@ -0,0 +1,595 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | IP4FWD | ENCAP | LISP | IP4UNRLAY | IP4OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC6830: Pkt throughput Lisp test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv4 on DUT1-DUT2,\
+| ... | Eth-IPv4 on TG-DUTn for IPv4 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between DUT1\
+| ... | and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop\
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage\
+| ... | of packets transmitted. NDR and PDR are discovered for different\
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4lispip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4lispip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1480B-1t1c-ethip4lispip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1480 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 1480B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1480}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1480B-1t1c-ethip4lispip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1480 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1480B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1480}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4lispip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4lispip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4lispip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4lispip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1480B-2t2c-ethip4lispip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1480 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 1480B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1480}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1480B-2t2c-ethip4lispip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1480 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1480B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1480}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4lispip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4lispip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4lispip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4lispip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1480B-4t4c-ethip4lispip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1480 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 1480B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1480}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1480B-4t4c-ethip4lispip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1480 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1480B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1480}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4lispip4-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4lispip4-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-pdrchk.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-pdrchk.robot
new file mode 100644
index 0000000000..bebbfbc938
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip4-ip4base-pdrchk.robot
@@ -0,0 +1,193 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | IP4FWD | ENCAP | LISP | IP4UNRLAY | IP4OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput Lisp tunnel verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv4 on DUT1-DUT2\
+| ... | Eth-IPv4 on TG-DUTn for IPv4 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between\
+| ... | DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520\
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies\
+| ... | DUTs' throughput at ref-PDR (reference Non Drop Rate) with zero packet\
+| ... | loss tolerance. Ref-PDR value is periodically updated acording to\
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long\
+| ... | performance tests for the same DUT confiiguration. Test packets are\
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3\
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with\
+| ... | all packets containing Ethernet header, IPv4 header with\
+| ... | IP protocol=61 and generated payload.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Keywords ***
+| Check PDR for Lisp IPv4 over IPv4 forwarding
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with ${wt} thread, ${wt} phy core,\
+| | ... | ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4} | ${dut1_to_tg_ip4} | ${dut2_to_dut1_ip4}
+| | ... | ${dut2_to_tg_ip4} | ${prefix4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4_eid} | ${dut2_ip4_eid}
+| | ... | ${dut1_ip4_static_adjacency} | ${dut2_ip4_static_adjacency}
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4lispip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv4 forwarding
+| | framesize=${64} | rate=1.9mpps | wt=1 | rxq=1
+
+| tc02-1480B-1t1c-ethip4lispip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1480 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1480B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv4 forwarding
+| | framesize=${1480} | rate=370000pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-ethip4lispip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv4 forwarding
+| | framesize=${9000} | rate=60000pps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-ethip4lispip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv4 forwarding
+| | framesize=${64} | rate=3.6mpps | wt=2 | rxq=1
+
+| tc05-1480B-2t2c-ethip4lispip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1480 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1480B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv4 forwarding
+| | framesize=${1480} | rate=370000pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-ethip4lispip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv4 forwarding
+| | framesize=${9000} | rate=60000pps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-ethip4lispip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv4 forwarding
+| | framesize=${64} | rate=3.5mpps | wt=4 | rxq=2
+
+| tc08-1480B-4t4c-ethip4lispip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1480 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1480B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv4 forwarding
+| | framesize=${1480} | rate=370000pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-ethip4lispip4-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv4 forwarding
+| | framesize=${9000} | rate=60000pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-ndrchk.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-ndrchk.robot
new file mode 100644
index 0000000000..cdcc200b55
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-ndrchk.robot
@@ -0,0 +1,266 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | IP4FWD | ENCAP | LISP | IP6UNRLAY | IP4OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput Lisp tunnel verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv6 on DUT1-DUT2,\
+| ... | Eth-IPv4 on TG-DUTn for IPv4 routing over LISPoIPv6 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured between\
+| ... | DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic\
+| ... | by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies\
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet\
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to\
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT confiiguration. Test packets are\
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3\
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with\
+| ... | all packets containing Ethernet header, IPv4 header or IPv6 header with\
+| ... | IP protocol=61 and generated payload.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4lispip6-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x 1.53mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 1.53mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1460B-1t1c-ethip4lispip6-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x 720000pps.
+| | [Tags] | 1460B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1460}
+| | ${rate}= | Set Variable | 720000pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip4lispip6-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-ethip4lispip6-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x 3.25mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 3.25mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1460B-2t2c-ethip4lispip6-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x 720000pps.
+| | [Tags] | 1460B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1460}
+| | ${rate}= | Set Variable | 720000pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip4lispip6-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-ethip4lispip6-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x 3.12mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 3.12mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1460B-4t4c-ethip4lispip6-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x 720000pps.
+| | [Tags] | 1460B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1460}
+| | ${rate}= | Set Variable | 720000pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip4lispip6-ip4base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-ndrpdrdisc.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-ndrpdrdisc.robot
new file mode 100644
index 0000000000..a7f730ac40
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-ndrpdrdisc.robot
@@ -0,0 +1,596 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | IP4FWD | ENCAP | LISP | IP6UNRLAY | IP4OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC6830: Pkt throughput Lisp test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv6 on DUT1-DUT2 and\
+| ... | Eth-IPv4 on TG-DUTn for IPv4 routing over LISPoIPv6 tunnel.\
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured\
+| ... | between DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520\
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop\
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage\
+| ... | of packets transmitted. NDR and PDR are discovered for different\
+| ... | Ethernet L2 frame sizes using either binary search or linear search\
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4lispip6-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4lispip6-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1460B-1t1c-ethip4lispip6-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 1460B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1460B-1t1c-ethip4lispip6-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1460B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4lispip6-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4lispip6-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4lispip6-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4lispip6-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1460B-2t2c-ethip4lispip6-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 1460B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1460B-2t2c-ethip4lispip6-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1460B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4lispip6-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4lispip6-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4lispip6-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4lispip6-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1460B-4t4c-ethip4lispip6-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 1460B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1460B-4t4c-ethip4lispip6-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1460B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4lispip6-ip4base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4lispip6-ip4base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-pdrchk.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-pdrchk.robot
new file mode 100644
index 0000000000..f8190674a7
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4lispip6-ip4base-pdrchk.robot
@@ -0,0 +1,193 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | IP4FWD | ENCAP | LISP | IP6UNRLAY | IP4OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput Lisp tunnel verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-LISP-IPv6 on DUT1-DUT2,\
+| ... | Eth-IPv4 on TG-DUTn for IPv4 routing over LISPoIPv6 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured between\
+| ... | DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic\
+| ... | by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies\
+| ... | DUTs' throughput at ref-PDR (reference Non Drop Rate) with zero packet\
+| ... | loss tolerance. Ref-PDR value is periodically updated acording to\
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT confiiguration. Test packets are\
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3\
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with\
+| ... | all packets containing Ethernet header, IPv4 header or IPv6 header with\
+| ... | IP protocol=61 and generated payload.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Keywords ***
+| Check PDR for Lisp IPv4 over IPv6 forwarding
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with ${wt} thread, ${wt} phy core,\
+| | ... | ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv4 over IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip4o6} | ${dut1_to_tg_ip4o6} | ${dut2_to_dut1_ip4o6}
+| | ... | ${dut2_to_tg_ip4o6} | ${tg_prefix4o6} | ${dut_prefix4o6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip4o6_eid} | ${dut2_ip4o6_eid}
+| | ... | ${dut1_ip4o6_static_adjacency} | ${dut2_ip4o6_static_adjacency}
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4lispip6-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv6 forwarding
+| | framesize=${64} | rate=1.53mpps | wt=1 | rxq=1
+
+| tc02-1460B-1t1c-ethip4lispip6-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1460B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv6 forwarding
+| | framesize=${1460} | rate=360000pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-ethip4lispip6-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv6 forwarding
+| | framesize=${9000} | rate=60000pps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-ethip4lispip6-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv6 forwarding
+| | framesize=${64} | rate=3.25mpps | wt=2 | rxq=1
+
+| tc05-1460B-2t2c-ethip4lispip6-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1460B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv6 forwarding
+| | framesize=${1460} | rate=360000pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-ethip4lispip6-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv6 forwarding
+| | framesize=${9000} | rate=60000pps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-ethip4lispip6-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv6 forwarding
+| | framesize=${64} | rate=3.12mpps | wt=4 | rxq=2
+
+| tc08-1460B-4t4c-ethip4lispip6-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1460B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv6 forwarding
+| | framesize=${1460} | rate=360000pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-ethip4lispip6-ip4base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv4 over IPv6 forwarding
+| | framesize=${9000} | rate=60000pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-ndrpdrdisc.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-ndrpdrdisc.robot
new file mode 100644
index 0000000000..f41f619375
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-ndrpdrdisc.robot
@@ -0,0 +1,487 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | L2BDMACLRN | ENCAP | VXLAN | L2OVRLAY | IP4UNRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Packet throughput L2BD with VXLANoIPv4 test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 bridge domain on TG-DUTn.
+| ... | Eth-IPv4-VXLAN-Eth-IPv4 is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge
+| ... | domain. VXLAN tunnels are configured between L2BDs on DUT1 and DUT2.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | generated payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC7348.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+| ${vxlan_overhead} | ${50}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4vxlan-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4vxlan-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4vxlan-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4vxlan-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4vxlan-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 5kpps.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4vxlan-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 5kpps, LT=0.5%.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4vxlan-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4vxlan-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4vxlan-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4vxlan-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4vxlan-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 5kpps.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4vxlan-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 5kpps, LT=0.5%.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4vxlan-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4vxlan-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4vxlan-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4vxlan-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4vxlan-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 5kpps.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4vxlan-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD forwarding config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 5kpps, LT=0.5%.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-pdrchk.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-pdrchk.robot
new file mode 100644
index 0000000000..dee56213c7
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-pdrchk.robot
@@ -0,0 +1,186 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | L2BDMACLRN | ENCAP | VXLAN | L2OVRLAY | IP4UNRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *RFC2544: Packet throughput L2BD with VXLANoIPv4 test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 bridge domain on TG-DUTn.
+| ... | Eth-IPv4-VXLAN-Eth-IPv4 is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge
+| ... | domain. VXLAN tunnels are configured between L2BDs on DUT1 and DUT2.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG verifies throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. Ref-PDR value is periodically updated acording
+| ... | to formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and generated payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC7348.
+
+*** Variables ***
+| ${vxlan_overhead} | ${50}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| Check PDR for L2BD forwarding with VXLAN over IPv4
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config config with ${wt} thread, ${wt} phy\
+| | ... | core, ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4vxlan-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2BD forwarding with VXLAN over IPv4
+| | framesize=${64 + ${vxlan_overhead}} | rate=2.4mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-ethip4vxlan-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2BD forwarding with VXLAN over IPv4
+| | framesize=${1518 + ${vxlan_overhead}} | rate=700000pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-ethip4vxlan-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2BD forwarding with VXLAN over IPv4
+| | framesize=${9000 + ${vxlan_overhead}} | rate=100000pps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-ethip4vxlan-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2BD forwarding with VXLAN over IPv4
+| | framesize=${64 + ${vxlan_overhead}} | rate=5.2mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-ethip4vxlan-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2BD forwarding with VXLAN over IPv4
+| | framesize=${1518 + ${vxlan_overhead}} | rate=650000pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-ethip4vxlan-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2BD forwarding with VXLAN over IPv4
+| | framesize=${9000 + ${vxlan_overhead}} | rate=100000pps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-ethip4vxlan-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2BD forwarding with VXLAN over IPv4
+| | framesize=${64 + ${vxlan_overhead}} | rate=6.5mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-ethip4vxlan-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2BD forwarding with VXLAN over IPv4
+| | framesize=${1518 + ${vxlan_overhead}} | rate=700000pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-ethip4vxlan-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2BD forwarding with VXLAN over IPv4
+| | framesize=${9000 + ${vxlan_overhead}} | rate=100000pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-ndrchk.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-ndrchk.robot
new file mode 100644
index 0000000000..1a07df20a3
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-ndrchk.robot
@@ -0,0 +1,190 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | L2XCFWD | ENCAP | VXLAN | L2OVRLAY | IP4UNRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput L2XC with VXLANoIPv4 verify test\
+| ... | cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross-connect on TG-DUTn.
+| ... | Eth-IPv4-VXLAN-Eth-IPv4 is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. VXLAN tunnels are configured between L2XCs on DUT1 and DUT2.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and generated payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC7348.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4vxlan-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 2.4mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 2.4mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip4vxlan-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 787153pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 787153pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip4vxlan-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 137816pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 137816pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-ethip4vxlan-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 5.2mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 5.2mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip4vxlan-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 787153pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 787153pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip4vxlan-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 137816pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 137816pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-ethip4vxlan-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 8.4mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 8.4mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip4vxlan-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 787153pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 787153pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip4vxlan-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 137816pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 137816pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-ndrpdrdisc.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-ndrpdrdisc.robot
new file mode 100644
index 0000000000..8a4d7422b6
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-ndrpdrdisc.robot
@@ -0,0 +1,432 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | L2XCFWD | ENCAP | VXLAN | L2OVRLAY | IP4UNRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2XC with VXLANoIPv4 test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross-connect on TG-DUTn.
+| ... | Eth-IPv4-VXLAN-Eth-IPv4 is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. VXLAN tunnels are configured between L2XCs on DUT1 and DUT2.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | generated payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC7348.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4vxlan-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4vxlan-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4vxlan-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4vxlan-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4vxlan-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip4vxlan-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4vxlan-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4vxlan-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4vxlan-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4vxlan-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4vxlan-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip4vxlan-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4vxlan-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4vxlan-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4vxlan-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4vxlan-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4vxlan-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip4vxlan-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 50}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-pdrchk.robot b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-pdrchk.robot
new file mode 100644
index 0000000000..cfd119b300
--- /dev/null
+++ b/tests/vpp/perf/ip4_tunnels/10ge2p1x520-ethip4vxlan-l2xcbase-pdrchk.robot
@@ -0,0 +1,186 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | L2XCFWD | ENCAP | VXLAN | L2OVRLAY | IP4UNRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput L2XC with VXLANoIPv4 verify test\
+| ... | cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross-connect on TG-DUTn.
+| ... | Eth-IPv4-VXLAN-Eth-IPv4 is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. VXLAN tunnels are configured between L2XCs on DUT1 and DUT2.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-PDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-PDR value is periodically updated acording to
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 254 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and generated payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC7348.
+
+*** Variables ***
+| ${vxlan_overhead} | ${50}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| Check PDR for L2 xconnect with VXLAN over IPv4
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with ${wt} thread, ${wt} phy core,\
+| | ... | ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect with VXLANoIPv4 in 3-node circular topology
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4vxlan-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect with VXLAN over IPv4
+| | framesize=${64 + ${vxlan_overhead}} | rate=2.0mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-ethip4vxlan-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect with VXLAN over IPv4
+| | framesize=${1518 + ${vxlan_overhead}} | rate=500000pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-ethip4vxlan-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect with VXLAN over IPv4
+| | framesize=${9000 + ${vxlan_overhead}} | rate=100000pps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-ethip4vxlan-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect with VXLAN over IPv4
+| | framesize=${64 + ${vxlan_overhead}} | rate=5.0mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-ethip4vxlan-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect with VXLAN over IPv4
+| | framesize=${1518 + ${vxlan_overhead}} | rate=500000pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-ethip4vxlan-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect with VXLAN over IPv4
+| | framesize=${9000 + ${vxlan_overhead}} | rate=100000pps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-ethip4vxlan-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect with VXLAN over IPv4
+| | framesize=${64 + ${vxlan_overhead}} | rate=6.5mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-ethip4vxlan-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect with VXLAN over IPv4
+| | framesize=${1518 + ${vxlan_overhead}} | rate=500000pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-ethip4vxlan-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect with VXLAN over IPv4
+| | framesize=${9000 + ${vxlan_overhead}} | rate=100000pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrchk.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrchk.robot
new file mode 100644
index 0000000000..c619b6530b
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrchk.robot
@@ -0,0 +1,256 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.Cop
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | FEATURE | COPWHLIST
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv6 whitelist verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing, two static IPv6 /64 routes and IPv6 COP security whitelist
+| ... | ingress /24 filter entries applied on links TG - DUT1 and DUT2 - TG.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv6 header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 78 Byte frames using single trial throughput test
+| | ... | at 2x 3.1mpps.
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 3.1mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip6-ip6base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip6-ip6base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-78B-2t2c-ethip6-ip6base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 78 Byte frames using single trial throughput test
+| | ... | at 2x 5.9mpps.
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 5.9mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip6-ip6base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip6-ip6base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-78B-4t4c-ethip6-ip6base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 78 Byte frames using single trial throughput test
+| | ... | at 2x 9.4mpps.
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 9.4mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip6-ip6base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip6-ip6base-copwhtlistbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrpdrdisc.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrpdrdisc.robot
new file mode 100644
index 0000000000..6808603262
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrpdrdisc.robot
@@ -0,0 +1,565 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.Cop
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | FEATURE | COPWHLIST
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv6 whitelist test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing, two static IPv6 /64 routes and IPv6 COP security whitelist
+| ... | ingress /64 filter entries applied on links TG - DUT1 and DUT2 - TG.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv6 header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-78B-1t1c-ethip6-ip6base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip6-ip6base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip6-ip6base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip6-ip6base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip6-ip6base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-78B-2t2c-ethip6-ip6base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-78B-2t2c-ethip6-ip6base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip6-ip6base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip6-ip6base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip6-ip6base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip6-ip6base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-78B-4t4c-ethip6-ip6base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-78B-4t4c-ethip6-ip6base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip6-ip6base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip6-ip6base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip6-ip6base-copwhtlistbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip6-ip6base-copwhtlistbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv6 forwarding in 3-node circular topology
+| | And Add fib table | ${dut1} | 2001:1:: | 64 | 1 | local
+| | And Add fib table | ${dut2} | 2001:2:: | 64 | 1 | local
+| | And COP Add whitelist Entry | ${dut1} | ${dut1_if1} | ip6 | 1
+| | And COP Add whitelist Entry | ${dut2} | ${dut2_if2} | ip6 | 1
+| | And COP interface enable or disable | ${dut1} | ${dut1_if1} | enable
+| | And COP interface enable or disable | ${dut2} | ${dut2_if2} | enable
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-iacldstbase-ndrchk.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-iacldstbase-ndrchk.robot
new file mode 100644
index 0000000000..b82a356f1b
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-iacldstbase-ndrchk.robot
@@ -0,0 +1,210 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.Classify.Classify
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | FEATURE | IACLDST
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv6 whitelist verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing, two static IPv6 /64 routes and IPv6 iAcl security whitelist
+| ... | ingress /64 filter entries applied on links TG - DUT1 and DUT2 - TG.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT confiiguration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv6 header and generated
+| ... | payload.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 78 Byte frames using single trial throughput test
+| | ... | at 2x 3.2mpps.
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 3.2mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip6-ip6base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip6-ip6base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-78B-2t2c-ethip6-ip6base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 78 Byte frames using single trial throughput test
+| | ... | at 2x 5.7mpps.
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 5.7mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip6-ip6base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip6-ip6base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-78B-4t4c-ethip6-ip6base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 thread, 4 phy core, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 78 Byte frames using single trial throughput test
+| | ... | at 2x 9.2mpps.
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 9.2mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip6-ip6base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 thread, 4 phy core, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 1518 Byte frames using single trial throughput test
+| | ... | at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip6-ip6base-iacldstbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 thread, 4 phy core, 2 receive queue per NIC port. [Ver] Verify
+| | ... | ref-NDR for 9000 Byte frames using single trial throughput test
+| | ... | at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-iacldstbase-ndrpdrdisc.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-iacldstbase-ndrpdrdisc.robot
new file mode 100644
index 0000000000..6ee98fbcc4
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-iacldstbase-ndrpdrdisc.robot
@@ -0,0 +1,474 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.Classify.Classify
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | FEATURE | IACLDST
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv6 iAcl whitelist test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing, two static IPv6 /64 routes and IPv6 iAcl security whitelist
+| ... | ingress /64 filter entries applied on links TG - DUT1 and DUT2 - TG.
+| ... | DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv6 header and generated payload. MAC
+| ... | addresses are matching MAC addresses of the TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-78B-1t1c-ethip6-ip6base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip6-ip6base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip6-ip6base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip6-ip6base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip6-ip6base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-78B-2t2c-ethip6-ip6base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-78B-2t2c-ethip6-ip6base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip6-ip6base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip6-ip6base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip6-ip6base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip6-ip6base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-78B-4t4c-ethip6-ip6base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps.
+| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-78B-4t4c-ethip6-ip6base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 78 Byte frames using binary search start at 10GE linerate,
+| | ... | step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip6-ip6base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip6-ip6base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 1518 Byte frames using binary search start at 10GE linerate,
+| | ... | step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip6-ip6base-iacldstbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find NDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip6-ip6base-iacldstbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing and whitelist filters config with \
+| | ... | 4 threads, 4 phy cores, 2 receive queue per NIC port. [Ver] Find PDR
+| | ... | for 9000 Byte frames using binary search start at 10GE linerate,
+| | ... | step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | And Initialize IPv6 iAcl whitelist in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-ndrchk.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-ndrchk.robot
new file mode 100644
index 0000000000..8011baf632
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-ndrchk.robot
@@ -0,0 +1,191 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | BASE | IP6BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv6 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and two static IPv6 /64 route entries. DUT1 and DUT2 tested with
+| ... | 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv6 header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 3.9mpps.
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 3.9mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-78B-2t2c-ethip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 8.1mpps.
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 8.1mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-78B-4t4c-ethip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 9.4mpps.
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 9.4mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-ndrpdrdisc.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-ndrpdrdisc.robot
new file mode 100644
index 0000000000..3999677ffb
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-ndrpdrdisc.robot
@@ -0,0 +1,436 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | BASE | IP6BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv6 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and two static IPv6 /64 route entries. DUT1 and DUT2 tested with
+| ... | 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv6 header and static payload.
+| ... | MAC addresses are matching MAC addresses of the TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-78B-1t1c-ethip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-78B-2t2c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-78B-2t2c-ethip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-78B-4t4c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-78B-4t4c-ethip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-pdrchk.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-pdrchk.robot
new file mode 100644
index 0000000000..5ca64f5790
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6base-pdrchk.robot
@@ -0,0 +1,183 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | BASE | IP6BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput IPv6 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and two static IPv6 /64 route entries. DUT1 and DUT2 tested with
+| ... | 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-PDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-PDR value is periodically updated acording to
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv6 header and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Keywords ***
+| Check PDR for IPv6 routing
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with ${wt} thread, ${wt} phy core,\
+| | ... | ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 routing
+| | framesize=${78} | rate=3.9mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-ethip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 routing
+| | framesize=${1518} | rate=400000pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-ethip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 routing
+| | framesize=${9000} | rate=60000pps | wt=1 | rxq=1
+
+| tc04-78B-2t2c-ethip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 routing
+| | framesize=${78} | rate=6.0mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-ethip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 routing
+| | framesize=${1518} | rate=400000pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-ethip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 routing
+| | framesize=${9000} | rate=60000pps | wt=2 | rxq=1
+
+| tc07-78B-4t4c-ethip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 routing
+| | framesize=${78} | rate=6.1mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-ethip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 routing
+| | framesize=${1518} | rate=400000pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-ethip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 routing
+| | framesize=${9000} | rate=60000pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale200k-ndrchk.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale200k-ndrchk.robot
new file mode 100644
index 0000000000..a6f8c980e1
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale200k-ndrchk.robot
@@ -0,0 +1,201 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | SCALE | FIB_200K
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv6 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and 2x100k static IPv6 /64 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT confiiguration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 100k flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv6 header and static
+| ... | payload. Incrementing of IP.dst (IPv6 destination address) field is
+| ... | applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${rts_per_flow}= | ${100000}
+
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6dst${rts_per_flow}
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 2.3mpps.
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 2.3mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip6-ip6scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip6-ip6scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-78B-2t2c-ethip6-ip6scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 5.0mpps.
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 5.0mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip6-ip6scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip6-ip6scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-78B-4t4c-ethip6-ip6scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 5.7mpps.
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 5.7mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip6-ip6scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip6-ip6scale200k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale200k-ndrpdrdisc.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale200k-ndrpdrdisc.robot
new file mode 100644
index 0000000000..f64102384d
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale200k-ndrpdrdisc.robot
@@ -0,0 +1,457 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | SCALE | FIB_200K
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv6 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and 2x100k static IPv6 /64 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 100k flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv6 header withq IP and static payload.
+| ... | MAC addresses are matching MAC addresses of the TG node interfaces.
+| ... | Incrementing of IP.dst (IPv6 destination address) field is applied to
+| ... | both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+| ${rts_per_flow}= | ${100000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-78B-1t1c-ethip6-ip6scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip6-ip6scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip6-ip6scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip6-ip6scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip6-ip6scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-78B-2t2c-ethip6-ip6scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-78B-2t2c-ethip6-ip6scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip6-ip6scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip6-ip6scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip6-ip6scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip6-ip6scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-78B-4t4c-ethip6-ip6scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-78B-4t4c-ethip6-ip6scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip6-ip6scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip6-ip6scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip6-ip6scale200k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip6-ip6scale200k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale20k-ndrchk.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale20k-ndrchk.robot
new file mode 100644
index 0000000000..ebf642f9b5
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale20k-ndrchk.robot
@@ -0,0 +1,201 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | SCALE | FIB_20K
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv6 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and 2x10k static IPv6 /64 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT confiiguration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 10k flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv6 header and static
+| ... | payload. Incrementing of IP.dst (IPv6 destination address) field is
+| ... | applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${rts_per_flow}= | ${10000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 2.9mpps.
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 2.9mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip6-ip6scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip6-ip6scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-78B-2t2c-ethip6-ip6scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 7.0mpps.
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 7.0mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip6-ip6scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip6-ip6scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-78B-4t4c-ethip6-ip6scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 9.6mpps.
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 10.0mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip6-ip6scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip6-ip6scale20k-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale20k-ndrpdrdisc.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale20k-ndrpdrdisc.robot
new file mode 100644
index 0000000000..4337c0d6a3
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale20k-ndrpdrdisc.robot
@@ -0,0 +1,457 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | SCALE | FIB_20K
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv6 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and 2x10k static IPv6 /64 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 10k flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv6 header withq IP and static payload.
+| ... | MAC addresses are matching MAC addresses of the TG node interfaces.
+| ... | Incrementing of IP.dst (IPv6 destination address) field is applied to
+| ... | both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+| ${rts_per_flow}= | ${10000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-78B-1t1c-ethip6-ip6scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip6-ip6scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip6-ip6scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip6-ip6scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip6-ip6scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-78B-2t2c-ethip6-ip6scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-78B-2t2c-ethip6-ip6scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip6-ip6scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip6-ip6scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip6-ip6scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip6-ip6scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-78B-4t4c-ethip6-ip6scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-78B-4t4c-ethip6-ip6scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip6-ip6scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip6-ip6scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip6-ip6scale20k-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip6-ip6scale20k-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-ndrchk.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-ndrchk.robot
new file mode 100644
index 0000000000..c3411cebd8
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-ndrchk.robot
@@ -0,0 +1,210 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | SCALE | FIB_2M
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput IPv6 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and 2x1M static IPv6 /64 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT confiiguration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 1M flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv6 header and static
+| ... | payload. Incrementing of IP.dst (IPv6 destination address) field is
+| ... | applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${rts_per_flow}= | ${1000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 1.8mpps.
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 1.8mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc02-1518B-1t1c-ethip6-ip6scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip6-ip6scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc04-78B-2t2c-ethip6-ip6scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 4.0mpps.
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 4.0mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc05-1518B-2t2c-ethip6-ip6scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip6-ip6scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc07-78B-4t4c-ethip6-ip6scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 78 Byte
+| | ... | frames using single trial throughput test at 2x 6.8mpps.
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 6.8mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc08-1518B-4t4c-ethip6-ip6scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip6-ip6scale2m-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize}
+| | ... | ${traffic_profile}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-ndrpdrdisc.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-ndrpdrdisc.robot
new file mode 100644
index 0000000000..1259fd9130
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-ndrpdrdisc.robot
@@ -0,0 +1,457 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | SCALE | FIB_2M
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv6 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and 2x1M static IPv6 /64 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 1M flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv6 header withq IP and static payload.
+| ... | MAC addresses are matching MAC addresses of the TG node interfaces.
+| ... | Incrementing of IP.dst (IPv6 destination address) field is applied to
+| ... | both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+| ${rts_per_flow}= | ${1000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6dst${rts_per_flow}
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-78B-1t1c-ethip6-ip6scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip6-ip6scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip6-ip6scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip6-ip6scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip6-ip6scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-78B-2t2c-ethip6-ip6scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-78B-2t2c-ethip6-ip6scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip6-ip6scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip6-ip6scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip6-ip6scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip6-ip6scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-78B-4t4c-ethip6-ip6scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-78B-4t4c-ethip6-ip6scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 78 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip6-ip6scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip6-ip6scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip6-ip6scale2m-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip6-ip6scale2m-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-pdrchk.robot b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-pdrchk.robot
new file mode 100644
index 0000000000..977e73ff2a
--- /dev/null
+++ b/tests/vpp/perf/ip6/10ge2p1x520-ethip6-ip6scale2m-pdrchk.robot
@@ -0,0 +1,185 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | SCALE | FIB_2M
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput IPv6 routing verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and 2x1M static IPv6 /64 route entries. DUT1 and DUT2 tested
+| ... | with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-PDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-PDR value is periodically updated acording to
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT confiiguration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 1M flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv6 header and static
+| ... | payload. Incrementing of IP.dst (IPv6 destination address) field is
+| ... | applied to both streams.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${rts_per_flow}= | ${1000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6dst${rts_per_flow}
+
+*** Keywords ***
+| Check PDR for IPv6 scaled routing
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with ${wt} thread, ${wt} phy core,\
+| | ... | ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding with scaling in 3-node circular topology
+| | ... | ${rts_per_flow}
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 scaled routing
+| | framesize=${78} | rate=1.8mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-ethip6-ip6scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 scaled routing
+| | framesize=${1518} | rate=400000pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-ethip6-ip6scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 scaled routing
+| | framesize=${9000} | rate=60000pps | wt=1 | rxq=1
+
+| tc04-78B-2t2c-ethip6-ip6scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 scaled routing
+| | framesize=${78} | rate=4.0mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-ethip6-ip6scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 scaled routing
+| | framesize=${1518} | rate=400000pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-ethip6-ip6scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 scaled routing
+| | framesize=${900} | rate=138580pps | wt=2 | rxq=1
+
+| tc07-78B-4t4c-ethip6-ip6scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 scaled routing
+| | framesize=${78} | rate=6.4mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-ethip6-ip6scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 scaled routing
+| | framesize=${1518} | rate=400000pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-ethip6-ip6scale2m-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv6 scaled routing
+| | framesize=${9000} | rate=60000pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/ip6/40ge2p1xl710-ethip6-ip6base-ndrpdrdisc.robot b/tests/vpp/perf/ip6/40ge2p1xl710-ethip6-ip6base-ndrpdrdisc.robot
new file mode 100644
index 0000000000..4c45fdd266
--- /dev/null
+++ b/tests/vpp/perf/ip6/40ge2p1xl710-ethip6-ip6base-ndrpdrdisc.robot
@@ -0,0 +1,183 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-XL710 | ETH | IP6FWD | BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-XL710
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv6 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6 for IPv6 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6
+| ... | routing and two static IPv6 /64 route entries. DUT1 and DUT2 tested with
+| ... | 2p40GE NIC XL710 by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv6 header and static payload.
+| ... | MAC addresses are matching MAC addresses of the TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 18.75Mpps rate, step 100kpps.
+| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc03-1518B-1t1c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 24.5G rate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc07-78B-2t2c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 18.75Mpps rate, step 100kpps.
+| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc09-1518B-2t2c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 24.5G rate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc13-78B-4t4c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 78 Byte frames
+| | ... | using binary search start at 18.75Mpps rate, step 100kpps.
+| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc15-1518B-4t4c-ethip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 24.5G rate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize IPv6 forwarding in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
diff --git a/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-ndrchk.robot b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-ndrchk.robot
new file mode 100644
index 0000000000..6448d4390f
--- /dev/null
+++ b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-ndrchk.robot
@@ -0,0 +1,266 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | IP6FWD | ENCAP | LISP | IP4UNRLAY | IP6OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput Lisp tunnel verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv4 on DUT1-DUT2,\
+| ... | Eth-IPv6 on TG-DUTn for IPv6 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between\
+| ... | DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic\
+| ... | by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies\
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet\
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to\
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long\
+| ... | performance tests for the same DUT confiiguration. Test packets are\
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3\
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with\
+| ... | all packets containing Ethernet header, IPv4 header or IPv6 header with\
+| ... | IP protocol=61 and generated payload.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6lispip4-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x 1.75mpps.
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 1.75mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1460B-1t1c-ethip6lispip4-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x 720000pps.
+| | [Tags] | 1460B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1460}
+| | ${rate}= | Set Variable | 720000pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip6lispip4-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-78B-2t2c-ethip6lispip4-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x 3.42mpps.
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 3.42mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1460B-2t2c-ethip6lispip4-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x 720000pps.
+| | [Tags] | 1460B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1460}
+| | ${rate}= | Set Variable | 720000pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip6lispip4-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-78B-4t4c-ethip6lispip4-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x 3.42mpps.
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 3.42mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1460B-4t4c-ethip6lispip4-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x 720000pps.
+| | [Tags] | 1460B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1460}
+| | ${rate}= | Set Variable | 720000pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip6lispip4-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-ndrpdrdisc.robot b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-ndrpdrdisc.robot
new file mode 100644
index 0000000000..bcf0711c94
--- /dev/null
+++ b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-ndrpdrdisc.robot
@@ -0,0 +1,596 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | IP6FWD | ENCAP | LISP | IP4UNRLAY | IP6OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC6830: Pkt throughput Lisp test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv4 on DUT1-DUT2,\
+| ... | Eth-IPv6 on TG-DUTn for IPv6 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between\
+| ... | DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic\
+| ... | by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop\
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage\
+| ... | of packets transmitted. NDR and PDR are discovered for different\
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6lispip4-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-78B-1t1c-ethip6lispip4-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1460B-1t1c-ethip6lispip4-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 1460B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1460B-1t1c-ethip6lispip4-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1460B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip6lispip4-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip6lispip4-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-78B-2t2c-ethip6lispip4-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-78B-2t2c-ethip6lispip4-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1460B-2t2c-ethip6lispip4-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 1460B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1460B-2t2c-ethip6lispip4-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1460B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip6lispip4-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip6lispip4-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-78B-4t4c-ethip6lispip4-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-78B-4t4c-ethip6lispip4-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1460B-4t4c-ethip6lispip4-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 1460B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1460B-4t4c-ethip6lispip4-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1460B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip6lispip4-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip6lispip4-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 48}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-pdrchk.robot b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-pdrchk.robot
new file mode 100644
index 0000000000..55c5a19e70
--- /dev/null
+++ b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip4-ip6base-pdrchk.robot
@@ -0,0 +1,193 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | IP6FWD | ENCAP | LISP | IP4UNRLAY | IP6OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput Lisp tunnel verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv4 on DUT1-DUT2,\
+| ... | Eth-IPv6 on TG-DUTn for IPv6 routing over LISPoIPv4 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv4 tunnel is configured between\
+| ... | DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic\
+| ... | by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies\
+| ... | DUTs' throughput at ref-PDR (reference Non Drop Rate) with zero packet\
+| ... | loss tolerance. Ref-PDR value is periodically updated acording to\
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long\
+| ... | performance tests for the same DUT confiiguration. Test packets are\
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3\
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with\
+| ... | all packets containing Ethernet header, IPv4 header or IPv6 header with\
+| ... | IP protocol=61 and generated payload.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Keywords ***
+| Check PDR for Lisp IPv6 over IPv4 forwarding
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with ${wt} thread, ${wt} phy core,\
+| | ... | ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 over IPv4 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6o4} | ${dut1_to_tg_ip6o4} | ${dut2_to_dut1_ip6o4}
+| | ... | ${dut2_to_tg_ip6o4} | ${tg_prefix6o4} | ${dut_prefix6o4}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6o4_eid} | ${dut2_ip6o4_eid}
+| | ... | ${dut1_ip6o4_static_adjacency} | ${dut2_ip6o4_static_adjacency}
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6lispip4-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv4 forwarding
+| | framesize=${78} | rate=1.75mpps | wt=1 | rxq=1
+
+| tc02-1460B-1t1c-ethip6lispip4-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1460B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv4 forwarding
+| | framesize=${1460} | rate=37000pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-ethip6lispip4-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv4 forwarding
+| | framesize=${9000} | rate=60000pps | wt=1 | rxq=1
+
+| tc04-78B-2t2c-ethip6lispip4-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv4 forwarding
+| | framesize=${78} | rate=3.42mpps | wt=2 | rxq=1
+
+| tc05-1460B-2t2c-ethip6lispip4-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1460B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv4 forwarding
+| | framesize=${1460} | rate=370000pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-ethip6lispip4-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv4 forwarding
+| | framesize=${9000} | rate=60000pps | wt=2 | rxq=1
+
+| tc07-78B-4t4c-ethip6lispip4-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv4 forwarding
+| | framesize=${78} | rate=3.42mpps | wt=4 | rxq=2
+
+| tc08-1460B-4t4c-ethip6lispip4-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1460B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv4 forwarding
+| | framesize=${1460} | rate=370000pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-ethip6lispip4-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv4 forwarding
+| | framesize=${9000} | rate=60000pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-ndrchk.robot b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-ndrchk.robot
new file mode 100644
index 0000000000..2e44791318
--- /dev/null
+++ b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-ndrchk.robot
@@ -0,0 +1,266 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | IP6FWD | ENCAP | LISP | IP6UNRLAY | IP6OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput Lisp tunnel verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv6 on DUT1-DUT2,\
+| ... | Eth-IPv6-ICMPv6 on TG-DUTn for IPv6 routing over LISPoIPv6 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured\
+| ... | between DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520\
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies\
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet\
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to\
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long\
+| ... | performance tests for the same DUT confiiguration. Test packets are\
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3\
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with\
+| ... | all packets containing Ethernet header, IPv6 header with\
+| ... | IP protocol=61 and generated payload.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6lispip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x 1.56mpps.
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 1.56mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1460B-1t1c-ethip6lispip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x 740000pps.
+| | [Tags] | 1460B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1460}
+| | ${rate}= | Set Variable | 740000pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-ethip6lispip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-78B-2t2c-ethip6lispip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 thread, 2 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x 3.2mpps.
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 3.2mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1460B-2t2c-ethip6lispip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x 740000pps.
+| | [Tags] | 1460B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1460}
+| | ${rate}= | Set Variable | 740000pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-ethip6lispip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-78B-4t4c-ethip6lispip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x 3.2mpps.
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${78}
+| | ${rate}= | Set Variable | 3.2mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1460B-4t4c-ethip6lispip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x 740000pps.
+| | [Tags] | 1460B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1460}
+| | ${rate}= | Set Variable | 740000pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-ethip6lispip6-ip6base-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-ndrpdrdisc.robot b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-ndrpdrdisc.robot
new file mode 100644
index 0000000000..f29f4e4626
--- /dev/null
+++ b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-ndrpdrdisc.robot
@@ -0,0 +1,596 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | IP6FWD | ENCAP | LISP | IP6UNRLAY | IP6OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC6830: Pkt throughput Lisp test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv6 on DUT1-DUT2,\
+| ... | Eth-IPv6 on TG-DUTn for IPv6 routing over LISPoIPv6 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured between\
+| ... | DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic\
+| ... | by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop\
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage\
+| ... | of packets transmitted. NDR and PDR are discovered for different\
+| ... | Ethernet L2 frame sizes using either binary search or linear search\
+| ... | *[Ref] Applicable standard specifications:* RFC6830.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6lispip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-78B-1t1c-ethip6lispip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1460B-1t1c-ethip6lispip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 1460B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1460B-1t1c-ethip6lispip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1460B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip6lispip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-ethip6lispip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 1 thread, 1 phy core, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-78B-2t2c-ethip6lispip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-78B-2t2c-ethip6lispip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1460B-2t2c-ethip6lispip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps.
+| | [Tags] | 1460B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1460B-2t2c-ethip6lispip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1460B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip6lispip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-ethip6lispip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 2 threads, 2 phy cores, 1 receive queue per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-78B-4t4c-ethip6lispip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-78B-4t4c-ethip6lispip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 78 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${78}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1460B-4t4c-ethip6lispip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 100kpps.
+| | [Tags] | 1460B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1460B-4t4c-ethip6lispip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 1460 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1460B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1460}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip6lispip6-ip6base-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-ethip6lispip6-ip6base-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv6 LISP remote static mappings and whitelist\
+| | ... | filters config with 4 threads, 4 phy cores, 2 receive queues per NIC\
+| | ... | port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start\
+| | ... | at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-pdrchk.robot b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-pdrchk.robot
new file mode 100644
index 0000000000..717efedf45
--- /dev/null
+++ b/tests/vpp/perf/ip6_tunnels/10ge2p1x520-ethip6lispip6-ip6base-pdrchk.robot
@@ -0,0 +1,193 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/overlay/lisp_static_adjacency.robot
+| Variables | resources/test_data/lisp/performance/lisp_static_adjacency.py
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | IP6FWD | ENCAP | LISP | IP6UNRLAY | IP6OVRLAY
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput Lisp tunnel verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-LISP-IPv6 on DUT1-DUT2,\
+| ... | Eth-IPv6-ICMPv6 on TG-DUTn for IPv6 routing over LISPoIPv6 tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\
+| ... | routing and static routes. LISPoIPv6 tunnel is configured\
+| ... | between DUT1 and DUT2. DUT1 and DUT2 tested with 2p10GE NIC X520\
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies\
+| ... | DUTs' throughput at ref-PDR (reference Non Drop Rate) with zero packet\
+| ... | loss tolerance. Ref-PDR value is periodically updated acording to\
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long\
+| ... | performance tests for the same DUT confiiguration. Test packets are\
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3\
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with\
+| ... | all packets containing Ethernet header, IPv6 header with\
+| ... | IP protocol=61 and generated payload.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253
+
+*** Keywords ***
+| Check PDR for Lisp IPv6 over IPv6 forwarding
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with ${wt} thread, ${wt} phy core,\
+| | ... | ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize LISP IPv6 forwarding in 3-node circular topology
+| | ... | ${dut1_to_dut2_ip6} | ${dut1_to_tg_ip6} | ${dut2_to_dut1_ip6}
+| | ... | ${dut2_to_tg_ip6} | ${prefix6}
+| | And Configure LISP topology in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${NONE}
+| | ... | ${dut2} | ${dut2_if1} | ${NONE}
+| | ... | ${duts_locator_set} | ${dut1_ip6_eid} | ${dut2_ip6_eid}
+| | ... | ${dut1_ip6_static_adjacency} | ${dut2_ip6_static_adjacency}
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-78B-1t1c-ethip6lispip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv6 forwarding
+| | framesize=${78} | rate=1.56mpps | wt=1 | rxq=1
+
+| tc02-1460B-1t1c-ethip6lispip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1460B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv6 forwarding
+| | framesize=${1460} | rate=370000pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-ethip6lispip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv6 forwarding
+| | framesize=${9000} | rate=60000pps | wt=1 | rxq=1
+
+| tc04-78B-2t2c-ethip6lispip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 thread, 2 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv6 forwarding
+| | framesize=${78} | rate=3.2mpps | wt=2 | rxq=1
+
+| tc05-1460B-2t2c-ethip6lispip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1460B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv6 forwarding
+| | framesize=${1460} | rate=370000pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-ethip6lispip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv6 forwarding
+| | framesize=${9000} | rate=60000pps | wt=2 | rxq=1
+
+| tc07-78B-4t4c-ethip6lispip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 78 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 78B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv6 forwarding
+| | framesize=${78} | rate=3.2mpps | wt=4 | rxq=2
+
+| tc08-1460B-4t4c-ethip6lispip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1460 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1460B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv6 forwarding
+| | framesize=${1460} | rate=370000pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-ethip6lispip6-ip6base-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs LISP tunnel config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for Lisp IPv6 over IPv6 forwarding
+| | framesize=${9000} | rate=60000pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/l2/10ge2p1vic1227-eth-l2bdbasemaclrn-ndrpdrdisc.robot b/tests/vpp/perf/l2/10ge2p1vic1227-eth-l2bdbasemaclrn-ndrpdrdisc.robot
new file mode 100644
index 0000000000..51eb235f24
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1vic1227-eth-l2bdbasemaclrn-ndrpdrdisc.robot
@@ -0,0 +1,288 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Cisco-VIC-1227 | ETH | L2BDMACLRN | BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Cisco-VIC-1227
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2BD test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-\
+| ... | domain and MAC learning enabled. DUT1 and DUT2 tested with 2p10GE NIC
+| ... | Cisco-VIC-1227.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop\
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage\
+| ... | of packets transmitted. NDR and PDR are discovered for different\
+| ... | Ethernet L2 frame sizes using either binary search or linear search\
+| ... | algorithms with configured starting rate and final step that determines\
+| ... | throughput measurement resolution. Test packets are generated by TG on\
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups\
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets\
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static\
+| ... | payload. MAC addresses are matching MAC addresses of the TG node\
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Cisco-VIC-1227 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| L2 Bridge Domain NDR Binary Search
+| | [Arguments] | ${framesize} | ${min_rate} | ${wt} | ${rxq}
+| | # Test Variables required for test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${min_rate}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Documentation | [Cfg] DUT runs L2BD switching config with ${wt}\
+| | Set Test Documentation | thread, ${wt} phy core, ${rxq}\ | append=True
+| | Set Test Documentation | receive queue per NIC port. | append=True
+| | Set Test Documentation | [Ver] Find NDR for ${framesize} Byte\ | append=True
+| | Set Test Documentation | frames using binary search start at\ | append=True
+| | Set Test Documentation | 10GE linerate, step ${threshold}pps. | append=True
+| | Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | Add PCI devices to DUTs in 3-node single link topology
+| | Run Keyword If | ${framesize} < ${1522} | Add no multi seg to all DUTs
+| | Apply startup configuration on all VPP DUTs
+| | Initialize L2 bridge domain in 3-node circular topology
+| | Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| L2 Bridge Domain PDR Binary Search
+| | [Arguments] | ${framesize} | ${min_rate} | ${wt} | ${rxq}
+| | # Test Variables required for test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${min_rate}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Set Test Documentation | [Cfg] DUT runs L2BD switching config with ${wt}\
+| | Set Test Documentation | thread, ${wt} phy core, ${rxq}\ | append=True
+| | Set Test Documentation | receive queue per NIC port. | append=True
+| | Set Test Documentation | [Ver] Find PDR for ${framesize} Byte\ | append=True
+| | Set Test Documentation | frames using binary search start at\ | append=True
+| | Set Test Documentation | 10GE linerate, step ${threshold}pps, | append=True
+| | Set Test Documentation | LT=${perf_pdr_loss_acceptance} | append=True
+| | Set Test Documentation | ${perf_pdr_loss_acceptance_type}. | append=True
+| | Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | Add PCI devices to DUTs in 3-node single link topology
+| | Run Keyword If | ${framesize} < ${1522} | Add no multi seg to all DUTs
+| | Apply startup configuration on all VPP DUTs
+| | Initialize L2 bridge domain in 3-node circular topology
+| | Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=1 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc02-64B-1t1c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=1 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc03-1518B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=1 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc04-1518B-1t1c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=1 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc05-9000B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=1 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc06-9000B-1t1c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=1 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=2 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc08-64B-2t2c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=2 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc09-1518B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=2 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc10-1518B-2t2c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=2 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc11-9000B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=2 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc12-9000B-2t2c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=2 | rxq=1
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc13-64B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=4 | rxq=2
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc14-64B-4t4c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=4 | rxq=2
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc15-1518B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=4 | rxq=2
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc16-1518B-4t4c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=4 | rxq=2
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc17-9000B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=4 | rxq=2
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc18-9000B-4t4c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=4 | rxq=2
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Template] | L2 Bridge Domain PDR Binary Search
diff --git a/tests/vpp/perf/l2/10ge2p1x520-dot1ad-l2xcbase-ndrchk.robot b/tests/vpp/perf/l2/10ge2p1x520-dot1ad-l2xcbase-ndrchk.robot
new file mode 100644
index 0000000000..4b4162581a
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x520-dot1ad-l2xcbase-ndrchk.robot
@@ -0,0 +1,279 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | L2XCFWD | BASE | DOT1AD
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput L2XC with 802.1ad verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 xconnect.
+| ... | 802.1ad tagging is applied on link between DUT1 and DUT2 with inner 4B
+| ... | vlan tag (id=100) and outer 4B vlan tag (id=200).
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${subid}= | 10
+| ${outer_vlan_id}= | 100
+| ${inner_vlan_id}= | 200
+| ${type_subif}= | two_tags
+| ${tag_rewrite}= | pop-2
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-dot1ad-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC with 802.1ad config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 4.0mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 4.0mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1514B-1t1c-dot1ad-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC with 802.1ad config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1514 Byte
+| | ... | frames using single trial throughput test at 2x 810635pps.
+| | [Tags] | 1514B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1514}
+| | ${rate}= | Set Variable | 810635pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-dot1ad-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC with 802.1ad config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138458pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138458pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-dot1ad-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC with 802.1ad config with 2 thread, 2 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 8.5mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 8.5mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1514B-2t2c-dot1ad-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC with 802.1ad config with 2 thread, 2 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1514 Byte
+| | ... | frames using single trial throughput test at 2x 810635pps.
+| | [Tags] | 1514B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1514}
+| | ${rate}= | Set Variable | 810635pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-dot1ad-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC with 802.1ad config with 2 thread, 2 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138458pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138458pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-dot1ad-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC with 802.1ad config with 4 thread, 4 phy core, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 8.6mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 8.6mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1514B-4t4c-dot1ad-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC with 802.1ad config with 4 thread, 4 phy core, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 1514 Byte
+| | ... | frames using single trial throughput test at 2x 810635pps.
+| | [Tags] | 1514B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1514}
+| | ${rate}= | Set Variable | 810635pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-dot1ad-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC with 802.1ad config with 4 thread, 4 phy core, \
+| | ... | 2 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138458pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138458pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/l2/10ge2p1x520-dot1ad-l2xcbase-ndrpdrdisc.robot b/tests/vpp/perf/l2/10ge2p1x520-dot1ad-l2xcbase-ndrpdrdisc.robot
new file mode 100644
index 0000000000..17b907c91b
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x520-dot1ad-l2xcbase-ndrpdrdisc.robot
@@ -0,0 +1,606 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | L2XCFWD | BASE | DOT1AD
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2XC with 802.1ad test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 xconnect.
+| ... | 802.1ad tagging is applied on link between DUT1 and DUT2 with inner 4B
+| ... | vlan tag (id=100) and outer 4B vlan tag (id=200).
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and
+| ... | static payload. MAC addresses are matching MAC addresses of the TG
+| ... | node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${subid}= | 10
+| ${outer_vlan_id}= | 100
+| ${inner_vlan_id}= | 200
+| ${type_subif}= | two_tags
+| ${tag_rewrite}= | pop-2
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-dot1ad-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-dot1ad-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1514B-1t1c-dot1ad-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1514 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1514B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1514}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1514B-1t1c-dot1ad-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1514 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1514B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1514}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-dot1ad-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-dot1ad-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-dot1ad-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-dot1ad-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1514B-2t2c-dot1ad-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1514 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1514B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1514}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1514B-2t2c-dot1ad-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1514 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1514B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1514}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-dot1ad-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-dot1ad-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-dot1ad-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-dot1ad-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1514B-4t4c-dot1ad-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1514 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1514B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1514}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1514B-4t4c-dot1ad-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1514 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1514B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1514}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-dot1ad-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-dot1ad-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC forwarding config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 8}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | ... | ${outer_vlan_id} | ${inner_vlan_id} | ${type_subif}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/l2/10ge2p1x520-dot1q-l2xcbase-ndrchk.robot b/tests/vpp/perf/l2/10ge2p1x520-dot1q-l2xcbase-ndrchk.robot
new file mode 100644
index 0000000000..d3a67f3777
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x520-dot1q-l2xcbase-ndrchk.robot
@@ -0,0 +1,266 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | L2XCFWD | BASE | DOT1Q
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput L2XC with 802.1q verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross connect. 802.1q
+| ... | tagging is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${subid}= | 10
+| ${tag_rewrite}= | pop-1
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-dot1q-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 4.0mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 4.0mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-dot1q-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 720000pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 720000pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-dot1q-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-dot1q-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 8.7mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 8.7mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-dot1q-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 720000pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 720000pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-dot1q-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-dot1q-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 10.3mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.3mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-dot1q-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 720000pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 720000pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-dot1q-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 120000pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 120000pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/l2/10ge2p1x520-dot1q-l2xcbase-ndrpdrdisc.robot b/tests/vpp/perf/l2/10ge2p1x520-dot1q-l2xcbase-ndrpdrdisc.robot
new file mode 100644
index 0000000000..a5a8580f29
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x520-dot1q-l2xcbase-ndrpdrdisc.robot
@@ -0,0 +1,584 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | L2XCFWD | BASE | DOT1Q
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2XC with 802.1q test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross connect. 802.1q
+| ... | tagging is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${subid}= | 10
+| ${tag_rewrite}= | pop-1
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-dot1q-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-dot1q-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-dot1q-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-dot1q-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-dot1q-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-dot1q-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-dot1q-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-dot1q-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-dot1q-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-dot1q-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-dot1q-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-dot1q-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-dot1q-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-dot1q-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-dot1q-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-dot1q-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-dot1q-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-dot1q-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + 4}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Set interfaces in path in 3-node circular topology up
+| | When Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | And Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | And Connect interfaces and VLAN sub-interfaces using L2XC
+| | ... | ${dut1} | ${dut1_if1} | ${subif_index_1}
+| | ... | ${dut2} | ${dut2_if2} | ${subif_index_2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-ndrchk.robot b/tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-ndrchk.robot
new file mode 100644
index 0000000000..598d45f6b6
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-ndrchk.robot
@@ -0,0 +1,192 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | L2BDMACLRN | BASE | L2BDBASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput L2BD verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domain and MAC learning enabled. DUT1 and DUT2 tested with 2p10GE NIC
+| ... | X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 4.9mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 4.9mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-eth-l2bdbasemaclrn-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-eth-l2bdbasemaclrn-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-eth-l2bdbasemaclrn-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 10.4mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-eth-l2bdbasemaclrn-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-eth-l2bdbasemaclrn-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-eth-l2bdbasemaclrn-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 10.4mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-eth-l2bdbasemaclrn-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-eth-l2bdbasemaclrn-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-ndrpdrdisc.robot b/tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-ndrpdrdisc.robot
new file mode 100644
index 0000000000..5234981c14
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-ndrpdrdisc.robot
@@ -0,0 +1,274 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | L2BDMACLRN | BASE | L2BDBASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2BD test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-\
+| ... | domain and MAC learning enabled. DUT1 and DUT2 tested with 2p10GE NI
+| ... | X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop\
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage\
+| ... | of packets transmitted. NDR and PDR are discovered for different\
+| ... | Ethernet L2 frame sizes using either binary search or linear search\
+| ... | algorithms with configured starting rate and final step that determines\
+| ... | throughput measurement resolution. Test packets are generated by TG on\
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups\
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets\
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static\
+| ... | payload. MAC addresses are matching MAC addresses of the TG node\
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| L2 Bridge Domain NDR Binary Search
+| | [Arguments] | ${framesize} | ${min_rate} | ${wt} | ${rxq}
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${min_rate}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | Add PCI devices to DUTs in 3-node single link topology
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs
+| | Apply startup configuration on all VPP DUTs
+| | Initialize L2 bridge domain in 3-node circular topology
+| | Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| L2 Bridge Domain PDR Binary Search
+| | [Arguments] | ${framesize} | ${min_rate} | ${wt} | ${rxq}
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${min_rate}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | Add PCI devices to DUTs in 3-node single link topology
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs
+| | Apply startup configuration on all VPP DUTs
+| | Initialize L2 bridge domain in 3-node circular topology
+| | Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=1 | rxq=1
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc02-64B-1t1c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=1 | rxq=1
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc03-1518B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=1 | rxq=1
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc04-1518B-1t1c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=1 | rxq=1
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc05-9000B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=1 | rxq=1
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc06-9000B-1t1c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=1 | rxq=1
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=2 | rxq=1
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc08-64B-2t2c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=2 | rxq=1
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc09-1518B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=2 | rxq=1
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc10-1518B-2t2c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=2 | rxq=1
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc11-9000B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=2 | rxq=1
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc12-9000B-2t2c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=2 | rxq=1
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc13-64B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=4 | rxq=2
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc14-64B-4t4c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=4 | rxq=2
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc15-1518B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=4 | rxq=2
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc16-1518B-4t4c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=4 | rxq=2
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc17-9000B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=4 | rxq=2
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc18-9000B-4t4c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=4 | rxq=2
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
diff --git a/tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-pdrchk.robot b/tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-pdrchk.robot
new file mode 100644
index 0000000000..58512392f7
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x520-eth-l2bdbasemaclrn-pdrchk.robot
@@ -0,0 +1,184 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | L2BDMACLRN | BASE | L2BDBASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput L2BD verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domain and MAC learning enabled. DUT1 and DUT2 tested with 2p10GE NIC
+| ... | X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-PDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-PDR value is periodically updated acording to
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 254 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| Check PDR for L2 bridge domain
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with ${wt} thread, ${wt} phy core,\
+| | ... | ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain
+| | framesize=${64} | rate=4.9mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-eth-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain
+| | framesize=${1518} | rate=772105pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-eth-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain
+| | framesize=${9000} | rate=110000pps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-eth-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 2 thread, 2 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain
+| | framesize=${64} | rate=10.4mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-eth-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 2 thread, 2 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain
+| | framesize=${1518} | rate=812743pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-eth-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 2 thread, 2 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain
+| | framesize=${9000} | rate=100000pps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-eth-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 4 thread, 4 phy core,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain
+| | framesize=${64} | rate=10.4mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-eth-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 4 thread, 4 phy core,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain
+| | framesize=${1518} | rate=812743pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-eth-l2bdbasemaclrn-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD config with 4 thread, 4 phy core,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain
+| | framesize=${9000} | rate=138580pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-ndrchk.robot b/tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-ndrchk.robot
new file mode 100644
index 0000000000..13a2b7577f
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-ndrchk.robot
@@ -0,0 +1,192 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | L2XCFWD | BASE | L2XCBASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance ndrchk test
+| ...
+| Documentation | *Reference NDR throughput L2XC verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross connect.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-NDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-NDR value is periodically updated acording to
+| ... | formula: ref-NDR = 0.9x NDR, where NDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 5.9mpps.
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 5.9mpps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc02-1518B-1t1c-eth-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc03-9000B-1t1c-eth-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc04-64B-2t2c-eth-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 10.4mpps.
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc05-1518B-2t2c-eth-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc06-9000B-2t2c-eth-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc07-64B-4t4c-eth-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 64 Byte
+| | ... | frames using single trial throughput test at 2x 10.4mpps.
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${64}
+| | ${rate}= | Set Variable | 10.4mpps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc08-1518B-4t4c-eth-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 1518 Byte
+| | ... | frames using single trial throughput test at 2x 812743pps.
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${1518}
+| | ${rate}= | Set Variable | 812743pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
+
+| tc09-9000B-4t4c-eth-l2xcbase-ndrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Verify ref-NDR for 9000 Byte
+| | ... | frames using single trial throughput test at 2x 138580pps.
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ${framesize}= | Set Variable | ${9000}
+| | ${rate}= | Set Variable | 138580pps
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Traffic should pass with no loss | ${perf_trial_duration} | ${rate}
+| | ... | ${framesize} | ${traffic_profile}
diff --git a/tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-ndrpdrdisc.robot b/tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-ndrpdrdisc.robot
new file mode 100644
index 0000000000..4c0e0a18b2
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-ndrpdrdisc.robot
@@ -0,0 +1,483 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | L2XCFWD | BASE | L2XCBASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2XC test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross connect.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-9000B-1t1c-eth-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-9000B-2t2c-eth-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps.
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-9000B-4t4c-eth-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte frames
+| | ... | using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc19-IMIX-1t1c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame size
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc20-IMIX-1t1c-eth-l2xcbase-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame size
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-pdrchk.robot b/tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-pdrchk.robot
new file mode 100644
index 0000000000..72589f6ca1
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x520-eth-l2xcbase-pdrchk.robot
@@ -0,0 +1,184 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | L2XCFWD | BASE | L2XCBASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test
+| ...
+| Documentation | *Reference PDR throughput L2XC verify test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross connect.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. DUT1 and DUT2 tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* In short performance tests, TG verifies
+| ... | DUTs' throughput at ref-PDR (reference Non Drop Rate) with zero packet
+| ... | loss tolerance. Ref-PDR value is periodically updated acording to
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 254 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| Check PDR for L2 xconnect
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with ${wt} thread, ${wt} phy core,\
+| | ... | ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect
+| | framesize=${64} | rate=5.9mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-eth-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect
+| | framesize=${1518} | rate=812743pps | wt=1 | rxq=1
+
+| tc03-9000B-1t1c-eth-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect
+| | framesize=${9000} | rate=138580pps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-eth-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect
+| | framesize=${64} | rate=10.4mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-eth-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect
+| | framesize=${1518} | rate=812743pps | wt=2 | rxq=1
+
+| tc06-9000B-2t2c-eth-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect
+| | framesize=${9000} | rate=100000pps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-eth-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect
+| | framesize=${64} | rate=10.4mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-eth-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect
+| | framesize=${1518} | rate=812743pps | wt=4 | rxq=2
+
+| tc09-9000B-4t4c-eth-l2xcbase-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-NDR for 9000 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 9000B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 xconnect
+| | framesize=${9000} | rate=138580pps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/l2/10ge2p1x710-eth-l2bdbasemaclrn-ndrpdrdisc.robot b/tests/vpp/perf/l2/10ge2p1x710-eth-l2bdbasemaclrn-ndrpdrdisc.robot
new file mode 100644
index 0000000000..166e1c7a4f
--- /dev/null
+++ b/tests/vpp/perf/l2/10ge2p1x710-eth-l2bdbasemaclrn-ndrpdrdisc.robot
@@ -0,0 +1,274 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X710 | ETH | L2BDMACLRN | BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X710
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2BD test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-\
+| ... | domain and MAC learning enabled. DUT1 and DUT2 tested with 2p10GE NIC
+| ... | X710 by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop\
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage\
+| ... | of packets transmitted. NDR and PDR are discovered for different\
+| ... | Ethernet L2 frame sizes using either binary search or linear search\
+| ... | algorithms with configured starting rate and final step that determines\
+| ... | throughput measurement resolution. Test packets are generated by TG on\
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups\
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets\
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static\
+| ... | payload. MAC addresses are matching MAC addresses of the TG node\
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X710 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| L2 Bridge Domain NDR Binary Search
+| | [Arguments] | ${framesize} | ${min_rate} | ${wt} | ${rxq}
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${min_rate}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | Add PCI devices to DUTs in 3-node single link topology
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs
+| | Apply startup configuration on all VPP DUTs
+| | Initialize L2 bridge domain in 3-node circular topology
+| | Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| L2 Bridge Domain PDR Binary Search
+| | [Arguments] | ${framesize} | ${min_rate} | ${wt} | ${rxq}
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${min_rate}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | Add PCI devices to DUTs in 3-node single link topology
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs
+| | Apply startup configuration on all VPP DUTs
+| | Initialize L2 bridge domain in 3-node circular topology
+| | Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=1 | rxq=1
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc02-64B-1t1c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=1 | rxq=1
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc03-1518B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=1 | rxq=1
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc04-1518B-1t1c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=1 | rxq=1
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc05-9000B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=1 | rxq=1
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc06-9000B-1t1c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=1 | rxq=1
+| | [Tags] | 9000B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=2 | rxq=1
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc08-64B-2t2c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=2 | rxq=1
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc09-1518B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=2 | rxq=1
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc10-1518B-2t2c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=2 | rxq=1
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc11-9000B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=2 | rxq=1
+| | [Tags] | 9000B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc12-9000B-2t2c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=2 | rxq=1
+| | [Tags] | 9000B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc13-64B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=4 | rxq=2
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc14-64B-4t4c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=4 | rxq=2
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 100kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc15-1518B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=4 | rxq=2
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc16-1518B-4t4c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=4 | rxq=2
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
+
+| tc17-9000B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=4 | rxq=2
+| | [Tags] | 9000B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc18-9000B-4t4c-eth-l2bdbasemaclrn-pdrdisc
+| | ... | framesize=${9000} | min_rate=${10000} | wt=4 | rxq=2
+| | [Tags] | 9000B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 9000 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | [Template] | L2 Bridge Domain PDR Binary Search
diff --git a/tests/vpp/perf/l2/40ge2p1vic1385-eth-l2bdbasemaclrn-ndrpdrdisc.robot b/tests/vpp/perf/l2/40ge2p1vic1385-eth-l2bdbasemaclrn-ndrpdrdisc.robot
new file mode 100644
index 0000000000..6d39fc169a
--- /dev/null
+++ b/tests/vpp/perf/l2/40ge2p1vic1385-eth-l2bdbasemaclrn-ndrpdrdisc.robot
@@ -0,0 +1,352 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Cisco-VIC-1385 | ETH | L2BDMACLRN | BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Cisco-VIC-1385
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2BD test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domain and MAC learning enabled. DUT1 and DUT2 tested with 2p40GE NIC
+| ... | NIC_Cisco-VIC-1385.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# XL710-DA2 (TG) bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps (TG) limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at\
+| | ... | 18.75Mpps rate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at\
+| | ... | 18.75Mpps rate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at\
+| | ... | 24.5G rate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc05-9000B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at\
+| | ... | 24.5G rate, step 10kpps.
+| | ...
+| | [Tags] | 9000B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at\
+| | ... | 18.75Mpps rate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2bdbasemaclrn-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at\
+| | ... | 18.75Mpps rate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDR | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at\
+| | ... | 24.5G rate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc13-64B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at\
+| | ... | 18.75Mpps rate, step 100kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc15-1518B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at\
+| | ... | 24.5G rate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc19-IMIX-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frame size using binary search start at\
+| | ... | 24.5G rate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc20-IMIX-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 thread, 2 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frame size using binary search start at\
+| | ... | 24.5G rate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc21-IMIX-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 thread, 4 phy core,\
+| | ... | 2 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frame size using binary search start at\
+| | ... | 24.5G rate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 bridge domain in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
diff --git a/tests/vpp/perf/l2/40ge2p1xl710-eth-l2bdbasemaclrn-ndrpdrdisc.robot b/tests/vpp/perf/l2/40ge2p1xl710-eth-l2bdbasemaclrn-ndrpdrdisc.robot
new file mode 100644
index 0000000000..595bc029ce
--- /dev/null
+++ b/tests/vpp/perf/l2/40ge2p1xl710-eth-l2bdbasemaclrn-ndrpdrdisc.robot
@@ -0,0 +1,232 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-XL710 | ETH | L2BDMACLRN | BASE
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-XL710
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2BD test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-\
+| ... | domain and MAC learning enabled. DUT1 and DUT2 tested with 2p40GE NIC\
+| ... | XL710-DA2 by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop\
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage\
+| ... | of packets transmitted. NDR and PDR are discovered for different\
+| ... | Ethernet L2 frame sizes using either binary search or linear search\
+| ... | algorithms with configured starting rate and final step that determines\
+| ... | throughput measurement resolution. Test packets are generated by TG on\
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups\
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets\
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static\
+| ... | payload. MAC addresses are matching MAC addresses of the TG node\
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| L2 Bridge Domain NDR Binary Search BW limit
+| | [Arguments] | ${framesize} | ${min_rate} | ${wt} | ${rxq} | ${s_limit}
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${min_rate}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | Add PCI devices to DUTs in 3-node single link topology
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs
+| | Apply startup configuration on all VPP DUTs
+| | Initialize L2 bridge domain in 3-node circular topology
+| | Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| L2 Bridge Domain NDR Binary Search
+| | [Arguments] | ${framesize} | ${min_rate} | ${wt} | ${rxq} | ${s_limit}
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${min_rate}
+| | ${max_rate}= | Set Variable | ${s_limit}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | Add PCI devices to DUTs in 3-node single link topology
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs
+| | Apply startup configuration on all VPP DUTs
+| | Initialize L2 bridge domain in 3-node circular topology
+| | Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| L2 Bridge Domain PDR Binary Search BW limit
+| | [Arguments] | ${framesize} | ${min_rate} | ${wt} | ${rxq} | ${s_limit}
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${min_rate}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | Add PCI devices to DUTs in 3-node single link topology
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs
+| | Apply startup configuration on all VPP DUTs
+| | Initialize L2 bridge domain in 3-node circular topology
+| | Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| L2 Bridge Domain PDR Binary Search
+| | [Arguments] | ${framesize} | ${min_rate} | ${wt} | ${rxq} | ${s_limit}
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${min_rate}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | Add PCI devices to DUTs in 3-node single link topology
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs
+| | Apply startup configuration on all VPP DUTs
+| | Initialize L2 bridge domain in 3-node circular topology
+| | Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=1 | rxq=1
+| | ... | s_limit=${s_18.75Mpps}
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at\
+| | ... | 18.75Mpps rate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc03-1518B-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=1 | rxq=1
+| | ... | s_limit=${s_24.5G}
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at\
+| | ... | 24.5G rate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search BW limit
+
+| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=2 | rxq=1
+| | ... | s_limit=${s_18.75Mpps}
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at\
+| | ... | 18.75Mpps rate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc09-1518B-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=2 | rxq=1
+| | ... | s_limit=${s_24.5G}
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at\
+| | ... | 24.5G rate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search BW limit
+
+| tc13-64B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${64} | min_rate=${100000} | wt=4 | rxq=2
+| | ... | s_limit=${s_18.75Mpps}
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at\
+| | ... | 18.75Mpps rate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search
+
+| tc15-1518B-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=${1518} | min_rate=${10000} | wt=4 | rxq=2
+| | ... | s_limit=${s_24.5G}
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at\
+| | ... | 24.5G rate, step 10kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search BW limit
+
+| tc19-IMIX-1t1c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=IMIX_v4_1 | min_rate=${100000} | wt=1 | rxq=1
+| | ... | s_limit=${s_24.5G}
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames using binary search start at\
+| | ... | 24.5G rate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search BW limit
+
+| tc20-IMIX-2t2c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=IMIX_v4_1 | min_rate=${100000} | wt=2 | rxq=1
+| | ... | s_limit=${s_24.5G}
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames using binary search start at\
+| | ... | 24.5G rate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search BW limit
+
+| tc21-IMIX-4t4c-eth-l2bdbasemaclrn-ndrdisc
+| | ... | framesize=IMIX_v4_1 | min_rate=${100000} | wt=4 | rxq=2
+| | ... | s_limit=${s_24.5G}
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with with\
+| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frames using binary search start at\
+| | ... | 24.5G rate, step 100kpps.
+| | [Template] | L2 Bridge Domain NDR Binary Search BW limit
diff --git a/tests/vpp/perf/l2/40ge2p1xl710-eth-l2xcbase-ndrpdrdisc.robot b/tests/vpp/perf/l2/40ge2p1xl710-eth-l2xcbase-ndrpdrdisc.robot
new file mode 100644
index 0000000000..4c6f279e8d
--- /dev/null
+++ b/tests/vpp/perf/l2/40ge2p1xl710-eth-l2xcbase-ndrpdrdisc.robot
@@ -0,0 +1,251 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-XL710 | ETH | L2XCFWD | BASE
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-XL710
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| ...
+| Test Teardown | Tear down performance discovery test | ${min_rate}pps
+| ... | ${framesize} | ${traffic_profile}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2XC test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross connect.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. DUT1 and DUT2 tested with 2p40GE NIC XL710 by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 18.75Mpps rate, step 100kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | 64
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc03-1518B-1t1c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 24.5G rate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | 1518
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc07-64B-2t2c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 18.75Mpps rate, step 100kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | 64
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc09-1518B-2t2c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 24.5G rate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | 1518
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc13-64B-4t4c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames
+| | ... | using binary search start at 18.75Mpps rate, step 100kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | 64
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc15-1518B-4t4c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames
+| | ... | using binary search start at 24.5G rate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | 1518
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc19-IMIX-1t1c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame size
+| | ... | using binary search start at 24.5G rate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc20-IMIX-2t2c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 thread, 2 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame size
+| | ... | using binary search start at 24.5G rate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc21-IMIX-4t4c-eth-l2xcbase-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 thread, 4 phy core, \
+| | ... | 2 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame size
+| | ... | using binary search start at 24.5G rate, step 100kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | And Initialize L2 xconnect in 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..9b88f7f2d1
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot
@@ -0,0 +1,705 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | DOT1Q | L2BDMACLRN | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Packet throughput L2BD test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4. 802.1q
+| ... | tagging is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domain and MAC learning enabled. Qemu Guest is connected to VPP via
+| ... | vhost-user interfaces. Guest is running DPDK testpmd interconnecting
+| ... | vhost-user interfaces using 5 cores pinned to cpus 5-9 and 2048M
+| ... | memory. Testpmd is using socket-mem=1024M (512x2M hugepages), 5 cores
+| ... | (1 main core and 4 cores dedicated for io), forwarding mode is set to
+| ... | io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p10GE NIC X520
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${subid}= | 10
+| ${tag_rewrite}= | pop-1
+| ${vlan_overhead}= | ${4}
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Socket names
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${sock1}= | /tmp/sock-1-${bd_id1}
+| ${sock2}= | /tmp/sock-1-${bd_id2}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 2T2C | STHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 2T2C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | STHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 4T4C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 4T4C | STHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 4T4C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | STHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk.robot
new file mode 100644
index 0000000000..bab866795a
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk.robot
@@ -0,0 +1,212 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | DOT1Q | L2BDMACLRN | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test with vhost and VM with dpdk-testpmd
+| ... | ${rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Packet throughput L2BD test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4. 802.1q
+| ... | tagging is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domain and MAC learning enabled. Qemu Guest is connected to VPP via
+| ... | vhost-user interfaces. Guest is running DPDK testpmd interconnecting
+| ... | vhost-user interfaces using 5 cores pinned to cpus 5-9 and 2048M
+| ... | memory. Testpmd is using socket-mem=1024M (512x2M hugepages), 5 cores
+| ... | (1 main core and 4 cores dedicated for io), forwarding mode is set to
+| ... | io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p10GE NIC X520
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* TG verifies throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. Ref-PDR value is periodically updated acording to
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${subid}= | 10
+| ${tag_rewrite}= | pop-1
+# Socket names
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${sock1}= | /tmp/sock-1-${bd_id1}
+| ${sock2}= | /tmp/sock-1-${bd_id2}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| Check PDR for L2 bridge domain with vhost and VM with dpdk-testpmd
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with ${wt} thread, ${wt} phy\
+| | ... | core, ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=1.2mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=350000pps | wt=1 | rxq=1
+
+| tc03-IMIX-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=0.9mpps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=2.2mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=0.6mpps | wt=2 | rxq=1
+
+| tc06-IMIX-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=1.5pps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=3.4mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=0.7mpps | wt=4 | rxq=2
+
+| tc09-IMIX-4t4c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2 bridge domain with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=2.2mpps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..258ebbbe57
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot
@@ -0,0 +1,684 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | DOT1Q | L2XCFWD | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2XC test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross connect. 802.1q
+| ... | tagging is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. Qemu Guest is connected to VPP via vhost-user interfaces.
+| ... | Guest is running DPDK testpmd interconnecting vhost-user interfaces
+| ... | using 5 cores pinned to cpus 5-9 and 2048M memory. Testpmd is using
+| ... | socket-mem=1024M (512x2M hugepages), 5 cores (1 main core and 4 cores
+| ... | dedicated for io), forwarding mode is set to io, rxd/txd=256,
+| ... | burst=64. DUT1, DUT2 are tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${subid}= | 10
+| ${tag_rewrite}= | pop-1
+| ${vlan_overhead}= | ${4}
+# Socket names
+| ${sock1}= | /tmp/sock-1
+| ${sock2}= | /tmp/sock-2
+# X520-DA2 bandwidth limit
+| ${s_limit}= | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 2T2C | STHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 2T2C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | STHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 4T4C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 4T4C | STHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 4T4C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | STHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${357.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk.robot
new file mode 100644
index 0000000000..68b11c8348
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk.robot
@@ -0,0 +1,209 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | DOT1Q | L2XCFWD | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test with vhost and VM with dpdk-testpmd
+| ... | ${rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Packet throughput L2XC test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4. 802.1q
+| ... | tagging is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. Qemu Guest is connected to VPP via
+| ... | vhost-user interfaces. Guest is running DPDK testpmd interconnecting
+| ... | vhost-user interfaces using 5 cores pinned to cpus 5-9 and 2048M
+| ... | memory. Testpmd is using socket-mem=1024M (512x2M hugepages), 5 cores
+| ... | (1 main core and 4 cores dedicated for io), forwarding mode is set to
+| ... | io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p10GE NIC X520
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* TG verifies throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. Ref-PDR value is periodically updated acording to
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${subid}= | 10
+| ${tag_rewrite}= | pop-1
+# Socket names
+| ${sock1}= | /tmp/sock-1
+| ${sock2}= | /tmp/sock-2
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with ${wt} thread, ${wt} phy\
+| | ... | core, ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User and VLAN in 3-node circular topology
+| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=1.4mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=330000pps | wt=1 | rxq=1
+
+| tc03-IMIX-1t1c-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=1.0mpps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=1.4mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=0.7mpps | wt=2 | rxq=1
+
+| tc06-IMIX-2t2c-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=1.6mpps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=4.0mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=0.7mpps | wt=4 | rxq=2
+
+| tc09-IMIX-4t4c-dot1q-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=2.4mpps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..6bb145325a
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot
@@ -0,0 +1,623 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | L2BDMACLRN | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2BD test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domain and MAC learning enabled. Qemu Guest is connected to VPP via
+| ... | vhost-user interfaces. Guest is running DPDK testpmd interconnecting
+| ... | vhost-user interfaces using 5 cores pinned to cpus 5-9 and 2048M
+| ... | memory. Testpmd is using socket-mem=1024M (512x2M hugepages), 5 cores
+| ... | (1 main core and 4 cores dedicated for io), forwarding mode is set to
+| ... | io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p10GE NIC X520
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Socket names
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${sock1}= | /tmp/sock-1-${bd_id1}
+| ${sock2}= | /tmp/sock-1-${bd_id2}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 5kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..ade616825a
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot
@@ -0,0 +1,548 @@
+# Copyright (c) 2016 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | L2BDMACLRN | BASE | VHOST | VM
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| Test Setup | Set up performance test
+| Test Teardown | Run Keywords
+| ... | Show Bridge Domain Data On All DUTs
+| ... | AND | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| Documentation | *RFC2544: Pkt throughput L2BD test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domains and MAC learning enabled. Qemu Guests are connected to VPP via
+| ... | vhost-user interfaces. Guests are running DPDK testpmd interconnecting
+| ... | vhost-user interfaces using 5 cores pinned to cpus 6-10 and 11-15 and
+| ... | 2048M memory. Testpmd is using socket-mem=1024M (512x2M hugepages),
+| ... | 5 cores (1 main core and 4 cores dedicated for io), forwarding mode is
+| ... | set to io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p10GE NIC
+| ... | X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit}= | ${10000000000}
+# CPU settings
+| ${system_cpus}= | ${1}
+| ${vpp_cpus}= | ${5}
+| ${vm_cpus}= | ${5}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..d231afffb7
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot
@@ -0,0 +1,621 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | L2XCFWD | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2XC test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross connect.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. Qemu Guest is connected to VPP via vhost-user interfaces.
+| ... | Guest is running DPDK testpmd interconnecting vhost-user interfaces
+| ... | using 5 cores pinned to cpus 5-9 and 2048M memory. Testpmd is using
+| ... | socket-mem=1024M (512x2M hugepages), 5 cores (1 main core and 4 cores
+| ... | dedicated for io), forwarding mode is set to io, rxd/txd=256,
+| ... | burst=64. DUT1, DUT2 are tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${sock1}= | /tmp/sock-1-${bd_id1}
+| ${sock2}= | /tmp/sock-1-${bd_id2}
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-pdrchk.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-pdrchk.robot
new file mode 100644
index 0000000000..4fb03188bb
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-pdrchk.robot
@@ -0,0 +1,208 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | L2XCFWD | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test with vhost and VM with dpdk-testpmd
+| ... | ${rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Packet throughput L2XC test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4. 802.1q
+| ... | tagging is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connect. Qemu Guest is connected to VPP via
+| ... | vhost-user interfaces. Guest is running DPDK testpmd interconnecting
+| ... | vhost-user interfaces using 5 cores pinned to cpus 5-9 and 2048M
+| ... | memory. Testpmd is using socket-mem=1024M (512x2M hugepages), 5 cores
+| ... | (1 main core and 4 cores dedicated for io), forwarding mode is set to
+| ... | io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p10GE NIC X520
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* TG verifies throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. Ref-PDR value is periodically updated acording to
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${sock1}= | /tmp/sock-1-${bd_id1}
+| ${sock2}= | /tmp/sock-1-${bd_id2}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Keywords ***
+| Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with ${wt} thread, ${wt} phy\
+| | ... | core, ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=1.6mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=400000pps | wt=1 | rxq=1
+
+| tc03-IMIX-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=1.0mpps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=3.0mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=0.7mpps | wt=2 | rxq=1
+
+| tc06-IMIX-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=2.0mpps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=4.2mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=0.7mpps | wt=4 | rxq=2
+
+| tc09-IMIX-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for L2XC with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=3.0mpps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..ed2635ae02
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot
@@ -0,0 +1,549 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.NodePath
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | L2XCFWD | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2XC test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross connect.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connects. Qemu Guests are connected to VPP via vhost-user interfaces.
+| ... | Guests are running DPDK testpmd interconnecting vhost-user interfaces
+| ... | using 5 cores pinned to cpus 6-10 and 11-15 and 2048M memory. Testpmd is
+| ... | using socket-mem=1024M (512x2M hugepages), 5 cores (1 main core and 4
+| ... | cores dedicated for io), forwarding mode is set to io, rxd/txd=256,
+| ... | burst=64. DUT1, DUT2 are tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+#CPU settings
+| ${system_cpus}= | ${1}
+| ${vpp_cpus}= | ${5}
+| ${vm_cpus}= | ${5}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..0b19414fb5
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-ndrpdrdisc.robot
@@ -0,0 +1,658 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 route entries. Qemu Guest is connected
+| ... | to VPP via vhost-user interfaces. Guest is running DPDK testpmd
+| ... | interconnecting vhost-user interfaces using 5 cores pinned to cpus 5-9
+| ... | and 2048M memory. Testpmd is using socket-mem=1024M (512x2M hugepages),
+| ... | 5 cores (1 main core and 4 cores dedicated for io), forwarding mode is
+| ... | set to mac, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p10GE
+| ... | NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+| ${sock1}= | /tmp/sock-1
+| ${sock2}= | /tmp/sock-2
+| ${fib_table_1}= | 100
+| ${fib_table_2}= | 101
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-pdrchk.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-pdrchk.robot
new file mode 100644
index 0000000000..46a44cb58b
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-pdrchk.robot
@@ -0,0 +1,209 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PDRCHK
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance pdrchk test with vhost and VM with dpdk-testpmd
+| ... | ${rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and two static IPv4 /24 route entries. Qemu Guest is connected
+| ... | to VPP via vhost-user interfaces. Guest is running DPDK testpmd
+| ... | interconnecting vhost-user interfaces using 5 cores pinned to cpus 5-9
+| ... | and 2048M memory. Testpmd is using socket-mem=1024M (512x2M hugepages),
+| ... | 5 cores (1 main core and 4 cores dedicated for io), forwarding mode is
+| ... | set to mac, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p10GE
+| ... | NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG verifies throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. Ref-PDR value is periodically updated acording to
+| ... | formula: ref-PDR = 0.9x PDR, where PDR is found in RFC2544 long
+| ... | performance tests for the same DUT configuration. Test packets are
+| ... | generated by TG on links to DUTs. TG traffic profile contains two L3
+| ... | flow-groups (flow-group per direction, 253 flows per flow-group) with
+| ... | all packets containing Ethernet header, IPv4 header with IP protocol=61
+| ... | and static payload. MAC addresses are matching MAC addresses of the
+| ... | TG node interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+| ${sock1}= | /tmp/sock-1
+| ${sock2}= | /tmp/sock-2
+| ${fib_table_1}= | 100
+| ${fib_table_2}= | 101
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Keywords ***
+| Check PDR for IPv4 routing with vhost and VM with dpdk-testpmd
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with ${wt} thread, ${wt} phy\
+| | ... | core, ${rxq} receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for ${framesize} Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Arguments] | ${framesize} | ${rate} | ${wt} | ${rxq}
+| | ...
+| | # Test Variables required for test and test teardown
+| | Set Test Variable | ${framesize}
+| | Set Test Variable | ${rate}
+| | ${get_framesize}= | Get Frame Size | ${framesize}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | ...
+| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Run Keyword If | ${get_framesize} < ${1522}
+| | ... | Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost in 3-node circular topology
+| | ... | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1 | ${dut1_vif1_mac}
+| | ... | ${dut1_vif2_mac}
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd-mac connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1 | ${dut2_vif1_mac}
+| | ... | ${dut2_vif2_mac}
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Traffic should pass with partial loss | ${perf_trial_duration}
+| | ... | ${rate} | ${framesize} | ${traffic_profile}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-ip4base-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=2.5mpps | wt=1 | rxq=1
+
+| tc02-1518B-1t1c-eth-ip4base-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=300000pps | wt=1 | rxq=1
+
+| tc03-IMIX-1t1c-eth-ip4base-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy\
+| | ... | core, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=0.9mpps | wt=1 | rxq=1
+
+| tc04-64B-2t2c-eth-ip4base-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=3.0mpps | wt=2 | rxq=1
+
+| tc05-1518B-2t2c-eth-ip4base-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=350000pps | wt=2 | rxq=1
+
+| tc06-IMIX-2t2c-eth-ip4base-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=2.0mpps | wt=2 | rxq=1
+
+| tc07-64B-4t4c-eth-ip4base-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing with vhost and VM with dpdk-testpmd
+| | framesize=${64} | rate=3.8mpps | wt=4 | rxq=2
+
+| tc08-1518B-4t4c-eth-ip4base-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 1518 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing with vhost and VM with dpdk-testpmd
+| | framesize=${1518} | rate=350000pps | wt=4 | rxq=2
+
+| tc09-IMIX-4t4c-eth-ip4base-eth-2vhost-1vm-pdrchk
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port.
+| | ... | [Ver] Verify ref-PDR for 64 Byte frames using single trial\
+| | ... | throughput test at 2x ${rate}.
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD
+| | ...
+| | [Template] | Check PDR for IPv4 routing with vhost and VM with dpdk-testpmd
+| | framesize=IMIX_v4_1 | rate=3.0mpps | wt=4 | rxq=2
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..5e1c9afca7
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot
@@ -0,0 +1,550 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | ETH | IP4FWD | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Pkt throughput IPv4 test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and static IPv4 /24 route entries. Qemu Guests are connected
+| ... | to VPP via vhost-user interfaces. Guests are running DPDK testpmd
+| ... | interconnecting vhost-user interfaces using 5 cores pinned to cpus 6-10
+| ... | and 11-15 and 2048M memory. Testpmd is using socket-mem=1024M (512x2M
+| ... | hugepages), 5 cores (1 main core and 4 cores dedicated for io),
+| ... | forwarding mode is set to mac, rxd/txd=256, burst=64. DUT1, DUT2 are
+| ... | tested with 2p10GE NIC X520 Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit}= | ${10000000000}
+# CPU settings
+| ${system_cpus}= | ${1}
+| ${vpp_cpus}= | ${5}
+| ${vm_cpus}= | ${5}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..b24e0ca3c6
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot
@@ -0,0 +1,675 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X520-DA2 | L2BDMACLRN | ENCAP | VXLAN | L2OVRLAY | IP4UNRLAY
+| ... | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Packet throughput L2BD test cases with VXLANoIPv4
+| ... | and vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | Eth-IPv4-VXLAN-Eth-IPv4 is applied on link between DUT1 and DUT2.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domain and MAC learning enabled. Qemu Guest is connected to VPP via
+| ... | vhost-user interfaces. Guest is running DPDK testpmd interconnecting
+| ... | vhost-user interfaces using 5 cores pinned to cpus 5-9 and 2048M
+| ... | memory. Testpmd is using socket-mem=1024M (512x2M hugepages), 5 cores
+| ... | (1 main core and 4 cores dedicated for io), forwarding mode is set to
+| ... | io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p10GE NIC X520
+| ... | Niantic by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC7348.
+
+*** Variables ***
+# X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+| ${vxlan_overhead} | ${50}
+# Socket names
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${sock1}= | /tmp/sock-1-${bd_id1}
+| ${sock2}= | /tmp/sock-1-${bd_id2}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 framesize using binary search start at\
+| | ... | 10GE linerate, step 5kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${403.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frame size using binary search start at\
+| | ... | 10GE linerate, step 5kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${403.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frame size using binary search start at\
+| | ... | 10GE linerate, step 5kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${403.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frame size using binary search start at\
+| | ... | 10GE linerate, step 5kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${403.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
+| | ... | linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vxlan_overhead}}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find NDR for IMIX_v4_1 frame size using binary search start at\
+| | ... | 10GE linerate, step 5kpps.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${403.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port.
+| | ... | [Ver] Find PDR for IMIX_v4_1 frame size using binary search start at\
+| | ... | 10GE linerate, step 5kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B;16x570B;4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${avg_framesize}= | Set Variable | ${403.833}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/10ge2p1x710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/10ge2p1x710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..734b624666
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/10ge2p1x710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot
@@ -0,0 +1,658 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-X710 | ETH | L2BDMACLRN | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-X710
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Pkt throughput L2BD test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domain and MAC learning enabled. Qemu Guest is connected to VPP via
+| ... | vhost-user interfaces. Guest is running DPDK testpmd interconnecting
+| ... | vhost-user interfaces using 5 cores pinned to cpus on NUMA1 and 2048M
+| ... | memory. Testpmd is using socket-mem=1024M (512x2M hugepages), 5 cores
+| ... | (1 main core and 4 cores dedicated for io), forwarding mode is set to
+| ... | io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p10GE NIC X710
+| ... | by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# X710 bandwidth limit
+| ${s_limit} | ${10000000000}
+# Socket names
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${sock1}= | /tmp/sock-1-${bd_id1}
+| ${sock2}= | /tmp/sock-1-${bd_id2}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 10GE linerate, step 5kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 10GE linerate, step 5kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 10GE linerate, step 5kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 10GE linerate, step 5kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..b16a699e6a
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot
@@ -0,0 +1,660 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-XL710 | ETH | L2BDMACLRN | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-XL710
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Packet throughput L2BD test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domain and MAC learning enabled. Qemu Guest is connected to VPP via
+| ... | vhost-user interfaces. Guest is running DPDK testpmd interconnecting
+| ... | vhost-user interfaces using 5 cores pinned to cpus on NUMA1 and 2048M
+| ... | memory. Testpmd is using socket-mem=1024M (512x2M hugepages), 5 cores
+| ... | (1 main core and 4 cores dedicated for io), forwarding mode is set to
+| ... | io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p40GE NIC XL710
+| ... | by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+# Socket names
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${sock1}= | /tmp/sock-1-${bd_id1}
+| ${sock2}= | /tmp/sock-1-${bd_id2}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 40GE linerate, step 5kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 40GE linerate, step 5kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 40GE linerate, step 5kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 40GE linerate, step 5kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames\
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 40GE linerate, step 5kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores,\
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame\
+| | ... | size using binary search start at 40GE linerate, step 5kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User in 3-node circular topology
+| | ... | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ${vm1}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
+| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
+| | ${vm2}= | And Configure guest VM with dpdk-testpmd connected via vhost-user
+| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
+| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..c9fc7292b5
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot
@@ -0,0 +1,588 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-XL710 | ETH | L2BDMACLRN | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-XL710
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Packet throughput L2BD test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 bridge-
+| ... | domain and MAC learning enabled. Qemu Guests are connected to VPP via
+| ... | vhost-user interfaces. Guests are running DPDK testpmd interconnecting
+| ... | vhost-user interfaces using 5 cores pinned to cpus on NUMA1 and 2048M
+| ... | memory. Testpmd is using socket-mem=1024M (512x2M hugepages), 5 cores
+| ... | (1 main core and 4 cores dedicated for io), forwarding mode is set to
+| ... | io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p40GE NIC XL710
+| ... | by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+# CPU settings
+| ${system_cpus}= | ${1}
+| ${vpp_cpus}= | ${5}
+| ${vm_cpus}= | ${5}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2BD switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 bridge domains with Vhost-User for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..7d79bc2e78
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/40ge2p1xl710-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot
@@ -0,0 +1,588 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-XL710 | ETH | L2XCFWD | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L2 | Intel-XL710
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Packet throughput L2XC test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 switching of IPv4.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
+| ... | connects. Qemu Guests are connected to VPP via vhost-user interfaces.
+| ... | Guests are running DPDK testpmd interconnecting vhost-user interfaces
+| ... | using 5 cores pinned to cpus on NUMA1 (cpus 24-28 and 29-34) and 2048M
+| ... | memory. Testpmd is using socket-mem=1024M (512x2M hugepages), 5 cores
+| ... | (1 main core and 4 cores dedicated for io), forwarding mode is set to
+| ... | io, rxd/txd=256, burst=64. DUT1, DUT2 are tested with 2p40GE NIC XL710
+| ... | by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+# CPU settings
+| ${system_cpus}= | ${1}
+| ${vpp_cpus}= | ${5}
+| ${vm_cpus}= | ${5}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src254
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize L2 xconnect with Vhost-User for '2' in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
diff --git a/tests/vpp/perf/vm_vhost/40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot b/tests/vpp/perf/vm_vhost/40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot
new file mode 100644
index 0000000000..30e68e1f15
--- /dev/null
+++ b/tests/vpp/perf/vm_vhost/40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot
@@ -0,0 +1,588 @@
+# Copyright (c) 2017 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:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance/performance_setup.robot
+| Library | resources.libraries.python.QemuUtils
+| ...
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
+| ... | NIC_Intel-XL710 | ETH | IP4FWD | BASE | VHOST | VM
+| ...
+| Suite Setup | Set up 3-node performance topology with DUT's NIC model
+| ... | L3 | Intel-XL710
+| Suite Teardown | Tear down 3-node performance topology
+| ...
+| Test Setup | Set up performance test
+| Test Teardown | Tear down performance test with vhost and VM with dpdk-testpmd
+| ... | ${min_rate}pps | ${framesize} | ${traffic_profile}
+| ... | dut1_node=${dut1} | dut1_vm_refs=${dut1_vm_refs}
+| ... | dut2_node=${dut2} | dut2_vm_refs=${dut2_vm_refs}
+| ...
+| Documentation | *RFC2544: Packet throughput IP14 test cases with vhost*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 forIPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv4
+| ... | routing and static IPv4 /24 route entries. Qemu Guests are connected to
+| ... | VPP via vhost-user interfaces. Guests are running DPDK testpmd
+| ... | interconnecting vhost-user interfaces using 5 cores pinned to cpus on
+| ... | NUMA1 (cpus 24-28 and 29-34) and 2048M memory. Testpmd is using
+| ... | socket-mem=1024M (512x2M hugepages), 5 cores (1 main core and 4 cores
+| ... | dedicated for io), forwarding mode is set to io, rxd/txd=256, burst=64.
+| ... | DUT1, DUT2 are tested with 2p40GE NIC XL710 by Intel.
+| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
+| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
+| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
+| ... | of packets transmitted. NDR and PDR are discovered for different
+| ... | Ethernet L2 frame sizes using either binary search or linear search
+| ... | algorithms with configured starting rate and final step that determines
+| ... | throughput measurement resolution. Test packets are generated by TG on
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
+| ... | (flow-group per direction, 253 flows per flow-group) with all packets
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
+| ... | payload. MAC addresses are matching MAC addresses of the TG node
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+# XL710-DA2 bandwidth limit ~49Gbps/2=24.5Gbps
+| ${s_24.5G} | ${24500000000}
+# XL710-DA2 Mpps limit 37.5Mpps/2=18.75Mpps
+| ${s_18.75Mpps} | ${18750000}
+# CPU settings
+| ${system_cpus}= | ${1}
+| ${vpp_cpus}= | ${5}
+| ${vm_cpus}= | ${5}
+# Traffic profile:
+| ${traffic_profile} | trex-sl-3n-ethip4-ip4src253
+
+*** Test Cases ***
+| tc01-64B-1t1c-eth-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc02-64B-1t1c-eth-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-eth-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc04-1518B-1t1c-eth-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc05-IMIX-1t1c-eth-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc06-IMIX-1t1c-eth-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 1 thread, 1 phy core, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-eth-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc08-64B-2t2c-eth-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-eth-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc10-1518B-2t2c-eth-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc11-IMIX-2t2c-eth-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc12-IMIX-2t2c-eth-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 2 threads, 2 phy cores, \
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-eth-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | NDRDISC
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc14-64B-4t4c-eth-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 64B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Set Variable | ${s_18.75Mpps}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-eth-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc16-1518B-4t4c-eth-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for 1518 Byte frames \
+| | ... | using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ...
+| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}
+
+| tc17-IMIX-4t4c-eth-ip4base-eth-4vhost-2vm-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find NDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find NDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+
+| tc18-IMIX-4t4c-eth-ip4base-eth-4vhost-2vm-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs IPv4 routing config with 4 threads, 4 phy cores, \
+| | ... | 2 receive queues per NIC port. [Ver] Find PDR for IMIX_v4_1 frame \
+| | ... | size using binary search start at 40GE linerate, step 10kpps, LT=0.5%.
+| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
+| | ...
+| | [Tags] | IMIX | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ...
+| | ${framesize}= | Set Variable | IMIX_v4_1
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_24.5G} | ${353.83333}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | ${dut1_vm_refs}= | Create Dictionary
+| | ${dut2_vm_refs}= | Create Dictionary
+| | Set Test Variable | ${dut1_vm_refs}
+| | Set Test Variable | ${dut2_vm_refs}
+| | Given Add '4' worker threads and '2' rxqueues in 3-node single-link circular topology
+| | And Add PCI devices to DUTs in 3-node single link topology
+| | And Add no multi seg to all DUTs
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize IPv4 forwarding with vhost for '2' VMs in 3-node circular topology
+| | And Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
+| | Then Find PDR using binary search and pps
+| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile}
+| | ... | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type}