提交 6aa895b0 编写于 作者: P Patrick McHardy 提交者: David S. Miller

vlan: Don't store VLAN tag in cb

Use a real skb member to store the skb to avoid clashes with qdiscs,
which are allowed to use the cb area themselves. As currently only real
devices that consume the skb set the NETIF_F_HW_VLAN_TX flag, no explicit
invalidation is neccessary.

The new member fills a hole on 64 bit, the skb layout changes from:

        __u32                      mark;                 /*   172     4 */
        sk_buff_data_t             transport_header;     /*   176     4 */
        sk_buff_data_t             network_header;       /*   180     4 */
        sk_buff_data_t             mac_header;           /*   184     4 */
        sk_buff_data_t             tail;                 /*   188     4 */
        /* --- cacheline 3 boundary (192 bytes) --- */
        sk_buff_data_t             end;                  /*   192     4 */

        /* XXX 4 bytes hole, try to pack */

to

        __u32                      mark;                 /*   172     4 */
        __u16                      vlan_tci;             /*   176     2 */

        /* XXX 2 bytes hole, try to pack */

        sk_buff_data_t             transport_header;     /*   180     4 */
        sk_buff_data_t             network_header;       /*   184     4 */
Signed-off-by: NPatrick McHardy <kaber@trash.net>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 968edbe1
...@@ -105,17 +105,8 @@ static inline void vlan_group_set_device(struct vlan_group *vg, ...@@ -105,17 +105,8 @@ static inline void vlan_group_set_device(struct vlan_group *vg,
array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev; array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev;
} }
/* VLAN tx hw acceleration helpers. */ #define vlan_tx_tag_present(__skb) ((__skb)->vlan_tci)
struct vlan_skb_tx_cookie { #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci)
u32 magic;
u32 vlan_tag;
};
#define VLAN_TX_COOKIE_MAGIC 0x564c414e /* "VLAN" in ascii. */
#define VLAN_TX_SKB_CB(__skb) ((struct vlan_skb_tx_cookie *)&((__skb)->cb[0]))
#define vlan_tx_tag_present(__skb) \
(VLAN_TX_SKB_CB(__skb)->magic == VLAN_TX_COOKIE_MAGIC)
#define vlan_tx_tag_get(__skb) (VLAN_TX_SKB_CB(__skb)->vlan_tag)
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); 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,17 +201,12 @@ static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci)
* @skb: skbuff to tag * @skb: skbuff to tag
* @vlan_tci: VLAN TCI to insert * @vlan_tci: VLAN TCI to insert
* *
* Puts the VLAN TCI in @skb->cb[] and lets the device do the rest * Puts the VLAN TCI in @skb->vlan_tci and lets the device do the rest
*/ */
static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb, static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb,
u16 vlan_tci) u16 vlan_tci)
{ {
struct vlan_skb_tx_cookie *cookie; skb->vlan_tci = vlan_tci;
cookie = VLAN_TX_SKB_CB(skb);
cookie->magic = VLAN_TX_COOKIE_MAGIC;
cookie->vlan_tag = vlan_tci;
return skb; return skb;
} }
...@@ -267,16 +253,13 @@ static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) ...@@ -267,16 +253,13 @@ static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)
* @skb: skbuff to query * @skb: skbuff to query
* @vlan_tci: buffer to store vlaue * @vlan_tci: buffer to store vlaue
* *
* Returns error if @skb->cb[] is not set correctly * Returns error if @skb->vlan_tci is not set correctly
*/ */
static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb, static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb,
u16 *vlan_tci) u16 *vlan_tci)
{ {
struct vlan_skb_tx_cookie *cookie; if (vlan_tx_tag_present(skb)) {
*vlan_tci = skb->vlan_tci;
cookie = VLAN_TX_SKB_CB(skb);
if (cookie->magic == VLAN_TX_COOKIE_MAGIC) {
*vlan_tci = cookie->vlan_tag;
return 0; return 0;
} else { } else {
*vlan_tci = 0; *vlan_tci = 0;
......
...@@ -246,6 +246,7 @@ typedef unsigned char *sk_buff_data_t; ...@@ -246,6 +246,7 @@ typedef unsigned char *sk_buff_data_t;
* @dma_cookie: a cookie to one of several possible DMA operations * @dma_cookie: a cookie to one of several possible DMA operations
* done by skb DMA functions * done by skb DMA functions
* @secmark: security marking * @secmark: security marking
* @vlan_tci: vlan tag control information
*/ */
struct sk_buff { struct sk_buff {
...@@ -326,6 +327,8 @@ struct sk_buff { ...@@ -326,6 +327,8 @@ struct sk_buff {
__u32 mark; __u32 mark;
__u16 vlan_tci;
sk_buff_data_t transport_header; sk_buff_data_t transport_header;
sk_buff_data_t network_header; sk_buff_data_t network_header;
sk_buff_data_t mac_header; sk_buff_data_t mac_header;
......
...@@ -459,6 +459,8 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old) ...@@ -459,6 +459,8 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
new->tc_verd = old->tc_verd; new->tc_verd = old->tc_verd;
#endif #endif
#endif #endif
new->vlan_tci = old->vlan_tci;
skb_copy_secmark(new, old); skb_copy_secmark(new, old);
} }
...@@ -2286,6 +2288,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) ...@@ -2286,6 +2288,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features)
skb_copy_queue_mapping(nskb, skb); skb_copy_queue_mapping(nskb, skb);
nskb->priority = skb->priority; nskb->priority = skb->priority;
nskb->protocol = skb->protocol; nskb->protocol = skb->protocol;
nskb->vlan_tci = skb->vlan_tci;
nskb->dst = dst_clone(skb->dst); nskb->dst = dst_clone(skb->dst);
memcpy(nskb->cb, skb->cb, sizeof(skb->cb)); memcpy(nskb->cb, skb->cb, sizeof(skb->cb));
nskb->pkt_type = skb->pkt_type; nskb->pkt_type = skb->pkt_type;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册