|
@@ -42,6 +42,9 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
|
|
|
|
|
|
static int make_writable(struct sk_buff *skb, int write_len)
|
|
static int make_writable(struct sk_buff *skb, int write_len)
|
|
{
|
|
{
|
|
|
|
+ if (!pskb_may_pull(skb, write_len))
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
if (!skb_cloned(skb) || skb_clone_writable(skb, write_len))
|
|
if (!skb_cloned(skb) || skb_clone_writable(skb, write_len))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
@@ -70,6 +73,8 @@ static int __pop_vlan_tci(struct sk_buff *skb, __be16 *current_tci)
|
|
|
|
|
|
vlan_set_encap_proto(skb, vhdr);
|
|
vlan_set_encap_proto(skb, vhdr);
|
|
skb->mac_header += VLAN_HLEN;
|
|
skb->mac_header += VLAN_HLEN;
|
|
|
|
+ if (skb_network_offset(skb) < ETH_HLEN)
|
|
|
|
+ skb_set_network_header(skb, ETH_HLEN);
|
|
skb_reset_mac_len(skb);
|
|
skb_reset_mac_len(skb);
|
|
|
|
|
|
return 0;
|
|
return 0;
|