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