Skip to content

Commit

Permalink
controller: Add lsp option disable_garp_rarp.
Browse files Browse the repository at this point in the history
If the lsp option 'disable_garp_rarp' is set to true,
GARP and RARP announcements are not sent by ovn when a
VIF port is created on a bridged logical switch.

Usecase
========
This option is useful during VM migration to let the
hypervisor/VM send the RARP/GARP once VM is ready to
process the packets post migration. This helps to reduce
downtime during VM migration.

Signed-off-by: Shibir Basak <shibir.basak@nutanix.com>
Acked-by: Naveen Yerramneni <naveen.yerramneni@nutanix.com>
Signed-off-by: Numan Siddique <numans@ovn.org>
  • Loading branch information
shibir-basak authored and numansiddique committed Jul 30, 2024
1 parent ccc7206 commit 6234e09
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 2 deletions.
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ Post v24.03.0
- Add support for CT zone limit that can be specified per LR
(options:ct-zone-limit), LS (other_config:ct-zone-limit) or LSP
(options:ct-zone-limit).
- A new LSP option "disable_garp_rarp" has been added to prevent OVN from
sending GARP or RARP announcements when a VIF is created on a bridged
logical switch.

OVN v24.03.0 - 01 Mar 2024
--------------------------
Expand Down
4 changes: 2 additions & 2 deletions controller/pinctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -6612,7 +6612,7 @@ send_garp_rarp_prepare(struct ovsdb_idl_txn *ovnsb_idl_txn,
SSET_FOR_EACH (iface_id, &localnet_vifs) {
const struct sbrec_port_binding *pb = lport_lookup_by_name(
sbrec_port_binding_by_name, iface_id);
if (pb) {
if (pb && !smap_get_bool(&pb->options, "disable_garp_rarp", false)) {
send_garp_rarp_update(ovnsb_idl_txn,
sbrec_mac_binding_by_lport_ip,
local_datapaths, pb, &nat_addresses,
Expand All @@ -6625,7 +6625,7 @@ send_garp_rarp_prepare(struct ovsdb_idl_txn *ovnsb_idl_txn,
SSET_FOR_EACH (gw_port, &local_l3gw_ports) {
const struct sbrec_port_binding *pb
= lport_lookup_by_name(sbrec_port_binding_by_name, gw_port);
if (pb) {
if (pb && !smap_get_bool(&pb->options, "disable_garp_rarp", false)) {
send_garp_rarp_update(ovnsb_idl_txn, sbrec_mac_binding_by_lport_ip,
local_datapaths, pb, &nat_addresses,
garp_max_timeout, garp_continuous);
Expand Down
7 changes: 7 additions & 0 deletions ovn-nb.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1329,6 +1329,13 @@
The default value is <code>false</code>.
</column>

<column name="options" key="disable_garp_rarp"
type='{"type": "boolean"}'>
If set to <code>true</code>, GARP and RARP announcements are not
sent when a VIF port is created on a bridged logical switch.
The default value is <code>false</code>.
</column>

<column name="options" key="pkt_clone_type"
type='{"type": "string", "enum": ["set", ["mc_unknown"]]}'>
If set to mc_unknown, packets going to this VIF get cloned to all
Expand Down
68 changes: 68 additions & 0 deletions tests/ovn.at
Original file line number Diff line number Diff line change
Expand Up @@ -25012,6 +25012,74 @@ OVN_CLEANUP([hv1])
AT_CLEANUP
])

OVN_FOR_EACH_NORTHD([
AT_SETUP([Disabling RARP/GARP announcements])
ovn_start

# In this test case we create 1 switch and bring up 4 VIFs on it.
# Two VIFs will be assigned MAC addresses only (i.e. without ips)
# and two VIFs will be assigned IP addresses along with MAC addresses.
# VIFs with IPs are supposed to send GARPs and VIFs with only MAC
# addresses are supposed to send RARP. However, we test the lsp
# option disable_garp_rarp, which when set to true for an lsp does
# not send the GARP/RARP announcements.

ovn-nbctl ls-add ls1
ovn-nbctl lsp-add ls1 ln1 "" 101
ovn-nbctl lsp-set-addresses ln1 unknown
ovn-nbctl lsp-set-type ln1 localnet
ovn-nbctl lsp-set-options ln1 network_name=phys

ovn-nbctl lsp-add ls1 lp11
ovn-nbctl lsp-set-addresses lp11 "f0:00:00:00:00:11"

ovn-nbctl lsp-add ls1 lp12
ovn-nbctl lsp-set-addresses lp12 "f0:00:00:00:00:12"
ovn-nbctl set logical_switch_port lp12 options:disable_garp_rarp=true

ovn-nbctl lsp-add ls1 lp13
ovn-nbctl lsp-set-addresses lp13 "f0:00:00:00:00:13 192.168.1.3"

ovn-nbctl lsp-add ls1 lp14
ovn-nbctl lsp-set-addresses lp14 "f0:00:00:00:00:14 192.168.1.4"
ovn-nbctl set logical_switch_port lp14 options:disable_garp_rarp=true

net_add n1

sim_add hv1
as hv1
ovs-vsctl add-br br-phys
ovs-vsctl set open . external-ids:ovn-bridge-mappings=phys:br-phys
ovn_attach n1 br-phys 192.168.0.1

AT_CHECK([ovs-vsctl add-port br-phys snoopvif -- set Interface snoopvif options:tx_pcap=hv1/snoopvif-tx.pcap options:rxq_pcap=hv1/snoopvif-rx.pcap])

ovs-vsctl add-port br-int vif11 -- \
set Interface vif11 external-ids:iface-id=lp11

ovs-vsctl add-port br-int vif12 -- \
set Interface vif12 external-ids:iface-id=lp12

ovs-vsctl add-port br-int vif13 -- \
set Interface vif13 external-ids:iface-id=lp13

ovs-vsctl add-port br-int vif14 -- \
set Interface vif14 external-ids:iface-id=lp14

wait_for_ports_up
ovn-nbctl --wait=sb sync

# RARP packet for lp11
echo "fffffffffffff000000000118100006580350001080006040003f0000000001100000000f0000000001100000000" > expected
# GARP packet for lp13
echo "fffffffffffff000000000138100006508060001080006040001f00000000013c0a80103000000000000c0a80103" >> expected
OVN_CHECK_PACKETS_UNIQ([hv1/snoopvif-tx.pcap], [expected])

OVN_CLEANUP([hv1])

AT_CLEANUP
])

OVN_FOR_EACH_NORTHD([
AT_SETUP([Stateless Floating IP])
ovn_start
Expand Down

0 comments on commit 6234e09

Please sign in to comment.