From: x-fn-spp@sl.ntt-tx.co.jp
To: ferruh.yigit@intel.com, ogawa.yasufumi@lab.ntt.co.jp
Cc: spp@dpdk.org
Subject: [spp] [PATCH 05/23] spp_vf: move functions to common directory
Date: Wed, 21 Nov 2018 10:35:40 +0900 [thread overview]
Message-ID: <201811210136.wAL1a0OB009608@imss03.silk.ntt-tx.co.jp> (raw)
In-Reply-To: <20181121013558.8869-1-x-fn-spp@sl.ntt-tx.co.jp>
From: Hideyuki Yamashita <yamashita.hideyuki@po.ntt-tx.co.jp>
Move common functions of spp_vf and spp_mirror to common directory.
This patch also refactors code on following point.
change of a function name and the return value.
- from spp_check_core_index() to spp_check_core_update()
- from get_del_core_element() to del_component_info()
Signed-off-by: Hideyuki Yamashita <yamashita.hideyuki@po.ntt-tx.co.jp>
Signed-off-by: Naoki Takada <takada.naoki@lab.ntt.co.jp>
---
src/vf/classifier_mac.c | 2 +-
src/vf/common/command_dec.c | 2 +-
src/vf/common/spp_proc.c | 932 ++++++++++++++++++++++++++++++++++++
src/vf/common/spp_proc.h | 364 ++++++++++++++
src/vf/spp_vf.c | 916 +----------------------------------
src/vf/spp_vf.h | 100 ----
6 files changed, 1300 insertions(+), 1016 deletions(-)
create mode 100644 src/vf/common/spp_proc.c
create mode 100644 src/vf/common/spp_proc.h
diff --git a/src/vf/classifier_mac.c b/src/vf/classifier_mac.c
index 2a01f0e..4016ab1 100644
--- a/src/vf/classifier_mac.c
+++ b/src/vf/classifier_mac.c
@@ -868,7 +868,7 @@ spp_classifier_mac_do(int id)
}
while (likely(spp_get_core_status(lcore_id) == SPP_CORE_FORWARD) &&
- likely(spp_check_core_index(lcore_id) == 0)) {
+ likely(spp_check_core_update(lcore_id) == SPP_RET_NG)) {
/* change index of update side */
change_update_index(mng_info, id);
diff --git a/src/vf/common/command_dec.c b/src/vf/common/command_dec.c
index d16f358..5275f4f 100644
--- a/src/vf/common/command_dec.c
+++ b/src/vf/common/command_dec.c
@@ -273,7 +273,7 @@ decode_component_type_value(void *output, const char *arg_val)
if (component->action != SPP_CMD_ACTION_START)
return 0;
- set_type = spp_change_component_type(arg_val);
+ set_type = spp_get_component_type(arg_val);
if (unlikely(set_type <= 0)) {
RTE_LOG(ERR, SPP_COMMAND_PROC,
"Unknown component type. val=%s\n",
diff --git a/src/vf/common/spp_proc.c b/src/vf/common/spp_proc.c
new file mode 100644
index 0000000..7b92e38
--- /dev/null
+++ b/src/vf/common/spp_proc.c
@@ -0,0 +1,932 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Nippon Telegraph and Telephone Corporation
+ */
+
+#include <unistd.h>
+#include <string.h>
+
+#include <rte_eth_ring.h>
+#include <rte_eth_vhost.h>
+#include <rte_cycles.h>
+#include <rte_log.h>
+#include <rte_branch_prediction.h>
+
+#include "spp_proc.h"
+#include "spp_port.h"
+
+#include "../vf/spp_forward.h"
+#include "../vf/classifier_mac.h"
+
+/* Declare global variables */
+
+/**
+ * Make a hexdump of an array data in every 4 byte.
+ * This function is used to dump core_info or component info.
+ */
+void
+dump_buff(const char *name, const void *addr, const size_t size)
+{
+ size_t cnt = 0;
+ size_t max = (size / sizeof(unsigned int)) +
+ ((size % sizeof(unsigned int)) != 0);
+ const uint32_t *buff = addr;
+
+ if ((name != NULL) && (name[0] != '\0'))
+ RTE_LOG(DEBUG, APP, "dump buff. (%s)\n", name);
+
+ for (cnt = 0; cnt < max; cnt += 16) {
+ RTE_LOG(DEBUG, APP, "[%p]"
+ " %08x %08x %08x %08x %08x %08x %08x %08x"
+ " %08x %08x %08x %08x %08x %08x %08x %08x",
+ &buff[cnt],
+ buff[cnt+0], buff[cnt+1],
+ buff[cnt+2], buff[cnt+3],
+ buff[cnt+4], buff[cnt+5],
+ buff[cnt+6], buff[cnt+7],
+ buff[cnt+8], buff[cnt+9],
+ buff[cnt+10], buff[cnt+11],
+ buff[cnt+12], buff[cnt+13],
+ buff[cnt+14], buff[cnt+15]);
+ }
+}
+
+int
+add_ring_pmd(int ring_id)
+{
+ struct rte_ring *ring;
+ int ring_port_id;
+
+ /* Lookup ring of given id */
+ ring = rte_ring_lookup(get_rx_queue_name(ring_id));
+ if (unlikely(ring == NULL)) {
+ RTE_LOG(ERR, APP,
+ "Cannot get RX ring - is server process running?\n");
+ return -1;
+ }
+
+ /* Create ring pmd */
+ ring_port_id = rte_eth_from_ring(ring);
+ RTE_LOG(INFO, APP, "ring port add. (no = %d / port = %d)\n",
+ ring_id, ring_port_id);
+ return ring_port_id;
+}
+
+int
+add_vhost_pmd(int index, int client)
+{
+ struct rte_eth_conf port_conf = {
+ .rxmode = { .max_rx_pkt_len = ETHER_MAX_LEN }
+ };
+ struct rte_mempool *mp;
+ uint16_t vhost_port_id;
+ int nr_queues = 1;
+ const char *name;
+ char devargs[64];
+ char *iface;
+ uint16_t q;
+ int ret;
+#define NR_DESCS 128
+
+ mp = rte_mempool_lookup(PKTMBUF_POOL_NAME);
+ if (unlikely(mp == NULL)) {
+ RTE_LOG(ERR, APP, "Cannot get mempool for mbufs. "
+ "(name = %s)\n", PKTMBUF_POOL_NAME);
+ return -1;
+ }
+
+ /* eth_vhost0 index 0 iface /tmp/sock0 on numa 0 */
+ name = get_vhost_backend_name(index);
+ iface = get_vhost_iface_name(index);
+
+ sprintf(devargs, "%s,iface=%s,queues=%d,client=%d",
+ name, iface, nr_queues, client);
+ ret = dev_attach_by_devargs(devargs, &vhost_port_id);
+ if (unlikely(ret < 0)) {
+ RTE_LOG(ERR, APP, "spp_rte_eth_dev_attach error. "
+ "(ret = %d)\n", ret);
+ return ret;
+ }
+
+ ret = rte_eth_dev_configure(vhost_port_id, nr_queues, nr_queues,
+ &port_conf);
+ if (unlikely(ret < 0)) {
+ RTE_LOG(ERR, APP, "rte_eth_dev_configure error. "
+ "(ret = %d)\n", ret);
+ return ret;
+ }
+
+ /* Allocate and set up 1 RX queue per Ethernet port. */
+ for (q = 0; q < nr_queues; q++) {
+ ret = rte_eth_rx_queue_setup(vhost_port_id, q, NR_DESCS,
+ rte_eth_dev_socket_id(vhost_port_id), NULL, mp);
+ if (unlikely(ret < 0)) {
+ RTE_LOG(ERR, APP,
+ "rte_eth_rx_queue_setup error. (ret = %d)\n",
+ ret);
+ return ret;
+ }
+ }
+
+ /* Allocate and set up 1 TX queue per Ethernet port. */
+ for (q = 0; q < nr_queues; q++) {
+ ret = rte_eth_tx_queue_setup(vhost_port_id, q, NR_DESCS,
+ rte_eth_dev_socket_id(vhost_port_id), NULL);
+ if (unlikely(ret < 0)) {
+ RTE_LOG(ERR, APP,
+ "rte_eth_tx_queue_setup error. (ret = %d)\n",
+ ret);
+ return ret;
+ }
+ }
+
+ /* Start the Ethernet port. */
+ ret = rte_eth_dev_start(vhost_port_id);
+ if (unlikely(ret < 0)) {
+ RTE_LOG(ERR, APP, "rte_eth_dev_start error. (ret = %d)\n",
+ ret);
+ return ret;
+ }
+
+ RTE_LOG(INFO, APP, "vhost port add. (no = %d / port = %d)\n",
+ index, vhost_port_id);
+ return vhost_port_id;
+}
+
+/* Get core status */
+enum spp_core_status
+spp_get_core_status(unsigned int lcore_id)
+{
+ return g_core_info[lcore_id].status;
+}
+
+/**
+ * Check status of all of cores is same as given
+ *
+ * It returns -1 as status mismatch if status is not same.
+ * If core is in use, status will be checked.
+ */
+static int
+check_core_status(enum spp_core_status status)
+{
+ unsigned int lcore_id = 0;
+ RTE_LCORE_FOREACH_SLAVE(lcore_id) {
+ if (g_core_info[lcore_id].status != status) {
+ /* Status is mismatched */
+ return -1;
+ }
+ }
+ return 0;
+}
+
+int
+check_core_status_wait(enum spp_core_status status)
+{
+ int cnt = 0;
+ for (cnt = 0; cnt < SPP_CORE_STATUS_CHECK_MAX; cnt++) {
+ sleep(1);
+ int ret = check_core_status(status);
+ if (ret == 0)
+ return 0;
+ }
+
+ RTE_LOG(ERR, APP, "Status check time out. (status = %d)\n", status);
+ return -1;
+}
+
+/* Set core status */
+void
+set_core_status(unsigned int lcore_id,
+ enum spp_core_status status)
+{
+ g_core_info[lcore_id].status = status;
+}
+
+/* Set all core to given status */
+void
+set_all_core_status(enum spp_core_status status)
+{
+ unsigned int lcore_id = 0;
+ RTE_LCORE_FOREACH_SLAVE(lcore_id) {
+ g_core_info[lcore_id].status = status;
+ }
+}
+
+/**
+ * Set all of component status to SPP_CORE_STOP_REQUEST if received signal
+ * is SIGTERM or SIGINT
+ */
+void
+stop_process(int signal)
+{
+ if (unlikely(signal != SIGTERM) &&
+ unlikely(signal != SIGINT)) {
+ return;
+ }
+
+ g_core_info[g_main_lcore_id].status = SPP_CORE_STOP_REQUEST;
+ set_all_core_status(SPP_CORE_STOP_REQUEST);
+}
+
+/**
+ * Return port info of given type and num of interface
+ *
+ * It returns NULL value if given type is invalid.
+ */
+struct spp_port_info *
+get_iface_info(enum port_type iface_type, int iface_no)
+{
+ switch (iface_type) {
+ case PHY:
+ return &g_iface_info.nic[iface_no];
+ case VHOST:
+ return &g_iface_info.vhost[iface_no];
+ case RING:
+ return &g_iface_info.ring[iface_no];
+ default:
+ return NULL;
+ }
+}
+
+/* Dump of core information */
+void
+dump_core_info(const struct core_mng_info *core_info)
+{
+ char str[SPP_NAME_STR_LEN];
+ const struct core_mng_info *info = NULL;
+ unsigned int lcore_id = 0;
+ RTE_LCORE_FOREACH_SLAVE(lcore_id) {
+ info = &core_info[lcore_id];
+ RTE_LOG(DEBUG, APP, "core[%d] status=%d, ref=%d, upd=%d\n",
+ lcore_id, info->status,
+ info->ref_index, info->upd_index);
+
+ sprintf(str, "core[%d]-0 type=%d, num=%d", lcore_id,
+ info->core[0].type, info->core[0].num);
+ dump_buff(str, info->core[0].id,
+ sizeof(int)*info->core[0].num);
+
+ sprintf(str, "core[%d]-1 type=%d, num=%d", lcore_id,
+ info->core[1].type, info->core[1].num);
+ dump_buff(str, info->core[1].id,
+ sizeof(int)*info->core[1].num);
+ }
+}
+
+/* Dump of component information */
+void
+dump_component_info(const struct spp_component_info *component_info)
+{
+ char str[SPP_NAME_STR_LEN];
+ const struct spp_component_info *component = NULL;
+ int cnt = 0;
+ for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
+ component = &component_info[cnt];
+ if (component->type == SPP_COMPONENT_UNUSE)
+ continue;
+
+ RTE_LOG(DEBUG, APP, "component[%d] name=%s, type=%d, "
+ "core=%u, index=%d\n",
+ cnt, component->name, component->type,
+ component->lcore_id, component->component_id);
+
+ sprintf(str, "component[%d] rx=%d", cnt,
+ component->num_rx_port);
+ dump_buff(str, component->rx_ports,
+ sizeof(struct spp_port_info *)*component->num_rx_port);
+
+ sprintf(str, "component[%d] tx=%d", cnt,
+ component->num_tx_port);
+ dump_buff(str, component->tx_ports,
+ sizeof(struct spp_port_info *)*component->num_tx_port);
+ }
+}
+
+/* Dump of interface information */
+void
+dump_interface_info(const struct iface_info *iface_info)
+{
+ const struct spp_port_info *port = NULL;
+ int cnt = 0;
+ RTE_LOG(DEBUG, APP, "interface phy=%d, vhost=%d, ring=%d\n",
+ iface_info->num_nic,
+ iface_info->num_vhost,
+ iface_info->num_ring);
+ for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
+ port = &iface_info->nic[cnt];
+ if (port->iface_type == UNDEF)
+ continue;
+
+ RTE_LOG(DEBUG, APP, "phy [%d] type=%d, no=%d, port=%d, "
+ "vid = %u, mac=%08lx(%s)\n",
+ cnt, port->iface_type, port->iface_no,
+ port->dpdk_port,
+ port->class_id.vlantag.vid,
+ port->class_id.mac_addr,
+ port->class_id.mac_addr_str);
+ }
+ for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
+ port = &iface_info->vhost[cnt];
+ if (port->iface_type == UNDEF)
+ continue;
+
+ RTE_LOG(DEBUG, APP, "vhost[%d] type=%d, no=%d, port=%d, "
+ "vid = %u, mac=%08lx(%s)\n",
+ cnt, port->iface_type, port->iface_no,
+ port->dpdk_port,
+ port->class_id.vlantag.vid,
+ port->class_id.mac_addr,
+ port->class_id.mac_addr_str);
+ }
+ for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
+ port = &iface_info->ring[cnt];
+ if (port->iface_type == UNDEF)
+ continue;
+
+ RTE_LOG(DEBUG, APP, "ring [%d] type=%d, no=%d, port=%d, "
+ "vid = %u, mac=%08lx(%s)\n",
+ cnt, port->iface_type, port->iface_no,
+ port->dpdk_port,
+ port->class_id.vlantag.vid,
+ port->class_id.mac_addr,
+ port->class_id.mac_addr_str);
+ }
+}
+
+/* Dump of all management information */
+void
+dump_all_mng_info(
+ const struct core_mng_info *core,
+ const struct spp_component_info *component,
+ const struct iface_info *interface)
+{
+ if (rte_log_get_global_level() < RTE_LOG_DEBUG)
+ return;
+
+ dump_core_info(core);
+ dump_component_info(component);
+ dump_interface_info(interface);
+}
+
+/* Copy management information */
+void
+copy_mng_info(
+ struct core_mng_info *dst_core,
+ struct spp_component_info *dst_component,
+ struct iface_info *dst_interface,
+ const struct core_mng_info *src_core,
+ const struct spp_component_info *src_component,
+ const struct iface_info *src_interface,
+ enum copy_mng_flg flg)
+{
+ int upd_index = 0;
+ unsigned int lcore_id = 0;
+
+ switch (flg) {
+ case COPY_MNG_FLG_UPDCOPY:
+ RTE_LCORE_FOREACH_SLAVE(lcore_id) {
+ upd_index = src_core[lcore_id].upd_index;
+ memcpy(&dst_core[lcore_id].core[upd_index],
+ &src_core[lcore_id].core[upd_index],
+ sizeof(struct core_info));
+ }
+ break;
+ default:
+ /*
+ * Even if the flag is set to None,
+ * copying of core is necessary,
+ * so we will treat all copies as default.
+ */
+ memcpy(dst_core, src_core,
+ sizeof(struct core_mng_info)*RTE_MAX_LCORE);
+ break;
+ }
+
+ memcpy(dst_component, src_component,
+ sizeof(struct spp_component_info)*RTE_MAX_LCORE);
+ memcpy(dst_interface, src_interface,
+ sizeof(struct iface_info));
+}
+
+/* Backup the management information */
+void
+backup_mng_info(struct cancel_backup_info *backup)
+{
+ dump_all_mng_info(g_core_info, g_component_info, &g_iface_info);
+ copy_mng_info(backup->core, backup->component, &backup->interface,
+ g_core_info, g_component_info, &g_iface_info,
+ COPY_MNG_FLG_ALLCOPY);
+ dump_all_mng_info(backup->core, backup->component, &backup->interface);
+ memset(g_change_core, 0x00, sizeof(g_change_core));
+ memset(g_change_component, 0x00, sizeof(g_change_component));
+}
+
+/**
+ * Initialize g_iface_info
+ *
+ * Clear g_iface_info and set initial value.
+ */
+static void
+init_iface_info(void)
+{
+ int port_cnt; /* increment ether ports */
+ memset(&g_iface_info, 0x00, sizeof(g_iface_info));
+ for (port_cnt = 0; port_cnt < RTE_MAX_ETHPORTS; port_cnt++) {
+ g_iface_info.nic[port_cnt].iface_type = UNDEF;
+ g_iface_info.nic[port_cnt].iface_no = port_cnt;
+ g_iface_info.nic[port_cnt].dpdk_port = -1;
+ g_iface_info.nic[port_cnt].class_id.vlantag.vid =
+ ETH_VLAN_ID_MAX;
+ g_iface_info.vhost[port_cnt].iface_type = UNDEF;
+ g_iface_info.vhost[port_cnt].iface_no = port_cnt;
+ g_iface_info.vhost[port_cnt].dpdk_port = -1;
+ g_iface_info.vhost[port_cnt].class_id.vlantag.vid =
+ ETH_VLAN_ID_MAX;
+ g_iface_info.ring[port_cnt].iface_type = UNDEF;
+ g_iface_info.ring[port_cnt].iface_no = port_cnt;
+ g_iface_info.ring[port_cnt].dpdk_port = -1;
+ g_iface_info.ring[port_cnt].class_id.vlantag.vid =
+ ETH_VLAN_ID_MAX;
+ }
+}
+
+/**
+ * Initialize g_component_info
+ */
+static void
+init_component_info(void)
+{
+ int cnt;
+ memset(&g_component_info, 0x00, sizeof(g_component_info));
+ for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++)
+ g_component_info[cnt].component_id = cnt;
+ memset(g_change_component, 0x00, sizeof(g_change_component));
+}
+
+/**
+ * Initialize g_core_info
+ */
+static void
+init_core_info(void)
+{
+ int cnt = 0;
+ memset(&g_core_info, 0x00, sizeof(g_core_info));
+ set_all_core_status(SPP_CORE_STOP);
+ for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
+ g_core_info[cnt].ref_index = 0;
+ g_core_info[cnt].upd_index = 1;
+ }
+ memset(g_change_core, 0x00, sizeof(g_change_core));
+}
+
+/**
+ * Setup port info of port on host
+ */
+static int
+set_nic_interface(void)
+{
+ int nic_cnt = 0;
+
+ /* NIC Setting */
+ g_iface_info.num_nic = rte_eth_dev_count_avail();
+ if (g_iface_info.num_nic > RTE_MAX_ETHPORTS)
+ g_iface_info.num_nic = RTE_MAX_ETHPORTS;
+
+ for (nic_cnt = 0; nic_cnt < g_iface_info.num_nic; nic_cnt++) {
+ g_iface_info.nic[nic_cnt].iface_type = PHY;
+ g_iface_info.nic[nic_cnt].dpdk_port = nic_cnt;
+ }
+
+ return 0;
+}
+
+/**
+ * Setup management info for spp_vf
+ */
+int
+init_mng_data(void)
+{
+ /* Initialize interface and core information */
+ init_iface_info();
+ init_core_info();
+ init_component_info();
+
+ int ret_nic = set_nic_interface();
+ if (unlikely(ret_nic != 0))
+ return -1;
+
+ return 0;
+}
+
+#ifdef SPP_RINGLATENCYSTATS_ENABLE
+/**
+ * Print statistics of time for packet processing in ring interface
+ */
+static void
+print_ring_latency_stats(void)
+{
+ /* Clear screen and move cursor to top left */
+ const char topLeft[] = { 27, '[', '1', ';', '1', 'H', '\0' };
+ const char clr[] = { 27, '[', '2', 'J', '\0' };
+ printf("%s%s", clr, topLeft);
+
+ int ring_cnt, stats_cnt;
+ struct spp_ringlatencystats_ring_latency_stats stats[RTE_MAX_ETHPORTS];
+ memset(&stats, 0x00, sizeof(stats));
+
+ printf("RING Latency\n");
+ printf(" RING");
+ for (ring_cnt = 0; ring_cnt < RTE_MAX_ETHPORTS; ring_cnt++) {
+ if (g_iface_info.ring[ring_cnt].iface_type == UNDEF)
+ continue;
+
+ spp_ringlatencystats_get_stats(ring_cnt, &stats[ring_cnt]);
+ printf(", %-18d", ring_cnt);
+ }
+ printf("\n");
+
+ for (stats_cnt = 0; stats_cnt < SPP_RINGLATENCYSTATS_STATS_SLOT_COUNT;
+ stats_cnt++) {
+ printf("%3dns", stats_cnt);
+ for (ring_cnt = 0; ring_cnt < RTE_MAX_ETHPORTS; ring_cnt++) {
+ if (g_iface_info.ring[ring_cnt].iface_type == UNDEF)
+ continue;
+
+ printf(", 0x%-16lx", stats[ring_cnt].slot[stats_cnt]);
+ }
+ printf("\n");
+ }
+}
+#endif /* SPP_RINGLATENCYSTATS_ENABLE */
+
+/* Remove sock file if spp is not running */
+void
+del_vhost_sockfile(struct spp_port_info *vhost)
+{
+ int cnt;
+
+ /* Do not remove for if it is running in vhost-client mode. */
+ if (g_startup_param.vhost_client != 0)
+ return;
+
+ for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
+ if (likely(vhost[cnt].iface_type == UNDEF)) {
+ /* Skip removing if it is not using vhost */
+ continue;
+ }
+
+ remove(get_vhost_iface_name(cnt));
+ }
+}
+
+/* Get component type of target core */
+enum spp_component_type
+spp_get_component_type(unsigned int lcore_id)
+{
+ struct core_mng_info *info = &g_core_info[lcore_id];
+ return info->core[info->ref_index].type;
+}
+
+/* Get core ID of target component */
+unsigned int
+spp_get_component_core(int component_id)
+{
+ struct spp_component_info *info = &g_component_info[component_id];
+ return info->lcore_id;
+}
+
+/* Get core information which is in use */
+struct core_info *
+get_core_info(unsigned int lcore_id)
+{
+ struct core_mng_info *info = &g_core_info[lcore_id];
+ return &(info->core[info->ref_index]);
+}
+
+/* Check core index change */
+int
+spp_check_core_update(unsigned int lcore_id)
+{
+ struct core_mng_info *info = &g_core_info[lcore_id];
+ if (info->ref_index == info->upd_index)
+ return SPP_RET_OK;
+ else
+ return SPP_RET_NG;
+}
+
+int
+spp_check_used_port(
+ enum port_type iface_type,
+ int iface_no,
+ enum spp_port_rxtx rxtx)
+{
+ int cnt, port_cnt, max = 0;
+ struct spp_component_info *component = NULL;
+ struct spp_port_info **port_array = NULL;
+ struct spp_port_info *port = get_iface_info(iface_type, iface_no);
+
+ if (port == NULL)
+ return SPP_RET_NG;
+
+ for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
+ component = &g_component_info[cnt];
+ if (component->type == SPP_COMPONENT_UNUSE)
+ continue;
+
+ if (rxtx == SPP_PORT_RXTX_RX) {
+ max = component->num_rx_port;
+ port_array = component->rx_ports;
+ } else if (rxtx == SPP_PORT_RXTX_TX) {
+ max = component->num_tx_port;
+ port_array = component->tx_ports;
+ }
+ for (port_cnt = 0; port_cnt < max; port_cnt++) {
+ if (unlikely(port_array[port_cnt] == port))
+ return cnt;
+ }
+ }
+
+ return SPP_RET_NG;
+}
+
+/* Set component update flag for given port */
+void
+set_component_change_port(struct spp_port_info *port, enum spp_port_rxtx rxtx)
+{
+ int ret = 0;
+ if ((rxtx == SPP_PORT_RXTX_RX) || (rxtx == SPP_PORT_RXTX_ALL)) {
+ ret = spp_check_used_port(port->iface_type, port->iface_no,
+ SPP_PORT_RXTX_RX);
+ if (ret >= 0)
+ g_change_component[ret] = 1;
+ }
+
+ if ((rxtx == SPP_PORT_RXTX_TX) || (rxtx == SPP_PORT_RXTX_ALL)) {
+ ret = spp_check_used_port(port->iface_type, port->iface_no,
+ SPP_PORT_RXTX_TX);
+ if (ret >= 0)
+ g_change_component[ret] = 1;
+ }
+}
+
+/* Get unused component id */
+int
+get_free_component(void)
+{
+ int cnt = 0;
+ for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
+ if (g_component_info[cnt].type == SPP_COMPONENT_UNUSE)
+ return cnt;
+ }
+ return -1;
+}
+
+/* Get component id for specified component name */
+int
+spp_get_component_id(const char *name)
+{
+ int cnt = 0;
+ if (name[0] == '\0')
+ return SPP_RET_NG;
+
+ for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
+ if (strcmp(name, g_component_info[cnt].name) == 0)
+ return cnt;
+ }
+ return SPP_RET_NG;
+}
+
+/* Delete component information */
+int
+del_component_info(int component_id, int component_num, int *componet_array)
+{
+ int cnt;
+ int match = -1;
+ int max = component_num;
+
+ for (cnt = 0; cnt < max; cnt++) {
+ if (component_id == componet_array[cnt])
+ match = cnt;
+ }
+
+ if (match < 0)
+ return -1;
+
+ /* Last element is excluded from movement. */
+ max--;
+
+ for (cnt = match; cnt < max; cnt++)
+ componet_array[cnt] = componet_array[cnt+1];
+
+ /* Last element is cleared. */
+ componet_array[cnt] = 0;
+ return 0;
+}
+
+/* get port element which matches the condition */
+int
+check_port_element(
+ struct spp_port_info *info,
+ int num,
+ struct spp_port_info *array[])
+{
+ int cnt = 0;
+ int match = -1;
+ for (cnt = 0; cnt < num; cnt++) {
+ if (info == array[cnt])
+ match = cnt;
+ }
+ return match;
+}
+
+/* search matched port_info from array and delete it */
+int
+get_del_port_element(
+ struct spp_port_info *info,
+ int num,
+ struct spp_port_info *array[])
+{
+ int cnt = 0;
+ int match = -1;
+ int max = num;
+
+ match = check_port_element(info, num, array);
+ if (match < 0)
+ return -1;
+
+ /* Last element is excluded from movement. */
+ max--;
+
+ for (cnt = match; cnt < max; cnt++)
+ array[cnt] = array[cnt+1];
+
+ /* Last element is cleared. */
+ array[cnt] = NULL;
+ return 0;
+}
+
+/* Flush initial setting of each interface. */
+int
+flush_port(void)
+{
+ int ret = 0;
+ int cnt = 0;
+ struct spp_port_info *port = NULL;
+
+ /* Initialize added vhost. */
+ for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
+ port = &g_iface_info.vhost[cnt];
+ if ((port->iface_type != UNDEF) && (port->dpdk_port < 0)) {
+ ret = add_vhost_pmd(port->iface_no,
+ g_startup_param.vhost_client);
+ if (ret < 0)
+ return SPP_RET_NG;
+ port->dpdk_port = ret;
+ }
+ }
+
+ /* Initialize added ring. */
+ for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
+ port = &g_iface_info.ring[cnt];
+ if ((port->iface_type != UNDEF) && (port->dpdk_port < 0)) {
+ ret = add_ring_pmd(port->iface_no);
+ if (ret < 0)
+ return SPP_RET_NG;
+ port->dpdk_port = ret;
+ }
+ }
+ return SPP_RET_OK;
+}
+
+/* Flush changed core. */
+void
+flush_core(void)
+{
+ int cnt = 0;
+ struct core_mng_info *info = NULL;
+
+ /* Changed core has changed index. */
+ for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
+ if (g_change_core[cnt] != 0) {
+ info = &g_core_info[cnt];
+ info->upd_index = info->ref_index;
+ }
+ }
+
+ /* Waiting for changed core change. */
+ for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
+ if (g_change_core[cnt] != 0) {
+ info = &g_core_info[cnt];
+ while (likely(info->ref_index == info->upd_index))
+ rte_delay_us_block(SPP_CHANGE_UPDATE_INTERVAL);
+
+ memcpy(&info->core[info->upd_index],
+ &info->core[info->ref_index],
+ sizeof(struct core_info));
+ }
+ }
+}
+
+/* Flush change for forwarder or classifier_mac */
+int
+flush_component(void)
+{
+ int ret = 0;
+ int cnt = 0;
+ struct spp_component_info *component_info = NULL;
+
+ for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
+ if (g_change_component[cnt] == 0)
+ continue;
+
+ component_info = &g_component_info[cnt];
+ spp_port_ability_update(component_info);
+
+ if (component_info->type == SPP_COMPONENT_CLASSIFIER_MAC)
+ ret = spp_classifier_mac_update(component_info);
+ else
+ ret = spp_forward_update(component_info);
+
+ if (unlikely(ret < 0)) {
+ RTE_LOG(ERR, APP, "Flush error. "
+ "( component = %s, type = %d)\n",
+ component_info->name,
+ component_info->type);
+ return SPP_RET_NG;
+ }
+ }
+ return SPP_RET_OK;
+}
+
+/**
+ * Generate a formatted string of combination from interface type and
+ * number and assign to given 'port'
+ */
+int spp_format_port_string(char *port, enum port_type iface_type, int iface_no)
+{
+ const char *iface_type_str;
+
+ switch (iface_type) {
+ case PHY:
+ iface_type_str = SPP_IFTYPE_NIC_STR;
+ break;
+ case RING:
+ iface_type_str = SPP_IFTYPE_RING_STR;
+ break;
+ case VHOST:
+ iface_type_str = SPP_IFTYPE_VHOST_STR;
+ break;
+ default:
+ return -1;
+ }
+
+ sprintf(port, "%s:%d", iface_type_str, iface_no);
+
+ return 0;
+}
+
+/**
+ * Change mac address of 'aa:bb:cc:dd:ee:ff' to int64 and return it
+ */
+int64_t
+spp_change_mac_str_to_int64(const char *mac)
+{
+ int64_t ret_mac = 0;
+ int64_t token_val = 0;
+ int token_cnt = 0;
+ char tmp_mac[SPP_MIN_STR_LEN];
+ char *str = tmp_mac;
+ char *saveptr = NULL;
+ char *endptr = NULL;
+
+ RTE_LOG(DEBUG, APP, "MAC address change. (mac = %s)\n", mac);
+
+ strcpy(tmp_mac, mac);
+ while (1) {
+ /* Split by colon(':') */
+ char *ret_tok = strtok_r(str, ":", &saveptr);
+ if (unlikely(ret_tok == NULL))
+ break;
+
+ /* Check for mal-formatted address */
+ if (unlikely(token_cnt >= ETHER_ADDR_LEN)) {
+ RTE_LOG(ERR, APP, "MAC address format error. "
+ "(mac = %s)\n", mac);
+ return -1;
+ }
+
+ /* Convert string to hex value */
+ int ret_tol = strtol(ret_tok, &endptr, 16);
+ if (unlikely(ret_tok == endptr) || unlikely(*endptr != '\0'))
+ break;
+
+ /* Append separated value to the result */
+ token_val = (int64_t)ret_tol;
+ ret_mac |= token_val << (token_cnt * 8);
+ token_cnt++;
+ str = NULL;
+ }
+
+ RTE_LOG(DEBUG, APP, "MAC address change. (mac = %s => 0x%08lx)\n",
+ mac, ret_mac);
+ return ret_mac;
+}
diff --git a/src/vf/common/spp_proc.h b/src/vf/common/spp_proc.h
new file mode 100644
index 0000000..125af52
--- /dev/null
+++ b/src/vf/common/spp_proc.h
@@ -0,0 +1,364 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Nippon Telegraph and Telephone Corporation
+ */
+
+#ifndef _SPP_PROC_H_
+#define _SPP_PROC_H_
+
+/**
+ * @file
+ * SPP process
+ *
+ * SPP component common function.
+ */
+
+#include <netinet/in.h>
+#include "common.h"
+
+/**
+ * Make a hexdump of an array data in every 4 byte.
+ * This function is used to dump core_info or component info.
+ *
+ * @param name
+ * dump name.
+ * @param addr
+ * dump address.
+ * @param size
+ * dump byte size.
+ *
+ */
+void dump_buff(const char *name, const void *addr, const size_t size);
+
+/**
+ * added ring_pmd
+ *
+ * @param ring_id
+ * added ring id.
+ *
+ * @retval 0~ ring_port_id.
+ * @retval -1 failed.
+ */
+int add_ring_pmd(int ring_id);
+
+/**
+ * added vhost_pmd
+ *
+ * @param index
+ * add vohst id.
+ * @param client
+ * add client id.
+ *
+ * @retval 0~ vhost_port_id.
+ * @retval -1 failed.
+ */
+int add_vhost_pmd(int index, int client);
+
+/**
+ * Get core status
+ *
+ * @param lcore_id
+ * Logical core ID.
+ *
+ * @return
+ * Status of specified logical core.
+ */
+enum spp_core_status spp_get_core_status(unsigned int lcore_id);
+
+/**
+ * Get component type of target core
+ *
+ * @param lcore_id
+ * Logical core ID.
+ *
+ * @return
+ * Type of component executed on specified logical core
+ */
+enum spp_component_type spp_get_component_type(unsigned int lcore_id);
+
+/**
+ * Run check_core_status() for SPP_CORE_STATUS_CHECK_MAX times with
+ * interval time (1sec)
+ *
+ * @param status
+ * wait check status.
+ *
+ * @retval 0 succeeded.
+ * @retval -1 failed.
+ */
+int check_core_status_wait(enum spp_core_status status);
+
+/**
+ * Set core status
+ *
+ * @param lcore_id
+ * Logical core ID.
+ * @param status
+ * set status.
+ *
+ */
+void set_core_status(unsigned int lcore_id, enum spp_core_status status);
+
+/**
+ * Set all core status to given
+ *
+ * @param status
+ * set status.
+ *
+ */
+void set_all_core_status(enum spp_core_status status);
+
+/**
+ * Set all of component status to SPP_CORE_STOP_REQUEST if received signal
+ * is SIGTERM or SIGINT
+ *
+ * @param signl
+ * received signal.
+ *
+ */
+void stop_process(int signal);
+
+/**
+ * Return port info of given type and num of interface
+ *
+ * @param iface_type
+ * Interface type to be validated.
+ * @param iface_no
+ * Interface number to be validated.
+ *
+ * @retval !NULL spp_port_info.
+ * @retval NULL failed.
+ */
+struct spp_port_info *
+get_iface_info(enum port_type iface_type, int iface_no);
+
+/* Dump of core information */
+void dump_core_info(const struct core_mng_info *core_info);
+
+/* Dump of component information */
+void dump_component_info(const struct spp_component_info *component_info);
+
+/* Dump of interface information */
+void dump_interface_info(const struct iface_info *iface_info);
+
+/* Dump of all management information */
+void dump_all_mng_info(
+ const struct core_mng_info *core,
+ const struct spp_component_info *component,
+ const struct iface_info *interface);
+
+/* Copy management information */
+void copy_mng_info(
+ struct core_mng_info *dst_core,
+ struct spp_component_info *dst_component,
+ struct iface_info *dst_interface,
+ const struct core_mng_info *src_core,
+ const struct spp_component_info *src_component,
+ const struct iface_info *src_interface,
+ enum copy_mng_flg flg);
+
+/* Backup the management information */
+void backup_mng_info(struct cancel_backup_info *backup);
+
+/**
+ * Setup management info for spp_vf
+ */
+int init_mng_data(void);
+
+#ifdef SPP_RINGLATENCYSTATS_ENABLE
+/**
+ * Print statistics of time for packet processing in ring interface
+ */
+void print_ring_latency_stats(void);
+#endif /* SPP_RINGLATENCYSTATS_ENABLE */
+
+/* Remove sock file if spp is not running */
+void del_vhost_sockfile(struct spp_port_info *vhost);
+
+/**
+ * Get component type of target core
+ *
+ * @param lcore_id
+ * Logical core ID.
+ *
+ * @return
+ * Type of component executed on specified logical core
+ */
+enum spp_component_type
+spp_get_component_type(unsigned int lcore_id);
+
+/**
+ * Get core ID of target component
+ *
+ * @param component_id
+ * unique component ID.
+ *
+ * @return
+ * Logical core id of specified component.
+ */
+unsigned int spp_get_component_core(int component_id);
+
+/* Get core information which is in use */
+struct core_info *get_core_info(unsigned int lcore_id);
+
+/**
+ * Check core index change
+ *
+ * @param lcore_id
+ * Logical core ID.
+ *
+ * True if index has changed.
+ * @retval SPP_RET_OK index has changed.
+ * @retval SPP_RET_NG index not changed.
+ */
+int spp_check_core_update(unsigned int lcore_id);
+
+/**
+ * Check if component is using port.
+ *
+ * @param iface_type
+ * Interface type to be validated.
+ * @param iface_no
+ * Interface number to be validated.
+ * @param rxtx
+ * tx/rx type to be validated.
+ *
+ * @retval 0~127 match component ID
+ * @retval SPP_RET_NG failed.
+ */
+int spp_check_used_port(
+ enum port_type iface_type,
+ int iface_no,
+ enum spp_port_rxtx rxtx);
+
+/**
+ * Set component update flag for given port.
+ *
+ * @param port
+ * spp_port_info address
+ * @param rxtx
+ * enum spp_port_rxtx
+ *
+ */
+void
+set_component_change_port(struct spp_port_info *port, enum spp_port_rxtx rxtx);
+
+/**
+ * Get unused component id
+ *
+ * @retval 0~127 Component ID.
+ * @retval -1 failed.
+ */
+int get_free_component(void);
+
+/**
+ * Get component id for specified component name
+ *
+ * @param name
+ * Component name.
+ *
+ * @retval 0~127 Component ID.
+ * @retval SPP_RET_NG failed.
+ */
+int spp_get_component_id(const char *name);
+
+/**
+ * Delete component information.
+ *
+ * @param component_id
+ * check data
+ * @param component_num
+ * array check count
+ * @param componet_array
+ * check array address
+ *
+ * @retval 0 succeeded.
+ * @retval -1 failed.
+ */
+int
+del_component_info(int component_id, int component_num, int *componet_array);
+
+/**
+ * get port element which matches the condition.
+ *
+ * @param info
+ * spp_port_info address
+ * @param num
+ * port count
+ * @param array[]
+ * spp_port_info array address
+ *
+ * @retval 0~ match index.
+ * @retval -1 failed.
+ */
+int check_port_element(
+ struct spp_port_info *info,
+ int num,
+ struct spp_port_info *array[]);
+
+/**
+ * search matched port_info from array and delete it.
+ *
+ * @param info
+ * spp_port_info address
+ * @param num
+ * port count
+ * @param array[]
+ * spp_port_info array address
+ *
+ * @retval 0 succeeded.
+ * @retval -1 failed.
+ */
+int get_del_port_element(
+ struct spp_port_info *info,
+ int num,
+ struct spp_port_info *array[]);
+
+/**
+ * Flush initial setting of each interface.
+ *
+ * @retval SPP_RET_OK succeeded.
+ * @retval SPP_RET_NG failed.
+ */
+int flush_port(void);
+
+/**
+ * Flush changed core.
+ */
+void flush_core(void);
+
+/**
+ * Flush change for forwarder or classifier_mac.
+ *
+ * @retval SPP_RET_OK succeeded.
+ * @retval SPP_RET_NG failed.
+ */
+int flush_component(void);
+
+/**
+ * Port type to string
+ *
+ * @param port
+ * Character string of Port type to be converted.
+ * @param iface_type
+ * port interface type
+ * @param iface_no
+ * interface no
+ *
+ * @retval 0 succeeded.
+ * @retval -1 failed.
+ */
+int
+spp_format_port_string(char *port, enum port_type iface_type, int iface_no);
+
+/**
+ * Change mac address string to int64
+ *
+ * @param mac
+ * Character string of MAC address to be converted.
+ *
+ * @retval 0< int64 that store mac address
+ * @retval -1
+ */
+int64_t spp_change_mac_str_to_int64(const char *mac);
+
+#endif /* _SPP_PROC_H_ */
diff --git a/src/vf/spp_vf.c b/src/vf/spp_vf.c
index 96d331e..accef02 100644
--- a/src/vf/spp_vf.c
+++ b/src/vf/spp_vf.c
@@ -146,214 +146,6 @@ usage(const char *progname)
, progname);
}
-/* Make a hexdump of an array data in every 4 byte */
-static void
-dump_buff(const char *name, const void *addr, const size_t size)
-{
- size_t cnt = 0;
- size_t max = (size / sizeof(unsigned int)) +
- ((size % sizeof(unsigned int)) != 0);
- const uint32_t *buff = addr;
-
- if ((name != NULL) && (name[0] != '\0'))
- RTE_LOG(DEBUG, APP, "dump buff. (%s)\n", name);
-
- for (cnt = 0; cnt < max; cnt += 16) {
- RTE_LOG(DEBUG, APP, "[%p]"
- " %08x %08x %08x %08x %08x %08x %08x %08x"
- " %08x %08x %08x %08x %08x %08x %08x %08x",
- &buff[cnt],
- buff[cnt+0], buff[cnt+1],
- buff[cnt+2], buff[cnt+3],
- buff[cnt+4], buff[cnt+5],
- buff[cnt+6], buff[cnt+7],
- buff[cnt+8], buff[cnt+9],
- buff[cnt+10], buff[cnt+11],
- buff[cnt+12], buff[cnt+13],
- buff[cnt+14], buff[cnt+15]);
- }
-}
-
-static int
-add_ring_pmd(int ring_id)
-{
- struct rte_ring *ring;
- int ring_port_id;
-
- /* Lookup ring of given id */
- ring = rte_ring_lookup(get_rx_queue_name(ring_id));
- if (unlikely(ring == NULL)) {
- RTE_LOG(ERR, APP,
- "Cannot get RX ring - is server process running?\n");
- return -1;
- }
-
- /* Create ring pmd */
- ring_port_id = rte_eth_from_ring(ring);
- RTE_LOG(INFO, APP, "ring port add. (no = %d / port = %d)\n",
- ring_id, ring_port_id);
- return ring_port_id;
-}
-
-static int
-add_vhost_pmd(int index, int client)
-{
- struct rte_eth_conf port_conf = {
- .rxmode = { .max_rx_pkt_len = ETHER_MAX_LEN }
- };
- struct rte_mempool *mp;
- uint16_t vhost_port_id;
- int nr_queues = 1;
- const char *name;
- char devargs[64];
- char *iface;
- uint16_t q;
- int ret;
-#define NR_DESCS 128
-
- mp = rte_mempool_lookup(PKTMBUF_POOL_NAME);
- if (unlikely(mp == NULL)) {
- RTE_LOG(ERR, APP, "Cannot get mempool for mbufs. "
- "(name = %s)\n", PKTMBUF_POOL_NAME);
- return -1;
- }
-
- /* eth_vhost0 index 0 iface /tmp/sock0 on numa 0 */
- name = get_vhost_backend_name(index);
- iface = get_vhost_iface_name(index);
-
- sprintf(devargs, "%s,iface=%s,queues=%d,client=%d",
- name, iface, nr_queues, client);
- ret = dev_attach_by_devargs(devargs, &vhost_port_id);
- if (unlikely(ret < 0)) {
- RTE_LOG(ERR, APP, "dev_attach_by_devargs error. (ret = %d)\n",
- ret);
- return ret;
- }
-
- ret = rte_eth_dev_configure(vhost_port_id, nr_queues, nr_queues,
- &port_conf);
- if (unlikely(ret < 0)) {
- RTE_LOG(ERR, APP, "rte_eth_dev_configure error. "
- "(ret = %d)\n", ret);
- return ret;
- }
-
- /* Allocate and set up 1 RX queue per Ethernet port. */
- for (q = 0; q < nr_queues; q++) {
- ret = rte_eth_rx_queue_setup(vhost_port_id, q, NR_DESCS,
- rte_eth_dev_socket_id(vhost_port_id), NULL, mp);
- if (unlikely(ret < 0)) {
- RTE_LOG(ERR, APP,
- "rte_eth_rx_queue_setup error. (ret = %d)\n",
- ret);
- return ret;
- }
- }
-
- /* Allocate and set up 1 TX queue per Ethernet port. */
- for (q = 0; q < nr_queues; q++) {
- ret = rte_eth_tx_queue_setup(vhost_port_id, q, NR_DESCS,
- rte_eth_dev_socket_id(vhost_port_id), NULL);
- if (unlikely(ret < 0)) {
- RTE_LOG(ERR, APP,
- "rte_eth_tx_queue_setup error. (ret = %d)\n",
- ret);
- return ret;
- }
- }
-
- /* Start the Ethernet port. */
- ret = rte_eth_dev_start(vhost_port_id);
- if (unlikely(ret < 0)) {
- RTE_LOG(ERR, APP, "rte_eth_dev_start error. (ret = %d)\n",
- ret);
- return ret;
- }
-
- RTE_LOG(INFO, APP, "vhost port add. (no = %d / port = %d)\n",
- index, vhost_port_id);
- return vhost_port_id;
-}
-
-/* Get core status */
-enum spp_core_status
-spp_get_core_status(unsigned int lcore_id)
-{
- return g_core_info[lcore_id].status;
-}
-
-/**
- * Check status of all of cores is same as given
- *
- * It returns -1 as status mismatch if status is not same.
- * If core is in use, status will be checked.
- */
-static int
-check_core_status(enum spp_core_status status)
-{
- unsigned int lcore_id = 0;
- RTE_LCORE_FOREACH_SLAVE(lcore_id) {
- if (g_core_info[lcore_id].status != status) {
- /* Status is mismatched */
- return -1;
- }
- }
- return 0;
-}
-
-/**
- * Run check_core_status() for SPP_CORE_STATUS_CHECK_MAX times with
- * interval time (1sec)
- */
-static int
-check_core_status_wait(enum spp_core_status status)
-{
- int cnt = 0;
- for (cnt = 0; cnt < SPP_CORE_STATUS_CHECK_MAX; cnt++) {
- sleep(1);
- int ret = check_core_status(status);
- if (ret == 0)
- return 0;
- }
-
- RTE_LOG(ERR, APP, "Status check time out. (status = %d)\n", status);
- return -1;
-}
-
-/* Set core status */
-static void
-set_core_status(unsigned int lcore_id,
- enum spp_core_status status)
-{
- g_core_info[lcore_id].status = status;
-}
-
-/* Set all core to given status */
-static void
-set_all_core_status(enum spp_core_status status)
-{
- unsigned int lcore_id = 0;
- RTE_LCORE_FOREACH_SLAVE(lcore_id) {
- g_core_info[lcore_id].status = status;
- }
-}
-
-/**
- * Set all of component status to SPP_CORE_STOP_REQUEST if received signal
- * is SIGTERM or SIGINT
- */
-static void
-stop_process(int signal) {
- if (unlikely(signal != SIGTERM) &&
- unlikely(signal != SIGINT)) {
- return;
- }
-
- g_core_info[g_main_lcore_id].status = SPP_CORE_STOP_REQUEST;
- set_all_core_status(SPP_CORE_STOP_REQUEST);
-}
-
/**
* Convert string of given client id to integer
*
@@ -479,367 +271,6 @@ parse_app_args(int argc, char *argv[])
return 0;
}
-/**
- * Return port info of given type and num of interface
- *
- * It returns NULL value if given type is invalid.
- */
-static struct spp_port_info *
-get_iface_info(enum port_type iface_type, int iface_no)
-{
- switch (iface_type) {
- case PHY:
- return &g_iface_info.nic[iface_no];
- case VHOST:
- return &g_iface_info.vhost[iface_no];
- case RING:
- return &g_iface_info.ring[iface_no];
- default:
- return NULL;
- }
-}
-
-/* Dump of core information */
-static void
-dump_core_info(const struct core_mng_info *core_info)
-{
- char str[SPP_NAME_STR_LEN];
- const struct core_mng_info *info = NULL;
- unsigned int lcore_id = 0;
- RTE_LCORE_FOREACH_SLAVE(lcore_id) {
- info = &core_info[lcore_id];
- RTE_LOG(DEBUG, APP, "core[%d] status=%d, ref=%d, upd=%d\n",
- lcore_id, info->status,
- info->ref_index, info->upd_index);
-
- sprintf(str, "core[%d]-0 type=%d, num=%d", lcore_id,
- info->core[0].type, info->core[0].num);
- dump_buff(str, info->core[0].id,
- sizeof(int)*info->core[0].num);
-
- sprintf(str, "core[%d]-1 type=%d, num=%d", lcore_id,
- info->core[1].type, info->core[1].num);
- dump_buff(str, info->core[1].id,
- sizeof(int)*info->core[1].num);
- }
-}
-
-/* Dump of component information */
-static void
-dump_component_info(const struct spp_component_info *component_info)
-{
- char str[SPP_NAME_STR_LEN];
- const struct spp_component_info *component = NULL;
- int cnt = 0;
- for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
- component = &component_info[cnt];
- if (component->type == SPP_COMPONENT_UNUSE)
- continue;
-
- RTE_LOG(DEBUG, APP, "component[%d] name=%s, type=%d, "
- "core=%u, index=%d\n",
- cnt, component->name, component->type,
- component->lcore_id, component->component_id);
-
- sprintf(str, "component[%d] rx=%d", cnt,
- component->num_rx_port);
- dump_buff(str, component->rx_ports,
- sizeof(struct spp_port_info *)*component->num_rx_port);
-
- sprintf(str, "component[%d] tx=%d", cnt,
- component->num_tx_port);
- dump_buff(str, component->tx_ports,
- sizeof(struct spp_port_info *)*component->num_tx_port);
- }
-}
-
-/* Dump of interface information */
-static void
-dump_interface_info(const struct iface_info *iface_info)
-{
- const struct spp_port_info *port = NULL;
- int cnt = 0;
- RTE_LOG(DEBUG, APP, "interface phy=%d, vhost=%d, ring=%d\n",
- iface_info->num_nic,
- iface_info->num_vhost,
- iface_info->num_ring);
- for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
- port = &iface_info->nic[cnt];
- if (port->iface_type == UNDEF)
- continue;
-
- RTE_LOG(DEBUG, APP, "phy [%d] type=%d, no=%d, port=%d, "
- "vid = %u, mac=%08lx(%s)\n",
- cnt, port->iface_type, port->iface_no,
- port->dpdk_port,
- port->class_id.vlantag.vid,
- port->class_id.mac_addr,
- port->class_id.mac_addr_str);
- }
- for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
- port = &iface_info->vhost[cnt];
- if (port->iface_type == UNDEF)
- continue;
-
- RTE_LOG(DEBUG, APP, "vhost[%d] type=%d, no=%d, port=%d, "
- "vid = %u, mac=%08lx(%s)\n",
- cnt, port->iface_type, port->iface_no,
- port->dpdk_port,
- port->class_id.vlantag.vid,
- port->class_id.mac_addr,
- port->class_id.mac_addr_str);
- }
- for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
- port = &iface_info->ring[cnt];
- if (port->iface_type == UNDEF)
- continue;
-
- RTE_LOG(DEBUG, APP, "ring [%d] type=%d, no=%d, port=%d, "
- "vid = %u, mac=%08lx(%s)\n",
- cnt, port->iface_type, port->iface_no,
- port->dpdk_port,
- port->class_id.vlantag.vid,
- port->class_id.mac_addr,
- port->class_id.mac_addr_str);
- }
-}
-
-/* Dump of all management information */
-static void
-dump_all_mng_info(
- const struct core_mng_info *core,
- const struct spp_component_info *component,
- const struct iface_info *interface)
-{
- if (rte_log_get_global_level() < RTE_LOG_DEBUG)
- return;
-
- dump_core_info(core);
- dump_component_info(component);
- dump_interface_info(interface);
-}
-
-/* Copy management information */
-static void
-copy_mng_info(
- struct core_mng_info *dst_core,
- struct spp_component_info *dst_component,
- struct iface_info *dst_interface,
- const struct core_mng_info *src_core,
- const struct spp_component_info *src_component,
- const struct iface_info *src_interface,
- enum copy_mng_flg flg)
-{
- int upd_index = 0;
- unsigned int lcore_id = 0;
-
- switch (flg) {
- case COPY_MNG_FLG_UPDCOPY:
- RTE_LCORE_FOREACH_SLAVE(lcore_id) {
- upd_index = src_core[lcore_id].upd_index;
- memcpy(&dst_core[lcore_id].core[upd_index],
- &src_core[lcore_id].core[upd_index],
- sizeof(struct core_info));
- }
- break;
- default:
- /*
- * Even if the flag is set to None,
- * copying of core is necessary,
- * so we will treat all copies as default.
- */
- memcpy(dst_core, src_core,
- sizeof(struct core_mng_info)*RTE_MAX_LCORE);
- break;
- }
-
- memcpy(dst_component, src_component,
- sizeof(struct spp_component_info)*RTE_MAX_LCORE);
- memcpy(dst_interface, src_interface,
- sizeof(struct iface_info));
-}
-
-/* Backup the management information */
-static void
-backup_mng_info(struct cancel_backup_info *backup)
-{
- dump_all_mng_info(g_core_info, g_component_info, &g_iface_info);
- copy_mng_info(backup->core, backup->component, &backup->interface,
- g_core_info, g_component_info, &g_iface_info,
- COPY_MNG_FLG_ALLCOPY);
- dump_all_mng_info(backup->core, backup->component, &backup->interface);
- memset(g_change_core, 0x00, sizeof(g_change_core));
- memset(g_change_component, 0x00, sizeof(g_change_component));
-}
-
-/**
- * Initialize g_iface_info
- *
- * Clear g_iface_info and set initial value.
- */
-static void
-init_iface_info(void)
-{
- int port_cnt; /* increment ether ports */
- memset(&g_iface_info, 0x00, sizeof(g_iface_info));
- for (port_cnt = 0; port_cnt < RTE_MAX_ETHPORTS; port_cnt++) {
- g_iface_info.nic[port_cnt].iface_type = UNDEF;
- g_iface_info.nic[port_cnt].iface_no = port_cnt;
- g_iface_info.nic[port_cnt].dpdk_port = -1;
- g_iface_info.nic[port_cnt].class_id.vlantag.vid =
- ETH_VLAN_ID_MAX;
- g_iface_info.vhost[port_cnt].iface_type = UNDEF;
- g_iface_info.vhost[port_cnt].iface_no = port_cnt;
- g_iface_info.vhost[port_cnt].dpdk_port = -1;
- g_iface_info.vhost[port_cnt].class_id.vlantag.vid =
- ETH_VLAN_ID_MAX;
- g_iface_info.ring[port_cnt].iface_type = UNDEF;
- g_iface_info.ring[port_cnt].iface_no = port_cnt;
- g_iface_info.ring[port_cnt].dpdk_port = -1;
- g_iface_info.ring[port_cnt].class_id.vlantag.vid =
- ETH_VLAN_ID_MAX;
- }
-}
-
-/**
- * Initialize g_component_info
- */
-static void
-init_component_info(void)
-{
- int cnt;
- memset(&g_component_info, 0x00, sizeof(g_component_info));
- for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++)
- g_component_info[cnt].component_id = cnt;
- memset(g_change_component, 0x00, sizeof(g_change_component));
-}
-
-/**
- * Initialize g_core_info
- */
-static void
-init_core_info(void)
-{
- int cnt = 0;
- memset(&g_core_info, 0x00, sizeof(g_core_info));
- set_all_core_status(SPP_CORE_STOP);
- for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
- g_core_info[cnt].ref_index = 0;
- g_core_info[cnt].upd_index = 1;
- }
- memset(g_change_core, 0x00, sizeof(g_change_core));
-}
-
-/**
- * Setup port info of port on host
- */
-static int
-set_nic_interface(void)
-{
- int nic_cnt = 0;
-
- /* NIC Setting */
- g_iface_info.num_nic = rte_eth_dev_count_avail();
- if (g_iface_info.num_nic > RTE_MAX_ETHPORTS)
- g_iface_info.num_nic = RTE_MAX_ETHPORTS;
-
- for (nic_cnt = 0; nic_cnt < g_iface_info.num_nic; nic_cnt++) {
- g_iface_info.nic[nic_cnt].iface_type = PHY;
- g_iface_info.nic[nic_cnt].dpdk_port = nic_cnt;
- }
-
- return 0;
-}
-
-/**
- * Setup management info for spp_vf
- */
-static int
-init_mng_data(void)
-{
- /* Initialize interface and core information */
- init_iface_info();
- init_core_info();
- init_component_info();
-
- int ret_nic = set_nic_interface();
- if (unlikely(ret_nic != 0))
- return -1;
-
- return 0;
-}
-
-#ifdef SPP_RINGLATENCYSTATS_ENABLE
-/**
- * Print statistics of time for packet processing in ring interface
- */
-static void
-print_ring_latency_stats(void)
-{
- /* Clear screen and move cursor to top left */
- const char topLeft[] = { 27, '[', '1', ';', '1', 'H', '\0' };
- const char clr[] = { 27, '[', '2', 'J', '\0' };
- printf("%s%s", clr, topLeft);
-
- int ring_cnt, stats_cnt;
- struct spp_ringlatencystats_ring_latency_stats stats[RTE_MAX_ETHPORTS];
- memset(&stats, 0x00, sizeof(stats));
-
- printf("RING Latency\n");
- printf(" RING");
- for (ring_cnt = 0; ring_cnt < RTE_MAX_ETHPORTS; ring_cnt++) {
- if (g_iface_info.ring[ring_cnt].iface_type == UNDEF)
- continue;
-
- spp_ringlatencystats_get_stats(ring_cnt, &stats[ring_cnt]);
- printf(", %-18d", ring_cnt);
- }
- printf("\n");
-
- for (stats_cnt = 0; stats_cnt < SPP_RINGLATENCYSTATS_STATS_SLOT_COUNT;
- stats_cnt++) {
- printf("%3dns", stats_cnt);
- for (ring_cnt = 0; ring_cnt < RTE_MAX_ETHPORTS; ring_cnt++) {
- if (g_iface_info.ring[ring_cnt].iface_type == UNDEF)
- continue;
-
- printf(", 0x%-16lx", stats[ring_cnt].slot[stats_cnt]);
- }
- printf("\n");
- }
-}
-#endif /* SPP_RINGLATENCYSTATS_ENABLE */
-
-/**
- * Remove sock file
- */
-static void
-del_vhost_sockfile(struct spp_port_info *vhost)
-{
- int cnt;
-
- /* Do not remove for if it is running in vhost-client mode. */
- if (g_startup_param.vhost_client != 0)
- return;
-
- for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
- if (likely(vhost[cnt].iface_type == UNDEF)) {
- /* Skip removing if it is not using vhost */
- continue;
- }
-
- remove(get_vhost_iface_name(cnt));
- }
-}
-
-/* Get component type of target core */
-enum spp_component_type
-spp_get_component_type(unsigned int lcore_id)
-{
- struct core_mng_info *info = &g_core_info[lcore_id];
- return info->core[info->ref_index].type;
-}
-
/* Get component type being updated on target core */
enum spp_component_type
spp_get_component_type_update(unsigned int lcore_id)
@@ -848,29 +279,6 @@ spp_get_component_type_update(unsigned int lcore_id)
return info->core[info->upd_index].type;
}
-/* Get core ID of target component */
-unsigned int
-spp_get_component_core(int component_id)
-{
- struct spp_component_info *info = &g_component_info[component_id];
- return info->lcore_id;
-}
-
-/* Get usage area of target core */
-static struct core_info *
-get_core_info(unsigned int lcore_id)
-{
- struct core_mng_info *info = &g_core_info[lcore_id];
- return &(info->core[info->ref_index]);
-}
-
-/* Check core index change */
-int
-spp_check_core_index(unsigned int lcore_id)
-{
- struct core_mng_info *info = &g_core_info[lcore_id];
- return info->ref_index == info->upd_index;
-}
/* Main process of slave core */
static int
@@ -891,7 +299,7 @@ slave_main(void *arg __attribute__ ((unused)))
if (status != SPP_CORE_FORWARD)
continue;
- if (spp_check_core_index(lcore_id)) {
+ if (spp_check_core_update(lcore_id) == SPP_RET_OK) {
/* Setting with the flush command trigger. */
info->ref_index = (info->upd_index+1) %
SPP_INFO_AREA_MAX;
@@ -1102,66 +510,6 @@ spp_check_flush_port(enum port_type iface_type, int iface_no)
return port->dpdk_port >= 0;
}
-/*
- * Check if component is using port.
- */
-int
-spp_check_used_port(
- enum port_type iface_type,
- int iface_no,
- enum spp_port_rxtx rxtx)
-{
- int cnt, port_cnt, max = 0;
- struct spp_component_info *component = NULL;
- struct spp_port_info **port_array = NULL;
- struct spp_port_info *port = get_iface_info(iface_type, iface_no);
-
- if (port == NULL)
- return SPP_RET_NG;
-
- for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
- component = &g_component_info[cnt];
- if (component->type == SPP_COMPONENT_UNUSE)
- continue;
-
- if (rxtx == SPP_PORT_RXTX_RX) {
- max = component->num_rx_port;
- port_array = component->rx_ports;
- } else if (rxtx == SPP_PORT_RXTX_TX) {
- max = component->num_tx_port;
- port_array = component->tx_ports;
- }
- for (port_cnt = 0; port_cnt < max; port_cnt++) {
- if (unlikely(port_array[port_cnt] == port))
- return cnt;
- }
- }
-
- return SPP_RET_NG;
-}
-
-/*
- * Set port change to component.
- */
-static void
-set_component_change_port(struct spp_port_info *port, enum spp_port_rxtx rxtx)
-{
- int ret = 0;
- if ((rxtx == SPP_PORT_RXTX_RX) || (rxtx == SPP_PORT_RXTX_ALL)) {
- ret = spp_check_used_port(port->iface_type, port->iface_no,
- SPP_PORT_RXTX_RX);
- if (ret >= 0)
- g_change_component[ret] = 1;
- }
-
- if ((rxtx == SPP_PORT_RXTX_TX) || (rxtx == SPP_PORT_RXTX_ALL)) {
- ret = spp_check_used_port(port->iface_type, port->iface_no,
- SPP_PORT_RXTX_TX);
- if (ret >= 0)
- g_change_component[ret] = 1;
- }
-}
-
int
spp_update_classifier_table(
enum spp_command_action action,
@@ -1247,59 +595,6 @@ spp_update_classifier_table(
return SPP_RET_OK;
}
-/* Get free component */
-static int
-get_free_component(void)
-{
- int cnt = 0;
- for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
- if (g_component_info[cnt].type == SPP_COMPONENT_UNUSE)
- return cnt;
- }
- return -1;
-}
-
-/* Get name matching component */
-int
-spp_get_component_id(const char *name)
-{
- int cnt = 0;
- if (name[0] == '\0')
- return SPP_RET_NG;
-
- for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
- if (strcmp(name, g_component_info[cnt].name) == 0)
- return cnt;
- }
- return SPP_RET_NG;
-}
-
-static int
-get_del_core_element(int info, int num, int *array)
-{
- int cnt;
- int match = -1;
- int max = num;
-
- for (cnt = 0; cnt < max; cnt++) {
- if (info == array[cnt])
- match = cnt;
- }
-
- if (match < 0)
- return -1;
-
- /* Last element is excluded from movement. */
- max--;
-
- for (cnt = match; cnt < max; cnt++)
- array[cnt] = array[cnt+1];
-
- /* Last element is cleared. */
- array[cnt] = 0;
- return 0;
-}
-
/* Component command to execute it */
int
spp_update_component(
@@ -1369,7 +664,7 @@ spp_update_component(
info = &g_core_info[tmp_lcore_id];
core = &info->core[info->upd_index];
- ret_del = get_del_core_element(component_id,
+ ret_del = del_component_info(component_id,
core->num, core->id);
if (ret_del >= 0)
/* If deleted, decrement number. */
@@ -1390,46 +685,6 @@ spp_update_component(
return ret;
}
-static int
-check_port_element(
- struct spp_port_info *info,
- int num,
- struct spp_port_info *array[])
-{
- int cnt = 0;
- int match = -1;
- for (cnt = 0; cnt < num; cnt++) {
- if (info == array[cnt])
- match = cnt;
- }
- return match;
-}
-
-static int
-get_del_port_element(
- struct spp_port_info *info,
- int num,
- struct spp_port_info *array[])
-{
- int cnt = 0;
- int match = -1;
- int max = num;
-
- match = check_port_element(info, num, array);
- if (match < 0)
- return -1;
-
- /* Last element is excluded from movement. */
- max--;
-
- for (cnt = match; cnt < max; cnt++)
- array[cnt] = array[cnt+1];
-
- /* Last element is cleared. */
- array[cnt] = NULL;
- return 0;
-}
-
/* Port add or del to execute it */
int
spp_update_port(enum spp_command_action action,
@@ -1523,99 +778,6 @@ spp_update_port(enum spp_command_action action,
return ret;
}
-/* Flush initial setting of each interface. */
-static int
-flush_port(void)
-{
- int ret = 0;
- int cnt = 0;
- struct spp_port_info *port = NULL;
-
- /* Initialize added vhost. */
- for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
- port = &g_iface_info.vhost[cnt];
- if ((port->iface_type != UNDEF) && (port->dpdk_port < 0)) {
- ret = add_vhost_pmd(port->iface_no,
- g_startup_param.vhost_client);
- if (ret < 0)
- return SPP_RET_NG;
- port->dpdk_port = ret;
- }
- }
-
- /* Initialize added ring. */
- for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
- port = &g_iface_info.ring[cnt];
- if ((port->iface_type != UNDEF) && (port->dpdk_port < 0)) {
- ret = add_ring_pmd(port->iface_no);
- if (ret < 0)
- return SPP_RET_NG;
- port->dpdk_port = ret;
- }
- }
- return SPP_RET_OK;
-}
-
-/* Flush changed core. */
-static void
-flush_core(void)
-{
- int cnt = 0;
- struct core_mng_info *info = NULL;
-
- /* Changed core has changed index. */
- for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
- if (g_change_core[cnt] != 0) {
- info = &g_core_info[cnt];
- info->upd_index = info->ref_index;
- }
- }
-
- /* Waiting for changed core change. */
- for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
- if (g_change_core[cnt] != 0) {
- info = &g_core_info[cnt];
- while (likely(info->ref_index == info->upd_index))
- rte_delay_us_block(SPP_CHANGE_UPDATE_INTERVAL);
-
- memcpy(&info->core[info->upd_index],
- &info->core[info->ref_index],
- sizeof(struct core_info));
- }
- }
-}
-
-/* Flush changed component */
-static int
-flush_component(void)
-{
- int ret = 0;
- int cnt = 0;
- struct spp_component_info *component_info = NULL;
-
- for (cnt = 0; cnt < RTE_MAX_LCORE; cnt++) {
- if (g_change_component[cnt] == 0)
- continue;
-
- component_info = &g_component_info[cnt];
- spp_port_ability_update(component_info);
-
- if (component_info->type == SPP_COMPONENT_CLASSIFIER_MAC)
- ret = spp_classifier_mac_update(component_info);
- else
- ret = spp_forward_update(component_info);
-
- if (unlikely(ret < 0)) {
- RTE_LOG(ERR, APP, "Flush error. "
- "( component = %s, type = %d)\n",
- component_info->name,
- component_info->type);
- return SPP_RET_NG;
- }
- }
- return SPP_RET_OK;
-}
-
/* Flush command to execute it */
int
spp_flush(void)
@@ -1776,80 +938,6 @@ spp_get_iface_index(const char *port,
return 0;
}
-/**
- * Generate a formatted string of combination from interface type and
- * number and assign to given 'port'
- */
-int spp_format_port_string(char *port, enum port_type iface_type, int iface_no)
-{
- const char *iface_type_str;
-
- switch (iface_type) {
- case PHY:
- iface_type_str = SPP_IFTYPE_NIC_STR;
- break;
- case RING:
- iface_type_str = SPP_IFTYPE_RING_STR;
- break;
- case VHOST:
- iface_type_str = SPP_IFTYPE_VHOST_STR;
- break;
- default:
- return -1;
- }
-
- sprintf(port, "%s:%d", iface_type_str, iface_no);
-
- return 0;
-}
-
-/**
- * Change mac address of 'aa:bb:cc:dd:ee:ff' to int64 and return it
- */
-int64_t
-spp_change_mac_str_to_int64(const char *mac)
-{
- int64_t ret_mac = 0;
- int64_t token_val = 0;
- int token_cnt = 0;
- char tmp_mac[SPP_MIN_STR_LEN];
- char *str = tmp_mac;
- char *saveptr = NULL;
- char *endptr = NULL;
-
- RTE_LOG(DEBUG, APP, "MAC address change. (mac = %s)\n", mac);
-
- strcpy(tmp_mac, mac);
- while (1) {
- /* Split by colon(':') */
- char *ret_tok = strtok_r(str, ":", &saveptr);
- if (unlikely(ret_tok == NULL))
- break;
-
- /* Check for mal-formatted address */
- if (unlikely(token_cnt >= ETHER_ADDR_LEN)) {
- RTE_LOG(ERR, APP, "MAC address format error. "
- "(mac = %s)\n", mac);
- return -1;
- }
-
- /* Convert string to hex value */
- int ret_tol = strtol(ret_tok, &endptr, 16);
- if (unlikely(ret_tok == endptr) || unlikely(*endptr != '\0'))
- break;
-
- /* Append separated value to the result */
- token_val = (int64_t)ret_tol;
- ret_mac |= token_val << (token_cnt * 8);
- token_cnt++;
- str = NULL;
- }
-
- RTE_LOG(DEBUG, APP, "MAC address change. (mac = %s => 0x%08lx)\n",
- mac, ret_mac);
- return ret_mac;
-}
-
/**
* Return the type of forwarder as a member of enum of spp_component_type
*/
diff --git a/src/vf/spp_vf.h b/src/vf/spp_vf.h
index 8bc5961..5586207 100644
--- a/src/vf/spp_vf.h
+++ b/src/vf/spp_vf.h
@@ -327,28 +327,6 @@ struct spp_iterate_classifier_table_params {
int spp_iterate_classifier_table(
struct spp_iterate_classifier_table_params *params);
-/**
- * Get core status
- *
- * @param lcore_id
- * Logical core ID.
- *
- * @return
- * Status of specified logical core.
- */
-enum spp_core_status spp_get_core_status(unsigned int lcore_id);
-
-/**
- * Get component type of target core
- *
- * @param lcore_id
- * Logical core ID.
- *
- * @return
- * Type of component executed on specified logical core
- */
-enum spp_component_type spp_get_component_type(unsigned int lcore_id);
-
/**
* Get component type being updated on target core
*
@@ -361,39 +339,6 @@ enum spp_component_type spp_get_component_type(unsigned int lcore_id);
*/
enum spp_component_type spp_get_component_type_update(unsigned int lcore_id);
-/**
- * Get core ID of target component
- *
- * @param component_id
- * unique component ID.
- *
- * @return
- * Logical core id of specified component.
- */
-unsigned int spp_get_component_core(int component_id);
-
-/**
- * Check core index change
- *
- * @param lcore_id
- * Logical core ID.
- *
- * @return
- * True if index has changed.
- */
-int spp_check_core_index(unsigned int lcore_id);
-
-/**
- * Get name matching component ID
- *
- * @param name
- * Component name.
- *
- * @retval 0~127 Component ID.
- * @retval SPP_RET_NG failed.
- */
-int spp_get_component_id(const char *name);
-
/**
* Check mac address used on the port for registering or removing
*
@@ -440,35 +385,6 @@ int spp_check_added_port(enum port_type iface_type, int iface_no);
*/
int spp_check_flush_port(enum port_type iface_type, int iface_no);
-/**
- * Check if component is using port.
- *
- * @param iface_type
- * Interface type to be validated.
- * @param iface_no
- * Interface number to be validated.
- * @param rxtx
- * tx/rx type to be validated.
- *
- * @retval 0~127 match component ID
- * @retval SPP_RET_NG failed.
- */
-int spp_check_used_port(
- enum port_type iface_type,
- int iface_no,
- enum spp_port_rxtx rxtx);
-
-/**
- * Change mac address string to int64
- *
- * @param mac
- * Character string of MAC address to be converted.
- *
- * @retval 0< int64 that store mac address
- * @retval -1
- */
-int64_t spp_change_mac_str_to_int64(const char *mac);
-
/**
* Get the port number of DPDK.
*
@@ -500,22 +416,6 @@ int spp_get_iface_index(
enum port_type *iface_type,
int *iface_no);
-/**
- * Format port string form if-type/if-number
- *
- * @param port
- * Character string expressing the port, e.g. "phy:0","ring:1"
- * @param iface_type
- * Interface type.
- * @param iface_no
- * Interface number.
- *
- * @retval 0 succeeded.
- * @retval -1 failed.
- */
-int
-spp_format_port_string(char *port, enum port_type iface_type, int iface_no);
-
/**
* Change component type from string to type value.
*
--
2.18.0
next prev parent reply other threads:[~2018-11-21 1:41 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20181121013558.8869-1-x-fn-spp@sl.ntt-tx.co.jp>
2018-11-21 1:35 ` [spp] [PATCH 01/23] spp_vf: fix invalid code for max chars x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 02/23] spp_vf: move common source and header files x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 03/23] spp_vf: change include path x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 04/23] spp_vf: update Makefile for common files x-fn-spp
2018-11-21 1:35 ` x-fn-spp [this message]
2018-11-21 1:35 ` [spp] [PATCH 06/23] spp_vf: move defines to common dir x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 07/23] spp_vf: move functions for decode " x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 08/23] spp_vf: move defines " x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 09/23] spp_vf: move functions to command_proc.c x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 10/23] spp_vf: add management data registration x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 11/23] spp_vf: change reference of management data x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 12/23] spp_vf: change return values to explain result x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 13/23] spp_vf: define terms of commands as consts x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 14/23] spp_vf: remove unnecessary includes x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 15/23] spp_vf: add include header files x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 16/23] spp_vf: update comments for header file x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 17/23] spp_vf: update makefile of spp_vf x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 18/23] spp_vf: add check num of ports before forwarding x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 19/23] spp_vf: add flag for classifier table x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 20/23] spp_vf: add checking the number of ports x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 21/23] spp_vf: add vlantag command check flag x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 22/23] spp_vf: simplify changing VLAN tag x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 23/23] spp_vf: add SPP_VF_MODULE preprocessor directive x-fn-spp
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201811210136.wAL1a0OB009608@imss03.silk.ntt-tx.co.jp \
--to=x-fn-spp@sl.ntt-tx.co.jp \
--cc=ferruh.yigit@intel.com \
--cc=ogawa.yasufumi@lab.ntt.co.jp \
--cc=spp@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).