Commit 15255a43 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

vlan: introduce __vlan_insert_tag helper which does not free skb

There's a need for helper which inserts vlan tag but does not free the
skb in case of an error.
Suggested-by: default avatarPravin Shelar <pshelar@nicira.com>
Signed-off-by: default avatarJiri Pirko <jiri@resnulli.us>
Acked-by: default avatarPravin B Shelar <pshelar@nicira.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5968250c
...@@ -282,28 +282,24 @@ static inline bool vlan_hw_offload_capable(netdev_features_t features, ...@@ -282,28 +282,24 @@ static inline bool vlan_hw_offload_capable(netdev_features_t features,
} }
/** /**
* vlan_insert_tag - regular VLAN tag inserting * __vlan_insert_tag - regular VLAN tag inserting
* @skb: skbuff to tag * @skb: skbuff to tag
* @vlan_proto: VLAN encapsulation protocol * @vlan_proto: VLAN encapsulation protocol
* @vlan_tci: VLAN TCI to insert * @vlan_tci: VLAN TCI to insert
* *
* Inserts the VLAN tag into @skb as part of the payload * Inserts the VLAN tag into @skb as part of the payload
* Returns a VLAN tagged skb. If a new skb is created, @skb is freed. * Returns error if skb_cow_head failes.
*
* Following the skb_unshare() example, in case of error, the calling function
* doesn't have to worry about freeing the original skb.
* *
* Does not change skb->protocol so this function can be used during receive. * Does not change skb->protocol so this function can be used during receive.
*/ */
static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb, static inline int __vlan_insert_tag(struct sk_buff *skb,
__be16 vlan_proto, u16 vlan_tci) __be16 vlan_proto, u16 vlan_tci)
{ {
struct vlan_ethhdr *veth; struct vlan_ethhdr *veth;
if (skb_cow_head(skb, VLAN_HLEN) < 0) { if (skb_cow_head(skb, VLAN_HLEN) < 0)
dev_kfree_skb_any(skb); return -ENOMEM;
return NULL;
}
veth = (struct vlan_ethhdr *)skb_push(skb, VLAN_HLEN); veth = (struct vlan_ethhdr *)skb_push(skb, VLAN_HLEN);
/* Move the mac addresses to the beginning of the new header. */ /* Move the mac addresses to the beginning of the new header. */
...@@ -316,6 +312,33 @@ static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb, ...@@ -316,6 +312,33 @@ static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb,
/* now, the TCI */ /* now, the TCI */
veth->h_vlan_TCI = htons(vlan_tci); veth->h_vlan_TCI = htons(vlan_tci);
return 0;
}
/**
* vlan_insert_tag - regular VLAN tag inserting
* @skb: skbuff to tag
* @vlan_proto: VLAN encapsulation protocol
* @vlan_tci: VLAN TCI to insert
*
* Inserts the VLAN tag into @skb as part of the payload
* Returns a VLAN tagged skb. If a new skb is created, @skb is freed.
*
* Following the skb_unshare() example, in case of error, the calling function
* doesn't have to worry about freeing the original skb.
*
* Does not change skb->protocol so this function can be used during receive.
*/
static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb,
__be16 vlan_proto, u16 vlan_tci)
{
int err;
err = __vlan_insert_tag(skb, vlan_proto, vlan_tci);
if (err) {
dev_kfree_skb_any(skb);
return NULL;
}
return skb; return skb;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment