diff options
| -rw-r--r-- | service/include/sc_pdump.h | 1 | ||||
| -rw-r--r-- | service/src/pdump.c | 44 | ||||
| -rw-r--r-- | tools/tcpdump/pdump.c | 6 |
3 files changed, 38 insertions, 13 deletions
diff --git a/service/include/sc_pdump.h b/service/include/sc_pdump.h index 6e30175..bb9e41b 100644 --- a/service/include/sc_pdump.h +++ b/service/include/sc_pdump.h @@ -56,6 +56,7 @@ struct mr_pdump_request uint32_t flags; uint32_t ring_size; uint32_t snaplen; + uint32_t offset; char dev_symbol[MR_SYMBOL_MAX]; struct rte_bpf_prm * prm; }; diff --git a/service/src/pdump.c b/service/src/pdump.c index 392755c..b33b851 100644 --- a/service/src/pdump.c +++ b/service/src/pdump.c @@ -14,12 +14,14 @@ /* Mrpdump copy function */ typedef void (*shmdev_pdump_func)(uint16_t port_id, uint16_t queue, struct rte_mempool * mp, struct rte_ring * ring, struct rte_mbuf ** mbufs, unsigned int nr_pkts, struct rte_pdump_stats * stats, - struct rte_bpf * bpf, uint64_t snaplen, enum rte_pcapng_direction direction); + struct rte_bpf * bpf, uint32_t snaplen, uint32_t offset, + enum rte_pcapng_direction direction); struct port_resource { uint16_t queue; - uint64_t snaplen; + uint32_t snaplen; + uint32_t offset; struct rte_ring * rx_ring; struct rte_ring * tx_ring; shmdev_pdump_func rx_pdump_func; @@ -64,10 +66,11 @@ void mr_pdump_rx(port_id_t shmdev_port_id, queue_id_t qid, struct rte_mbuf ** mb struct rte_pdump_stats * stats = &_mr_pdump_main->ports[port_id]->rx_stats; shmdev_pdump_func pdump_func = _mr_pdump_main->ports[port_id]->rx_pdump_func; struct rte_bpf * bpf = _mr_pdump_main->ports[port_id]->rx_bpf; - uint64_t snaplen = _mr_pdump_main->ports[port_id]->snaplen; + uint32_t snaplen = _mr_pdump_main->ports[port_id]->snaplen; + uint32_t offset = _mr_pdump_main->ports[port_id]->offset; /* Dump the pkt */ - pdump_func(port_id, qid, mp, ring, mbufs, nr_pkts, stats, bpf, snaplen, RTE_PCAPNG_DIRECTION_IN); + pdump_func(port_id, qid, mp, ring, mbufs, nr_pkts, stats, bpf, snaplen, offset, RTE_PCAPNG_DIRECTION_IN); } /* Mrpdump for tx */ @@ -91,15 +94,16 @@ void mr_pdump_tx(port_id_t shmdev_port_id, queue_id_t qid, struct rte_mbuf ** mb struct rte_pdump_stats * stats = &_mr_pdump_main->ports[port_id]->tx_stats; shmdev_pdump_func pdump_func = _mr_pdump_main->ports[port_id]->tx_pdump_func; struct rte_bpf * bpf = _mr_pdump_main->ports[port_id]->tx_bpf; - uint64_t snaplen = _mr_pdump_main->ports[port_id]->snaplen; + uint32_t snaplen = _mr_pdump_main->ports[port_id]->snaplen; + uint32_t offset = _mr_pdump_main->ports[port_id]->offset; /* Dump the pkt */ - pdump_func(port_id, qid, mp, ring, mbufs, nr_pkts, stats, bpf, snaplen, RTE_PCAPNG_DIRECTION_OUT); + pdump_func(port_id, qid, mp, ring, mbufs, nr_pkts, stats, bpf, snaplen, offset, RTE_PCAPNG_DIRECTION_OUT); } void shmdev_pdump_copy(uint16_t port_id, uint16_t queue, struct rte_mempool * mp, struct rte_ring * ring, struct rte_mbuf ** mbufs, unsigned int nr_pkts, struct rte_pdump_stats * stats, - struct rte_bpf * bpf, uint64_t snaplen, enum rte_pcapng_direction direction) + struct rte_bpf * bpf, uint32_t snaplen, uint32_t offset, enum rte_pcapng_direction direction) { uint16_t d_pkts = 0; uint64_t rcs[nr_pkts]; @@ -107,7 +111,24 @@ void shmdev_pdump_copy(uint16_t port_id, uint16_t queue, struct rte_mempool * mp if (bpf != NULL) { - rte_bpf_exec_burst(bpf, (void **)mbufs, rcs, nr_pkts); + if (likely(offset == 0)) + { + rte_bpf_exec_burst(bpf, (void **)mbufs, rcs, nr_pkts); + } + else + { + for (int i = 0; i < nr_pkts; i++) + { + rte_pktmbuf_adj(mbufs[i], offset); + } + + rte_bpf_exec_burst(bpf, (void **)mbufs, rcs, nr_pkts); + + for (int i = 0; i < nr_pkts; i++) + { + rte_pktmbuf_prepend(mbufs[i], offset); + } + } } for (unsigned int i = 0; i < nr_pkts; i++) @@ -155,8 +176,8 @@ int mr_pdump_enable(const struct mr_pdump_request * _cli_req, struct mr_pdump_re struct rte_mempool * _mempool = NULL; /* Dump log */ - MR_INFO("Mrpdump enable device: %s, port: %u, queue: %u, rx/tx: %u.", dev_desc->symbol, port_id, _cli_req->queue, - _cli_req->flags); + MR_INFO("Mrpdump enable device: %s, port: %u, queue: %u, rx/tx: %u, offset: %u.", dev_desc->symbol, port_id, + _cli_req->queue, _cli_req->flags, _cli_req->offset); /* Deal rx */ if (_cli_req->flags & RTE_PDUMP_FLAG_RX) @@ -221,6 +242,7 @@ int mr_pdump_enable(const struct mr_pdump_request * _cli_req, struct mr_pdump_re /* Save the pdump info for public */ _mr_pdump_main->ports[port_id]->queue = _cli_req->queue; _mr_pdump_main->ports[port_id]->snaplen = _cli_req->snaplen; + _mr_pdump_main->ports[port_id]->offset = _cli_req->offset; return RT_SUCCESS; } @@ -382,7 +404,7 @@ int mr_pdump_init(struct sc_main * sc) MR_VERIFY_MALLOC(mr_pdump_main); g_mr_pdump_main = mr_pdump_main; - for (int index = 0; index < MR_DEVICE_MAX; index++) + for (int index = 0; index < MR_DEVICE_MAX; index++) { mr_pdump_main->ports[index] = ZMALLOC(sizeof(struct port_resource)); MR_VERIFY_MALLOC(mr_pdump_main->ports[index]); diff --git a/tools/tcpdump/pdump.c b/tools/tcpdump/pdump.c index 348417c..bf3e83c 100644 --- a/tools/tcpdump/pdump.c +++ b/tools/tcpdump/pdump.c @@ -473,7 +473,7 @@ static int launch_args_parse(int argc, char ** argv, char * prgname) } } - return 0; + return 1; } static void print_pdump_stats(void) @@ -769,7 +769,7 @@ static void err_value_dump(int32_t err_value) static void enable_pdump(void) { printf("Enable pdump.\n"); - printf("offset:%u\n", offset); + /* Set all device */ for (int i = 0; i < num_tuples; i++) { @@ -786,6 +786,7 @@ static void enable_pdump(void) req->flags = RTE_PDUMP_FLAG_RX; req->prm = prm; req->snaplen = snaplen; + req->offset = offset; memcpy(req->dev_symbol, pt->dev_symbol, sizeof(pt->dev_symbol)); /* Fill request name */ @@ -840,6 +841,7 @@ static void enable_pdump(void) req->flags = RTE_PDUMP_FLAG_TX; req->prm = prm; req->snaplen = snaplen; + req->offset = offset; memcpy(req->dev_symbol, pt->dev_symbol, sizeof(pt->dev_symbol)); /* Fill request name */ |
