Blame view
include/linux/if_vlan.h
9.52 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* * VLAN An implementation of 802.1Q VLAN tagging. * * Authors: Ben Greear <greearb@candelatech.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * */ #ifndef _LINUX_IF_VLAN_H_ #define _LINUX_IF_VLAN_H_ #ifdef __KERNEL__ |
1da177e4c Linux-2.6.12-rc2 |
17 |
#include <linux/netdevice.h> |
0610d11b5 [VLAN]: __vlan_hw... |
18 |
#include <linux/etherdevice.h> |
65ac6a5fa vlan: Avoid hash ... |
19 |
#include <linux/rtnetlink.h> |
1da177e4c Linux-2.6.12-rc2 |
20 21 22 23 24 25 26 27 28 29 30 31 32 |
#define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header) * that VLAN requires. */ #define VLAN_ETH_ALEN 6 /* Octets in one ethernet addr */ #define VLAN_ETH_HLEN 18 /* Total octets in header. */ #define VLAN_ETH_ZLEN 64 /* Min. octets in frame sans FCS */ /* * According to 802.3ac, the packet can be 4 bytes longer. --Klika Jan */ #define VLAN_ETH_DATA_LEN 1500 /* Max. octets in payload */ #define VLAN_ETH_FRAME_LEN 1518 /* Max. octets in frame sans FCS */ |
740c15d0d [VLAN]: Clean up ... |
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
/* * struct vlan_hdr - vlan header * @h_vlan_TCI: priority and VLAN ID * @h_vlan_encapsulated_proto: packet type ID or len */ struct vlan_hdr { __be16 h_vlan_TCI; __be16 h_vlan_encapsulated_proto; }; /** * struct vlan_ethhdr - vlan ethernet header (ethhdr + vlan_hdr) * @h_dest: destination ethernet address * @h_source: source ethernet address * @h_vlan_proto: ethernet protocol (always 0x8100) * @h_vlan_TCI: priority and VLAN ID * @h_vlan_encapsulated_proto: packet type ID or len */ |
1da177e4c Linux-2.6.12-rc2 |
51 |
struct vlan_ethhdr { |
740c15d0d [VLAN]: Clean up ... |
52 53 54 55 56 |
unsigned char h_dest[ETH_ALEN]; unsigned char h_source[ETH_ALEN]; __be16 h_vlan_proto; __be16 h_vlan_TCI; __be16 h_vlan_encapsulated_proto; |
1da177e4c Linux-2.6.12-rc2 |
57 58 59 60 61 62 |
}; #include <linux/skbuff.h> static inline struct vlan_ethhdr *vlan_eth_hdr(const struct sk_buff *skb) { |
98e399f82 [SK_BUFF]: Introd... |
63 |
return (struct vlan_ethhdr *)skb_mac_header(skb); |
1da177e4c Linux-2.6.12-rc2 |
64 |
} |
05423b241 vlan: allow null ... |
65 66 67 68 69 |
#define VLAN_PRIO_MASK 0xe000 /* Priority Code Point */ #define VLAN_PRIO_SHIFT 13 #define VLAN_CFI_MASK 0x1000 /* Canonical Format Indicator */ #define VLAN_TAG_PRESENT VLAN_CFI_MASK #define VLAN_VID_MASK 0x0fff /* VLAN Identifier */ |
b738127df vlan: Rename VLAN... |
70 |
#define VLAN_N_VID 4096 |
1da177e4c Linux-2.6.12-rc2 |
71 72 |
/* found in socket.c */ |
881d966b4 [NET]: Make the d... |
73 |
extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); |
1da177e4c Linux-2.6.12-rc2 |
74 |
|
1da177e4c Linux-2.6.12-rc2 |
75 76 77 78 |
/* if this changes, algorithm will have to be reworked because this * depends on completely exhausting the VLAN identifier space. Thus * it gives constant time look-up, but in many cases it wastes memory. */ |
5c15bdec5 [VLAN]: Avoid a 4... |
79 |
#define VLAN_GROUP_ARRAY_SPLIT_PARTS 8 |
b738127df vlan: Rename VLAN... |
80 |
#define VLAN_GROUP_ARRAY_PART_LEN (VLAN_N_VID/VLAN_GROUP_ARRAY_SPLIT_PARTS) |
1da177e4c Linux-2.6.12-rc2 |
81 82 |
struct vlan_group { |
a9fde2607 [VLAN]: Tag vlan_... |
83 84 85 |
struct net_device *real_dev; /* The ethernet(like) device * the vlan is attached to. */ |
af3015170 [VLAN]: Simplify ... |
86 |
unsigned int nr_vlans; |
1da177e4c Linux-2.6.12-rc2 |
87 |
struct hlist_node hlist; /* linked list */ |
5c15bdec5 [VLAN]: Avoid a 4... |
88 |
struct net_device **vlan_devices_arrays[VLAN_GROUP_ARRAY_SPLIT_PARTS]; |
1da177e4c Linux-2.6.12-rc2 |
89 90 |
struct rcu_head rcu; }; |
6dcbbe25d net: move is_vlan... |
91 92 93 94 |
static inline int is_vlan_dev(struct net_device *dev) { return dev->priv_flags & IFF_802_1Q_VLAN; } |
05423b241 vlan: allow null ... |
95 96 |
#define vlan_tx_tag_present(__skb) ((__skb)->vlan_tci & VLAN_TAG_PRESENT) #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) |
1da177e4c Linux-2.6.12-rc2 |
97 |
|
7750f403c vlan: uninline __... |
98 |
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
65ac6a5fa vlan: Avoid hash ... |
99 |
|
cec9c1336 vlan: introduce _... |
100 101 |
extern struct net_device *__vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id); |
22d1ba74b vlan: move struct... |
102 103 |
extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); extern u16 vlan_dev_vlan_id(const struct net_device *dev); |
bcc6d4790 net: vlan: make n... |
104 105 |
extern bool vlan_do_receive(struct sk_buff **skb); extern struct sk_buff *vlan_untag(struct sk_buff *skb); |
9b22ea560 net: fix packet s... |
106 |
|
7750f403c vlan: uninline __... |
107 |
#else |
cec9c1336 vlan: introduce _... |
108 109 110 111 112 |
static inline struct net_device * __vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id) { return NULL; } |
22d1ba74b vlan: move struct... |
113 114 115 116 117 118 119 120 121 122 123 |
static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) { BUG(); return NULL; } static inline u16 vlan_dev_vlan_id(const struct net_device *dev) { BUG(); return 0; } |
bcc6d4790 net: vlan: make n... |
124 |
static inline bool vlan_do_receive(struct sk_buff **skb) |
9b22ea560 net: fix packet s... |
125 |
{ |
0988c4c7f vlan: Calling vla... |
126 127 |
if ((*skb)->vlan_tci & VLAN_VID_MASK) (*skb)->pkt_type = PACKET_OTHERHOST; |
3701e5138 vlan: Centralize ... |
128 |
return false; |
9b22ea560 net: fix packet s... |
129 |
} |
e1c096e25 vlan: Add GRO int... |
130 |
|
6139e75f4 net: Missing 'inl... |
131 |
static inline struct sk_buff *vlan_untag(struct sk_buff *skb) |
bcc6d4790 net: vlan: make n... |
132 133 134 |
{ return skb; } |
7750f403c vlan: uninline __... |
135 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
136 |
|
9bb8582ef vlan: TCI related... |
137 |
/** |
0b5c9db1b vlan: Fix the ing... |
138 |
* vlan_insert_tag - regular VLAN tag inserting |
1da177e4c Linux-2.6.12-rc2 |
139 |
* @skb: skbuff to tag |
9bb8582ef vlan: TCI related... |
140 |
* @vlan_tci: VLAN TCI to insert |
1da177e4c Linux-2.6.12-rc2 |
141 142 143 |
* * Inserts the VLAN tag into @skb as part of the payload * Returns a VLAN tagged skb. If a new skb is created, @skb is freed. |
9bb8582ef vlan: TCI related... |
144 |
* |
1da177e4c Linux-2.6.12-rc2 |
145 146 |
* Following the skb_unshare() example, in case of error, the calling function * doesn't have to worry about freeing the original skb. |
0b5c9db1b vlan: Fix the ing... |
147 148 |
* * Does not change skb->protocol so this function can be used during receive. |
1da177e4c Linux-2.6.12-rc2 |
149 |
*/ |
0b5c9db1b vlan: Fix the ing... |
150 |
static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb, u16 vlan_tci) |
1da177e4c Linux-2.6.12-rc2 |
151 152 |
{ struct vlan_ethhdr *veth; |
11a100f84 vlan: avoid heade... |
153 154 155 |
if (skb_cow_head(skb, VLAN_HLEN) < 0) { kfree_skb(skb); return NULL; |
1da177e4c Linux-2.6.12-rc2 |
156 |
} |
1da177e4c Linux-2.6.12-rc2 |
157 158 159 160 |
veth = (struct vlan_ethhdr *)skb_push(skb, VLAN_HLEN); /* Move the mac addresses to the beginning of the new header. */ memmove(skb->data, skb->data + VLAN_HLEN, 2 * VLAN_ETH_ALEN); |
e4dd61882 vlan: Update skb-... |
161 |
skb->mac_header -= VLAN_HLEN; |
1da177e4c Linux-2.6.12-rc2 |
162 163 |
/* first, the ethernet type */ |
57d3ae847 [VLAN]: Turn __co... |
164 |
veth->h_vlan_proto = htons(ETH_P_8021Q); |
1da177e4c Linux-2.6.12-rc2 |
165 |
|
9bb8582ef vlan: TCI related... |
166 167 |
/* now, the TCI */ veth->h_vlan_TCI = htons(vlan_tci); |
1da177e4c Linux-2.6.12-rc2 |
168 |
|
0b5c9db1b vlan: Fix the ing... |
169 170 |
return skb; } |
1da177e4c Linux-2.6.12-rc2 |
171 |
|
0b5c9db1b vlan: Fix the ing... |
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
/** * __vlan_put_tag - regular VLAN tag inserting * @skb: skbuff to tag * @vlan_tci: VLAN TCI to insert * * Inserts the VLAN tag into @skb as part of the payload * Returns a VLAN tagged skb. If a new skb is created, @skb is freed. * * Following the skb_unshare() example, in case of error, the calling function * doesn't have to worry about freeing the original skb. */ static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci) { skb = vlan_insert_tag(skb, vlan_tci); if (skb) skb->protocol = htons(ETH_P_8021Q); |
1da177e4c Linux-2.6.12-rc2 |
188 189 190 191 192 193 |
return skb; } /** * __vlan_hwaccel_put_tag - hardware accelerated VLAN inserting * @skb: skbuff to tag |
9bb8582ef vlan: TCI related... |
194 |
* @vlan_tci: VLAN TCI to insert |
1da177e4c Linux-2.6.12-rc2 |
195 |
* |
6aa895b04 vlan: Don't store... |
196 |
* Puts the VLAN TCI in @skb->vlan_tci and lets the device do the rest |
1da177e4c Linux-2.6.12-rc2 |
197 |
*/ |
9bb8582ef vlan: TCI related... |
198 199 |
static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb, u16 vlan_tci) |
1da177e4c Linux-2.6.12-rc2 |
200 |
{ |
05423b241 vlan: allow null ... |
201 |
skb->vlan_tci = VLAN_TAG_PRESENT | vlan_tci; |
1da177e4c Linux-2.6.12-rc2 |
202 203 204 205 206 207 208 209 |
return skb; } #define HAVE_VLAN_PUT_TAG /** * vlan_put_tag - inserts VLAN tag according to device features * @skb: skbuff to tag |
9bb8582ef vlan: TCI related... |
210 |
* @vlan_tci: VLAN TCI to insert |
1da177e4c Linux-2.6.12-rc2 |
211 212 213 214 |
* * Assumes skb->dev is the target that will xmit this frame. * Returns a VLAN tagged skb. */ |
9bb8582ef vlan: TCI related... |
215 |
static inline struct sk_buff *vlan_put_tag(struct sk_buff *skb, u16 vlan_tci) |
1da177e4c Linux-2.6.12-rc2 |
216 217 |
{ if (skb->dev->features & NETIF_F_HW_VLAN_TX) { |
9bb8582ef vlan: TCI related... |
218 |
return __vlan_hwaccel_put_tag(skb, vlan_tci); |
1da177e4c Linux-2.6.12-rc2 |
219 |
} else { |
9bb8582ef vlan: TCI related... |
220 |
return __vlan_put_tag(skb, vlan_tci); |
1da177e4c Linux-2.6.12-rc2 |
221 222 223 224 225 226 |
} } /** * __vlan_get_tag - get the VLAN ID that is part of the payload * @skb: skbuff to query |
9bb8582ef vlan: TCI related... |
227 228 |
* @vlan_tci: buffer to store vlaue * |
1da177e4c Linux-2.6.12-rc2 |
229 230 |
* Returns error if the skb is not of VLAN type */ |
9bb8582ef vlan: TCI related... |
231 |
static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) |
1da177e4c Linux-2.6.12-rc2 |
232 233 |
{ struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb->data; |
57d3ae847 [VLAN]: Turn __co... |
234 |
if (veth->h_vlan_proto != htons(ETH_P_8021Q)) { |
1da177e4c Linux-2.6.12-rc2 |
235 236 |
return -EINVAL; } |
9bb8582ef vlan: TCI related... |
237 |
*vlan_tci = ntohs(veth->h_vlan_TCI); |
1da177e4c Linux-2.6.12-rc2 |
238 239 240 241 242 243 |
return 0; } /** * __vlan_hwaccel_get_tag - get the VLAN ID that is in @skb->cb[] * @skb: skbuff to query |
9bb8582ef vlan: TCI related... |
244 245 |
* @vlan_tci: buffer to store vlaue * |
6aa895b04 vlan: Don't store... |
246 |
* Returns error if @skb->vlan_tci is not set correctly |
1da177e4c Linux-2.6.12-rc2 |
247 |
*/ |
181499356 [VLAN]: Constify ... |
248 |
static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb, |
9bb8582ef vlan: TCI related... |
249 |
u16 *vlan_tci) |
1da177e4c Linux-2.6.12-rc2 |
250 |
{ |
6aa895b04 vlan: Don't store... |
251 |
if (vlan_tx_tag_present(skb)) { |
05423b241 vlan: allow null ... |
252 |
*vlan_tci = vlan_tx_tag_get(skb); |
1da177e4c Linux-2.6.12-rc2 |
253 254 |
return 0; } else { |
9bb8582ef vlan: TCI related... |
255 |
*vlan_tci = 0; |
1da177e4c Linux-2.6.12-rc2 |
256 257 258 259 260 261 262 263 264 |
return -EINVAL; } } #define HAVE_VLAN_GET_TAG /** * vlan_get_tag - get the VLAN ID from the skb * @skb: skbuff to query |
9bb8582ef vlan: TCI related... |
265 266 |
* @vlan_tci: buffer to store vlaue * |
1da177e4c Linux-2.6.12-rc2 |
267 268 |
* Returns error if the skb is not VLAN tagged */ |
9bb8582ef vlan: TCI related... |
269 |
static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) |
1da177e4c Linux-2.6.12-rc2 |
270 271 |
{ if (skb->dev->features & NETIF_F_HW_VLAN_TX) { |
9bb8582ef vlan: TCI related... |
272 |
return __vlan_hwaccel_get_tag(skb, vlan_tci); |
1da177e4c Linux-2.6.12-rc2 |
273 |
} else { |
9bb8582ef vlan: TCI related... |
274 |
return __vlan_get_tag(skb, vlan_tci); |
1da177e4c Linux-2.6.12-rc2 |
275 276 |
} } |
0a85df004 vlan: Add functio... |
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
/** * vlan_get_protocol - get protocol EtherType. * @skb: skbuff to query * * Returns the EtherType of the packet, regardless of whether it is * vlan encapsulated (normal or hardware accelerated) or not. */ static inline __be16 vlan_get_protocol(const struct sk_buff *skb) { __be16 protocol = 0; if (vlan_tx_tag_present(skb) || skb->protocol != cpu_to_be16(ETH_P_8021Q)) protocol = skb->protocol; else { __be16 proto, *protop; protop = skb_header_pointer(skb, offsetof(struct vlan_ethhdr, h_vlan_encapsulated_proto), sizeof(proto), &proto); if (likely(protop)) protocol = *protop; } return protocol; } |
1da177e4c Linux-2.6.12-rc2 |
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
#endif /* __KERNEL__ */ /* VLAN IOCTLs are found in sockios.h */ /* Passed in vlan_ioctl_args structure to determine behaviour. */ enum vlan_ioctl_cmds { ADD_VLAN_CMD, DEL_VLAN_CMD, SET_VLAN_INGRESS_PRIORITY_CMD, SET_VLAN_EGRESS_PRIORITY_CMD, GET_VLAN_INGRESS_PRIORITY_CMD, GET_VLAN_EGRESS_PRIORITY_CMD, SET_VLAN_NAME_TYPE_CMD, SET_VLAN_FLAG_CMD, GET_VLAN_REALDEV_NAME_CMD, /* If this works, you know it's a VLAN device, btw */ GET_VLAN_VID_CMD /* Get the VID of this VLAN (specified by name) */ }; |
a4bf3af4a [VLAN]: Introduce... |
319 320 |
enum vlan_flags { VLAN_FLAG_REORDER_HDR = 0x1, |
70c03b49b vlan: Add GVRP su... |
321 |
VLAN_FLAG_GVRP = 0x2, |
5e7565930 vlan: support "lo... |
322 |
VLAN_FLAG_LOOSE_BINDING = 0x4, |
a4bf3af4a [VLAN]: Introduce... |
323 |
}; |
1da177e4c Linux-2.6.12-rc2 |
324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 |
enum vlan_name_types { VLAN_NAME_TYPE_PLUS_VID, /* Name will look like: vlan0005 */ VLAN_NAME_TYPE_RAW_PLUS_VID, /* name will look like: eth1.0005 */ VLAN_NAME_TYPE_PLUS_VID_NO_PAD, /* Name will look like: vlan5 */ VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD, /* Name will look like: eth0.5 */ VLAN_NAME_TYPE_HIGHEST }; struct vlan_ioctl_args { int cmd; /* Should be one of the vlan_ioctl_cmds enum above. */ char device1[24]; union { char device2[24]; int VID; unsigned int skb_priority; unsigned int name_type; unsigned int bind_type; unsigned int flag; /* Matches vlan_dev_info flags */ } u; short vlan_qos; }; #endif /* !(_LINUX_IF_VLAN_H_) */ |