| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* Copyright (C) 2023, Intel Corporation. */ |
| |
| #ifndef _ICE_ESWITCH_BR_H_ |
| #define _ICE_ESWITCH_BR_H_ |
| |
| #include <linux/rhashtable.h> |
| #include <linux/workqueue.h> |
| |
| struct ice_esw_br_fdb_data { |
| unsigned char addr[ETH_ALEN]; |
| u16 vid; |
| }; |
| |
| struct ice_esw_br_flow { |
| struct ice_rule_query_data *fwd_rule; |
| struct ice_rule_query_data *guard_rule; |
| }; |
| |
| enum { |
| ICE_ESWITCH_BR_FDB_ADDED_BY_USER = BIT(0), |
| }; |
| |
| struct ice_esw_br_fdb_entry { |
| struct ice_esw_br_fdb_data data; |
| struct rhash_head ht_node; |
| struct list_head list; |
| |
| int flags; |
| |
| struct net_device *dev; |
| struct ice_esw_br_port *br_port; |
| struct ice_esw_br_flow *flow; |
| |
| unsigned long last_use; |
| }; |
| |
| enum ice_esw_br_port_type { |
| ICE_ESWITCH_BR_UPLINK_PORT = 0, |
| ICE_ESWITCH_BR_VF_REPR_PORT = 1, |
| }; |
| |
| struct ice_esw_br_port { |
| struct ice_esw_br *bridge; |
| struct ice_vsi *vsi; |
| enum ice_esw_br_port_type type; |
| u16 vsi_idx; |
| u16 pvid; |
| u32 repr_id; |
| struct xarray vlans; |
| }; |
| |
| enum { |
| ICE_ESWITCH_BR_VLAN_FILTERING = BIT(0), |
| }; |
| |
| struct ice_esw_br { |
| struct ice_esw_br_offloads *br_offloads; |
| struct xarray ports; |
| |
| struct rhashtable fdb_ht; |
| struct list_head fdb_list; |
| |
| int ifindex; |
| u32 flags; |
| unsigned long ageing_time; |
| }; |
| |
| struct ice_esw_br_offloads { |
| struct ice_pf *pf; |
| struct ice_esw_br *bridge; |
| struct notifier_block netdev_nb; |
| struct notifier_block switchdev_blk; |
| struct notifier_block switchdev_nb; |
| |
| struct workqueue_struct *wq; |
| struct delayed_work update_work; |
| }; |
| |
| struct ice_esw_br_fdb_work { |
| struct work_struct work; |
| struct switchdev_notifier_fdb_info fdb_info; |
| struct net_device *dev; |
| unsigned long event; |
| }; |
| |
| struct ice_esw_br_vlan { |
| u16 vid; |
| u16 flags; |
| }; |
| |
| #define ice_nb_to_br_offloads(nb, nb_name) \ |
| container_of(nb, \ |
| struct ice_esw_br_offloads, \ |
| nb_name) |
| |
| #define ice_work_to_br_offloads(w) \ |
| container_of(w, \ |
| struct ice_esw_br_offloads, \ |
| update_work.work) |
| |
| #define ice_work_to_fdb_work(w) \ |
| container_of(w, \ |
| struct ice_esw_br_fdb_work, \ |
| work) |
| |
| static inline bool ice_eswitch_br_is_vid_valid(u16 vid) |
| { |
| /* In trunk VLAN mode, for untagged traffic the bridge sends requests |
| * to offload VLAN 1 with pvid and untagged flags set. Since these |
| * flags are not supported, add a MAC filter instead. |
| */ |
| return vid > 1; |
| } |
| |
| void |
| ice_eswitch_br_offloads_deinit(struct ice_pf *pf); |
| int |
| ice_eswitch_br_offloads_init(struct ice_pf *pf); |
| void ice_eswitch_br_fdb_flush(struct ice_esw_br *bridge); |
| |
| #endif /* _ICE_ESWITCH_BR_H_ */ |