blob: 88cd72dfa4e0e9d078e6d0292ff426a3db9780bf [file] [log] [blame]
David Brazdil0f672f62019-12-10 10:32:29 +00001/* 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
Olivier Deprez157378f2022-04-04 15:47:50 +02008#include <linux/refcount.h>
David Brazdil0f672f62019-12-10 10:32:29 +00009#include <linux/types.h>
10
11struct dsa_switch;
12struct sk_buff;
13struct net_device;
14struct packet_type;
Olivier Deprez157378f2022-04-04 15:47:50 +020015struct dsa_8021q_context;
16
17struct 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
25struct 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
30struct 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
David Brazdil0f672f62019-12-10 10:32:29 +000039
40#if IS_ENABLED(CONFIG_NET_DSA_TAG_8021Q)
41
Olivier Deprez157378f2022-04-04 15:47:50 +020042int dsa_8021q_setup(struct dsa_8021q_context *ctx, bool enabled);
43
44int dsa_8021q_crosschip_bridge_join(struct dsa_8021q_context *ctx, int port,
45 struct dsa_8021q_context *other_ctx,
46 int other_port);
47
48int dsa_8021q_crosschip_bridge_leave(struct dsa_8021q_context *ctx, int port,
49 struct dsa_8021q_context *other_ctx,
50 int other_port);
David Brazdil0f672f62019-12-10 10:32:29 +000051
52struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev,
53 u16 tpid, u16 tci);
54
55u16 dsa_8021q_tx_vid(struct dsa_switch *ds, int port);
56
57u16 dsa_8021q_rx_vid(struct dsa_switch *ds, int port);
58
Olivier Deprez157378f2022-04-04 15:47:50 +020059u16 dsa_8021q_rx_vid_subvlan(struct dsa_switch *ds, int port, u16 subvlan);
60
David Brazdil0f672f62019-12-10 10:32:29 +000061int dsa_8021q_rx_switch_id(u16 vid);
62
63int dsa_8021q_rx_source_port(u16 vid);
64
Olivier Deprez157378f2022-04-04 15:47:50 +020065u16 dsa_8021q_rx_subvlan(u16 vid);
66
67bool vid_is_dsa_8021q(u16 vid);
68
David Brazdil0f672f62019-12-10 10:32:29 +000069#else
70
Olivier Deprez157378f2022-04-04 15:47:50 +020071int dsa_8021q_setup(struct dsa_8021q_context *ctx, bool enabled)
72{
73 return 0;
74}
75
76int dsa_8021q_crosschip_bridge_join(struct dsa_8021q_context *ctx, int port,
77 struct dsa_8021q_context *other_ctx,
78 int other_port)
79{
80 return 0;
81}
82
83int dsa_8021q_crosschip_bridge_leave(struct dsa_8021q_context *ctx, int port,
84 struct dsa_8021q_context *other_ctx,
85 int other_port)
David Brazdil0f672f62019-12-10 10:32:29 +000086{
87 return 0;
88}
89
90struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev,
91 u16 tpid, u16 tci)
92{
93 return NULL;
94}
95
96u16 dsa_8021q_tx_vid(struct dsa_switch *ds, int port)
97{
98 return 0;
99}
100
101u16 dsa_8021q_rx_vid(struct dsa_switch *ds, int port)
102{
103 return 0;
104}
105
Olivier Deprez157378f2022-04-04 15:47:50 +0200106u16 dsa_8021q_rx_vid_subvlan(struct dsa_switch *ds, int port, u16 subvlan)
107{
108 return 0;
109}
110
David Brazdil0f672f62019-12-10 10:32:29 +0000111int dsa_8021q_rx_switch_id(u16 vid)
112{
113 return 0;
114}
115
116int dsa_8021q_rx_source_port(u16 vid)
117{
118 return 0;
119}
120
Olivier Deprez157378f2022-04-04 15:47:50 +0200121u16 dsa_8021q_rx_subvlan(u16 vid)
122{
123 return 0;
124}
125
126bool vid_is_dsa_8021q(u16 vid)
127{
128 return false;
129}
130
David Brazdil0f672f62019-12-10 10:32:29 +0000131#endif /* IS_ENABLED(CONFIG_NET_DSA_TAG_8021Q) */
132
133#endif /* _NET_DSA_8021Q_H */