Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
8021q
vlan.h
Go to the documentation of this file.
1
#ifndef __BEN_VLAN_802_1Q_INC__
2
#define __BEN_VLAN_802_1Q_INC__
3
4
#include <linux/if_vlan.h>
5
#include <
linux/u64_stats_sync.h
>
6
#include <linux/list.h>
7
8
15
struct
vlan_priority_tci_mapping
{
16
u32
priority
;
17
u16
vlan_qos
;
18
struct
vlan_priority_tci_mapping
*
next
;
19
};
20
21
33
struct
vlan_pcpu_stats
{
34
u64
rx_packets
;
35
u64
rx_bytes
;
36
u64
rx_multicast
;
37
u64
tx_packets
;
38
u64
tx_bytes
;
39
struct
u64_stats_sync
syncp
;
40
u32
rx_errors
;
41
u32
tx_dropped
;
42
};
43
44
struct
netpoll
;
45
59
struct
vlan_dev_priv
{
60
unsigned
int
nr_ingress_mappings
;
61
u32
ingress_priority_map
[8];
62
unsigned
int
nr_egress_mappings
;
63
struct
vlan_priority_tci_mapping
*
egress_priority_map
[16];
64
65
u16
vlan_id
;
66
u16
flags
;
67
68
struct
net_device
*
real_dev
;
69
unsigned
char
real_dev_addr
[
ETH_ALEN
];
70
71
struct
proc_dir_entry
*
dent
;
72
struct
vlan_pcpu_stats
__percpu
*
vlan_pcpu_stats
;
73
#ifdef CONFIG_NET_POLL_CONTROLLER
74
struct
netpoll
*
netpoll
;
75
#endif
76
};
77
78
static
inline
struct
vlan_dev_priv
*
vlan_dev_priv
(
const
struct
net_device
*
dev
)
79
{
80
return
netdev_priv(dev);
81
}
82
83
/* if this changes, algorithm will have to be reworked because this
84
* depends on completely exhausting the VLAN identifier space. Thus
85
* it gives constant time look-up, but in many cases it wastes memory.
86
*/
87
#define VLAN_GROUP_ARRAY_SPLIT_PARTS 8
88
#define VLAN_GROUP_ARRAY_PART_LEN (VLAN_N_VID/VLAN_GROUP_ARRAY_SPLIT_PARTS)
89
90
struct
vlan_group
{
91
unsigned
int
nr_vlan_devs
;
92
struct
hlist_node
hlist
;
/* linked list */
93
struct
net_device
**
vlan_devices_arrays
[
VLAN_GROUP_ARRAY_SPLIT_PARTS
];
94
};
95
96
struct
vlan_info
{
97
struct
net_device
*
real_dev
;
/* The ethernet(like) device
98
* the vlan is attached to.
99
*/
100
struct
vlan_group
grp
;
101
struct
list_head
vid_list
;
102
unsigned
int
nr_vids
;
103
struct
rcu_head
rcu
;
104
};
105
106
static
inline
struct
net_device
*vlan_group_get_device(
struct
vlan_group
*vg,
107
u16
vlan_id
)
108
{
109
struct
net_device
**array;
110
array = vg->
vlan_devices_arrays
[vlan_id /
VLAN_GROUP_ARRAY_PART_LEN
];
111
return
array ? array[vlan_id %
VLAN_GROUP_ARRAY_PART_LEN
] :
NULL
;
112
}
113
114
static
inline
void
vlan_group_set_device(
struct
vlan_group
*vg,
115
u16
vlan_id
,
116
struct
net_device
*
dev
)
117
{
118
struct
net_device
**array;
119
if
(!vg)
120
return
;
121
array = vg->
vlan_devices_arrays
[vlan_id /
VLAN_GROUP_ARRAY_PART_LEN
];
122
array[vlan_id %
VLAN_GROUP_ARRAY_PART_LEN
] =
dev
;
123
}
124
125
/* Must be invoked with rcu_read_lock or with RTNL. */
126
static
inline
struct
net_device
*vlan_find_dev(
struct
net_device
*real_dev,
127
u16
vlan_id)
128
{
129
struct
vlan_info
*
vlan_info
=
rcu_dereference_rtnl
(real_dev->vlan_info);
130
131
if
(vlan_info)
132
return
vlan_group_get_device(&vlan_info->
grp
, vlan_id);
133
134
return
NULL
;
135
}
136
137
/* found in vlan_dev.c */
138
void
vlan_dev_set_ingress_priority
(
const
struct
net_device
*dev,
139
u32
skb_prio,
u16
vlan_prio
);
140
int
vlan_dev_set_egress_priority
(
const
struct
net_device
*dev,
141
u32
skb_prio,
u16
vlan_prio
);
142
int
vlan_dev_change_flags
(
const
struct
net_device
*dev,
u32
flag
,
u32
mask
);
143
void
vlan_dev_get_realdev_name
(
const
struct
net_device
*dev,
char
*
result
);
144
145
int
vlan_check_real_dev
(
struct
net_device
*real_dev,
u16
vlan_id);
146
void
vlan_setup
(
struct
net_device
*dev);
147
int
register_vlan_dev
(
struct
net_device
*dev);
148
void
unregister_vlan_dev
(
struct
net_device
*dev,
struct
list_head
*
head
);
149
150
static
inline
u32
vlan_get_ingress_priority(
struct
net_device
*dev,
151
u16
vlan_tci)
152
{
153
struct
vlan_dev_priv
*
vip
=
vlan_dev_priv
(dev);
154
155
return
vip->
ingress_priority_map
[(vlan_tci >>
VLAN_PRIO_SHIFT
) & 0x7];
156
}
157
158
#ifdef CONFIG_VLAN_8021Q_GVRP
159
extern
int
vlan_gvrp_request_join
(
const
struct
net_device
*dev);
160
extern
void
vlan_gvrp_request_leave
(
const
struct
net_device
*dev);
161
extern
int
vlan_gvrp_init_applicant
(
struct
net_device
*dev);
162
extern
void
vlan_gvrp_uninit_applicant
(
struct
net_device
*dev);
163
extern
int
vlan_gvrp_init
(
void
);
164
extern
void
vlan_gvrp_uninit
(
void
);
165
#else
166
static
inline
int
vlan_gvrp_request_join
(
const
struct
net_device
*dev) {
return
0; }
167
static
inline
void
vlan_gvrp_request_leave
(
const
struct
net_device
*dev) {}
168
static
inline
int
vlan_gvrp_init_applicant
(
struct
net_device
*dev) {
return
0; }
169
static
inline
void
vlan_gvrp_uninit_applicant
(
struct
net_device
*dev) {}
170
static
inline
int
vlan_gvrp_init
(
void
) {
return
0; }
171
static
inline
void
vlan_gvrp_uninit
(
void
) {}
172
#endif
173
174
extern
const
char
vlan_fullname
[];
175
extern
const
char
vlan_version
[];
176
extern
int
vlan_netlink_init
(
void
);
177
extern
void
vlan_netlink_fini
(
void
);
178
179
extern
struct
rtnl_link_ops
vlan_link_ops
;
180
181
extern
int
vlan_net_id
;
182
183
struct
proc_dir_entry
;
184
185
struct
vlan_net
{
186
/* /proc/net/vlan */
187
struct
proc_dir_entry
*
proc_vlan_dir
;
188
/* /proc/net/vlan/config */
189
struct
proc_dir_entry
*
proc_vlan_conf
;
190
/* Determines interface naming scheme. */
191
unsigned
short
name_type
;
192
};
193
194
#endif
/* !(__BEN_VLAN_802_1Q_INC__) */
Generated on Thu Jan 10 2013 14:56:38 for Linux Kernel by
1.8.2