@@ -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