[IPSEC]: Use IPv6 calling convention as the convention for x->mode->output
[deliverable/linux.git] / net / ipv4 / xfrm4_mode_beet.c
index a73e710740c22396c4bff28337c53ea6b8624565..7226c6486c01487aa821fb6a9d1ee6b35c46b7d7 100644 (file)
  * The following fields in it shall be filled in by x->type->output:
  *      tot_len
  *      check
- *
- * On exit, skb->h will be set to the start of the payload to be processed
- * by x->type->output and skb->nh will be set to the top IP header.
  */
 static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb)
 {
+       struct ip_beet_phdr *ph;
        struct iphdr *iph, *top_iph;
        int hdrlen, optlen;
 
        iph = ip_hdr(skb);
-       skb->transport_header = skb->network_header;
 
        hdrlen = 0;
        optlen = iph->ihl * 4 - sizeof(*iph);
        if (unlikely(optlen))
                hdrlen += IPV4_BEET_PHMAXLEN - (optlen & 4);
 
-       skb_push(skb, x->props.header_len - IPV4_BEET_PHMAXLEN + hdrlen);
-       skb_reset_network_header(skb);
-       top_iph = ip_hdr(skb);
-       skb->transport_header += sizeof(*iph) - hdrlen;
+       skb_set_network_header(skb, IPV4_BEET_PHMAXLEN - x->props.header_len -
+                                   hdrlen);
+       skb->mac_header = skb->network_header +
+                         offsetof(struct iphdr, protocol);
+       skb->transport_header = skb->network_header + sizeof(*iph);
+
+       ph = (struct ip_beet_phdr *)__skb_pull(skb, sizeof(*iph) - hdrlen);
 
+       top_iph = ip_hdr(skb);
        memmove(top_iph, iph, sizeof(*iph));
        if (unlikely(optlen)) {
-               struct ip_beet_phdr *ph;
-
                BUG_ON(optlen < 0);
 
-               ph = (struct ip_beet_phdr *)skb_transport_header(skb);
                ph->padlen = 4 - (optlen & 4);
                ph->hdrlen = optlen / 8;
                ph->nexthdr = top_iph->protocol;
This page took 0.028802 seconds and 5 git commands to generate.