net/softnic: add software queue object
[dpdk.git] / drivers / net / softnic / rte_eth_softnic_swq.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2018 Intel Corporation
3  */
4
5 #include <stdlib.h>
6 #include <string.h>
7
8 #include <rte_string_fns.h>
9
10 #include "rte_eth_softnic_internals.h"
11
12 int
13 softnic_swq_init(struct pmd_internals *p)
14 {
15         TAILQ_INIT(&p->swq_list);
16
17         return 0;
18 }
19
20 void
21 softnic_swq_free(struct pmd_internals *p)
22 {
23         for ( ; ; ) {
24                 struct softnic_swq *swq;
25
26                 swq = TAILQ_FIRST(&p->swq_list);
27                 if (swq == NULL)
28                         break;
29
30                 TAILQ_REMOVE(&p->swq_list, swq, node);
31                 rte_ring_free(swq->r);
32                 free(swq);
33         }
34 }
35
36 struct softnic_swq *
37 softnic_swq_find(struct pmd_internals *p,
38         const char *name)
39 {
40         struct softnic_swq *swq;
41
42         if (name == NULL)
43                 return NULL;
44
45         TAILQ_FOREACH(swq, &p->swq_list, node)
46                 if (strcmp(swq->name, name) == 0)
47                         return swq;
48
49         return NULL;
50 }
51
52 struct softnic_swq *
53 softnic_swq_create(struct pmd_internals *p,
54         const char *name,
55         struct softnic_swq_params *params)
56 {
57         char ring_name[NAME_SIZE];
58         struct softnic_swq *swq;
59         struct rte_ring *r;
60         unsigned int flags = RING_F_SP_ENQ | RING_F_SC_DEQ;
61
62         /* Check input params */
63         if (name == NULL ||
64                 softnic_swq_find(p, name) ||
65                 params == NULL ||
66                 params->size == 0)
67                 return NULL;
68
69         /* Resource create */
70         snprintf(ring_name, sizeof(ring_name), "%s_%s",
71                 p->params.name,
72                 name);
73
74         r = rte_ring_create(ring_name,
75                 params->size,
76                 p->params.cpu_id,
77                 flags);
78
79         if (r == NULL)
80                 return NULL;
81
82         /* Node allocation */
83         swq = calloc(1, sizeof(struct softnic_swq));
84         if (swq == NULL) {
85                 rte_ring_free(r);
86                 return NULL;
87         }
88
89         /* Node fill in */
90         strlcpy(swq->name, name, sizeof(swq->name));
91         swq->r = r;
92
93         /* Node add to list */
94         TAILQ_INSERT_TAIL(&p->swq_list, swq, node);
95
96         return swq;
97 }