75 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | ||
| 
 | ||
| #include <rte_ethdev.h>
 | ||
| #include <rte_mbuf.h>
 | ||
| 
 | ||
| #include "PacketDissection/MbufContainer.hpp"
 | ||
| 
 | ||
| /**
 | ||
|  * @brief for transmitted mbufs.
 | ||
|  *
 | ||
|  */
 | ||
| class MbufContainerTransmitting : public MbufContainer {
 | ||
|   private:
 | ||
|     uint16_t _tx_port;
 | ||
|     uint16_t _tx_queue;
 | ||
| 
 | ||
|   public:
 | ||
|     inline MbufContainerTransmitting(rte_mempool* mempool, uint16_t tx_port,
 | ||
|                                      uint16_t tx_queue)
 | ||
|         : MbufContainer(mempool), _tx_port(tx_port), _tx_queue(tx_queue) {}
 | ||
| 
 | ||
|     /**
 | ||
|      * @brief add mbuf to container
 | ||
|      *
 | ||
|      * This method may delete the mbuf given if the container is full
 | ||
|      *
 | ||
|      * @param mbuf
 | ||
|      */
 | ||
|     inline void add_mbuf(rte_mbuf* mbuf) {
 | ||
|         if (likely(_nb_mbufs_in_container < BURST_SIZE)) {
 | ||
|             _mbuf_arr[_nb_mbufs_in_container] = mbuf;
 | ||
|             ++_nb_mbufs_in_container;
 | ||
|         } else {
 | ||
|             rte_pktmbuf_free(mbuf);
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * @brief create new mbuf in the container and return the pointer to it
 | ||
|      *
 | ||
|      * @return rte_mbuf*:
 | ||
|      *  - normally: a newly created mbuf is returned
 | ||
|      *  - if container is full and no mbuf can be added anymore: nullptr
 | ||
|      */
 | ||
|     inline rte_mbuf* get_empty_mbuf() {
 | ||
|         if (likely(_nb_mbufs_in_container < BURST_SIZE)) {
 | ||
|             _mbuf_arr[_nb_mbufs_in_container] = rte_pktmbuf_alloc(_mempool);
 | ||
|             return _mbuf_arr[_nb_mbufs_in_container++];
 | ||
|         } else {
 | ||
|             return nullptr;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * @brief send every mbuf contained in the container
 | ||
|      *
 | ||
|      */
 | ||
|     inline void send_mbufs() {
 | ||
|         if (likely(_nb_mbufs_in_container > 0)) {
 | ||
| 
 | ||
|             // send mbufs
 | ||
|             uint16_t nb_mbufs_sent = rte_eth_tx_burst(
 | ||
|                 _tx_port, _tx_queue, _mbuf_arr, _nb_mbufs_in_container);
 | ||
| 
 | ||
|             // Free any unsent packets.
 | ||
|             if (unlikely(nb_mbufs_sent < _nb_mbufs_in_container)) {
 | ||
|                 for (int i = nb_mbufs_sent; i < _nb_mbufs_in_container; ++i) {
 | ||
|                     rte_pktmbuf_free(_mbuf_arr[i]);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             _nb_mbufs_in_container = 0;
 | ||
|         }
 | ||
|     }
 | ||
| }; |