]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/ipv4/ah4.c
[INET]: Consolidate xxx_frag_intern
[linux-2.6-omap-h63xx.git] / net / ipv4 / ah4.c
index e4f7aa39978de865bb3c03ed12370496fa782b95..4e8e3b079f5b606cf7c70aed28563889b2202aa7 100644 (file)
@@ -82,7 +82,7 @@ static int ah_output(struct xfrm_state *x, struct sk_buff *skb)
                        goto error;
        }
 
-       ah = (struct ip_auth_hdr *)skb_transport_header(skb);
+       ah = ip_auth_hdr(skb);
        ah->nexthdr = *skb_mac_header(skb);
        *skb_mac_header(skb) = IPPROTO_AH;
 
@@ -93,8 +93,7 @@ static int ah_output(struct xfrm_state *x, struct sk_buff *skb)
        top_iph->check = 0;
 
        ahp = x->data;
-       ah->hdrlen  = (XFRM_ALIGN8(sizeof(struct ip_auth_hdr) +
-                                  ahp->icv_trunc_len) >> 2) - 2;
+       ah->hdrlen  = (XFRM_ALIGN8(sizeof(*ah) + ahp->icv_trunc_len) >> 2) - 2;
 
        ah->reserved = 0;
        ah->spi = x->id.spi;
@@ -116,8 +115,6 @@ static int ah_output(struct xfrm_state *x, struct sk_buff *skb)
                memcpy(top_iph+1, iph+1, top_iph->ihl*4 - sizeof(struct iphdr));
        }
 
-       ip_send_check(top_iph);
-
        err = 0;
 
 error:
@@ -128,21 +125,23 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
 {
        int ah_hlen;
        int ihl;
+       int nexthdr;
        int err = -EINVAL;
        struct iphdr *iph;
        struct ip_auth_hdr *ah;
        struct ah_data *ahp;
        char work_buf[60];
 
-       if (!pskb_may_pull(skb, sizeof(struct ip_auth_hdr)))
+       if (!pskb_may_pull(skb, sizeof(*ah)))
                goto out;
 
-       ah = (struct ip_auth_hdr*)skb->data;
+       ah = (struct ip_auth_hdr *)skb->data;
        ahp = x->data;
+       nexthdr = ah->nexthdr;
        ah_hlen = (ah->hdrlen + 2) << 2;
 
-       if (ah_hlen != XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_full_len) &&
-           ah_hlen != XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_trunc_len))
+       if (ah_hlen != XFRM_ALIGN8(sizeof(*ah) + ahp->icv_full_len) &&
+           ah_hlen != XFRM_ALIGN8(sizeof(*ah) + ahp->icv_trunc_len))
                goto out;
 
        if (!pskb_may_pull(skb, ah_hlen))
@@ -156,7 +155,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
 
        skb->ip_summed = CHECKSUM_NONE;
 
-       ah = (struct ip_auth_hdr*)skb->data;
+       ah = (struct ip_auth_hdr *)skb->data;
        iph = ip_hdr(skb);
 
        ihl = skb->data - skb_network_header(skb);
@@ -185,13 +184,12 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
                        goto out;
                }
        }
-       ((struct iphdr*)work_buf)->protocol = ah->nexthdr;
        skb->network_header += ah_hlen;
        memcpy(skb_network_header(skb), work_buf, ihl);
        skb->transport_header = skb->network_header;
        __skb_pull(skb, ah_hlen + ihl);
 
-       return 0;
+       return nexthdr;
 
 out:
        return err;
@@ -266,7 +264,8 @@ static int ah_init_state(struct xfrm_state *x)
        if (!ahp->work_icv)
                goto error;
 
-       x->props.header_len = XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_trunc_len);
+       x->props.header_len = XFRM_ALIGN8(sizeof(struct ip_auth_hdr) +
+                                         ahp->icv_trunc_len);
        if (x->props.mode == XFRM_MODE_TUNNEL)
                x->props.header_len += sizeof(struct iphdr);
        x->data = ahp;