56 lines
1.2 KiB
C++
56 lines
1.2 KiB
C++
|
#pragma once
|
||
|
|
||
|
#include <rte_ethdev.h>
|
||
|
#include <rte_mbuf.h>
|
||
|
|
||
|
#include <stdexcept>
|
||
|
|
||
|
#include "Definitions.hpp"
|
||
|
|
||
|
#define ERROR_STR_MBUF_CONTAINER_INDEX_OUT_OF_BOUNDS \
|
||
|
"Index is out of bounds of MbufContainer."
|
||
|
|
||
|
/**
|
||
|
* @brief like the PacketContainer but it only holds mbufs plus some minor
|
||
|
* performance improvements
|
||
|
*
|
||
|
* \todo Has to be documented with more details
|
||
|
*
|
||
|
*/
|
||
|
class MbufContainer {
|
||
|
protected:
|
||
|
uint16_t _nb_mbufs_in_container;
|
||
|
|
||
|
rte_mbuf* _mbuf_arr[BURST_SIZE];
|
||
|
|
||
|
rte_mempool* _mempool;
|
||
|
|
||
|
public:
|
||
|
inline MbufContainer(rte_mempool* mempool)
|
||
|
: _mempool(mempool), _nb_mbufs_in_container(0) {}
|
||
|
|
||
|
/**
|
||
|
* @brief Get the mbuf at index
|
||
|
*
|
||
|
* @param index
|
||
|
* @return rte_mbuf*
|
||
|
*/
|
||
|
inline rte_mbuf* get_mbuf_at_index(int index) {
|
||
|
check_index(index);
|
||
|
return _mbuf_arr[index];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Get the number of mbufs
|
||
|
*
|
||
|
* @return uint16_t
|
||
|
*/
|
||
|
inline uint16_t get_number_of_mbufs() { return _nb_mbufs_in_container; }
|
||
|
|
||
|
inline void check_index(int index) {
|
||
|
if (unlikely(index >= _nb_mbufs_in_container || index < 0)) {
|
||
|
throw std::runtime_error(
|
||
|
ERROR_STR_MBUF_CONTAINER_INDEX_OUT_OF_BOUNDS);
|
||
|
}
|
||
|
}
|
||
|
};
|