120 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #include <cstddef>
 | |
| 
 | |
| #include <rte_branch_prediction.h>
 | |
| #include <rte_common.h>
 | |
| #include <rte_config.h>
 | |
| #include <rte_mbuf_core.h>
 | |
| #include <rte_mempool.h>
 | |
| #include <stdint.h>
 | |
| 
 | |
| #define __rte_mbuf_sanity_check(m, is_h)                                       \
 | |
|     do {                                                                       \
 | |
|     } while (0)
 | |
| 
 | |
| static inline uint16_t rte_pktmbuf_headroom(const struct rte_mbuf* m) {
 | |
|     __rte_mbuf_sanity_check(m, 0);
 | |
|     return m->data_off;
 | |
| }
 | |
| 
 | |
| static inline void rte_pktmbuf_reset_headroom(struct rte_mbuf* m) {
 | |
|     m->data_off = (uint16_t)RTE_PKTMBUF_HEADROOM;
 | |
|     //(uint16_t)RTE_MIN((uint16_t)RTE_PKTMBUF_HEADROOM, (uint16_t)m->buf_len);
 | |
| }
 | |
| 
 | |
| static inline void rte_pktmbuf_reset(struct rte_mbuf* m) {
 | |
|     m->next = NULL;
 | |
|     m->pkt_len = 0;
 | |
|     m->tx_offload = 0;
 | |
|     m->vlan_tci = 0;
 | |
|     m->vlan_tci_outer = 0;
 | |
|     m->nb_segs = 1;
 | |
|     m->port = UINT16_MAX;
 | |
| 
 | |
|     m->ol_flags &= (1ULL << 61);
 | |
|     m->packet_type = 0;
 | |
|     rte_pktmbuf_reset_headroom(m);
 | |
| 
 | |
|     m->data_len = 0;
 | |
|     __rte_mbuf_sanity_check(m, 1);
 | |
| }
 | |
| 
 | |
| static struct rte_mbuf* rte_pktmbuf_alloc(struct rte_mempool* mp) {
 | |
| 
 | |
|     struct rte_mbuf* m = NULL;
 | |
|     m = new struct rte_mbuf;
 | |
|     if (m != NULL) {
 | |
|         m->refcnt = 1;
 | |
|         m->nb_segs = 1;
 | |
|         m->next = NULL;
 | |
|         rte_pktmbuf_reset(m);
 | |
| 
 | |
|         m->buf_addr = new uint8_t[2000];
 | |
|         m->buf_len = 0;
 | |
|     }
 | |
| 
 | |
|     return m;
 | |
| }
 | |
| 
 | |
| static inline void rte_pktmbuf_free(struct rte_mbuf* m) {
 | |
|     struct rte_mbuf* m_next;
 | |
| 
 | |
|     if (m != NULL)
 | |
|         __rte_mbuf_sanity_check(m, 1);
 | |
| 
 | |
|     delete[] m->buf_addr;
 | |
|     m->buf_addr = nullptr;
 | |
| 
 | |
|     while (m != NULL) {
 | |
|         m_next = m->next;
 | |
|         delete m;
 | |
|         m = m_next;
 | |
|     }
 | |
| }
 | |
| 
 | |
| static inline char* rte_pktmbuf_prepend(struct rte_mbuf* m, uint16_t len) {
 | |
|     __rte_mbuf_sanity_check(m, 1);
 | |
| 
 | |
|     if (unlikely(len > rte_pktmbuf_headroom(m))) {
 | |
|         return NULL;
 | |
|     }
 | |
| 
 | |
|     /* NB: elaborating the subtraction like this instead of using
 | |
|      *     -= allows us to ensure the result type is uint16_t
 | |
|      *     avoiding compiler warnings on gcc 8.1 at least */
 | |
|     m->data_off = static_cast<uint16_t>(m->data_off - len);
 | |
|     m->data_len = static_cast<uint16_t>(m->data_len + len);
 | |
|     m->pkt_len = (m->pkt_len + len);
 | |
| 
 | |
|     return (char*)m->buf_addr + m->data_off;
 | |
| }
 | |
| 
 | |
| static inline uint16_t rte_pktmbuf_tailroom(const struct rte_mbuf* m) {
 | |
|     __rte_mbuf_sanity_check(m, 0);
 | |
|     return (uint16_t)(m->buf_len - rte_pktmbuf_headroom(m) - m->data_len);
 | |
| }
 | |
| 
 | |
| static inline struct rte_mbuf* rte_pktmbuf_lastseg(struct rte_mbuf* m) {
 | |
|     __rte_mbuf_sanity_check(m, 1);
 | |
|     while (m->next != NULL)
 | |
|         m = m->next;
 | |
|     return m;
 | |
| }
 | |
| 
 | |
| static inline char* rte_pktmbuf_append(struct rte_mbuf* m, uint16_t len) {
 | |
|     void* tail;
 | |
|     struct rte_mbuf* m_last;
 | |
| 
 | |
|     __rte_mbuf_sanity_check(m, 1);
 | |
| 
 | |
|     m_last = rte_pktmbuf_lastseg(m);
 | |
|     if (unlikely(len > rte_pktmbuf_tailroom(m_last)))
 | |
|         return NULL;
 | |
| 
 | |
|     tail = (char*)m_last->buf_addr + m_last->data_off + m_last->data_len;
 | |
|     m_last->data_len = (uint16_t)(m_last->data_len + len);
 | |
|     m->pkt_len = (m->pkt_len + len);
 | |
|     return (char*)tail;
 | |
| }
 |