123 lines · c
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 10struct ice_esw_br_fdb_data {11 unsigned char addr[ETH_ALEN];12 u16 vid;13};14 15struct ice_esw_br_flow {16 struct ice_rule_query_data *fwd_rule;17 struct ice_rule_query_data *guard_rule;18};19 20enum {21 ICE_ESWITCH_BR_FDB_ADDED_BY_USER = BIT(0),22};23 24struct 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 38enum ice_esw_br_port_type {39 ICE_ESWITCH_BR_UPLINK_PORT = 0,40 ICE_ESWITCH_BR_VF_REPR_PORT = 1,41};42 43struct 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 u32 repr_id;50 struct xarray vlans;51};52 53enum {54 ICE_ESWITCH_BR_VLAN_FILTERING = BIT(0),55};56 57struct ice_esw_br {58 struct ice_esw_br_offloads *br_offloads;59 struct xarray ports;60 61 struct rhashtable fdb_ht;62 struct list_head fdb_list;63 64 int ifindex;65 u32 flags;66 unsigned long ageing_time;67};68 69struct ice_esw_br_offloads {70 struct ice_pf *pf;71 struct ice_esw_br *bridge;72 struct notifier_block netdev_nb;73 struct notifier_block switchdev_blk;74 struct notifier_block switchdev_nb;75 76 struct workqueue_struct *wq;77 struct delayed_work update_work;78};79 80struct ice_esw_br_fdb_work {81 struct work_struct work;82 struct switchdev_notifier_fdb_info fdb_info;83 struct net_device *dev;84 unsigned long event;85};86 87struct ice_esw_br_vlan {88 u16 vid;89 u16 flags;90};91 92#define ice_nb_to_br_offloads(nb, nb_name) \93 container_of(nb, \94 struct ice_esw_br_offloads, \95 nb_name)96 97#define ice_work_to_br_offloads(w) \98 container_of(w, \99 struct ice_esw_br_offloads, \100 update_work.work)101 102#define ice_work_to_fdb_work(w) \103 container_of(w, \104 struct ice_esw_br_fdb_work, \105 work)106 107static inline bool ice_eswitch_br_is_vid_valid(u16 vid)108{109 /* In trunk VLAN mode, for untagged traffic the bridge sends requests110 * to offload VLAN 1 with pvid and untagged flags set. Since these111 * flags are not supported, add a MAC filter instead.112 */113 return vid > 1;114}115 116void117ice_eswitch_br_offloads_deinit(struct ice_pf *pf);118int119ice_eswitch_br_offloads_init(struct ice_pf *pf);120void ice_eswitch_br_fdb_flush(struct ice_esw_br *bridge);121 122#endif /* _ICE_ESWITCH_BR_H_ */123