@@ -853,23 +853,30 @@ __skb_flow_dissect_ports(const struct sk_buff *skb,
853
853
void * target_container , const void * data ,
854
854
int nhoff , u8 ip_proto , int hlen )
855
855
{
856
- enum flow_dissector_key_id dissector_ports = FLOW_DISSECTOR_KEY_MAX ;
857
- struct flow_dissector_key_ports * key_ports ;
856
+ struct flow_dissector_key_ports_range * key_ports_range = NULL ;
857
+ struct flow_dissector_key_ports * key_ports = NULL ;
858
+ __be32 ports ;
858
859
859
860
if (dissector_uses_key (flow_dissector , FLOW_DISSECTOR_KEY_PORTS ))
860
- dissector_ports = FLOW_DISSECTOR_KEY_PORTS ;
861
- else if (dissector_uses_key (flow_dissector ,
862
- FLOW_DISSECTOR_KEY_PORTS_RANGE ))
863
- dissector_ports = FLOW_DISSECTOR_KEY_PORTS_RANGE ;
861
+ key_ports = skb_flow_dissector_target (flow_dissector ,
862
+ FLOW_DISSECTOR_KEY_PORTS ,
863
+ target_container );
864
864
865
- if (dissector_ports == FLOW_DISSECTOR_KEY_MAX )
865
+ if (dissector_uses_key (flow_dissector , FLOW_DISSECTOR_KEY_PORTS_RANGE ))
866
+ key_ports_range = skb_flow_dissector_target (flow_dissector ,
867
+ FLOW_DISSECTOR_KEY_PORTS_RANGE ,
868
+ target_container );
869
+
870
+ if (!key_ports && !key_ports_range )
866
871
return ;
867
872
868
- key_ports = skb_flow_dissector_target (flow_dissector ,
869
- dissector_ports ,
870
- target_container );
871
- key_ports -> ports = __skb_flow_get_ports (skb , nhoff , ip_proto ,
872
- data , hlen );
873
+ ports = __skb_flow_get_ports (skb , nhoff , ip_proto , data , hlen );
874
+
875
+ if (key_ports )
876
+ key_ports -> ports = ports ;
877
+
878
+ if (key_ports_range )
879
+ key_ports_range -> tp .ports = ports ;
873
880
}
874
881
875
882
static void
@@ -924,6 +931,7 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys,
924
931
struct flow_dissector * flow_dissector ,
925
932
void * target_container )
926
933
{
934
+ struct flow_dissector_key_ports_range * key_ports_range = NULL ;
927
935
struct flow_dissector_key_ports * key_ports = NULL ;
928
936
struct flow_dissector_key_control * key_control ;
929
937
struct flow_dissector_key_basic * key_basic ;
@@ -968,20 +976,21 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys,
968
976
key_control -> addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS ;
969
977
}
970
978
971
- if (dissector_uses_key (flow_dissector , FLOW_DISSECTOR_KEY_PORTS ))
979
+ if (dissector_uses_key (flow_dissector , FLOW_DISSECTOR_KEY_PORTS )) {
972
980
key_ports = skb_flow_dissector_target (flow_dissector ,
973
981
FLOW_DISSECTOR_KEY_PORTS ,
974
982
target_container );
975
- else if (dissector_uses_key (flow_dissector ,
976
- FLOW_DISSECTOR_KEY_PORTS_RANGE ))
977
- key_ports = skb_flow_dissector_target (flow_dissector ,
978
- FLOW_DISSECTOR_KEY_PORTS_RANGE ,
979
- target_container );
980
-
981
- if (key_ports ) {
982
983
key_ports -> src = flow_keys -> sport ;
983
984
key_ports -> dst = flow_keys -> dport ;
984
985
}
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
+ }
985
994
986
995
if (dissector_uses_key (flow_dissector ,
987
996
FLOW_DISSECTOR_KEY_FLOW_LABEL )) {
0 commit comments