From 603980fa785f0bf2959d490b3242865da3aa950d Mon Sep 17 00:00:00 2001 From: Brad House Date: Wed, 20 Nov 2024 09:24:49 -0500 Subject: [PATCH] VXLAN: Fix oper_status and tunnel encapsulation TTL This fixes 2 issues across a range of open tickets building upon patches created by others with modifications as requested by @VladimirKuk. The first issue this resolves is the status shown for remote vteps which in the fact that it is wrong makes debugging nearly impossible: ``` +------------+------------+-------------------+--------------+ | SIP | DIP | Creation Source | OperStatus | +============+============+===================+==============+ | 172.16.0.1 | 172.16.0.2 | EVPN | oper_down | +------------+------------+-------------------+--------------+ Total count : 1 ``` The VTEP is really up. Original PR for that is #2080. Also fixes https://github.com/sonic-net/sonic-buildimage/issues/10004 or at least the error message which hurts debugging. The next issue is in reachabiity across VXLANs. This fixes IP/MAC learning via ARP. The original PR for that is #3216, however it appears it has its origins in https://github.com/sonic-net/sonic-buildimage/issues/10050 which goes into greater detail about the issue itself. Also there is talk about it here https://github.com/kamelnetworks/sonic/issues/9 as well as another similar patch here: https://github.com/kamelnetworks/sonic-swss/commit/02ee3e3 Fixes #3216 Fixes #2080 Fixes https://github.com/sonic-net/sonic-buildimage/issues/10050 Fixes https://github.com/sonic-net/sonic-buildimage/issues/10004 Signed-off-by: Brad House (@bradh352) --- orchagent/portsorch.cpp | 8 ++++++-- orchagent/vxlanorch.cpp | 17 +++++++---------- orchagent/vxlanorch.h | 1 + 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index 2ce9b31b6f..bd7c267d65 100644 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -7277,7 +7277,9 @@ bool PortsOrch::addTunnel(string tunnel_alias, sai_object_id_t tunnel_id, bool h { tunnel.m_learn_mode = SAI_BRIDGE_PORT_FDB_LEARNING_MODE_DISABLE; } + tunnel.m_oper_status = SAI_PORT_OPER_STATUS_DOWN; m_portList[tunnel_alias] = tunnel; + saiOidToAlias[tunnel_id] = tunnel_alias; SWSS_LOG_INFO("addTunnel:: %" PRIx64, tunnel_id); @@ -7288,6 +7290,7 @@ bool PortsOrch::removeTunnel(Port tunnel) { SWSS_LOG_ENTER(); + saiOidToAlias.erase(tunnel.m_tunnel_id); m_portList.erase(tunnel.m_alias); return true; @@ -8215,9 +8218,10 @@ void PortsOrch::updatePortOperStatus(Port &port, sai_port_oper_status_t status) return; } - if (port.m_type == Port::PHY) + updateDbPortOperStatus(port, status); + + if (port.m_type == Port::PHY || port.m_type == Port::TUNNEL) { - updateDbPortOperStatus(port, status); updateDbPortFlapCount(port, status); updateGearboxPortOperStatus(port); diff --git a/orchagent/vxlanorch.cpp b/orchagent/vxlanorch.cpp index 05a2d3e603..0fdffcac6d 100644 --- a/orchagent/vxlanorch.cpp +++ b/orchagent/vxlanorch.cpp @@ -275,7 +275,7 @@ create_tunnel( sai_ip_address_t *dst_ip, sai_object_id_t underlay_rif, bool p2p, - sai_uint8_t encap_ttl=0) + sai_uint8_t encap_ttl=DEFAULT_TUNNEL_ENCAP_TTL) { sai_attribute_t attr; std::vector tunnel_attrs; @@ -349,16 +349,13 @@ create_tunnel( tunnel_attrs.push_back(attr); } - if (encap_ttl != 0) - { - attr.id = SAI_TUNNEL_ATTR_ENCAP_TTL_MODE; - attr.value.s32 = SAI_TUNNEL_TTL_MODE_PIPE_MODEL; - tunnel_attrs.push_back(attr); + attr.id = SAI_TUNNEL_ATTR_ENCAP_TTL_MODE; + attr.value.s32 = SAI_TUNNEL_TTL_MODE_PIPE_MODEL; + tunnel_attrs.push_back(attr); - attr.id = SAI_TUNNEL_ATTR_ENCAP_TTL_VAL; - attr.value.u8 = encap_ttl; - tunnel_attrs.push_back(attr); - } + attr.id = SAI_TUNNEL_ATTR_ENCAP_TTL_VAL; + attr.value.u8 = encap_ttl; + tunnel_attrs.push_back(attr); sai_object_id_t tunnel_id; sai_status_t status = sai_tunnel_api->create_tunnel( diff --git a/orchagent/vxlanorch.h b/orchagent/vxlanorch.h index 695f7441e0..eb68d0ce70 100644 --- a/orchagent/vxlanorch.h +++ b/orchagent/vxlanorch.h @@ -46,6 +46,7 @@ typedef enum #define MAX_VLAN_ID 4095 #define MAX_VNI_ID 16777215 +#define DEFAULT_TUNNEL_ENCAP_TTL 64 typedef enum {