|
@@ -126,9 +126,7 @@ static int tcf_nat(struct sk_buff *skb, const struct tc_action *a,
|
|
|
addr = iph->daddr;
|
|
|
|
|
|
if (!((old_addr ^ addr) & mask)) {
|
|
|
- if (skb_cloned(skb) &&
|
|
|
- !skb_clone_writable(skb, sizeof(*iph) + noff) &&
|
|
|
- pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
|
|
|
+ if (skb_try_make_writable(skb, sizeof(*iph) + noff))
|
|
|
goto drop;
|
|
|
|
|
|
new_addr &= mask;
|
|
@@ -156,9 +154,7 @@ static int tcf_nat(struct sk_buff *skb, const struct tc_action *a,
|
|
|
struct tcphdr *tcph;
|
|
|
|
|
|
if (!pskb_may_pull(skb, ihl + sizeof(*tcph) + noff) ||
|
|
|
- (skb_cloned(skb) &&
|
|
|
- !skb_clone_writable(skb, ihl + sizeof(*tcph) + noff) &&
|
|
|
- pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
|
|
|
+ skb_try_make_writable(skb, ihl + sizeof(*tcph) + noff))
|
|
|
goto drop;
|
|
|
|
|
|
tcph = (void *)(skb_network_header(skb) + ihl);
|
|
@@ -171,9 +167,7 @@ static int tcf_nat(struct sk_buff *skb, const struct tc_action *a,
|
|
|
struct udphdr *udph;
|
|
|
|
|
|
if (!pskb_may_pull(skb, ihl + sizeof(*udph) + noff) ||
|
|
|
- (skb_cloned(skb) &&
|
|
|
- !skb_clone_writable(skb, ihl + sizeof(*udph) + noff) &&
|
|
|
- pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
|
|
|
+ skb_try_make_writable(skb, ihl + sizeof(*udph) + noff))
|
|
|
goto drop;
|
|
|
|
|
|
udph = (void *)(skb_network_header(skb) + ihl);
|
|
@@ -213,10 +207,8 @@ static int tcf_nat(struct sk_buff *skb, const struct tc_action *a,
|
|
|
if ((old_addr ^ addr) & mask)
|
|
|
break;
|
|
|
|
|
|
- if (skb_cloned(skb) &&
|
|
|
- !skb_clone_writable(skb, ihl + sizeof(*icmph) +
|
|
|
- sizeof(*iph) + noff) &&
|
|
|
- pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
|
|
|
+ if (skb_try_make_writable(skb, ihl + sizeof(*icmph) +
|
|
|
+ sizeof(*iph) + noff))
|
|
|
goto drop;
|
|
|
|
|
|
icmph = (void *)(skb_network_header(skb) + ihl);
|