xref: /f-stack/tools/compat/ff_ipc.c (revision 2317ada5)
1df6ad731Slogwang /*
2*2317ada5Sfengbojiang  * Copyright (C) 2017-2021 THL A29 Limited, a Tencent company.
3df6ad731Slogwang  * All rights reserved.
4df6ad731Slogwang  *
5df6ad731Slogwang  * Redistribution and use in source and binary forms, with or without
6df6ad731Slogwang  * modification, are permitted provided that the following conditions are met:
7df6ad731Slogwang  *
8df6ad731Slogwang  * 1. Redistributions of source code must retain the above copyright notice, this
9df6ad731Slogwang  *   list of conditions and the following disclaimer.
10df6ad731Slogwang  * 2. Redistributions in binary form must reproduce the above copyright notice,
11df6ad731Slogwang  *   this list of conditions and the following disclaimer in the documentation
12df6ad731Slogwang  *   and/or other materials provided with the distribution.
13df6ad731Slogwang  *
14df6ad731Slogwang  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15df6ad731Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16df6ad731Slogwang  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17df6ad731Slogwang  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18df6ad731Slogwang  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19df6ad731Slogwang  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20df6ad731Slogwang  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21df6ad731Slogwang  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22df6ad731Slogwang  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23df6ad731Slogwang  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24df6ad731Slogwang  *
25df6ad731Slogwang  */
26df6ad731Slogwang 
27df6ad731Slogwang #include <rte_common.h>
28df6ad731Slogwang #include <rte_memory.h>
29df6ad731Slogwang #include <rte_config.h>
30df6ad731Slogwang #include <rte_eal.h>
31df6ad731Slogwang #include <rte_ring.h>
32df6ad731Slogwang #include <rte_mempool.h>
33df6ad731Slogwang #include <rte_malloc.h>
34df6ad731Slogwang #include <unistd.h>
35df6ad731Slogwang 
36df6ad731Slogwang #include "ff_ipc.h"
37df6ad731Slogwang 
38df6ad731Slogwang static int inited;
39df6ad731Slogwang 
40df6ad731Slogwang static struct rte_mempool *message_pool;
41df6ad731Slogwang 
42df6ad731Slogwang uint16_t ff_proc_id = 0;
43df6ad731Slogwang 
44df6ad731Slogwang void
ff_set_proc_id(int pid)45df6ad731Slogwang ff_set_proc_id(int pid)
46df6ad731Slogwang {
47df6ad731Slogwang     if (pid < 0 || pid > 65535) {
48df6ad731Slogwang         printf("Invalid F-Stack proccess id\n");
49df6ad731Slogwang         exit(1);
50df6ad731Slogwang     }
51df6ad731Slogwang     ff_proc_id = pid;
52df6ad731Slogwang }
53df6ad731Slogwang 
5485eb2ae9SAndy int
ff_ipc_init(void)55df6ad731Slogwang ff_ipc_init(void)
56df6ad731Slogwang {
57df6ad731Slogwang     if (inited) {
58df6ad731Slogwang         return 0;
59df6ad731Slogwang     }
60df6ad731Slogwang 
61df6ad731Slogwang     char *dpdk_argv[] = {
62df6ad731Slogwang         "ff-ipc", "-c1", "-n4",
63df6ad731Slogwang         "--proc-type=secondary",
64144c6bcdSlogwang         /* RTE_LOG_WARNING */
65df6ad731Slogwang         "--log-level=5",
66df6ad731Slogwang     };
67df6ad731Slogwang 
68df6ad731Slogwang     int ret = rte_eal_init(sizeof(dpdk_argv)/sizeof(dpdk_argv[0]), dpdk_argv);
69df6ad731Slogwang     if (ret < 0) {
70df6ad731Slogwang         rte_exit(EXIT_FAILURE, "Error with EAL initialization\n");
71df6ad731Slogwang     }
72df6ad731Slogwang 
73df6ad731Slogwang     message_pool = rte_mempool_lookup(FF_MSG_POOL);
74df6ad731Slogwang     if (message_pool == NULL) {
75df6ad731Slogwang         rte_exit(EXIT_FAILURE, "lookup message pool:%s failed!\n", FF_MSG_POOL);
76df6ad731Slogwang     }
77df6ad731Slogwang 
78df6ad731Slogwang     inited = 1;
79df6ad731Slogwang 
80df6ad731Slogwang     return 0;
81df6ad731Slogwang }
82df6ad731Slogwang 
83e10b9b93Szjwsoft void
ff_ipc_exit(void)84e10b9b93Szjwsoft ff_ipc_exit(void)
85e10b9b93Szjwsoft {
86e10b9b93Szjwsoft 	rte_eal_cleanup();
87e10b9b93Szjwsoft 	return;
88e10b9b93Szjwsoft }
89e10b9b93Szjwsoft 
90df6ad731Slogwang struct ff_msg *
ff_ipc_msg_alloc(void)91df6ad731Slogwang ff_ipc_msg_alloc(void)
92df6ad731Slogwang {
93df6ad731Slogwang     if (inited == 0) {
94df6ad731Slogwang         int ret = ff_ipc_init();
95df6ad731Slogwang         if (ret < 0) {
96df6ad731Slogwang             return NULL;
97df6ad731Slogwang         }
98df6ad731Slogwang     }
99df6ad731Slogwang 
100df6ad731Slogwang     void *msg;
101df6ad731Slogwang     if (rte_mempool_get(message_pool, &msg) < 0) {
102df6ad731Slogwang         printf("get buffer from message pool failed.\n");
103df6ad731Slogwang         return NULL;
104df6ad731Slogwang     }
105df6ad731Slogwang 
106df6ad731Slogwang     return (struct ff_msg *)msg;
107df6ad731Slogwang }
108df6ad731Slogwang 
109df6ad731Slogwang int
ff_ipc_msg_free(struct ff_msg * msg)110df6ad731Slogwang ff_ipc_msg_free(struct ff_msg *msg)
111df6ad731Slogwang {
112df6ad731Slogwang     if (inited == 0) {
113df6ad731Slogwang         printf("ff ipc not inited\n");
114df6ad731Slogwang         return -1;
115df6ad731Slogwang     }
116df6ad731Slogwang 
1178d0052bcSfengbojiang     if (msg->original_buf) {
1188d0052bcSfengbojiang         rte_free(msg->buf_addr);
1198d0052bcSfengbojiang         msg->buf_addr = msg->original_buf;
1208d0052bcSfengbojiang         msg->buf_len = msg->original_buf_len;
1218d0052bcSfengbojiang         msg->original_buf = NULL;
1228d0052bcSfengbojiang     }
1238d0052bcSfengbojiang 
124df6ad731Slogwang     rte_mempool_put(message_pool, msg);
125df6ad731Slogwang 
126df6ad731Slogwang     return 0;
127df6ad731Slogwang }
128df6ad731Slogwang 
129df6ad731Slogwang int
ff_ipc_send(const struct ff_msg * msg)130df6ad731Slogwang ff_ipc_send(const struct ff_msg *msg)
131df6ad731Slogwang {
132df6ad731Slogwang     int ret;
133df6ad731Slogwang 
134df6ad731Slogwang     if (inited == 0) {
135df6ad731Slogwang         printf("ff ipc not inited\n");
136df6ad731Slogwang         return -1;
137df6ad731Slogwang     }
138df6ad731Slogwang 
139df6ad731Slogwang     char name[RTE_RING_NAMESIZE];
140df6ad731Slogwang     snprintf(name, RTE_RING_NAMESIZE, "%s%u",
141df6ad731Slogwang         FF_MSG_RING_IN, ff_proc_id);
142df6ad731Slogwang     struct rte_ring *ring = rte_ring_lookup(name);
143df6ad731Slogwang     if (ring == NULL) {
144df6ad731Slogwang         printf("lookup message ring:%s failed!\n", name);
145df6ad731Slogwang         return -1;
146df6ad731Slogwang     }
147df6ad731Slogwang 
148df6ad731Slogwang     ret = rte_ring_enqueue(ring, (void *)msg);
149df6ad731Slogwang     if (ret < 0) {
150df6ad731Slogwang         printf("ff_ipc_send failed\n");
151df6ad731Slogwang         return ret;
152df6ad731Slogwang     }
153df6ad731Slogwang 
154df6ad731Slogwang     return 0;
155df6ad731Slogwang }
156df6ad731Slogwang 
157df6ad731Slogwang int
ff_ipc_recv(struct ff_msg ** msg,enum FF_MSG_TYPE msg_type)1586194fcd2Sfengbojiang(姜凤波) ff_ipc_recv(struct ff_msg **msg, enum FF_MSG_TYPE msg_type)
159df6ad731Slogwang {
160df6ad731Slogwang     int ret, i;
161df6ad731Slogwang     if (inited == 0) {
162df6ad731Slogwang         printf("ff ipc not inited\n");
163df6ad731Slogwang         return -1;
164df6ad731Slogwang     }
165df6ad731Slogwang 
166df6ad731Slogwang     char name[RTE_RING_NAMESIZE];
1676194fcd2Sfengbojiang(姜凤波)     snprintf(name, RTE_RING_NAMESIZE, "%s%u_%u",
1686194fcd2Sfengbojiang(姜凤波)         FF_MSG_RING_OUT, ff_proc_id, msg_type);
169df6ad731Slogwang     struct rte_ring *ring = rte_ring_lookup(name);
170df6ad731Slogwang     if (ring == NULL) {
171df6ad731Slogwang         printf("lookup message ring:%s failed!\n", name);
172df6ad731Slogwang         return -1;
173df6ad731Slogwang     }
174df6ad731Slogwang 
175df6ad731Slogwang     void *obj;
176df6ad731Slogwang     #define MAX_ATTEMPTS_NUM 1000
177df6ad731Slogwang     for (i = 0; i < MAX_ATTEMPTS_NUM; i++) {
178df6ad731Slogwang         ret = rte_ring_dequeue(ring, &obj);
179df6ad731Slogwang         if (ret == 0) {
180df6ad731Slogwang             *msg = (struct ff_msg *)obj;
181df6ad731Slogwang             break;
182df6ad731Slogwang         }
183df6ad731Slogwang 
184df6ad731Slogwang         usleep(1000);
185df6ad731Slogwang     }
186df6ad731Slogwang 
187df6ad731Slogwang     return ret;
188df6ad731Slogwang }
189