aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/if_vlan.h31
-rw-r--r--include/linux/skbuff.h3
-rw-r--r--net/core/skbuff.c3
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)
109struct 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)
121extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); 112extern 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 */
215static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb, 206static 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 */
272static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb, 258static 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
251struct sk_buff { 252struct 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;