diff options
Diffstat (limited to 'net/8021q/vlan_dev.c')
| -rw-r--r-- | net/8021q/vlan_dev.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 4bab322c9f8f..328759c32d61 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
| @@ -116,12 +116,22 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
| 116 | struct packet_type* ptype, struct net_device *orig_dev) | 116 | struct packet_type* ptype, struct net_device *orig_dev) |
| 117 | { | 117 | { |
| 118 | unsigned char *rawp = NULL; | 118 | unsigned char *rawp = NULL; |
| 119 | struct vlan_hdr *vhdr = (struct vlan_hdr *)(skb->data); | 119 | struct vlan_hdr *vhdr; |
| 120 | unsigned short vid; | 120 | unsigned short vid; |
| 121 | struct net_device_stats *stats; | 121 | struct net_device_stats *stats; |
| 122 | unsigned short vlan_TCI; | 122 | unsigned short vlan_TCI; |
| 123 | __be16 proto; | 123 | __be16 proto; |
| 124 | 124 | ||
| 125 | if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) | ||
| 126 | return -1; | ||
| 127 | |||
| 128 | if (unlikely(!pskb_may_pull(skb, VLAN_HLEN))) { | ||
| 129 | kfree_skb(skb); | ||
| 130 | return -1; | ||
| 131 | } | ||
| 132 | |||
| 133 | vhdr = (struct vlan_hdr *)(skb->data); | ||
| 134 | |||
| 125 | /* vlan_TCI = ntohs(get_unaligned(&vhdr->h_vlan_TCI)); */ | 135 | /* vlan_TCI = ntohs(get_unaligned(&vhdr->h_vlan_TCI)); */ |
| 126 | vlan_TCI = ntohs(vhdr->h_vlan_TCI); | 136 | vlan_TCI = ntohs(vhdr->h_vlan_TCI); |
| 127 | 137 | ||
