提交 c5027c9a 编写于 作者: P Patrick McHardy 提交者: David S. Miller

[XFRM]: beet: fix IP option encapsulation

Beet mode calculates an incorrect value for the transport header location
when IP options are present, resulting in encapsulation errors.

The correct location is 4 or 8 bytes before the end of the original IP
header, depending on whether the pseudo header is padded.
Signed-off-by: NPatrick McHardy <kaber@trash.net>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 4c4d51a7
...@@ -42,10 +42,9 @@ static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb) ...@@ -42,10 +42,9 @@ static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb)
skb->nh.raw = skb_push(skb, x->props.header_len + hdrlen); skb->nh.raw = skb_push(skb, x->props.header_len + hdrlen);
top_iph = skb->nh.iph; top_iph = skb->nh.iph;
hdrlen = iph->ihl * 4 - optlen; skb->h.raw += sizeof(*iph) - hdrlen;
skb->h.raw += hdrlen;
memmove(top_iph, iph, hdrlen); memmove(top_iph, iph, sizeof(*iph));
if (unlikely(optlen)) { if (unlikely(optlen)) {
struct ip_beet_phdr *ph; struct ip_beet_phdr *ph;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册