Skip to content

Commit

Permalink
rocker: add offload_fwd_mark support
Browse files Browse the repository at this point in the history
If device flags ingress packet as "fwd offload", mark the
skb->offlaod_fwd_mark using the ingress port's dev->offlaod_fwd_mark.  This
will be the hint to the kernel that this packet has already been forwarded
by device to egress ports matching skb->offlaod_fwd_mark.

For rocker, derive port dev->offlaod_fwd_mark based on device switch ID and
port ifindex.  If port is bridged, use the bridge ifindex rather than the
port ifindex.

Signed-off-by: Scott Feldman <[email protected]>
Acked-by: Jiri Pirko <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
scottfeldman authored and davem330 committed Jul 21, 2015
1 parent 1a3b2ec commit 3f98a8e
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 0 deletions.
11 changes: 11 additions & 0 deletions drivers/net/ethernet/rocker/rocker.c
Original file line number Diff line number Diff line change
Expand Up @@ -4822,20 +4822,26 @@ static int rocker_port_rx_proc(const struct rocker *rocker,
const struct rocker_tlv *attrs[ROCKER_TLV_RX_MAX + 1];
struct sk_buff *skb = rocker_desc_cookie_ptr_get(desc_info);
size_t rx_len;
u16 rx_flags = 0;

if (!skb)
return -ENOENT;

rocker_tlv_parse_desc(attrs, ROCKER_TLV_RX_MAX, desc_info);
if (!attrs[ROCKER_TLV_RX_FRAG_LEN])
return -EINVAL;
if (attrs[ROCKER_TLV_RX_FLAGS])
rx_flags = rocker_tlv_get_u16(attrs[ROCKER_TLV_RX_FLAGS]);

rocker_dma_rx_ring_skb_unmap(rocker, attrs);

rx_len = rocker_tlv_get_u16(attrs[ROCKER_TLV_RX_FRAG_LEN]);
skb_put(skb, rx_len);
skb->protocol = eth_type_trans(skb, rocker_port->dev);

if (rx_flags & ROCKER_RX_FLAGS_FWD_OFFLOAD)
skb->offload_fwd_mark = rocker_port->dev->offload_fwd_mark;

rocker_port->dev->stats.rx_packets++;
rocker_port->dev->stats.rx_bytes += skb->len;

Expand Down Expand Up @@ -4973,6 +4979,8 @@ static int rocker_probe_port(struct rocker *rocker, unsigned int port_number)
}
rocker->ports[port_number] = rocker_port;

switchdev_port_fwd_mark_set(rocker_port->dev, NULL, false);

rocker_port_set_learning(rocker_port, SWITCHDEV_TRANS_NONE);

err = rocker_port_ig_tbl(rocker_port, SWITCHDEV_TRANS_NONE, 0);
Expand Down Expand Up @@ -5252,6 +5260,7 @@ static int rocker_port_bridge_join(struct rocker_port *rocker_port,
rocker_port_internal_vlan_id_get(rocker_port, bridge->ifindex);

rocker_port->bridge_dev = bridge;
switchdev_port_fwd_mark_set(rocker_port->dev, bridge, true);

return rocker_port_vlan_add(rocker_port, SWITCHDEV_TRANS_NONE,
untagged_vid, 0);
Expand All @@ -5272,6 +5281,8 @@ static int rocker_port_bridge_leave(struct rocker_port *rocker_port)
rocker_port_internal_vlan_id_get(rocker_port,
rocker_port->dev->ifindex);

switchdev_port_fwd_mark_set(rocker_port->dev, rocker_port->bridge_dev,
false);
rocker_port->bridge_dev = NULL;

err = rocker_port_vlan_add(rocker_port, SWITCHDEV_TRANS_NONE,
Expand Down
1 change: 1 addition & 0 deletions drivers/net/ethernet/rocker/rocker.h
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ enum {
#define ROCKER_RX_FLAGS_TCP BIT(5)
#define ROCKER_RX_FLAGS_UDP BIT(6)
#define ROCKER_RX_FLAGS_TCP_UDP_CSUM_GOOD BIT(7)
#define ROCKER_RX_FLAGS_FWD_OFFLOAD BIT(8)

enum {
ROCKER_TLV_TX_UNSPEC,
Expand Down

0 comments on commit 3f98a8e

Please sign in to comment.