ice: fix adding IP4 IP6 Flow Director rules
A subsequent addition of an IP4 or IP6 rule after other rules would overwrite any existing TCAM entries of related L4 protocols(ex: tcp4 or udp6). This was due to the mask including too many TCAM entries. Add new packet type masks with bits properly excluded so rules are not overwritten. Signed-off-by: Dan Nowlin <dan.nowlin@intel.com> Signed-off-by: Henry Tieman <henry.w.tieman@intel.com> Tested-by: Brijesh Behera <brijeshx.behera@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
ecfb751f1a
commit
051d2b5cfa
|
@ -99,6 +99,54 @@ static const u32 ice_ptypes_ipv6_il[] = {
|
|||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
};
|
||||
|
||||
/* Packet types for packets with an Outer/First/Single IPv4 header - no L4 */
|
||||
static const u32 ice_ipv4_ofos_no_l4[] = {
|
||||
0x10C00000, 0x04000800, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
};
|
||||
|
||||
/* Packet types for packets with an Innermost/Last IPv4 header - no L4 */
|
||||
static const u32 ice_ipv4_il_no_l4[] = {
|
||||
0x60000000, 0x18043008, 0x80000002, 0x6010c021,
|
||||
0x00000008, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
};
|
||||
|
||||
/* Packet types for packets with an Outer/First/Single IPv6 header - no L4 */
|
||||
static const u32 ice_ipv6_ofos_no_l4[] = {
|
||||
0x00000000, 0x00000000, 0x43000000, 0x10002000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
};
|
||||
|
||||
/* Packet types for packets with an Innermost/Last IPv6 header - no L4 */
|
||||
static const u32 ice_ipv6_il_no_l4[] = {
|
||||
0x00000000, 0x02180430, 0x0000010c, 0x086010c0,
|
||||
0x00000430, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
};
|
||||
|
||||
/* UDP Packet types for non-tunneled packets or tunneled
|
||||
* packets with inner UDP.
|
||||
*/
|
||||
|
@ -250,11 +298,23 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params *params)
|
|||
|
||||
hdrs = prof->segs[i].hdrs;
|
||||
|
||||
if (hdrs & ICE_FLOW_SEG_HDR_IPV4) {
|
||||
if ((hdrs & ICE_FLOW_SEG_HDR_IPV4) &&
|
||||
!(hdrs & ICE_FLOW_SEG_HDRS_L4_MASK)) {
|
||||
src = !i ? (const unsigned long *)ice_ipv4_ofos_no_l4 :
|
||||
(const unsigned long *)ice_ipv4_il_no_l4;
|
||||
bitmap_and(params->ptypes, params->ptypes, src,
|
||||
ICE_FLOW_PTYPE_MAX);
|
||||
} else if (hdrs & ICE_FLOW_SEG_HDR_IPV4) {
|
||||
src = !i ? (const unsigned long *)ice_ptypes_ipv4_ofos :
|
||||
(const unsigned long *)ice_ptypes_ipv4_il;
|
||||
bitmap_and(params->ptypes, params->ptypes, src,
|
||||
ICE_FLOW_PTYPE_MAX);
|
||||
} else if ((hdrs & ICE_FLOW_SEG_HDR_IPV6) &&
|
||||
!(hdrs & ICE_FLOW_SEG_HDRS_L4_MASK)) {
|
||||
src = !i ? (const unsigned long *)ice_ipv6_ofos_no_l4 :
|
||||
(const unsigned long *)ice_ipv6_il_no_l4;
|
||||
bitmap_and(params->ptypes, params->ptypes, src,
|
||||
ICE_FLOW_PTYPE_MAX);
|
||||
} else if (hdrs & ICE_FLOW_SEG_HDR_IPV6) {
|
||||
src = !i ? (const unsigned long *)ice_ptypes_ipv6_ofos :
|
||||
(const unsigned long *)ice_ptypes_ipv6_il;
|
||||
|
|
Loading…
Reference in New Issue