168 lines
4.7 KiB
C++
168 lines
4.7 KiB
C++
#pragma once
|
|
|
|
#include "PacketDissection/PacketContainer.hpp"
|
|
|
|
/**
|
|
* @brief This class holds the same functions like the PacketContainer except it
|
|
* only holds mbufs and no PacketInfo
|
|
*
|
|
* only send/reorder etc polled packets. Manually created packets are never
|
|
* dropped.
|
|
*/
|
|
class PacketContainerLean : protected PacketContainer {
|
|
public:
|
|
inline PacketContainerLean(struct rte_mempool* mbuf_pool,
|
|
uint16_t entrance_port, uint16_t exit_port,
|
|
uint16_t rx_queue_number,
|
|
uint16_t tx_queue_number)
|
|
: PacketContainer(mbuf_pool, entrance_port, exit_port, rx_queue_number,
|
|
tx_queue_number),
|
|
_nb_polled_pkts_dropped(0) {}
|
|
|
|
inline ~PacketContainerLean() { empty_container_lean(); }
|
|
|
|
inline void poll_mbufs(uint16_t& nb_mbufs_polled) {
|
|
empty_container_lean();
|
|
|
|
_nb_pkts_polled = rte_eth_rx_burst(_entrance_port, _rx_queue_number,
|
|
_mbuf_arrs[0], BURST_SIZE);
|
|
|
|
_nb_pkts_total = _nb_pkts_polled;
|
|
|
|
if (likely(_nb_pkts_polled > 0)) {
|
|
_nb_pkt_arrays = 1;
|
|
_nb_mbufs_in_mbuf_arr[0] = _nb_pkts_polled;
|
|
}
|
|
|
|
// return
|
|
nb_mbufs_polled = _nb_pkts_polled;
|
|
}
|
|
|
|
inline uint send_mbufs() {
|
|
uint sum_mbufs_send = 0;
|
|
if (likely(_nb_pkts_total > 0)) {
|
|
if (unlikely(_nb_polled_pkts_dropped != 0)) {
|
|
reorder_mbuf_arrays();
|
|
}
|
|
|
|
for (int i = 0; i < _nb_pkt_arrays; ++i) {
|
|
uint16_t nb_pkts_to_send = _nb_mbufs_in_mbuf_arr[i];
|
|
|
|
// send mbufs
|
|
uint16_t nb_pkts_sent =
|
|
rte_eth_tx_burst(_exit_port, _tx_queue_number,
|
|
_mbuf_arrs[i], nb_pkts_to_send);
|
|
|
|
#ifdef LOG_PKTS_SENT
|
|
LOG_INFO << "Number of packets sent: " << nb_pkts_sent
|
|
<< LOG_END;
|
|
#endif
|
|
|
|
sum_mbufs_send += nb_pkts_sent;
|
|
// Free any unsent packets.
|
|
if (unlikely(nb_pkts_sent < nb_pkts_to_send)) {
|
|
for (int j = nb_pkts_sent; j < nb_pkts_to_send; ++j) {
|
|
rte_pktmbuf_free(_mbuf_arrs[i][j]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
empty_container_lean();
|
|
return sum_mbufs_send;
|
|
}
|
|
|
|
inline void drop_polled_mbuf(int index) {
|
|
if (index >= _nb_pkts_polled) {
|
|
throw std::runtime_error(
|
|
ERROR_STR_INDEX_OUT_OF_BOUNDS
|
|
" No... actually it is _nb_pkts_polled that is exceeded");
|
|
}
|
|
|
|
int i = -1;
|
|
int j = -1;
|
|
calculate_array_coordinates_from_index(index, i, j);
|
|
|
|
if (unlikely(_mbuf_arrs[i][j] != nullptr)) {
|
|
rte_pktmbuf_free(_mbuf_arrs[i][j]);
|
|
}
|
|
|
|
_pkt_info_arrs[i][j] = nullptr;
|
|
_mbuf_arrs[i][j] = nullptr;
|
|
|
|
++_nb_polled_pkts_dropped;
|
|
}
|
|
|
|
inline rte_mbuf* get_empty_mbuf() {
|
|
int i, j;
|
|
calculate_array_coordinates_from_index(_nb_pkts_total, i, j);
|
|
|
|
++_nb_pkts_total;
|
|
++_nb_mbufs_in_mbuf_arr[i];
|
|
|
|
if (unlikely(BURST_SIZE * _nb_pkt_arrays < _nb_pkts_total)) {
|
|
++_nb_pkt_arrays;
|
|
}
|
|
_mbuf_arrs[i][j] = rte_pktmbuf_alloc(_mempool);
|
|
|
|
return _mbuf_arrs[i][j];
|
|
}
|
|
|
|
inline int add_mbuf(rte_mbuf* mbuf) {
|
|
int i = -1;
|
|
int j = -1;
|
|
calculate_array_coordinates_from_index(_nb_pkts_total, i, j);
|
|
_mbuf_arrs[i][j] = mbuf;
|
|
|
|
++_nb_pkts_total;
|
|
++_nb_mbufs_in_mbuf_arr[i];
|
|
|
|
if (unlikely(BURST_SIZE * _nb_pkt_arrays < _nb_pkts_total)) {
|
|
++_nb_pkt_arrays;
|
|
}
|
|
|
|
return _nb_pkts_total - 1;
|
|
}
|
|
|
|
inline uint16_t get_number_of_polled_mbufs() { return _nb_pkts_polled; }
|
|
|
|
inline rte_mbuf* get_mbuf_at_index(int index) {
|
|
if (unlikely(index >= _nb_pkts_total)) {
|
|
throw std::runtime_error(ERROR_STR_INDEX_OUT_OF_BOUNDS);
|
|
}
|
|
|
|
int i = -1;
|
|
int j = -1;
|
|
calculate_array_coordinates_from_index(index, i, j);
|
|
|
|
return _mbuf_arrs[i][j];
|
|
}
|
|
|
|
inline rte_mempool* get_mempool_lean() { return get_mempool(); }
|
|
|
|
private:
|
|
int _nb_polled_pkts_dropped;
|
|
|
|
inline void empty_container_lean() {
|
|
|
|
empty_mbuf_arr();
|
|
|
|
_nb_pkts_polled = 0;
|
|
_nb_pkts_total = 0;
|
|
_nb_pkts_dropped = 0;
|
|
_nb_polled_pkts_dropped = 0;
|
|
_nb_pkt_arrays = 0;
|
|
}
|
|
|
|
inline void empty_mbuf_arr() {
|
|
for (int i = 0; i < _nb_pkt_arrays; ++i) {
|
|
int len = _nb_mbufs_in_mbuf_arr[i];
|
|
|
|
for (int j = 0; j < len; ++j) {
|
|
_mbuf_arrs[i][j] = nullptr;
|
|
}
|
|
|
|
_nb_mbufs_in_mbuf_arr[i] = 0;
|
|
}
|
|
}
|
|
}; |