aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorIdo Schimmel <idosch@mellanox.com>2016-08-25 12:42:37 -0400
committerDavid S. Miller <davem@davemloft.net>2016-08-26 16:13:36 -0400
commit6bc506b4fb065eac3d89ca1ce37082e174493d9e (patch)
treeb2ce45bcdf47c388d9d0977af7bf511685a00e6e /include/linux
parent5c326ab49e5ee014ba5314c076fe9b93fd8b0406 (diff)
bridge: switchdev: Add forward mark support for stacked devices
switchdev_port_fwd_mark_set() is used to set the 'offload_fwd_mark' of port netdevs so that packets being flooded by the device won't be flooded twice. It works by assigning a unique identifier (the ifindex of the first bridge port) to bridge ports sharing the same parent ID. This prevents packets from being flooded twice by the same switch, but will flood packets through bridge ports belonging to a different switch. This method is problematic when stacked devices are taken into account, such as VLANs. In such cases, a physical port netdev can have upper devices being members in two different bridges, thus requiring two different 'offload_fwd_mark's to be configured on the port netdev, which is impossible. The main problem is that packet and netdev marking is performed at the physical netdev level, whereas flooding occurs between bridge ports, which are not necessarily port netdevs. Instead, packet and netdev marking should really be done in the bridge driver with the switch driver only telling it which packets it already forwarded. The bridge driver will mark such packets using the mark assigned to the ingress bridge port and will prevent the packet from being forwarded through any bridge port sharing the same mark (i.e. having the same parent ID). Remove the current switchdev 'offload_fwd_mark' implementation and instead implement the proposed method. In addition, make rocker - the sole user of the mark - use the proposed method. Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/netdevice.h5
-rw-r--r--include/linux/skbuff.h13
2 files changed, 5 insertions, 13 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 794bb0733799..d122be9345c7 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1562,8 +1562,6 @@ enum netdev_priv_flags {
1562 * 1562 *
1563 * @xps_maps: XXX: need comments on this one 1563 * @xps_maps: XXX: need comments on this one
1564 * 1564 *
1565 * @offload_fwd_mark: Offload device fwding mark
1566 *
1567 * @watchdog_timeo: Represents the timeout that is used by 1565 * @watchdog_timeo: Represents the timeout that is used by
1568 * the watchdog (see dev_watchdog()) 1566 * the watchdog (see dev_watchdog())
1569 * @watchdog_timer: List of timers 1567 * @watchdog_timer: List of timers
@@ -1814,9 +1812,6 @@ struct net_device {
1814#ifdef CONFIG_NET_CLS_ACT 1812#ifdef CONFIG_NET_CLS_ACT
1815 struct tcf_proto __rcu *egress_cl_list; 1813 struct tcf_proto __rcu *egress_cl_list;
1816#endif 1814#endif
1817#ifdef CONFIG_NET_SWITCHDEV
1818 u32 offload_fwd_mark;
1819#endif
1820 1815
1821 /* These may be needed for future network-power-down code. */ 1816 /* These may be needed for future network-power-down code. */
1822 struct timer_list watchdog_timer; 1817 struct timer_list watchdog_timer;
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 7047448e8129..cfb7219be665 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -612,7 +612,6 @@ static inline bool skb_mstamp_after(const struct skb_mstamp *t1,
612 * @no_fcs: Request NIC to treat last 4 bytes as Ethernet FCS 612 * @no_fcs: Request NIC to treat last 4 bytes as Ethernet FCS
613 * @napi_id: id of the NAPI struct this skb came from 613 * @napi_id: id of the NAPI struct this skb came from
614 * @secmark: security marking 614 * @secmark: security marking
615 * @offload_fwd_mark: fwding offload mark
616 * @mark: Generic packet mark 615 * @mark: Generic packet mark
617 * @vlan_proto: vlan encapsulation protocol 616 * @vlan_proto: vlan encapsulation protocol
618 * @vlan_tci: vlan tag control information 617 * @vlan_tci: vlan tag control information
@@ -730,7 +729,10 @@ struct sk_buff {
730 __u8 ipvs_property:1; 729 __u8 ipvs_property:1;
731 __u8 inner_protocol_type:1; 730 __u8 inner_protocol_type:1;
732 __u8 remcsum_offload:1; 731 __u8 remcsum_offload:1;
733 /* 3 or 5 bit hole */ 732#ifdef CONFIG_NET_SWITCHDEV
733 __u8 offload_fwd_mark:1;
734#endif
735 /* 2, 4 or 5 bit hole */
734 736
735#ifdef CONFIG_NET_SCHED 737#ifdef CONFIG_NET_SCHED
736 __u16 tc_index; /* traffic control index */ 738 __u16 tc_index; /* traffic control index */
@@ -757,14 +759,9 @@ struct sk_buff {
757 unsigned int sender_cpu; 759 unsigned int sender_cpu;
758 }; 760 };
759#endif 761#endif
760 union {
761#ifdef CONFIG_NETWORK_SECMARK 762#ifdef CONFIG_NETWORK_SECMARK
762 __u32 secmark; 763 __u32 secmark;
763#endif 764#endif
764#ifdef CONFIG_NET_SWITCHDEV
765 __u32 offload_fwd_mark;
766#endif
767 };
768 765
769 union { 766 union {
770 __u32 mark; 767 __u32 mark;