aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/if_vlan.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/if_vlan.h')
-rw-r--r--include/linux/if_vlan.h80
1 files changed, 63 insertions, 17 deletions
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
index 12d5543b14f2..13aff1e2183b 100644
--- a/include/linux/if_vlan.h
+++ b/include/linux/if_vlan.h
@@ -74,22 +74,7 @@ static inline struct vlan_ethhdr *vlan_eth_hdr(const struct sk_buff *skb)
74/* found in socket.c */ 74/* found in socket.c */
75extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); 75extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *));
76 76
77/* if this changes, algorithm will have to be reworked because this 77struct vlan_info;
78 * depends on completely exhausting the VLAN identifier space. Thus
79 * it gives constant time look-up, but in many cases it wastes memory.
80 */
81#define VLAN_GROUP_ARRAY_SPLIT_PARTS 8
82#define VLAN_GROUP_ARRAY_PART_LEN (VLAN_N_VID/VLAN_GROUP_ARRAY_SPLIT_PARTS)
83
84struct vlan_group {
85 struct net_device *real_dev; /* The ethernet(like) device
86 * the vlan is attached to.
87 */
88 unsigned int nr_vlans;
89 struct hlist_node hlist; /* linked list */
90 struct net_device **vlan_devices_arrays[VLAN_GROUP_ARRAY_SPLIT_PARTS];
91 struct rcu_head rcu;
92};
93 78
94static inline int is_vlan_dev(struct net_device *dev) 79static inline int is_vlan_dev(struct net_device *dev)
95{ 80{
@@ -109,6 +94,13 @@ extern u16 vlan_dev_vlan_id(const struct net_device *dev);
109extern bool vlan_do_receive(struct sk_buff **skb, bool last_handler); 94extern bool vlan_do_receive(struct sk_buff **skb, bool last_handler);
110extern struct sk_buff *vlan_untag(struct sk_buff *skb); 95extern struct sk_buff *vlan_untag(struct sk_buff *skb);
111 96
97extern int vlan_vid_add(struct net_device *dev, unsigned short vid);
98extern void vlan_vid_del(struct net_device *dev, unsigned short vid);
99
100extern int vlan_vids_add_by_dev(struct net_device *dev,
101 const struct net_device *by_dev);
102extern void vlan_vids_del_by_dev(struct net_device *dev,
103 const struct net_device *by_dev);
112#else 104#else
113static inline struct net_device * 105static inline struct net_device *
114__vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id) 106__vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id)
@@ -139,6 +131,26 @@ static inline struct sk_buff *vlan_untag(struct sk_buff *skb)
139{ 131{
140 return skb; 132 return skb;
141} 133}
134
135static inline int vlan_vid_add(struct net_device *dev, unsigned short vid)
136{
137 return 0;
138}
139
140static inline void vlan_vid_del(struct net_device *dev, unsigned short vid)
141{
142}
143
144static inline int vlan_vids_add_by_dev(struct net_device *dev,
145 const struct net_device *by_dev)
146{
147 return 0;
148}
149
150static inline void vlan_vids_del_by_dev(struct net_device *dev,
151 const struct net_device *by_dev)
152{
153}
142#endif 154#endif
143 155
144/** 156/**
@@ -310,6 +322,40 @@ static inline __be16 vlan_get_protocol(const struct sk_buff *skb)
310 322
311 return protocol; 323 return protocol;
312} 324}
325
326static inline void vlan_set_encap_proto(struct sk_buff *skb,
327 struct vlan_hdr *vhdr)
328{
329 __be16 proto;
330 unsigned char *rawp;
331
332 /*
333 * Was a VLAN packet, grab the encapsulated protocol, which the layer
334 * three protocols care about.
335 */
336
337 proto = vhdr->h_vlan_encapsulated_proto;
338 if (ntohs(proto) >= 1536) {
339 skb->protocol = proto;
340 return;
341 }
342
343 rawp = skb->data;
344 if (*(unsigned short *) rawp == 0xFFFF)
345 /*
346 * This is a magic hack to spot IPX packets. Older Novell
347 * breaks the protocol design and runs IPX over 802.3 without
348 * an 802.2 LLC layer. We look for FFFF which isn't a used
349 * 802.2 SSAP/DSAP. This won't work for fault tolerant netware
350 * but does for the rest.
351 */
352 skb->protocol = htons(ETH_P_802_3);
353 else
354 /*
355 * Real 802.2 LLC
356 */
357 skb->protocol = htons(ETH_P_802_2);
358}
313#endif /* __KERNEL__ */ 359#endif /* __KERNEL__ */
314 360
315/* VLAN IOCTLs are found in sockios.h */ 361/* VLAN IOCTLs are found in sockios.h */
@@ -352,7 +398,7 @@ struct vlan_ioctl_args {
352 unsigned int skb_priority; 398 unsigned int skb_priority;
353 unsigned int name_type; 399 unsigned int name_type;
354 unsigned int bind_type; 400 unsigned int bind_type;
355 unsigned int flag; /* Matches vlan_dev_info flags */ 401 unsigned int flag; /* Matches vlan_dev_priv flags */
356 } u; 402 } u;
357 403
358 short vlan_qos; 404 short vlan_qos;