1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (C) 2023, Intel Corporation. */ 3 4 #ifndef _ICE_ESWITCH_BR_H_ 5 #define _ICE_ESWITCH_BR_H_ 6 7 #include <linux/rhashtable.h> 8 #include <linux/workqueue.h> 9 10 struct ice_esw_br_fdb_data { 11 unsigned char addr[ETH_ALEN]; 12 u16 vid; 13 }; 14 15 struct ice_esw_br_flow { 16 struct ice_rule_query_data *fwd_rule; 17 struct ice_rule_query_data *guard_rule; 18 }; 19 20 enum { 21 ICE_ESWITCH_BR_FDB_ADDED_BY_USER = BIT(0), 22 }; 23 24 struct ice_esw_br_fdb_entry { 25 struct ice_esw_br_fdb_data data; 26 struct rhash_head ht_node; 27 struct list_head list; 28 29 int flags; 30 31 struct net_device *dev; 32 struct ice_esw_br_port *br_port; 33 struct ice_esw_br_flow *flow; 34 35 unsigned long last_use; 36 }; 37 38 enum ice_esw_br_port_type { 39 ICE_ESWITCH_BR_UPLINK_PORT = 0, 40 ICE_ESWITCH_BR_VF_REPR_PORT = 1, 41 }; 42 43 struct ice_esw_br_port { 44 struct ice_esw_br *bridge; 45 struct ice_vsi *vsi; 46 enum ice_esw_br_port_type type; 47 u16 vsi_idx; 48 u16 pvid; 49 struct xarray vlans; 50 }; 51 52 enum { 53 ICE_ESWITCH_BR_VLAN_FILTERING = BIT(0), 54 }; 55 56 struct ice_esw_br { 57 struct ice_esw_br_offloads *br_offloads; 58 struct xarray ports; 59 60 struct rhashtable fdb_ht; 61 struct list_head fdb_list; 62 63 int ifindex; 64 u32 flags; 65 unsigned long ageing_time; 66 }; 67 68 struct ice_esw_br_offloads { 69 struct ice_pf *pf; 70 struct ice_esw_br *bridge; 71 struct notifier_block netdev_nb; 72 struct notifier_block switchdev_blk; 73 struct notifier_block switchdev_nb; 74 75 struct workqueue_struct *wq; 76 struct delayed_work update_work; 77 }; 78 79 struct ice_esw_br_fdb_work { 80 struct work_struct work; 81 struct switchdev_notifier_fdb_info fdb_info; 82 struct net_device *dev; 83 unsigned long event; 84 }; 85 86 struct ice_esw_br_vlan { 87 u16 vid; 88 u16 flags; 89 }; 90 91 #define ice_nb_to_br_offloads(nb, nb_name) \ 92 container_of(nb, \ 93 struct ice_esw_br_offloads, \ 94 nb_name) 95 96 #define ice_work_to_br_offloads(w) \ 97 container_of(w, \ 98 struct ice_esw_br_offloads, \ 99 update_work.work) 100 101 #define ice_work_to_fdb_work(w) \ 102 container_of(w, \ 103 struct ice_esw_br_fdb_work, \ 104 work) 105 106 static inline bool ice_eswitch_br_is_vid_valid(u16 vid) 107 { 108 /* In trunk VLAN mode, for untagged traffic the bridge sends requests 109 * to offload VLAN 1 with pvid and untagged flags set. Since these 110 * flags are not supported, add a MAC filter instead. 111 */ 112 return vid > 1; 113 } 114 115 void 116 ice_eswitch_br_offloads_deinit(struct ice_pf *pf); 117 int 118 ice_eswitch_br_offloads_init(struct ice_pf *pf); 119 void ice_eswitch_br_fdb_flush(struct ice_esw_br *bridge); 120 121 #endif /* _ICE_ESWITCH_BR_H_ */ 122