diff options
-rw-r--r-- | include/linux/if_vlan.h | 31 | ||||
-rw-r--r-- | include/linux/skbuff.h | 3 | ||||
-rw-r--r-- | net/core/skbuff.c | 3 |
3 files changed, 13 insertions, 24 deletions
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 93f5d9b0e9f9..9e7b49b8062d 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
@@ -105,17 +105,8 @@ static inline void vlan_group_set_device(struct vlan_group *vg, | |||
105 | array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev; | 105 | array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev; |
106 | } | 106 | } |
107 | 107 | ||
108 | /* VLAN tx hw acceleration helpers. */ | 108 | #define vlan_tx_tag_present(__skb) ((__skb)->vlan_tci) |
109 | struct vlan_skb_tx_cookie { | 109 | #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci) |
110 | u32 magic; | ||
111 | u32 vlan_tag; | ||
112 | }; | ||
113 | |||
114 | #define VLAN_TX_COOKIE_MAGIC 0x564c414e /* "VLAN" in ascii. */ | ||
115 | #define VLAN_TX_SKB_CB(__skb) ((struct vlan_skb_tx_cookie *)&((__skb)->cb[0])) | ||
116 | #define vlan_tx_tag_present(__skb) \ | ||
117 | (VLAN_TX_SKB_CB(__skb)->magic == VLAN_TX_COOKIE_MAGIC) | ||
118 | #define vlan_tx_tag_get(__skb) (VLAN_TX_SKB_CB(__skb)->vlan_tag) | ||
119 | 110 | ||
120 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | 111 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
121 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); | 112 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); |
@@ -210,17 +201,12 @@ static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci) | |||
210 | * @skb: skbuff to tag | 201 | * @skb: skbuff to tag |
211 | * @vlan_tci: VLAN TCI to insert | 202 | * @vlan_tci: VLAN TCI to insert |
212 | * | 203 | * |
213 | * Puts the VLAN TCI in @skb->cb[] and lets the device do the rest | 204 | * Puts the VLAN TCI in @skb->vlan_tci and lets the device do the rest |
214 | */ | 205 | */ |
215 | static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb, | 206 | static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb, |
216 | u16 vlan_tci) | 207 | u16 vlan_tci) |
217 | { | 208 | { |
218 | struct vlan_skb_tx_cookie *cookie; | 209 | skb->vlan_tci = vlan_tci; |
219 | |||
220 | cookie = VLAN_TX_SKB_CB(skb); | ||
221 | cookie->magic = VLAN_TX_COOKIE_MAGIC; | ||
222 | cookie->vlan_tag = vlan_tci; | ||
223 | |||
224 | return skb; | 210 | return skb; |
225 | } | 211 | } |
226 | 212 | ||
@@ -267,16 +253,13 @@ static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) | |||
267 | * @skb: skbuff to query | 253 | * @skb: skbuff to query |
268 | * @vlan_tci: buffer to store vlaue | 254 | * @vlan_tci: buffer to store vlaue |
269 | * | 255 | * |
270 | * Returns error if @skb->cb[] is not set correctly | 256 | * Returns error if @skb->vlan_tci is not set correctly |
271 | */ | 257 | */ |
272 | static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb, | 258 | static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb, |
273 | u16 *vlan_tci) | 259 | u16 *vlan_tci) |
274 | { | 260 | { |
275 | struct vlan_skb_tx_cookie *cookie; | 261 | if (vlan_tx_tag_present(skb)) { |
276 | 262 | *vlan_tci = skb->vlan_tci; | |
277 | cookie = VLAN_TX_SKB_CB(skb); | ||
278 | if (cookie->magic == VLAN_TX_COOKIE_MAGIC) { | ||
279 | *vlan_tci = cookie->vlan_tag; | ||
280 | return 0; | 263 | return 0; |
281 | } else { | 264 | } else { |
282 | *vlan_tci = 0; | 265 | *vlan_tci = 0; |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 8f10e3d08fd9..7ea44f6621f2 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -246,6 +246,7 @@ typedef unsigned char *sk_buff_data_t; | |||
246 | * @dma_cookie: a cookie to one of several possible DMA operations | 246 | * @dma_cookie: a cookie to one of several possible DMA operations |
247 | * done by skb DMA functions | 247 | * done by skb DMA functions |
248 | * @secmark: security marking | 248 | * @secmark: security marking |
249 | * @vlan_tci: vlan tag control information | ||
249 | */ | 250 | */ |
250 | 251 | ||
251 | struct sk_buff { | 252 | struct sk_buff { |
@@ -326,6 +327,8 @@ struct sk_buff { | |||
326 | 327 | ||
327 | __u32 mark; | 328 | __u32 mark; |
328 | 329 | ||
330 | __u16 vlan_tci; | ||
331 | |||
329 | sk_buff_data_t transport_header; | 332 | sk_buff_data_t transport_header; |
330 | sk_buff_data_t network_header; | 333 | sk_buff_data_t network_header; |
331 | sk_buff_data_t mac_header; | 334 | sk_buff_data_t mac_header; |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 7c571560e9d2..50a853f7cd8e 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -459,6 +459,8 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
459 | new->tc_verd = old->tc_verd; | 459 | new->tc_verd = old->tc_verd; |
460 | #endif | 460 | #endif |
461 | #endif | 461 | #endif |
462 | new->vlan_tci = old->vlan_tci; | ||
463 | |||
462 | skb_copy_secmark(new, old); | 464 | skb_copy_secmark(new, old); |
463 | } | 465 | } |
464 | 466 | ||
@@ -2286,6 +2288,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) | |||
2286 | skb_copy_queue_mapping(nskb, skb); | 2288 | skb_copy_queue_mapping(nskb, skb); |
2287 | nskb->priority = skb->priority; | 2289 | nskb->priority = skb->priority; |
2288 | nskb->protocol = skb->protocol; | 2290 | nskb->protocol = skb->protocol; |
2291 | nskb->vlan_tci = skb->vlan_tci; | ||
2289 | nskb->dst = dst_clone(skb->dst); | 2292 | nskb->dst = dst_clone(skb->dst); |
2290 | memcpy(nskb->cb, skb->cb, sizeof(skb->cb)); | 2293 | memcpy(nskb->cb, skb->cb, sizeof(skb->cb)); |
2291 | nskb->pkt_type = skb->pkt_type; | 2294 | nskb->pkt_type = skb->pkt_type; |