Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions drivers/net/ethernet/intel/iavf/iavf_adv_rss.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,55 @@ iavf_fill_adv_rss_sctp_hdr(struct virtchnl_proto_hdr *hdr, u64 hash_flds)
VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, SCTP, DST_PORT);
}


/**
* iavf_fill_adv_rss_gtp_hdr - Fill GTP-related RSS protocol headers
* @proto_hdrs: pointer to the virtchnl protocol headers structure to populate
* @packet_hdrs: bitmask of packet header types to configure
* @hash_flds: RSS hash field configuration
*
* This function populates the virtchnl protocol header structure with
* appropriate GTP-related header types based on the specified packet_hdrs.
* It supports GTPC, GTPU with extension headers, and uplink/downlink PDU
* types. For certain GTPU types, it also appends an IPv4 header to enable
* hashing on the destination IP address.
*
* Return: 0 on success or -EINVAL if the packet_hdrs value is unsupported.
*/
static int
iavf_fill_adv_rss_gtp_hdr(struct virtchnl_proto_hdrs *proto_hdrs, u32 packet_hdrs, u64 hash_flds)
{
struct virtchnl_proto_hdr *hdr;

hdr = &proto_hdrs->proto_hdr[proto_hdrs->count - 1];
switch (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_GTP) {
case IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC_TEID:
case IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC:
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, GTPC);
break;
case IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_EH:
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, GTPU_EH);
break;
case IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_UP:
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, GTPU_EH_PDU_UP);
hdr = &proto_hdrs->proto_hdr[proto_hdrs->count++];
iavf_fill_adv_rss_ip4_hdr(hdr, IAVF_ADV_RSS_HASH_FLD_IPV4_DA);
break;
case IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_DWN:
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, GTPU_EH_PDU_DWN);
fallthrough;
case IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_IP:
hdr = &proto_hdrs->proto_hdr[proto_hdrs->count++];
iavf_fill_adv_rss_ip4_hdr(hdr, IAVF_ADV_RSS_HASH_FLD_IPV4_DA);
break;
default:
return -EINVAL;

}

return 0;
}

/**
* iavf_fill_adv_rss_cfg_msg - fill the RSS configuration into virtchnl message
* @rss_cfg: the virtchnl message to be filled with RSS configuration setting
Expand All @@ -113,6 +162,7 @@ iavf_fill_adv_rss_cfg_msg(struct virtchnl_rss_cfg *rss_cfg,

proto_hdrs->tunnel_level = 0; /* always outer layer */

if (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_L3) {
hdr = &proto_hdrs->proto_hdr[proto_hdrs->count++];
switch (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_L3) {
case IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4:
Expand All @@ -125,6 +175,9 @@ iavf_fill_adv_rss_cfg_msg(struct virtchnl_rss_cfg *rss_cfg,
return -EINVAL;
}

}

if (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_L4) {
hdr = &proto_hdrs->proto_hdr[proto_hdrs->count++];
switch (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_L4) {
case IAVF_ADV_RSS_FLOW_SEG_HDR_TCP:
Expand All @@ -140,6 +193,14 @@ iavf_fill_adv_rss_cfg_msg(struct virtchnl_rss_cfg *rss_cfg,
return -EINVAL;
}

}

if(packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_GTP) {
hdr = &proto_hdrs->proto_hdr[proto_hdrs->count++];
if (iavf_fill_adv_rss_gtp_hdr(proto_hdrs, packet_hdrs, hash_flds))
return -EINVAL;
}

return 0;
}

Expand Down Expand Up @@ -186,6 +247,8 @@ iavf_print_adv_rss_cfg(struct iavf_adapter *adapter, struct iavf_adv_rss *rss,
proto = "UDP";
else if (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_SCTP)
proto = "SCTP";
else if (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_GTP)
proto = "GTP";
else
return;

Expand All @@ -211,6 +274,16 @@ iavf_print_adv_rss_cfg(struct iavf_adapter *adapter, struct iavf_adv_rss *rss,
IAVF_ADV_RSS_HASH_FLD_UDP_DST_PORT |
IAVF_ADV_RSS_HASH_FLD_SCTP_DST_PORT))
strcat(hash_opt, "dst port,");
if (hash_flds & (IAVF_ADV_RSS_HASH_FLD_GTPC_TEID | IAVF_ADV_RSS_HASH_FLD_GTPC_TEID))
strcat(hash_opt, "gtp-c,");
if (hash_flds & IAVF_ADV_RSS_HASH_FLD_GTPU_IP_TEID)
strcat(hash_opt, "gtp-u ip,");
if (hash_flds & IAVF_ADV_RSS_HASH_FLD_GTPU_EH_TEID)
strcat(hash_opt, "gtp-u ext,");
if (hash_flds & IAVF_ADV_RSS_HASH_FLD_GTPU_UP_TEID)
strcat(hash_opt, "gtp-u ul,");
if (hash_flds & IAVF_ADV_RSS_HASH_FLD_GTPU_DWN_TEID)
strcat(hash_opt, "gtp-u dl,");

if (!action)
action = "";
Expand Down
32 changes: 32 additions & 0 deletions drivers/net/ethernet/intel/iavf/iavf_adv_rss.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ enum iavf_adv_rss_flow_seg_hdr {
IAVF_ADV_RSS_FLOW_SEG_HDR_TCP = 0x00000004,
IAVF_ADV_RSS_FLOW_SEG_HDR_UDP = 0x00000008,
IAVF_ADV_RSS_FLOW_SEG_HDR_SCTP = 0x00000010,
/* RESERVED */
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC = 0x00000400,
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC_TEID = 0x00000800,
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_IP = 0x00001000,
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_EH = 0x00002000,
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_DWN = 0x00004000,
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_UP = 0x00008000,
};

#define IAVF_ADV_RSS_FLOW_SEG_HDR_L3 \
Expand All @@ -33,6 +40,14 @@ enum iavf_adv_rss_flow_seg_hdr {
IAVF_ADV_RSS_FLOW_SEG_HDR_UDP | \
IAVF_ADV_RSS_FLOW_SEG_HDR_SCTP)

#define IAVF_ADV_RSS_FLOW_SEG_HDR_GTP \
(IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC | \
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC_TEID| \
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_IP| \
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_EH| \
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_DWN| \
IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_UP)

enum iavf_adv_rss_flow_field {
/* L3 */
IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_SA,
Expand All @@ -46,6 +61,17 @@ enum iavf_adv_rss_flow_field {
IAVF_ADV_RSS_FLOW_FIELD_IDX_UDP_DST_PORT,
IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_SRC_PORT,
IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_DST_PORT,
/* GTPC_TEID */
IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPC_TEID,
/* GTPU_IP */
IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_IP_TEID,
/* GTPU_EH */
IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_EH_TEID,
IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_EH_QFI,
/* GTPU_UP */
IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_UP_TEID,
/* GTPU_DWN */
IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_DWN_TEID,

/* The total number of enums must not exceed 64 */
IAVF_ADV_RSS_FLOW_FIELD_IDX_MAX
Expand All @@ -72,6 +98,12 @@ enum iavf_adv_rss_flow_field {
BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_SRC_PORT)
#define IAVF_ADV_RSS_HASH_FLD_SCTP_DST_PORT \
BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_DST_PORT)
#define IAVF_ADV_RSS_HASH_FLD_GTPC_TEID BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPC_TEID)
#define IAVF_ADV_RSS_HASH_FLD_GTPU_IP_TEID BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_IP_TEID)
#define IAVF_ADV_RSS_HASH_FLD_GTPU_EH_TEID BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_EH_TEID)
#define IAVF_ADV_RSS_HASH_FLD_GTPU_UP_TEID BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_UP_TEID)
#define IAVF_ADV_RSS_HASH_FLD_GTPU_DWN_TEID \
BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_DWN_TEID)

/* bookkeeping of advanced RSS configuration */
struct iavf_adv_rss {
Expand Down
75 changes: 75 additions & 0 deletions drivers/net/ethernet/intel/iavf/iavf_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -1349,6 +1349,42 @@ static u32 iavf_adv_rss_parse_hdrs(struct ethtool_rxnfc *cmd)
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_SCTP |
IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6;
break;
case GTPU_V4_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_IP | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4;
break;
case GTPC_V4_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC | IAVF_ADV_RSS_FLOW_SEG_HDR_UDP | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4;
break;
case GTPC_TEID_V4_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC_TEID | IAVF_ADV_RSS_FLOW_SEG_HDR_UDP | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4;
break;
case GTPU_EH_V4_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_EH | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4;
break;
case GTPU_UL_V4_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_UP | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4;
break;
case GTPU_DL_V4_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_DWN | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4;
break;
case GTPU_V6_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_IP | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6;
break;
case GTPC_V6_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6;
break;
case GTPC_TEID_V6_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC_TEID | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6;
break;
case GTPU_EH_V6_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_EH | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6;
break;
case GTPU_UL_V6_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_UP | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6;
break;
case GTPU_DL_V6_FLOW:
hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_DWN | IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6;
break;
default:
break;
}
Expand All @@ -1373,6 +1409,12 @@ static u64 iavf_adv_rss_parse_hash_flds(struct ethtool_rxnfc *cmd, bool symm)
case TCP_V4_FLOW:
case UDP_V4_FLOW:
case SCTP_V4_FLOW:
case GTPU_V4_FLOW:
case GTPC_V4_FLOW:
case GTPC_TEID_V4_FLOW:
case GTPU_EH_V4_FLOW:
case GTPU_UL_V4_FLOW:
case GTPU_DL_V4_FLOW:
if (cmd->data & RXH_IP_SRC)
hfld |= IAVF_ADV_RSS_HASH_FLD_IPV4_SA;
if (cmd->data & RXH_IP_DST)
Expand All @@ -1381,6 +1423,12 @@ static u64 iavf_adv_rss_parse_hash_flds(struct ethtool_rxnfc *cmd, bool symm)
case TCP_V6_FLOW:
case UDP_V6_FLOW:
case SCTP_V6_FLOW:
case GTPU_V6_FLOW:
case GTPC_V6_FLOW:
case GTPC_TEID_V6_FLOW:
case GTPU_EH_V6_FLOW:
case GTPU_UL_V6_FLOW:
case GTPU_DL_V6_FLOW:
if (cmd->data & RXH_IP_SRC)
hfld |= IAVF_ADV_RSS_HASH_FLD_IPV6_SA;
if (cmd->data & RXH_IP_DST)
Expand All @@ -1402,6 +1450,7 @@ static u64 iavf_adv_rss_parse_hash_flds(struct ethtool_rxnfc *cmd, bool symm)
break;
case UDP_V4_FLOW:
case UDP_V6_FLOW:
case GTPC_V4_FLOW:
if (cmd->data & RXH_L4_B_0_1)
hfld |= IAVF_ADV_RSS_HASH_FLD_UDP_SRC_PORT;
if (cmd->data & RXH_L4_B_2_3)
Expand All @@ -1418,6 +1467,32 @@ static u64 iavf_adv_rss_parse_hash_flds(struct ethtool_rxnfc *cmd, bool symm)
break;
}
}
if (cmd->data & RXH_GTP_TEID) {
switch (cmd->flow_type) {
case GTPC_TEID_V4_FLOW:
case GTPC_TEID_V6_FLOW:
hfld |= IAVF_ADV_RSS_HASH_FLD_GTPC_TEID;
break;
case GTPU_V4_FLOW:
case GTPU_V6_FLOW:
hfld |= IAVF_ADV_RSS_HASH_FLD_GTPU_IP_TEID;
break;
case GTPU_EH_V4_FLOW:
case GTPU_EH_V6_FLOW:
hfld |= IAVF_ADV_RSS_HASH_FLD_GTPU_EH_TEID;
break;
case GTPU_UL_V4_FLOW:
case GTPU_UL_V6_FLOW:
hfld |= IAVF_ADV_RSS_HASH_FLD_GTPU_UP_TEID;
break;
case GTPU_DL_V4_FLOW:
case GTPU_DL_V6_FLOW:
hfld |= IAVF_ADV_RSS_HASH_FLD_GTPU_DWN_TEID;
break;
default:
break;
}
}

return hfld;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/intel/iavf/iavf_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ static int iavf_check_reset_complete(struct iavf_hw *hw);

char iavf_driver_name[] = "iavf";
static const char iavf_driver_string[] =
"Intel(R) Ethernet Adaptive Virtual Function Network Driver";
"Intel(R) Ethernet Adaptive Virtual Function Network Driver +GTP-Uv16";

static const char iavf_copyright[] =
"Copyright (c) 2013 - 2018 Intel Corporation.";
Expand Down