32 #include <rte_memcpy.h> 33 #include <rte_mempool.h> 34 #include <rte_debug.h> 43 #define XRAN_PAYLOAD_RB_ALIGN (N_SC_PER_PRB*(IQ_BITS/8)*2) 45 static inline void __fill_xranhdr_frag(struct xran_up_pkt_hdr *dst, 47 uint16_t rboff_bytes,
struct xran_section_info *sectinfo, uint32_t mf, uint8_t *seqid)
52 rte_memcpy(dst, src,
sizeof(*dst));
54 dst->ecpri_hdr.ecpri_seq_id.seq_id = (*seqid)++;
56 print_dbg(
"sec [%d %d] sec %d mf %d g_sec %d\n",sectinfo->
startPrbc, sectinfo->
numPrbc, dst->ecpri_hdr.ecpri_seq_id.seq_id, mf, *seqid);
58 loc_data_sec_hdr.
fields.
all_bits = rte_be_to_cpu_32(dst->data_sec_hdr.fields.all_bits);
65 rboff_bytes, rblen_bytes);
67 dst->data_sec_hdr.fields.all_bits = rte_cpu_to_be_32(loc_data_sec_hdr.
fields.
all_bits);
75 static inline void __free_fragments(
struct rte_mbuf *mb[], uint32_t num)
78 for (i = 0; i != num; i++)
79 rte_pktmbuf_free(mb[i]);
105 struct rte_mbuf **pkts_out,
106 uint16_t nb_pkts_out,
108 struct rte_mempool *pool_direct,
109 struct rte_mempool *pool_indirect,
113 struct rte_mbuf *in_seg = NULL;
114 uint32_t out_pkt_pos = 0, in_seg_data_pos = 0;
115 uint32_t more_in_segs;
116 uint16_t fragment_offset, frag_size;
117 uint16_t frag_bytes_remaining;
135 if (unlikely(frag_size * nb_pkts_out <
147 while (likely(more_in_segs)) {
148 struct rte_mbuf *out_pkt = NULL, *out_seg_prev = NULL;
149 uint32_t more_out_segs;
153 out_pkt = rte_pktmbuf_alloc(pool_direct);
154 if (unlikely(out_pkt == NULL)) {
156 __free_fragments(pkts_out, out_pkt_pos);
160 print_dbg(
"[%d] out_pkt %p\n",more_in_segs, out_pkt);
165 if(rte_pktmbuf_append(out_pkt,
sizeof(
struct xran_up_pkt_hdr)) ==NULL){
166 rte_panic(
"sizeof(struct xran_up_pkt_hdr)");
168 frag_bytes_remaining = frag_size;
170 out_seg_prev = out_pkt;
172 while (likely(more_out_segs && more_in_segs)) {
174 #ifdef XRAN_ATTACH_MBUF 175 struct rte_mbuf *out_seg = NULL;
178 print_dbg(
"Allocate indirect buffer \n");
179 out_seg = rte_pktmbuf_alloc(pool_indirect);
180 if (unlikely(out_seg == NULL)) {
182 rte_pktmbuf_free(out_pkt);
183 __free_fragments(pkts_out, out_pkt_pos);
187 print_dbg(
"[%d %d] out_seg %p\n",more_out_segs, more_in_segs, out_seg);
188 out_seg_prev->next = out_seg;
189 out_seg_prev = out_seg;
192 rte_pktmbuf_attach(out_seg, in_seg);
194 len = frag_bytes_remaining;
195 if (len > (in_seg->data_len - in_seg_data_pos)) {
196 len = in_seg->data_len - in_seg_data_pos;
198 #ifdef XRAN_ATTACH_MBUF 199 out_seg->data_off = in_seg->data_off + in_seg_data_pos;
200 out_seg->data_len = (uint16_t)len;
201 out_pkt->pkt_len = (uint16_t)(len +
203 out_pkt->nb_segs += 1;
206 char* pChar = rte_pktmbuf_mtod(in_seg,
char*);
207 void *iq_src = (pChar + in_seg_data_pos);
208 void *iq_dst = rte_pktmbuf_append(out_pkt, len);
212 rte_memcpy(iq_dst, iq_src, len);
214 print_err(
"iq_src %p iq_dst %p\n len %d room %d\n", iq_src, iq_dst, len, rte_pktmbuf_tailroom(out_pkt));
217 in_seg_data_pos += len;
218 frag_bytes_remaining -= len;
221 if (unlikely(frag_bytes_remaining == 0))
225 if (unlikely(in_seg_data_pos == in_seg->data_len)) {
226 in_seg = in_seg->next;
229 if (unlikely(in_seg == NULL))
238 __fill_xranhdr_frag(out_hdr, in_hdr_xran,
240 fragment_offset, sectinfo, more_in_segs, seqid);
242 fragment_offset = (uint16_t)(fragment_offset +
248 pkts_out[out_pkt_pos] = out_pkt;
249 print_dbg(
"out_pkt_pos %d data_len %d pkt_len %d\n", out_pkt_pos, out_pkt->data_len, out_pkt->pkt_len);
#define print_dbg(fmt, args...)
struct xran_up_pkt_hdr xran_hdr
#define print_err(fmt, args...)
int xran_get_ecpri_hdr_size(void)
return eCPRI header size without eCPRI common header
#define XRAN_PAYLOAD_RB_ALIGN
int32_t xran_app_fragment_packet(struct rte_mbuf *pkt_in, struct rte_mbuf **pkts_out, uint16_t nb_pkts_out, uint16_t mtu_size, struct rte_mempool *pool_direct, struct rte_mempool *pool_indirect, struct xran_section_info *sectinfo, uint8_t *seqid)
Header file for functions to perform application level fragmentation.
Modules provide debug prints and utility functions.
XRAN layer common functionality for both lls-CU and RU as well as C-plane and U-plane.
Definitions and support functions to process XRAN packet.
union data_section_hdr::@18 fields
This file provides the definitions for Control Plane Messages APIs.