> This extends the existing system EVPN tests to make sure the feature > also works fine for IPv6 underlays (IPv6 VXLAN TEPs). > > Signed-off-by: Dumitru Ceara <[email protected]>
just two nit inline. Fixing them: Acked-by: Lorenzo Bianconi <[email protected]> Regards, Lorenzo > --- > tests/system-common-macros.at | 29 ++ > tests/system-ovn.at | 552 +++++++++++++++++++++++++++++++++- > 2 files changed, 571 insertions(+), 10 deletions(-) > > diff --git a/tests/system-common-macros.at b/tests/system-common-macros.at > index ed1c24d953..9c5a124a05 100644 > --- a/tests/system-common-macros.at > +++ b/tests/system-common-macros.at > @@ -195,6 +195,35 @@ m4_define([LOAD_MODULE], > ] > ) > > +# SET_EVPN_IFACE_NAMES IFNAME SWITCH [VNI] > +# > +# If IFNAME != "default" configures LS to use br-<IFNAME>, vxlan-<IFNAME> and > +# lo-<IFNAME> as EVPN host interfaces. > +# If IFNAME == "default" configures LS to use the default br-$vni, vxlan-$vni > +# and lo-$vni host interfaces. > +# > +# The host interface names are exported as environment variables BR_NAME, > +# VXLAN_NAME and LO_NAME. > +m4_define([SET_EVPN_IFACE_NAMES], > + [ > + ifname=$1 switch=$2 vni=$3 > + > + [[ $ifname = "default" ]] && BR_NAME=br-$vni || BR_NAME=br-$ifname > + [[ $ifname = "default" ]] && VXLAN_NAME=vxlan-$vni || > VXLAN_NAME=vxlan-$ifname > + [[ $ifname = "default" ]] && LO_NAME=lo-$vni || LO_NAME=lo-$ifname > + > + if [[ $ifname != "default" ]]; then > + check ovn-nbctl set logical_switch $switch \ > + other_config:dynamic-routing-bridge-ifname=$BR_NAME \ > + other_config:dynamic-routing-vxlan-ifname=$VXLAN_NAME \ > + other_config:dynamic-routing-advertise-ifname=$LO_NAME > + fi > + > + export BR_NAME VXLAN_NAME LO_NAME > + on_exit 'unset BR_NAME VXLAN_NAME LO_NAME' > + ] > +) > + > # OVN_TEST_IPV6_PREFIX_DELEGATION() > m4_define([OVN_TEST_IPV6_PREFIX_DELEGATION], > [ > diff --git a/tests/system-ovn.at b/tests/system-ovn.at > index 1b4b30743f..feab4a118e 100644 > --- a/tests/system-ovn.at > +++ b/tests/system-ovn.at > @@ -17610,6 +17610,7 @@ AT_CLEANUP > ]) > > m4_define([EVPN_SWITCH_TESTS],[ > + no need a new-line here. > OVN_FOR_EACH_NORTHD([ > AT_SETUP([dynamic-routing - EVPN $1 naming]) > AT_KEYWORDS([dynamic-routing]) > @@ -17620,6 +17621,7 @@ CHECK_CONNTRACK_NAT() > > IFNAME=$1 > vni=10 > + ditto. > VRF_RESERVE([$vni]) > ovn_start > OVS_TRAFFIC_VSWITCHD_START() > @@ -17650,16 +17652,7 @@ check ovn-nbctl > \ > -- lsp-set-addresses workload2 "f0:00:0f:16:01:20 172.16.1.20 > 172:16::20" \ > -- lsp-add-localnet-port ls-evpn ln_port phynet > > -[[ $IFNAME = "default" ]] && BR_NAME=br-$vni || BR_NAME=br-evpn > -[[ $IFNAME = "default" ]] && VXLAN_NAME=vxlan-$vni || VXLAN_NAME=vxlan-evpn > -[[ $IFNAME = "default" ]] && LO_NAME=lo-$vni || LO_NAME=lo-evpn > - > -if [[ $IFNAME != "default" ]]; then > - check ovn-nbctl > \ > - -- set logical_switch ls-evpn > other_config:dynamic-routing-bridge-ifname=$BR_NAME \ > - -- set logical_switch ls-evpn > other_config:dynamic-routing-vxlan-ifname=$VXLAN_NAME \ > - -- set logical_switch ls-evpn > other_config:dynamic-routing-advertise-ifname=$LO_NAME > -fi > +SET_EVPN_IFACE_NAMES([$IFNAME], [ls-evpn], [$vni]) > > ADD_NAMESPACES(workload1) > ADD_VETH(workload1, workload1, br-int, "172:16::10/64", "f0:00:0f:16:01:10", > \ > @@ -18155,8 +18148,547 @@ OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port > patch-.*/d > /connection dropped.*/d"]) > AT_CLEANUP > ]) > + > +OVN_FOR_EACH_NORTHD([ > +AT_SETUP([dynamic-routing - EVPN $1 naming - IPv6 underlay]) > +AT_KEYWORDS([dynamic-routing]) > + > +CHECK_VRF() > +CHECK_CONNTRACK() > +CHECK_CONNTRACK_NAT() > + > +IFNAME=$1 > +vni=10 > + > +VRF_RESERVE([$vni]) > +ovn_start > +OVS_TRAFFIC_VSWITCHD_START() > +ADD_BR([br-int]) > +ADD_BR([br-ext], [set Bridge br-ext fail-mode=standalone]) > + > +# Set external-ids in br-int needed for ovn-controller. > +check ovs-vsctl \ > + -- set Open_vSwitch . external-ids:system-id=hv1 \ > + -- set Open_vSwitch . > external-ids:ovn-remote=unix:$ovs_base/ovn-sb/ovn-sb.sock \ > + -- set Open_vSwitch . external-ids:ovn-encap-type=geneve \ > + -- set Open_vSwitch . external-ids:ovn-encap-ip=169::1 \ > + -- set Open_vSwitch . external-ids:ovn-bridge-mappings=phynet:br-ext \ > + -- set Open_vSwitch . external-ids:ovn-evpn-local-ip=169::1 \ > + -- set Open_vSwitch . external-ids:ovn-evpn-vxlan-ports=4789 \ > + -- set bridge br-int fail-mode=secure other-config:disable-in-band=true > + > +# Start ovn-controller. > +start_daemon ovn-controller > + > +OVS_WAIT_WHILE([ip link | grep -q ovnvrf$vni:.*UP]) > + > +check ovn-nbctl > \ > + -- ls-add ls-evpn > \ > + -- lsp-add ls-evpn workload1 > \ > + -- lsp-set-addresses workload1 "f0:00:0f:16:01:10 172.16.1.10 > 172:16::10" \ > + -- lsp-add ls-evpn workload2 > \ > + -- lsp-set-addresses workload2 "f0:00:0f:16:01:20 172.16.1.20 > 172:16::20" \ > + -- lsp-add-localnet-port ls-evpn ln_port phynet > + > +SET_EVPN_IFACE_NAMES([$IFNAME], [ls-evpn], [$vni]) > + > +ADD_NAMESPACES(workload1) > +ADD_VETH(workload1, workload1, br-int, "172:16::10/64", "f0:00:0f:16:01:10", > \ > + "172:16::1", "nodad", "172.16.1.10/24", "172.16.1.1") > + > +ADD_NAMESPACES(workload2) > +ADD_VETH(workload2, workload2, br-int, "172:16::20/64", "f0:00:0f:16:01:20", > \ > + "172:16::1", "nodad", "172.16.1.20/24", "172.16.1.1") > + > +OVN_POPULATE_ARP > +check ovn-nbctl --wait=hv sync > +wait_for_ports_up > + > +# Setup a VRF for the VNI. > +check ip link add vrf-$vni type vrf table $vni > +on_exit "ip link del vrf-$vni" > +check ip link set vrf-$vni up > + > +# Add VNI bridge. > +check ip link add $BR_NAME type bridge > +on_exit "ip link del $BR_NAME" > +check ip link set $BR_NAME master vrf-$vni addrgenmode none > +check ip link set dev $BR_NAME up > + > +# Add VXLAN VTEP for the VNI (linked to the OVS vxlan_sys_<port> interface). > +# Use a dstport different than the one used by OVS. > +# This is fine because we don't actually want traffic to pass through > +# the $vxlan interface. FRR should read the dstport from the linked > +# vxlan_sys_${vxlan_port} device. > +dstport=$((60000 + $vni)) > +check ip link add $VXLAN_NAME type vxlan \ > + id $vni dstport $dstport local 169::1 nolearning > +on_exit "ip link del $VXLAN_NAME" > +check ip link set dev $VXLAN_NAME up > +check ip link set $VXLAN_NAME master $BR_NAME > + > +# Add a dummy loopback to the VNI bridge to be used for advertising local > +# MACs. > +check ip link add name $LO_NAME type dummy > +on_exit "ip link del $LO_NAME" > +check ip link set $LO_NAME master $BR_NAME > +check ip link set $LO_NAME up > + > +AS_BOX([L2 EVPN VTEP and FDB learning]) > + > +check ovn-nbctl --wait=hv set logical_switch ls-evpn > other_config:dynamic-routing-vni=$vni > +ofport=$(ovs-vsctl --bare --columns ofport find Interface > name="ovn-evpn-4789") > +dp_key=$(fetch_column Datapath tunnel_key external_ids:name=ls-evpn) > + > +AT_CHECK([ovn-appctl evpn/remote-vtep-list], [0], [dnl > +]) > + > +AT_CHECK([ovn-appctl evpn/vtep-binding-list], [0], [dnl > ]) > > +AT_CHECK([ovn-appctl evpn/vtep-multicast-group-list], [0], [dnl > +]) > + > +# Simulate remote VTEP. > +check bridge fdb append 00:00:00:00:00:00 dev $VXLAN_NAME dst 169::10 static > permanent > + > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/remote-vtep-list], [0], [dnl > +IP: 169::10, port: 4789, vni: $vni > +]) > + > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-binding-list | cut -d',' > -f2-], [0], [dnl > + Remote IP: 169::10, vni: $vni, binding_key: 0x80000001, tunnel_ofport: > $ofport, dp_key: $dp_key > +]) > + > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-multicast-group-list | > cut -d',' -f2-], [0], [dnl > + Remote IPs: 169::10, vni: $vni > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG | > grep priority=1050 | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=1050,tun_id=0xa,tun_ipv6_src=169::10,tun_ipv6_dst=169::1,in_port=$ofport > > actions=load:0x$dp_key->OXM_OF_METADATA[[0..31]],load:0x80000001->NXM_NX_REG14[[]],resubmit(,OFTABLE_LEARN_REMOTE_FDB),resubmit(,OFTABLE_LOG_INGRESS_PIPELINE) > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int > table=OFTABLE_REMOTE_VTEP_OUTPUT | grep output | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=50,reg15=0x8000,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],load:0x10->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],output:$ofport,resubmit(,OFTABLE_LOCAL_OUTPUT) > +priority=50,reg15=0x80000001,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0x10->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],output:$ofport > +priority=50,reg15=0x8001,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],load:0x10->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],output:$ofport,resubmit(,OFTABLE_LOCAL_OUTPUT) > +priority=50,reg15=0x8004,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],load:0x10->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],output:$ofport,resubmit(,OFTABLE_LOCAL_OUTPUT) > +priority=55,reg10=0x1/0x1,reg15=0x80000001,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0x10->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],load:0xffff->NXM_OF_IN_PORT[[]],output:$ofport > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int > table=OFTABLE_LEARN_REMOTE_FDB | grep priority | \ > + awk '{print $[7], $[8]}' | strip_cookie | sort], [0], [dnl > +priority=100,reg14=0x80000001,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +]) > + > +# Simulate more remote VTEPs. > +check bridge fdb append 00:00:00:00:00:00 dev $VXLAN_NAME dst 169::20 static > permanent > +check bridge fdb append 00:00:00:00:00:01 dev $VXLAN_NAME dst 169::30 > extern_learn > + > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/remote-vtep-list | sort], [0], > [dnl > +IP: 169::10, port: 4789, vni: $vni > +IP: 169::20, port: 4789, vni: $vni > +IP: 169::30, port: 4789, vni: $vni > +]) > + > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-binding-list | cut -d',' > -f2- | sort], [0], [dnl > + Remote IP: 169::10, vni: $vni, binding_key: 0x80000001, tunnel_ofport: > $ofport, dp_key: $dp_key > + Remote IP: 169::20, vni: $vni, binding_key: 0x80000002, tunnel_ofport: > $ofport, dp_key: $dp_key > + Remote IP: 169::30, vni: $vni, binding_key: 0x80000003, tunnel_ofport: > $ofport, dp_key: $dp_key > +]) > + > +# We cannot check the output directly because the order might change. > +OVS_WAIT_UNTIL([ovn-appctl evpn/vtep-multicast-group-list | grep -q > "169::10"]) > +OVS_WAIT_UNTIL([ovn-appctl evpn/vtep-multicast-group-list | grep -q > "169::20"]) > +OVS_WAIT_UNTIL([ovn-appctl evpn/vtep-multicast-group-list | grep -q > "169::30"]) > +AT_CHECK([ovn-appctl evpn/vtep-multicast-group-list | wc -l], [0], [1 > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG | > grep priority=1050 | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=1050,tun_id=0xa,tun_ipv6_src=169::10,tun_ipv6_dst=169::1,in_port=$ofport > > actions=load:0x$dp_key->OXM_OF_METADATA[[0..31]],load:0x80000001->NXM_NX_REG14[[]],resubmit(,OFTABLE_LEARN_REMOTE_FDB),resubmit(,OFTABLE_LOG_INGRESS_PIPELINE) > +priority=1050,tun_id=0xa,tun_ipv6_src=169::20,tun_ipv6_dst=169::1,in_port=$ofport > > actions=load:0x$dp_key->OXM_OF_METADATA[[0..31]],load:0x80000002->NXM_NX_REG14[[]],resubmit(,OFTABLE_LEARN_REMOTE_FDB),resubmit(,OFTABLE_LOG_INGRESS_PIPELINE) > +priority=1050,tun_id=0xa,tun_ipv6_src=169::30,tun_ipv6_dst=169::1,in_port=$ofport > > actions=load:0x$dp_key->OXM_OF_METADATA[[0..31]],load:0x80000003->NXM_NX_REG14[[]],resubmit(,OFTABLE_LEARN_REMOTE_FDB),resubmit(,OFTABLE_LOG_INGRESS_PIPELINE) > +]) > + > +ovs-ofctl dump-flows br-int table=OFTABLE_REMOTE_VTEP_OUTPUT > > oftable_remote_vtep_output > +AT_CHECK_UNQUOTED([grep "output" oftable_remote_vtep_output | grep -v > resubmit | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=50,reg15=0x80000001,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0x10->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],output:$ofport > +priority=50,reg15=0x80000002,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0x20->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],output:$ofport > +priority=50,reg15=0x80000003,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0x30->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],output:$ofport > +priority=55,reg10=0x1/0x1,reg15=0x80000001,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0x10->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],load:0xffff->NXM_OF_IN_PORT[[]],output:$ofport > +priority=55,reg10=0x1/0x1,reg15=0x80000002,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0x20->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],load:0xffff->NXM_OF_IN_PORT[[]],output:$ofport > +priority=55,reg10=0x1/0x1,reg15=0x80000003,metadata=0x$dp_key > actions=load:0x1->NXM_NX_TUN_IPV6_SRC[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_SRC[[64..127]],load:0x30->NXM_NX_TUN_IPV6_DST[[0..63]],load:0x169000000000000->NXM_NX_TUN_IPV6_DST[[64..127]],load:0xa->NXM_NX_TUN_ID[[0..23]],load:0xffff->NXM_OF_IN_PORT[[]],output:$ofport > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int > table=OFTABLE_LEARN_REMOTE_FDB | grep priority | \ > + awk '{print $[7], $[8]}' | strip_cookie | sort], [0], [dnl > +priority=100,reg14=0x80000001,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=100,reg14=0x80000002,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=100,reg14=0x80000003,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=150,reg14=0x80000003,metadata=0x1,dl_src=00:00:00:00:00:01 > actions=drop > +]) > + > +AT_CHECK([grep "resubmit" oftable_remote_vtep_output | grep -c > "load:0x10->NXM_NX_TUN_IPV6_DST\[[0\.\.63\]],*load:0x169000000000000->NXM_NX_TUN_IPV6_DST\[[64\.\.127\]]"], > [0], [3 > +]) > +AT_CHECK([grep "resubmit" oftable_remote_vtep_output | grep -c > "load:0x20->NXM_NX_TUN_IPV6_DST\[[0\.\.63\]],*load:0x169000000000000->NXM_NX_TUN_IPV6_DST\[[64\.\.127\]]"], > [0], [3 > +]) > +AT_CHECK([grep "resubmit" oftable_remote_vtep_output | grep -c > "load:0x30->NXM_NX_TUN_IPV6_DST\[[0\.\.63\]],*load:0x169000000000000->NXM_NX_TUN_IPV6_DST\[[64\.\.127\]]"], > [0], [3 > +]) > + > +# Simulate remote workload. > +check bridge fdb add f0:00:0f:16:10:50 dev $VXLAN_NAME dst 169::10 static > extern_learn > +check bridge fdb add f0:00:0f:16:10:60 dev $VXLAN_NAME dst 169::20 static > extern_learn > +check bridge fdb add f0:00:0f:16:10:70 dev $VXLAN_NAME dst 169::30 static > extern_learn > + > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-fdb-list | cut -d',' -f2- > | sort], [0], [dnl > + MAC: 00:00:00:00:00:01, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key > + MAC: f0:00:0f:16:10:50, vni: $vni, binding_key: 0x80000001, dp_key: $dp_key > + MAC: f0:00:0f:16:10:60, vni: $vni, binding_key: 0x80000002, dp_key: $dp_key > + MAC: f0:00:0f:16:10:70, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_GET_REMOTE_FDB > | grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=0 actions=load:0->NXM_NX_REG1[[]] > +priority=150,metadata=0x$dp_key,dl_dst=00:00:00:00:00:01 > actions=load:0x80000003->NXM_NX_REG1[[]] > +priority=150,metadata=0x$dp_key,dl_dst=f0:00:0f:16:10:50 > actions=load:0x80000001->NXM_NX_REG1[[]] > +priority=150,metadata=0x$dp_key,dl_dst=f0:00:0f:16:10:60 > actions=load:0x80000002->NXM_NX_REG1[[]] > +priority=150,metadata=0x$dp_key,dl_dst=f0:00:0f:16:10:70 > actions=load:0x80000003->NXM_NX_REG1[[]] > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int > table=OFTABLE_LEARN_REMOTE_FDB | grep priority | \ > + awk '{print $[7], $[8]}' | strip_cookie | sort], [0], [dnl > +priority=100,reg14=0x80000001,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=100,reg14=0x80000002,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=100,reg14=0x80000003,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=150,reg14=0x80000001,metadata=0x$dp_key,dl_src=f0:00:0f:16:10:50 > actions=drop > +priority=150,reg14=0x80000002,metadata=0x$dp_key,dl_src=f0:00:0f:16:10:60 > actions=drop > +priority=150,reg14=0x80000003,metadata=0x$dp_key,dl_src=00:00:00:00:00:01 > actions=drop > +priority=150,reg14=0x80000003,metadata=0x$dp_key,dl_src=f0:00:0f:16:10:70 > actions=drop > +]) > + > +# Check that the recompute won't change the UUIDs and tunnel keys. > +ovn-appctl evpn/vtep-binding-list > bindings_before > +ovn-appctl evpn/vtep-multicast-group-list > mc_groups_before > +ovn-appctl evpn/vtep-fdb-list > fdb_before > + > +check ovn-appctl inc-engine/recompute > +check ovn-nbctl --wait=hv sync > + > +ovn-appctl evpn/vtep-binding-list > bindings_after > +ovn-appctl evpn/vtep-multicast-group-list > mc_groups_after > +ovn-appctl evpn/vtep-fdb-list > fdb_after > + > +check diff -q bindings_before bindings_after > +check diff -q mc_groups_before mc_groups_after > +check diff -q fdb_before fdb_after > + > +AS_BOX([L2 EVPN FDB advertising]) > + > +check ovn-nbctl --wait=hv set logical_switch ls-evpn > other_config:dynamic-routing-redistribute=fdb > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([bridge fdb show | grep $LO_NAME | grep > "f0:00:0f:16:01" | sort], [0], [dnl > +f0:00:0f:16:01:10 dev $LO_NAME master $BR_NAME static > +f0:00:0f:16:01:10 dev $LO_NAME vlan 1 master $BR_NAME static > +f0:00:0f:16:01:20 dev $LO_NAME master $BR_NAME static > +f0:00:0f:16:01:20 dev $LO_NAME vlan 1 master $BR_NAME static > +]) > + > +check ovn-nbctl --wait=hv lsp-del workload2 > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([bridge fdb show | grep $LO_NAME | grep > "f0:00:0f:16:01" | sort], [0], [dnl > +f0:00:0f:16:01:10 dev $LO_NAME master $BR_NAME static > +f0:00:0f:16:01:10 dev $LO_NAME vlan 1 master $BR_NAME static > +]) > + > +check ovn-nbctl --wait=hv remove logical_switch ls-evpn other_config > dynamic-routing-redistribute > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([bridge fdb show | grep $LO_NAME | grep > "f0:00:0f:16:01" | sort], [0], [dnl > +]) > + > +check ovn-nbctl --wait=hv set logical_switch ls-evpn > other_config:fdb_age_threshold=300 > +ovs-ofctl dump-flows br-int table=OFTABLE_LEARN_REMOTE_FDB > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int > table=OFTABLE_LEARN_REMOTE_FDB | grep priority | \ > + awk '{print $[7], $[8]}' | strip_cookie | sort], [0], [dnl > +priority=100,reg14=0x80000001,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,hard_timeout=300,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=100,reg14=0x80000002,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,hard_timeout=300,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=100,reg14=0x80000003,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,hard_timeout=300,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=150,reg14=0x80000001,metadata=0x$dp_key,dl_src=f0:00:0f:16:10:50 > actions=drop > +priority=150,reg14=0x80000002,metadata=0x$dp_key,dl_src=f0:00:0f:16:10:60 > actions=drop > +priority=150,reg14=0x80000003,metadata=0x$dp_key,dl_src=00:00:00:00:00:01 > actions=drop > +priority=150,reg14=0x80000003,metadata=0x$dp_key,dl_src=f0:00:0f:16:10:70 > actions=drop > +]) > + > +check ovn-nbctl --wait=hv remove logical_switch ls-evpn other_config > fdb_age_threshold > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int > table=OFTABLE_LEARN_REMOTE_FDB | grep priority | \ > + awk '{print $[7], $[8]}' | strip_cookie | sort], [0], [dnl > +priority=100,reg14=0x80000001,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=100,reg14=0x80000002,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=100,reg14=0x80000003,metadata=0x$dp_key > actions=learn(table=OFTABLE_GET_REMOTE_FDB,priority=150,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],load:NXM_NX_REG14[[]]->NXM_NX_REG1[[]]) > +priority=150,reg14=0x80000001,metadata=0x$dp_key,dl_src=f0:00:0f:16:10:50 > actions=drop > +priority=150,reg14=0x80000002,metadata=0x$dp_key,dl_src=f0:00:0f:16:10:60 > actions=drop > +priority=150,reg14=0x80000003,metadata=0x$dp_key,dl_src=00:00:00:00:00:01 > actions=drop > +priority=150,reg14=0x80000003,metadata=0x$dp_key,dl_src=f0:00:0f:16:10:70 > actions=drop > +]) > + > +AS_BOX([L2 EVPN ARP learning]) > +# Add a router connected to the EVPN logical switch. > +check ovn-nbctl --wait=hv \ > + -- lr-add lr \ > + -- lrp-add lr lr-ls-evpn f0:00:0f:16:01:01 172.16.1.1/24 172:16::1/64 \ > + -- lsp-add-router-port ls-evpn ls-evpn-lr lr-ls-evpn > + > +rtr_dp_key=$(fetch_column Datapath tunnel_key external_ids:name=lr) > +rtr_port_key=$(fetch_column Port_Binding tunnel_key logical_port=lr-ls-evpn) > + > +# Simulate remote workload ARPs (type-2 MAC+IP EVPN route). > +# ovn-controller needs to add OF rules for ARP lookup but no rules for > +# MAC_CACHE use. These entries do not age out automatically, their lifetime > +# is controlled by the BGP-EVPN control plane. > +check ip neigh add dev $BR_NAME 172.16.1.50 lladdr f0:00:0f:16:10:50 nud > noarp extern_learn > +check ip neigh add dev $BR_NAME 172.16.1.60 lladdr f0:00:0f:16:10:60 nud > noarp extern_learn > +check ip neigh add dev $BR_NAME 172.16.1.70 lladdr f0:00:0f:16:10:70 nud > noarp extern_learn > + > +check ip -6 neigh add dev $BR_NAME 172:16::50 lladdr f0:00:0f:16:10:50 nud > noarp extern_learn > +check ip -6 neigh add dev $BR_NAME 172:16::60 lladdr f0:00:0f:16:10:60 nud > noarp extern_learn > +check ip -6 neigh add dev $BR_NAME 172:16::70 lladdr f0:00:0f:16:10:70 nud > noarp extern_learn > + > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-arp-list | cut -d',' -f2- > | sort], [0], [dnl > + VNI: 10, MAC: f0:00:0f:16:10:50, IP: 172.16.1.50, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:50, IP: 172:16::50, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:60, IP: 172.16.1.60, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:60, IP: 172:16::60, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:70, IP: 172.16.1.70, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:70, IP: 172:16::70, dp_key: $dp_key > +]) > + > +AS_BOX([Check dynamic-routing-arp-prefer-local=true]) > +check ovn-nbctl --wait=hv set Logical_Switch ls-evpn > other_config:dynamic-routing-arp-prefer-local=true > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_BINDING | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,reg0=0xac10010a,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:01:10,load:0x1->NXM_NX_REG10[[6]] > +priority=20,reg0=0xac100132,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:50,load:0x1->NXM_NX_REG10[[6]] > +priority=20,reg0=0xac10013c,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:60,load:0x1->NXM_NX_REG10[[6]] > +priority=20,reg0=0xac100146,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:70,load:0x1->NXM_NX_REG10[[6]] > +priority=20,reg4=0x1720016,reg5=0,reg6=0,reg7=0x50,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:50,load:0x1->NXM_NX_REG10[[6]] > +priority=20,reg4=0x1720016,reg5=0,reg6=0,reg7=0x60,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:60,load:0x1->NXM_NX_REG10[[6]] > +priority=20,reg4=0x1720016,reg5=0,reg6=0,reg7=0x70,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:70,load:0x1->NXM_NX_REG10[[6]] > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_LOOKUP | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,arp,reg0=0xac10010a,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=20,arp,reg0=0xac100132,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=20,arp,reg0=0xac10013c,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=20,arp,reg0=0xac100146,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=20,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x50,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,icmp_code=0 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=20,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x60,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,icmp_code=0 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=20,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x70,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70,icmp_code=0 > actions=load:0x1->NXM_NX_REG10[[6]] > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_CACHE_USE | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10,arp_op=2 > actions=drop > +priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,nw_src=172.16.1.10 > actions=drop > +]) > + > +AS_BOX([Check dynamic-routing-arp-prefer-local=false]) > +check ovn-nbctl --wait=hv set Logical_Switch ls-evpn > other_config:dynamic-routing-arp-prefer-local=false > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_BINDING | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,reg0=0xac10010a,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:01:10,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg0=0xac100132,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:50,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg0=0xac10013c,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:60,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg0=0xac100146,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:70,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg4=0x1720016,reg5=0,reg6=0,reg7=0x50,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:50,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg4=0x1720016,reg5=0,reg6=0,reg7=0x60,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:60,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg4=0x1720016,reg5=0,reg6=0,reg7=0x70,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:70,load:0x1->NXM_NX_REG10[[6]] > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_LOOKUP | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,arp,reg0=0xac10010a,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,arp,reg0=0xac100132,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,arp,reg0=0xac10013c,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,arp,reg0=0xac100146,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x50,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,icmp_code=0 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x60,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,icmp_code=0 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x70,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70,icmp_code=0 > actions=load:0x1->NXM_NX_REG10[[6]] > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_CACHE_USE | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10,arp_op=2 > actions=drop > +priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,nw_src=172.16.1.10 > actions=drop > +]) > + > +# Check that the recompute won't change the UUIDs and flows. > +ovn-appctl evpn/vtep-arp-list > arp_before > + > +check ovn-appctl inc-engine/recompute > +check ovn-nbctl --wait=hv sync > + > +ovn-appctl evpn/vtep-arp-list > arp_after > + > +check diff -q arp_before arp_after > + > +# Remove remote workload ARP entries and check ovn-controller's state. > +check ip neigh del dev $BR_NAME 172.16.1.50 > +check ip neigh del dev $BR_NAME 172.16.1.60 > +check ip neigh del dev $BR_NAME 172.16.1.70 > + > +check ip -6 neigh del dev $BR_NAME 172:16::50 > +check ip -6 neigh del dev $BR_NAME 172:16::60 > +check ip -6 neigh del dev $BR_NAME 172:16::70 > + > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-arp-list | cut -d',' -f2- > | sort], [0], [dnl > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_BINDING | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,reg0=0xac10010a,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:01:10,load:0x1->NXM_NX_REG10[[6]] > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_LOOKUP | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,arp,reg0=0xac10010a,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10 > actions=load:0x1->NXM_NX_REG10[[6]] > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_CACHE_USE | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10,arp_op=2 > actions=drop > +priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,nw_src=172.16.1.10 > actions=drop > +]) > + > +# Re-add the remote workload ARPs, remove the router, check that flows are > +# removed (vtep-arp-list should still list the ARPs as they're learned on > +# the logical switch that still exists). > +check ip neigh add dev $BR_NAME 172.16.1.50 lladdr f0:00:0f:16:10:50 nud > noarp extern_learn > +check ip neigh add dev $BR_NAME 172.16.1.60 lladdr f0:00:0f:16:10:60 nud > noarp extern_learn > +check ip neigh add dev $BR_NAME 172.16.1.70 lladdr f0:00:0f:16:10:70 nud > noarp extern_learn > + > +check ip -6 neigh add dev $BR_NAME 172:16::50 lladdr f0:00:0f:16:10:50 nud > noarp extern_learn > +check ip -6 neigh add dev $BR_NAME 172:16::60 lladdr f0:00:0f:16:10:60 nud > noarp extern_learn > +check ip -6 neigh add dev $BR_NAME 172:16::70 lladdr f0:00:0f:16:10:70 nud > noarp extern_learn > + > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-arp-list | cut -d',' -f2- > | sort], [0], [dnl > + VNI: 10, MAC: f0:00:0f:16:10:50, IP: 172.16.1.50, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:50, IP: 172:16::50, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:60, IP: 172.16.1.60, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:60, IP: 172:16::60, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:70, IP: 172.16.1.70, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:70, IP: 172:16::70, dp_key: $dp_key > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_BINDING | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,reg0=0xac10010a,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:01:10,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg0=0xac100132,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:50,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg0=0xac10013c,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:60,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg0=0xac100146,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:70,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg4=0x1720016,reg5=0,reg6=0,reg7=0x50,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:50,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg4=0x1720016,reg5=0,reg6=0,reg7=0x60,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:60,load:0x1->NXM_NX_REG10[[6]] > +priority=200,reg4=0x1720016,reg5=0,reg6=0,reg7=0x70,reg15=0x$rtr_port_key,metadata=0x$rtr_dp_key > actions=mod_dl_dst:f0:00:0f:16:10:70,load:0x1->NXM_NX_REG10[[6]] > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_LOOKUP | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +priority=100,arp,reg0=0xac10010a,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,arp,reg0=0xac100132,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,arp,reg0=0xac10013c,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,arp,reg0=0xac100146,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x50,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,icmp_code=0 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x60,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,icmp_code=0 > actions=load:0x1->NXM_NX_REG10[[6]] > +priority=200,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x70,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70,icmp_code=0 > actions=load:0x1->NXM_NX_REG10[[6]] > +]) > + > +check ovn-nbctl --wait=hv lr-del lr > +AT_CHECK_UNQUOTED([ovn-appctl evpn/vtep-arp-list | cut -d',' -f2- | sort], > [0], [dnl > + VNI: 10, MAC: f0:00:0f:16:10:50, IP: 172.16.1.50, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:50, IP: 172:16::50, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:60, IP: 172.16.1.60, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:60, IP: 172:16::60, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:70, IP: 172.16.1.70, dp_key: $dp_key > + VNI: 10, MAC: f0:00:0f:16:10:70, IP: 172:16::70, dp_key: $dp_key > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_BINDING | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +]) > + > +AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_MAC_LOOKUP | > grep priority | \ > + awk '{print $[7], $[8]}' | sort], [0], [dnl > +]) > + > +AS_BOX([L2 EVPN ARP advertising]) > +# Add a router connected to the EVPN logical switch. > +check ovn-nbctl --wait=hv \ > + -- lr-add lr \ > + -- set Logical_Router lr options:chassis=hv1 \ > + -- lrp-add lr lr-ls-evpn f0:00:0f:16:01:01 172.16.1.1/24 172:16::1/64 > + > +ls_evpn_uuid=$(fetch_column Datapath_Binding _uuid external_ids:name=ls-evpn) > +check ovn-nbctl --wait=hv set logical_switch ls-evpn > other_config:dynamic-routing-redistribute=fdb,ip > +check_row_count Advertised_MAC_Binding 1 ip='172.16.1.10' > mac='f0\:00\:0f\:16\:01\:10' datapath=$ls_evpn_uuid > +check_row_count Advertised_MAC_Binding 1 ip='172.16.1.1' > mac='f0\:00\:0f\:16\:01\:01' datapath=$ls_evpn_uuid > +check_row_count Advertised_MAC_Binding 1 ip='172\:16\:\:10' > mac='f0\:00\:0f\:16\:01\:10' datapath=$ls_evpn_uuid > +check_row_count Advertised_MAC_Binding 1 ip='172\:16\:\:1' > mac='f0\:00\:0f\:16\:01\:01' datapath=$ls_evpn_uuid > +check_row_count Advertised_MAC_Binding 4 > + > +AT_CHECK([ip neigh show dev $BR_NAME nud noarp | grep -q '172.16.1.10 lladdr > f0:00:0f:16:01:10 NOARP']) > +AT_CHECK([ip neigh show dev $BR_NAME nud noarp | grep -q '172.16.1.1 lladdr > f0:00:0f:16:01:01 NOARP']) > +AT_CHECK([ip -6 neigh show dev $BR_NAME nud noarp | grep -q '172:16::10 > lladdr f0:00:0f:16:01:10 NOARP']) > +AT_CHECK([ip -6 neigh show dev $BR_NAME nud noarp | grep -q '172:16::1 > lladdr f0:00:0f:16:01:01 NOARP']) > + > +OVS_WAIT_FOR_OUTPUT_UNQUOTED([bridge fdb show | grep $LO_NAME | grep > "f0:00:0f:16:01" | sort], [0], [dnl > +f0:00:0f:16:01:01 dev $LO_NAME master $BR_NAME static > +f0:00:0f:16:01:01 dev $LO_NAME vlan 1 master $BR_NAME static > +f0:00:0f:16:01:10 dev $LO_NAME master $BR_NAME static > +f0:00:0f:16:01:10 dev $LO_NAME vlan 1 master $BR_NAME static > +]) > + > +check ovn-nbctl --wait=hv lsp-add ls-evpn workload2 \ > + -- lsp-set-addresses workload2 "f0:00:0f:16:01:20 172.16.1.20 172:16::20" > + > +check_row_count Advertised_MAC_Binding 1 ip='172.16.1.20' > mac='f0\:00\:0f\:16\:01\:20' datapath=$ls_evpn_uuid > +AT_CHECK([ip neigh show dev $BR_NAME nud noarp | grep -q '172.16.1.20 lladdr > f0:00:0f:16:01:20 NOARP']) > + > +check_row_count Advertised_MAC_Binding 1 ip='172\:16\:\:20' > mac='f0\:00\:0f\:16\:01\:20' datapath=$ls_evpn_uuid > +AT_CHECK([ip -6 neigh show dev $BR_NAME nud noarp | grep -q '172:16::20 > lladdr f0:00:0f:16:01:20 NOARP']) > + > +check ovn-nbctl --wait=hv lsp-del workload2 > +AT_CHECK([ip neigh show dev $BR_NAME nud noarp | grep -q '172.16.1.20 lladdr > f0:00:0f:16:01:20 NOARP'], [1]) > +AT_CHECK([ip -6 neigh show dev $BR_NAME nud noarp | grep -q '172:16::20 > lladdr f0:00:0f:16:01:20 NOARP'], [1]) > + > +check ovn-nbctl --wait=hv lsp-del workload1 > +check_row_count Advertised_MAC_Binding 2 > +AT_CHECK([ip neigh show dev $BR_NAME nud noarp | grep -q '172.16.1.10 lladdr > f0:00:0f:16:01:10 NOARP'], [1]) > +AT_CHECK([ip -6 neigh show dev $BR_NAME nud noarp | grep -q '172:16::10 > lladdr f0:00:0f:16:01:10 NOARP'], [1]) > + > +check ovn-nbctl --wait=hv lrp-del lr-ls-evpn > +check_row_count Advertised_MAC_Binding 0 > +AT_CHECK([ip neigh show dev $BR_NAME nud noarp | grep -q '172.16.1.1 lladdr > f0:00:0f:16:01:01 NOARP'], [1]) > +AT_CHECK([ip -6 neigh show dev $BR_NAME nud noarp | grep -q '172:16::1 > lladdr f0:00:0f:16:01:01 NOARP'], [1]) > + > +check ovn-nbctl --wait=hv ls-del ls-evpn > +check ovn-nbctl --wait=hv lr-del lr > + > +OVN_CLEANUP_CONTROLLER([hv1]) > + > +OVN_CLEANUP_NORTHD > + > +as > +OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port patch-.*/d > +/Failed to acquire.*/d > +/connection dropped.*/d"]) > +AT_CLEANUP > +]) > + > +]) dnl EVPN_SWITCH_TESTS > + > EVPN_SWITCH_TESTS([default]) > EVPN_SWITCH_TESTS([custom]) > > -- > 2.52.0 >
_______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
