diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2007-10-10 18:44:44 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:55:54 -0400 |
commit | 37fedd3aab6517daec628764c5d66dd8761fbe5f (patch) | |
tree | 12227aec3944168bff04173dccd580240f4496aa /net/ipv4/xfrm4_mode_beet.c | |
parent | 7b277b1a5fb147cb828e5d8b9780cee60f31a9bf (diff) |
[IPSEC]: Use IPv6 calling convention as the convention for x->mode->output
The IPv6 calling convention for x->mode->output is more general and could
help an eventual protocol-generic x->type->output implementation. This
patch adopts it for IPv4 as well and modifies the IPv4 type output functions
accordingly.
It also rewrites the IPv6 mac/transport header calculation to be based off
the network header where practical.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/xfrm4_mode_beet.c')
-rw-r--r-- | net/ipv4/xfrm4_mode_beet.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/net/ipv4/xfrm4_mode_beet.c b/net/ipv4/xfrm4_mode_beet.c index 77888f596737..7226c6486c01 100644 --- a/net/ipv4/xfrm4_mode_beet.c +++ b/net/ipv4/xfrm4_mode_beet.c | |||
@@ -23,17 +23,14 @@ | |||
23 | * The following fields in it shall be filled in by x->type->output: | 23 | * The following fields in it shall be filled in by x->type->output: |
24 | * tot_len | 24 | * tot_len |
25 | * check | 25 | * check |
26 | * | ||
27 | * On exit, skb->h will be set to the start of the payload to be processed | ||
28 | * by x->type->output and skb->nh will be set to the top IP header. | ||
29 | */ | 26 | */ |
30 | static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb) | 27 | static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb) |
31 | { | 28 | { |
29 | struct ip_beet_phdr *ph; | ||
32 | struct iphdr *iph, *top_iph; | 30 | struct iphdr *iph, *top_iph; |
33 | int hdrlen, optlen; | 31 | int hdrlen, optlen; |
34 | 32 | ||
35 | iph = ip_hdr(skb); | 33 | iph = ip_hdr(skb); |
36 | skb->transport_header = skb->network_header; | ||
37 | 34 | ||
38 | hdrlen = 0; | 35 | hdrlen = 0; |
39 | optlen = iph->ihl * 4 - sizeof(*iph); | 36 | optlen = iph->ihl * 4 - sizeof(*iph); |
@@ -42,17 +39,17 @@ static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb) | |||
42 | 39 | ||
43 | skb_set_network_header(skb, IPV4_BEET_PHMAXLEN - x->props.header_len - | 40 | skb_set_network_header(skb, IPV4_BEET_PHMAXLEN - x->props.header_len - |
44 | hdrlen); | 41 | hdrlen); |
45 | top_iph = ip_hdr(skb); | 42 | skb->mac_header = skb->network_header + |
46 | skb->transport_header += sizeof(*iph) - hdrlen; | 43 | offsetof(struct iphdr, protocol); |
47 | __skb_pull(skb, sizeof(*iph) - hdrlen); | 44 | skb->transport_header = skb->network_header + sizeof(*iph); |
45 | |||
46 | ph = (struct ip_beet_phdr *)__skb_pull(skb, sizeof(*iph) - hdrlen); | ||
48 | 47 | ||
48 | top_iph = ip_hdr(skb); | ||
49 | memmove(top_iph, iph, sizeof(*iph)); | 49 | memmove(top_iph, iph, sizeof(*iph)); |
50 | if (unlikely(optlen)) { | 50 | if (unlikely(optlen)) { |
51 | struct ip_beet_phdr *ph; | ||
52 | |||
53 | BUG_ON(optlen < 0); | 51 | BUG_ON(optlen < 0); |
54 | 52 | ||
55 | ph = (struct ip_beet_phdr *)skb_transport_header(skb); | ||
56 | ph->padlen = 4 - (optlen & 4); | 53 | ph->padlen = 4 - (optlen & 4); |
57 | ph->hdrlen = optlen / 8; | 54 | ph->hdrlen = optlen / 8; |
58 | ph->nexthdr = top_iph->protocol; | 55 | ph->nexthdr = top_iph->protocol; |