mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git
/klassert/ipsec-next Steffen Klassert says: ==================== pull request (net-next): ipsec-next 2021-06-28 1) Remove an unneeded error assignment in esp4_gro_receive(). From Yang Li. 2) Add a new byseq state hashtable to find acquire states faster. From Sabrina Dubroca. 3) Remove some unnecessary variables in pfkey_create(). From zuoqilin. 4) Remove the unused description from xfrm_type struct. From Florian Westphal. 5) Fix a spelling mistake in the comment of xfrm_state_ok(). From gushengxian. 6) Replace hdr_off indirections by a small helper function. From Florian Westphal. 7) Remove xfrm4_output_finish and xfrm6_output_finish declarations, they are not used anymore.From Antony Antony. 8) Remove xfrm replay indirections. From Florian Westphal. Please pull or let me know if there are problems. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
1b077ce1c5
21 changed files with 264 additions and 234 deletions
|
@ -77,6 +77,83 @@ static int xfrm4_transport_output(struct xfrm_state *x, struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6_MIP6)
|
||||
static int mip6_rthdr_offset(struct sk_buff *skb, u8 **nexthdr, int type)
|
||||
{
|
||||
const unsigned char *nh = skb_network_header(skb);
|
||||
unsigned int offset = sizeof(struct ipv6hdr);
|
||||
unsigned int packet_len;
|
||||
int found_rhdr = 0;
|
||||
|
||||
packet_len = skb_tail_pointer(skb) - nh;
|
||||
*nexthdr = &ipv6_hdr(skb)->nexthdr;
|
||||
|
||||
while (offset <= packet_len) {
|
||||
struct ipv6_opt_hdr *exthdr;
|
||||
|
||||
switch (**nexthdr) {
|
||||
case NEXTHDR_HOP:
|
||||
break;
|
||||
case NEXTHDR_ROUTING:
|
||||
if (type == IPPROTO_ROUTING && 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:
|
||||
/* HAO MUST NOT appear more than once.
|
||||
* XXX: It is better to try to find by the end of
|
||||
* XXX: packet if HAO exists.
|
||||
*/
|
||||
if (ipv6_find_tlv(skb, offset, IPV6_TLV_HAO) >= 0) {
|
||||
net_dbg_ratelimited("mip6: hao exists already, override\n");
|
||||
return offset;
|
||||
}
|
||||
|
||||
if (found_rhdr)
|
||||
return offset;
|
||||
|
||||
break;
|
||||
default:
|
||||
return offset;
|
||||
}
|
||||
|
||||
if (offset + sizeof(struct ipv6_opt_hdr) > packet_len)
|
||||
return -EINVAL;
|
||||
|
||||
exthdr = (struct ipv6_opt_hdr *)(skb_network_header(skb) +
|
||||
offset);
|
||||
offset += ipv6_optlen(exthdr);
|
||||
if (offset > IPV6_MAXPLEN)
|
||||
return -EINVAL;
|
||||
*nexthdr = &exthdr->nexthdr;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
static int xfrm6_hdr_offset(struct xfrm_state *x, struct sk_buff *skb, u8 **prevhdr)
|
||||
{
|
||||
switch (x->type->proto) {
|
||||
#if IS_ENABLED(CONFIG_IPV6_MIP6)
|
||||
case IPPROTO_DSTOPTS:
|
||||
case IPPROTO_ROUTING:
|
||||
return mip6_rthdr_offset(skb, prevhdr, x->type->proto);
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ip6_find_1stfragopt(skb, prevhdr);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Add encapsulation header.
|
||||
*
|
||||
* The IP header and mutable extension headers will be moved forward to make
|
||||
|
@ -92,7 +169,7 @@ static int xfrm6_transport_output(struct xfrm_state *x, struct sk_buff *skb)
|
|||
iph = ipv6_hdr(skb);
|
||||
skb_set_inner_transport_header(skb, skb_transport_offset(skb));
|
||||
|
||||
hdr_len = x->type->hdr_offset(x, skb, &prevhdr);
|
||||
hdr_len = xfrm6_hdr_offset(x, skb, &prevhdr);
|
||||
if (hdr_len < 0)
|
||||
return hdr_len;
|
||||
skb_set_mac_header(skb,
|
||||
|
@ -122,7 +199,7 @@ static int xfrm6_ro_output(struct xfrm_state *x, struct sk_buff *skb)
|
|||
|
||||
iph = ipv6_hdr(skb);
|
||||
|
||||
hdr_len = x->type->hdr_offset(x, skb, &prevhdr);
|
||||
hdr_len = xfrm6_hdr_offset(x, skb, &prevhdr);
|
||||
if (hdr_len < 0)
|
||||
return hdr_len;
|
||||
skb_set_mac_header(skb,
|
||||
|
@ -448,7 +525,7 @@ static int xfrm_output_one(struct sk_buff *skb, int err)
|
|||
goto error;
|
||||
}
|
||||
|
||||
err = x->repl->overflow(x, skb);
|
||||
err = xfrm_replay_overflow(x, skb);
|
||||
if (err) {
|
||||
XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATESEQERROR);
|
||||
goto error;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue