#pragma once #include #include #include #include #ifndef MRB_MAX_CTRLZONE_NUM #define MRB_MAX_CTRLZONE_NUM 16 #endif struct mrb_zone_idx { uint8_t offset; uint8_t size; }; /* mbuf common metadata */ struct mrb_metadata { RTE_MARKER cacheline0; /* status */ uint8_t dir : 1; uint8_t packet_create_from_nf : 1; uint8_t health_check : 1; uint8_t no_use : 5; uint8_t is_ctrlbuf : 1; uint8_t adapter_type : 2; uint8_t reserved : 5; uint16_t adapter_id; uint16_t payload_offset; uint16_t user_0; uint16_t ef_link_id; uint16_t traffic_link_id; /* for EF adapter */ uint16_t ef_peer_index; /* ingress, egress */ uint16_t port_ingress; uint16_t port_egress; uint8_t egress_action; /* Session Id */ uint64_t session_id; /* for sid forwarder */ uint16_t cur_sid; struct sid_list sid_list; uint8_t measurement_type; /* data path trace buffer */ void * dp_trace_buffer; RTE_MARKER cacheline1 __rte_cache_min_aligned; /* pkt_parser result */ struct pkt_parser_result pkt_parser_result; } __rte_cache_aligned; static inline void mrb_metadata_clear(struct mrb_metadata * mrb_meta) { static_assert(sizeof(struct mrb_metadata) == 128, "mrb_metadata size is not 128 bytes"); #if __AVX512F__ __m512i zero = _mm512_setzero_si512(); _mm512_store_si512((__m512i *)mrb_meta + 0, zero); _mm512_store_si512((__m512i *)mrb_meta + 1, zero); #elif __AVX2__ __m256i zero = _mm256_setzero_si256(); _mm256_store_si256((__m256i *)mrb_meta + 0, zero); _mm256_store_si256((__m256i *)mrb_meta + 1, zero); _mm256_store_si256((__m256i *)mrb_meta + 2, zero); _mm256_store_si256((__m256i *)mrb_meta + 3, zero); #else memset(mrb_meta, 0, sizeof(struct mrb_metadata)); #endif } #define MR_NODE_CTRLZONE_ID 1 struct mrb_priv_zone { uint8_t cz_num; struct mrb_zone_idx idx[MRB_MAX_CTRLZONE_NUM]; }; struct mrb_zone_info { char symbol[MR_SYMBOL_MAX]; unsigned int cz_id; unsigned int size; unsigned int in_use; }; #define mrbuf_priv(m) ((struct mrb_priv_zone *)((char *)m + sizeof(struct rte_mbuf))) #define mrbuf_cz(m, k) (&(mrbuf_priv(m)->idx[k])) // #define mrbuf_cz_data(m, k) ((void *)((char *)mrbuf_priv(m) + mrbuf_cz(m, k)->offset)) #define mrbuf_cz_data(m, k) ((void *)((char *)mrbuf_priv(m))) #define mrbuf_cz_num(m) (mrbuf_priv(m)->cz_num)