Skip to content

Commit

Permalink
tests: ic: Add IP multicast test that simulates the ovn-k8s use case.
Browse files Browse the repository at this point in the history
The already existing "interconnection - IGMP/MLD multicast" test
simulated a slightly different topology (still valid though).

Signed-off-by: Dumitru Ceara <dceara@redhat.com>
Acked-by: Numan Siddique <numans@ovn.org>
Signed-off-by: Mark Michelson <mmichels@redhat.com>
  • Loading branch information
dceara authored and putnopvut committed Jun 18, 2024
1 parent d904c0e commit 03fb88c
Showing 1 changed file with 246 additions and 0 deletions.
246 changes: 246 additions & 0 deletions tests/ovn-ic.at
Original file line number Diff line number Diff line change
Expand Up @@ -2096,3 +2096,249 @@ OVN_CLEANUP_SBOX([hv2], ["/IGMP Querier enabled without a valid IPv4/d
OVN_CLEANUP_IC([az1],[az2])
AT_CLEANUP
])

OVN_FOR_EACH_NORTHD([
AT_SETUP([interconnection - IGMP/MLD multicast - TS flood])
AT_KEYWORDS([IP-multicast])

# Logical network:
#
# AZ1 | AZ2
# ---------------------------------------------------------------------
# |
# | +-- LR2 --- LS2 --- LSP2 (sender)
# | /
# LSP1 --- LS1 --- LR1 --- TS ---
# (receiver) | \
# | +-- LR3 --- LS3 --- LSP3 (receiver)
#
# LS1, LS2, LS3, TS configured to snoop IP multicast.
# LR1, LR2, LR3 configured to relay IP multicast.
# LR1-TS configured to flood IP multicast traffic unconditionally.
# LR2-TS configured to flood IP multicast traffic unconditionally.
# LR3-TS configured to flood IP multicast traffic unconditionally.

AT_CAPTURE_FILE([exp])
AT_CAPTURE_FILE([rcv])
check_packets() {
> exp
> rcv
if test "$1" = --uniq; then
sort="sort -u"; shift
else
sort=sort
fi
for tuple in "$@"; do
set $tuple; pcap=$1 type=$2
echo "--- $pcap" | tee -a exp >> rcv
$sort "$type" >> exp
$PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" $pcap | $sort >> rcv
echo | tee -a exp >> rcv
done

$at_diff exp rcv >/dev/null
}

ovn_init_ic_db
ovn_start az1
ovn_start az2

net_add n1

sim_add hv1
as hv1
check ovs-vsctl add-br br-phys
ovn_az_attach az1 n1 br-phys 192.168.1.1 16
check ovs-vsctl -- add-port br-int hv1-vif1 \
-- set interface hv1-vif1 external-ids:iface-id=lsp1 \
options:tx_pcap=hv1/vif1-tx.pcap \
options:rxq_pcap=hv1/vif1-rx.pcap
check ovs-vsctl set open . external-ids:ovn-is-interconn=true

sim_add hv2
as hv2
check ovs-vsctl add-br br-phys
ovn_az_attach az2 n1 br-phys 192.168.2.1 16
check ovs-vsctl -- add-port br-int hv2-vif1 \
-- set interface hv2-vif1 external-ids:iface-id=lsp2 \
options:tx_pcap=hv2/vif1-tx.pcap \
options:rxq_pcap=hv2/vif1-rx.pcap
check ovs-vsctl -- add-port br-int hv2-vif2 \
-- set interface hv2-vif2 external-ids:iface-id=lsp3 \
options:tx_pcap=hv2/vif2-tx.pcap \
options:rxq_pcap=hv2/vif2-rx.pcap
check ovs-vsctl set open . external-ids:ovn-is-interconn=true

AT_CHECK([ovn-ic-nbctl --wait=sb create Transit_Switch name=ts], [0], [ignore])
check ovn_as az1 ovn-nbctl wait-until logical_switch ts
check ovn_as az2 ovn-nbctl wait-until logical_switch ts

ovn_as az1
check ovn-nbctl lr-add lr1 \
-- lrp-add lr1 lr1-ts 00:00:00:01:00:01 42.42.42.1/24 4242::1/64 \
-- lrp-add lr1 lr1-ls1 00:00:00:01:01:00 43.43.43.1/24 4343::1/64\
-- lrp-set-gateway-chassis lr1-ts hv1
check ovn-nbctl ls-add ls1 \
-- lsp-add ls1 ls1-lr1 \
-- lsp-set-addresses ls1-lr1 router \
-- lsp-set-type ls1-lr1 router \
-- lsp-set-options ls1-lr1 router-port=lr1-ls1 \
-- lsp-add ls1 lsp1
check ovn-nbctl lsp-add ts ts-lr1 \
-- lsp-set-addresses ts-lr1 router \
-- lsp-set-type ts-lr1 router \
-- lsp-set-options ts-lr1 router-port=lr1-ts
wait_for_ports_up

ovn_as az2
check ovn-nbctl lr-add lr2 \
-- lrp-add lr2 lr2-ts 00:00:00:02:00:01 42.42.42.2/24 4242::2/64 \
-- lrp-add lr2 lr2-ls2 00:00:00:02:01:00 44.44.44.1/24 4444::1/64 \
-- lrp-set-gateway-chassis lr2-ts hv2
check ovn-nbctl ls-add ls2 \
-- lsp-add ls2 ls2-lr2 \
-- lsp-set-addresses ls2-lr2 router \
-- lsp-set-type ls2-lr2 router \
-- lsp-set-options ls2-lr2 router-port=lr2-ls2 \
-- lsp-add ls2 lsp2
check ovn-nbctl lsp-add ts ts-lr2 \
-- lsp-set-addresses ts-lr2 router \
-- lsp-set-type ts-lr2 router \
-- lsp-set-options ts-lr2 router-port=lr2-ts

check ovn-nbctl lr-add lr3 \
-- lrp-add lr3 lr3-ts 00:00:00:02:00:02 42.42.42.3/24 4242::3/64 \
-- lrp-add lr3 lr3-ls3 00:00:00:02:02:00 44.44.45.1/24 4445::1/64 \
-- lrp-set-gateway-chassis lr3-ts hv2
check ovn-nbctl ls-add ls3 \
-- lsp-add ls3 ls3-lr3 \
-- lsp-set-addresses ls3-lr3 router \
-- lsp-set-type ls3-lr3 router \
-- lsp-set-options ls3-lr3 router-port=lr3-ls3 \
-- lsp-add ls3 lsp3
check ovn-nbctl lsp-add ts ts-lr3 \
-- lsp-set-addresses ts-lr3 router \
-- lsp-set-type ts-lr3 router \
-- lsp-set-options ts-lr3 router-port=lr3-ts

wait_for_ports_up
check ovn-ic-nbctl --wait=sb sync
ovn_as az1
check ovn-nbctl lsp-set-options ts-lr2 requested-chassis=hv2
check ovn-nbctl lsp-set-options ts-lr3 requested-chassis=hv2

ovn_as az2
check ovn-nbctl lsp-set-options ts-lr1 requested-chassis=hv1

dnl Enable IP multicast snooping and IP multicast relay. Reports are
dnl forwarded statically.
ovn_as az1
check ovn-nbctl set logical_switch ls1 other_config:mcast_snoop="true"
check ovn-nbctl set logical_router lr1 options:mcast_relay="true"
check ovn-nbctl set logical_router_port lr1-ts options:mcast_flood="true"
check ovn-nbctl set logical_switch ts other_config:mcast_snoop="true"
check ovn-nbctl set logical_switch ts other_config:mcast_flood_unregistered="true"

ovn_as az2
check ovn-nbctl set logical_switch ls2 other_config:mcast_snoop="true"
check ovn-nbctl set logical_router lr2 options:mcast_relay="true"
check ovn-nbctl set logical_router_port lr2-ts options:mcast_flood="true"
check ovn-nbctl set logical_switch ls3 other_config:mcast_snoop="true"
check ovn-nbctl set logical_router lr3 options:mcast_relay="true"
check ovn-nbctl set logical_router_port lr3-ts options:mcast_flood="true"
check ovn-nbctl set logical_switch ts other_config:mcast_snoop="true"
check ovn-nbctl set logical_switch ts other_config:mcast_flood_unregistered="true"

check ovn_as az1 ovn-nbctl --wait=hv sync
check ovn_as az2 ovn-nbctl --wait=hv sync

# Pre-populate the hypervisors' ARP tables so that we don't lose any
# packets for ARP resolution (native tunneling doesn't queue packets
# for ARP resolution).
OVN_POPULATE_ARP

# Inject IGMP Join for 239.0.1.68 on LSP1.
send_igmp_v3_report hv1-vif1 hv1 \
000000000001 $(ip_to_hex 10 0 0 1) f9f8 \
$(ip_to_hex 239 0 1 68) 04 e9b9 \
/dev/null

# Inject MLD Join for ff0a:dead:beef::1 on LSP1.
send_mld_v2_report hv1-vif1 hv1 \
000000000001 10000000000000000000000000000001 \
ff0adeadbeef00000000000000000001 04 c0e4 \
/dev/null

# Inject IGMP Join for 239.0.1.68 on LSP3.
send_igmp_v3_report hv2-vif2 hv2 \
000000000001 $(ip_to_hex 10 0 0 1) f9f8 \
$(ip_to_hex 239 0 1 68) 04 e9b9 \
/dev/null

# Inject MLD Join for ff0a:dead:beef::1 on LSP3.
send_mld_v2_report hv2-vif2 hv2 \
000000000001 10000000000000000000000000000001 \
ff0adeadbeef00000000000000000001 04 c0e4 \
/dev/null

# Check that the IGMP and MLD groups are learned on both AZs (on the LS
# and TS).
ovn_as az1
wait_row_count IGMP_Group 2 address=239.0.1.68
wait_row_count IGMP_Group 2 address='"ff0a:dead:beef::1"'
check ovn-nbctl --wait=hv sync

ovn_as az2
wait_row_count IGMP_Group 2 address=239.0.1.68
wait_row_count IGMP_Group 2 address='"ff0a:dead:beef::1"'
check ovn-nbctl --wait=hv sync

# Send an IP multicast packet from LSP2, it should be forwarded
# to lsp1 and lsp3.
> expected_az1
> expected_az2
send_ip_multicast_pkt hv2-vif1 hv2 \
000000000001 01005e000144 \
$(ip_to_hex 44 44 44 2) $(ip_to_hex 239 0 1 68) 1e 20 7c6b 11 \
e518e518000aed350000
store_ip_multicast_pkt \
000000010100 01005e000144 \
$(ip_to_hex 44 44 44 2) $(ip_to_hex 239 0 1 68) 1e 1e 7e6b 11 \
e518e518000aed350000 expected_az1
store_ip_multicast_pkt \
000000020200 01005e000144 \
$(ip_to_hex 44 44 44 2) $(ip_to_hex 239 0 1 68) 1e 1e 7e6b 11 \
e518e518000aed350000 expected_az2

send_ip6_multicast_pkt hv2-vif1 hv2 \
000000000001 333300000001 \
00100000000000000000000000000042 ff0adeadbeef00000000000000000001 \
000e 40 11 \
93407a69000e2b4e61736461640a
store_ip6_multicast_pkt \
000000010100 333300000001 \
00100000000000000000000000000042 ff0adeadbeef00000000000000000001 \
000e 3e 11 \
93407a69000e2b4e61736461640a \
expected_az1
store_ip6_multicast_pkt \
000000020200 333300000001 \
00100000000000000000000000000042 ff0adeadbeef00000000000000000001 \
000e 3e 11 \
93407a69000e2b4e61736461640a \
expected_az2

OVS_WAIT_UNTIL(
[check_packets 'hv1/vif1-tx.pcap expected_az1' \
'hv2/vif2-tx.pcap expected_az2'],
[$at_diff -F'^---' exp rcv])

OVN_CLEANUP_SBOX([hv1], ["/IGMP Querier enabled without a valid IPv4/d
/IGMP Querier enabled with invalid ETH src/d"])

OVN_CLEANUP_SBOX([hv2], ["/IGMP Querier enabled without a valid IPv4/d
/IGMP Querier enabled with invalid ETH src/d"])

OVN_CLEANUP_IC([az1],[az2])
AT_CLEANUP
])

0 comments on commit 03fb88c

Please sign in to comment.