Message ID | 20250103012303.746521-1-antonio.pastor@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 1e9b0e1c550c42c13c111d1a31e822057232abc4 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,v2] net: 802: LLC+SNAP OID:PID lookup on start of skb data | expand |
On Fri, Jan 3, 2025 at 2:23 AM Antonio Pastor <antonio.pastor@gmail.com> wrote: > > 802.2+LLC+SNAP frames received by napi_complete_done() with GRO and DSA > have skb->transport_header set two bytes short, or pointing 2 bytes > before network_header & skb->data. This was an issue as snap_rcv() > expected offset to point to SNAP header (OID:PID), causing packet to > be dropped. > > A fix at llc_fixup_skb() (a024e377efed) resets transport_header for any > LLC consumers that may care about it, and stops SNAP packets from being > dropped, but doesn't fix the problem which is that LLC and SNAP should > not use transport_header offset. > > Ths patch eliminates the use of transport_header offset for SNAP lookup > of OID:PID so that SNAP does not rely on the offset at all. > The offset is reset after pull for any SNAP packet consumers that may > (but shouldn't) use it. > > Fixes: fda55eca5a33 ("net: introduce skb_transport_header_was_set()") > Signed-off-by: Antonio Pastor <antonio.pastor@gmail.com> Reviewed-by: Eric Dumazet <edumazet@google.com>
Hello: This patch was applied to netdev/net.git (main) by Jakub Kicinski <kuba@kernel.org>: On Thu, 2 Jan 2025 20:23:00 -0500 you wrote: > 802.2+LLC+SNAP frames received by napi_complete_done() with GRO and DSA > have skb->transport_header set two bytes short, or pointing 2 bytes > before network_header & skb->data. This was an issue as snap_rcv() > expected offset to point to SNAP header (OID:PID), causing packet to > be dropped. > > A fix at llc_fixup_skb() (a024e377efed) resets transport_header for any > LLC consumers that may care about it, and stops SNAP packets from being > dropped, but doesn't fix the problem which is that LLC and SNAP should > not use transport_header offset. > > [...] Here is the summary with links: - [net,v2] net: 802: LLC+SNAP OID:PID lookup on start of skb data https://git.kernel.org/netdev/net/c/1e9b0e1c550c You are awesome, thank you!
diff --git a/net/802/psnap.c b/net/802/psnap.c index fca9d454905f..389df460c8c4 100644 --- a/net/802/psnap.c +++ b/net/802/psnap.c @@ -55,11 +55,11 @@ static int snap_rcv(struct sk_buff *skb, struct net_device *dev, goto drop; rcu_read_lock(); - proto = find_snap_client(skb_transport_header(skb)); + proto = find_snap_client(skb->data); if (proto) { /* Pass the frame on. */ - skb->transport_header += 5; skb_pull_rcsum(skb, 5); + skb_reset_transport_header(skb); rc = proto->rcvfunc(skb, dev, &snap_packet_type, orig_dev); } rcu_read_unlock();
802.2+LLC+SNAP frames received by napi_complete_done() with GRO and DSA have skb->transport_header set two bytes short, or pointing 2 bytes before network_header & skb->data. This was an issue as snap_rcv() expected offset to point to SNAP header (OID:PID), causing packet to be dropped. A fix at llc_fixup_skb() (a024e377efed) resets transport_header for any LLC consumers that may care about it, and stops SNAP packets from being dropped, but doesn't fix the problem which is that LLC and SNAP should not use transport_header offset. Ths patch eliminates the use of transport_header offset for SNAP lookup of OID:PID so that SNAP does not rely on the offset at all. The offset is reset after pull for any SNAP packet consumers that may (but shouldn't) use it. Fixes: fda55eca5a33 ("net: introduce skb_transport_header_was_set()") Signed-off-by: Antonio Pastor <antonio.pastor@gmail.com> --- net/802/psnap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)