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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (x->id.spi) {
|
||||
|
@ -413,7 +366,6 @@ static const struct xfrm_type mip6_rthdr_type = {
|
|||
.destructor = mip6_rthdr_destroy,
|
||||
.input = mip6_rthdr_input,
|
||||
.output = mip6_rthdr_output,
|
||||
.hdr_offset = mip6_rthdr_offset,
|
||||
};
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
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)
|
||||
case IPPROTO_DSTOPTS:
|
||||
return mip6_destopt_offset(x, skb, prevhdr);
|
||||
case IPPROTO_ROUTING:
|
||||
return mip6_rthdr_offset(x, skb, prevhdr);
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue