From 4ed7096d4a4aff47a812a79252edd0834277ee30 Mon Sep 17 00:00:00 2001 From: rainbow_0206 Date: Fri, 19 Oct 2018 17:04:02 +0800 Subject: Feat: support vhost-user in lwip stack Change-Id: I6685fae6dafb4a4ac4f03bd868aa5ca636ce7054 Signed-off-by: rainbow_0206 --- src/framework/hal/hal.c | 4 +- src/framework/hal/hal.h | 3 +- src/framework/include/hal_api.h | 3 +- stacks/lwip_stack/doc/README.md | 5 ++ stacks/lwip_stack/lwip_src/api/spl_tcpip.c | 2 +- .../lwip_src/include/ip_module/ip_module_api.h | 1 + .../lwip_src/include/netif/sharedmemory.h | 1 + stacks/lwip_stack/lwip_src/ip_module/network.c | 43 +++++++++++++- stacks/lwip_stack/lwip_src/netif/spl_hal.c | 21 ++++++- stacks/lwip_stack/release/script/nstack_fun.sh | 4 +- .../lwip_stack/release/script/run_nstack_main.sh | 3 +- stacks/lwip_stack/release/start_nstack.sh | 46 +++++++++++---- stacks/lwip_stack/src/io_adpt/dpdk.c | 69 +++++++++++++++++++++- stacks/lwip_stack/src/nStackMain/main.c | 2 +- 14 files changed, 183 insertions(+), 24 deletions(-) diff --git a/src/framework/hal/hal.c b/src/framework/hal/hal.c index 545c759..49b1fb7 100644 --- a/src/framework/hal/hal.c +++ b/src/framework/hal/hal.c @@ -312,7 +312,7 @@ hal_get_invalid_hdl () Called By : *****************************************************************************/ hal_hdl_t -hal_create (const char *name, hal_netif_config_t * conf) +hal_create (const char *name, const char *nic_type, hal_netif_config_t * conf) { int ret = -1; uint32_t netif_type; @@ -336,7 +336,7 @@ hal_create (const char *name, hal_netif_config_t * conf) /*open */ for (netif_type = 0; NULL != netif_ops_table[netif_type]; ++netif_type) { - ret = netif_ops_table[netif_type]->open (inst, name); + ret = netif_ops_table[netif_type]->open (inst, name, nic_type); if (0 == ret) { diff --git a/src/framework/hal/hal.h b/src/framework/hal/hal.h index 36ad79d..5a8f51e 100644 --- a/src/framework/hal/hal.h +++ b/src/framework/hal/hal.h @@ -66,6 +66,7 @@ typedef struct dpdk_if char pci_addr[HAL_MAX_PCI_ADDR_LEN]; char nic_name[HAL_MAX_NIC_NAME_LEN]; + char nic_type[HAL_MAX_NIC_NAME_LEN]; char driver_name[HAL_MAX_DRIVER_NAME_LEN]; } dpdk_if_t; @@ -93,7 +94,7 @@ typedef struct netif_ops const char *name; int (*init_global) (int argc, char **argv); int (*init_local) (void); - int (*open) (netif_inst_t * inst, const char *name); + int (*open) (netif_inst_t * inst, const char *name, const char *type); int (*close) (netif_inst_t * inst); int (*start) (netif_inst_t * inst); int (*stop) (netif_inst_t * inst); diff --git a/src/framework/include/hal_api.h b/src/framework/include/hal_api.h index 90c3100..a5d7725 100644 --- a/src/framework/include/hal_api.h +++ b/src/framework/include/hal_api.h @@ -110,7 +110,8 @@ typedef struct hal_netif_config int hal_init_global (int argc, char **argv); int hal_init_local (); -hal_hdl_t hal_create (const char *name, hal_netif_config_t * conf); +hal_hdl_t hal_create (const char *name, const char *nic_type, + hal_netif_config_t * conf); hal_hdl_t hal_bond (const char *bond_name, uint8_t slave_num, hal_hdl_t slave_hdl[]); diff --git a/stacks/lwip_stack/doc/README.md b/stacks/lwip_stack/doc/README.md index e9bb31e..6b533e0 100644 --- a/stacks/lwip_stack/doc/README.md +++ b/stacks/lwip_stack/doc/README.md @@ -67,6 +67,11 @@ Run the process: #./start_nstack.sh ``` +If you want to run it with vhost-user, you can run the start_nstack.sh with parameters as follow. +``` + #./start_nstack.sh --vdev virtio_user,mac=fa:16:3e:5f:b3:08,path=/tmp/unix/sock1.sock,queues=8,queue_size=1024 --no-pci +``` + - Steps 4: Communication test between machine A(as server) with machine B (as client) diff --git a/stacks/lwip_stack/lwip_src/api/spl_tcpip.c b/stacks/lwip_stack/lwip_src/api/spl_tcpip.c index b627bcf..d8c7533 100644 --- a/stacks/lwip_stack/lwip_src/api/spl_tcpip.c +++ b/stacks/lwip_stack/lwip_src/api/spl_tcpip.c @@ -61,7 +61,7 @@ #include "sys.h" -#define NSTACK_MAIN_MAX_PARA 19 +#define NSTACK_MAIN_MAX_PARA 32 #define NSTACK_MAIN_MIN_PARA 1 #define DPDK_DEFAULT_EAL_MEM_SIZE (1024) diff --git a/stacks/lwip_stack/lwip_src/include/ip_module/ip_module_api.h b/stacks/lwip_stack/lwip_src/include/ip_module/ip_module_api.h index 488e13e..acf5057 100644 --- a/stacks/lwip_stack/lwip_src/include/ip_module/ip_module_api.h +++ b/stacks/lwip_stack/lwip_src/include/ip_module/ip_module_api.h @@ -149,6 +149,7 @@ struct network_configuration struct ip_subnet *ip_subnet; char network_name[IP_MODULE_MAX_NAME_LEN]; char type_name[IP_MODULE_MAX_NAME_LEN]; + char nic_type_name[IP_MODULE_MAX_NAME_LEN]; network_buffer *buffer; }; diff --git a/stacks/lwip_stack/lwip_src/include/netif/sharedmemory.h b/stacks/lwip_stack/lwip_src/include/netif/sharedmemory.h index 0a92ea0..6230ed8 100644 --- a/stacks/lwip_stack/lwip_src/include/netif/sharedmemory.h +++ b/stacks/lwip_stack/lwip_src/include/netif/sharedmemory.h @@ -101,6 +101,7 @@ enum proc_run_type struct linux_port_info { char if_name[HAL_MAX_NIC_NAME_LEN]; + char if_type[HAL_MAX_NIC_NAME_LEN]; char ip_addr_linux[18]; //uint32_t ip_addr_linux; char mask_linux[18]; //uint32_t mask_linux; char bcast_linux[18]; //uint32_t bcast_linux; diff --git a/stacks/lwip_stack/lwip_src/ip_module/network.c b/stacks/lwip_stack/lwip_src/ip_module/network.c index ef0d9a7..d7c9630 100644 --- a/stacks/lwip_stack/lwip_src/ip_module/network.c +++ b/stacks/lwip_stack/lwip_src/ip_module/network.c @@ -510,7 +510,8 @@ add_network_configuration (struct network_configuration while (pheader) { if (!spl_hal_is_nic_exist (pheader->nic_name) - && !nic_already_init (pheader->nic_name)) + && !nic_already_init (pheader->nic_name) + && strncmp (tmp->nic_type_name, "vhost", strlen ("vhost"))) { NSOPR_LOGERR ("Invalid configuration %s not exist Error! ", pheader->nic_name); @@ -584,7 +585,7 @@ parse_network_obj (struct json_object *network_obj) NULL, *type_name_obj = NULL; struct json_object *ref_nic_list_obj = NULL, *bond_mode_obj = NULL, *bond_name_obj = NULL, *ipam_obj = NULL; - struct json_object *subnet_obj = NULL; + struct json_object *subnet_obj = NULL, *nic_type_obj = NULL; if (!network_obj) { @@ -687,6 +688,44 @@ parse_network_obj (struct json_object *network_obj) goto RETURN_ERROR; } + json_object_object_get_ex (phy_obj, "nic_type", &nic_type_obj); /*lint !e534 no need to check return value */ + if (nic_type_obj) + { + const char *nic_type_name = + json_object_get_string (nic_type_obj); + if (strcmp (nic_type_name, "pci") != 0 + && strcmp (nic_type_name, "vhost") != 0) + { + NSOPR_LOGERR ("unsupported nic_type]nic_type=%s", + nic_type_name); + goto RETURN_ERROR; + } + + retVal = + STRCPY_S (pst_network_configuration->nic_type_name, + sizeof (pst_network_configuration->nic_type_name), + nic_type_name); + if (EOK != retVal) + { + NSOPR_LOGERR ("strcpy_s failed]ret=%d", retVal); + goto RETURN_ERROR; + } + } + else + { + NSOPR_LOGINF + ("nic_type not specified, use default type]defaul nic_type=pci"); + retVal = + STRCPY_S (pst_network_configuration->nic_type_name, + sizeof (pst_network_configuration->nic_type_name), + "pci"); + if (EOK != retVal) + { + NSOPR_LOGERR ("strcpy_s failed]ret=%d", retVal); + goto RETURN_ERROR; + } + } + json_object_object_get_ex (phy_obj, "ref_nic", &ref_nic_list_obj); if (ref_nic_list_obj) { diff --git a/stacks/lwip_stack/lwip_src/netif/spl_hal.c b/stacks/lwip_stack/lwip_src/netif/spl_hal.c index c7cfca1..93e6cf6 100644 --- a/stacks/lwip_stack/lwip_src/netif/spl_hal.c +++ b/stacks/lwip_stack/lwip_src/netif/spl_hal.c @@ -962,6 +962,23 @@ spl_hal_port_config (unsigned int *port_num) NSPOL_LOGINF (SC_DPDK_INFO, "if_name %s", p_stackx_port_zone-> stackx_one_port[port_index].linux_ip.if_name); + + retVal = + STRCPY_S (p_stackx_port_zone-> + stackx_one_port[port_index].linux_ip.if_type, + sizeof (p_stackx_port_zone-> + stackx_one_port[port_index].linux_ip.if_type), + network->nic_type_name); + if (EOK != retVal) + { + NSPOL_LOGERR ("strcpy_s failed]ret=%d.", retVal); + return -1; + } + + NSPOL_LOGINF (SC_DPDK_INFO, "if_type %s", + p_stackx_port_zone-> + stackx_one_port[port_index].linux_ip.if_type); + retVal = STRCPY_S (p_stackx_port_zone-> stackx_one_port[port_index].linux_ip.ip_addr_linux, @@ -1286,7 +1303,9 @@ spl_hal_port_start (uint16_t nic_id, struct stackx_port_info *p_port_info, conf.tx.ring_size[q] = HAL_TX_RING_SIZE; } - hdl = hal_create (p_port_info->linux_ip.if_name, &conf); + hdl = + hal_create (p_port_info->linux_ip.if_name, p_port_info->linux_ip.if_type, + &conf); if (!hal_is_valid (hdl)) { diff --git a/stacks/lwip_stack/release/script/nstack_fun.sh b/stacks/lwip_stack/release/script/nstack_fun.sh index 5e16283..fed3588 100755 --- a/stacks/lwip_stack/release/script/nstack_fun.sh +++ b/stacks/lwip_stack/release/script/nstack_fun.sh @@ -332,10 +332,10 @@ run_nStackMain() log $LINENO "$env DPDK_TOOL_DIR=$DPDK_TOOL_DIR" log $LINENO "$env LD_LIBRARY_PATH=$LD_LIBRARY_PATH" log $LINENO "$env DPDK_LIB_PATH=$DPDK_LIB_PATH" - log $LINENO "./nStackMain -c $1 -n 4 --huge-dir=$2 --proc-type=primary --file-prefix nStackMain -m $3 stack -c $4 -sleep $5 -bind_cpu $6" + log $LINENO "./nStackMain -c $1 -n 4 --huge-dir=$2 --proc-type=primary --file-prefix nStackMain -m $3 $7 $8 stack -c $4 -sleep $5 -bind_cpu $6" check_file_size $DPDK_FILE cd ..; cd bin/ - ./nStackMain -c $1 -n 4 --huge-dir=$2 --proc-type=primary --file-prefix nStackMain -m $3 stack -c $4 -sleep $5 -bind_cpu $6 >> $DPDK_FILE & + ./nStackMain -c $1 -n 4 --huge-dir=$2 --proc-type=primary --file-prefix nStackMain -m $3 $7 $8 stack -c $4 -sleep $5 -bind_cpu $6 >> $DPDK_FILE & } diff --git a/stacks/lwip_stack/release/script/run_nstack_main.sh b/stacks/lwip_stack/release/script/run_nstack_main.sh index 2bd9e0d..9d6049a 100644 --- a/stacks/lwip_stack/release/script/run_nstack_main.sh +++ b/stacks/lwip_stack/release/script/run_nstack_main.sh @@ -20,7 +20,8 @@ init_network CORE_MASK=1 log $LINENO "start run nstackmain" log $LINENO "COREMASK=$CORE_MASK, HUGE_DIR=$1, MEM_SIZE=$2, RTP_CORE_MASK=$RTP_CORE_MASK, SLEEP_INTERVAL=$SLEEP_INTERVAL, BIND_CPU=$BIND_CPU" +log $LINENO "VDEV=$VDEV, NO_PCI=$NO_PCI" -run_nStackMain $CORE_MASK $1 $2 $RTP_CORE_MASK $SLEEP_INTERVAL $BIND_CPU +run_nStackMain $CORE_MASK $1 $2 $RTP_CORE_MASK $SLEEP_INTERVAL $BIND_CPU $3 $4 exit 0 diff --git a/stacks/lwip_stack/release/start_nstack.sh b/stacks/lwip_stack/release/start_nstack.sh index db0c084..35fe9df 100644 --- a/stacks/lwip_stack/release/start_nstack.sh +++ b/stacks/lwip_stack/release/start_nstack.sh @@ -16,16 +16,40 @@ fi ##get the log info from the parameter of ./start -l XXX -a XXX ### nstack_log_path="" hostinfo_path="" -while getopts "l:i:a:" arg +ARGS=`getopt -o "l:i:a:" -l "vdev:,file-prefix:,no-pci" -n "start_nstack.sh" -- "$@"` +eval set -- "${ARGS}" +while true do - case $arg in - l) - nstack_log_path="$OPTARG" - ;; - i) - hostinfo_path="$OPTARG" - ;; - esac + case "$1" in + -l) + nstack_log_path="$2" + shift 2 + ;; + -i) + hostinfo_path="$2" + shift 2 + ;; + --vdev) + VDEV="--vdev=$2" + shift 2 + ;; + --file-prefix) + FILE_PREFIX="--file-prefix=$2" + shift 2 + ;; + --no-pci) + NO_PCI="--no-pci" + shift 1 + ;; + --) + shift + break + ;; + *) + echo "Option illegal, please check input!" + exit 1 + ;; + esac done hostinfo_stat=0 @@ -116,8 +140,8 @@ install_config ######################################################## core_mask=1 START_TYPE="primary" -log $LINENO "./script/run_nstack_main.sh ${core_mask} $HUGE_DIR $MEM_SIZE $START_TYPE" -${script_path}/script/run_nstack_main.sh $HUGE_DIR $MEM_SIZE +log $LINENO "./script/run_nstack_main.sh ${core_mask} $HUGE_DIR $MEM_SIZE $START_TYPE $VDEV $NO_PCI" +${script_path}/script/run_nstack_main.sh $HUGE_DIR $MEM_SIZE $VDEV $NO_PCI print_pid=$(ps -ux | grep nStackMain | awk '{print $2}' | awk 'NR == 2') echo "nStackMain PID:$print_pid" diff --git a/stacks/lwip_stack/src/io_adpt/dpdk.c b/stacks/lwip_stack/src/io_adpt/dpdk.c index d199513..8518112 100644 --- a/stacks/lwip_stack/src/io_adpt/dpdk.c +++ b/stacks/lwip_stack/src/io_adpt/dpdk.c @@ -190,6 +190,13 @@ NSTACK_STATIC struct rte_eth_conf port_conf_default_bond = { }, }; +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 @@ -699,6 +706,39 @@ dpdk_set_port (netif_inst_t * inst, uint8_t port) } +/***************************************************************************** + 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 @@ -1433,10 +1473,25 @@ dpdk_probe_pci (netif_inst_t * inst) *****************************************************************************/ NSTACK_STATIC int -dpdk_open (netif_inst_t * inst, const char *name) +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) @@ -1445,6 +1500,13 @@ dpdk_open (netif_inst_t * inst, const char *name) 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) @@ -1588,6 +1650,11 @@ dpdk_get_port_conf (netif_inst_t * inst, struct rte_eth_conf **port_conf) { *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; diff --git a/stacks/lwip_stack/src/nStackMain/main.c b/stacks/lwip_stack/src/nStackMain/main.c index ce05068..ec36b75 100644 --- a/stacks/lwip_stack/src/nStackMain/main.c +++ b/stacks/lwip_stack/src/nStackMain/main.c @@ -42,7 +42,7 @@ #define GlOBAL_HELP "--help" #define GLOBAL_Dpdk_ARG "dpdk" #define GLOBAL_STACK_PORT "-port" -#define NSTACK_MAIN_MAX_PARA 19 +#define NSTACK_MAIN_MAX_PARA 32 #define NSTACK_MAIN_MIN_PARA 1 #define MAX_MASTER_OPEN_FD 1024 -- cgit 1.2.3-korg