net/ice/base: disable profile merge for flow director
authorQi Zhang <qi.z.zhang@intel.com>
Mon, 15 Jun 2020 02:04:25 +0000 (10:04 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 16 Jun 2020 17:21:07 +0000 (19:21 +0200)
For Flow Director, we don't want to re-use an existed profile with the
same field vector and mask. Merging two different flow_type’s field
vector will also make them sharing trained rule and cause rule
interference.

For example:
issue rule A: IPV4_TCP matching tcp src&dst port 80  to queue 8
issue rule B: IPV6_TCP matching tcp src&dst port 200 to queue 20
Below behavior is found but not expected:
IPV4_TCP pkt with src&dst port 200 hits rule B and goes to queue 20
IPV6_TCP pkt with src&dst port 80  hits rule A and goes to queue 8

Signed-off-by: Yahui Cao <yahui.cao@intel.com>
Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Qiming Yang <qiming.yang@intel.com>
drivers/net/ice/base/ice_flex_pipe.c

index 512ced6..1f7a059 100644 (file)
@@ -2811,6 +2811,12 @@ ice_find_prof_id_with_mask(struct ice_hw *hw, enum ice_block blk,
        struct ice_es *es = &hw->blk[blk].es;
        u8 i;
 
+       /* For FD, we don't want to re-use an existed profile with the same
+        * field vector and mask. This will cause rule interference.
+        */
+       if (blk == ICE_BLK_FD)
+               return ICE_ERR_DOES_NOT_EXIST;
+
        for (i = 0; i < (u8)es->count; i++) {
                u16 off = i * es->fvw;