1 /* SPDX-License-Identifier: GPL-2.0
2 * Copyright (c) 2019, Vladimir Oltean <olteanv@gmail.com>
3 */
4
5 #ifndef _NET_DSA_8021Q_H
6 #define _NET_DSA_8021Q_H
7
8 #include <linux/refcount.h>
9 #include <linux/types.h>
10
11 struct dsa_switch;
12 struct sk_buff;
13 struct net_device;
14 struct packet_type;
15 struct dsa_8021q_context;
16
17 struct dsa_8021q_crosschip_link {
18 struct list_head list;
19 int port;
20 struct dsa_8021q_context *other_ctx;
21 int other_port;
22 refcount_t refcount;
23 };
24
25 struct dsa_8021q_ops {
26 int (*vlan_add)(struct dsa_switch *ds, int port, u16 vid, u16 flags);
27 int (*vlan_del)(struct dsa_switch *ds, int port, u16 vid);
28 };
29
30 struct dsa_8021q_context {
31 const struct dsa_8021q_ops *ops;
32 struct dsa_switch *ds;
33 struct list_head crosschip_links;
34 /* EtherType of RX VID, used for filtering on master interface */
35 __be16 proto;
36 };
37
38 #define DSA_8021Q_N_SUBVLAN 8
39
40 #if IS_ENABLED(CONFIG_NET_DSA_TAG_8021Q)
41
42 int dsa_8021q_setup(struct dsa_8021q_context *ctx, bool enabled);
43
44 int dsa_8021q_crosschip_bridge_join(struct dsa_8021q_context *ctx, int port,
45 struct dsa_8021q_context *other_ctx,
46 int other_port);
47
48 int dsa_8021q_crosschip_bridge_leave(struct dsa_8021q_context *ctx, int port,
49 struct dsa_8021q_context *other_ctx,
50 int other_port);
51
52 struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev,
53 u16 tpid, u16 tci);
54
55 u16 dsa_8021q_tx_vid(struct dsa_switch *ds, int port);
56
57 u16 dsa_8021q_rx_vid(struct dsa_switch *ds, int port);
58
59 u16 dsa_8021q_rx_vid_subvlan(struct dsa_switch *ds, int port, u16 subvlan);
60
61 int dsa_8021q_rx_switch_id(u16 vid);
62
63 int dsa_8021q_rx_source_port(u16 vid);
64
65 u16 dsa_8021q_rx_subvlan(u16 vid);
66
67 bool vid_is_dsa_8021q_rxvlan(u16 vid);
68
69 bool vid_is_dsa_8021q_txvlan(u16 vid);
70
71 bool vid_is_dsa_8021q(u16 vid);
72
73 #else
74
dsa_8021q_setup(struct dsa_8021q_context * ctx,bool enabled)75 int dsa_8021q_setup(struct dsa_8021q_context *ctx, bool enabled)
76 {
77 return 0;
78 }
79
dsa_8021q_crosschip_bridge_join(struct dsa_8021q_context * ctx,int port,struct dsa_8021q_context * other_ctx,int other_port)80 int dsa_8021q_crosschip_bridge_join(struct dsa_8021q_context *ctx, int port,
81 struct dsa_8021q_context *other_ctx,
82 int other_port)
83 {
84 return 0;
85 }
86
dsa_8021q_crosschip_bridge_leave(struct dsa_8021q_context * ctx,int port,struct dsa_8021q_context * other_ctx,int other_port)87 int dsa_8021q_crosschip_bridge_leave(struct dsa_8021q_context *ctx, int port,
88 struct dsa_8021q_context *other_ctx,
89 int other_port)
90 {
91 return 0;
92 }
93
dsa_8021q_xmit(struct sk_buff * skb,struct net_device * netdev,u16 tpid,u16 tci)94 struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev,
95 u16 tpid, u16 tci)
96 {
97 return NULL;
98 }
99
dsa_8021q_tx_vid(struct dsa_switch * ds,int port)100 u16 dsa_8021q_tx_vid(struct dsa_switch *ds, int port)
101 {
102 return 0;
103 }
104
dsa_8021q_rx_vid(struct dsa_switch * ds,int port)105 u16 dsa_8021q_rx_vid(struct dsa_switch *ds, int port)
106 {
107 return 0;
108 }
109
dsa_8021q_rx_vid_subvlan(struct dsa_switch * ds,int port,u16 subvlan)110 u16 dsa_8021q_rx_vid_subvlan(struct dsa_switch *ds, int port, u16 subvlan)
111 {
112 return 0;
113 }
114
dsa_8021q_rx_switch_id(u16 vid)115 int dsa_8021q_rx_switch_id(u16 vid)
116 {
117 return 0;
118 }
119
dsa_8021q_rx_source_port(u16 vid)120 int dsa_8021q_rx_source_port(u16 vid)
121 {
122 return 0;
123 }
124
dsa_8021q_rx_subvlan(u16 vid)125 u16 dsa_8021q_rx_subvlan(u16 vid)
126 {
127 return 0;
128 }
129
vid_is_dsa_8021q_rxvlan(u16 vid)130 bool vid_is_dsa_8021q_rxvlan(u16 vid)
131 {
132 return false;
133 }
134
vid_is_dsa_8021q_txvlan(u16 vid)135 bool vid_is_dsa_8021q_txvlan(u16 vid)
136 {
137 return false;
138 }
139
vid_is_dsa_8021q(u16 vid)140 bool vid_is_dsa_8021q(u16 vid)
141 {
142 return false;
143 }
144
145 #endif /* IS_ENABLED(CONFIG_NET_DSA_TAG_8021Q) */
146
147 #endif /* _NET_DSA_8021Q_H */
148