summaryrefslogtreecommitdiff
path: root/service/src/phydev.c
diff options
context:
space:
mode:
Diffstat (limited to 'service/src/phydev.c')
-rw-r--r--service/src/phydev.c79
1 files changed, 50 insertions, 29 deletions
diff --git a/service/src/phydev.c b/service/src/phydev.c
index fb8e27e..8c83082 100644
--- a/service/src/phydev.c
+++ b/service/src/phydev.c
@@ -145,32 +145,43 @@ static int gen_phydev_qconf(struct phydev * dev, struct rte_eth_rxconf * rxconf,
}
/* 用户参数解析:网卡参数设置 */
-static int gen_phydev_ethconf(struct phydev * dev, struct rte_eth_conf * out_eth_conf)
+static int gen_phydev_ethconf(struct phydev *dev, struct rte_eth_conf *out_eth_conf)
{
struct rte_eth_conf eth_conf = eth_conf_default;
- // 配置RSS模式
- if (dev->info.rssmode == MR_DEV_RSSMODE_2TUPLE_SYM)
+ if (dev->info.type == __PHYDEV_INFO_TYPE_PCI)
{
- eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_IP;
- eth_conf.rx_adv_conf.rss_conf.rss_key = default_sym_rss_key;
- eth_conf.rx_adv_conf.rss_conf.rss_key_len = sizeof(default_sym_rss_key);
- }
- else if (dev->info.rssmode == MR_DEV_RSSMODE_4TUPLE_SYM)
- {
- eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP
- | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP;
- eth_conf.rx_adv_conf.rss_conf.rss_key = default_sym_rss_key;
- eth_conf.rx_adv_conf.rss_conf.rss_key_len = sizeof(default_sym_rss_key);
+ /* only PCI devices can run at RSS mode. */
+ eth_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
+
+ /* setup how nics distributes packets */
+ if (dev->info.rssmode == MR_DEV_RSSMODE_2TUPLE_SYM)
+ {
+ eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_IP;
+ eth_conf.rx_adv_conf.rss_conf.rss_key = default_sym_rss_key;
+ eth_conf.rx_adv_conf.rss_conf.rss_key_len = sizeof(default_sym_rss_key);
+ }
+ else if (dev->info.rssmode == MR_DEV_RSSMODE_4TUPLE_SYM)
+ {
+ eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP |
+ ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP;
+ eth_conf.rx_adv_conf.rss_conf.rss_key = default_sym_rss_key;
+ eth_conf.rx_adv_conf.rss_conf.rss_key_len = sizeof(default_sym_rss_key);
+ }
+ else if (dev->info.rssmode == MR_DEV_RSSMODE_4TUPLE_ASYM)
+ {
+ eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP |
+ ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP;
+ eth_conf.rx_adv_conf.rss_conf.rss_key = NULL;
+ }
}
- else if (dev->info.rssmode == MR_DEV_RSSMODE_4TUPLE_ASYM)
+ else if (dev->info.type == __PHYDEV_INFO_TYPE_VDEV)
{
- eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP
- | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP;
- eth_conf.rx_adv_conf.rss_conf.rss_key = NULL;
+ /* the vdevs is not support multi-queues loadbalance by hardware */
+ eth_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
}
- if(dev->info.en_vlan_strip)
+ if (dev->info.en_vlan_strip)
{
eth_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
}
@@ -671,43 +682,53 @@ static int phydev_scan_raw_socket(struct sc_main * sc, struct phydev_main * phyd
}
#endif
-#if 0
/* VIRTIO Devices */
-static int phydev_scan_virtio_user(struct sc_main * sc, struct phydev_main * phydev_main)
+static int phydev_scan_virtio_user(struct sc_main *sc, struct phydev_main *phydev_main)
{
char virtio_syms[MR_SYMBOL_MAX][MR_PHYDEV_MAX] = {{0}};
unsigned int nr_virtio_syms = 0;
phydev_query_device_list(sc, "virtio_user", virtio_syms, &nr_virtio_syms);
- if(nr_virtio_syms < 0)
+ if (nr_virtio_syms < 0)
{
return RT_SUCCESS;
}
- for(int i = 0; i < nr_virtio_syms; i++)
+ for (int i = 0; i < nr_virtio_syms; i++)
{
uint16_t port_id;
- char str_attach_args[MR_STRING_MAX];
- snprintf(str_attach_args, sizeof(str_attach_args),
- "virtio_user%d,queues=%d,path=/run/usvhost/usvhost%d", i, sc->nr_serv_thread, i);
+ char vdev_name[MR_STRING_MAX];
+ snprintf(vdev_name, sizeof(vdev_name) - 1, "virtio_user%d", i);
- int ret = rte_eth_dev_attach(str_attach_args, &port_id);
+ char vdev_args[MR_STRING_MAX];
+ snprintf(vdev_args, sizeof(vdev_args) - 1, "queues=%d,queue_size=1024,path=/dev/vhost-net", sc->nr_serv_thread);
+
+ int ret = rte_eal_hotplug_add("vdev", vdev_name, vdev_args);
if (ret < 0)
{
MR_ERROR("Attaching virtio-user device %s failed, Errno = %d", virtio_syms[i], ret);
return RT_ERR;
}
- struct phydev * phydev = phydev_alloc(phydev_main, port_id);
+ ret = rte_eth_dev_get_port_by_name(vdev_name, &port_id);
+ if (ret < 0)
+ {
+ rte_eal_hotplug_remove("vdev", vdev_name);
+ MR_ERROR("Cannot find added vdev %s failed, Errno = %d", virtio_syms[i], ret);
+ return RT_ERR;
+ }
+
+ struct phydev *phydev = phydev_alloc(phydev_main, port_id);
snprintf(phydev->symbol, sizeof(phydev->symbol), "%s", virtio_syms[i]);
snprintf(phydev->info.symbol, sizeof(phydev->info.symbol), "%s", virtio_syms[i]);
+
+ phydev->info.type= __PHYDEV_INFO_TYPE_VDEV;
phydev->port_id = port_id;
}
return RT_SUCCESS;
}
-#endif
static struct rte_pci_device * __dev_info_to_pci_dev(struct rte_eth_dev_info * dev_info)
{
@@ -854,13 +875,13 @@ int phydev_init(struct sc_main * sc)
MR_ERROR("Physical device in raw socket scan failed.");
return RT_ERR;
}
+#endif
if (phydev_scan_virtio_user(sc, sc->phydev_main) < 0)
{
MR_ERROR("Physical device in virtio-user scan failed.");
return RT_ERR;
}
-#endif
struct phydev * phydev_iter;
TAILQ_FOREACH(phydev_iter, &sc->phydev_main->device_list, next)