Merge branch 'net-mvpp2-cls-Allow-steering-based-on-vlan-tag'
Maxime Chevallier says: ==================== net: mvpp2: cls: Allow steering based on vlan tag The PPv2 classifier can perform flow steering based on keys extracted from the VLAN tag. This series adds support for using the vlan id and the vlan prio as keys, using the ethtool interface. Patch 1 is a preparatory patch that prevent false-positive matches, using a dedicated lookup id for the RSS C2 lookup. Patch 2 allows to separate the flows based on the header fields they contain. The main goal is to be able to separate tagged traffic from untagged traffic for flow steering, just as we already do for RSS. Patch 3 solves an issue we have when extracting fields that aren't full bytes, such as the vlan tag which is 12 bits wide, or the priority which is 3 bits wide. Finally, patch 4 adds support for steering based on both vlan id and priority, extracted from the outermost tag. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
da21ad276a
@ -44,17 +44,17 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
||||
|
||||
/* TCP over IPv4 flows, Not fragmented, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_NF_TAG,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_NF_TAG,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_NF_TAG,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
@ -79,17 +79,17 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
||||
|
||||
/* TCP over IPv4 flows, fragmented, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
@ -114,17 +114,17 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
||||
|
||||
/* UDP over IPv4 flows, Not fragmented, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_NF_TAG,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_NF_TAG,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_NF_TAG,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
@ -149,17 +149,17 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
||||
|
||||
/* UDP over IPv4 flows, fragmented, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
@ -178,12 +178,12 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
||||
|
||||
/* TCP over IPv6 flows, not fragmented, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_NF_TAG,
|
||||
MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_NF_TAG,
|
||||
MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
@ -202,13 +202,13 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
||||
|
||||
/* TCP over IPv6 flows, fragmented, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_IP_FRAG_TRUE |
|
||||
MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_IP_FRAG_TRUE |
|
||||
MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
@ -228,12 +228,12 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
||||
|
||||
/* UDP over IPv6 flows, not fragmented, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_NF_TAG,
|
||||
MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_NF_TAG,
|
||||
MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
@ -252,13 +252,13 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
||||
|
||||
/* UDP over IPv6 flows, fragmented, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_IP_FRAG_TRUE |
|
||||
MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_IP_FRAG_TRUE |
|
||||
MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
@ -279,15 +279,15 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
||||
|
||||
/* IPv4 flows, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_IP4, MVPP2_FL_IP4_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4,
|
||||
MVPP2_PRS_RI_L3_PROTO_MASK),
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_IP4, MVPP2_FL_IP4_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OPT,
|
||||
MVPP2_PRS_RI_L3_PROTO_MASK),
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_IP4, MVPP2_FL_IP4_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OTHER,
|
||||
MVPP2_PRS_RI_L3_PROTO_MASK),
|
||||
|
||||
@ -303,11 +303,11 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
||||
|
||||
/* IPv6 flows, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_IP6, MVPP2_FL_IP6_TAG,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP6,
|
||||
MVPP2_PRS_RI_L3_PROTO_MASK),
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_IP6, MVPP2_FL_IP6_TAG,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
|
||||
MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP6,
|
||||
MVPP2_PRS_RI_L3_PROTO_MASK),
|
||||
|
||||
@ -596,7 +596,7 @@ static void mvpp2_cls_flow_init(struct mvpp2 *priv,
|
||||
|
||||
mvpp2_cls_flow_eng_set(&fe, MVPP22_CLS_ENGINE_C2);
|
||||
mvpp2_cls_flow_port_id_sel(&fe, true);
|
||||
mvpp2_cls_flow_lu_type_set(&fe, MVPP22_FLOW_ETHERNET);
|
||||
mvpp2_cls_flow_lu_type_set(&fe, MVPP22_CLS_LU_TYPE_ALL);
|
||||
|
||||
/* Add all ports */
|
||||
for (i = 0; i < MVPP2_MAX_PORTS; i++)
|
||||
@ -655,6 +655,9 @@ static int mvpp2_flow_set_hek_fields(struct mvpp2_cls_flow_entry *fe,
|
||||
case MVPP22_CLS_HEK_OPT_VLAN:
|
||||
field_id = MVPP22_CLS_FIELD_VLAN;
|
||||
break;
|
||||
case MVPP22_CLS_HEK_OPT_VLAN_PRI:
|
||||
field_id = MVPP22_CLS_FIELD_VLAN_PRI;
|
||||
break;
|
||||
case MVPP22_CLS_HEK_OPT_IP4SA:
|
||||
field_id = MVPP22_CLS_FIELD_IP4SA;
|
||||
break;
|
||||
@ -689,6 +692,10 @@ static int mvpp2_cls_hek_field_size(u32 field)
|
||||
switch (field) {
|
||||
case MVPP22_CLS_HEK_OPT_MAC_DA:
|
||||
return 48;
|
||||
case MVPP22_CLS_HEK_OPT_VLAN:
|
||||
return 12;
|
||||
case MVPP22_CLS_HEK_OPT_VLAN_PRI:
|
||||
return 3;
|
||||
case MVPP22_CLS_HEK_OPT_IP4SA:
|
||||
case MVPP22_CLS_HEK_OPT_IP4DA:
|
||||
return 32;
|
||||
@ -777,6 +784,9 @@ u16 mvpp2_flow_get_hek_fields(struct mvpp2_cls_flow_entry *fe)
|
||||
case MVPP22_CLS_FIELD_VLAN:
|
||||
hash_opts |= MVPP22_CLS_HEK_OPT_VLAN;
|
||||
break;
|
||||
case MVPP22_CLS_FIELD_VLAN_PRI:
|
||||
hash_opts |= MVPP22_CLS_HEK_OPT_VLAN_PRI;
|
||||
break;
|
||||
case MVPP22_CLS_FIELD_L3_PROTO:
|
||||
hash_opts |= MVPP22_CLS_HEK_OPT_L3_PROTO;
|
||||
break;
|
||||
@ -861,7 +871,7 @@ static void mvpp2_port_c2_cls_init(struct mvpp2_port *port)
|
||||
|
||||
/* Match on Lookup Type */
|
||||
c2.tcam[4] |= MVPP22_CLS_C2_TCAM_EN(MVPP22_CLS_C2_LU_TYPE(MVPP2_CLS_LU_TYPE_MASK));
|
||||
c2.tcam[4] |= MVPP22_CLS_C2_LU_TYPE(MVPP22_FLOW_ETHERNET);
|
||||
c2.tcam[4] |= MVPP22_CLS_C2_LU_TYPE(MVPP22_CLS_LU_TYPE_ALL);
|
||||
|
||||
/* Update RSS status after matching this entry */
|
||||
c2.act = MVPP22_CLS_C2_ACT_RSS_EN(MVPP22_C2_UPD_LOCK);
|
||||
@ -1081,13 +1091,13 @@ static int mvpp2_port_c2_tcam_rule_add(struct mvpp2_port *port,
|
||||
|
||||
rule->c2_index = c2.index;
|
||||
|
||||
c2.tcam[0] = (rule->c2_tcam & 0xffff) |
|
||||
c2.tcam[3] = (rule->c2_tcam & 0xffff) |
|
||||
((rule->c2_tcam_mask & 0xffff) << 16);
|
||||
c2.tcam[1] = ((rule->c2_tcam >> 16) & 0xffff) |
|
||||
c2.tcam[2] = ((rule->c2_tcam >> 16) & 0xffff) |
|
||||
(((rule->c2_tcam_mask >> 16) & 0xffff) << 16);
|
||||
c2.tcam[2] = ((rule->c2_tcam >> 32) & 0xffff) |
|
||||
c2.tcam[1] = ((rule->c2_tcam >> 32) & 0xffff) |
|
||||
(((rule->c2_tcam_mask >> 32) & 0xffff) << 16);
|
||||
c2.tcam[3] = ((rule->c2_tcam >> 48) & 0xffff) |
|
||||
c2.tcam[0] = ((rule->c2_tcam >> 48) & 0xffff) |
|
||||
(((rule->c2_tcam_mask >> 48) & 0xffff) << 16);
|
||||
|
||||
pmap = BIT(port->id);
|
||||
@ -1201,6 +1211,9 @@ static int mvpp2_port_flt_rfs_rule_insert(struct mvpp2_port *port,
|
||||
if (!flow)
|
||||
return 0;
|
||||
|
||||
if ((rule->hek_fields & flow->supported_hash_opts) != rule->hek_fields)
|
||||
continue;
|
||||
|
||||
index = MVPP2_CLS_FLT_C2_RFS(port->id, flow->flow_id, rule->loc);
|
||||
|
||||
mvpp2_cls_flow_read(priv, index, &fe);
|
||||
@ -1219,7 +1232,44 @@ static int mvpp2_port_flt_rfs_rule_insert(struct mvpp2_port *port,
|
||||
static int mvpp2_cls_c2_build_match(struct mvpp2_rfs_rule *rule)
|
||||
{
|
||||
struct flow_rule *flow = rule->flow;
|
||||
int offs = 64;
|
||||
int offs = 0;
|
||||
|
||||
/* The order of insertion in C2 tcam must match the order in which
|
||||
* the fields are found in the header
|
||||
*/
|
||||
if (flow_rule_match_key(flow, FLOW_DISSECTOR_KEY_VLAN)) {
|
||||
struct flow_match_vlan match;
|
||||
|
||||
flow_rule_match_vlan(flow, &match);
|
||||
if (match.mask->vlan_id) {
|
||||
rule->hek_fields |= MVPP22_CLS_HEK_OPT_VLAN;
|
||||
|
||||
rule->c2_tcam |= ((u64)match.key->vlan_id) << offs;
|
||||
rule->c2_tcam_mask |= ((u64)match.mask->vlan_id) << offs;
|
||||
|
||||
/* Don't update the offset yet */
|
||||
}
|
||||
|
||||
if (match.mask->vlan_priority) {
|
||||
rule->hek_fields |= MVPP22_CLS_HEK_OPT_VLAN_PRI;
|
||||
|
||||
/* VLAN pri is always at offset 13 relative to the
|
||||
* current offset
|
||||
*/
|
||||
rule->c2_tcam |= ((u64)match.key->vlan_priority) <<
|
||||
(offs + 13);
|
||||
rule->c2_tcam_mask |= ((u64)match.mask->vlan_priority) <<
|
||||
(offs + 13);
|
||||
}
|
||||
|
||||
if (match.mask->vlan_dei)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* vlan id and prio always seem to take a full 16-bit slot in
|
||||
* the Header Extracted Key.
|
||||
*/
|
||||
offs += 16;
|
||||
}
|
||||
|
||||
if (flow_rule_match_key(flow, FLOW_DISSECTOR_KEY_PORTS)) {
|
||||
struct flow_match_ports match;
|
||||
@ -1227,18 +1277,18 @@ static int mvpp2_cls_c2_build_match(struct mvpp2_rfs_rule *rule)
|
||||
flow_rule_match_ports(flow, &match);
|
||||
if (match.mask->src) {
|
||||
rule->hek_fields |= MVPP22_CLS_HEK_OPT_L4SIP;
|
||||
offs -= mvpp2_cls_hek_field_size(MVPP22_CLS_HEK_OPT_L4SIP);
|
||||
|
||||
rule->c2_tcam |= ((u64)ntohs(match.key->src)) << offs;
|
||||
rule->c2_tcam_mask |= ((u64)ntohs(match.mask->src)) << offs;
|
||||
offs += mvpp2_cls_hek_field_size(MVPP22_CLS_HEK_OPT_L4SIP);
|
||||
}
|
||||
|
||||
if (match.mask->dst) {
|
||||
rule->hek_fields |= MVPP22_CLS_HEK_OPT_L4DIP;
|
||||
offs -= mvpp2_cls_hek_field_size(MVPP22_CLS_HEK_OPT_L4DIP);
|
||||
|
||||
rule->c2_tcam |= ((u64)ntohs(match.key->dst)) << offs;
|
||||
rule->c2_tcam_mask |= ((u64)ntohs(match.mask->dst)) << offs;
|
||||
offs += mvpp2_cls_hek_field_size(MVPP22_CLS_HEK_OPT_L4DIP);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -33,15 +33,16 @@ enum mvpp2_cls_engine {
|
||||
};
|
||||
|
||||
#define MVPP22_CLS_HEK_OPT_MAC_DA BIT(0)
|
||||
#define MVPP22_CLS_HEK_OPT_VLAN BIT(1)
|
||||
#define MVPP22_CLS_HEK_OPT_L3_PROTO BIT(2)
|
||||
#define MVPP22_CLS_HEK_OPT_IP4SA BIT(3)
|
||||
#define MVPP22_CLS_HEK_OPT_IP4DA BIT(4)
|
||||
#define MVPP22_CLS_HEK_OPT_IP6SA BIT(5)
|
||||
#define MVPP22_CLS_HEK_OPT_IP6DA BIT(6)
|
||||
#define MVPP22_CLS_HEK_OPT_L4SIP BIT(7)
|
||||
#define MVPP22_CLS_HEK_OPT_L4DIP BIT(8)
|
||||
#define MVPP22_CLS_HEK_N_FIELDS 9
|
||||
#define MVPP22_CLS_HEK_OPT_VLAN_PRI BIT(1)
|
||||
#define MVPP22_CLS_HEK_OPT_VLAN BIT(2)
|
||||
#define MVPP22_CLS_HEK_OPT_L3_PROTO BIT(3)
|
||||
#define MVPP22_CLS_HEK_OPT_IP4SA BIT(4)
|
||||
#define MVPP22_CLS_HEK_OPT_IP4DA BIT(5)
|
||||
#define MVPP22_CLS_HEK_OPT_IP6SA BIT(6)
|
||||
#define MVPP22_CLS_HEK_OPT_IP6DA BIT(7)
|
||||
#define MVPP22_CLS_HEK_OPT_L4SIP BIT(8)
|
||||
#define MVPP22_CLS_HEK_OPT_L4DIP BIT(9)
|
||||
#define MVPP22_CLS_HEK_N_FIELDS 10
|
||||
|
||||
#define MVPP22_CLS_HEK_L4_OPTS (MVPP22_CLS_HEK_OPT_L4SIP | \
|
||||
MVPP22_CLS_HEK_OPT_L4DIP)
|
||||
@ -59,8 +60,12 @@ enum mvpp2_cls_engine {
|
||||
#define MVPP22_CLS_HEK_IP6_5T (MVPP22_CLS_HEK_IP6_2T | \
|
||||
MVPP22_CLS_HEK_L4_OPTS)
|
||||
|
||||
#define MVPP22_CLS_HEK_TAGGED (MVPP22_CLS_HEK_OPT_VLAN | \
|
||||
MVPP22_CLS_HEK_OPT_VLAN_PRI)
|
||||
|
||||
enum mvpp2_cls_field_id {
|
||||
MVPP22_CLS_FIELD_MAC_DA = 0x03,
|
||||
MVPP22_CLS_FIELD_VLAN_PRI = 0x05,
|
||||
MVPP22_CLS_FIELD_VLAN = 0x06,
|
||||
MVPP22_CLS_FIELD_L3_PROTO = 0x0f,
|
||||
MVPP22_CLS_FIELD_IP4SA = 0x10,
|
||||
@ -180,6 +185,11 @@ enum mvpp2_prs_flow {
|
||||
/* LU Type defined for all engines, and specified in the flow table */
|
||||
#define MVPP2_CLS_LU_TYPE_MASK 0x3f
|
||||
|
||||
enum mvpp2_cls_lu_type {
|
||||
/* rule->loc is used as a lu-type for the entries 0 - 62. */
|
||||
MVPP22_CLS_LU_TYPE_ALL = 63,
|
||||
};
|
||||
|
||||
#define MVPP2_N_FLOWS (MVPP2_FL_LAST - MVPP2_FL_START)
|
||||
|
||||
struct mvpp2_cls_flow {
|
||||
|
Loading…
x
Reference in New Issue
Block a user