examples/ip_pipeline: add TAP port example
[dpdk.git] / examples / ip_pipeline / mempool.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_mbuf.h>
9
10 #include "mempool.h"
11
12 #define BUFFER_SIZE_MIN        (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
13
14 static struct mempool_list mempool_list;
15
16 int
17 mempool_init(void)
18 {
19         TAILQ_INIT(&mempool_list);
20
21         return 0;
22 }
23
24 struct mempool *
25 mempool_find(const char *name)
26 {
27         struct mempool *mempool;
28
29         if (name == NULL)
30                 return NULL;
31
32         TAILQ_FOREACH(mempool, &mempool_list, node)
33                 if (strcmp(mempool->name, name) == 0)
34                         return mempool;
35
36         return NULL;
37 }
38
39 struct mempool *
40 mempool_create(const char *name, struct mempool_params *params)
41 {
42         struct mempool *mempool;
43         struct rte_mempool *m;
44
45         /* Check input params */
46         if ((name == NULL) ||
47                 mempool_find(name) ||
48                 (params == NULL) ||
49                 (params->buffer_size < BUFFER_SIZE_MIN) ||
50                 (params->pool_size == 0))
51                 return NULL;
52
53         /* Resource create */
54         m = rte_pktmbuf_pool_create(
55                 name,
56                 params->pool_size,
57                 params->cache_size,
58                 0,
59                 params->buffer_size - sizeof(struct rte_mbuf),
60                 params->cpu_id);
61
62         if (m == NULL)
63                 return NULL;
64
65         /* Node allocation */
66         mempool = calloc(1, sizeof(struct mempool));
67         if (mempool == NULL) {
68                 rte_mempool_free(m);
69                 return NULL;
70         }
71
72         /* Node fill in */
73         strncpy(mempool->name, name, sizeof(mempool->name));
74         mempool->m = m;
75         mempool->buffer_size = params->buffer_size;
76
77         /* Node add to list */
78         TAILQ_INSERT_TAIL(&mempool_list, mempool, node);
79
80         return mempool;
81 }