diff options
| author | songyanchao <[email protected]> | 2024-07-05 02:18:18 +0000 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2024-07-05 02:18:18 +0000 |
| commit | 3417adb5836d703c49b38adbed695ca0aa276159 (patch) | |
| tree | 939524a4482c72c1ad5787c47753d791cce3aa0a | |
| parent | d097519337436971dcd73ecf51d5c12a6b0fcd75 (diff) | |
✨ feat(DPISDN-51): Add support for offset argument in mrpdump.
Add support for offset argument in mrpdump.
| -rw-r--r-- | support/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-app.patch | 11 | ||||
| -rw-r--r-- | support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-c.patch | 208 | ||||
| -rw-r--r-- | support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-h.patch | 18 | ||||
| -rw-r--r-- | tools/tcpdump/pdump.c | 17 |
5 files changed, 254 insertions, 3 deletions
diff --git a/support/CMakeLists.txt b/support/CMakeLists.txt index 47d39bd..1dcd29a 100644 --- a/support/CMakeLists.txt +++ b/support/CMakeLists.txt @@ -104,6 +104,9 @@ set(DPDP_PATCH_FILES ${DPDK_PATCH_DIR}/dpdk-21.11.4-memzone-namesize.patch ${DPDK_PATCH_DIR}/dpdk-21.11.4-dpdk-hugepages-path.patch ${DPDK_PATCH_DIR}/dpdk-21.11.4-dpdk-pcapng-path.patch ${DPDK_PATCH_DIR}/dpdk-21.11.4-extend-max-virtqueue-pairs.patch + ${DPDK_PATCH_DIR}/dpdk-21.11.4-dpdk-pdum-offset-c.patch + ${DPDK_PATCH_DIR}/dpdk-21.11.4-dpdk-pdum-offset-h.patch + ${DPDK_PATCH_DIR}/dpdk-21.11.4-dpdk-pdum-offset-app.patch ${DPDK_PATCH_DIR}/dpdk-21.11.4-macro-adjust.patch ) execute_process(COMMAND cat ${DPDP_PATCH_FILES} OUTPUT_FILE ${MERGED_PATCH_FILE}) diff --git a/support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-app.patch b/support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-app.patch new file mode 100644 index 0000000..d115246 --- /dev/null +++ b/support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-app.patch @@ -0,0 +1,11 @@ +--- dpdk-stable-21.11.4/app/dumpcap/main.c 2023-05-17 07:27:18.000000000 -0400 ++++ dpdk-stable-21.11.4-mr4/app/dumpcap/main.c 2024-07-04 06:40:31.827021420 -0400 +@@ -690,7 +690,7 @@ static void enable_pdump(struct rte_ring + } + + ret = rte_pdump_enable_bpf(intf->port, RTE_PDUMP_ALL_QUEUES, +- flags, snaplen, ++ flags, snaplen, 0, + r, mp, bpf_prm); + if (ret < 0) + rte_exit(EXIT_FAILURE, diff --git a/support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-c.patch b/support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-c.patch new file mode 100644 index 0000000..8d9dc9f --- /dev/null +++ b/support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-c.patch @@ -0,0 +1,208 @@ +--- dpdk-stable-21.11.4/lib/pdump/rte_pdump.c 2023-05-17 07:27:18.000000000 -0400 ++++ dpdk-stable-21.11.4-mr4/lib/pdump/rte_pdump.c 2024-07-04 06:26:13.010421593 -0400 +@@ -46,6 +46,7 @@ struct pdump_request { + + const struct rte_bpf_prm *prm; + uint32_t snaplen; ++ uint32_t offset; + }; + + struct pdump_response { +@@ -61,6 +62,7 @@ static struct pdump_rxtx_cbs { + const struct rte_bpf *filter; + enum pdump_version ver; + uint32_t snaplen; ++ uint32_t offset; + } rx_cbs[RTE_MAX_ETHPORTS][RTE_MAX_QUEUES_PER_PORT], + tx_cbs[RTE_MAX_ETHPORTS][RTE_MAX_QUEUES_PER_PORT]; + +@@ -96,7 +98,25 @@ pdump_copy(uint16_t port_id, uint16_t qu + uint64_t rcs[nb_pkts]; + + if (cbs->filter) +- rte_bpf_exec_burst(cbs->filter, (void **)pkts, rcs, nb_pkts); ++ { ++ if (cbs->offset>0) ++ { ++ for (i = 0; i < nb_pkts; i++){ ++ rte_pktmbuf_adj(pkts[i], cbs->offset); ++ } ++ ++ rte_bpf_exec_burst(cbs->filter, (void **)pkts, rcs, nb_pkts); ++ ++ for (i = 0; i < nb_pkts; i++){ ++ rte_pktmbuf_prepend(pkts[i], cbs->offset); ++ } ++ } ++ else ++ { ++ rte_bpf_exec_burst(cbs->filter, (void **)pkts, rcs, nb_pkts); ++ } ++ } ++ + + ts = rte_get_tsc_cycles(); + ring = cbs->ring; +@@ -172,7 +192,7 @@ pdump_register_rx_callbacks(enum pdump_v + uint16_t end_q, uint16_t port, uint16_t queue, + struct rte_ring *ring, struct rte_mempool *mp, + struct rte_bpf *filter, +- uint16_t operation, uint32_t snaplen) ++ uint16_t operation, uint32_t snaplen,uint32_t offset) + { + uint16_t qid; + +@@ -192,6 +212,7 @@ pdump_register_rx_callbacks(enum pdump_v + cbs->mp = mp; + cbs->snaplen = snaplen; + cbs->filter = filter; ++ cbs->offset = offset; + + cbs->cb = rte_eth_add_first_rx_callback(port, qid, + pdump_rx, cbs); +@@ -229,7 +250,7 @@ pdump_register_tx_callbacks(enum pdump_v + uint16_t end_q, uint16_t port, uint16_t queue, + struct rte_ring *ring, struct rte_mempool *mp, + struct rte_bpf *filter, +- uint16_t operation, uint32_t snaplen) ++ uint16_t operation, uint32_t snaplen, uint32_t offset) + { + + uint16_t qid; +@@ -250,6 +271,7 @@ pdump_register_tx_callbacks(enum pdump_v + cbs->mp = mp; + cbs->snaplen = snaplen; + cbs->filter = filter; ++ cbs->offset = offset; + + cbs->cb = rte_eth_add_tx_callback(port, qid, pdump_tx, + cbs); +@@ -368,7 +390,7 @@ set_pdump_rxtx_cbs(const struct pdump_re + end_q = (queue == RTE_PDUMP_ALL_QUEUES) ? nb_rx_q : queue + 1; + ret = pdump_register_rx_callbacks(p->ver, end_q, port, queue, + ring, mp, filter, +- operation, p->snaplen); ++ operation, p->snaplen,p->offset); + if (ret < 0) + return ret; + } +@@ -378,7 +400,7 @@ set_pdump_rxtx_cbs(const struct pdump_re + end_q = (queue == RTE_PDUMP_ALL_QUEUES) ? nb_tx_q : queue + 1; + ret = pdump_register_tx_callbacks(p->ver, end_q, port, queue, + ring, mp, filter, +- operation, p->snaplen); ++ operation, p->snaplen, p->offset); + if (ret < 0) + return ret; + } +@@ -524,6 +546,7 @@ pdump_validate_port(uint16_t port, char + static int + pdump_prepare_client_request(const char *device, uint16_t queue, + uint32_t flags, uint32_t snaplen, ++ uint32_t offset, + uint16_t operation, + struct rte_ring *ring, + struct rte_mempool *mp, +@@ -555,6 +578,7 @@ pdump_prepare_client_request(const char + req->mp = mp; + req->prm = prm; + req->snaplen = snaplen; ++ req->offset = offset; + } + + rte_strscpy(mp_req.name, PDUMP_MP, RTE_MP_MAX_NAME_LEN); +@@ -583,7 +607,7 @@ pdump_prepare_client_request(const char + */ + static int + pdump_enable(uint16_t port, uint16_t queue, +- uint32_t flags, uint32_t snaplen, ++ uint32_t flags, uint32_t snaplen,uint32_t offset, + struct rte_ring *ring, struct rte_mempool *mp, + const struct rte_bpf_prm *prm) + { +@@ -603,7 +627,7 @@ pdump_enable(uint16_t port, uint16_t que + if (snaplen == 0) + snaplen = UINT32_MAX; + +- return pdump_prepare_client_request(name, queue, flags, snaplen, ++ return pdump_prepare_client_request(name, queue, flags, snaplen,offset, + ENABLE, ring, mp, prm); + } + +@@ -613,23 +637,24 @@ rte_pdump_enable(uint16_t port, uint16_t + struct rte_mempool *mp, + void *filter __rte_unused) + { +- return pdump_enable(port, queue, flags, 0, ++ return pdump_enable(port, queue, flags, 0,0, + ring, mp, NULL); + } + + int + rte_pdump_enable_bpf(uint16_t port, uint16_t queue, + uint32_t flags, uint32_t snaplen, ++ uint32_t offset, + struct rte_ring *ring, + struct rte_mempool *mp, + const struct rte_bpf_prm *prm) + { +- return pdump_enable(port, queue, flags, snaplen, ++ return pdump_enable(port, queue, flags, snaplen,offset, + ring, mp, prm); + } + + static int +-pdump_enable_by_deviceid(const char *device_id, uint16_t queue, ++pdump_enable_by_deviceid(const char *device_id, uint16_t queue, uint32_t offset, + uint32_t flags, uint32_t snaplen, + struct rte_ring *ring, + struct rte_mempool *mp, +@@ -647,7 +672,7 @@ pdump_enable_by_deviceid(const char *dev + if (snaplen == 0) + snaplen = UINT32_MAX; + +- return pdump_prepare_client_request(device_id, queue, flags, snaplen, ++ return pdump_prepare_client_request(device_id, queue, flags, snaplen,offset, + ENABLE, ring, mp, prm); + } + +@@ -658,18 +683,19 @@ rte_pdump_enable_by_deviceid(char *devic + struct rte_mempool *mp, + void *filter __rte_unused) + { +- return pdump_enable_by_deviceid(device_id, queue, flags, 0, ++ return pdump_enable_by_deviceid(device_id, queue, flags, 0, 0, + ring, mp, NULL); + } + + int + rte_pdump_enable_bpf_by_deviceid(const char *device_id, uint16_t queue, + uint32_t flags, uint32_t snaplen, ++ uint32_t offset, + struct rte_ring *ring, + struct rte_mempool *mp, + const struct rte_bpf_prm *prm) + { +- return pdump_enable_by_deviceid(device_id, queue, flags, snaplen, ++ return pdump_enable_by_deviceid(device_id, queue, flags, snaplen, offset, + ring, mp, prm); + } + +@@ -686,7 +712,7 @@ rte_pdump_disable(uint16_t port, uint16_ + if (ret < 0) + return ret; + +- ret = pdump_prepare_client_request(name, queue, flags, 0, ++ ret = pdump_prepare_client_request(name, queue, flags, 0, 0, + DISABLE, NULL, NULL, NULL); + + return ret; +@@ -702,7 +728,7 @@ rte_pdump_disable_by_deviceid(char *devi + if (ret < 0) + return ret; + +- ret = pdump_prepare_client_request(device_id, queue, flags, 0, ++ ret = pdump_prepare_client_request(device_id, queue, flags, 0, 0, + DISABLE, NULL, NULL, NULL); + + return ret; diff --git a/support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-h.patch b/support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-h.patch new file mode 100644 index 0000000..ad426cd --- /dev/null +++ b/support/dpdk/dpdk-21.11.4-dpdk-pdum-offset-h.patch @@ -0,0 +1,18 @@ +--- dpdk-stable-21.11.4/lib/pdump/rte_pdump.h 2023-05-17 07:27:18.000000000 -0400 ++++ dpdk-stable-21.11.4-mr4/lib/pdump/rte_pdump.h 2024-07-04 06:26:16.303397053 -0400 +@@ -114,6 +114,7 @@ __rte_experimental + int + rte_pdump_enable_bpf(uint16_t port_id, uint16_t queue, + uint32_t flags, uint32_t snaplen, ++ uint32_t offset, + struct rte_ring *ring, + struct rte_mempool *mp, + const struct rte_bpf_prm *prm); +@@ -201,6 +202,7 @@ __rte_experimental + int + rte_pdump_enable_bpf_by_deviceid(const char *device_id, uint16_t queue, + uint32_t flags, uint32_t snaplen, ++ uint32_t offset, + struct rte_ring *ring, + struct rte_mempool *mp, + const struct rte_bpf_prm *filter); diff --git a/tools/tcpdump/pdump.c b/tools/tcpdump/pdump.c index 9d7ebee..5b09360 100644 --- a/tools/tcpdump/pdump.c +++ b/tools/tcpdump/pdump.c @@ -81,6 +81,7 @@ #define CMD_LINE_OPT_DUMPFILE_PATH "dumpfile-path" #define CMD_LINE_OPT_DUMPFILE_COUNT "dumpfile-count" #define CMD_LINE_OPT_BPF_RULE "bpf-rule" +#define CMD_LINE_OPT_OFFSET "offset" #define CMD_LINE_OPT_SNAPSHOT_LENGTH "snapshot-length" #define TX_STREAM_SIZE 64 @@ -192,6 +193,7 @@ static struct bpf_program bpf_prog; static char str_bpf_expr[4096] = {}; static bool is_str_bpf_expr_set = false; static uint32_t snaplen = UINT32_MAX; +static uint32_t offset = 0; static struct rte_bpf_prm * prm = NULL; uint16_t interface_index = 0; @@ -219,6 +221,8 @@ static void pdump_usage(const char * prgname) "[--dumpfile-count=]\n" "[--bpf-rule=<bpf-rule>]" "default:<None>\n" + "[--offset=>]" + "default:0\n" "[--snapshot-length=]" "default:<UINT32_MAX>\n", prgname); @@ -414,7 +418,7 @@ static int launch_args_parse(int argc, char ** argv, char * prgname) int option_index; static struct option long_option[] = { {"pdump", 1, 0, 0}, {"server-socket-path", 1, 0, 0}, {"client-socket-path", 1, 0, 0}, - {"dumpfile-path", 1, 0, 0}, {"dumpfile-count", 1, 0, 0}, {"bpf-rule", 1, 0, 0}, + {"dumpfile-path", 1, 0, 0}, {"dumpfile-count", 1, 0, 0}, {"bpf-rule", 1, 0, 0},{"offset", 1, 0, 0}, {"use-ppi-header", 0, 0, 0}, {"snapshot-length", 1, 0, 0}, {NULL, 0, 0, 0}}; if (argc == 1) @@ -467,6 +471,11 @@ static int launch_args_parse(int argc, char ** argv, char * prgname) snprintf(str_bpf_expr, sizeof(str_bpf_expr), "%s", optarg); } + if (!strncmp(long_option[option_index].name, CMD_LINE_OPT_OFFSET, sizeof(CMD_LINE_OPT_OFFSET))) + { + sscanf(optarg, "%" SCNu32, &offset); + } + if (!strncmp(long_option[option_index].name, CMD_LINE_OPT_SNAPSHOT_LENGTH, sizeof(CMD_LINE_OPT_SNAPSHOT_LENGTH))) { @@ -776,6 +785,8 @@ 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++) { @@ -828,7 +839,7 @@ static void enable_pdump(void) { /* Phydev use dpdk pdump api */ int ret = rte_pdump_enable_bpf(pt->port_id, pt->queue, RTE_PDUMP_FLAG_RX | RTE_PDUMP_FLAG_PCAPNG, - snaplen, pt->rx_ring, pt->mp, prm); + snaplen ,offset, pt->rx_ring, pt->mp, prm); if (ret < 0) rte_exit(EXIT_FAILURE, "Phydev :%s, rx enable err.\n", pt->dev_symbol); } @@ -880,7 +891,7 @@ static void enable_pdump(void) { /* Phydev use dpdk pdump api */ int ret = rte_pdump_enable_bpf(pt->port_id, pt->queue, RTE_PDUMP_FLAG_TX | RTE_PDUMP_FLAG_PCAPNG, - snaplen, pt->tx_ring, pt->mp, prm); + snaplen, offset, pt->tx_ring, pt->mp, prm); if (ret < 0) rte_exit(EXIT_FAILURE, "Phydev:%s, tx enable err.\n", pt->dev_symbol); } |
