brintos

brintos / linux-shallow public Read only

0
0
Text · 6.5 KiB · a9e1da3 Raw
223 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright (c) 2021, Intel Corporation. */3 4/* advanced RSS configuration ethtool support for iavf */5 6#include "iavf.h"7 8/**9 * iavf_fill_adv_rss_ip4_hdr - fill the IPv4 RSS protocol header10 * @hdr: the virtchnl message protocol header data structure11 * @hash_flds: the RSS configuration protocol hash fields12 */13static void14iavf_fill_adv_rss_ip4_hdr(struct virtchnl_proto_hdr *hdr, u64 hash_flds)15{16	VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, IPV4);17 18	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_IPV4_SA)19		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV4, SRC);20 21	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_IPV4_DA)22		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV4, DST);23}24 25/**26 * iavf_fill_adv_rss_ip6_hdr - fill the IPv6 RSS protocol header27 * @hdr: the virtchnl message protocol header data structure28 * @hash_flds: the RSS configuration protocol hash fields29 */30static void31iavf_fill_adv_rss_ip6_hdr(struct virtchnl_proto_hdr *hdr, u64 hash_flds)32{33	VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, IPV6);34 35	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_IPV6_SA)36		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV6, SRC);37 38	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_IPV6_DA)39		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV6, DST);40}41 42/**43 * iavf_fill_adv_rss_tcp_hdr - fill the TCP RSS protocol header44 * @hdr: the virtchnl message protocol header data structure45 * @hash_flds: the RSS configuration protocol hash fields46 */47static void48iavf_fill_adv_rss_tcp_hdr(struct virtchnl_proto_hdr *hdr, u64 hash_flds)49{50	VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, TCP);51 52	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_TCP_SRC_PORT)53		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, TCP, SRC_PORT);54 55	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_TCP_DST_PORT)56		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, TCP, DST_PORT);57}58 59/**60 * iavf_fill_adv_rss_udp_hdr - fill the UDP RSS protocol header61 * @hdr: the virtchnl message protocol header data structure62 * @hash_flds: the RSS configuration protocol hash fields63 */64static void65iavf_fill_adv_rss_udp_hdr(struct virtchnl_proto_hdr *hdr, u64 hash_flds)66{67	VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, UDP);68 69	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_UDP_SRC_PORT)70		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, UDP, SRC_PORT);71 72	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_UDP_DST_PORT)73		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, UDP, DST_PORT);74}75 76/**77 * iavf_fill_adv_rss_sctp_hdr - fill the SCTP RSS protocol header78 * @hdr: the virtchnl message protocol header data structure79 * @hash_flds: the RSS configuration protocol hash fields80 */81static void82iavf_fill_adv_rss_sctp_hdr(struct virtchnl_proto_hdr *hdr, u64 hash_flds)83{84	VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, SCTP);85 86	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_SCTP_SRC_PORT)87		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, SCTP, SRC_PORT);88 89	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_SCTP_DST_PORT)90		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, SCTP, DST_PORT);91}92 93/**94 * iavf_fill_adv_rss_cfg_msg - fill the RSS configuration into virtchnl message95 * @rss_cfg: the virtchnl message to be filled with RSS configuration setting96 * @packet_hdrs: the RSS configuration protocol header types97 * @hash_flds: the RSS configuration protocol hash fields98 * @symm: if true, symmetric hash is required99 *100 * Returns 0 if the RSS configuration virtchnl message is filled successfully101 */102int103iavf_fill_adv_rss_cfg_msg(struct virtchnl_rss_cfg *rss_cfg,104			  u32 packet_hdrs, u64 hash_flds, bool symm)105{106	struct virtchnl_proto_hdrs *proto_hdrs = &rss_cfg->proto_hdrs;107	struct virtchnl_proto_hdr *hdr;108 109	if (symm)110		rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;111	else112		rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;113 114	proto_hdrs->tunnel_level = 0;	/* always outer layer */115 116	hdr = &proto_hdrs->proto_hdr[proto_hdrs->count++];117	switch (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_L3) {118	case IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4:119		iavf_fill_adv_rss_ip4_hdr(hdr, hash_flds);120		break;121	case IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6:122		iavf_fill_adv_rss_ip6_hdr(hdr, hash_flds);123		break;124	default:125		return -EINVAL;126	}127 128	hdr = &proto_hdrs->proto_hdr[proto_hdrs->count++];129	switch (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_L4) {130	case IAVF_ADV_RSS_FLOW_SEG_HDR_TCP:131		iavf_fill_adv_rss_tcp_hdr(hdr, hash_flds);132		break;133	case IAVF_ADV_RSS_FLOW_SEG_HDR_UDP:134		iavf_fill_adv_rss_udp_hdr(hdr, hash_flds);135		break;136	case IAVF_ADV_RSS_FLOW_SEG_HDR_SCTP:137		iavf_fill_adv_rss_sctp_hdr(hdr, hash_flds);138		break;139	default:140		return -EINVAL;141	}142 143	return 0;144}145 146/**147 * iavf_find_adv_rss_cfg_by_hdrs - find RSS configuration with header type148 * @adapter: pointer to the VF adapter structure149 * @packet_hdrs: protocol header type to find.150 *151 * Returns pointer to advance RSS configuration if found or null152 */153struct iavf_adv_rss *154iavf_find_adv_rss_cfg_by_hdrs(struct iavf_adapter *adapter, u32 packet_hdrs)155{156	struct iavf_adv_rss *rss;157 158	list_for_each_entry(rss, &adapter->adv_rss_list_head, list)159		if (rss->packet_hdrs == packet_hdrs)160			return rss;161 162	return NULL;163}164 165/**166 * iavf_print_adv_rss_cfg167 * @adapter: pointer to the VF adapter structure168 * @rss: pointer to the advance RSS configuration to print169 * @action: the string description about how to handle the RSS170 * @result: the string description about the virtchnl result171 *172 * Print the advance RSS configuration173 **/174void175iavf_print_adv_rss_cfg(struct iavf_adapter *adapter, struct iavf_adv_rss *rss,176		       const char *action, const char *result)177{178	u32 packet_hdrs = rss->packet_hdrs;179	u64 hash_flds = rss->hash_flds;180	static char hash_opt[300];181	const char *proto;182 183	if (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_TCP)184		proto = "TCP";185	else if (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_UDP)186		proto = "UDP";187	else if (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_SCTP)188		proto = "SCTP";189	else190		return;191 192	memset(hash_opt, 0, sizeof(hash_opt));193 194	strcat(hash_opt, proto);195	if (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4)196		strcat(hash_opt, "v4 ");197	else198		strcat(hash_opt, "v6 ");199 200	if (hash_flds & (IAVF_ADV_RSS_HASH_FLD_IPV4_SA |201			 IAVF_ADV_RSS_HASH_FLD_IPV6_SA))202		strcat(hash_opt, "IP SA,");203	if (hash_flds & (IAVF_ADV_RSS_HASH_FLD_IPV4_DA |204			 IAVF_ADV_RSS_HASH_FLD_IPV6_DA))205		strcat(hash_opt, "IP DA,");206	if (hash_flds & (IAVF_ADV_RSS_HASH_FLD_TCP_SRC_PORT |207			 IAVF_ADV_RSS_HASH_FLD_UDP_SRC_PORT |208			 IAVF_ADV_RSS_HASH_FLD_SCTP_SRC_PORT))209		strcat(hash_opt, "src port,");210	if (hash_flds & (IAVF_ADV_RSS_HASH_FLD_TCP_DST_PORT |211			 IAVF_ADV_RSS_HASH_FLD_UDP_DST_PORT |212			 IAVF_ADV_RSS_HASH_FLD_SCTP_DST_PORT))213		strcat(hash_opt, "dst port,");214 215	if (!action)216		action = "";217 218	if (!result)219		result = "";220 221	dev_info(&adapter->pdev->dev, "%s %s %s\n", action, hash_opt, result);222}223