1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Intel Corporation
3 */
4
5 #include <stdio.h>
6 #include <string.h>
7
8 #include <rte_eth_ring.h>
9 #include <rte_ethdev.h>
10 #include <rte_mbuf.h>
11 #include <rte_bus_vdev.h>
12 #include "rte_lcore.h"
13 #include "rte_mempool.h"
14 #include "rte_ring.h"
15
16 #include "sample_packet_forward.h"
17
18 /* Sample test to create virtual rings and tx,rx portid from rings */
19 int
test_ring_setup(struct rte_ring ** ring,uint16_t * portid)20 test_ring_setup(struct rte_ring **ring, uint16_t *portid)
21 {
22 *ring = rte_ring_create("R0", RING_SIZE, rte_socket_id(),
23 RING_F_SP_ENQ | RING_F_SC_DEQ);
24 if (*ring == NULL) {
25 printf("%s() line %u: rte_ring_create R0 failed",
26 __func__, __LINE__);
27 return -1;
28 }
29 *portid = rte_eth_from_rings("net_ringa", ring, NUM_QUEUES,
30 ring, NUM_QUEUES, rte_socket_id());
31
32 return 0;
33 }
34
35 /* Sample test to free the mempool */
36 void
test_mp_free(struct rte_mempool * mp)37 test_mp_free(struct rte_mempool *mp)
38 {
39 rte_mempool_free(mp);
40 }
41
42 /* Sample test to free the virtual rings */
43 void
test_ring_free(struct rte_ring * rxtx)44 test_ring_free(struct rte_ring *rxtx)
45 {
46 rte_ring_free(rxtx);
47 }
48
49 /* Sample test to release the vdev */
50 void
test_vdev_uninit(const char * vdev)51 test_vdev_uninit(const char *vdev)
52 {
53 rte_vdev_uninit(vdev);
54 }
55
56 /* sample test to allocate the mempool */
57 int
test_get_mempool(struct rte_mempool ** mp,char * poolname)58 test_get_mempool(struct rte_mempool **mp, char *poolname)
59 {
60 *mp = rte_pktmbuf_pool_create(poolname, NB_MBUF, 32, 0,
61 RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
62 if (*mp == NULL)
63 return -1;
64 return 0;
65 }
66
67 /* sample test to allocate buffer for pkts */
68 int
test_get_mbuf_from_pool(struct rte_mempool ** mp,struct rte_mbuf ** pbuf,char * poolname)69 test_get_mbuf_from_pool(struct rte_mempool **mp, struct rte_mbuf **pbuf,
70 char *poolname)
71 {
72 int ret = 0;
73
74 ret = test_get_mempool(mp, poolname);
75 if (ret < 0)
76 return -1;
77 if (rte_pktmbuf_alloc_bulk(*mp, pbuf, NUM_PACKETS) != 0) {
78 printf("%s() line %u: rte_pktmbuf_alloc_bulk failed", __func__,
79 __LINE__);
80 return -1;
81 }
82 return 0;
83 }
84
85 /* sample test to deallocate the allocated buffers and mempool */
86 void
test_put_mbuf_to_pool(struct rte_mempool * mp,struct rte_mbuf ** pbuf)87 test_put_mbuf_to_pool(struct rte_mempool *mp, struct rte_mbuf **pbuf)
88 {
89 int itr = 0;
90
91 for (itr = 0; itr < NUM_PACKETS; itr++)
92 rte_pktmbuf_free(pbuf[itr]);
93 rte_mempool_free(mp);
94 }
95
96 /* Sample test to forward packets using virtual portids */
97 int
test_packet_forward(struct rte_mbuf ** pbuf,uint16_t portid,uint16_t queue_id)98 test_packet_forward(struct rte_mbuf **pbuf, uint16_t portid, uint16_t queue_id)
99 {
100 /* send and receive packet and check for stats update */
101 if (rte_eth_tx_burst(portid, queue_id, pbuf, NUM_PACKETS)
102 < NUM_PACKETS) {
103 printf("%s() line %u: Error sending packet to"
104 " port %d\n", __func__, __LINE__, portid);
105 return -1;
106 }
107 if (rte_eth_rx_burst(portid, queue_id, pbuf, NUM_PACKETS)
108 < NUM_PACKETS) {
109 printf("%s() line %u: Error receiving packet from"
110 " port %d\n", __func__, __LINE__, portid);
111 return -1;
112 }
113 return 0;
114 }
115