diff options
| author | Cong Wang <xiyou.wangcong@gmail.com> | 2025-02-17 20:32:09 -0800 | 
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2025-02-19 18:54:59 -0800 | 
| commit | 69ab34f705fbfabcace64b5d53bb7a4450fac875 (patch) | |
| tree | d2afaec03ea8047143b4492525c3a179fc077ad8 | |
| parent | dfc1580f960bf70bdaacda8f3d644e3e58160f9d (diff) | |
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: 59fb9b62fb6c ("flow_dissector: Fix to use new variables for port ranges in bpf hook")
Reported-by: Qiang Zhang <dtzq01@gmail.com>
Closes: https://lore.kernel.org/netdev/CAPx+-5uvFxkhkz4=j_Xuwkezjn9U6kzKTD5jz4tZ9msSJ0fOJA@mail.gmail.com/
Cc: Yoshiki Komachi <komachi.yoshiki@gmail.com>
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Link: https://patch.msgid.link/20250218043210.732959-4-xiyou.wangcong@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
| -rw-r--r-- | net/core/flow_dissector.c | 18 | 
1 files changed, 10 insertions, 8 deletions
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index c33af3ef0b79..9cd8de6bebb5 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -931,6 +931,7 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys,  				     struct flow_dissector *flow_dissector,  				     void *target_container)  { +	struct flow_dissector_key_ports_range *key_ports_range = NULL;  	struct flow_dissector_key_ports *key_ports = NULL;  	struct flow_dissector_key_control *key_control;  	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,  		key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;  	} -	if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) +	if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) {  		key_ports = skb_flow_dissector_target(flow_dissector,  						      FLOW_DISSECTOR_KEY_PORTS,  						      target_container); -	else if (dissector_uses_key(flow_dissector, -				    FLOW_DISSECTOR_KEY_PORTS_RANGE)) -		key_ports = skb_flow_dissector_target(flow_dissector, -						      FLOW_DISSECTOR_KEY_PORTS_RANGE, -						      target_container); - -	if (key_ports) {  		key_ports->src = flow_keys->sport;  		key_ports->dst = flow_keys->dport;  	} +	if (dissector_uses_key(flow_dissector, +			       FLOW_DISSECTOR_KEY_PORTS_RANGE)) { +		key_ports_range = skb_flow_dissector_target(flow_dissector, +							    FLOW_DISSECTOR_KEY_PORTS_RANGE, +							    target_container); +		key_ports_range->tp.src = flow_keys->sport; +		key_ports_range->tp.dst = flow_keys->dport; +	}  	if (dissector_uses_key(flow_dissector,  			       FLOW_DISSECTOR_KEY_FLOW_LABEL)) {  | 
