** Description changed:

  [ Impact ]
  
- ovn 26.03.0 (Ubuntu Resolute 26.03.0-2, Ubuntu Cloud Archive gazpacho
- 26.03.0-2~cloud0) drops ARP requests that enter a logical switch through
- its localnet port when the switch also has a distributed gateway router
- port. In OpenStack terms this happens on any provider network that is
- used as a Neutron router external gateway.
+ ovn 26.03.0 (Resolute 26.03.0-2, UCA gazpacho 26.03.0-2~cloud0) includes
+ upstream commit 1b4058b9 ("northd: Process external arps on ha chassis").
+ On a provider network that is used as a router external gateway, it drops
+ ARP requests arriving from the localnet port on every non-gateway
+ chassis, so VMs on that network become unreachable from the physical
+ network and from VMs on other chassis.
  
- Upstream commit 1b4058b9 ("northd: Process external arps on ha chassis"),
- which first shipped in v26.03.0 (it is not in v25.09.0), installs these
- logical flows on such a switch:
+ Upstream reverted this commit and its 4 follow-ups in v26.03.2:
+  - 78659feb Revert "Process external arps on ha chassis"
+  - edf1f564 Revert "Fix receiving ARP reply on non-resident chassis"
+  - 759ec0da Revert "Fix for distributed dnat_and_snat ARP resolution"
+  - b218c635 Revert "Make sure we process external ARPs even on GW routers"
+  - d93cb42a Revert "Restrict external ARP request to logical_ip for 
dnat_and_snat"
  
-   ls_in_check_port_sec  priority 75: arp.op == 1 && inport == "provnet-<id>"  
-> reg0[22] = 1
-   ls_in_apply_port_sec  priority 85: reg0[22] == 1 && arp.tpa == <FIP> && 
is_chassis_resident("<fip-port>") -> next
-   ls_in_apply_port_sec  priority 75: reg0[22] == 1 && 
is_chassis_resident("cr-lrp-<id>") -> next
-   ls_in_apply_port_sec  priority 70: reg0[22] == 1 -> drop
+ v26.03.2 in turn contains 579abb5e ("northd: Fix HM reply lflow for
+ type=external backends on localnet LS."), which was reverted in v26.03.3
+ (ca33b0da) because it can cause a packet storm.
  
- On every chassis that is not the gateway chassis, an ARP request coming in
- from the localnet port matches the priority 70 drop. As a result, a VM
- plugged directly into the provider network on a non-gateway compute node
- never receives ARP requests for its own IP from the physical network or
- from VMs on other chassis.
- 
- The failure is limited to ARP requests (op=1) that arrive through
- localnet. ARP requests sent by the VM, ARP replies (op=2) and normal IP
- traffic are forwarded correctly. The VM port's port_security setting has
- no effect: VMs with port security enabled are dropped as well.
- 
- User-visible effects:
- 
-  * A VM on the provider network becomes unreachable from outside every
-    time the peer's ARP cache entry for it expires, until the VM itself
-    sends traffic that refreshes the entry.
- 
-  * L2 VIPs that only answer ARP requests (for example Cilium L2
-    announcements or MetalLB in L2 mode) running inside such VMs are
-    unreachable permanently.
- 
-  * VIP tools that send periodic gratuitous ARP (keepalived, kube-vip)
-    keep working.
- 
- Logical switches without a router port are not affected. In one
- deployment with 5 provider logical switches, the 3 switches that have a
- router port had the drop flow and the 2 without one did not.
- 
- Workaround: send a gratuitous ARP in reply form from the VM
- ("arping -U -P -i <iface> -S <ip> <ip>"). This restores reachability
- until the peers' ARP cache entries expire again.
- 
- Fix: upstream reverted 1b4058b9 together with the 4 related commits that
- came with it. The reverts are in v26.03.2 and v26.09.0 (v26.03.1 does not
- include them). v26.03.2 also adds "northd: Enable ARP/ND responder for
- localnet-sourced requests" and the test "ARP to VIF port on LS with
- localnet port". This bug requests an update of ovn in Resolute and in the
- gazpacho Ubuntu Cloud Archive to the 26.03.2 (or later 26.03.x) upstream
- point release.
+ This bug requests updating ovn to the 26.03.3 upstream point release.
  
  [ Test Plan ]
  
- Minimal topology: one provider (localnet) network, one Neutron router
- whose external gateway is on that network, and one VM on that network on
- a compute node that is not the router's gateway chassis.
- 
- Example values used below: provider subnet 192.0.2.0/24, VM IP
- 192.0.2.10, external host 192.0.2.1 connected to the same physical
- network, compute nodes compute-a (VM) and gateway node gw-a.
- 
- 1. Create the topology:
- 
-    openstack network create --external --provider-network-type flat \
-        --provider-physical-network physnet1 ext-net
-    openstack subnet create --network ext-net --subnet-range 192.0.2.0/24 \
-        --gateway 192.0.2.1 ext-subnet
-    openstack router create r1
-    openstack router set --external-gateway ext-net r1
-    openstack server create --network ext-net --flavor <flavor> \
-        --image <image> --availability-zone nova:compute-a vm1
- 
-    Confirm that compute-a is not the gateway chassis of the router port:
- 
-    ovn-nbctl lrp-get-gateway-chassis lrp-<router-gw-port-id>
- 
- 2. Check (a), logical flows:
- 
-    ovn-sbctl lflow-list neutron-<network-id> | grep 'reg0\[22\]'
- 
-    Affected (26.03.0): the four flows listed in [ Impact ] are present,
-    including "priority=70, match=(reg0[22] == 1), action=(drop;)" in
-    ls_in_apply_port_sec.
- 
- 3. Check (b), datapath behaviour:
- 
-    From the external host:
- 
-    arping -c 3 -I <iface> 192.0.2.10
- 
-    Affected (26.03.0): no replies.
- 
-    On compute-a, trace an ARP request entering br-int from the localnet
-    patch port. Use the br-int side of the patch pair,
-    patch-br-int-to-provnet-<id>. Its peer, patch-provnet-<id>-to-br-int,
-    is on the provider bridge; used as in_port on br-int it only hits the
-    table 0 default drop on any version. For a VLAN provider network, add
-    dl_vlan=<tag>:
- 
-    ovs-vsctl get Interface patch-br-int-to-provnet-<id> ofport
-    ovs-appctl ofproto/trace br-int \
-        
in_port=<ofport>,arp,arp_op=1,dl_src=<ext-mac>,dl_dst=ff:ff:ff:ff:ff:ff,arp_sha=<ext-mac>,arp_spa=0:00:00:00,arp_tpa=192.0.2.10
- 
-    Affected (26.03.0) output, abbreviated:
- 
-      8. arp,reg14=0x1,metadata=0x5,arp_op=1, priority 75 -> reg0[22]=1
-      9. reg0=0x400000/0x400000,metadata=0x5, priority 70 -> drop
- 
-    The same trace with arp_op=2 reaches the VM's tap interface.
-    The drop flow counter on compute-a keeps increasing:
- 
-      ovs-ofctl dump-flows br-int table=9 | grep 'reg0=0x400000/0x400000'
-      cookie=..., table=9, n_packets=57988, 
priority=70,reg0=0x400000/0x400000,metadata=0x5 actions=drop
- 
-    The same happens between VMs: when a VM on another compute node sends
-    "who-has 192.0.2.10", the request reaches the uplink of compute-a but
-    is never delivered to vm1's tap interface.
- 
- 4. Upgrade ovn on all nodes to the proposed package and repeat 2 and 3.
-    On deployments with VLAN provider networks created by Neutron, do the
-    tag_request backfill described in [ Where problems could occur ]
-    first.
- 
-    Expected (fixed):
- 
-    - The "reg0[22] == 1 -> drop" flow is no longer installed.
-    - arping from the external host gets replies.
-    - The ofproto/trace for arp_op=1 is no longer dropped:
-      * If vm1's port has known addresses (port security enabled), the
-        ARP responder added in 26.03.2 answers on compute-a. The datapath
-        actions rewrite the packet to an ARP reply (op=2) with vm1's MAC
-        and send it back out the uplink; the request itself does not
-        reach vm1.
-      * If vm1's port has the "unknown" address (port security disabled),
-        the request is delivered to vm1's tap interface and vm1 replies.
-      * On a chassis where vm1 is not bound, no reply is generated.
-    - ARP between VMs on different non-gateway compute nodes works with
-      port security both enabled and disabled.
- 
- 5. Regression testing: run the usual OpenStack QA process for the UCA
-    (deployment plus Tempest smoke tests), including floating IP and
-    router gateway connectivity on a provider network. On VLAN provider
-    networks, also confirm that every localnet port keeps its tag after
-    the upgrade:
- 
-    ovn-nbctl --columns=name,tag,tag_request find Logical_Switch_Port
- type=localnet
+ 1. Provider network with a Neutron router external gateway on it, and a
+    VM on that network on a compute node that is not the gateway chassis.
+ 2. On 26.03.0, check that the drop flow exists:
+      ovn-sbctl lflow-list | grep 'reg0\[22\] == 1'
+    and that arping to the VM from the physical network gets no reply.
+ 3. Upgrade to the proposed package: the flow is gone and arping gets
+    replies.
+ 4. Usual OpenStack QA for the UCA (deployment plus Tempest smoke tests).
  
  [ Where problems could occur ]
  
-  * This is a minor upstream update from 26.03.0 to 26.03.2, so it brings
-    in all other fixes in 26.03.1 and 26.03.2, not only the reverts. Any
-    of these could change logical flow generation in northd or flow
-    installation in ovn-controller. A regression would show up as lost or
-    misrouted traffic on logical switches and routers after the update.
+  * This is a minor upstream update, so it brings in all fixes in
+    26.03.1, 26.03.2 and 26.03.3. A regression would show up as lost or
+    misrouted traffic on logical switches and routers.
  
-  * 26.03.2 contains "northd: Clear stale LSP tags on tag_request
-      port directly into tag and left tag_request empty (LP: #2155789).
-      The Neutron fix makes it write tag_request instead, but only for
-      ports it creates or updates afterwards; existing localnet ports are
-      not backfilled, even after Neutron itself is upgraded.
+  * 26.03.2 and later include cbb71611 ("northd: Clear stale LSP tags on
+    tag_request removal"). Neutron deployments whose VLAN localnet ports
+    only have tag set (see LP: #2155789) lose the VLAN tag after the
+    upgrade. Set tag_request to the current tag on those ports before
+    upgrading.
  
-      On such deployments, upgrading ovn-northd to 26.03.2 removes the VLAN
-      tag from the localnet port of every existing VLAN provider network,
-      and traffic on those networks stops. Downgrading ovn does not restore
-      it, because the tag is removed from the NB database. This was
-      reproduced on a test deployment: all VLAN provider networks created
-      before the Neutron fix lost connectivity, and the one created after
-      it was unaffected.
+ [ Other Info ]
  
-      Before upgrading, set tag_request to the current tag on every
-      localnet port that has a tag and no tag_request:
- 
-        ovn-nbctl --columns=name,tag,tag_request find Logical_Switch_Port 
type=localnet
-        ovn-nbctl set Logical_Switch_Port <name> tag_request=<tag>
- 
-      With this backfill done first, the update kept all tags and
-      connectivity on the test deployment. Flat provider networks have no
-      tag and are not affected. This upgrade step should be documented
-      for users of the updated package.
- 
-    * The five reverted commits restore the 25.09 behaviour for ARP requests
-      that arrive from a localnet port on a switch with a distributed
-      gateway port. Deployments that came to depend on the 26.03.0 behaviour
-      for router gateway or dnat_and_snat (floating IP) addresses would see
-      ARP handling for those addresses change after the update.
- 
-    * 26.03.2 adds a new ARP/ND responder for requests that come from a
-      localnet port. Its logical flow only replies when the target logical
-      switch port is resident on the local chassis (is_chassis_resident), so
-      a port that is not bound to any chassis (status DOWN) but has the
-      requested IP reserved gets no reply. This was checked on a test
-      deployment: OVN did not answer for an unbound Neutron port with a
-      fixed IP on the provider network, and an L2 VIP using that IP inside
-      a VM kept working. Deployments that reserve IPs this way should still
-      confirm the same behaviour.
- 
-    * During the upgrade, ovn-northd/NB/SB and ovn-controller run different
-      versions for a short time. Upgrade ordering should follow the usual
-      OVN guidance (ovn-controller first, then the central components).
- 
-   [ Other Info ]
- 
-    * Affected packages:
-      - Ubuntu Resolute (26.04): ovn 26.03.0-2
-      - Ubuntu Cloud Archive gazpacho (noble): ovn 26.03.0-2~cloud0
- 
-    * Not affected: v25.09.0 (does not contain 1b4058b9).
- 
-    * Cause:
-      https://github.com/ovn-org/ovn/commit/1b4058b9
-      Patch discussion:
-      http://www.mail-archive.com/[email protected]/msg99363.html
- 
-    * Upstream fix, in v26.03.2 and v26.09.0:
-      - 78659feb Revert "Process external arps on ha chassis"
-      - edf1f564 Revert "Fix receiving ARP reply on non-resident chassis"
-      - 759ec0da Revert "Fix for distributed dnat_and_snat ARP resolution"
-      - b218c635 Revert "Make sure we process external ARPs even on GW routers"
-      - d93cb42a Revert "Restrict external ARP request to logical_ip for 
dnat_and_snat"
-      Also in v26.03.2: "northd: Enable ARP/ND responder for localnet-sourced
-      requests" and the test "ARP to VIF port on LS with localnet port".
-      v26.03.1 does not contain the fix.
- 
-    * Verified on a test deployment with ovn 26.03.2 built from upstream
-      source: with the topology above (VLAN provider network, router
-      gateway on a separate gateway chassis, VMs on two non-gateway compute
-      nodes), the drop flow is gone and ARP from the physical network and
-      between VMs on different compute nodes works.
- 
-    * Related: LP: #2155789 (Neutron writes LSP.tag instead of tag_request),
-      https://github.com/ovn-org/ovn/commit/cbb71611
- 
-    * Changelogs:
-      https://www.ovn.org/en/releases/changelog_v26.03.0/
-      https://www.ovn.org/en/releases/changelog_v26.03.2/
- 
-    * OpenStack upgrades do not avoid the problem: kolla stable/2026.2
-      still uses OPENSTACK_RELEASE_CODENAME = 'Gazpacho' for its Ubuntu
-      images because no noble-updates/hibiscus pocket exists yet, so it
-      installs the same ovn 26.03.0 from the gazpacho UCA.
- 
-    * Other distributions already ship the fix: the CentOS NFV SIG provides
-      ovn26.03-26.03.3 and ovn26.09-26.09.0.
- 
-    * ovn is a supporting package under the OpenStack and Ubuntu Cloud
-      Archive SRU exception, so the update is requested as a new upstream
-      stable point release.
- 
-    * Similar previous request: LP: #2168890.
+  * Cause: https://github.com/ovn-org/ovn/commit/1b4058b9
+  * Changelogs:
+    https://www.ovn.org/en/releases/changelog_v26.03.2/
+    https://www.ovn.org/en/releases/changelog_v26.03.3/
+  * ovn is a supporting package under the OpenStack and UCA SRU exception.
+  * Similar previous request: LP: #2168890.

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2169909

Title:
  [SRU] ovn 26.03.0 drops ARP requests from localnet to VMs on non-
  gateway chassis when the provider network has a router gateway (fixed
  in 26.03.2)

To manage notifications about this bug go to:
https://bugs.launchpad.net/cloud-archive/+bug/2169909/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to