diff options
| author | Lu Qiuwen <[email protected]> | 2018-10-30 11:20:29 +0800 |
|---|---|---|
| committer | Lu Qiuwen <[email protected]> | 2018-10-30 11:20:29 +0800 |
| commit | b71c010ebe2f6a60bc5a9f6e4762db45ab4ce7c8 (patch) | |
| tree | 51a40ca399abea40eadf2a6e83a55f1ec8a0d3f2 | |
| parent | 2e5e768c8008a956309fdc6cf819bbcbf2c48a2e (diff) | |
适配fm10k网卡,增加从参数中读取jumbo选项等功能
| -rw-r--r-- | cmake/Package.cmake | 13 | ||||
| -rw-r--r-- | service/include/sc_phydev.h | 7 | ||||
| -rw-r--r-- | service/src/phydev.c | 739 |
3 files changed, 387 insertions, 372 deletions
diff --git a/cmake/Package.cmake b/cmake/Package.cmake index ee1fca6..37ea68a 100644 --- a/cmake/Package.cmake +++ b/cmake/Package.cmake @@ -23,10 +23,8 @@ set(CPACK_RPM_DEBUGINFO_PACKAGE on) set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/cmake/PostInstall.in) set(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/cmake/PostUninstall.in) set(CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/cmake/PreUninstall.in) -#set(CPACK_RPM_PACKAGE_REQUIRES "/boot/vmlinuz-${MARSIO_VERSION_KERNEL}") # Must uninstall the debug package before install release package - if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(CPACK_RPM_PACKAGE_CONFLICTS "mrzcpd") else() @@ -34,14 +32,7 @@ else() endif() # setup %config(noreplace) -set(CPACK_RPM_USER_FILELIST "/usr/lib/systemd/system/mrenv.service" - "/usr/lib/systemd/system/mrzcpd.service" - "/usr/lib/systemd/system/mrtunnat.service" - "/usr/lib/systemd/system/mrmonit.service" - "/etc/ld.so.conf.d/mrzcpd.conf" - "/etc/profile.d/mrzcpd.sh" - "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig/mrzcpd.pc" - "%config(noreplace) ${CMAKE_INSTALL_PREFIX}/etc/mrglobal.conf" +set(CPACK_RPM_USER_FILELIST "%config(noreplace) ${CMAKE_INSTALL_PREFIX}/etc/mrglobal.conf" "%config(noreplace) ${CMAKE_INSTALL_PREFIX}/etc/mrtunnat.conf" "%config(noreplace) /etc/sysconfig/mrzcpd") -include(CPack)
\ No newline at end of file +include(CPack) diff --git a/service/include/sc_phydev.h b/service/include/sc_phydev.h index bbb3cad..a0951f2 100644 --- a/service/include/sc_phydev.h +++ b/service/include/sc_phydev.h @@ -65,6 +65,11 @@ struct phydev_info /* For vdev device */ char vdev_devconfig[MR_STRING_MAX]; }; + + /* FM10K */ + unsigned int jumbo_frame; + unsigned int max_rx_pkt_len; + unsigned int clear_tx_flags; }; struct phydev_param @@ -217,4 +222,4 @@ void phydev_stat_last_get(struct phydev * phydev, struct phydev_stat * phydev_st #ifdef __cplusplus } -#endif
\ No newline at end of file +#endif diff --git a/service/src/phydev.c b/service/src/phydev.c index 22bf4c5..ae3f2a5 100644 --- a/service/src/phydev.c +++ b/service/src/phydev.c @@ -23,45 +23,46 @@ #include <cJSON.h> static struct rte_eth_conf eth_conf_default = { - .rxmode = - { - .mq_mode = ETH_MQ_RX_RSS, - .split_hdr_size = 0, - .header_split = 0, /**< Header Split disabled */ - .hw_ip_checksum = 0, /**< IP checksum offload enabled */ - .hw_vlan_filter = 0, /**< VLAN filtering disabled */ - .jumbo_frame = 0, /**< Jumbo Frame Support disabled */ - .hw_strip_crc = 0, /**< CRC stripped by hardware */ - }, - - .rx_adv_conf = { - .rss_conf = - { - .rss_key = NULL, - .rss_hf = ETH_RSS_IP, - }, - }, - .txmode = - { - .mq_mode = ETH_MQ_TX_NONE, - } + .rxmode = + { + .mq_mode = ETH_MQ_RX_RSS, + .split_hdr_size = 0, + .header_split = 0, /**< Header Split disabled */ + .hw_ip_checksum = 0, /**< IP checksum offload enabled */ + .hw_vlan_filter = 0, /**< VLAN filtering disabled */ + .jumbo_frame = 0, /**< Jumbo Frame Support disabled */ + .hw_strip_crc = 0, /**< CRC stripped by hardware */ + }, + + .rx_adv_conf = { + .rss_conf = + { + .rss_key = NULL, + .rss_hf = ETH_RSS_IP, + }, + }, + .txmode = + { + .mq_mode = ETH_MQ_TX_NONE, + } }; static uint8_t default_sym_rss_key[40] = -{ - 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, - 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, - 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, - 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, - 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a -}; + { + 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, + 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, + 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, + 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, + 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a + }; -TAILQ_HEAD(phydev_list, phydev); +TAILQ_HEAD(phydev_list, phydev +); struct phydev_main { - struct phydev_list device_list; - struct phydev * rte_device[RTE_MAX_ETHPORTS]; + struct phydev_list device_list; + struct phydev * rte_device[RTE_MAX_ETHPORTS]; struct cJSON * j_hwfile; unsigned int en_early_scan; @@ -71,39 +72,39 @@ struct phydev_main const char * __str_rssmode(unsigned int rssmode) { - switch (rssmode) - { - case MR_DEV_RSSMODE_DEFAULT: return "Default"; - case MR_DEV_RSSMODE_2TUPLE_SYM: return "SAddr/DAddr(Sym)"; - case MR_DEV_RSSMODE_4TUPLE_SYM: return "SAddr/DAddr/SPort/DPort(Sym)"; - case MR_DEV_RSSMODE_4TUPLE_ASYM: return "SAddr/DAddr/SPort/DPort(Asym)"; - default: return "Unknown"; - } + switch (rssmode) + { + case MR_DEV_RSSMODE_DEFAULT: return "Default"; + case MR_DEV_RSSMODE_2TUPLE_SYM: return "SAddr/DAddr(Sym)"; + case MR_DEV_RSSMODE_4TUPLE_SYM: return "SAddr/DAddr/SPort/DPort(Sym)"; + case MR_DEV_RSSMODE_4TUPLE_ASYM: return "SAddr/DAddr/SPort/DPort(Asym)"; + default: return "Unknown"; + } } const char * __str_enable_or_disable(unsigned int value) { - if (value) return "ENABLE"; - else return "DISABLE"; + if (value) return "ENABLE"; + else return "DISABLE"; } static int phydev_info_dump(struct phydev * dev) { - char str_phy_addr[MR_SYMBOL_MAX]; - - ether_format_addr(str_phy_addr, sizeof(str_phy_addr), - &dev->info.phy_ether_addr); - - MR_INFO(" "); - MR_INFO("Physical Device %s: PortID = %d", dev->symbol, dev->port_id); - MR_INFO(" Physical Hwaddr : %s", str_phy_addr); - MR_INFO(" Maximum Transmission Unit : %u", dev->mtu); - MR_INFO(" Promisc : %s", __str_enable_or_disable(dev->promisc)); - MR_INFO(" VLAN-Filter : %s", __str_enable_or_disable(dev->en_vlan_filter)); - MR_INFO(" VLAN-Strip : %s", __str_enable_or_disable(dev->en_vlan_strip)); - MR_INFO(" Drop-En : %s", __str_enable_or_disable(dev->en_drop)); - MR_INFO(" RSSMode : %s", __str_rssmode(dev->info.rssmode)); - return 0; + char str_phy_addr[MR_SYMBOL_MAX]; + + ether_format_addr(str_phy_addr, sizeof(str_phy_addr), + &dev->info.phy_ether_addr); + + MR_INFO(" "); + MR_INFO("Physical Device %s: PortID = %d", dev->symbol, dev->port_id); + MR_INFO(" Physical Hwaddr : %s", str_phy_addr); + MR_INFO(" Maximum Transmission Unit : %u", dev->mtu); + MR_INFO(" Promisc : %s", __str_enable_or_disable(dev->promisc)); + MR_INFO(" VLAN-Filter : %s", __str_enable_or_disable(dev->en_vlan_filter)); + MR_INFO(" VLAN-Strip : %s", __str_enable_or_disable(dev->en_vlan_strip)); + MR_INFO(" Drop-En : %s", __str_enable_or_disable(dev->en_drop)); + MR_INFO(" RSSMode : %s", __str_rssmode(dev->info.rssmode)); + return 0; } /* 虚设备用户配置查询 */ @@ -111,14 +112,14 @@ static int phydev_query_device_list(struct sc_main * sc, const char * str_vdev_t char vdevsyms[MR_SYMBOL_MAX][MR_PHYDEV_MAX], unsigned int * nr_vdevsyms) { char str_direct_devices[MR_STRING_MAX]; - int ret = MESA_load_profile_string_nodef(sc->local_cfgfile, "device", str_vdev_type, - str_direct_devices, sizeof(str_direct_devices)); + int ret = MESA_load_profile_string_nodef(sc->local_cfgfile, "device", str_vdev_type, + str_direct_devices, sizeof(str_direct_devices)); - if (ret < 0) - { - *nr_vdevsyms = 0; - return RT_SUCCESS; - } + if (ret < 0) + { + *nr_vdevsyms = 0; + return RT_SUCCESS; + } char * str_vdev_symbol[MR_TOKENS_MAX]; int nr_str_tokens = rte_strsplit(str_direct_devices, sizeof(str_direct_devices), @@ -136,145 +137,155 @@ static int phydev_query_device_list(struct sc_main * sc, const char * str_vdev_t /* 用户参数解析:网卡队列参数设置 */ static int gen_phydev_qconf(struct phydev * dev, struct rte_eth_rxconf * rxconf, - struct rte_eth_txconf * txconf, unsigned int * nr_rxdesc, unsigned int * nr_txdesc) + struct rte_eth_txconf * txconf, unsigned int * nr_rxdesc, unsigned int * nr_txdesc) { - // 获取默认的RX、TX队列设置 - struct rte_eth_dev_info rte_dev_info; - rte_eth_dev_info_get(dev->port_id, &rte_dev_info); - - // 复制默认配置 - *rxconf = rte_dev_info.default_rxconf; - *txconf = rte_dev_info.default_txconf; - - // Drop-En开关设置,丢弃处理不过来的包 - rxconf->rx_drop_en = dev->info.en_drop; - // 清空txconf中的标志位 - //txconf->txq_flags = 0; - dev->en_drop = rxconf->rx_drop_en; - - *nr_rxdesc = dev->info.nr_rx_desc; - *nr_txdesc = dev->info.nr_tx_desc; - return 0; + // 获取默认的RX、TX队列设置 + struct rte_eth_dev_info rte_dev_info; + rte_eth_dev_info_get(dev->port_id, &rte_dev_info); + + // 复制默认配置 + *rxconf = rte_dev_info.default_rxconf; + *txconf = rte_dev_info.default_txconf; + + // Drop-En开关设置,丢弃处理不过来的包 + rxconf->rx_drop_en = dev->info.en_drop; + + // 清空txconf中的标志位 + if(dev->info.clear_tx_flags > 0) + { + txconf->txq_flags = 0; + } + + dev->en_drop = rxconf->rx_drop_en; + + *nr_rxdesc = dev->info.nr_rx_desc; + *nr_txdesc = dev->info.nr_tx_desc; + return 0; } /* 用户参数解析:网卡参数设置 */ 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) - { - 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_PROTO_MASK; - 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_PROTO_MASK; - eth_conf.rx_adv_conf.rss_conf.rss_key = NULL; - } - - // 配置VLAN相关功能 - eth_conf.rxmode.hw_vlan_filter = dev->info.en_vlan_filter; - eth_conf.rxmode.hw_vlan_strip = dev->info.en_vlan_strip; - dev->en_vlan_strip = eth_conf.rxmode.hw_vlan_strip; - dev->en_vlan_filter = eth_conf.rxmode.hw_vlan_filter; - - *out_eth_conf = eth_conf; - return 0; + struct rte_eth_conf eth_conf = eth_conf_default; + + // 配置RSS模式 + 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_PROTO_MASK; + 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_PROTO_MASK; + eth_conf.rx_adv_conf.rss_conf.rss_key = NULL; + } + + // 配置VLAN相关功能 + eth_conf.rxmode.hw_vlan_filter = dev->info.en_vlan_filter; + eth_conf.rxmode.hw_vlan_strip = dev->info.en_vlan_strip; + dev->en_vlan_strip = eth_conf.rxmode.hw_vlan_strip; + dev->en_vlan_filter = eth_conf.rxmode.hw_vlan_filter; + + if (dev->info.jumbo_frame > 0) eth_conf.rxmode.jumbo_frame = 1; + if (dev->info.max_rx_pkt_len > 0) eth_conf.rxmode.max_rx_pkt_len = dev->info.max_rx_pkt_len; + + *out_eth_conf = eth_conf; + return 0; } static int calc_phydev_queue(struct phydev * dev, unsigned int * out_rxq, - unsigned int * out_txq) + unsigned int * out_txq) { - unsigned int rxq_use = 0; - unsigned int txq_use = 0; - -#define _(_type, _nr_q, _dir, _counter) \ -do { \ - dev->qgroup[_type].qgroup_type = _type; \ - dev->qgroup[_type].nr_q_max = _nr_q; \ - dev->qgroup[_type].dir = _dir; \ - \ - for(int i = 0; i < _nr_q; i++) \ - dev->qgroup[_type].qinfo[i].queue_id = _counter++; \ + unsigned int rxq_use = 0; + unsigned int txq_use = 0; + +#define _(_type, _nr_q, _dir, _counter) \ +do { \ + dev->qgroup[_type].qgroup_type = _type; \ + dev->qgroup[_type].nr_q_max = _nr_q; \ + dev->qgroup[_type].dir = _dir; \ + \ + for(int i = 0; i < _nr_q; i++) \ + dev->qgroup[_type].qinfo[i].queue_id = _counter++; \ } while(0) - _(QGROUP_TYPE_RSS_RX, dev->nr_rxq, QINFO_DIR_RX, rxq_use); - _(QGROUP_TYPE_RSS_TX, dev->nr_txq, QINFO_DIR_TX, txq_use); + _(QGROUP_TYPE_RSS_RX, dev->nr_rxq, QINFO_DIR_RX, rxq_use); + _(QGROUP_TYPE_RSS_TX, dev->nr_txq, QINFO_DIR_TX, txq_use); #undef _ - // 后面可以继续添加别的类型的队列,物理队列序号顺序排布 - // 至少要有一个收、发队列,否则无法通过初始化 - *out_rxq = rxq_use > 0 ? rxq_use : 1; - *out_txq = txq_use > 0 ? txq_use : 1; - return 0; + // 后面可以继续添加别的类型的队列,物理队列序号顺序排布 + // 至少要有一个收、发队列,否则无法通过初始化 + *out_rxq = rxq_use > 0 ? rxq_use : 1; + *out_txq = txq_use > 0 ? txq_use : 1; + return 0; } -static int phydev_setup(struct sc_main * sc, - struct phydev_main * ctx, struct phydev * dev) +static int phydev_setup(struct sc_main * sc, + struct phydev_main * ctx, struct phydev * dev) { - int retval = 0; - socket_id_t socket_id = rte_eth_dev_socket_id(dev->port_id); - - struct rte_mempool * direct_pool = mrb_direct_mempool_locate( - sc->mrb_pool_main, dev->str_direct_pool, socket_id, 0); - struct rte_mempool * indirect_pool = mrb_indirect_mempool_locate( - sc->mrb_pool_main, dev->str_indirect_pool, socket_id, 0); - - if(direct_pool == NULL || indirect_pool == NULL) - { - MR_ERROR("Physical device %s setup failed: Cannot find suitable mempool" - " on socket %d, core %d", dev->symbol, socket_id, 0); - return RT_ERR; - } - - // 配置端口信息 - struct rte_eth_conf local_eth_conf; - gen_phydev_ethconf(dev, &local_eth_conf); - - unsigned nr_rxq_use = 0; - unsigned nr_txq_use = 0; - - // TODO: 目前实现按每个服务线程处理一个队列考虑 - dev->nr_rxq = mask_popcnt(sc->cpu_mask); - dev->nr_txq = mask_popcnt(sc->cpu_mask); - calc_phydev_queue(dev, &nr_rxq_use, &nr_txq_use); - - retval = rte_eth_dev_configure(dev->port_id, nr_rxq_use, - nr_txq_use, &local_eth_conf); - - if (retval != 0) - { - MR_ERROR("Physical device %s configure error: %s, errno = %d", dev->symbol, - strerror(retval), retval); return retval; - } - - // 配置队列信息 - unsigned int nr_rxdesc; - unsigned int nr_txdesc; - struct rte_eth_rxconf rxconf; - struct rte_eth_txconf txconf; - gen_phydev_qconf(dev, &rxconf, &txconf, &nr_rxdesc, &nr_txdesc); - - for (int rxq = 0; rxq < nr_rxq_use; rxq++) - { - retval = rte_eth_rx_queue_setup(dev->port_id, rxq, - nr_rxdesc, socket_id, &rxconf, direct_pool); - - if (retval < 0) - { - MR_ERROR("Physical device %s RXQ %d setup failed, errno = %d", - dev->symbol, rxq, retval); return retval; - } + int retval = 0; + socket_id_t socket_id = rte_eth_dev_socket_id(dev->port_id); + + struct rte_mempool * direct_pool = mrb_direct_mempool_locate( + sc->mrb_pool_main, dev->str_direct_pool, socket_id, 0); + struct rte_mempool * indirect_pool = mrb_indirect_mempool_locate( + sc->mrb_pool_main, dev->str_indirect_pool, socket_id, 0); + + if (direct_pool == NULL || indirect_pool == NULL) + { + MR_ERROR("Physical device %s setup failed: Cannot find suitable mempool" + " on socket %d, core %d", dev->symbol, socket_id, 0); + return RT_ERR; + } + + // 配置端口信息 + struct rte_eth_conf local_eth_conf; + gen_phydev_ethconf(dev, &local_eth_conf); + + unsigned nr_rxq_use = 0; + unsigned nr_txq_use = 0; + + // TODO: 目前实现按每个服务线程处理一个队列考虑 + dev->nr_rxq = mask_popcnt(sc->cpu_mask); + dev->nr_txq = mask_popcnt(sc->cpu_mask); + calc_phydev_queue(dev, &nr_rxq_use, &nr_txq_use); + + retval = rte_eth_dev_configure(dev->port_id, nr_rxq_use, + nr_txq_use, &local_eth_conf); + + if (retval != 0) + { + MR_ERROR("Physical device %s configure error: %s, errno = %d", dev->symbol, + strerror(retval), retval); + return retval; + } + + // 配置队列信息 + unsigned int nr_rxdesc; + unsigned int nr_txdesc; + struct rte_eth_rxconf rxconf; + struct rte_eth_txconf txconf; + gen_phydev_qconf(dev, &rxconf, &txconf, &nr_rxdesc, &nr_txdesc); + + for (int rxq = 0; rxq < nr_rxq_use; rxq++) + { + retval = rte_eth_rx_queue_setup(dev->port_id, rxq, + nr_rxdesc, socket_id, &rxconf, direct_pool); + + if (retval < 0) + { + MR_ERROR("Physical device %s RXQ %d setup failed, errno = %d", + dev->symbol, rxq, retval); + return retval; + } retval = rte_eth_dev_set_rx_queue_stats_mapping(dev->port_id, rxq, rxq); if (retval < 0) @@ -282,19 +293,20 @@ static int phydev_setup(struct sc_main * sc, MR_WARNING("Physical device %s RXQ %d stat mapping setup failed. errno = %d", dev->symbol, rxq, retval); } - } - - for (int txq = 0; txq < nr_txq_use; txq++) - { - retval = rte_eth_tx_queue_setup(dev->port_id, txq, - nr_txdesc, socket_id, &txconf); - - if (retval < 0) - { - MR_ERROR("Physical device %s TXQ %d setup failed, errno = %d", - dev->symbol, txq, retval); return retval; - } - + } + + for (int txq = 0; txq < nr_txq_use; txq++) + { + retval = rte_eth_tx_queue_setup(dev->port_id, txq, + nr_txdesc, socket_id, &txconf); + + if (retval < 0) + { + MR_ERROR("Physical device %s TXQ %d setup failed, errno = %d", + dev->symbol, txq, retval); + return retval; + } + retval = rte_eth_dev_set_tx_queue_stats_mapping(dev->port_id, txq, txq); if (retval < 0) { @@ -303,15 +315,16 @@ static int phydev_setup(struct sc_main * sc, } } - retval = rte_eth_dev_start(dev->port_id); - if (retval < 0) - { - MR_ERROR("Physical device %s Start Error, Errno = %d(%s)", - dev->symbol, retval, strerror(-retval)); return retval; - } + retval = rte_eth_dev_start(dev->port_id); + if (retval < 0) + { + MR_ERROR("Physical device %s Start Error, Errno = %d(%s)", + dev->symbol, retval, strerror(-retval)); + return retval; + } - dev->nr_rxq = nr_rxq_use; - dev->nr_txq = nr_txq_use; + dev->nr_rxq = nr_rxq_use; + dev->nr_txq = nr_txq_use; /* 混杂模式设置 */ if (dev->promisc) rte_eth_promiscuous_enable(dev->port_id); @@ -322,102 +335,102 @@ static int phydev_setup(struct sc_main * sc, MR_WARNING("Physical device %s MTU setup failed : %s", dev->symbol, strerror(-retval)); } - rte_eth_dev_get_mtu(dev->port_id, &dev->mtu); + rte_eth_dev_get_mtu(dev->port_id, &dev->mtu); rte_eth_macaddr_get(dev->port_id, &dev->ether_addr); dev->promisc = rte_eth_promiscuous_get(dev->port_id); - - phydev_info_dump(dev); - dev->inited = 1; - dev->enable = 1; - return 0; + + phydev_info_dump(dev); + dev->inited = 1; + dev->enable = 1; + return 0; } int phydev_list(struct phydev_main * ctx, struct phydev * devs[], int nr_max_devs) { - struct phydev * dev_iter; - int nr_in_use = 0; + struct phydev * dev_iter; + int nr_in_use = 0; - TAILQ_FOREACH(dev_iter, &ctx->device_list, next) - { - if (nr_in_use >= nr_max_devs) break; - if (dev_iter->enable && dev_iter->inited) devs[nr_in_use++] = dev_iter; - } + TAILQ_FOREACH(dev_iter, &ctx->device_list, next) + { + if (nr_in_use >= nr_max_devs) break; + if (dev_iter->enable && dev_iter->inited) devs[nr_in_use++] = dev_iter; + } - return nr_in_use; + return nr_in_use; } int phydev_iterate(struct phydev_main * ctx, struct phydev ** phydev) { - // 迭代器为空,从头开始迭代,否则查找迭代器下一个对象 - if (*phydev == NULL) - { - *phydev = TAILQ_FIRST(&ctx->device_list); - } - else - { - *phydev = TAILQ_NEXT(*phydev, next); - } - - // 迭代到尾部,返回错误码 - if (*phydev == NULL) return -ENOENT; - return 0; + // 迭代器为空,从头开始迭代,否则查找迭代器下一个对象 + if (*phydev == NULL) + { + *phydev = TAILQ_FIRST(&ctx->device_list); + } + else + { + *phydev = TAILQ_NEXT(*phydev, next); + } + + // 迭代到尾部,返回错误码 + if (*phydev == NULL) return -ENOENT; + return 0; } struct phydev * phydev_lookup(struct phydev_main * ctx, const char * devsym) { - struct phydev * dev_iter = NULL; - struct phydev * dev_ret = NULL; - - TAILQ_FOREACH(dev_iter, &ctx->device_list, next) - { - if (strncmp(dev_iter->symbol, devsym, sizeof(dev_iter->symbol)) != 0) - continue; - - dev_ret = dev_iter; - break; - } - return dev_ret; + struct phydev * dev_iter = NULL; + struct phydev * dev_ret = NULL; + + TAILQ_FOREACH(dev_iter, &ctx->device_list, next) + { + if (strncmp(dev_iter->symbol, devsym, sizeof(dev_iter->symbol)) != 0) + continue; + + dev_ret = dev_iter; + break; + } + return dev_ret; } struct phydev * phydev_lookup_by_pci_addr(struct phydev_main * ctx, struct rte_pci_addr pci_addr) { - struct phydev * phydev_iter; - TAILQ_FOREACH(phydev_iter, &ctx->device_list, next) - { - if (phydev_iter->info.type == __PHYDEV_INFO_TYPE_PCI && - rte_eal_compare_pci_addr(&phydev_iter->info.pci_addr, &pci_addr) == 0) - { - return phydev_iter; - } - } - - return NULL; + struct phydev * phydev_iter; + TAILQ_FOREACH(phydev_iter, &ctx->device_list, next) + { + if (phydev_iter->info.type == __PHYDEV_INFO_TYPE_PCI && + rte_eal_compare_pci_addr(&phydev_iter->info.pci_addr, &pci_addr) == 0) + { + return phydev_iter; + } + } + + return NULL; } int phydev_use_queue(struct phydev * dev, enum phydev_qgroup_type q_type, queue_id_t * queue_out) { - struct phydev_qgroup * qgroup = &dev->qgroup[q_type]; - - for(int i = 0; i < qgroup->nr_q_max; i++) - { - if (qgroup->qinfo[i].in_use != 0) continue; - qgroup->qinfo[i].in_use = 1; - *queue_out = qgroup->qinfo[i].queue_id; - goto success; - } - - MR_ERROR("Phydev %s out of free queues(type = %d, total = %d), attach failed.\n", - dev->symbol, q_type, qgroup->nr_q_max); - return RT_ERR; - + struct phydev_qgroup * qgroup = &dev->qgroup[q_type]; + + for (int i = 0; i < qgroup->nr_q_max; i++) + { + if (qgroup->qinfo[i].in_use != 0) continue; + qgroup->qinfo[i].in_use = 1; + *queue_out = qgroup->qinfo[i].queue_id; + goto success; + } + + MR_ERROR("Phydev %s out of free queues(type = %d, total = %d), attach failed.\n", + dev->symbol, q_type, qgroup->nr_q_max); + return RT_ERR; + success: - return RT_SUCCESS; + return RT_SUCCESS; } void phydev_unuse_queue(struct phydev * dev, enum phydev_qgroup_type q_type, queue_id_t queue) { - struct phydev_qgroup * qgroup = &dev->qgroup[q_type]; - qgroup->qinfo[queue].in_use = 1; + struct phydev_qgroup * qgroup = &dev->qgroup[q_type]; + qgroup->qinfo[queue].in_use = 1; } /* \brief 物理设备名称数据解析 @@ -425,23 +438,23 @@ void phydev_unuse_queue(struct phydev * dev, enum phydev_qgroup_type q_type, que */ #ifndef PHYDEV_DEFAULT_NR_RX_DESC -#define PHYDEV_DEFAULT_NR_RX_DESC 2048 +#define PHYDEV_DEFAULT_NR_RX_DESC 2048 #endif #ifndef PHYDEV_DEFAULT_NR_TX_DESC -#define PHYDEV_DEFAULT_NR_TX_DESC 2048 +#define PHYDEV_DEFAULT_NR_TX_DESC 2048 #endif #ifndef PHYDEV_DEFAULT_EN_VLAN_FILTER -#define PHYDEV_DEFAULT_EN_VLAN_FILTER 0 +#define PHYDEV_DEFAULT_EN_VLAN_FILTER 0 #endif #ifndef PHYDEV_DEFAULT_EN_VLAN_STRIP -#define PHYDEV_DEFAULT_EN_VLAN_STRIP 0 +#define PHYDEV_DEFAULT_EN_VLAN_STRIP 0 #endif #ifndef PHYDEV_DEFAULT_EN_DROP -#define PHYDEV_DEFAULT_EN_DROP 0 +#define PHYDEV_DEFAULT_EN_DROP 0 #endif #ifndef PHYDEV_DEFAULT_PROMISC @@ -449,7 +462,7 @@ void phydev_unuse_queue(struct phydev * dev, enum phydev_qgroup_type q_type, que #endif #ifndef PHYDEV_DEFAULT_RSS_MODE -#define PHYDEV_DEFAULT_RSS_MODE MR_DEV_RSSMODE_2TUPLE_SYM +#define PHYDEV_DEFAULT_RSS_MODE MR_DEV_RSSMODE_2TUPLE_SYM #endif #ifndef PHYDEV_DEFAULT_EN_EARLY_SCAN @@ -464,23 +477,22 @@ void phydev_unuse_queue(struct phydev * dev, enum phydev_qgroup_type q_type, que #define PHYDEV_DEFAULT_EN_LOAD_G_CFG 1 #endif - struct phydev * phydev_alloc(struct phydev_main * phydev_main, unsigned int port_id) { - struct phydev * phydev = ZMALLOC(sizeof(struct phydev)); - MR_VERIFY_MALLOC(phydev); - - snprintf(phydev->symbol, sizeof(phydev->symbol), "meth%d", port_id); - phydev->info.en_drop = PHYDEV_DEFAULT_EN_DROP; - phydev->info.en_vlan_filter = PHYDEV_DEFAULT_EN_VLAN_FILTER; - phydev->info.en_vlan_strip = PHYDEV_DEFAULT_EN_VLAN_STRIP; - phydev->info.nr_rx_desc = PHYDEV_DEFAULT_NR_RX_DESC; - phydev->info.nr_tx_desc = PHYDEV_DEFAULT_NR_RX_DESC; - phydev->info.rssmode = PHYDEV_DEFAULT_RSS_MODE; + struct phydev * phydev = ZMALLOC(sizeof(struct phydev)); + MR_VERIFY_MALLOC(phydev); + + snprintf(phydev->symbol, sizeof(phydev->symbol), "meth%d", port_id); + phydev->info.en_drop = PHYDEV_DEFAULT_EN_DROP; + phydev->info.en_vlan_filter = PHYDEV_DEFAULT_EN_VLAN_FILTER; + phydev->info.en_vlan_strip = PHYDEV_DEFAULT_EN_VLAN_STRIP; + phydev->info.nr_rx_desc = PHYDEV_DEFAULT_NR_RX_DESC; + phydev->info.nr_tx_desc = PHYDEV_DEFAULT_NR_RX_DESC; + phydev->info.rssmode = PHYDEV_DEFAULT_RSS_MODE; phydev->promisc = PHYDEV_DEFAULT_PROMISC; - TAILQ_INSERT_TAIL(&phydev_main->device_list, phydev, next); - return phydev; + TAILQ_INSERT_TAIL(&phydev_main->device_list, phydev, next); + return phydev; } /* 从全局配置文件读硬件配置信息 */ @@ -493,7 +505,8 @@ void phydev_config_by_g_cfg(struct phydev * phydev, const char * cfg) // 读VLAN-Strip选项,默认不开启 MESA_load_profile_uint_def(cfg, str_section, "vlan-strip", &phydev_info->en_vlan_strip, phydev_info->en_vlan_strip); // 读VLAN-Filter选项,默认不开启 - MESA_load_profile_uint_def(cfg, str_section, "vlan-filter", &phydev_info->en_vlan_filter, phydev_info->en_vlan_filter); + MESA_load_profile_uint_def(cfg, str_section, "vlan-filter", &phydev_info->en_vlan_filter, + phydev_info->en_vlan_filter); // 丢包选项 MESA_load_profile_uint_def(cfg, str_section, "drop_en", &phydev_info->en_drop, phydev_info->en_drop); // 分流模式 @@ -502,28 +515,32 @@ void phydev_config_by_g_cfg(struct phydev * phydev, const char * cfg) MESA_load_profile_uint_def(cfg, str_section, "nr_rxdesc", &phydev_info->nr_rx_desc, phydev_info->nr_rx_desc); // TX描述符数量 MESA_load_profile_uint_def(cfg, str_section, "nr_txdesc", &phydev_info->nr_tx_desc, phydev_info->nr_tx_desc); - + // 读Jumbo选项 + MESA_load_profile_uint_def(cfg, str_section, "jumbo_frame", &phydev_info->jumbo_frame, 0); + // MAX-PKTLEN + MESA_load_profile_uint_def(cfg, str_section, "max_rx_pkt_len", &phydev_info->max_rx_pkt_len, 0); + // Clear Flags + MESA_load_profile_uint_def(cfg, str_section, "clear_tx_flags", &phydev_info->clear_tx_flags, 0); // 读MTU,网卡自适应。 - MESA_load_profile_short_def(cfg, str_section, "mtu", (short *)&phydev->mtu, (short)phydev->mtu); + MESA_load_profile_short_def(cfg, str_section, "mtu", (short *) &phydev->mtu, (short) phydev->mtu); // 读混杂模式 MESA_load_profile_uint_def(cfg, str_section, "promisc", &phydev->promisc, phydev->promisc); + // 读报文缓冲区名称 + memset(phydev->str_direct_pool, 0, sizeof(phydev->str_direct_pool)); + memset(phydev->str_indirect_pool, 0, sizeof(phydev->str_indirect_pool)); - // 读报文缓冲区名称 - memset(phydev->str_direct_pool, 0, sizeof(phydev->str_direct_pool)); - memset(phydev->str_indirect_pool, 0, sizeof(phydev->str_indirect_pool)); - - MESA_load_profile_string_def(cfg, str_section, "direct-pool", phydev->str_direct_pool, - sizeof(phydev->str_direct_pool), phydev->symbol); - MESA_load_profile_string_def(cfg, str_section, "indirect-pool", phydev->str_indirect_pool, - sizeof(phydev->str_indirect_pool), phydev->str_direct_pool); + MESA_load_profile_string_def(cfg, str_section, "direct-pool", phydev->str_direct_pool, + sizeof(phydev->str_direct_pool), phydev->symbol); + MESA_load_profile_string_def(cfg, str_section, "indirect-pool", phydev->str_indirect_pool, + sizeof(phydev->str_indirect_pool), phydev->str_direct_pool); - return; + return; } /* 早期设备扫描,从HWFILE中获取设备定义的信息 */ static int phydev_early_scan(struct sc_main * sc, struct phydev_main * phydev_main) { - return RT_SUCCESS; + return RT_SUCCESS; } static int phydev_adjust_info_by_hwfile(struct phydev_main * phydev_main, struct phydev * phydev) @@ -543,7 +560,8 @@ static int phydev_adjust_info_by_hwfile(struct phydev_main * phydev_main, struct MR_VERIFY(ret == 0); if (rte_eal_compare_pci_addr(&phydev->info.pci_addr, - &_local_pci_addr) != 0) continue; + &_local_pci_addr) != 0) + continue; /* 读内核名称、内核模块 */ cJSON * j_interface = cJSON_GetObjectItem(j_phydev, "Interface"); @@ -562,7 +580,7 @@ static int phydev_adjust_info_by_hwfile(struct phydev_main * phydev_main, struct static int phydev_scan_raw_socket(struct sc_main * sc, struct phydev_main * phydev_main) { /* 加载原始套接字设备配置 */ - char raw_devsyms[MR_SYMBOL_MAX][MR_PHYDEV_MAX] = { { 0 } }; + char raw_devsyms[MR_SYMBOL_MAX][MR_PHYDEV_MAX] = {{0}}; unsigned int nr_rawsyms = 0; phydev_query_device_list(sc, "rawsocket", raw_devsyms, &nr_rawsyms); @@ -574,14 +592,15 @@ static int phydev_scan_raw_socket(struct sc_main * sc, struct phydev_main * phyd uint8_t port_id; char str_attach_args[MR_STRING_MAX]; - snprintf(str_attach_args, sizeof(str_attach_args), + snprintf(str_attach_args, sizeof(str_attach_args), "net_af_packet%d,iface=%s,qpairs=%d", i, raw_devsyms[i], sc->nr_serv_thread); int ret = rte_eth_dev_attach(str_attach_args, &port_id); if (ret < 0) { - MR_ERROR("Attaching raw socket device %s failed, Errno = %d", - raw_devsyms[i], ret); return RT_ERR; + MR_ERROR("Attaching raw socket device %s failed, Errno = %d", + raw_devsyms[i], ret); + return RT_ERR; } struct phydev * phydev = phydev_alloc(phydev_main, port_id); @@ -596,52 +615,52 @@ static int phydev_scan_raw_socket(struct sc_main * sc, struct phydev_main * phyd /* 设备扫描,根据目前的设备启用情况修正物理设备链 */ static int phydev_scan_uio(struct phydev_main * phydev_main) { - unsigned int eth_dev_counts = rte_eth_dev_count(); + unsigned int eth_dev_counts = rte_eth_dev_count(); - /* 校验PCI设备 */ - for (port_id_t port_id = 0; port_id < eth_dev_counts; port_id++) - { - // 从网卡取硬件信息,包括最大收、发队列数 - struct rte_eth_dev_info dev_info; + /* 校验PCI设备 */ + for (port_id_t port_id = 0; port_id < eth_dev_counts; port_id++) + { + // 从网卡取硬件信息,包括最大收、发队列数 + struct rte_eth_dev_info dev_info; struct phydev * phydev = NULL; - rte_eth_dev_info_get(port_id, &dev_info); + rte_eth_dev_info_get(port_id, &dev_info); if (dev_info.pci_dev != NULL) { - phydev = phydev_lookup_by_pci_addr(phydev_main, + phydev = phydev_lookup_by_pci_addr(phydev_main, dev_info.pci_dev->addr); } - /* HWFILE里面没有定义,或虚拟设备 */ - if(phydev == NULL) phydev = phydev_alloc(phydev_main, port_id); - MR_VERIFY_MALLOC(phydev); + /* HWFILE里面没有定义,或虚拟设备 */ + if (phydev == NULL) phydev = phydev_alloc(phydev_main, port_id); + MR_VERIFY_MALLOC(phydev); - phydev->port_id = port_id; - phydev->info.nr_rxq_max = dev_info.max_rx_queues; - phydev->info.nr_txq_max = dev_info.max_tx_queues; - rte_eth_macaddr_get(phydev->port_id, &phydev->info.phy_ether_addr); - rte_eth_dev_get_mtu(phydev->port_id, &phydev->info.default_mtu); + phydev->port_id = port_id; + phydev->info.nr_rxq_max = dev_info.max_rx_queues; + phydev->info.nr_txq_max = dev_info.max_tx_queues; + rte_eth_macaddr_get(phydev->port_id, &phydev->info.phy_ether_addr); + rte_eth_dev_get_mtu(phydev->port_id, &phydev->info.default_mtu); //TODO: 处理DPDK的虚设备 if (dev_info.pci_dev != NULL) { phydev->info.pci_addr = dev_info.pci_dev->addr; } - - char str_macaddr[MR_SYMBOL_MAX]; - ether_format_addr(str_macaddr, sizeof(str_macaddr), &phydev->info.phy_ether_addr); + + char str_macaddr[MR_SYMBOL_MAX]; + ether_format_addr(str_macaddr, sizeof(str_macaddr), &phydev->info.phy_ether_addr); phydev_adjust_info_by_hwfile(phydev_main, phydev); - MR_DEBUG("PCI device scan: physical device %s, PORT_ID=%d, MAC: %s", - phydev->symbol, port_id, str_macaddr); - } + MR_DEBUG("PCI device scan: physical device %s, PORT_ID=%d, MAC: %s", + phydev->symbol, port_id, str_macaddr); + } - return RT_SUCCESS; + return RT_SUCCESS; } static int phydev_hwfile_load(struct phydev_main * phydev_main, const char * hwfile) { - FILE *f = fopen(hwfile, "rb"); + FILE * f = fopen(hwfile, "rb"); if (f == NULL) { MR_ERROR("Cannot open hardware file %s: %s", hwfile, strerror(errno)); @@ -652,7 +671,7 @@ static int phydev_hwfile_load(struct phydev_main * phydev_main, const char * hwf long fsize = ftell(f); fseek(f, 0, SEEK_SET); //same as rewind(f); - char *string = malloc(fsize + 1); + char * string = malloc(fsize + 1); MR_VERIFY_MALLOC(string); /* 读文件 */ @@ -680,11 +699,11 @@ int phydev_early_init(struct sc_main * sc) /* EAL环境还没有初始化,用malloc申请内存 */ sc->phydev_main = malloc(sizeof(struct phydev_main)); MR_VERIFY_MALLOC(sc->phydev_main); - + struct phydev_main * phydev_main = sc->phydev_main; - memset(phydev_main, 0, sizeof(struct phydev_main)); + memset(phydev_main, 0, sizeof(struct phydev_main)); TAILQ_INIT(&sc->phydev_main->device_list); - + /* 选项:是否启用早期设备扫描 */ MESA_load_profile_uint_def(sc->local_cfgfile, "phydev", "early_scan_enable", &phydev_main->en_early_scan, PHYDEV_DEFAULT_EN_EARLY_SCAN); @@ -698,7 +717,6 @@ int phydev_early_init(struct sc_main * sc) return phydev_main->en_early_scan ? phydev_early_scan(sc, phydev_main) : 0; } - void phydev_deinit(struct sc_main * sc) { for (unsigned int port_id = 0; port_id < rte_eth_dev_count(); port_id++) @@ -718,26 +736,26 @@ int phydev_init(struct sc_main * sc) { if (sc->phydev_main->en_load_hwfile) phydev_hwfile_load(sc->phydev_main, sc->local_hwfile); - - if (phydev_scan_uio(sc->phydev_main) < 0) - { - MR_ERROR("Physical device scan failed. "); - return RT_ERR; - } + + if (phydev_scan_uio(sc->phydev_main) < 0) + { + MR_ERROR("Physical device scan failed. "); + return RT_ERR; + } if (phydev_scan_raw_socket(sc, sc->phydev_main) < 0) { MR_ERROR("Physical device in raw socket scan failed."); return RT_ERR; } - - struct phydev * phydev_iter; - TAILQ_FOREACH(phydev_iter, &sc->phydev_main->device_list, next) - { + + struct phydev * phydev_iter; + TAILQ_FOREACH(phydev_iter, &sc->phydev_main->device_list, next) + { if (sc->phydev_main->en_load_g_cfg) phydev_config_by_g_cfg(phydev_iter, sc->local_cfgfile); - if (phydev_setup(sc, sc->phydev_main, phydev_iter) == RT_SUCCESS) continue; - return RT_ERR; - } + if (phydev_setup(sc, sc->phydev_main, phydev_iter) == RT_SUCCESS) continue; + return RT_ERR; + } /* 检查物理设备列表是否为空。如果为空,告警 */ if (TAILQ_EMPTY(&sc->phydev_main->device_list)) @@ -747,16 +765,17 @@ int phydev_init(struct sc_main * sc) /* 启动物理设备状态更新线程 */ pthread_t __pid_phydev_link_update; - int ret = pthread_create(&__pid_phydev_link_update, NULL, + int ret = pthread_create(&__pid_phydev_link_update, NULL, phydev_link_state_update_thread, &sc->phydev_main); if (ret < 0) { MR_ERROR("PHYDEV link state update thread create failed: %s", - strerror(errno)); return RT_ERR; + strerror(errno)); + return RT_ERR; } - - return RT_SUCCESS; + + return RT_SUCCESS; } void phydev_stat_get(struct phydev * phydev, struct phydev_stat * phydev_stat) @@ -777,9 +796,9 @@ void phydev_stat_last_get(struct phydev * phydev, struct phydev_stat * phydev_st void * phydev_link_state_update_thread(void * arg) { - struct phydev_main * phydev_main = (struct phydev_main *)arg; + struct phydev_main * phydev_main = (struct phydev_main *) arg; pthread_detach(pthread_self()); - mr_thread_setname(pthread_self(), "MRSRV_PHYDEV_LINK_UPDATE");
+ mr_thread_setname(pthread_self(), "MRSRV_PHYDEV_LINK_UPDATE"); while (g_keep_running) { @@ -798,5 +817,5 @@ void * phydev_link_state_update_thread(void * arg) sleep(1); } - return (void *)0; -}
\ No newline at end of file + return (void *) 0; +} |
