From: "Toke Høiland-Jørgensen" <toke@redhat•com>
To: Gilad Naaman <gnaaman@drivenets•com>,
davem@davemloft•net, yoshfuji@linux-ipv6•org, dsahern@kernel•org,
kuba@kernel•org
Cc: netdev@vger•kernel.org
Subject: Re: [PATCH] net: Set true network header for ECN decapsulation
Date: Thu, 22 Jul 2021 19:21:30 +0200 [thread overview]
Message-ID: <87v9526z8l.fsf@toke.dk> (raw)
In-Reply-To: <20210722170128.223387-1-gnaaman@drivenets.com>
Gilad Naaman <gnaaman@drivenets•com> writes:
> In cases where the header straight after the tunnel header was
> another ethernet header (TEB), instead of the network header,
> the ECN decapsulation code would treat the ethernet header as if
> it was an IP header, resulting in mishandling and possible
> wrong drops or corruption of the IP header.
>
> In this case, ECT(1) is sent, so IP_ECN_decapsulate tries to copy it to the
> inner IPv4 header, and correct its checksum.
>
> The offset of the ECT bits in an IPv4 header corresponds to the
> lower 2 bits of the second octet of the destination MAC address
> in the ethernet header.
> The IPv4 checksum corresponds to end of the source address.
>
> In order to reproduce:
>
> $ ip netns add A
> $ ip netns add B
> $ ip -n A link add _v0 type veth peer name _v1 netns B
> $ ip -n A link set _v0 up
> $ ip -n A addr add dev _v0 10.254.3.1/24
> $ ip -n A route add default dev _v0 scope global
> $ ip -n B link set _v1 up
> $ ip -n B addr add dev _v1 10.254.1.6/24
> $ ip -n B route add default dev _v1 scope global
> $ ip -n B link add gre1 type gretap local 10.254.1.6 remote 10.254.3.1 key 0x49000000
> $ ip -n B link set gre1 up
>
> # Now send an IPv4/GRE/Eth/IPv4 frame where the outer header has ECT(1),
> # and the inner header has no ECT bits set:
>
> $ cat send_pkt.py
> #!/usr/bin/env python3
> from scapy.all import *
>
> pkt = IP(b'E\x01\x00\xa7\x00\x00\x00\x00@/`%\n\xfe\x03\x01\n\xfe\x01\x06 \x00eXI\x00'
> b'\x00\x00\x18\xbe\x92\xa0\xee&\x18\xb0\x92\xa0l&\x08\x00E\x00\x00}\x8b\x85'
> b'@\x00\x01\x01\xe4\xf2\x82\x82\x82\x01\x82\x82\x82\x02\x08\x00d\x11\xa6\xeb'
> b'3\x1e\x1e\\xf3\\xf7`\x00\x00\x00\x00ZN\x00\x00\x00\x00\x00\x00\x10\x11\x12'
> b'\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234'
> b'56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ')
>
> send(pkt)
> $ sudo ip netns exec B tcpdump -neqlllvi gre1 icmp & ; sleep 1
> $ sudo ip netns exec A python3 send_pkt.py
>
> In the original packet, the source/destinatio MAC addresses are
> dst=18:be:92:a0:ee:26 src=18:b0:92:a0:6c:26
>
> In the received packet, they are
> dst=18:bd:92:a0:ee:26 src=18:b0:92:a0:6c:27
>
> Thanks to Lahav Schlesinger <lschlesinger@drivenets•com> and Isaac Garzon <isaac@speed•io>
> for helping me pinpoint the origin.
Oops! Thank you for the fix :)
Acked-by: Toke Høiland-Jørgensen <toke@redhat•com>
next prev parent reply other threads:[~2021-07-22 17:21 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-22 17:01 [PATCH] net: Set true network header for ECN decapsulation Gilad Naaman
2021-07-22 17:21 ` Toke Høiland-Jørgensen [this message]
2021-07-23 15:50 ` patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87v9526z8l.fsf@toke.dk \
--to=toke@redhat$(echo .)com \
--cc=davem@davemloft$(echo .)net \
--cc=dsahern@kernel$(echo .)org \
--cc=gnaaman@drivenets$(echo .)com \
--cc=kuba@kernel$(echo .)org \
--cc=netdev@vger$(echo .)kernel.org \
--cc=yoshfuji@linux-ipv6$(echo .)org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox