@@ -5642,6 +5642,14 @@ int bnxt_hwrm_cfa_ntuple_filter_free(struct bnxt *bp,
5642
5642
#define BNXT_NTP_TUNNEL_FLTR_FLAG \
5643
5643
CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_TUNNEL_TYPE
5644
5644
5645
+ void bnxt_fill_ipv6_mask (__be32 mask [4 ])
5646
+ {
5647
+ int i ;
5648
+
5649
+ for (i = 0 ; i < 4 ; i ++ )
5650
+ mask [i ] = cpu_to_be32 (~0 );
5651
+ }
5652
+
5645
5653
static int bnxt_hwrm_cfa_ntuple_filter_alloc (struct bnxt * bp ,
5646
5654
struct bnxt_ntuple_filter * fltr )
5647
5655
{
@@ -5676,35 +5684,43 @@ static int bnxt_hwrm_cfa_ntuple_filter_alloc(struct bnxt *bp,
5676
5684
req -> ip_protocol = keys -> basic .ip_proto ;
5677
5685
5678
5686
if (keys -> basic .n_proto == htons (ETH_P_IPV6 )) {
5679
- int i ;
5680
-
5681
5687
req -> ethertype = htons (ETH_P_IPV6 );
5682
5688
req -> ip_addr_type =
5683
5689
CFA_NTUPLE_FILTER_ALLOC_REQ_IP_ADDR_TYPE_IPV6 ;
5684
- * (struct in6_addr * )& req -> src_ipaddr [0 ] =
5685
- keys -> addrs .v6addrs .src ;
5686
- * (struct in6_addr * )& req -> dst_ipaddr [0 ] =
5687
- keys -> addrs .v6addrs .dst ;
5688
- for (i = 0 ; i < 4 ; i ++ ) {
5689
- req -> src_ipaddr_mask [i ] = cpu_to_be32 (0xffffffff );
5690
- req -> dst_ipaddr_mask [i ] = cpu_to_be32 (0xffffffff );
5690
+ if (fltr -> ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP ) {
5691
+ * (struct in6_addr * )& req -> src_ipaddr [0 ] =
5692
+ keys -> addrs .v6addrs .src ;
5693
+ bnxt_fill_ipv6_mask (req -> src_ipaddr_mask );
5694
+ }
5695
+ if (fltr -> ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP ) {
5696
+ * (struct in6_addr * )& req -> dst_ipaddr [0 ] =
5697
+ keys -> addrs .v6addrs .dst ;
5698
+ bnxt_fill_ipv6_mask (req -> dst_ipaddr_mask );
5691
5699
}
5692
5700
} else {
5693
- req -> src_ipaddr [0 ] = keys -> addrs .v4addrs .src ;
5694
- req -> src_ipaddr_mask [0 ] = cpu_to_be32 (0xffffffff );
5695
- req -> dst_ipaddr [0 ] = keys -> addrs .v4addrs .dst ;
5696
- req -> dst_ipaddr_mask [0 ] = cpu_to_be32 (0xffffffff );
5701
+ if (fltr -> ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP ) {
5702
+ req -> src_ipaddr [0 ] = keys -> addrs .v4addrs .src ;
5703
+ req -> src_ipaddr_mask [0 ] = cpu_to_be32 (0xffffffff );
5704
+ }
5705
+ if (fltr -> ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP ) {
5706
+ req -> dst_ipaddr [0 ] = keys -> addrs .v4addrs .dst ;
5707
+ req -> dst_ipaddr_mask [0 ] = cpu_to_be32 (0xffffffff );
5708
+ }
5697
5709
}
5698
5710
if (keys -> control .flags & FLOW_DIS_ENCAPSULATION ) {
5699
5711
req -> enables |= cpu_to_le32 (BNXT_NTP_TUNNEL_FLTR_FLAG );
5700
5712
req -> tunnel_type =
5701
5713
CFA_NTUPLE_FILTER_ALLOC_REQ_TUNNEL_TYPE_ANYTUNNEL ;
5702
5714
}
5703
5715
5704
- req -> src_port = keys -> ports .src ;
5705
- req -> src_port_mask = cpu_to_be16 (0xffff );
5706
- req -> dst_port = keys -> ports .dst ;
5707
- req -> dst_port_mask = cpu_to_be16 (0xffff );
5716
+ if (fltr -> ntuple_flags & BNXT_NTUPLE_MATCH_SRC_PORT ) {
5717
+ req -> src_port = keys -> ports .src ;
5718
+ req -> src_port_mask = cpu_to_be16 (0xffff );
5719
+ }
5720
+ if (fltr -> ntuple_flags & BNXT_NTUPLE_MATCH_DST_PORT ) {
5721
+ req -> dst_port = keys -> ports .dst ;
5722
+ req -> dst_port_mask = cpu_to_be16 (0xffff );
5723
+ }
5708
5724
5709
5725
resp = hwrm_req_hold (bp , req );
5710
5726
rc = hwrm_req_send (bp , req );
@@ -13886,24 +13902,38 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1,
13886
13902
struct flow_keys * keys1 = & f1 -> fkeys ;
13887
13903
struct flow_keys * keys2 = & f2 -> fkeys ;
13888
13904
13905
+ if (f1 -> ntuple_flags != f2 -> ntuple_flags )
13906
+ return false;
13907
+
13889
13908
if (keys1 -> basic .n_proto != keys2 -> basic .n_proto ||
13890
13909
keys1 -> basic .ip_proto != keys2 -> basic .ip_proto )
13891
13910
return false;
13892
13911
13893
13912
if (keys1 -> basic .n_proto == htons (ETH_P_IP )) {
13894
- if (keys1 -> addrs .v4addrs .src != keys2 -> addrs .v4addrs .src ||
13895
- keys1 -> addrs .v4addrs .dst != keys2 -> addrs .v4addrs .dst )
13913
+ if (((f1 -> ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP ) &&
13914
+ keys1 -> addrs .v4addrs .src != keys2 -> addrs .v4addrs .src ) ||
13915
+ ((f1 -> ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP ) &&
13916
+ keys1 -> addrs .v4addrs .dst != keys2 -> addrs .v4addrs .dst ))
13896
13917
return false;
13897
13918
} else {
13898
- if (memcmp (& keys1 -> addrs .v6addrs .src , & keys2 -> addrs .v6addrs .src ,
13899
- sizeof (keys1 -> addrs .v6addrs .src )) ||
13900
- memcmp (& keys1 -> addrs .v6addrs .dst , & keys2 -> addrs .v6addrs .dst ,
13901
- sizeof (keys1 -> addrs .v6addrs .dst )))
13919
+ if (((f1 -> ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP ) &&
13920
+ memcmp (& keys1 -> addrs .v6addrs .src ,
13921
+ & keys2 -> addrs .v6addrs .src ,
13922
+ sizeof (keys1 -> addrs .v6addrs .src ))) ||
13923
+ ((f1 -> ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP ) &&
13924
+ memcmp (& keys1 -> addrs .v6addrs .dst ,
13925
+ & keys2 -> addrs .v6addrs .dst ,
13926
+ sizeof (keys1 -> addrs .v6addrs .dst ))))
13902
13927
return false;
13903
13928
}
13904
13929
13905
- if (keys1 -> ports .ports == keys2 -> ports .ports &&
13906
- keys1 -> control .flags == keys2 -> control .flags &&
13930
+ if (((f1 -> ntuple_flags & BNXT_NTUPLE_MATCH_SRC_PORT ) &&
13931
+ keys1 -> ports .src != keys2 -> ports .src ) ||
13932
+ ((f1 -> ntuple_flags & BNXT_NTUPLE_MATCH_DST_PORT ) &&
13933
+ keys1 -> ports .dst != keys2 -> ports .dst ))
13934
+ return false;
13935
+
13936
+ if (keys1 -> control .flags == keys2 -> control .flags &&
13907
13937
f1 -> l2_fltr == f2 -> l2_fltr )
13908
13938
return true;
13909
13939
@@ -13985,6 +14015,7 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
13985
14015
}
13986
14016
13987
14017
new_fltr -> l2_fltr = l2_fltr ;
14018
+ new_fltr -> ntuple_flags = BNXT_NTUPLE_MATCH_ALL ;
13988
14019
13989
14020
idx = bnxt_get_ntp_filter_idx (bp , fkeys , skb );
13990
14021
rcu_read_lock ();
0 commit comments