From 15220c88cb492d9dea3ca85127e63eed1779fe0c Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 26 Jul 2025 18:52:47 +0300 Subject: [PATCH 1/8] Updated KNI send packet to use unique_ptr for memory management. --- Pcap++/src/KniDevice.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Pcap++/src/KniDevice.cpp b/Pcap++/src/KniDevice.cpp index 5dc3e6ee8a..d544da1548 100644 --- a/Pcap++/src/KniDevice.cpp +++ b/Pcap++/src/KniDevice.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -727,31 +728,31 @@ namespace pcpp } struct rte_mbuf* mbuf; + std::unique_ptr mbufRawPacketTemp; MBufRawPacket* mbufRawPacket = nullptr; bool sent = false; - bool wasAllocated = false; if (rawPacket.getObjectType() != MBUFRAWPACKET_OBJECT_TYPE) { - mbufRawPacket = new MBufRawPacket(); - if (unlikely(!mbufRawPacket->initFromRawPacket(&rawPacket, this))) + mbufRawPacketTemp = std::make_unique(); + if (unlikely(!mbufRawPacketTemp->initFromRawPacket(&rawPacket, this))) { - delete mbufRawPacket; return sent; } + + // Sets the mbuf pointer from the temporary object + mbufRawPacket = mbufRawPacketTemp.get(); mbuf = mbufRawPacket->getMBuf(); - wasAllocated = true; } else { - mbufRawPacket = (MBufRawPacket*)(&rawPacket); + // Casts the raw packet to MBufRawPacket + mbufRawPacket = static_cast(&rawPacket); mbuf = mbufRawPacket->getMBuf(); } sent = rte_kni_tx_burst(m_Device, &mbuf, 1); mbufRawPacket->setFreeMbuf(!sent); - if (wasAllocated) - delete mbufRawPacket; return sent; } From ba1b2becc534a04c331380cc0f751aa3d10859e1 Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 26 Jul 2025 18:57:23 +0300 Subject: [PATCH 2/8] Updated for-loop to for-each loop. --- Pcap++/src/DpdkDevice.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Pcap++/src/DpdkDevice.cpp b/Pcap++/src/DpdkDevice.cpp index 005f7ac749..71d598f751 100644 --- a/Pcap++/src/DpdkDevice.cpp +++ b/Pcap++/src/DpdkDevice.cpp @@ -1209,28 +1209,28 @@ namespace pcpp MBufRawPacketVector mBufVec; int mBufIndex = 0; - for (RawPacketVector::ConstVectorIterator iter = rawPacketsVec.begin(); iter != rawPacketsVec.end(); iter++) + for (auto const* rawPacket : rawPacketsVec) { - MBufRawPacket* rawPacket = nullptr; - uint8_t rawPacketType = (*iter)->getObjectType(); + MBufRawPacket* mBufRawPacket = nullptr; + uint8_t rawPacketType = rawPacket->getObjectType(); if (rawPacketType != MBUFRAWPACKET_OBJECT_TYPE) { - rawPacket = new MBufRawPacket(); - if (unlikely(!rawPacket->initFromRawPacket(*iter, this))) + mBufRawPacket = new MBufRawPacket(); + if (unlikely(!mBufRawPacket->initFromRawPacket(rawPacket, this))) { - delete rawPacket; + delete mBufRawPacket; return 0; } - mBufVec.pushBack(rawPacket); + mBufVec.pushBack(mBufRawPacket); } else { - rawPacket = (MBufRawPacket*)(*iter); + mBufRawPacket = (MBufRawPacket*)(rawPacket); } - mBufRawPacketArr[mBufIndex] = rawPacket; - mBufArr[mBufIndex++] = rawPacket->getMBuf(); + mBufRawPacketArr[mBufIndex] = mBufRawPacket; + mBufArr[mBufIndex++] = mBufRawPacket->getMBuf(); } uint16_t packetsSent = From a2af884c12e59d3729850537cb85f70c23e59b96 Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 26 Jul 2025 19:10:28 +0300 Subject: [PATCH 3/8] Updated dpdk send packets loop to use unique_ptr. --- Pcap++/src/DpdkDevice.cpp | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/Pcap++/src/DpdkDevice.cpp b/Pcap++/src/DpdkDevice.cpp index 71d598f751..b7f9005539 100644 --- a/Pcap++/src/DpdkDevice.cpp +++ b/Pcap++/src/DpdkDevice.cpp @@ -19,6 +19,7 @@ #include "rte_malloc.h" #include "rte_cycles.h" #include +#include #include #include #include @@ -1169,26 +1170,28 @@ namespace pcpp for (size_t i = 0; i < arrLength; i++) { - MBufRawPacket* rawPacket = nullptr; + MBufRawPacket* mBufRawPacket = nullptr; + uint8_t rawPacketType = packetsArr[i]->getRawPacketReadOnly()->getObjectType(); if (rawPacketType != MBUFRAWPACKET_OBJECT_TYPE) { - rawPacket = new MBufRawPacket(); - if (unlikely(!rawPacket->initFromRawPacket(packetsArr[i]->getRawPacketReadOnly(), this))) + auto mBufRawPacketTemp = std::make_unique(); + if (unlikely(!mBufRawPacketTemp->initFromRawPacket(packetsArr[i]->getRawPacketReadOnly(), this))) { - delete rawPacket; return 0; } - mBufVec.pushBack(rawPacket); + // Set the packet pointer to the newly created MBufRawPacket and add it register it to lifetime management + mBufRawPacket = mBufRawPacketTemp.get(); + mBufVec.pushBack(std::move(mBufRawPacketTemp)); } else { - rawPacket = (MBufRawPacket*)packetsArr[i]->getRawPacketReadOnly(); + mBufRawPacket = static_cast(packetsArr[i]->getRawPacketReadOnly()); } - mBufArr[i] = rawPacket->getMBuf(); - mBufRawPacketArr[i] = rawPacket; + mBufArr[i] = mBufRawPacket->getMBuf(); + mBufRawPacketArr[i] = mBufRawPacket; } uint16_t packetsSent = @@ -1212,21 +1215,25 @@ namespace pcpp for (auto const* rawPacket : rawPacketsVec) { MBufRawPacket* mBufRawPacket = nullptr; + uint8_t rawPacketType = rawPacket->getObjectType(); if (rawPacketType != MBUFRAWPACKET_OBJECT_TYPE) { - mBufRawPacket = new MBufRawPacket(); - if (unlikely(!mBufRawPacket->initFromRawPacket(rawPacket, this))) + // Copy the raw packet into a MBufRawPacket + auto mbufRawPacketTemp = std::make_unique(); + if (unlikely(!mbufRawPacketTemp->initFromRawPacket(rawPacket, this))) { - delete mBufRawPacket; return 0; } - mBufVec.pushBack(mBufRawPacket); + // Set the packet pointer to the newly created MBufRawPacket and add it to lifetime management + mBufRawPacket = mbufRawPacketTemp.get(); + mBufVec.pushBack(std::move(mbufRawPacketTemp)); } else { - mBufRawPacket = (MBufRawPacket*)(rawPacket); + // If the raw packet is already a MBufRawPacket, use it directly + mBufRawPacket = static_cast(rawPacket); } mBufRawPacketArr[mBufIndex] = mBufRawPacket; From e2d8762466e5134c336ac49d6271ba4c40801514 Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 26 Jul 2025 19:12:01 +0300 Subject: [PATCH 4/8] Lint --- Pcap++/src/DpdkDevice.cpp | 3 ++- Pcap++/src/KniDevice.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Pcap++/src/DpdkDevice.cpp b/Pcap++/src/DpdkDevice.cpp index b7f9005539..c0a0d4a77f 100644 --- a/Pcap++/src/DpdkDevice.cpp +++ b/Pcap++/src/DpdkDevice.cpp @@ -1181,7 +1181,8 @@ namespace pcpp return 0; } - // Set the packet pointer to the newly created MBufRawPacket and add it register it to lifetime management + // Set the packet pointer to the newly created MBufRawPacket and add it register it to lifetime + // management mBufRawPacket = mBufRawPacketTemp.get(); mBufVec.pushBack(std::move(mBufRawPacketTemp)); } diff --git a/Pcap++/src/KniDevice.cpp b/Pcap++/src/KniDevice.cpp index d544da1548..cfe9f71f5f 100644 --- a/Pcap++/src/KniDevice.cpp +++ b/Pcap++/src/KniDevice.cpp @@ -739,7 +739,7 @@ namespace pcpp { return sent; } - + // Sets the mbuf pointer from the temporary object mbufRawPacket = mbufRawPacketTemp.get(); mbuf = mbufRawPacket->getMBuf(); From 0857c3efb65a385dab285de4eb38fc49f729e3b1 Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 26 Jul 2025 19:18:06 +0300 Subject: [PATCH 5/8] Deduplicated line. --- Pcap++/src/KniDevice.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Pcap++/src/KniDevice.cpp b/Pcap++/src/KniDevice.cpp index cfe9f71f5f..24f430d9b6 100644 --- a/Pcap++/src/KniDevice.cpp +++ b/Pcap++/src/KniDevice.cpp @@ -742,15 +742,14 @@ namespace pcpp // Sets the mbuf pointer from the temporary object mbufRawPacket = mbufRawPacketTemp.get(); - mbuf = mbufRawPacket->getMBuf(); } else { // Casts the raw packet to MBufRawPacket mbufRawPacket = static_cast(&rawPacket); - mbuf = mbufRawPacket->getMBuf(); } + mbuf = mbufRawPacket->getMBuf(); sent = rte_kni_tx_burst(m_Device, &mbuf, 1); mbufRawPacket->setFreeMbuf(!sent); From b9b9cea33076174fd40f652d7262cac048024cfd Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 26 Jul 2025 19:19:48 +0300 Subject: [PATCH 6/8] Reverted line spacing. --- Pcap++/src/DpdkDevice.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Pcap++/src/DpdkDevice.cpp b/Pcap++/src/DpdkDevice.cpp index c0a0d4a77f..32f1619ae7 100644 --- a/Pcap++/src/DpdkDevice.cpp +++ b/Pcap++/src/DpdkDevice.cpp @@ -1171,7 +1171,6 @@ namespace pcpp for (size_t i = 0; i < arrLength; i++) { MBufRawPacket* mBufRawPacket = nullptr; - uint8_t rawPacketType = packetsArr[i]->getRawPacketReadOnly()->getObjectType(); if (rawPacketType != MBUFRAWPACKET_OBJECT_TYPE) { From 26219350124d235c273f2622eada5710f9088e87 Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 26 Jul 2025 19:20:52 +0300 Subject: [PATCH 7/8] Revented line spacing 2. --- Pcap++/src/DpdkDevice.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Pcap++/src/DpdkDevice.cpp b/Pcap++/src/DpdkDevice.cpp index 32f1619ae7..8e4d12b3e1 100644 --- a/Pcap++/src/DpdkDevice.cpp +++ b/Pcap++/src/DpdkDevice.cpp @@ -1215,7 +1215,6 @@ namespace pcpp for (auto const* rawPacket : rawPacketsVec) { MBufRawPacket* mBufRawPacket = nullptr; - uint8_t rawPacketType = rawPacket->getObjectType(); if (rawPacketType != MBUFRAWPACKET_OBJECT_TYPE) { From 27265e7928e5d285fd269f4cd5dceaeec6cacdfe Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 26 Jul 2025 19:38:39 +0300 Subject: [PATCH 8/8] Updated const correctness. --- Pcap++/src/DpdkDevice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pcap++/src/DpdkDevice.cpp b/Pcap++/src/DpdkDevice.cpp index 8e4d12b3e1..46053be32f 100644 --- a/Pcap++/src/DpdkDevice.cpp +++ b/Pcap++/src/DpdkDevice.cpp @@ -1187,7 +1187,7 @@ namespace pcpp } else { - mBufRawPacket = static_cast(packetsArr[i]->getRawPacketReadOnly()); + mBufRawPacket = static_cast(packetsArr[i]->getRawPacket()); } mBufArr[i] = mBufRawPacket->getMBuf(); @@ -1212,7 +1212,7 @@ namespace pcpp MBufRawPacketVector mBufVec; int mBufIndex = 0; - for (auto const* rawPacket : rawPacketsVec) + for (auto* rawPacket : rawPacketsVec) { MBufRawPacket* mBufRawPacket = nullptr; uint8_t rawPacketType = rawPacket->getObjectType();