summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/include/sc_pdump.h1
-rw-r--r--service/src/pdump.c44
-rw-r--r--tools/tcpdump/pdump.c6
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 */