[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>
This commit is contained in:
parent
c4541b41c0
commit
33b5ecb8f6
|
@ -1058,7 +1058,7 @@ static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)
|
|||
extern int xfrm4_output(struct sk_buff *skb);
|
||||
extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family);
|
||||
extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family);
|
||||
extern int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi);
|
||||
extern int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi);
|
||||
extern int xfrm6_rcv(struct sk_buff *skb);
|
||||
extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
|
||||
xfrm_address_t *saddr, u8 proto);
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
#include <net/ipv6.h>
|
||||
#include <net/xfrm.h>
|
||||
|
||||
int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
|
||||
int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)
|
||||
{
|
||||
int err;
|
||||
__be32 seq;
|
||||
|
@ -24,11 +24,9 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
|
|||
struct xfrm_state *x;
|
||||
int xfrm_nr = 0;
|
||||
int decaps = 0;
|
||||
int nexthdr;
|
||||
unsigned int nhoff;
|
||||
|
||||
nhoff = IP6CB(skb)->nhoff;
|
||||
nexthdr = skb_network_header(skb)[nhoff];
|
||||
|
||||
seq = 0;
|
||||
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)
|
|||
goto drop;
|
||||
|
||||
x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, spi,
|
||||
nexthdr != IPPROTO_IPIP ? nexthdr : IPPROTO_IPV6, AF_INET6);
|
||||
nexthdr, AF_INET6);
|
||||
if (x == NULL)
|
||||
goto drop;
|
||||
spin_lock(&x->lock);
|
||||
|
@ -135,7 +133,8 @@ EXPORT_SYMBOL(xfrm6_rcv_spi);
|
|||
|
||||
int xfrm6_rcv(struct sk_buff *skb)
|
||||
{
|
||||
return xfrm6_rcv_spi(skb, 0);
|
||||
return xfrm6_rcv_spi(skb, skb_network_header(skb)[IP6CB(skb)->nhoff],
|
||||
0);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(xfrm6_rcv);
|
||||
|
|
|
@ -257,7 +257,7 @@ static int xfrm6_tunnel_rcv(struct sk_buff *skb)
|
|||
__be32 spi;
|
||||
|
||||
spi = xfrm6_tunnel_spi_lookup((xfrm_address_t *)&iph->saddr);
|
||||
return xfrm6_rcv_spi(skb, spi) > 0 ? : 0;
|
||||
return xfrm6_rcv_spi(skb, IPPROTO_IPV6, spi) > 0 ? : 0;
|
||||
}
|
||||
|
||||
static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
||||
|
|
Loading…
Reference in New Issue
Block a user