aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/xfrm.h3
-rw-r--r--net/ipv6/ah6.c3
-rw-r--r--net/ipv6/esp6.c3
-rw-r--r--net/ipv6/ipcomp6.c1
-rw-r--r--net/ipv6/ipv6_syms.c1
-rw-r--r--net/ipv6/xfrm6_mode_transport.c2
-rw-r--r--net/ipv6/xfrm6_output.c6
7 files changed, 16 insertions, 3 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index d9c40e713184..eed48f832ce1 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -265,6 +265,7 @@ struct xfrm_type
265 void (*destructor)(struct xfrm_state *); 265 void (*destructor)(struct xfrm_state *);
266 int (*input)(struct xfrm_state *, struct sk_buff *skb); 266 int (*input)(struct xfrm_state *, struct sk_buff *skb);
267 int (*output)(struct xfrm_state *, struct sk_buff *pskb); 267 int (*output)(struct xfrm_state *, struct sk_buff *pskb);
268 int (*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **);
268 /* Estimate maximal size of result of transformation of a dgram */ 269 /* Estimate maximal size of result of transformation of a dgram */
269 u32 (*get_max_size)(struct xfrm_state *, int size); 270 u32 (*get_max_size)(struct xfrm_state *, int size);
270}; 271};
@@ -960,6 +961,8 @@ extern u32 xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr);
960extern void xfrm6_tunnel_free_spi(xfrm_address_t *saddr); 961extern void xfrm6_tunnel_free_spi(xfrm_address_t *saddr);
961extern u32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr); 962extern u32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr);
962extern int xfrm6_output(struct sk_buff *skb); 963extern int xfrm6_output(struct sk_buff *skb);
964extern int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
965 u8 **prevhdr);
963 966
964#ifdef CONFIG_XFRM 967#ifdef CONFIG_XFRM
965extern int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type); 968extern int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type);
diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c
index 60954fc7eb36..6c0aa51319a5 100644
--- a/net/ipv6/ah6.c
+++ b/net/ipv6/ah6.c
@@ -435,7 +435,8 @@ static struct xfrm_type ah6_type =
435 .init_state = ah6_init_state, 435 .init_state = ah6_init_state,
436 .destructor = ah6_destroy, 436 .destructor = ah6_destroy,
437 .input = ah6_input, 437 .input = ah6_input,
438 .output = ah6_output 438 .output = ah6_output,
439 .hdr_offset = xfrm6_find_1stfragopt,
439}; 440};
440 441
441static struct inet6_protocol ah6_protocol = { 442static struct inet6_protocol ah6_protocol = {
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c
index 2b8e52e1d0ab..ae50b9511151 100644
--- a/net/ipv6/esp6.c
+++ b/net/ipv6/esp6.c
@@ -379,7 +379,8 @@ static struct xfrm_type esp6_type =
379 .destructor = esp6_destroy, 379 .destructor = esp6_destroy,
380 .get_max_size = esp6_get_max_size, 380 .get_max_size = esp6_get_max_size,
381 .input = esp6_input, 381 .input = esp6_input,
382 .output = esp6_output 382 .output = esp6_output,
383 .hdr_offset = xfrm6_find_1stfragopt,
383}; 384};
384 385
385static struct inet6_protocol esp6_protocol = { 386static struct inet6_protocol esp6_protocol = {
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c
index 19eba8d9f851..ad9c6e824e62 100644
--- a/net/ipv6/ipcomp6.c
+++ b/net/ipv6/ipcomp6.c
@@ -461,6 +461,7 @@ static struct xfrm_type ipcomp6_type =
461 .destructor = ipcomp6_destroy, 461 .destructor = ipcomp6_destroy,
462 .input = ipcomp6_input, 462 .input = ipcomp6_input,
463 .output = ipcomp6_output, 463 .output = ipcomp6_output,
464 .hdr_offset = xfrm6_find_1stfragopt,
464}; 465};
465 466
466static struct inet6_protocol ipcomp6_protocol = 467static struct inet6_protocol ipcomp6_protocol =
diff --git a/net/ipv6/ipv6_syms.c b/net/ipv6/ipv6_syms.c
index dd4d1ce77769..e1a741612888 100644
--- a/net/ipv6/ipv6_syms.c
+++ b/net/ipv6/ipv6_syms.c
@@ -31,6 +31,7 @@ EXPORT_SYMBOL(ipv6_chk_addr);
31EXPORT_SYMBOL(in6_dev_finish_destroy); 31EXPORT_SYMBOL(in6_dev_finish_destroy);
32#ifdef CONFIG_XFRM 32#ifdef CONFIG_XFRM
33EXPORT_SYMBOL(xfrm6_rcv); 33EXPORT_SYMBOL(xfrm6_rcv);
34EXPORT_SYMBOL(xfrm6_find_1stfragopt);
34#endif 35#endif
35EXPORT_SYMBOL(rt6_lookup); 36EXPORT_SYMBOL(rt6_lookup);
36EXPORT_SYMBOL(ipv6_push_nfrag_opts); 37EXPORT_SYMBOL(ipv6_push_nfrag_opts);
diff --git a/net/ipv6/xfrm6_mode_transport.c b/net/ipv6/xfrm6_mode_transport.c
index 711d713e36d8..a5dce216024d 100644
--- a/net/ipv6/xfrm6_mode_transport.c
+++ b/net/ipv6/xfrm6_mode_transport.c
@@ -35,7 +35,7 @@ static int xfrm6_transport_output(struct sk_buff *skb)
35 skb_push(skb, x->props.header_len); 35 skb_push(skb, x->props.header_len);
36 iph = skb->nh.ipv6h; 36 iph = skb->nh.ipv6h;
37 37
38 hdr_len = ip6_find_1stfragopt(skb, &prevhdr); 38 hdr_len = x->type->hdr_offset(x, skb, &prevhdr);
39 skb->nh.raw = prevhdr - x->props.header_len; 39 skb->nh.raw = prevhdr - x->props.header_len;
40 skb->h.raw = skb->data + hdr_len; 40 skb->h.raw = skb->data + hdr_len;
41 memmove(skb->data, iph, hdr_len); 41 memmove(skb->data, iph, hdr_len);
diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c
index 26f18869f77b..b4628fbf8ff5 100644
--- a/net/ipv6/xfrm6_output.c
+++ b/net/ipv6/xfrm6_output.c
@@ -17,6 +17,12 @@
17#include <net/ipv6.h> 17#include <net/ipv6.h>
18#include <net/xfrm.h> 18#include <net/xfrm.h>
19 19
20int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
21 u8 **prevhdr)
22{
23 return ip6_find_1stfragopt(skb, prevhdr);
24}
25
20static int xfrm6_tunnel_check_size(struct sk_buff *skb) 26static int xfrm6_tunnel_check_size(struct sk_buff *skb)
21{ 27{
22 int mtu, ret = 0; 28 int mtu, ret = 0;