diff options
Diffstat (limited to 'include/linux/if_vlan.h')
| -rw-r--r-- | include/linux/if_vlan.h | 80 |
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 */ |
| 75 | extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); | 75 | extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); |
| 76 | 76 | ||
| 77 | /* if this changes, algorithm will have to be reworked because this | 77 | struct 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 | |||
| 84 | struct 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 | ||
| 94 | static inline int is_vlan_dev(struct net_device *dev) | 79 | static 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); | |||
| 109 | extern bool vlan_do_receive(struct sk_buff **skb, bool last_handler); | 94 | extern bool vlan_do_receive(struct sk_buff **skb, bool last_handler); |
| 110 | extern struct sk_buff *vlan_untag(struct sk_buff *skb); | 95 | extern struct sk_buff *vlan_untag(struct sk_buff *skb); |
| 111 | 96 | ||
| 97 | extern int vlan_vid_add(struct net_device *dev, unsigned short vid); | ||
| 98 | extern void vlan_vid_del(struct net_device *dev, unsigned short vid); | ||
| 99 | |||
| 100 | extern int vlan_vids_add_by_dev(struct net_device *dev, | ||
| 101 | const struct net_device *by_dev); | ||
| 102 | extern void vlan_vids_del_by_dev(struct net_device *dev, | ||
| 103 | const struct net_device *by_dev); | ||
| 112 | #else | 104 | #else |
| 113 | static inline struct net_device * | 105 | static 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 | |||
| 135 | static inline int vlan_vid_add(struct net_device *dev, unsigned short vid) | ||
| 136 | { | ||
| 137 | return 0; | ||
| 138 | } | ||
| 139 | |||
| 140 | static inline void vlan_vid_del(struct net_device *dev, unsigned short vid) | ||
| 141 | { | ||
| 142 | } | ||
| 143 | |||
| 144 | static inline int vlan_vids_add_by_dev(struct net_device *dev, | ||
| 145 | const struct net_device *by_dev) | ||
| 146 | { | ||
| 147 | return 0; | ||
| 148 | } | ||
| 149 | |||
| 150 | static 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 | |||
| 326 | static 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; |
