aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/dsa/8021q.h
blob: 88cd72dfa4e0e9d078e6d0292ff426a3db9780bf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* SPDX-License-Identifier: GPL-2.0
 * Copyright (c) 2019, Vladimir Oltean <olteanv@gmail.com>
 */

#ifndef _NET_DSA_8021Q_H
#define _NET_DSA_8021Q_H

#include <linux/refcount.h>
#include <linux/types.h>

struct dsa_switch;
struct sk_buff;
struct net_device;
struct packet_type;
struct dsa_8021q_context;

struct dsa_8021q_crosschip_link {
	struct list_head list;
	int port;
	struct dsa_8021q_context *other_ctx;
	int other_port;
	refcount_t refcount;
};

struct dsa_8021q_ops {
	int (*vlan_add)(struct dsa_switch *ds, int port, u16 vid, u16 flags);
	int (*vlan_del)(struct dsa_switch *ds, int port, u16 vid);
};

struct dsa_8021q_context {
	const struct dsa_8021q_ops *ops;
	struct dsa_switch *ds;
	struct list_head crosschip_links;
	/* EtherType of RX VID, used for filtering on master interface */
	__be16 proto;
};

#define DSA_8021Q_N_SUBVLAN			8

#if IS_ENABLED(CONFIG_NET_DSA_TAG_8021Q)

int dsa_8021q_setup(struct dsa_8021q_context *ctx, bool enabled);

int dsa_8021q_crosschip_bridge_join(struct dsa_8021q_context *ctx, int port,
				    struct dsa_8021q_context *other_ctx,
				    int other_port);

int dsa_8021q_crosschip_bridge_leave(struct dsa_8021q_context *ctx, int port,
				     struct dsa_8021q_context *other_ctx,
				     int other_port);

struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev,
			       u16 tpid, u16 tci);

u16 dsa_8021q_tx_vid(struct dsa_switch *ds, int port);

u16 dsa_8021q_rx_vid(struct dsa_switch *ds, int port);

u16 dsa_8021q_rx_vid_subvlan(struct dsa_switch *ds, int port, u16 subvlan);

int dsa_8021q_rx_switch_id(u16 vid);

int dsa_8021q_rx_source_port(u16 vid);

u16 dsa_8021q_rx_subvlan(u16 vid);

bool vid_is_dsa_8021q(u16 vid);

#else

int dsa_8021q_setup(struct dsa_8021q_context *ctx, bool enabled)
{
	return 0;
}

int dsa_8021q_crosschip_bridge_join(struct dsa_8021q_context *ctx, int port,
				    struct dsa_8021q_context *other_ctx,
				    int other_port)
{
	return 0;
}

int dsa_8021q_crosschip_bridge_leave(struct dsa_8021q_context *ctx, int port,
				     struct dsa_8021q_context *other_ctx,
				     int other_port)
{
	return 0;
}

struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev,
			       u16 tpid, u16 tci)
{
	return NULL;
}

u16 dsa_8021q_tx_vid(struct dsa_switch *ds, int port)
{
	return 0;
}

u16 dsa_8021q_rx_vid(struct dsa_switch *ds, int port)
{
	return 0;
}

u16 dsa_8021q_rx_vid_subvlan(struct dsa_switch *ds, int port, u16 subvlan)
{
	return 0;
}

int dsa_8021q_rx_switch_id(u16 vid)
{
	return 0;
}

int dsa_8021q_rx_source_port(u16 vid)
{
	return 0;
}

u16 dsa_8021q_rx_subvlan(u16 vid)
{
	return 0;
}

bool vid_is_dsa_8021q(u16 vid)
{
	return false;
}

#endif /* IS_ENABLED(CONFIG_NET_DSA_TAG_8021Q) */

#endif /* _NET_DSA_8021Q_H */