1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2021 Intel Corporation
9 #include <rte_hexdump.h>
11 #include "rte_swx_port_fd.h"
18 #define TRACE(...) printf(__VA_ARGS__)
31 struct rte_mempool *mempool;
34 struct rte_swx_port_in_stats stats;
35 struct rte_mbuf **pkts;
41 reader_create(void *args)
43 struct rte_swx_port_fd_reader_params *conf = args;
46 /* Check input parameters. */
47 if (!conf || conf->fd < 0 || conf->mtu == 0 || !conf->mempool)
50 /* Memory allocation. */
51 p = calloc(1, sizeof(struct reader));
55 p->pkts = calloc(conf->burst_size, sizeof(struct rte_mbuf *));
62 p->params.fd = conf->fd;
63 p->params.mtu = conf->mtu;
64 p->params.burst_size = conf->burst_size;
65 p->params.mempool = conf->mempool;
71 reader_free(void *port)
73 struct reader *p = port;
79 for (i = 0; i < p->n_pkts; i++)
80 rte_pktmbuf_free(p->pkts[i]);
87 reader_pkt_rx(void *port, struct rte_swx_pkt *pkt)
89 struct reader *p = port;
95 if (p->n_pkts == p->pos) {
96 if (rte_pktmbuf_alloc_bulk(p->params.mempool, p->pkts, p->params.burst_size) != 0)
99 for (i = 0; i < p->params.burst_size; i++) {
101 pkt_data = rte_pktmbuf_mtod(m, void *);
102 n_bytes = read(p->params.fd, pkt_data, (size_t) p->params.mtu);
107 m->data_len = n_bytes;
108 m->pkt_len = n_bytes;
111 p->stats.n_bytes += n_bytes;
114 for (j = i; j < p->params.burst_size; j++)
115 rte_pktmbuf_free(p->pkts[j]);
124 m = p->pkts[p->pos++];
126 pkt->pkt = m->buf_addr;
127 pkt->offset = m->data_off;
128 pkt->length = m->pkt_len;
130 TRACE("[FD %u] Pkt %d (%u bytes at offset %u)\n",
131 (uint32_t)p->params.fd,
137 rte_hexdump(stdout, NULL,
138 &((uint8_t *)m->buf_addr)[m->data_off], m->data_len);
144 reader_stats_read(void *port, struct rte_swx_port_in_stats *stats)
146 struct reader *p = port;
148 memcpy(stats, &p->stats, sizeof(p->stats));
159 struct rte_mempool *mempool;
162 struct rte_swx_port_out_stats stats;
163 struct rte_mbuf **pkts;
168 writer_create(void *args)
170 struct rte_swx_port_fd_writer_params *conf = args;
173 /* Check input parameters. */
177 /* Memory allocation. */
178 p = calloc(1, sizeof(struct writer));
183 p->pkts = calloc(conf->burst_size, sizeof(struct rte_mbuf *));
189 /* Initialization. */
190 p->params.fd = conf->fd;
191 p->params.burst_size = conf->burst_size;
197 __writer_flush(struct writer *p)
199 struct rte_mbuf *pkt;
205 for (i = 0; i < p->n_pkts; i++) {
207 pkt_data = rte_pktmbuf_mtod(pkt, void*);
208 n_bytes = rte_pktmbuf_data_len(pkt);
210 ret = write(p->params.fd, pkt_data, n_bytes);
215 TRACE("[FD %u] %u packets out\n",
216 (uint32_t)p->params.fd,
219 for (i = 0; i < p->n_pkts; i++)
220 rte_pktmbuf_free(p->pkts[i]);
226 writer_pkt_tx(void *port, struct rte_swx_pkt *pkt)
228 struct writer *p = port;
229 struct rte_mbuf *m = pkt->handle;
231 TRACE("[FD %u] Pkt %u (%u bytes at offset %u)\n",
232 (uint32_t)p->params.fd,
238 rte_hexdump(stdout, NULL, &pkt->pkt[pkt->offset], pkt->length);
240 m->pkt_len = pkt->length;
241 m->data_len = (uint16_t)pkt->length;
242 m->data_off = (uint16_t)pkt->offset;
245 p->stats.n_bytes += pkt->length;
247 p->pkts[p->n_pkts++] = m;
248 if (p->n_pkts == p->params.burst_size)
253 writer_flush(void *port)
255 struct writer *p = port;
262 writer_free(void *port)
264 struct writer *p = port;
275 writer_stats_read(void *port, struct rte_swx_port_out_stats *stats)
277 struct writer *p = port;
279 memcpy(stats, &p->stats, sizeof(p->stats));
283 * Summary of port operations
285 struct rte_swx_port_in_ops rte_swx_port_fd_reader_ops = {
286 .create = reader_create,
288 .pkt_rx = reader_pkt_rx,
289 .stats_read = reader_stats_read,
292 struct rte_swx_port_out_ops rte_swx_port_fd_writer_ops = {
293 .create = writer_create,
295 .pkt_tx = writer_pkt_tx,
296 .flush = writer_flush,
297 .stats_read = writer_stats_read,