Skip to content

Commit 206ff84

Browse files
Kiran Kumar Kdavem330
authored andcommitted
octeontx2-af: Add more RSS algorithms
This patch adds support for few more RSS key types for flow key algorithm to compute rss hash index. Following flow key types have been added. - Tunnel types like NVGRE, VXLAN, GENEVE. - L2 offload type ETH_DMAC, Here we will consider only DMAC 6 bytes. - And extension header IPV6_EXT (1 byte followed by IPV6 header - Hashing inner protocol fields for inner DMAC, IPv4/v6, TCP, UDP, SCTP. Signed-off-by: Kiran Kumar K <[email protected]> Signed-off-by: Sunil Goutham <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 8cc89ae commit 206ff84

File tree

2 files changed

+114
-11
lines changed

2 files changed

+114
-11
lines changed

drivers/net/ethernet/marvell/octeontx2/af/mbox.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,18 @@ struct nix_rss_flowkey_cfg {
580580
#define NIX_FLOW_KEY_TYPE_TCP BIT(3)
581581
#define NIX_FLOW_KEY_TYPE_UDP BIT(4)
582582
#define NIX_FLOW_KEY_TYPE_SCTP BIT(5)
583+
#define NIX_FLOW_KEY_TYPE_NVGRE BIT(6)
584+
#define NIX_FLOW_KEY_TYPE_VXLAN BIT(7)
585+
#define NIX_FLOW_KEY_TYPE_GENEVE BIT(8)
586+
#define NIX_FLOW_KEY_TYPE_ETH_DMAC BIT(9)
587+
#define NIX_FLOW_KEY_TYPE_IPV6_EXT BIT(10)
588+
#define NIX_FLOW_KEY_TYPE_GTPU BIT(11)
589+
#define NIX_FLOW_KEY_TYPE_INNR_IPV4 BIT(12)
590+
#define NIX_FLOW_KEY_TYPE_INNR_IPV6 BIT(13)
591+
#define NIX_FLOW_KEY_TYPE_INNR_TCP BIT(14)
592+
#define NIX_FLOW_KEY_TYPE_INNR_UDP BIT(15)
593+
#define NIX_FLOW_KEY_TYPE_INNR_SCTP BIT(16)
594+
#define NIX_FLOW_KEY_TYPE_INNR_ETH_DMAC BIT(17)
583595
u32 flowkey_cfg; /* Flowkey types selected */
584596
u8 group; /* RSS context or group */
585597
};

drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c

Lines changed: 102 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2032,65 +2032,156 @@ static int set_flowkey_fields(struct nix_rx_flowkey_alg *alg, u32 flow_cfg)
20322032
if (field_marker)
20332033
memset(&tmp, 0, sizeof(tmp));
20342034

2035+
field_marker = true;
2036+
keyoff_marker = true;
20352037
switch (key_type) {
20362038
case NIX_FLOW_KEY_TYPE_PORT:
20372039
field->sel_chan = true;
20382040
/* This should be set to 1, when SEL_CHAN is set */
20392041
field->bytesm1 = 1;
2040-
field_marker = true;
2041-
keyoff_marker = true;
20422042
break;
20432043
case NIX_FLOW_KEY_TYPE_IPV4:
2044+
case NIX_FLOW_KEY_TYPE_INNR_IPV4:
20442045
field->lid = NPC_LID_LC;
20452046
field->ltype_match = NPC_LT_LC_IP;
2047+
if (key_type == NIX_FLOW_KEY_TYPE_INNR_IPV4) {
2048+
field->lid = NPC_LID_LG;
2049+
field->ltype_match = NPC_LT_LG_TU_IP;
2050+
}
20462051
field->hdr_offset = 12; /* SIP offset */
20472052
field->bytesm1 = 7; /* SIP + DIP, 8 bytes */
20482053
field->ltype_mask = 0xF; /* Match only IPv4 */
2049-
field_marker = true;
20502054
keyoff_marker = false;
20512055
break;
20522056
case NIX_FLOW_KEY_TYPE_IPV6:
2057+
case NIX_FLOW_KEY_TYPE_INNR_IPV6:
20532058
field->lid = NPC_LID_LC;
20542059
field->ltype_match = NPC_LT_LC_IP6;
2060+
if (key_type == NIX_FLOW_KEY_TYPE_INNR_IPV6) {
2061+
field->lid = NPC_LID_LG;
2062+
field->ltype_match = NPC_LT_LG_TU_IP6;
2063+
}
20552064
field->hdr_offset = 8; /* SIP offset */
20562065
field->bytesm1 = 31; /* SIP + DIP, 32 bytes */
20572066
field->ltype_mask = 0xF; /* Match only IPv6 */
2058-
field_marker = true;
2059-
keyoff_marker = true;
20602067
break;
20612068
case NIX_FLOW_KEY_TYPE_TCP:
20622069
case NIX_FLOW_KEY_TYPE_UDP:
20632070
case NIX_FLOW_KEY_TYPE_SCTP:
2071+
case NIX_FLOW_KEY_TYPE_INNR_TCP:
2072+
case NIX_FLOW_KEY_TYPE_INNR_UDP:
2073+
case NIX_FLOW_KEY_TYPE_INNR_SCTP:
20642074
field->lid = NPC_LID_LD;
2075+
if (key_type == NIX_FLOW_KEY_TYPE_INNR_TCP ||
2076+
key_type == NIX_FLOW_KEY_TYPE_INNR_UDP ||
2077+
key_type == NIX_FLOW_KEY_TYPE_INNR_SCTP)
2078+
field->lid = NPC_LID_LH;
20652079
field->bytesm1 = 3; /* Sport + Dport, 4 bytes */
2066-
if (key_type == NIX_FLOW_KEY_TYPE_TCP && valid_key) {
2080+
2081+
/* Enum values for NPC_LID_LD and NPC_LID_LG are same,
2082+
* so no need to change the ltype_match, just change
2083+
* the lid for inner protocols
2084+
*/
2085+
BUILD_BUG_ON((int)NPC_LT_LD_TCP !=
2086+
(int)NPC_LT_LH_TU_TCP);
2087+
BUILD_BUG_ON((int)NPC_LT_LD_UDP !=
2088+
(int)NPC_LT_LH_TU_UDP);
2089+
BUILD_BUG_ON((int)NPC_LT_LD_SCTP !=
2090+
(int)NPC_LT_LH_TU_SCTP);
2091+
2092+
if ((key_type == NIX_FLOW_KEY_TYPE_TCP ||
2093+
key_type == NIX_FLOW_KEY_TYPE_INNR_TCP) &&
2094+
valid_key) {
20672095
field->ltype_match |= NPC_LT_LD_TCP;
20682096
group_member = true;
2069-
} else if (key_type == NIX_FLOW_KEY_TYPE_UDP &&
2097+
} else if ((key_type == NIX_FLOW_KEY_TYPE_UDP ||
2098+
key_type == NIX_FLOW_KEY_TYPE_INNR_UDP) &&
20702099
valid_key) {
20712100
field->ltype_match |= NPC_LT_LD_UDP;
20722101
group_member = true;
2073-
} else if (key_type == NIX_FLOW_KEY_TYPE_SCTP &&
2102+
} else if ((key_type == NIX_FLOW_KEY_TYPE_SCTP ||
2103+
key_type == NIX_FLOW_KEY_TYPE_INNR_SCTP) &&
20742104
valid_key) {
20752105
field->ltype_match |= NPC_LT_LD_SCTP;
20762106
group_member = true;
20772107
}
20782108
field->ltype_mask = ~field->ltype_match;
2079-
if (key_type == NIX_FLOW_KEY_TYPE_SCTP) {
2109+
if (key_type == NIX_FLOW_KEY_TYPE_SCTP ||
2110+
key_type == NIX_FLOW_KEY_TYPE_INNR_SCTP) {
20802111
/* Handle the case where any of the group item
20812112
* is enabled in the group but not the final one
20822113
*/
20832114
if (group_member) {
20842115
valid_key = true;
20852116
group_member = false;
20862117
}
2087-
field_marker = true;
2088-
keyoff_marker = true;
20892118
} else {
20902119
field_marker = false;
20912120
keyoff_marker = false;
20922121
}
20932122
break;
2123+
case NIX_FLOW_KEY_TYPE_NVGRE:
2124+
field->lid = NPC_LID_LD;
2125+
field->hdr_offset = 4; /* VSID offset */
2126+
field->bytesm1 = 2;
2127+
field->ltype_match = NPC_LT_LD_NVGRE;
2128+
field->ltype_mask = 0xF;
2129+
break;
2130+
case NIX_FLOW_KEY_TYPE_VXLAN:
2131+
case NIX_FLOW_KEY_TYPE_GENEVE:
2132+
field->lid = NPC_LID_LE;
2133+
field->bytesm1 = 2;
2134+
field->hdr_offset = 4;
2135+
field->ltype_mask = 0xF;
2136+
field_marker = false;
2137+
keyoff_marker = false;
2138+
2139+
if (key_type == NIX_FLOW_KEY_TYPE_VXLAN && valid_key) {
2140+
field->ltype_match |= NPC_LT_LE_VXLAN;
2141+
group_member = true;
2142+
}
2143+
2144+
if (key_type == NIX_FLOW_KEY_TYPE_GENEVE && valid_key) {
2145+
field->ltype_match |= NPC_LT_LE_GENEVE;
2146+
group_member = true;
2147+
}
2148+
2149+
if (key_type == NIX_FLOW_KEY_TYPE_GENEVE) {
2150+
if (group_member) {
2151+
field->ltype_mask = ~field->ltype_match;
2152+
field_marker = true;
2153+
keyoff_marker = true;
2154+
valid_key = true;
2155+
group_member = false;
2156+
}
2157+
}
2158+
break;
2159+
case NIX_FLOW_KEY_TYPE_ETH_DMAC:
2160+
case NIX_FLOW_KEY_TYPE_INNR_ETH_DMAC:
2161+
field->lid = NPC_LID_LA;
2162+
field->ltype_match = NPC_LT_LA_ETHER;
2163+
if (key_type == NIX_FLOW_KEY_TYPE_INNR_ETH_DMAC) {
2164+
field->lid = NPC_LID_LF;
2165+
field->ltype_match = NPC_LT_LF_TU_ETHER;
2166+
}
2167+
field->hdr_offset = 0;
2168+
field->bytesm1 = 5; /* DMAC 6 Byte */
2169+
field->ltype_mask = 0xF;
2170+
break;
2171+
case NIX_FLOW_KEY_TYPE_IPV6_EXT:
2172+
field->lid = NPC_LID_LC;
2173+
field->hdr_offset = 40; /* IPV6 hdr */
2174+
field->bytesm1 = 0; /* 1 Byte ext hdr*/
2175+
field->ltype_match = NPC_LT_LC_IP6_EXT;
2176+
field->ltype_mask = 0xF;
2177+
break;
2178+
case NIX_FLOW_KEY_TYPE_GTPU:
2179+
field->lid = NPC_LID_LE;
2180+
field->hdr_offset = 4;
2181+
field->bytesm1 = 3; /* 4 bytes TID*/
2182+
field->ltype_match = NPC_LT_LE_GTPU;
2183+
field->ltype_mask = 0xF;
2184+
break;
20942185
}
20952186
field->ena = 1;
20962187

0 commit comments

Comments
 (0)