net: add rte prefix to ether structures
[dpdk.git] / drivers / net / softnic / rte_eth_softnic.c
index 347bdff..4bda2f2 100644 (file)
@@ -14,6 +14,7 @@
 #include <rte_errno.h>
 #include <rte_ring.h>
 #include <rte_tm_driver.h>
+#include <rte_mtr_driver.h>
 
 #include "rte_eth_softnic.h"
 #include "rte_eth_softnic_internals.h"
 #define PMD_PARAM_FIRMWARE                                 "firmware"
 #define PMD_PARAM_CONN_PORT                                "conn_port"
 #define PMD_PARAM_CPU_ID                                   "cpu_id"
+#define PMD_PARAM_SC                                       "sc"
 #define PMD_PARAM_TM_N_QUEUES                              "tm_n_queues"
 #define PMD_PARAM_TM_QSIZE0                                "tm_qsize0"
 #define PMD_PARAM_TM_QSIZE1                                "tm_qsize1"
 #define PMD_PARAM_TM_QSIZE2                                "tm_qsize2"
 #define PMD_PARAM_TM_QSIZE3                                "tm_qsize3"
 
-static const char *pmd_valid_args[] = {
+static const char * const pmd_valid_args[] = {
        PMD_PARAM_FIRMWARE,
        PMD_PARAM_CONN_PORT,
        PMD_PARAM_CPU_ID,
+       PMD_PARAM_SC,
        PMD_PARAM_TM_N_QUEUES,
        PMD_PARAM_TM_QSIZE0,
        PMD_PARAM_TM_QSIZE1,
@@ -46,7 +49,7 @@ static const char welcome[] =
 
 static const char prompt[] = "softnic> ";
 
-struct softnic_conn_params conn_params_default = {
+static const struct softnic_conn_params conn_params_default = {
        .welcome = welcome,
        .prompt = prompt,
        .addr = "0.0.0.0",
@@ -58,24 +61,6 @@ struct softnic_conn_params conn_params_default = {
        .msg_handle_arg = NULL,
 };
 
-static const struct rte_eth_dev_info pmd_dev_info = {
-       .min_rx_bufsize = 0,
-       .max_rx_pktlen = UINT32_MAX,
-       .max_rx_queues = UINT16_MAX,
-       .max_tx_queues = UINT16_MAX,
-       .rx_desc_lim = {
-               .nb_max = UINT16_MAX,
-               .nb_min = 0,
-               .nb_align = 1,
-       },
-       .tx_desc_lim = {
-               .nb_max = UINT16_MAX,
-               .nb_min = 0,
-               .nb_align = 1,
-       },
-       .rx_offload_capa = DEV_RX_OFFLOAD_CRC_STRIP,
-};
-
 static int pmd_softnic_logtype;
 
 #define PMD_LOG(level, fmt, args...) \
@@ -86,7 +71,9 @@ static void
 pmd_dev_infos_get(struct rte_eth_dev *dev __rte_unused,
        struct rte_eth_dev_info *dev_info)
 {
-       memcpy(dev_info, &pmd_dev_info, sizeof(*dev_info));
+       dev_info->max_rx_pktlen = UINT32_MAX;
+       dev_info->max_rx_queues = UINT16_MAX;
+       dev_info->max_tx_queues = UINT16_MAX;
 }
 
 static int
@@ -99,26 +86,27 @@ static int
 pmd_rx_queue_setup(struct rte_eth_dev *dev,
        uint16_t rx_queue_id,
        uint16_t nb_rx_desc,
-       unsigned int socket_id,
+       unsigned int socket_id __rte_unused,
        const struct rte_eth_rxconf *rx_conf __rte_unused,
        struct rte_mempool *mb_pool __rte_unused)
 {
-       uint32_t size = RTE_ETH_NAME_MAX_LEN + strlen("_rxq") + 4;
-       char name[size];
-       struct rte_ring *r;
-
-       snprintf(name, sizeof(name), "%s_rxq%04x",
-               dev->data->name,
-               rx_queue_id);
-
-       r = rte_ring_create(name,
-               nb_rx_desc,
-               socket_id,
-               RING_F_SP_ENQ | RING_F_SC_DEQ);
-       if (r == NULL)
+       char name[NAME_SIZE];
+       struct pmd_internals *p = dev->data->dev_private;
+       struct softnic_swq *swq;
+
+       struct softnic_swq_params params = {
+               .size = nb_rx_desc,
+       };
+
+       snprintf(name, sizeof(name), "RXQ%u", rx_queue_id);
+
+       swq = softnic_swq_create(p,
+               name,
+               &params);
+       if (swq == NULL)
                return -1;
 
-       dev->data->rx_queues[rx_queue_id] = r;
+       dev->data->rx_queues[rx_queue_id] = swq->r;
        return 0;
 }
 
@@ -126,31 +114,44 @@ static int
 pmd_tx_queue_setup(struct rte_eth_dev *dev,
        uint16_t tx_queue_id,
        uint16_t nb_tx_desc,
-       unsigned int socket_id,
+       unsigned int socket_id __rte_unused,
        const struct rte_eth_txconf *tx_conf __rte_unused)
 {
-       uint32_t size = RTE_ETH_NAME_MAX_LEN + strlen("_txq") + 4;
-       char name[size];
-       struct rte_ring *r;
-
-       snprintf(name, sizeof(name), "%s_txq%04x",
-               dev->data->name,
-               tx_queue_id);
-
-       r = rte_ring_create(name,
-               nb_tx_desc,
-               socket_id,
-               RING_F_SP_ENQ | RING_F_SC_DEQ);
-       if (r == NULL)
+       char name[NAME_SIZE];
+       struct pmd_internals *p = dev->data->dev_private;
+       struct softnic_swq *swq;
+
+       struct softnic_swq_params params = {
+               .size = nb_tx_desc,
+       };
+
+       snprintf(name, sizeof(name), "TXQ%u", tx_queue_id);
+
+       swq = softnic_swq_create(p,
+               name,
+               &params);
+       if (swq == NULL)
                return -1;
 
-       dev->data->tx_queues[tx_queue_id] = r;
+       dev->data->tx_queues[tx_queue_id] = swq->r;
        return 0;
 }
 
 static int
 pmd_dev_start(struct rte_eth_dev *dev)
 {
+       struct pmd_internals *p = dev->data->dev_private;
+       int status;
+
+       /* Firmware */
+       status = softnic_cli_script_process(p,
+               p->params.firmware,
+               conn_params_default.msg_in_len_max,
+               conn_params_default.msg_out_len_max);
+       if (status)
+               return status;
+
+       /* Link UP */
        dev->data->dev_link.link_status = ETH_LINK_UP;
 
        return 0;
@@ -159,21 +160,30 @@ pmd_dev_start(struct rte_eth_dev *dev)
 static void
 pmd_dev_stop(struct rte_eth_dev *dev)
 {
+       struct pmd_internals *p = dev->data->dev_private;
+
+       /* Link DOWN */
        dev->data->dev_link.link_status = ETH_LINK_DOWN;
+
+       /* Firmware */
+       softnic_pipeline_disable_all(p);
+       softnic_pipeline_free(p);
+       softnic_table_action_profile_free(p);
+       softnic_port_in_action_profile_free(p);
+       softnic_tap_free(p);
+       softnic_tmgr_free(p);
+       softnic_link_free(p);
+       softnic_softnic_swq_free_keep_rxq_txq(p);
+       softnic_mempool_free(p);
+
+       tm_hierarchy_free(p);
+       softnic_mtr_free(p);
 }
 
 static void
-pmd_dev_close(struct rte_eth_dev *dev)
+pmd_dev_close(struct rte_eth_dev *dev __rte_unused)
 {
-       uint32_t i;
-
-       /* RX queues */
-       for (i = 0; i < dev->data->nb_rx_queues; i++)
-               rte_ring_free((struct rte_ring *)dev->data->rx_queues[i]);
-
-       /* TX queues */
-       for (i = 0; i < dev->data->nb_tx_queues; i++)
-               rte_ring_free((struct rte_ring *)dev->data->tx_queues[i]);
+       return;
 }
 
 static int
@@ -183,6 +193,21 @@ pmd_link_update(struct rte_eth_dev *dev __rte_unused,
        return 0;
 }
 
+static int
+pmd_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
+               enum rte_filter_type filter_type,
+               enum rte_filter_op filter_op,
+               void *arg)
+{
+       if (filter_type == RTE_ETH_FILTER_GENERIC &&
+                       filter_op == RTE_ETH_FILTER_GET) {
+               *(const void **)arg = &pmd_flow_ops;
+               return 0;
+       }
+
+       return -ENOTSUP;
+}
+
 static int
 pmd_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void *arg)
 {
@@ -191,6 +216,14 @@ pmd_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void *arg)
        return 0;
 }
 
+static int
+pmd_mtr_ops_get(struct rte_eth_dev *dev __rte_unused, void *arg)
+{
+       *(const struct rte_mtr_ops **)arg = &pmd_mtr_ops;
+
+       return 0;
+}
+
 static const struct eth_dev_ops pmd_ops = {
        .dev_configure = pmd_dev_configure,
        .dev_start = pmd_dev_start,
@@ -200,7 +233,9 @@ static const struct eth_dev_ops pmd_ops = {
        .dev_infos_get = pmd_dev_infos_get,
        .rx_queue_setup = pmd_rx_queue_setup,
        .tx_queue_setup = pmd_tx_queue_setup,
+       .filter_ctrl = pmd_filter_ctrl,
        .tm_ops_get = pmd_tm_ops_get,
+       .mtr_ops_get = pmd_mtr_ops_get,
 };
 
 static uint16_t
@@ -242,12 +277,15 @@ pmd_init(struct pmd_params *params)
        memcpy(&p->params, params, sizeof(p->params));
 
        /* Resources */
+       tm_hierarchy_init(p);
+       softnic_mtr_init(p);
+
        softnic_mempool_init(p);
        softnic_swq_init(p);
        softnic_link_init(p);
-       tm_init(p);
        softnic_tmgr_init(p);
        softnic_tap_init(p);
+       softnic_cryptodev_init(p);
        softnic_port_in_action_profile_init(p);
        softnic_table_action_profile_init(p);
        softnic_pipeline_init(p);
@@ -291,15 +329,17 @@ pmd_free(struct pmd_internals *p)
        softnic_port_in_action_profile_free(p);
        softnic_tap_free(p);
        softnic_tmgr_free(p);
-       tm_free(p);
        softnic_link_free(p);
        softnic_swq_free(p);
        softnic_mempool_free(p);
 
+       tm_hierarchy_free(p);
+       softnic_mtr_free(p);
+
        rte_free(p);
 }
 
-static struct ether_addr eth_addr = {
+static struct rte_ether_addr eth_addr = {
        .addr_bytes = {0},
 };
 
@@ -388,6 +428,7 @@ pmd_parse_args(struct pmd_params *p, const char *params)
        memset(p, 0, sizeof(*p));
        p->firmware = SOFTNIC_FIRMWARE;
        p->cpu_id = SOFTNIC_CPU_ID;
+       p->sc = SOFTNIC_SC;
        p->tm.n_queues = SOFTNIC_TM_N_QUEUES;
        p->tm.qsize[0] = SOFTNIC_TM_QUEUE_SIZE;
        p->tm.qsize[1] = SOFTNIC_TM_QUEUE_SIZE;
@@ -418,6 +459,14 @@ pmd_parse_args(struct pmd_params *p, const char *params)
                        goto out_free;
        }
 
+       /* Service cores (optional) */
+       if (rte_kvargs_count(kvlist, PMD_PARAM_SC) == 1) {
+               ret = rte_kvargs_process(kvlist, PMD_PARAM_SC,
+                       &get_uint32, &p->sc);
+               if (ret < 0)
+                       goto out_free;
+       }
+
        /* TM number of queues (optional) */
        if (rte_kvargs_count(kvlist, PMD_PARAM_TM_N_QUEUES) == 1) {
                ret = rte_kvargs_process(kvlist, PMD_PARAM_TM_N_QUEUES,
@@ -504,7 +553,6 @@ static int
 pmd_remove(struct rte_vdev_device *vdev)
 {
        struct rte_eth_dev *dev = NULL;
-       struct pmd_internals *p;
 
        if (!vdev)
                return -EINVAL;
@@ -515,12 +563,12 @@ pmd_remove(struct rte_vdev_device *vdev)
        dev = rte_eth_dev_allocated(rte_vdev_device_name(vdev));
        if (dev == NULL)
                return -ENODEV;
-       p = dev->data->dev_private;
 
        /* Free device data structures*/
-       rte_free(dev->data);
+       pmd_free(dev->data->dev_private);
+       dev->data->dev_private = NULL; /* already freed */
+       dev->data->mac_addrs = NULL; /* statically allocated */
        rte_eth_dev_release_port(dev);
-       pmd_free(p);
 
        return 0;
 }