• Ido Schimmel's avatar
    mlxsw: spectrum_router: Do not destroy RIFs based on FID's reference count · 32fd4b49
    Ido Schimmel authored
    Currently, when a RIF is constructed on top of a FID, the RIF increments
    the FID's reference count and the RIF is destroyed when the FID's
    reference count drops to 1. This effectively means that when no local
    ports are member in the FID, the FID is destroyed regardless if the
    router port is a member in the FID or not.
    
    The above can lead to the unexpected behavior in which routes using a
    VLAN interface as their nexthop device are no longer offloaded after the
    last local port leaves the corresponding VLAN (FID).
    
    Example:
    # ip -4 route show dev br0.10
    192.0.2.0/24 proto kernel scope link src 192.0.2.1 offload
    # bridge vlan del vid 10 dev swp3
    # ip -4 route show dev br0.10
    192.0.2.0/24 proto kernel scope link src 192.0.2.1
    
    After the patch, the route is offloaded before and after the VLAN is
    removed from local port 'swp3', as the RIF corresponding to 'br0.10'
    continues to exists.
    
    In order to remove RIFs' reliance on the underlying FID's reference
    count, we need to add a reference count to sub-port RIFs, which are RIFs
    that correspond to physical ports and their uppers (e.g., LAG devices).
    
    In this case, each {Port, VID} ('struct mlxsw_sp_port_vlan') needs to
    hold a reference on the RIF. For example:
    
                           bond0.10
                              |
                            bond0
                              |
                          +-------+
                          |       |
                        swp1    swp2
    
    Both {Port 1, VID 10} and {Port 2, VID 10} will hold a reference on the
    RIF corresponding to 'bond0.10'. When the last reference is dropped, the
    RIF will be destroyed.
    Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
    Reviewed-by: default avatarPetr Machata <petrm@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    32fd4b49
spectrum_fid.c 36.1 KB