Network programming 英特尔XL710上每个端口的RSS(接收端缩放)

Network programming 英特尔XL710上每个端口的RSS(接收端缩放),network-programming,intel,dpdk,Network Programming,Intel,Dpdk,我很难使用使用DPDK的Intel XL710卡,使其在每个端口上仅使用SRC IPV4或DST IPV4计算RSS哈希。 该卡有4个10GE端口,无论我做什么,RSS配置都是全局的。我试图在PCTYPE中设置SRC/DST IPV4字段,而上次应用的配置只起作用 所以我想要达到的行为 假设上游数据包已到达端口0: SRC:10.10.10.1和DST:10.10.10.2 并回复到达端口1的下游数据包: SRC:10.10.10.2和DST:10.10.10.1 我希望卡上的端口0(在我们的情

我很难使用使用DPDK的Intel XL710卡,使其在每个端口上仅使用SRC IPV4或DST IPV4计算RSS哈希。 该卡有4个10GE端口,无论我做什么,RSS配置都是全局的。我试图在PCTYPE中设置SRC/DST IPV4字段,而上次应用的配置只起作用

所以我想要达到的行为

假设上游数据包已到达端口0:

SRC:10.10.10.1DST:10.10.10.2

并回复到达端口1的下游数据包:

SRC:10.10.10.2DST:10.10.10.1

我希望卡上的端口0(在我们的情况下是上游)根据SRC地址10.10.10.1计算RSS散列,对于端口1(在我们的情况下是下游),使用DST地址计算散列,在我们的情况下也是10.10.10.1。因此,我们的想法是在RX队列之间分发数据包,这样,只有SRC/DST地址分别影响这种分发

我并不特别喜欢RSS。如果技术允许实现这一点,它将做什么

我使用的配置:

void setFilter(uint16_t portId, uint32_t value){

//Value = RTE_ETH_FLOW_NONFRAG_IPV4_TCP in that case

struct rte_eth_hash_filter_info info;
uint32_t ftype, idx, offset;
int ret;

if (rte_eth_dev_filter_supported(portId,
            RTE_ETH_FILTER_HASH) < 0) {
    printf("RTE_ETH_FILTER_HASH not supported on port %d\n",
                        portId);
    return;
}

memset(&info, 0, sizeof(info));
info.info_type = RTE_ETH_HASH_FILTER_GLOBAL_CONFIG;
info.info.global_conf.hash_func =
  RTE_ETH_HASH_FUNCTION_DEFAULT;

ftype = value;
idx = ftype / UINT64_BIT;
offset = ftype % UINT64_BIT;
info.info.global_conf.valid_bit_mask[idx] |= (1ULL << offset);
info.info.global_conf.sym_hash_enable_mask[idx] |=
  (1ULL << offset);
ret = rte_eth_dev_filter_ctrl(portId, RTE_ETH_FILTER_HASH,
                RTE_ETH_FILTER_SET, &info);
if (ret < 0)
    printf("Cannot set global hash configurations by port %d\n",
                        portId);
else
    printf("Global hash configurations have been set "
           "succcessfully by port %d\n", portId);
}

void setPctypeRss(uint16_t portId, uint16_t fieldIdx) {

/* Note that AVF_FILTER_PCTYPE_NONF_IPV4_TCP is define for
 * Virtual Function. Defines are the same for Physical Functions
 */
int ret = -ENOTSUP;

enum rte_pmd_i40e_inset_type inset_type = INSET_HASH;
struct rte_pmd_i40e_inset inset;

ret = rte_pmd_i40e_inset_get(portId, AVF_FILTER_PCTYPE_NONF_IPV4_TCP,
                             &inset, inset_type);

if (ret) {
    printf("Failed to get input set.\n");
    return;
}

memset(&inset, 0, sizeof(inset));

ret = rte_pmd_i40e_inset_set(portId, AVF_FILTER_PCTYPE_NONF_IPV4_TCP,
                 &inset, inset_type);

if (ret) {
    printf("Failed to CLEAR input set.\n");
    return;
}
else
{
    printf("Successfull cleared input set\n");
}

ret = rte_pmd_i40e_inset_get(portId, AVF_FILTER_PCTYPE_NONF_IPV4_TCP,
                 &inset, inset_type);
if (ret) {
    printf("Failed to get input set.\n");
    return;
}

ret = rte_pmd_i40e_inset_field_set(&inset.inset, fieldIdx);

if (ret) {
    printf("Failed to configure input set field.\n");
    return;
}

ret = rte_pmd_i40e_inset_set(portId, AVF_FILTER_PCTYPE_NONF_IPV4_TCP,
                 &inset, inset_type);
if (ret) {
    printf("Failed to set input set.\n");
    return;
}

if (ret == -ENOTSUP)
    printf("Function not supported\n");
}
void setFilter(uint16\u t portId,uint32\u t值){
//在这种情况下,Value=RTE\u ETH\u FLOW\u NONFRAG\u IPV4\u TCP
结构rte_eth_hash_filter_info;
uint32_t ftype,idx,offset;
int ret;
如果(rte_eth_dev_filter_)受支持(portId,
RTE_ETH_FILTER_HASH)<0){
printf(“端口%d上不支持RTE\u ETH\u筛选器\u哈希”,
portId);
返回;
}
memset(&info,0,sizeof(info));
info.info_type=RTE_ETH_HASH_FILTER_GLOBAL_CONFIG;
info.info.global\u conf.hash\u func=
RTE_ETH_HASH_函数_默认值;
ftype=值;
idx=F类型/UINT64_位;
偏移量=F类型%UINT64_位;

info.info.global_conf.valid_bit_mask[idx]|=(1allIMO值得尝试一种更简单的解决方案。我们只需使用
rte_eth_dev_configure()

只需将
eth_conf.rss_conf.rss_hf
设置为
eth_rss_IP
,如下所述:


DPDK中使用此功能的示例很少,而且大多数都可以正常工作;)

RSS是一种方式。向我们展示您迄今为止尝试过的配置吗?@Andriyberestovsky添加了配置代码,希望能帮助感谢回复!我也尝试过该配置,但它不允许在NIC上的每个物理端口上使用IPV4头的不同字段进行RSS哈希计算。您只能使其对称,但似乎没有强制RSS计算物理端口0(至少在XL710上使用SRC)和物理端口1(至少在XL710上使用DST)的哈希值的方法。@Toozyfuzz有效吗?是否创建每服务器本地状态结构?不,它会影响所有端口=(我需要它,因为我的设备有“客户端”在此设备上配置的由其IPV4标识的实体。因此,我希望将具有该IPV4的所有流定向到同一lcore进行处理。设备具有该“客户端”的负载,每个“客户端”具有唯一的IPV4“RSS字段选择是全局性的,不能针对每个PF或VF进行不同的配置。”来源:我不确定您有多少个客户端,但请注意Flow Director有其自身的限制…我想最可靠和可移植的解决方案应该是一个软件分发服务器,即一个专用的核心,用于数据包分类并转发到特定的RX队列,以便其他核心进行处理。除非对称RSS适合您的需要。。。