xfrm: ipv6: move mip6_rthdr_offset into xfrm core
Place the call into the xfrm core. After this all remaining users set the hdr_offset function pointer to the same function which opens the possiblity to remove the indirection. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
parent
37b9e7eb55
commit
848b18fb7f
|
@ -333,53 +333,6 @@ static int mip6_rthdr_output(struct xfrm_state *x, struct sk_buff *skb)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mip6_rthdr_offset(struct xfrm_state *x, struct sk_buff *skb,
|
|
||||||
u8 **nexthdr)
|
|
||||||
{
|
|
||||||
u16 offset = sizeof(struct ipv6hdr);
|
|
||||||
struct ipv6_opt_hdr *exthdr =
|
|
||||||
(struct ipv6_opt_hdr *)(ipv6_hdr(skb) + 1);
|
|
||||||
const unsigned char *nh = skb_network_header(skb);
|
|
||||||
unsigned int packet_len = skb_tail_pointer(skb) -
|
|
||||||
skb_network_header(skb);
|
|
||||||
int found_rhdr = 0;
|
|
||||||
|
|
||||||
*nexthdr = &ipv6_hdr(skb)->nexthdr;
|
|
||||||
|
|
||||||
while (offset + 1 <= packet_len) {
|
|
||||||
|
|
||||||
switch (**nexthdr) {
|
|
||||||
case NEXTHDR_HOP:
|
|
||||||
break;
|
|
||||||
case NEXTHDR_ROUTING:
|
|
||||||
if (offset + 3 <= packet_len) {
|
|
||||||
struct ipv6_rt_hdr *rt;
|
|
||||||
rt = (struct ipv6_rt_hdr *)(nh + offset);
|
|
||||||
if (rt->type != 0)
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
found_rhdr = 1;
|
|
||||||
break;
|
|
||||||
case NEXTHDR_DEST:
|
|
||||||
if (ipv6_find_tlv(skb, offset, IPV6_TLV_HAO) >= 0)
|
|
||||||
return offset;
|
|
||||||
|
|
||||||
if (found_rhdr)
|
|
||||||
return offset;
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
offset += ipv6_optlen(exthdr);
|
|
||||||
*nexthdr = &exthdr->nexthdr;
|
|
||||||
exthdr = (struct ipv6_opt_hdr *)(nh + offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int mip6_rthdr_init_state(struct xfrm_state *x)
|
static int mip6_rthdr_init_state(struct xfrm_state *x)
|
||||||
{
|
{
|
||||||
if (x->id.spi) {
|
if (x->id.spi) {
|
||||||
|
@ -413,7 +366,6 @@ static const struct xfrm_type mip6_rthdr_type = {
|
||||||
.destructor = mip6_rthdr_destroy,
|
.destructor = mip6_rthdr_destroy,
|
||||||
.input = mip6_rthdr_input,
|
.input = mip6_rthdr_input,
|
||||||
.output = mip6_rthdr_output,
|
.output = mip6_rthdr_output,
|
||||||
.hdr_offset = mip6_rthdr_offset,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init mip6_init(void)
|
static int __init mip6_init(void)
|
||||||
|
|
|
@ -123,6 +123,53 @@ static int mip6_destopt_offset(struct xfrm_state *x, struct sk_buff *skb,
|
||||||
|
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mip6_rthdr_offset(struct xfrm_state *x, struct sk_buff *skb,
|
||||||
|
u8 **nexthdr)
|
||||||
|
{
|
||||||
|
u16 offset = sizeof(struct ipv6hdr);
|
||||||
|
struct ipv6_opt_hdr *exthdr =
|
||||||
|
(struct ipv6_opt_hdr *)(ipv6_hdr(skb) + 1);
|
||||||
|
const unsigned char *nh = skb_network_header(skb);
|
||||||
|
unsigned int packet_len = skb_tail_pointer(skb) -
|
||||||
|
skb_network_header(skb);
|
||||||
|
int found_rhdr = 0;
|
||||||
|
|
||||||
|
*nexthdr = &ipv6_hdr(skb)->nexthdr;
|
||||||
|
|
||||||
|
while (offset + 1 <= packet_len) {
|
||||||
|
switch (**nexthdr) {
|
||||||
|
case NEXTHDR_HOP:
|
||||||
|
break;
|
||||||
|
case NEXTHDR_ROUTING:
|
||||||
|
if (offset + 3 <= packet_len) {
|
||||||
|
struct ipv6_rt_hdr *rt;
|
||||||
|
|
||||||
|
rt = (struct ipv6_rt_hdr *)(nh + offset);
|
||||||
|
if (rt->type != 0)
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
found_rhdr = 1;
|
||||||
|
break;
|
||||||
|
case NEXTHDR_DEST:
|
||||||
|
if (ipv6_find_tlv(skb, offset, IPV6_TLV_HAO) >= 0)
|
||||||
|
return offset;
|
||||||
|
|
||||||
|
if (found_rhdr)
|
||||||
|
return offset;
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += ipv6_optlen(exthdr);
|
||||||
|
*nexthdr = &exthdr->nexthdr;
|
||||||
|
exthdr = (struct ipv6_opt_hdr *)(nh + offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int xfrm6_hdr_offset(struct xfrm_state *x, struct sk_buff *skb, u8 **prevhdr)
|
static int xfrm6_hdr_offset(struct xfrm_state *x, struct sk_buff *skb, u8 **prevhdr)
|
||||||
|
@ -131,6 +178,8 @@ static int xfrm6_hdr_offset(struct xfrm_state *x, struct sk_buff *skb, u8 **prev
|
||||||
#if IS_ENABLED(CONFIG_IPV6_MIP6)
|
#if IS_ENABLED(CONFIG_IPV6_MIP6)
|
||||||
case IPPROTO_DSTOPTS:
|
case IPPROTO_DSTOPTS:
|
||||||
return mip6_destopt_offset(x, skb, prevhdr);
|
return mip6_destopt_offset(x, skb, prevhdr);
|
||||||
|
case IPPROTO_ROUTING:
|
||||||
|
return mip6_rthdr_offset(x, skb, prevhdr);
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue