Loading...
Note: File does not exist in v3.15.
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 requests
110 * to offload VLAN 1 with pvid and untagged flags set. Since these
111 * flags are not supported, add a MAC filter instead.
112 */
113 return vid > 1;
114}
115
116void
117ice_eswitch_br_offloads_deinit(struct ice_pf *pf);
118int
119ice_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_ */