[IPV6]: Replace sk_buff ** with sk_buff * in input handlers
[linux-2.6-block.git] / net / ipv6 / exthdrs.c
index c82d4d49f71f1aff4eada6daaa69f8718bbbe019..1e89efd38a0c6094317495cce83e9add082e69f5 100644 (file)
@@ -102,7 +102,7 @@ EXPORT_SYMBOL_GPL(ipv6_find_tlv);
 
 struct tlvtype_proc {
        int     type;
-       int     (*func)(struct sk_buff **skbp, int offset);
+       int     (*func)(struct sk_buff *skb, int offset);
 };
 
 /*********************
@@ -111,10 +111,8 @@ struct tlvtype_proc {
 
 /* An unknown option is detected, decide what to do */
 
-static int ip6_tlvopt_unknown(struct sk_buff **skbp, int optoff)
+static int ip6_tlvopt_unknown(struct sk_buff *skb, int optoff)
 {
-       struct sk_buff *skb = *skbp;
-
        switch ((skb_network_header(skb)[optoff] & 0xC0) >> 6) {
        case 0: /* ignore */
                return 1;
@@ -139,9 +137,8 @@ static int ip6_tlvopt_unknown(struct sk_buff **skbp, int optoff)
 
 /* Parse tlv encoded option header (hop-by-hop or destination) */
 
-static int ip6_parse_tlv(struct tlvtype_proc *procs, struct sk_buff **skbp)
+static int ip6_parse_tlv(struct tlvtype_proc *procs, struct sk_buff *skb)
 {
-       struct sk_buff *skb = *skbp;
        struct tlvtype_proc *curr;
        const unsigned char *nh = skb_network_header(skb);
        int off = skb_network_header_len(skb);
@@ -172,13 +169,13 @@ static int ip6_parse_tlv(struct tlvtype_proc *procs, struct sk_buff **skbp)
                                        /* type specific length/alignment
                                           checks will be performed in the
                                           func(). */
-                                       if (curr->func(skbp, off) == 0)
+                                       if (curr->func(skb, off) == 0)
                                                return 0;
                                        break;
                                }
                        }
                        if (curr->type < 0) {
-                               if (ip6_tlvopt_unknown(skbp, off) == 0)
+                               if (ip6_tlvopt_unknown(skb, off) == 0)
                                        return 0;
                        }
                        break;
@@ -198,9 +195,8 @@ bad:
  *****************************/
 
 #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
-static int ipv6_dest_hao(struct sk_buff **skbp, int optoff)
+static int ipv6_dest_hao(struct sk_buff *skb, int optoff)
 {
-       struct sk_buff *skb = *skbp;
        struct ipv6_destopt_hao *hao;
        struct inet6_skb_parm *opt = IP6CB(skb);
        struct ipv6hdr *ipv6h = ipv6_hdr(skb);
@@ -234,22 +230,13 @@ static int ipv6_dest_hao(struct sk_buff **skbp, int optoff)
                goto discard;
 
        if (skb_cloned(skb)) {
-               struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
-               struct inet6_skb_parm *opt2;
-
-               if (skb2 == NULL)
+               if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
                        goto discard;
 
-               opt2 = IP6CB(skb2);
-               memcpy(opt2, opt, sizeof(*opt2));
-
-               kfree_skb(skb);
-
                /* update all variable using below by copied skbuff */
-               *skbp = skb = skb2;
-               hao = (struct ipv6_destopt_hao *)(skb_network_header(skb2) +
+               hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) +
                                                  optoff);
-               ipv6h = ipv6_hdr(skb2);
+               ipv6h = ipv6_hdr(skb);
        }
 
        if (skb->ip_summed == CHECKSUM_COMPLETE)
@@ -280,9 +267,8 @@ static struct tlvtype_proc tlvprocdestopt_lst[] = {
        {-1,                    NULL}
 };
 
-static int ipv6_destopt_rcv(struct sk_buff **skbp)
+static int ipv6_destopt_rcv(struct sk_buff *skb)
 {
-       struct sk_buff *skb = *skbp;
        struct inet6_skb_parm *opt = IP6CB(skb);
 #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
        __u16 dstbuf;
@@ -304,9 +290,8 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp)
 #endif
 
        dst = dst_clone(skb->dst);
-       if (ip6_parse_tlv(tlvprocdestopt_lst, skbp)) {
+       if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) {
                dst_release(dst);
-               skb = *skbp;
                skb->transport_header += (skb_transport_header(skb)[1] + 1) << 3;
                opt = IP6CB(skb);
 #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
@@ -337,10 +322,8 @@ void __init ipv6_destopt_init(void)
   NONE header. No data in packet.
  ********************************/
 
-static int ipv6_nodata_rcv(struct sk_buff **skbp)
+static int ipv6_nodata_rcv(struct sk_buff *skb)
 {
-       struct sk_buff *skb = *skbp;
-
        kfree_skb(skb);
        return 0;
 }
@@ -360,9 +343,8 @@ void __init ipv6_nodata_init(void)
   Routing header.
  ********************************/
 
-static int ipv6_rthdr_rcv(struct sk_buff **skbp)
+static int ipv6_rthdr_rcv(struct sk_buff *skb)
 {
-       struct sk_buff *skb = *skbp;
        struct inet6_skb_parm *opt = IP6CB(skb);
        struct in6_addr *addr = NULL;
        struct in6_addr daddr;
@@ -464,18 +446,14 @@ looped_back:
           Do not damage packets queued somewhere.
         */
        if (skb_cloned(skb)) {
-               struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
                /* the copy is a forwarded packet */
-               if (skb2 == NULL) {
+               if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
                        IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
                                         IPSTATS_MIB_OUTDISCARDS);
                        kfree_skb(skb);
                        return -1;
                }
-               kfree_skb(skb);
-               *skbp = skb = skb2;
-               opt = IP6CB(skb2);
-               hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb2);
+               hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb);
        }
 
        if (skb->ip_summed == CHECKSUM_COMPLETE)
@@ -578,9 +556,8 @@ static inline struct inet6_dev *ipv6_skb_idev(struct sk_buff *skb)
 
 /* Router Alert as of RFC 2711 */
 
-static int ipv6_hop_ra(struct sk_buff **skbp, int optoff)
+static int ipv6_hop_ra(struct sk_buff *skb, int optoff)
 {
-       struct sk_buff *skb = *skbp;
        const unsigned char *nh = skb_network_header(skb);
 
        if (nh[optoff + 1] == 2) {
@@ -595,9 +572,8 @@ static int ipv6_hop_ra(struct sk_buff **skbp, int optoff)
 
 /* Jumbo payload */
 
-static int ipv6_hop_jumbo(struct sk_buff **skbp, int optoff)
+static int ipv6_hop_jumbo(struct sk_buff *skb, int optoff)
 {
-       struct sk_buff *skb = *skbp;
        const unsigned char *nh = skb_network_header(skb);
        u32 pkt_len;
 
@@ -648,9 +624,8 @@ static struct tlvtype_proc tlvprochopopt_lst[] = {
        { -1, }
 };
 
-int ipv6_parse_hopopts(struct sk_buff **skbp)
+int ipv6_parse_hopopts(struct sk_buff *skb)
 {
-       struct sk_buff *skb = *skbp;
        struct inet6_skb_parm *opt = IP6CB(skb);
 
        /*
@@ -667,8 +642,7 @@ int ipv6_parse_hopopts(struct sk_buff **skbp)
        }
 
        opt->hop = sizeof(struct ipv6hdr);
-       if (ip6_parse_tlv(tlvprochopopt_lst, skbp)) {
-               skb = *skbp;
+       if (ip6_parse_tlv(tlvprochopopt_lst, skb)) {
                skb->transport_header += (skb_transport_header(skb)[1] + 1) << 3;
                opt = IP6CB(skb);
                opt->nhoff = sizeof(struct ipv6hdr);