@@ -2032,65 +2032,156 @@ static int set_flowkey_fields(struct nix_rx_flowkey_alg *alg, u32 flow_cfg)
2032
2032
if (field_marker )
2033
2033
memset (& tmp , 0 , sizeof (tmp ));
2034
2034
2035
+ field_marker = true;
2036
+ keyoff_marker = true;
2035
2037
switch (key_type ) {
2036
2038
case NIX_FLOW_KEY_TYPE_PORT :
2037
2039
field -> sel_chan = true;
2038
2040
/* This should be set to 1, when SEL_CHAN is set */
2039
2041
field -> bytesm1 = 1 ;
2040
- field_marker = true;
2041
- keyoff_marker = true;
2042
2042
break ;
2043
2043
case NIX_FLOW_KEY_TYPE_IPV4 :
2044
+ case NIX_FLOW_KEY_TYPE_INNR_IPV4 :
2044
2045
field -> lid = NPC_LID_LC ;
2045
2046
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
+ }
2046
2051
field -> hdr_offset = 12 ; /* SIP offset */
2047
2052
field -> bytesm1 = 7 ; /* SIP + DIP, 8 bytes */
2048
2053
field -> ltype_mask = 0xF ; /* Match only IPv4 */
2049
- field_marker = true;
2050
2054
keyoff_marker = false;
2051
2055
break ;
2052
2056
case NIX_FLOW_KEY_TYPE_IPV6 :
2057
+ case NIX_FLOW_KEY_TYPE_INNR_IPV6 :
2053
2058
field -> lid = NPC_LID_LC ;
2054
2059
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
+ }
2055
2064
field -> hdr_offset = 8 ; /* SIP offset */
2056
2065
field -> bytesm1 = 31 ; /* SIP + DIP, 32 bytes */
2057
2066
field -> ltype_mask = 0xF ; /* Match only IPv6 */
2058
- field_marker = true;
2059
- keyoff_marker = true;
2060
2067
break ;
2061
2068
case NIX_FLOW_KEY_TYPE_TCP :
2062
2069
case NIX_FLOW_KEY_TYPE_UDP :
2063
2070
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 :
2064
2074
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 ;
2065
2079
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 ) {
2067
2095
field -> ltype_match |= NPC_LT_LD_TCP ;
2068
2096
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 ) &&
2070
2099
valid_key ) {
2071
2100
field -> ltype_match |= NPC_LT_LD_UDP ;
2072
2101
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 ) &&
2074
2104
valid_key ) {
2075
2105
field -> ltype_match |= NPC_LT_LD_SCTP ;
2076
2106
group_member = true;
2077
2107
}
2078
2108
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 ) {
2080
2111
/* Handle the case where any of the group item
2081
2112
* is enabled in the group but not the final one
2082
2113
*/
2083
2114
if (group_member ) {
2084
2115
valid_key = true;
2085
2116
group_member = false;
2086
2117
}
2087
- field_marker = true;
2088
- keyoff_marker = true;
2089
2118
} else {
2090
2119
field_marker = false;
2091
2120
keyoff_marker = false;
2092
2121
}
2093
2122
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 ;
2094
2185
}
2095
2186
field -> ena = 1 ;
2096
2187
0 commit comments