--- dpdk-stable-23.11.1/lib/pdump/rte_pdump.c 2024-05-17 14:46:11.000000000 +0800 +++ dpdk-stable-23.11.1-mr/lib/pdump/rte_pdump.c 2024-07-12 17:27:43.833952738 +0800 @@ -47,6 +47,7 @@ const struct rte_bpf_prm *prm; uint32_t snaplen; + uint32_t offset; }; struct pdump_response { @@ -62,6 +63,7 @@ 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 @@ 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); + } + } + ring = cbs->ring; mp = cbs->mp; @@ -171,7 +191,7 @@ 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; @@ -191,6 +211,7 @@ 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); @@ -228,7 +249,7 @@ 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; @@ -249,6 +270,7 @@ cbs->mp = mp; cbs->snaplen = snaplen; cbs->filter = filter; + cbs->offset = offset; cbs->cb = rte_eth_add_tx_callback(port, qid, pdump_tx, cbs); @@ -367,7 +389,7 @@ 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; } @@ -377,7 +399,7 @@ 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; } @@ -523,6 +545,7 @@ 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, @@ -554,6 +577,7 @@ 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 @@ */ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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;