diff options
| author | Herbert Xu <herbert@gondor.apana.org.au> | 2007-10-18 00:29:25 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2007-10-18 00:29:25 -0400 |
| commit | 33b5ecb8f64706d1ed472dcb44162ab3a7345724 (patch) | |
| tree | 065d9cc0592bc08db34a562ff8753279cf52509c | |
| parent | c4541b41c0e4b75b11125fed16db642fc03cb31c (diff) | |
[IPSEC]: Get nexthdr from caller in xfrm6_rcv_spi
Currently xfrm6_rcv_spi gets the nexthdr value itself from the packet.
This means that we need to fix up the value in case we have a 4-on-6
tunnel. Moving this logic into the caller simplifies things and allows
us to merge the code with IPv4.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | include/net/xfrm.h | 2 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_input.c | 9 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_tunnel.c | 2 |
3 files changed, 6 insertions, 7 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 680739f69003..d8974ca19032 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
| @@ -1058,7 +1058,7 @@ static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi) | |||
| 1058 | extern int xfrm4_output(struct sk_buff *skb); | 1058 | extern int xfrm4_output(struct sk_buff *skb); |
| 1059 | extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family); | 1059 | extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family); |
| 1060 | extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family); | 1060 | extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family); |
| 1061 | extern int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi); | 1061 | extern int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi); |
| 1062 | extern int xfrm6_rcv(struct sk_buff *skb); | 1062 | extern int xfrm6_rcv(struct sk_buff *skb); |
| 1063 | extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, | 1063 | extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, |
| 1064 | xfrm_address_t *saddr, u8 proto); | 1064 | xfrm_address_t *saddr, u8 proto); |
diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c index 02f69e544f6f..596a730294ec 100644 --- a/net/ipv6/xfrm6_input.c +++ b/net/ipv6/xfrm6_input.c | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | #include <net/ipv6.h> | 16 | #include <net/ipv6.h> |
| 17 | #include <net/xfrm.h> | 17 | #include <net/xfrm.h> |
| 18 | 18 | ||
| 19 | int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi) | 19 | int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi) |
| 20 | { | 20 | { |
| 21 | int err; | 21 | int err; |
| 22 | __be32 seq; | 22 | __be32 seq; |
| @@ -24,11 +24,9 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi) | |||
| 24 | struct xfrm_state *x; | 24 | struct xfrm_state *x; |
| 25 | int xfrm_nr = 0; | 25 | int xfrm_nr = 0; |
| 26 | int decaps = 0; | 26 | int decaps = 0; |
| 27 | int nexthdr; | ||
| 28 | unsigned int nhoff; | 27 | unsigned int nhoff; |
| 29 | 28 | ||
| 30 | nhoff = IP6CB(skb)->nhoff; | 29 | nhoff = IP6CB(skb)->nhoff; |
| 31 | nexthdr = skb_network_header(skb)[nhoff]; | ||
| 32 | 30 | ||
| 33 | seq = 0; | 31 | seq = 0; |
| 34 | if (!spi && (err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0) | 32 | if (!spi && (err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0) |
| @@ -41,7 +39,7 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi) | |||
| 41 | goto drop; | 39 | goto drop; |
| 42 | 40 | ||
| 43 | x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, spi, | 41 | x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, spi, |
| 44 | nexthdr != IPPROTO_IPIP ? nexthdr : IPPROTO_IPV6, AF_INET6); | 42 | nexthdr, AF_INET6); |
| 45 | if (x == NULL) | 43 | if (x == NULL) |
| 46 | goto drop; | 44 | goto drop; |
| 47 | spin_lock(&x->lock); | 45 | spin_lock(&x->lock); |
| @@ -135,7 +133,8 @@ EXPORT_SYMBOL(xfrm6_rcv_spi); | |||
| 135 | 133 | ||
| 136 | int xfrm6_rcv(struct sk_buff *skb) | 134 | int xfrm6_rcv(struct sk_buff *skb) |
| 137 | { | 135 | { |
| 138 | return xfrm6_rcv_spi(skb, 0); | 136 | return xfrm6_rcv_spi(skb, skb_network_header(skb)[IP6CB(skb)->nhoff], |
| 137 | 0); | ||
| 139 | } | 138 | } |
| 140 | 139 | ||
| 141 | EXPORT_SYMBOL(xfrm6_rcv); | 140 | EXPORT_SYMBOL(xfrm6_rcv); |
diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c index 6c67ac197ee0..fae90ff31087 100644 --- a/net/ipv6/xfrm6_tunnel.c +++ b/net/ipv6/xfrm6_tunnel.c | |||
| @@ -257,7 +257,7 @@ static int xfrm6_tunnel_rcv(struct sk_buff *skb) | |||
| 257 | __be32 spi; | 257 | __be32 spi; |
| 258 | 258 | ||
| 259 | spi = xfrm6_tunnel_spi_lookup((xfrm_address_t *)&iph->saddr); | 259 | spi = xfrm6_tunnel_spi_lookup((xfrm_address_t *)&iph->saddr); |
| 260 | return xfrm6_rcv_spi(skb, spi) > 0 ? : 0; | 260 | return xfrm6_rcv_spi(skb, IPPROTO_IPV6, spi) > 0 ? : 0; |
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | 263 | static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt, |
