gtp: parse extension headers before reading inner protocol
Subsystems (3)
PATCH v2 1/1 gtp: parse extension headers before reading inner protocol
GTPv1-U packets may carry a chain of extension headers before the inner IP packet. The receive path already parses and skips these extension headers, but it currently reads the inner protocol before doing so.
As a result, the first extension header byte is interpreted as the inner IP version. Packets with extension headers are then dropped before PDP lookup.
Parse the extension header chain before calling gtp_inner_proto(), so the inner protocol is read from the actual inner IP header.
---
Changes in v2:
- Add missing Fixes tag.
v1: https://lore.kernel.org/netdev/[email protected]/T/
--- drivers/net/gtp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/gtp.c +4 -4
@@ -826,6 +826,10 @@ static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb)if (!pskb_may_pull (skb, hdrlen))return -1 ; +if (gtp1->flags >P1_F_EXTHDR && +gtp_parse_exthdrs (skb, &hdrlen) <0 ) +return -1 ; +if (gtp_inner_proto (skb, hdrlen, &inner_proto) <0 ) {netdev_dbg (gtp->dev,"GTP packet does not encapsulate an IP packet\n" );return -1 ;
@@ -840,10 +844,6 @@ static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb)return 1 ; } -if (gtp1->flags >P1_F_EXTHDR && -gtp_parse_exthdrs (skb, &hdrlen) <0 ) -return -1 ; -return gtp_rx (pctx, skb, hdrlen, gtp->role, inner_proto); }
Signature · 1 line
2.34.1
Quoted 8 lines · Zhixing Chen
GTPv1-U packets may carry a chain of extension headers before the inner IP packet. The receive path already parses and skips these extension headers, but it currently reads the inner protocol before doing so.
As a result, the first extension header byte is interpreted as the inner IP version. Packets with extension headers are then dropped before PDP lookup.
Quoted 5 lines
Parse the extension header chain before calling
gtp_inner_proto(), so the inner protocol is read from the actual inner IP header.Fixes c75fc0b9e5be ("gtp: identify tunnel via GTP device + GTP version + TEID + family")Signed-off-by Zhixing Chen <[email protected]>
Pablo Neira Ayuso
maintainerQuoted 9 lines · Pablo Neira Ayuso
Quoted 8 lines · Zhixing Chen
GTPv1-U packets may carry a chain of extension headers before the inner IP packet. The receive path already parses and skips these extension headers, but it currently reads the inner protocol before doing so.
As a result, the first extension header byte is interpreted as the inner IP version. Packets with extension headers are then dropped before PDP lookup.
Quoted 7 lines
Quoted 5 lines
Parse the extension header chain before calling
gtp_inner_proto(), so the inner protocol is read from the actual inner IP header.Fixes c75fc0b9e5be ("gtp: identify tunnel via GTP device + GTP version + TEID + family")Signed-off-by Zhixing Chen <[email protected]>Reviewed-by Pablo Neira Ayuso <[email protected]>
Patch is not good, it needs to refetch gtp header after pskb_may_pull().
Quoted 2 lines
Patch is not good, it needs to refetch gtp header after
pskb_may_pull().
Thanks for the catch. I’ve sent v3; it refetches gtp header after pskb_may_pull().