diff options
Diffstat (limited to 'stacks/lwip_stack/src/io_adpt/dpdk.c')
-rw-r--r-- | stacks/lwip_stack/src/io_adpt/dpdk.c | 2476 |
1 files changed, 0 insertions, 2476 deletions
diff --git a/stacks/lwip_stack/src/io_adpt/dpdk.c b/stacks/lwip_stack/src/io_adpt/dpdk.c deleted file mode 100644 index 8518112..0000000 --- a/stacks/lwip_stack/src/io_adpt/dpdk.c +++ /dev/null @@ -1,2476 +0,0 @@ -/* -* -* Copyright (c) 2018 Huawei Technologies Co.,Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at: -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -#include <stdint.h> -#include <sched.h> -#include <dlfcn.h> -#include <sys/socket.h> -#include <arpa/inet.h> -#include <net/if.h> -#include <sys/ioctl.h> -#include <fcntl.h> -#include <sys/file.h> -#include <pwd.h> -#include <dirent.h> -#include <sys/stat.h> -#include <fnmatch.h> -#include <linux/ethtool.h> -#include <linux/sockios.h> - -#include <rte_config.h> -#include <rte_ethdev.h> -#include <rte_mbuf.h> -#include <rte_eth_bond.h> -#include "nsfw_init.h" -#include "common_mem_mbuf.h" -#include "common_mem_mempool.h" -#include "common_func.h" -#include "hal.h" -#include "nstack_securec.h" -#include <rte_ethdev_driver.h> - -#define DPDK_NON_ROOT_USER_NAME "paas" -#define DPDK_TOOL_ENV "DPDK_TOOL_DIR" -#define DPDK_NIC_LIST_FILE "%s/ip_module/.nstack_dpdk_nic_list" -#define SOCKET_ID_0 0 - -NSTACK_STATIC struct passwd *dpdk_non_root_user; -NSTACK_STATIC char dpdk_tool_path[HAL_MAX_PATH_LEN] = { 0 }; - -/* Default configuration for rx and tx thresholds etc. */ -NSTACK_STATIC const struct rte_eth_rxconf rx_conf_default_igb = { - .rx_thresh = { - .pthresh = 8, - .hthresh = 8, - .wthresh = 1, //not bigger than 1 - }, -}; - -/* - * These default values are optimized for use with the Intel(R) 82576 1 GbE - * Controller and the DPDK e1000 PMD. Consider using other values for other - * network controllers and/or network drivers. - */ -NSTACK_STATIC const struct rte_eth_txconf tx_conf_default_igb = { - .tx_thresh = { - .pthresh = 8, - .hthresh = 1, - .wthresh = 16, - }, - .tx_free_thresh = 0, /* Use PMD default values */ - .tx_rs_thresh = 0, /* Use PMD default values */ -}; - -/* - * RX and TX Prefetch, Host, and Write-back threshold values should be - * carefully set for optimal performance. Consult the network - * controller's datasheet and supporting DPDK documentation for guidance - * on how these parameters should be set. - */ - -/* Default configuration for rx and tx thresholds etc. */ -NSTACK_STATIC const struct rte_eth_rxconf rx_conf_default_ixgbe = { - .rx_thresh = { - .pthresh = 8, - .hthresh = 8, - .wthresh = 4, - }, - .rx_free_thresh = 0, -}; - -/* - * These default values are optimized for use with the Intel(R) 82599 10 GbE - * Controller and the DPDK ixgbe PMD. Consider using other values for other - * network controllers and/or network drivers. - */ -NSTACK_STATIC const struct rte_eth_txconf tx_conf_default_ixgbe = { - .tx_thresh = { - .pthresh = 36, - .hthresh = 0, - .wthresh = 0, - }, - .tx_free_thresh = 0, /* Use PMD default values */ - .tx_rs_thresh = 0, /* Use PMD default values */ - .txq_flags = 0, -}; - -/* the port configuration of normal port */ -NSTACK_STATIC struct rte_eth_conf port_conf_default_normal = { - .rxmode = { - .mq_mode = ETH_RSS, - .max_rx_pkt_len = ETHER_MAX_LEN, - .split_hdr_size = 0, - .header_split = 0, - .hw_ip_checksum = 1, - .hw_vlan_filter = 1, - .hw_vlan_strip = 1, - .jumbo_frame = 0, - .hw_strip_crc = 0, - }, - .rx_adv_conf = { - .rss_conf = { - .rss_key = NULL, - .rss_hf = (ETH_RSS_IPV4 | ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP), //rss hash key - }, - }, - .txmode = { - .mq_mode = ETH_DCB_NONE, - }, - .intr_conf = { - .lsc = 0, - }, -}; - -/* the port configuration of virtio port */ -NSTACK_STATIC struct rte_eth_conf port_conf_default_virtio = { - .rxmode = { - .mq_mode = ETH_RSS, - .max_rx_pkt_len = ETHER_MAX_LEN, - .split_hdr_size = 0, - .header_split = 0, - .hw_ip_checksum = 0, /* Virtio NIC doesn't support HW IP CheckSUM */ - .hw_vlan_filter = 1, - .hw_vlan_strip = 1, - .jumbo_frame = 0, - .hw_strip_crc = 0, - }, - .rx_adv_conf = { - .rss_conf = { - .rss_key = NULL, - .rss_hf = (ETH_RSS_IPV4 | ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP), //rss hash key - }, - }, - .txmode = { - .mq_mode = ETH_DCB_NONE, - }, - .intr_conf = { - .lsc = 0, - }, -}; - -/* the port configuration of bond port */ -NSTACK_STATIC struct rte_eth_conf port_conf_default_bond = { - .rxmode = { - .mq_mode = ETH_MQ_RX_NONE, - .max_rx_pkt_len = ETHER_MAX_LEN, - .split_hdr_size = 0, - .header_split = 0, - /**< Header Split disabled */ - .hw_ip_checksum = 0, - /**< IP checksum offload enabled */ - .hw_vlan_filter = 1, - /**< VLAN filtering enabled */ - .hw_vlan_strip = 1, - .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, - }, -}; - -NSTACK_STATIC struct rte_eth_conf port_conf_default_vhost = { - .rxmode = { - .hw_ip_checksum = 0, /* vhost nic doesn't support hw_ip_checksum and hw_vlan_filter */ - .hw_vlan_filter = 0, - } -}; - -/***************************************************************************** -* Prototype : dpdk_mbuf_to_file -* Description : write the packet data into a file -* Input : uint16_t pkt_number -* struct rte_mbuf **pkts -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -NSTACK_STATIC void -dpdk_mbuf_to_file (uint16_t pkt_number, struct rte_mbuf **pkts) -{ - char line[100] = { 0 }; - FILE *f = NULL; - struct rte_mbuf *p = NULL; - uint16_t len = 0, offset, i; - uint16_t pktlen = 0; - uint16_t start = 0; - uint16_t number = 0; - unsigned char *data = NULL; - - f = fopen ("/var/log/nStack/packet.txt", "a+"); - if (f == NULL) - { - NSHAL_LOGERR ("can not open the file:%s", "packet.txt"); - return; - } - - for (i = 0; i < pkt_number; i++) - { - pktlen = 0; - p = pkts[i]; - while (p) - { - len = 0; - data = rte_pktmbuf_mtod (p, unsigned char *); - while (len < p->data_len) - { - start = pktlen % 16; /* start of the line */ - if (start == 0) - { - number = SNPRINTF_S (line, sizeof (line), sizeof (line) - 1, - "%08X", len); - } - - for (offset = 0; - ((offset + start) < 16) && ((len + offset) < p->data_len); - offset++) - { - number += - SNPRINTF_S (line + number, sizeof (line), - sizeof (line) - 1, " %02X", - data[len + offset]); - } - - fprintf (f, "%s", line); - if ((offset + start) == 16) - fprintf (f, "\n"); - - len += offset; - pktlen += offset; - (void) MEMSET_S (line, sizeof (line), 0, sizeof (line)); - } - - p = p->next; - - } - fprintf (f, "\n"); - } - - fclose (f); - return; -} - -/***************************************************************************** -* Prototype : hal_rte_eth_rx_burst -* Description : a copy of rte_eth_rx_burst, because this function invokes - a global(rte_eth_devices), which cannt be access by dlsym - symbols -* Input : uint8_t port_id -* uint16_t queue_id -* struct rte_mbuf **rx_pkts -* const uint16_t nb_pkts -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -NSTACK_STATIC inline uint16_t -hal_rte_eth_rx_burst (uint8_t port_id, uint16_t queue_id, - struct rte_mbuf ** rx_pkts, const uint16_t nb_pkts) -{ -#ifdef RTE_ETHDEV_RXTX_CALLBACKS - struct rte_eth_rxtx_callback *cb; -#endif - int16_t nb_rx; - char *pst_capture_packet = NULL; - struct rte_eth_dev *dev = &rte_eth_devices[port_id]; - - if (NULL == dev->rx_pkt_burst) - { - NSHAL_LOGERR ("dev->rx_pkt_burst is NULL,dev=%p", dev); - return 0; - } - -#ifdef RTE_LIBRTE_ETHDEV_DEBUG - RTE_ETH_VALID_PORTID_OR_ERR_RET (port_id, 0); - RTE_FUNC_PTR_OR_ERR_RET (*dev->rx_pkt_burst, 0); - - if (queue_id >= dev->data->nb_rx_queues) - { - RTE_PMD_DEBUG_TRACE ("Invalid RX queue_id=%d\n", queue_id); - return 0; - } -#endif - nb_rx = (*dev->rx_pkt_burst) (dev->data->rx_queues[queue_id], - rx_pkts, nb_pkts); - -#ifdef RTE_ETHDEV_RXTX_CALLBACKS - cb = dev->post_rx_burst_cbs[queue_id]; - - if (unlikely (cb != NULL)) - { - do - { - nb_rx = cb->fn.rx (port_id, queue_id, rx_pkts, nb_rx, - nb_pkts, cb->param); - cb = cb->next; - } - while (cb != NULL); - } -#endif - - //pst_capture_packet = getenv ("NSTACK_CAPTURE_PACKET"); - if (pst_capture_packet && strcmp (pst_capture_packet, "1") == 0) - { - dpdk_mbuf_to_file (nb_rx, rx_pkts); - } - return (uint16_t) nb_rx; -} - -/***************************************************************************** -* Prototype : hal_rte_eth_tx_burst -* Description : a copy of rte_eth_tx_burst, because this function invokes - -* Input : uint8_t port_id -* uint16_t queue_id -* struct rte_mbuf **tx_pkts -* uint16_t nb_pkts -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -NSTACK_STATIC inline uint16_t -hal_rte_eth_tx_burst (uint8_t port_id, uint16_t queue_id, - struct rte_mbuf ** tx_pkts, uint16_t nb_pkts) -{ -#ifdef RTE_ETHDEV_RXTX_CALLBACKS - struct rte_eth_rxtx_callback *cb; -#endif - int16_t nb_tx = 0; - char *pst_capture_packet = NULL; - struct rte_eth_dev *dev = &rte_eth_devices[port_id]; - - if (NULL == dev->tx_pkt_burst) - { - NSHAL_LOGERR ("dev->tx_pkt_burst is NULL"); - return 0; - } - -#ifdef RTE_LIBRTE_ETHDEV_DEBUG - RTE_ETH_VALID_PORTID_OR_ERR_RET (port_id, 0); - RTE_FUNC_PTR_OR_ERR_RET (*dev->tx_pkt_burst, 0); - - if (queue_id >= dev->data->nb_tx_queues) - { - RTE_PMD_DEBUG_TRACE ("Invalid TX queue_id=%d\n", queue_id); - return 0; - } -#endif - -#ifdef RTE_ETHDEV_RXTX_CALLBACKS - cb = dev->pre_tx_burst_cbs[queue_id]; - - if (unlikely (cb != NULL)) - { - do - { - nb_pkts = cb->fn.tx (port_id, queue_id, tx_pkts, nb_pkts, - cb->param); - cb = cb->next; - } - while (cb != NULL); - } -#endif - - nb_tx = (*dev->tx_pkt_burst) (dev->data->tx_queues[queue_id], tx_pkts, - nb_pkts); - - //pst_capture_packet = getenv ("NSTACK_CAPTURE_PACKET"); - if (pst_capture_packet && strcmp (pst_capture_packet, "1") == 0) - { - dpdk_mbuf_to_file (nb_tx, tx_pkts); - } - - return nb_tx; -} - -/***************************************************************************** - Prototype : dpdk_get_hugepage_size - Description : get the free hugepage size - Input : the dir of the nstack hugepage - Output : free hugepage size - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -int -dpdk_read_hugepage_size (int *freehuge) -{ - int fd_huge; - int len; - char buf[5] = { '\0' }; - fd_huge = - open ("/sys/kernel/mm/hugepages/hugepages-1048576kB/free_hugepages", - O_RDONLY); - if (fd_huge < 0) - { - NSHAL_LOGERR ("errno=%d", errno); - return -1; - } - - len = read (fd_huge, buf, sizeof (buf)); - if (len < 0) - { - NSHAL_LOGERR ("errno=%d", errno); - close (fd_huge); //fix codeDEX 124547 - return -1; - } - *freehuge = buf[0] - '0'; - NSHAL_LOGINF ("hugepage size=%d", *freehuge); - close (fd_huge); - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_clear_hugedir - Description : clear the hugepage which is used by dpdk - Input : the dir of the nstack hugepage - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_clear_hugedir (const char *hugedir) -{ - DIR *dir; - struct dirent *dirent_dpdk; - int dir_fd, fd, lck_result, lk_result; - const char filter[] = "*mapns*"; /* matches hugepage files */ - - /* open directory */ - dir = opendir (hugedir); - if (!dir) - { - NSHAL_LOGERR ("the path %s is not exist, errno = %d", hugedir, errno); - goto error; - } - dir_fd = dirfd (dir); - - dirent_dpdk = readdir (dir); - if (!dirent_dpdk) - { - NSHAL_LOGERR ("the dir %s can not read, errno = %d", hugedir, errno); - goto error; - } - - while (dirent_dpdk != NULL) - { - /* skip files that don't match the hugepage pattern */ - if (fnmatch (filter, dirent_dpdk->d_name, 0) > 0) - { - NSHAL_LOGWAR ("the file name %s is not match mapns, errno = %d", - dirent_dpdk->d_name, errno); - dirent_dpdk = readdir (dir); - continue; - } - - /* try and lock the file */ - fd = openat (dir_fd, dirent_dpdk->d_name, O_RDONLY); - - /* skip to next file */ - if (fd == -1) - { - NSHAL_LOGERR ("the file name %s can not be lock, errno = %d", - dirent_dpdk->d_name, errno); - dirent_dpdk = readdir (dir); - continue; - } - - /* non-blocking lock */ - lck_result = flock (fd, LOCK_EX | LOCK_NB); - - /* if lock succeeds, unlock and remove the file */ - if (lck_result != -1) - { - NSHAL_LOGWAR - ("the file name %s can be lock and will delete, errno = %d", - dirent_dpdk->d_name, errno); - lck_result = flock (fd, LOCK_UN); - if (-1 == lck_result) - NSHAL_LOGERR ("the file name %s unlock fail, errno = %d", - dirent_dpdk->d_name, errno); - lk_result = unlinkat (dir_fd, dirent_dpdk->d_name, 0); - if (-1 == lk_result) - NSHAL_LOGERR ("the file name %s is unlinkat fail, errno = %d", - dirent_dpdk->d_name, errno); - } - close (fd); - dirent_dpdk = readdir (dir); - } - - (void) closedir (dir); - return 0; - -error: - if (dir) - (void) closedir (dir); - - return -1; -} - -/***************************************************************************** - Prototype : dpdk_init_global - Description : DPDK global init - Input : int argc - char** argv - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_init_global (int argc, char **argv) -{ - //int ret; - const char hugepath[] = "/mnt/nstackhuge"; - //int freeHuge = 0; - //int retryCount = 10; - - if (-1 == dpdk_clear_hugedir (hugepath)) - { - NSHAL_LOGERR ("clear hugedir fail, try again!"); - sys_sleep_ns (0, 100000000); - (void) dpdk_clear_hugedir (hugepath); - } - NSHAL_LOGINF ("init global succ"); - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_init_env - Description : init dpdk run env - Input : void - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_init_env (void) -{ - int ret; - size_t len_size; - char *dpdk_env; - char *dpdk_path; - - /* Get dpdk_tool_path */ - dpdk_env = getenv (DPDK_TOOL_ENV); - if (NULL == dpdk_env) - { - NSHAL_LOGERR ("please set enviroment:%s before start this stack" - "\nthe value of the %s must be the path of dpdk tools", - DPDK_TOOL_ENV, DPDK_TOOL_ENV); - return -1; - } - - /* modify ugly len_size judgement and strcpy */ - /* check len_size for malloc */ - len_size = strlen (dpdk_env); - if (0 == len_size || len_size >= HAL_MAX_PATH_LEN) - { - NSHAL_LOGERR ("fail to dpdk_env strlen(DPDK_TOOL_ENV)"); - return -1; - } - - /* DPDK_TOOL_ENV's value will be use as popen's paramter,we need check's validity */ - dpdk_path = realpath (dpdk_env, NULL); - if (NULL == dpdk_path) - { - NSHAL_LOGERR ("env:%s value incorrect]value=%s,errno=%d", DPDK_TOOL_ENV, - dpdk_env, errno); - return -1; - } - - len_size = strlen (dpdk_path); - if (0 == len_size || len_size >= HAL_MAX_PATH_LEN) - { - NSHAL_LOGERR ("fail to dpdk_path strlen(DPDK_TOOL_ENV)"); - return -1; - } - - ret = STRCPY_S (dpdk_tool_path, HAL_MAX_PATH_LEN, dpdk_path); - if (EOK != ret) - { - NSHAL_LOGERR ("STRCPY_S failed]ret=%d", ret); - return -1; - } - - if (!hal_is_script_valid (dpdk_tool_path)) - { - NSHAL_LOGERR ("dpdk_tool_path is invalid]dpdk_tool_path=%s", - dpdk_tool_path); - return -1; - } - - /* get non-root user's id */ - dpdk_non_root_user = getpwnam (DPDK_NON_ROOT_USER_NAME); - if (dpdk_non_root_user) - { - NSHAL_LOGINF ("non-root]name=%s,uid=%u,gid=%u,errno=%d", - dpdk_non_root_user->pw_name, dpdk_non_root_user->pw_uid, - dpdk_non_root_user->pw_gid, errno); - } - else - { - NSHAL_LOGERR ("non-root]cannot find user %s", DPDK_NON_ROOT_USER_NAME); - } - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_init_local - Description : DPDK local init - Input : void - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_init_local (void) -{ - int ret; - - ret = dpdk_init_env (); - - if (ret < 0) - { - NSHAL_LOGERR ("dpdk_init_env failed"); - return -1; - } - - NSHAL_LOGINF ("init local succ"); - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_set_port - Description : check and save the port num - Input : netif_inst_t* inst - int port - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_set_port (netif_inst_t * inst, uint8_t port) -{ - if (port >= rte_eth_dev_count ()) - { - NSHAL_LOGERR ("the number of port=%d is more than rte_eth_dev_count=%d", - port, rte_eth_dev_count ()); - return -1; - } - - inst->data.dpdk_if.port_id = port; - - return 0; - -} - -/***************************************************************************** - Prototype : dpdk_set_nic_type - Description : check and save nic type - Input : netif_inst_t* inst - const char* type - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_set_nic_type (netif_inst_t * inst, const char *type) -{ - int ret; - - ret = - STRCPY_S (inst->data.dpdk_if.nic_type, - sizeof (inst->data.dpdk_if.nic_type), type); - if (EOK != ret) - { - NSHAL_LOGERR ("strcpy_s set nic_type failed]ret=%d", ret); - return -1; - } - - /* - * *nic_type is first checked at read_ipmoduleoperateadd_configuration, - * *thus here we dont boring validating it once more and just return. - * */ - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_set_nic_name - Description : check and save nic name - Input : netif_inst_t* inst - const char* name - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_set_nic_name (netif_inst_t * inst, const char *name) -{ - int ret; - - /* sizeof(pointer) always = 8 in 64 bit system */ - ret = - STRCPY_S (inst->data.dpdk_if.nic_name, - sizeof (inst->data.dpdk_if.nic_name), name); - if (EOK != ret) - { - NSHAL_LOGERR ("STRCPY_S set nic_name failed]ret=%d", ret); - return -1; - } - - if (!hal_is_script_valid (inst->data.dpdk_if.nic_name)) - { - NSHAL_LOGERR ("nic_name is invalid"); - return -1; - } - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_get_driver_name - Description : get and save driver name - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_get_driver_name (netif_inst_t * inst) -{ - int ret_len, ret; - char script_cmmd[HAL_SCRIPT_LENGTH]; - char driver_name[HAL_SCRIPT_LENGTH] = { 0 }; - - ret = hal_snprintf (script_cmmd, sizeof (script_cmmd), - "readlink -f /sys/class/net/" "%s" - "/device/driver| awk -F'/' '{print $6}'", - inst->data.dpdk_if.nic_name); - if (-1 == ret) - { - NSHAL_LOGERR ("hal_snprintf failed"); - return -1; - } - - ret_len = - hal_run_script (script_cmmd, driver_name, sizeof (driver_name) - 1); - - if (ret_len > HAL_MAX_DRIVER_NAME_LEN) - { - ret_len = HAL_MAX_DRIVER_NAME_LEN; - } - - if (ret_len <= 0) - { - NSHAL_LOGERR ("%s does't have a driver", driver_name); - - ret = - STRNCPY_S (inst->data.dpdk_if.driver_name, - sizeof (inst->data.dpdk_if.driver_name), "NULL", - sizeof ("NULL")); - - if (EOK != ret) - { - NSHAL_LOGERR ("STRNCPY_S failed]ret=%d.", ret); - return -1; - } - - return -1; - } - else - { - ret = - STRNCPY_S (inst->data.dpdk_if.driver_name, - sizeof (inst->data.dpdk_if.driver_name), driver_name, - ret_len); - - if (EOK != ret) - { - NSHAL_LOGERR ("STRNCPY_S failed]ret=%d.", ret); - return -1; - } - - inst->data.dpdk_if.driver_name[(ret_len - 1)] = '\0'; - - return 0; - } -} - -/***************************************************************************** - Prototype : dpdk_set_pci_permission - Description : set pci permission - Input : char *pci_addr - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_set_pci_permission (char *pci_addr) -{ - DIR *dir_desc; - char file_path[HAL_SCRIPT_LENGTH] = { 0 }, dir_path[HAL_SCRIPT_LENGTH] = - { - 0}; - struct dirent *ent; - struct stat statbuf; - int ret; - - ret = - SNPRINTF_S (dir_path, sizeof (dir_path), sizeof (dir_path) - 1, - "/sys/bus/pci/devices/%s", pci_addr); - if (ret < 0) - { - NSHAL_LOGERR ("SNPRINTF_S fail"); - return -1; - } - - if ((dir_desc = opendir (dir_path)) == NULL) - { - NSHAL_LOGERR ("opendir fail:errno=%d", errno); - return -1; - } - - while ((ent = readdir (dir_desc)) != NULL) - { - if (strstr (ent->d_name, "resource")) - { - ret = - SNPRINTF_S (file_path, sizeof (file_path), sizeof (file_path) - 1, - "%s/%s", dir_path, ent->d_name); - if (ret < 0) - { - NSHAL_LOGERR ("SNPRINTF_S fail"); - (void) closedir (dir_desc); - return -1; - } - - if (!lstat (file_path, &statbuf) && !S_ISDIR (statbuf.st_mode)) - { - ret = - chown (file_path, dpdk_non_root_user->pw_uid, - dpdk_non_root_user->pw_gid); - if (ret < 0) - { - NSHAL_LOGERR ("chown fail]file_path=%s,ret=%d,errno=%d", - file_path, ret, errno); - (void) closedir (dir_desc); - return -1; - } - NSHAL_LOGWAR ("chown succ]file_path=%s,ret=%d", file_path, ret); - ret = chmod (file_path, 0640); - if (ret < 0) - { - NSHAL_LOGERR ("chmod fail]file_path=%s,ret=%d,errno=%d", - file_path, ret, errno); - (void) closedir (dir_desc); - return -1; - } - NSHAL_LOGWAR ("chmod succ]file_path=%s,ret=%d", file_path, ret); - } - } - } - - (void) closedir (dir_desc); - return 0; -} - -/***************************************************************************** - Prototype : dpdk_get_pci_addr - Description : get and save pci addr - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_get_pci_addr (netif_inst_t * inst) -{ - int ret, pci_len; - struct ethtool_drvinfo edata = { 0 }; - struct ifreq ifr; - int fd = -1; - - /* use ioctl to get pci address instead of call dpdk-devbind.py to reduce time cost */ - ret = MEMSET_S (&ifr, sizeof (ifr), 0, sizeof (ifr)); - if (EOK != ret) - { - NSHAL_LOGERR ("MEMSET_S fail"); - return -1; - } - edata.cmd = ETHTOOL_GDRVINFO; - ret = - STRCPY_S (ifr.ifr_name, sizeof (ifr.ifr_name), - inst->data.dpdk_if.nic_name); - if (EOK != ret) - { - NSHAL_LOGERR ("STRCPY_S fail"); - return -1; - } - - ifr.ifr_data = (char *) (&edata); - if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) - { - NSHAL_LOGERR ("cannot init socket, errno=%d", errno); - return -1; - } - if (ioctl (fd, SIOCETHTOOL, &ifr) < 0) - { - NSHAL_LOGERR ("ioctl to the device %s err, errno=%d", - inst->data.dpdk_if.nic_name, errno); - close (fd); - return -1; - } - close (fd); - - pci_len = strlen (edata.bus_info); - if (pci_len == 0 - || pci_len > (int) sizeof (inst->data.dpdk_if.pci_addr) - 1) - { - NSHAL_LOGERR ("does't have a pci_addr"); - inst->data.dpdk_if.pci_addr[0] = '\0'; - return -1; - } - - NSHAL_LOGINF ("nic_name=%s,nic_pci_addr=%s", inst->data.dpdk_if.nic_name, - edata.bus_info); - - ret = - STRNCPY_S (inst->data.dpdk_if.pci_addr, - sizeof (inst->data.dpdk_if.pci_addr), edata.bus_info, pci_len); - if (EOK != ret) - { - NSHAL_LOGERR ("STRNCPY_S failed]ret=%d.", ret); - return -1; - } - - if (!hal_is_script_valid (inst->data.dpdk_if.pci_addr)) - { - NSHAL_LOGERR ("pci_addr is invalid]pci_addr=%s", - inst->data.dpdk_if.pci_addr); - return -1; - } - - if (dpdk_non_root_user && getuid ()) - { - ret = dpdk_set_pci_permission (inst->data.dpdk_if.pci_addr); - if (ret < 0) - { - NSHAL_LOGERR ("dpdk_set_pci_permission fail"); - return -1; - } - } - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_mlx_linkup - Description : linkup the port for mlx - In bonding mode, mlx4 NICs should be set up manually, - in order to make bond port up - Input : char* name - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_mlx_linkup (char *name) -{ - struct ifreq st_ifreq; - int sock; - int retVal; - - if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) - { - NSHAL_LOGERR ("socket fail]errno=%d", errno); - return 2; - } - - retVal = STRCPY_S (st_ifreq.ifr_name, sizeof (st_ifreq.ifr_name), name); - - if (EOK != retVal) - { - NSHAL_LOGERR ("STRCPY_S fail]"); - close (sock); - return 1; - } - - if (ioctl (sock, (uint64_t) SIOCGIFFLAGS, &st_ifreq) < 0) - { - NSHAL_LOGERR ("ioctl SIOCGIFFLAGS fail]errno=%d", errno); - close (sock); - return 3; - } - - st_ifreq.ifr_flags |= IFF_UP; - st_ifreq.ifr_flags |= IFF_RUNNING; - - if (ioctl (sock, (uint64_t) SIOCSIFFLAGS, &st_ifreq) < 0) - { - NSHAL_LOGERR ("ioctl SIOCSIFFLAGS fail]errno=%d", errno); - close (sock); - return 3; - } - - close (sock); - return 0; -} - -/***************************************************************************** - Prototype : dpdk_nonmlx_linkdown - Description : linkdown the port for nonmlx - Input : char* name - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_nonmlx_linkdown (char *name) -{ - int ret, ret_len; - char script_cmmd[HAL_SCRIPT_LENGTH]; - char result_buf[HAL_SCRIPT_LENGTH]; - - ret = - hal_snprintf (script_cmmd, sizeof (script_cmmd), "sudo ifconfig %s down", - name); - if (-1 == ret) - { - NSHAL_LOGERR ("spl_snprintf failed]"); - return -1; - } - - ret_len = hal_run_script (script_cmmd, result_buf, sizeof (result_buf)); - NSHAL_LOGINF ("ifconfig]script_cmmd=%s,ret_len=%d", script_cmmd, ret_len); - if (0 > ret_len) - { - NSHAL_LOGERR ("cannot able to ifconfig %s down", name); - return -1; - } - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_get_uio_by_pci_addr - Description : get uio - Input : char *pci_addr - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_get_uio_by_pci_addr (char *pci_addr) -{ - int i, ret, ret_len; - char script_cmmd[HAL_SCRIPT_LENGTH]; - char result_buf[HAL_SCRIPT_LENGTH]; - - for (i = 0; i < RTE_MAX_ETHPORTS; i++) - { - ret = hal_snprintf (script_cmmd, sizeof (script_cmmd), - "readlink ls /sys/class/uio/uio%d/device | awk -F '/' '{print $4}'", - i); - if (-1 == ret) - { - NSHAL_LOGERR ("hal_snprintf fail]pci=%s,i=%d", pci_addr, i); - return -1; - } - - ret_len = hal_run_script (script_cmmd, result_buf, sizeof (result_buf)); - if (0 > ret_len) - { - NSHAL_LOGERR ("hal_run_script fail]pci=%s,i=%d", pci_addr, i); - return -1; - } - if (strcmp (result_buf, pci_addr) == 0) - return i; - } - - return -1; -} - -/***************************************************************************** - Prototype : dpdk_set_uio_permission - Description : set uio permission - Input : char *pci_addr - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_set_uio_permission (char *pci_addr) -{ - int ret, uio_idx; - char file_path[HAL_SCRIPT_LENGTH / 2] = { 0 }; - - /* get /dev/uio by pci addr */ - uio_idx = dpdk_get_uio_by_pci_addr (pci_addr); - if (uio_idx < 0) - { - NSHAL_LOGERR ("dpdk_get_uio_by_pci_addr fail]pci_addr=%s", pci_addr); - return -1; - } - - NSHAL_LOGINF ("uio_idx]pci=%s,uio%d", pci_addr, uio_idx); - - /* change /dev/uio%u permission */ - if (SNPRINTF_S - (file_path, sizeof (file_path), sizeof (file_path) - 1, "/dev/uio%d", - uio_idx) < 0) - { - NSHAL_LOGERR ("SNPRINTF_S failed]uio%d", uio_idx); - return -1; - } - sys_sleep_ns (0, 500000000); - ret = - chown (file_path, dpdk_non_root_user->pw_uid, dpdk_non_root_user->pw_gid); - if (ret < 0) - { - NSHAL_LOGERR ("chown fail]file_path=%s,ret=%d,errno=%d", file_path, ret, - errno); - return -1; - } - NSHAL_LOGWAR ("chown succ]file_path=%s,ret=%d", file_path, ret); - - ret = chmod (file_path, 0640); - if (ret < 0) - { - NSHAL_LOGERR ("chmod fail]file_path=%s,ret=%d,errno=%d", file_path, ret, - errno); - return -1; - } - NSHAL_LOGWAR ("chmod succ]file_path=%s,ret=%d", file_path, ret); - - /* change /sys/class/uio/uio%u/device/config permission */ - if (SNPRINTF_S - (file_path, sizeof (file_path), sizeof (file_path) - 1, - "/sys/class/uio/uio%d/device/config", uio_idx) < 0) - { - NSHAL_LOGERR ("SNPRINTF_S failed]uio%d", uio_idx); - return -1; - } - - ret = - chown (file_path, dpdk_non_root_user->pw_uid, dpdk_non_root_user->pw_gid); - if (ret < 0) - { - NSHAL_LOGERR ("chown fail]file_path=%s,ret=%d,errno=%d", file_path, ret, - errno); - return -1; - } - NSHAL_LOGWAR ("chown succ]file_path=%s,ret=%d", file_path, ret); - - ret = chmod (file_path, 0640); - if (ret < 0) - { - NSHAL_LOGERR ("chmod fail]file_path=%s,ret=%d,errno=%d", file_path, ret, - errno); - return -1; - } - NSHAL_LOGWAR ("chmod succ]file_path=%s,ret=%d", file_path, ret); - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_get_nic_list_file - Description : get dpdk bind nic list file - Input : void - Output : char* - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC char * -dpdk_get_nic_list_file (void) -{ - int ret; - static char buffer[HAL_MAX_PATH_LEN]; /* static so auto-zeroed */ - const char *directory = "/var/run"; - const char *home_dir = getenv ("HOME"); - - if (getuid () != 0 && home_dir != NULL) - directory = home_dir; - - ret = - SNPRINTF_S (buffer, sizeof (buffer), sizeof (buffer) - 1, - DPDK_NIC_LIST_FILE, directory); - if (-1 == ret) - { - NSCOMM_LOGERR ("SNPRINTF_S failed]ret=%d", ret); - return NULL; - } - - return buffer; -} - -/***************************************************************************** - Prototype : dpdk_bind_uio - Description : bind uio - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_bind_uio (netif_inst_t * inst) -{ - char script_cmmd[HAL_SCRIPT_LENGTH]; - char result_buf[HAL_SCRIPT_LENGTH]; - int ret, ret_len; - - result_buf[0] = '\0'; - - if (strncmp ("mlx4_co", inst->data.dpdk_if.driver_name, (size_t) 7) == 0) - { - /*For MLX4: NIC should be set link up before rte_eth_dev_start() is called. */ - ret = dpdk_mlx_linkup (inst->data.dpdk_if.nic_name); - if (0 != ret) - { - NSHAL_LOGERR ("set mlx linkup fail]nic_name=%s,ret=%d", - inst->data.dpdk_if.nic_name, ret); - - return -1; - } - } - else - { - /*For other drivers: NIC should be set link down before bind uio. */ - ret = dpdk_nonmlx_linkdown (inst->data.dpdk_if.nic_name); - if (-1 == ret) - { - NSHAL_LOGERR ("dpdk_nonmlx_linkdown fail]nic_name=%s", - inst->data.dpdk_if.nic_name); - return -1; - } - - /* save binded VF list to file /var/run/ip_module/.nstack_dpdk_nic_list */ - ret = hal_snprintf (script_cmmd, sizeof (script_cmmd), - "sudo %s" - "/dpdk-devbind.py -s | grep `ethtool -i %s| grep bus-info |awk '{print $2}'` >> %s 2>&1", - dpdk_tool_path, inst->data.dpdk_if.nic_name, - dpdk_get_nic_list_file ()); - - if (-1 == ret) - { - NSHAL_LOGERR ("hal_snprintf fail]nic_name=%s", - inst->data.dpdk_if.nic_name); - return -1; - } - - ret_len = - hal_run_script (script_cmmd, result_buf, sizeof (result_buf) - 1); - NSHAL_LOGINF ("bind]script_cmmd=%s,ret_len=%d", script_cmmd, ret_len); - if (0 > ret_len) - { - NSHAL_LOGERR ("hal_run_script fail]script_cmmd=%s", script_cmmd); - return -1; - } - - if (strncmp ("virtio", inst->data.dpdk_if.driver_name, (size_t) 6) == 0) - { - /* For Virtio NIC, should call "./devbind.sh ethX" to bind the VF */ - ret = hal_snprintf (script_cmmd, sizeof (script_cmmd), - "sudo %s" - "/dpdk-devbind.py --bind=igb_uio `ethtool -i %s| grep bus-info |awk '{print $2}'`", - dpdk_tool_path, inst->data.dpdk_if.nic_name); - //"sudo %s" "/devbind.sh " "%s", dpdk_tool_path, inst->data.dpdk_if.nic_name); - - } - else - { - ret = hal_snprintf (script_cmmd, sizeof (script_cmmd), - "sudo %s" "/dpdk-devbind.py --bind=igb_uio " - "%s", dpdk_tool_path, - inst->data.dpdk_if.nic_name); - } - - if (-1 == ret) - { - NSHAL_LOGERR ("hal_snprintf failed"); - return -1; - } - - ret_len = - hal_run_script (script_cmmd, result_buf, sizeof (result_buf) - 1); - NSHAL_LOGINF ("bind]script_cmmd=%s,retlen=%d", script_cmmd, ret_len); - if (0 > ret_len) - { - NSHAL_LOGERR ("hal_run_script fail]script_cmmd=%s", script_cmmd); - return -1; - } - - if (dpdk_non_root_user && getuid ()) - { - ret = dpdk_set_uio_permission (inst->data.dpdk_if.pci_addr); - - if (ret < 0) - { - NSHAL_LOGERR ("set_uio_permission fail]nic_name=%s", - inst->data.dpdk_if.nic_name); - return -1; - } - } - } - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_probe_pci - Description : probe pci - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_probe_pci (netif_inst_t * inst) -{ - int ret; - uint16_t port_id; - struct rte_eth_dev *eth_dev; - char *pci_addr = inst->data.dpdk_if.pci_addr; - - ret = rte_eal_iopl_init (); - if (0 != ret) - { - NSHAL_LOGERR ("rte_eal_iopl_init fail]pci_addr=%s,ret=%d", pci_addr, - ret); - return -1; - } - - ret = rte_eth_dev_attach (pci_addr, &port_id); - if (0 != ret) - { - NSHAL_LOGWAR - ("pci attach to DPDK fail, the pci may have attached, try to get port id]pci_addr=%s,ret=%d", - pci_addr, ret); - - eth_dev = rte_eth_dev_allocated (inst->data.dpdk_if.nic_name); - if (NULL != eth_dev && NULL != eth_dev->data) - { - port_id = eth_dev->data->port_id; - ret = 0; - } - } - - if (!ret) - { - ret = dpdk_set_port (inst, port_id); - - if (0 == ret) - { - NSHAL_LOGINF ("set port success]pci_addr=%s,port_id=%u", pci_addr, - port_id); - } - else - { - NSHAL_LOGERR ("set port fail]pci_addr=%s,port_id=%u", pci_addr, - port_id); - return -1; - } - } - else - { - NSHAL_LOGERR ("get port fail]pci_addr=%s,ret=%d", pci_addr, ret); - return -1; - } - - /*[TA33635][2017-04-24][l00408818] Start: support bond mode */ - ret = rte_eal_devargs_add (RTE_DEVTYPE_WHITELISTED_PCI, pci_addr); - if (!ret) - { - NSHAL_LOGINF ("pci attach to whitelist success]pci_addr=%s", pci_addr); - } - else - { - NSHAL_LOGERR ("pci attach to whitelist fail]pci_addr=%s", pci_addr); - return -1; - } - /*[TA33635][2017-04-24][l00408818] End */ - - return 0; -} - -/*nic_name->driver_name->pci_addr->get port*/ -/***************************************************************************** - Prototype : dpdk_open - Description : open the port - Input : netif_inst_t* inst - const char* name - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_open (netif_inst_t * inst, const char *name, const char *type) -{ - int ret; - - if ((inst == NULL) || (name == NULL) || (type == NULL)) - { - NSHAL_LOGERR - ("invaliad arguments]inst==NULL, nic_type==NULL or type==NULL"); - return -1; - } - - ret = dpdk_set_nic_type (inst, type); - - if (0 != ret) - { - NSHAL_LOGERR ("dpdk_set_nic_type fail]nic_type=%s, ret=%d", type, ret); - return -1; - } - - ret = dpdk_set_nic_name (inst, name); - - if (0 != ret) - { - NSHAL_LOGERR ("dpdk_set_nic_name fail]nic_name=%s, ret=%d", name, ret); - return -1; - } - - if (!strncmp (type, "vhost", strlen ("vhost"))) - { - /*for vhost-user device, the remaining steps is unnecessary, y0413485 */ - NSHAL_LOGERR ("initting vhost device]nic_name=%s type=%s", name, type); - return 0; - } - - ret = dpdk_get_driver_name (inst); - - if (0 != ret) - { - NSHAL_LOGERR ("dpdk_get_driver_name fail]nic_name=%s, ret=%d", name, - ret); - return -1; - } - - ret = dpdk_get_pci_addr (inst); - - if (0 != ret) - { - NSHAL_LOGERR ("dpdk_get_pci_addr fail]nic_name=%s, ret=%d", name, ret); - return -1; - } - - ret = dpdk_bind_uio (inst); - - if (0 != ret) - { - NSHAL_LOGERR ("dpdk_bind_uio fail]nic_name=%s, ret=%d", name, ret); - return -1; - } - - ret = dpdk_probe_pci (inst); - - if (0 != ret) - { - NSHAL_LOGERR ("dpdk_probe_pci fail]nic_name=%s, ret=%d", name, ret); - return -1; - } - - NSHAL_LOGINF ("open port succ]port_id=%u, nic_name=%s", - inst->data.dpdk_if.port_id, inst->data.dpdk_if.nic_name); - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_close - Description : close the port - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_close (netif_inst_t * inst) -{ - int i; - - /* close slave NIC first */ - for (i = 0; i < inst->data.dpdk_if.slave_num; i++) - { - rte_eth_dev_close (inst->data.dpdk_if.slave_port[i]); - NSHAL_LOGINF ("close slave port succ]port_id=%u, nic_name=%s", - inst->data.dpdk_if.slave_port[i], - inst->data.dpdk_if.nic_name); - } - - rte_eth_dev_close (inst->data.dpdk_if.port_id); - NSHAL_LOGINF ("close port succ]port_id=%u, nic_name=%s", - inst->data.dpdk_if.port_id, inst->data.dpdk_if.nic_name); - return 0; -} - -/***************************************************************************** - Prototype : dpdk_get_queue_conf - Description : get the port queue configure - Input : netif_inst_t* inst - struct rte_eth_rxconf** rx_conf - struct rte_eth_txconf** tx_conf - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_get_queue_conf (netif_inst_t * inst, - struct rte_eth_rxconf **rx_conf, - struct rte_eth_txconf **tx_conf) -{ - static struct rte_eth_dev_info slave_dev_info; - - if (strncmp ("igb", inst->data.dpdk_if.driver_name, (size_t) 3) == 0) - { - *rx_conf = (struct rte_eth_rxconf *) &rx_conf_default_igb; - *tx_conf = (struct rte_eth_txconf *) &tx_conf_default_igb; - NSHAL_LOGINF ("igb config is enable]port_id=%u", - inst->data.dpdk_if.port_id); - } - else if (strncmp ("ixgbe", inst->data.dpdk_if.driver_name, (size_t) 5) == 0) - { - *rx_conf = (struct rte_eth_rxconf *) &rx_conf_default_ixgbe; - *tx_conf = (struct rte_eth_txconf *) &tx_conf_default_ixgbe; - NSHAL_LOGINF ("igxbe config is enable]port_id=%u", - inst->data.dpdk_if.port_id); - } - else if (strncmp ("bond", inst->data.dpdk_if.driver_name, (size_t) 4) == 0) - { - *rx_conf = NULL; - rte_eth_dev_info_get (inst->data.dpdk_if.slave_port[0], - &slave_dev_info); - *tx_conf = &(slave_dev_info.default_txconf); - NSHAL_LOGINF ("bond config is enable]port_id=%u", - inst->data.dpdk_if.port_id); - } - else - { - *rx_conf = NULL; - *tx_conf = NULL; - NSHAL_LOGINF ("default config is enable]port_id=%u", - inst->data.dpdk_if.port_id); - } - return 0; -} - -/***************************************************************************** - Prototype : dpdk_get_port_conf - Description : get the port configure - Input : netif_inst_t* inst - struct rte_eth_conf** port_conf - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC void -dpdk_get_port_conf (netif_inst_t * inst, struct rte_eth_conf **port_conf) -{ - if (strncmp ("virtio", inst->data.dpdk_if.driver_name, (size_t) 6) == 0) - { - *port_conf = &port_conf_default_virtio; - } - else if (strncmp ("bond", inst->data.dpdk_if.driver_name, (size_t) 4) == 0) - { - *port_conf = &port_conf_default_bond; - } - else if (strncmp ("vhost", inst->data.dpdk_if.nic_type, (size_t) 5) == 0) - { - *port_conf = &port_conf_default_vhost; - return; - } - else - { - *port_conf = &port_conf_default_normal; - } - - (*port_conf)->rxmode.hw_vlan_filter = inst->data.dpdk_if.hw_vlan_filter; - (*port_conf)->rxmode.hw_vlan_strip = inst->data.dpdk_if.hw_vlan_strip; -} - -/***************************************************************************** - Prototype : dpdk_setup_port - Description : setup the port - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_setup_port (netif_inst_t * inst) -{ - int ret; - uint32_t i; - struct rte_eth_conf *port_conf; - struct rte_eth_rxconf *rx_conf; - struct rte_eth_txconf *tx_conf; - - uint8_t port_id = inst->data.dpdk_if.port_id; - struct rte_mempool **mp = - (struct rte_mempool **) inst->data.dpdk_if.rx_pool; - uint32_t *rx_ring_size = inst->data.dpdk_if.rx_ring_size; - uint32_t *tx_ring_size = inst->data.dpdk_if.tx_ring_size; - uint32_t rx_queue_num = inst->data.dpdk_if.rx_queue_num; - uint32_t tx_queue_num = inst->data.dpdk_if.tx_queue_num; - - dpdk_get_port_conf (inst, &port_conf); - - ret = - rte_eth_dev_configure (port_id, rx_queue_num, tx_queue_num, port_conf); - if (ret < 0) - { - NSHAL_LOGERR ("rte_eth_dev_configure]port_id=%u,ret=%d", port_id, ret); - return ret; - } - - if (dpdk_get_queue_conf (inst, &rx_conf, &tx_conf) < 0) - { - NSHAL_LOGERR ("dpdk_get_queue_conf failed]inst=%p,rx_conf=%p", inst, - rx_conf); - return -1; - } - /* fix "FORTIFY.Out-of-Bounds_Read" type codedex issue CID 33436 */ - if (rx_queue_num > HAL_ETH_MAX_QUEUE_NUM - || tx_queue_num > HAL_ETH_MAX_QUEUE_NUM) - { - NSHAL_LOGERR - ("queue num error]rx_queue_num=%u, tx_queue_num=%u, HAL_ETH_MAX_QUEUE_NUM=%d", - rx_queue_num, tx_queue_num, HAL_ETH_MAX_QUEUE_NUM); - - return -1; - } - - for (i = 0; i < rx_queue_num; i++) - { - ret = - rte_eth_rx_queue_setup (port_id, i, rx_ring_size[i], SOCKET_ID_ANY, - rx_conf, mp[i]); - if (ret < 0) - { - NSHAL_LOGERR ("rx queue setup fail]index=%u,port_id=%u,ret=%d", i, - port_id, ret); - return ret; - } - } - - for (i = 0; i < tx_queue_num; i++) - { - ret = - rte_eth_tx_queue_setup (port_id, i, tx_ring_size[i], SOCKET_ID_ANY, - tx_conf); - - if (ret < 0) - { - NSHAL_LOGERR ("tx queue setup fail]q=%u,ret=%d", i, ret); - return ret; - } - } - - rte_eth_promiscuous_enable (port_id); - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_start - Description : start the port - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_start (netif_inst_t * inst) -{ - int ret; - struct ether_addr eth_addr; - - ret = dpdk_setup_port (inst); - - if (ret < 0) - { - NSHAL_LOGERR ("call dpdk_setup_port fail]ret=%d", ret); - return ret; - } - - ret = rte_eth_dev_start (inst->data.dpdk_if.port_id); - if (ret < 0) - { - NSHAL_LOGERR ("rte_eth_dev_start fail]ret=%d", ret); - return ret; - } - - rte_eth_macaddr_get (inst->data.dpdk_if.port_id, ð_addr); - NSHAL_LOGINF ("port_id=%u,nic_name=%s,mac=%02X:%02X:%02X:%02X:%02X:%02X", - inst->data.dpdk_if.port_id, - inst->data.dpdk_if.nic_name, - eth_addr.addr_bytes[0], - eth_addr.addr_bytes[1], - eth_addr.addr_bytes[2], - eth_addr.addr_bytes[3], - eth_addr.addr_bytes[4], eth_addr.addr_bytes[5]); - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_stop - Description : stop the port - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_stop (netif_inst_t * inst) -{ - int i; - - /* stop slave NIC first */ - for (i = 0; i < inst->data.dpdk_if.slave_num; i++) - { - rte_eth_dev_stop (inst->data.dpdk_if.slave_port[i]); - NSHAL_LOGINF ("stop slave port succ]port_id=%u, nic_name=%s", - inst->data.dpdk_if.slave_port[i], - inst->data.dpdk_if.nic_name); - } - rte_eth_dev_stop (inst->data.dpdk_if.port_id); - - NSHAL_LOGINF ("stop port succ]port_id=%u, nic_name=%s", - inst->data.dpdk_if.port_id, inst->data.dpdk_if.nic_name); - return 0; -} - -/***************************************************************************** - Prototype : dpdk_get_mtu - Description : get the port mtu - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC uint32_t -dpdk_get_mtu (netif_inst_t * inst) -{ - uint32_t mtu; - - if (rte_eth_dev_get_mtu (inst->data.dpdk_if.port_id, (uint16_t *) & mtu)) - { - return 0; - } - - return mtu; -} - -/***************************************************************************** - Prototype : dpdk_get_macaddr - Description : get the port mac addr - Input : netif_inst_t* inst - void* mac_addr - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_get_macaddr (netif_inst_t * inst, void *mac_addr) -{ - /*bond port */ - int primary_port = rte_eth_bond_primary_get (inst->data.dpdk_if.port_id); - if (0 <= primary_port) - { - rte_eth_macaddr_get ((uint8_t) primary_port, - (struct ether_addr *) mac_addr); - - NSHAL_LOGDBG - ("primary_port_id=%u,nic_name=%s,mac=%02X:%02X:%02X:%02X:%02X:%02X", - primary_port, inst->data.dpdk_if.nic_name, - ((struct ether_addr *) mac_addr)->addr_bytes[0], - ((struct ether_addr *) mac_addr)->addr_bytes[1], - ((struct ether_addr *) mac_addr)->addr_bytes[2], - ((struct ether_addr *) mac_addr)->addr_bytes[3], - ((struct ether_addr *) mac_addr)->addr_bytes[4], - ((struct ether_addr *) mac_addr)->addr_bytes[5]); - } - /*normal port */ - else - { - rte_eth_macaddr_get (inst->data.dpdk_if.port_id, - (struct ether_addr *) mac_addr); - - NSHAL_LOGDBG - ("normal_port_id=%u,nic_name=%s,mac=%02X:%02X:%02X:%02X:%02X:%02X", - inst->data.dpdk_if.port_id, inst->data.dpdk_if.nic_name, - ((struct ether_addr *) mac_addr)->addr_bytes[0], - ((struct ether_addr *) mac_addr)->addr_bytes[1], - ((struct ether_addr *) mac_addr)->addr_bytes[2], - ((struct ether_addr *) mac_addr)->addr_bytes[3], - ((struct ether_addr *) mac_addr)->addr_bytes[4], - ((struct ether_addr *) mac_addr)->addr_bytes[5]); - } - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_capa_convert - Description : convert format from dpdk to hal - Input : const struct rte_eth_dev_info* dev_info - hal_netif_capa_t* capa - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC inline void -dpdk_capa_convert (const struct rte_eth_dev_info *dev_info, - hal_netif_capa_t * capa) -{ - int retVal = - MEMSET_S (capa, sizeof (hal_netif_capa_t), 0, sizeof (hal_netif_capa_t)); - if (EOK != retVal) - { - NSHAL_LOGERR ("MEMSET_S fail]retVal=%d", retVal); - } - - capa->tx_offload_capa = dev_info->tx_offload_capa; -} - -/***************************************************************************** - Prototype : dpdk_get_capability - Description : get the port capability - Input : netif_inst_t* inst - hal_netif_capa_t* capa - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_get_capability (netif_inst_t * inst, hal_netif_capa_t * capa) -{ - struct rte_eth_dev_info dev_info; - - rte_eth_dev_info_get (inst->data.dpdk_if.port_id, &dev_info); - dpdk_capa_convert (&dev_info, capa); - return 0; -} - -/***************************************************************************** - Prototype : dpdk_recv - Description : recv packet from the port - Input : netif_inst_t* inst - uint16_t queue_id - struct common_mem_mbuf** rx_pkts - uint16_t nb_pkts - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC uint16_t -dpdk_recv (netif_inst_t * inst, uint16_t queue_id, - hal_mbuf_t ** rx_pkts, uint16_t nb_pkts) -{ - return hal_rte_eth_rx_burst (inst->data.dpdk_if.port_id, queue_id, - (struct rte_mbuf **) rx_pkts, nb_pkts); -} - -/***************************************************************************** - Prototype : dpdk_send - Description : send packet to the port - Input : netif_inst_t* inst - uint16_t queue_id - struct common_mem_mbuf** tx_pkts - uint16_t nb_pkts - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC uint16_t -dpdk_send (netif_inst_t * inst, uint16_t queue_id, - hal_mbuf_t ** tx_pkts, uint16_t nb_pkts) -{ - return hal_rte_eth_tx_burst (inst->data.dpdk_if.port_id, queue_id, - (struct rte_mbuf **) tx_pkts, nb_pkts); -} - -/***************************************************************************** - Prototype : dpdk_link_status - Description : get link status form the port - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC uint32_t -dpdk_link_status (netif_inst_t * inst) -{ - struct rte_eth_link eth_link; - - /* add log output when failed */ - int retVal = MEMSET_S (ð_link, sizeof (struct rte_eth_link), 0, - sizeof (struct rte_eth_link)); - if (EOK != retVal) - { - NSHAL_LOGERR ("MEMSET_S fail]retVal=%d", retVal); - } - - rte_eth_link_get (inst->data.dpdk_if.port_id, ð_link); - - return eth_link.link_status; -} - -/***************************************************************************** - Prototype : dpdk_stats_convert - Description : convert format from dpdk to hal - Input : const struct rte_eth_stats* rte_stats - hal_netif_stats_t* stats - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC inline void -dpdk_stats_convert (const struct rte_eth_stats *rte_stats, - hal_netif_stats_t * stats) -{ - int i; - - /* give fail error number when failed */ - int retVal = MEMSET_S (stats, sizeof (hal_netif_stats_t), 0, - sizeof (hal_netif_stats_t)); - if (EOK != retVal) - { - NSHAL_LOGERR ("MEMSET_S fail]retVal=%d", retVal); - } - - stats->ipackets = rte_stats->ipackets; - stats->opackets = rte_stats->opackets; - stats->ibytes = rte_stats->ibytes; - stats->obytes = rte_stats->obytes; - stats->imissed = rte_stats->imissed; - stats->ierrors = rte_stats->ierrors; - stats->oerrors = rte_stats->oerrors; - stats->rx_nombuf = rte_stats->rx_nombuf; - - for (i = 0; i < HAL_ETH_QUEUE_STAT_CNTRS; i++) - { - stats->q_ipackets[i] = rte_stats->q_ipackets[i]; - stats->q_opackets[i] = rte_stats->q_opackets[i]; - stats->q_ibytes[i] = rte_stats->q_ibytes[i]; - stats->q_obytes[i] = rte_stats->q_obytes[i]; - stats->q_errors[i] = rte_stats->q_errors[i]; - } -} - -/***************************************************************************** - Prototype : dpdk_stats - Description : get stats form the port - Input : netif_inst_t* inst - hal_netif_stats_t* stats - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_stats (netif_inst_t * inst, hal_netif_stats_t * stats) -{ - int ret; - struct rte_eth_stats rte_stats; - - ret = rte_eth_stats_get (inst->data.dpdk_if.port_id, &rte_stats); - if (ret == 0) - { - dpdk_stats_convert (&rte_stats, stats); - return 0; - } - - return -1; -} - -/***************************************************************************** - Prototype : dpdk_stats_reset - Description : reset stats to the port - Input : netif_inst_t* inst - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_stats_reset (netif_inst_t * inst) -{ - rte_eth_stats_reset (inst->data.dpdk_if.port_id); - return 0; -} - -/***************************************************************************** - Prototype : dpdk_config - Description : config the port queue and ring - Input : netif_inst_t* inst - hal_netif_config_t* conf - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_config (netif_inst_t * inst, hal_netif_config_t * conf) -{ - uint32_t i; - - inst->data.dpdk_if.hw_vlan_filter = conf->bit.hw_vlan_filter; - inst->data.dpdk_if.hw_vlan_strip = conf->bit.hw_vlan_strip; - - inst->data.dpdk_if.rx_queue_num = conf->rx.queue_num; - /* fix Buffer Overflow type code-dex issue */ - if (inst->data.dpdk_if.rx_queue_num > HAL_ETH_MAX_QUEUE_NUM) - { - NSHAL_LOGERR - ("rx queue num error]rx_queue_num=%u, HAL_ETH_MAX_QUEUE_NUM=%d", - inst->data.dpdk_if.rx_queue_num, HAL_ETH_MAX_QUEUE_NUM); - - return -1; - } - - for (i = 0; i < inst->data.dpdk_if.rx_queue_num; i++) - { - inst->data.dpdk_if.rx_ring_size[i] = conf->rx.ring_size[i]; - inst->data.dpdk_if.rx_pool[i] = - (struct rte_mempool *) conf->rx.ring_pool[i]; - } - - inst->data.dpdk_if.tx_queue_num = conf->tx.queue_num; - /* fix "FORTIFY.Out-of-Bounds_Read--Off-by-One" type codedex issue */ - if (inst->data.dpdk_if.tx_queue_num > HAL_ETH_MAX_QUEUE_NUM) - { - NSHAL_LOGERR - ("tx queue num error]rx_queue_num=%u, HAL_ETH_MAX_QUEUE_NUM=%d", - inst->data.dpdk_if.tx_queue_num, HAL_ETH_MAX_QUEUE_NUM); - - return -1; - } - for (i = 0; i < inst->data.dpdk_if.tx_queue_num; i++) - { - inst->data.dpdk_if.tx_ring_size[i] = conf->tx.ring_size[i]; - } - - return 0; -} - -/***************************************************************************** - Prototype : dpdk_bond_config - Description : config the port for bond mode - Input : netif_inst_t* inst - uint8_t slave_num - netif_inst_t* slave_inst[] - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_bond_config (netif_inst_t * inst, uint8_t slave_num, - netif_inst_t * slave_inst[]) -{ - int ret; - uint32_t i, queue; - - inst->data.dpdk_if.slave_num = slave_num; - - for (i = 0; i < slave_num; i++) - { - inst->data.dpdk_if.slave_port[i] = slave_inst[i]->data.dpdk_if.port_id; - - if (0 == i) - { - inst->data.dpdk_if.hw_vlan_filter = - slave_inst[i]->data.dpdk_if.hw_vlan_filter; - inst->data.dpdk_if.hw_vlan_strip = - slave_inst[i]->data.dpdk_if.hw_vlan_strip; - inst->data.dpdk_if.rx_queue_num = - slave_inst[i]->data.dpdk_if.rx_queue_num; - inst->data.dpdk_if.tx_queue_num = - slave_inst[i]->data.dpdk_if.tx_queue_num; - - /*will be used in function dpdk_get_queue_conf and dpdk_get_port_conf */ - ret = - STRCPY_S (inst->data.dpdk_if.driver_name, - sizeof (inst->data.dpdk_if.driver_name), "bond"); - - if (EOK != ret) - { - NSHAL_LOGERR ("STRCPY_S failed]ret=%d.", ret); - return -1; - } - - for (queue = 0; queue < HAL_ETH_MAX_QUEUE_NUM; queue++) - { - inst->data.dpdk_if.rx_pool[queue] = - slave_inst[i]->data.dpdk_if.rx_pool[queue]; - inst->data.dpdk_if.rx_ring_size[queue] = - slave_inst[i]->data.dpdk_if.rx_ring_size[queue]; - inst->data.dpdk_if.tx_ring_size[queue] = - slave_inst[i]->data.dpdk_if.tx_ring_size[queue]; - } - } - } - - return 0; - -} - -/***************************************************************************** - Prototype : dpdk_bond - Description : bond port - Input : netif_inst_t* inst - const char* bond_name - uint8_t slave_num - netif_inst_t* slave_inst[] - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_bond (netif_inst_t * inst, const char *bond_name, uint8_t slave_num, - netif_inst_t * slave_inst[]) -{ - int i, ret; - int port; - struct ether_addr eth_addr; - - /* check if all the slaves' drivers are same, not support different drivers */ - for (i = 1; i < slave_num; i++) - { - if (strncmp - (slave_inst[0]->data.dpdk_if.driver_name, - slave_inst[i]->data.dpdk_if.driver_name, - strlen (slave_inst[0]->data.dpdk_if.driver_name))) - { - NSHAL_LOGERR - ("dpdk does not support different types of network card]slave[0]=%s, slave[%i]=%s", - slave_inst[0]->data.dpdk_if.driver_name, i, - slave_inst[i]->data.dpdk_if.driver_name); - return -1; - } - } - - ret = dpdk_set_nic_name (inst, bond_name); - - if (0 != ret) - { - NSHAL_LOGERR ("dpdk_set_nic_name fail]ret=%d", ret); - return -1; - } - - port = - rte_eth_bond_create (bond_name, BONDING_MODE_ACTIVE_BACKUP, SOCKET_ID_0); - if (port < 0) - { - NSHAL_LOGERR ("rte_eth_bond_create fail]ret=%i", ret); - return -1; - } - - ret = dpdk_set_port (inst, (uint8_t) port); - - if (ret < 0) - { - NSHAL_LOGERR ("dpdk_set_port fail]ret=%i", ret); - return ret; - } - - ret = dpdk_bond_config (inst, slave_num, slave_inst); - - if (ret < 0) - { - NSHAL_LOGERR ("dpdk_bond_config fail]ret=%i", ret); - return ret; - } - - ret = dpdk_setup_port (inst); - - if (ret < 0) - { - NSHAL_LOGERR ("dpdk_setup_port fail]ret=%i", ret); - return ret; - } - - for (i = 0; i < slave_num; i++) - { - NSHAL_LOGINF ("add slave port_id=%u, nic_name=%s", - slave_inst[i]->data.dpdk_if.port_id, - slave_inst[i]->data.dpdk_if.nic_name); - - if (rte_eth_bond_slave_add - ((uint8_t) port, slave_inst[i]->data.dpdk_if.port_id) == -1) - { - NSHAL_LOGERR ("adding slave (%u) to bond (%u) failed]", - slave_inst[i]->data.dpdk_if.port_id, port); - return -1; - } - } - - rte_eth_macaddr_get (slave_inst[0]->data.dpdk_if.port_id, ð_addr); - - ret = rte_eth_bond_mac_address_set ((uint8_t) port, ð_addr); - if (ret < 0) - { - NSHAL_LOGERR ("rte_eth_bond_mac_address_set fail]ret=%i", ret); - return ret; - } - - ret = rte_eth_dev_start (inst->data.dpdk_if.port_id); - if (ret < 0) - { - NSHAL_LOGERR ("rte_eth_dev_start fail]ret=%i, port_id=%d", ret, - inst->data.dpdk_if.port_id); - return ret; - } - - NSHAL_LOGINF ("port_id=%d,nic_name=%s,mac=%02X:%02X:%02X:%02X:%02X:%02X", - port, - inst->data.dpdk_if.nic_name, - eth_addr.addr_bytes[0], - eth_addr.addr_bytes[1], - eth_addr.addr_bytes[2], - eth_addr.addr_bytes[3], - eth_addr.addr_bytes[4], eth_addr.addr_bytes[5]); - return 0; -} - -/***************************************************************************** - Prototype : dpdk_add_mcastaddr - Description : add mcastaddr to the port - Input : netif_inst_t* inst - void* mc_addr_set - void* mc_addr - uint32_t nb_mc_addr - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_set_mcastaddr (netif_inst_t * inst, void *mc_addr_set, - void *mc_addr, uint32_t nb_mc_addr) -{ - uint8_t port = inst->data.dpdk_if.port_id; - int iRetVal; - - NSHAL_LOGINF ("mc_addr_set number=%u", nb_mc_addr); - iRetVal = rte_eth_dev_set_mc_addr_list (port, mc_addr_set, nb_mc_addr); - if (iRetVal != 0) - { - NSHAL_LOGWAR ("fail to set_mc_addr_list]port=%u,ret=%d", port, iRetVal); - } - - return iRetVal; -} - -/***************************************************************************** - Prototype : dpdk_add_mac_addr - Description : add mcastaddr to the port - Input : netif_inst_t* inst - void* mc_addr - Output : None - Return Value : NSTACK_STATIC int - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_add_mac_addr (netif_inst_t * inst, void *mc_addr) -{ - uint8_t port = inst->data.dpdk_if.port_id; - int iRetVal; - - /* for MLX: set_mc_addr_list() is not callback, so call mac_addr_add() instead */ - iRetVal = rte_eth_dev_mac_addr_add (port, mc_addr, 0); - if (0 != iRetVal) - { - NSHAL_LOGWAR ("fail to add_mac_addr]port=%u,ret=%d", port, iRetVal); - } - - return iRetVal; -} - -/***************************************************************************** - Prototype : dpdk_rmv_mac_addr - Description : remove mcastaddr to the port - Input : netif_inst_t* inst - void* mc_addr - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_rmv_mac_addr (netif_inst_t * inst, void *mc_addr) -{ - uint8_t port = inst->data.dpdk_if.port_id; - int iRetVal; - - /* for MLX: set_mc_addr_list() is not callback, so call mac_addr_remove() instead */ - iRetVal = rte_eth_dev_mac_addr_remove (port, mc_addr); - if (0 != iRetVal) - { - NSHAL_LOGWAR ("fail to rmv_mac_addr]port=%u,ret=%d", port, iRetVal); - } - - return iRetVal; -} - -/***************************************************************************** - Prototype : dpdk_allmcast - Description : set allmcast mode to the port - Input : netif_inst_t* inst - uint8_t enable - Output : None - Return Value : NSTACK_STATIC - Calls : - Called By : - -*****************************************************************************/ -NSTACK_STATIC int -dpdk_allmcast (netif_inst_t * inst, uint8_t enable) -{ - if (enable) - { - rte_eth_allmulticast_enable (inst->data.dpdk_if.port_id); - } - else - { - rte_eth_allmulticast_disable (inst->data.dpdk_if.port_id); - } - - return 0; -} - -const netif_ops_t dpdk_netif_ops = { - .name = "dpdk", - .init_global = dpdk_init_global, - .init_local = dpdk_init_local, - .open = dpdk_open, - .close = dpdk_close, - .start = dpdk_start, - .stop = dpdk_stop, - .bond = dpdk_bond, - .mtu = dpdk_get_mtu, - .macaddr = dpdk_get_macaddr, - .capability = dpdk_get_capability, - .recv = dpdk_recv, - .send = dpdk_send, - .link_status = dpdk_link_status, - .stats = dpdk_stats, - .stats_reset = dpdk_stats_reset, - .config = dpdk_config, - .mcastaddr = dpdk_set_mcastaddr, - .add_mac = dpdk_add_mac_addr, - .rmv_mac = dpdk_rmv_mac_addr, - .allmcast = dpdk_allmcast -}; - -HAL_IO_REGISTER (dpdk, &dpdk_netif_ops); |