• Vladimir Oltean's avatar
    net: dsa: add support for bridge TX forwarding offload · 123abc06
    Vladimir Oltean authored
    For a DSA switch, to offload the forwarding process of a bridge device
    means to send the packets coming from the software bridge as data plane
    packets. This is contrary to everything that DSA has done so far,
    because the current taggers only know to send control packets (ones that
    target a specific destination port), whereas data plane packets are
    supposed to be forwarded according to the FDB lookup, much like packets
    ingressing on any regular ingress port. If the FDB lookup process
    returns multiple destination ports (flooding, multicast), then
    replication is also handled by the switch hardware - the bridge only
    sends a single packet and avoids the skb_clone().
    
    DSA keeps for each bridge port a zero-based index (the number of the
    bridge). Multiple ports performing TX forwarding offload to the same
    bridge have the same dp->bridge_num value, and ports not offloading the
    TX data plane of a bridge have dp->bridge_num = -1.
    
    The tagger can check if the packet that is being transmitted on has
    skb->offload_fwd_mark = true or not. If it does, it can be sure that the
    packet belongs to the data plane of a bridge, further information about
    which can be obtained based on dp->bridge_dev and dp->bridge_num.
    It can then compose a DSA tag for injecting a data plane packet into
    that bridge number.
    
    For the switch driver side, we offer two new dsa_switch_ops methods,
    called .port_bridge_fwd_offload_{add,del}, which are modeled after
    .port_bridge_{join,leave}.
    These methods are provided in case the driver needs to configure the
    hardware to treat packets coming from that bridge software interface as
    data plane packets. The switchdev <-> bridge interaction happens during
    the netdev_master_upper_dev_link() call, so to switch drivers, the
    effect is that the .port_bridge_fwd_offload_add() method is called
    immediately after .port_bridge_join().
    
    If the bridge number exceeds the number of bridges for which the switch
    driver can offload the TX data plane (and this includes the case where
    the driver can offload none), DSA falls back to simply returning
    tx_fwd_offload = false in the switchdev_bridge_port_offload() call.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    123abc06
port.c 30.9 KB