Hi all.
Please help me to understand the implementation.
Currently I am working on implementation of L2EVPN.
I have two simple configs:
sw1 sudo config vlan add 30
sudo config vlan member add 30 Ethernet0
sudo config interface ip remove Loopback0
10.1.0.1/32sudo config interface ip add Loopback0
2.2.2.2/32sudo config vlan member del 1000 Ethernet8
sudo config interface ip add Ethernet8
10.0.0.5/31sudo config vxlan add vtep 2.2.2.2
sudo config vxlan evpn_nvo add nvo vtep
sudo config vxlan map add vtep 30 3000
FRR configuration vtysh
configure terminal
router bgp 65100
neighbor 10.0.0.4 remote-as 65200
address-family ipv4 unicast
network
2.2.2.2/32neighbor 10.0.0.4 activate
exit
address-family l2vpn evpn
neighbor 10.0.0.4 activate
advertise-all-vni
end
sw2
sudo config vlan add 30
sudo config vlan member add 30 Ethernet0
sudo config interface ip remove Loopback0
10.1.0.1/32sudo config interface ip add Loopback0
1.1.1.1/32sudo config vlan member del 1000 Ethernet4
sudo config interface ip add Ethernet4
10.0.0.4/31sudo config vxlan add vtep 1.1.1.1
sudo config vxlan evpn_nvo add nvo vtep
sudo config vxlan map add vtep 30 3000
FRR configurationvtysh
configure terminal
router bgp 65200
neighbor 10.0.0.5 remote-as 65100
address-family ipv4 unicast
network
1.1.1.1/32neighbor 10.0.0.5 activate
exit
address-family l2vpn evpn
neighbor 10.0.0.5 activate
advertise-all-vni
end
When the config is applied I see only decap mapper entry and no entry for encap.
SAI_OBJECT_TYPE_TUNNEL oid:0x2a000000001658
SAI_TUNNEL_ATTR_DECAP_DSCP_MODE : SAI_TUNNEL_DSCP_MODE_UNIFORM_MODEL
SAI_TUNNEL_ATTR_DECAP_ECN_MODE : SAI_TUNNEL_DECAP_ECN_MODE_COPY_FROM_OUTER
SAI_TUNNEL_ATTR_DECAP_TTL_MODE : SAI_TUNNEL_TTL_MODE_PIPE_MODEL
SAI_TUNNEL_ATTR_OVERLAY_INTERFACE : oid:0x6000000001657
SAI_TUNNEL_ATTR_TYPE : SAI_TUNNEL_TYPE_IPINIP
SAI_TUNNEL_ATTR_UNDERLAY_INTERFACE : oid:0x60000000015be
SAI_OBJECT_TYPE_TUNNEL oid:0x2a000000001660
SAI_TUNNEL_ATTR_DECAP_MAPPERS : 2:oid:0x2900000000165c,oid:0x2900000000165e
SAI_TUNNEL_ATTR_ENCAP_MAPPERS : 2:oid:0x2900000000165d,oid:0x2900000000165f
SAI_TUNNEL_ATTR_ENCAP_SRC_IP : 1.1.1.1
SAI_TUNNEL_ATTR_PEER_MODE : SAI_TUNNEL_PEER_MODE_P2MP
SAI_TUNNEL_ATTR_TYPE : SAI_TUNNEL_TYPE_VXLAN
SAI_TUNNEL_ATTR_UNDERLAY_INTERFACE : oid:0x60000000015be
SAI_OBJECT_TYPE_TUNNEL oid:0x2a000000001664
SAI_TUNNEL_ATTR_DECAP_MAPPERS : 2:oid:0x2900000000165c,oid:0x2900000000165e
SAI_TUNNEL_ATTR_ENCAP_DST_IP : 2.2.2.2
SAI_TUNNEL_ATTR_ENCAP_MAPPERS : 2:oid:0x2900000000165d,oid:0x2900000000165f
SAI_TUNNEL_ATTR_ENCAP_SRC_IP : 1.1.1.1
SAI_TUNNEL_ATTR_PEER_MODE : SAI_TUNNEL_PEER_MODE_P2P
SAI_TUNNEL_ATTR_TYPE : SAI_TUNNEL_TYPE_VXLAN
SAI_TUNNEL_ATTR_UNDERLAY_INTERFACE : oid:0x60000000015be
SAI_OBJECT_TYPE_TUNNEL_MAP oid:0x2900000000165c
SAI_TUNNEL_MAP_ATTR_TYPE : SAI_TUNNEL_MAP_TYPE_VNI_TO_VLAN_ID
SAI_OBJECT_TYPE_TUNNEL_MAP oid:0x2900000000165d
SAI_TUNNEL_MAP_ATTR_TYPE : SAI_TUNNEL_MAP_TYPE_VLAN_ID_TO_VNI
SAI_OBJECT_TYPE_TUNNEL_MAP oid:0x2900000000165e
SAI_TUNNEL_MAP_ATTR_TYPE : SAI_TUNNEL_MAP_TYPE_VNI_TO_VIRTUAL_ROUTER_ID
SAI_OBJECT_TYPE_TUNNEL_MAP oid:0x2900000000165f
SAI_TUNNEL_MAP_ATTR_TYPE : SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VNI
SAI_OBJECT_TYPE_TUNNEL_MAP_ENTRY oid:0x3b000000001662
SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP : oid:0x2900000000165c
SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE : SAI_TUNNEL_MAP_TYPE_VNI_TO_VLAN_ID
SAI_TUNNEL_MAP_ENTRY_ATTR_VLAN_ID_VALUE : 30
SAI_TUNNEL_MAP_ENTRY_ATTR_VNI_ID_KEY : 3000
SAI_OBJECT_TYPE_TUNNEL_TERM_TABLE_ENTRY oid:0x2b000000001659
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_ACTION_TUNNEL_ID : oid:0x2a000000001658
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_DST_IP : 1.1.1.1
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TUNNEL_TYPE : SAI_TUNNEL_TYPE_IPINIP
Also no tunnel termination entry for P2P tunnel, only for P2MP.
1) Our sai plugin code are waiting for SAI_TUNNEL_MAP_TYPE_VNI_TO_VLAN_ID
and SAI_TUNNEL_MAP_TYPE_VLAN_ID_TO_VNI entries but receives only SAI_TUNNEL_MAP_TYPE_VNI_TO_VLAN_ID.
2) No tunnel term entry for tunnel
bool VxlanTunnel::createDynamicDIPTunnel(const std::string dip, tunnel_user_t usr)
{
uint8_t mapper_list = 0;
tunnel_refcnt_t tnl_refcnts;
VxlanTunnel* dip_tunnel=NULL;
VxlanTunnelOrch* tunnel_orch = gDirectory.get<VxlanTunnelOrch*>();
string tunnel_name;
auto it = tnl_users_.find(dip);
if (it == tnl_users_.end())
{
tunnel_orch->getTunnelNameFromDIP(dip, tunnel_name);
auto dipaddr = IpAddress(dip);
dip_tunnel = (new VxlanTunnel(tunnel_name, src_ip_, dipaddr, TNL_CREATION_SRC_EVPN));
tunnel_orch->addTunnel(tunnel_name,dip_tunnel);
memset(&tnl_refcnts,0,sizeof(tunnel_refcnt_t));
updateDipTunnelRefCnt(true,tnl_refcnts,usr);
tnl_users_[dip] = tnl_refcnts;
TUNNELMAP_SET_VLAN(mapper_list);
TUNNELMAP_SET_VRF(mapper_list);
dip_tunnel->createTunnelHw(mapper_list,TUNNEL_MAP_USE_COMMON_ENCAP_DECAP, false);
SWSS_LOG_NOTICE("Created P2P Tunnel remote IP %s ", dip.c_str());
}
else
{
tnl_refcnts = it->second;
updateDipTunnelRefCnt(true,tnl_refcnts,usr);
tnl_users_[dip] = tnl_refcnts;
}
return true;
}
In function "createDynamicDIPTunnel" the with_term parameter is set to false
//Creation of SAI Tunnel Object with multiple mapper typesbool VxlanTunnel::createTunnelHw(uint8_t mapper_list, tunnel_map_use_t map_src,
bool with_term, sai_uint8_t encap_ttl)
{
bool p2p = false; try
{
sai_ip_address_t ips, ipd, *ip=nullptr;
swss::copy(ips, src_ip_); createMapperHw(mapper_list, map_src); ip = nullptr;
if (!dst_ip_.isZero())
{
swss::copy(ipd, dst_ip_);
ip = &ipd;
p2p = (src_creation_ == TNL_CREATION_SRC_EVPN)? true:false;
SWSS_LOG_WARN("creation src = %d",src_creation_);
} ids_.tunnel_id = create_tunnel(&ids_, &ips, ip, gUnderlayIfId, p2p, encap_ttl); if (with_term)
{
ids_.tunnel_term_id = create_tunnel_termination(ids_.tunnel_id, ips,
ip, gVirtualRouterId);
} active_ = true;
} catch (const std::runtime_error& error)
{
SWSS_LOG_ERROR("Error creating tunnel %s: %s", tunnel_name_.c_str(), error.what());
return false;
} SWSS_LOG_INFO("Vxlan tunnel '%s' was created", tunnel_name_.c_str());
return true;
}
That's why in the HW we don't have the termination.
So I have to questions to understand:
1. Why we don't have vlan_to_vni map entry
2. Why we don't have tunnel term for p2p tunnel.
Maybe the vendor should implement this in low-level code?
Please answer.
With regards, Kostiantyn.