summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLu Qiuwen <[email protected]>2018-10-30 11:20:29 +0800
committerLu Qiuwen <[email protected]>2018-10-30 11:20:29 +0800
commitb71c010ebe2f6a60bc5a9f6e4762db45ab4ce7c8 (patch)
tree51a40ca399abea40eadf2a6e83a55f1ec8a0d3f2
parent2e5e768c8008a956309fdc6cf819bbcbf2c48a2e (diff)
适配fm10k网卡,增加从参数中读取jumbo选项等功能
-rw-r--r--cmake/Package.cmake13
-rw-r--r--service/include/sc_phydev.h7
-rw-r--r--service/src/phydev.c739
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;
+}