Skip to content

Commit 69ab34f

Browse files
congwangkuba-moo
authored andcommitted
flow_dissector: Fix port range key handling in BPF conversion
Fix how port range keys are handled in __skb_flow_bpf_to_target() by: - Separating PORTS and PORTS_RANGE key handling - Using correct key_ports_range structure for range keys - Properly initializing both key types independently This ensures port range information is correctly stored in its dedicated structure rather than incorrectly using the regular ports key structure. Fixes: 59fb9b6 ("flow_dissector: Fix to use new variables for port ranges in bpf hook") Reported-by: Qiang Zhang <[email protected]> Closes: https://lore.kernel.org/netdev/CAPx+-5uvFxkhkz4=j_Xuwkezjn9U6kzKTD5jz4tZ9msSJ0fOJA@mail.gmail.com/ Cc: Yoshiki Komachi <[email protected]> Cc: Jamal Hadi Salim <[email protected]> Cc: Jiri Pirko <[email protected]> Signed-off-by: Cong Wang <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent dfc1580 commit 69ab34f

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

net/core/flow_dissector.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,7 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys,
931931
struct flow_dissector *flow_dissector,
932932
void *target_container)
933933
{
934+
struct flow_dissector_key_ports_range *key_ports_range = NULL;
934935
struct flow_dissector_key_ports *key_ports = NULL;
935936
struct flow_dissector_key_control *key_control;
936937
struct flow_dissector_key_basic *key_basic;
@@ -975,20 +976,21 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys,
975976
key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
976977
}
977978

978-
if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS))
979+
if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) {
979980
key_ports = skb_flow_dissector_target(flow_dissector,
980981
FLOW_DISSECTOR_KEY_PORTS,
981982
target_container);
982-
else if (dissector_uses_key(flow_dissector,
983-
FLOW_DISSECTOR_KEY_PORTS_RANGE))
984-
key_ports = skb_flow_dissector_target(flow_dissector,
985-
FLOW_DISSECTOR_KEY_PORTS_RANGE,
986-
target_container);
987-
988-
if (key_ports) {
989983
key_ports->src = flow_keys->sport;
990984
key_ports->dst = flow_keys->dport;
991985
}
986+
if (dissector_uses_key(flow_dissector,
987+
FLOW_DISSECTOR_KEY_PORTS_RANGE)) {
988+
key_ports_range = skb_flow_dissector_target(flow_dissector,
989+
FLOW_DISSECTOR_KEY_PORTS_RANGE,
990+
target_container);
991+
key_ports_range->tp.src = flow_keys->sport;
992+
key_ports_range->tp.dst = flow_keys->dport;
993+
}
992994

993995
if (dissector_uses_key(flow_dissector,
994996
FLOW_DISSECTOR_KEY_FLOW_LABEL)) {

0 commit comments

Comments
 (0)