L2EVPN - vlan mappers and tunnel term for P2P

27 views
Skip to first unread message

Kostiantyn Buravchenko

unread,
Nov 16, 2021, 8:00:04 AM11/16/21
to sonic-evpn-workgroup
  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/32
sudo config interface ip add Loopback0 2.2.2.2/32
sudo config vlan member del 1000 Ethernet8
sudo config interface ip add Ethernet8 10.0.0.5/31
sudo 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/32
neighbor 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/32
sudo config interface ip add Loopback0 1.1.1.1/32
sudo config vlan member del 1000 Ethernet4
sudo config interface ip add Ethernet4 10.0.0.4/31
sudo 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 configuration
vtysh
configure terminal
router bgp 65200
neighbor 10.0.0.5 remote-as 65100
address-family ipv4 unicast
network 1.1.1.1/32
neighbor 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. 













Reply all
Reply to author
Forward
0 new messages