57static inline bool is_odp_packet(odp_event_t odp_event)
59 if (unlikely(odp_event == ODP_EVENT_INVALID ||
60 odp_event_type(odp_event) != ODP_EVENT_PACKET))
68 odp_event_t odp_event = event_em2odp(pktev);
71 unlikely(!is_odp_packet(odp_event))) {
73 "Invalid packet event");
77 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
79 return odp_packet_data(odp_pkt);
84 odp_event_t odp_event = event_em2odp(pktev);
87 unlikely(!is_odp_packet(odp_event))) {
89 "Invalid packet event");
93 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
94 uint32_t seg_len = odp_packet_seg_len(odp_pkt);
101 odp_event_t odp_event = event_em2odp(pktev);
104 unlikely(!is_odp_packet(odp_event))) {
106 "Invalid packet event");
110 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
116 return odp_packet_data(odp_pkt);
119 return odp_packet_data_seg_len(odp_pkt, size );
124 odp_event_t odp_event = event_em2odp(pktev);
127 unlikely(!is_odp_packet(odp_event))) {
129 "Invalid packet event");
133 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
134 uint32_t seg_len = odp_packet_seg_len(odp_pkt);
138 uint32_t tailroom = odp_packet_tailroom(odp_pkt);
140 if (unlikely(size == 0 || size > seg_len + tailroom)) {
142 "Invalid packet resize:%u > max:%u",
143 size, seg_len + tailroom);
149 tail = odp_packet_push_tail(odp_pkt, size - seg_len);
151 tail = odp_packet_pull_tail(odp_pkt, seg_len - size);
156 return odp_packet_data(odp_pkt);
161 odp_event_t odp_event = event_em2odp(pktev);
164 unlikely(!is_odp_packet(odp_event))) {
166 "Invalid packet event");
170 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
172 return odp_packet_headroom(odp_pkt);
177 odp_event_t odp_event = event_em2odp(pktev);
180 unlikely(!is_odp_packet(odp_event))) {
182 "Invalid packet event");
186 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
188 return odp_packet_tailroom(odp_pkt);
193 odp_event_t odp_event = event_em2odp(pktev);
196 unlikely(!is_odp_packet(odp_event))) {
198 "Invalid packet event");
202 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
203 void *ptr = odp_packet_push_head(odp_pkt, len);
207 "packet push head failed, check len=%u", len);
216 odp_event_t odp_event = event_em2odp(pktev);
219 unlikely(!is_odp_packet(odp_event))) {
221 "Invalid packet event");
225 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
226 void *ptr = odp_packet_pull_head(odp_pkt, len);
230 "packet pull head failed, check len=%u", len);
239 odp_event_t odp_event = event_em2odp(pktev);
242 unlikely(!is_odp_packet(odp_event))) {
244 "Invalid packet event");
248 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
249 void *ptr = odp_packet_push_tail(odp_pkt, len);
253 "packet push tail failed, check len=%u", len);
262 odp_event_t odp_event = event_em2odp(pktev);
265 unlikely(!is_odp_packet(odp_event))) {
267 "Invalid packet event");
271 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
272 void *ptr = odp_packet_pull_tail(odp_pkt, len);
276 "packet pull tail failed, check len=%u", len);
285 odp_event_t odp_event = event_em2odp(pktev);
289 "Invalid packet event");
291 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
292 odp_pool_t odp_pool = odp_packet_pool(odp_pkt);
293 em_pool_t pool = pool_odp2em(odp_pool);
298 "Invalid EM pool:%" PRI_POOL "", pool);
301 uint32_t pull_tail_len;
304 if (size > push_head_len) {
305 reset_len = size - push_head_len;
309 pull_tail_len = push_head_len + 1 - size;
312 int ret = odp_packet_reset(odp_pkt, reset_len);
315 "odp-packet reset failed:%d", ret);
319 const void *ptr = odp_packet_push_head(odp_pkt, push_head_len);
323 "odp_packet_push_head() failed");
326 const void *ptr = odp_packet_pull_tail(odp_pkt, pull_tail_len);
330 "odp_packet_pull_tail() failed");
340 event_hdr_t *
const ev_hdr = odp_packet_user_area(odp_pkt);
357static inline em_event_t
360 if (original_hdl.evptr != updated_hdl.evptr) {
362 updated_hdl.evgen = original_hdl.evgen;
363 updated_hdr->
event = updated_hdl.event;
364 return updated_hdl.event;
366 return original_hdl.event;
377concat_packet_with_ref(em_event_t *first_pkt, em_event_t second_pkt)
379 odp_event_t odp_event_first = event_em2odp(*first_pkt);
380 odp_event_t odp_event_second = event_em2odp(second_pkt);
383 (!is_odp_packet(odp_event_first) ||
384 !is_odp_packet(odp_event_second)))) {
386 "first_pkt and/or second_pkt not a packet");
390 const bool esv_ena = esv_enabled();
394 evhdl_t first_ev = {.event = *first_pkt};
396 odp_packet_t odp_pkt_first = odp_packet_from_event(odp_event_first);
397 odp_packet_t odp_pkt_second = odp_packet_from_event(odp_event_second);
398 uint32_t first_len = odp_packet_len(odp_pkt_first);
399 uint32_t second_len = odp_packet_len(odp_pkt_second);
403 ev_hdr_first = odp_packet_user_area(odp_pkt_first);
404 evstate_free(*first_pkt, ev_hdr_first, EVSTATE__MARK_FREE);
407 int ret = odp_packet_extend_tail(&odp_pkt_first, second_len, NULL, NULL);
409 if (unlikely(ret < 0)) {
411 evstate_unmark_free(*first_pkt, ev_hdr_first, EVSTATE__UNMARK_FREE);
416 (void)odp_packet_copy_from_pkt(odp_pkt_first, first_len,
417 odp_pkt_second, 0, second_len);
418 evhdl_t ev_hdl_updated = {.event = event_odp2em(odp_packet_to_event(odp_pkt_first))};
420 ev_hdr_first = odp_packet_user_area(odp_pkt_first);
423 *first_pkt = check_update_event(first_ev, ev_hdl_updated, ev_hdr_first);
427 evstate_unmark_free(*first_pkt, ev_hdr_first, EVSTATE__UNMARK_FREE);
439 "first_pkt has a reference");
443 if (ODP_VERSION_API_NUM(1, 50, 0) > ODP_VERSION_API &&
444 unlikely(event_has_ref(second_pkt))) {
450 return concat_packet_with_ref(first_pkt, second_pkt);
453 odp_event_t odp_event_first = event_em2odp(*first_pkt);
454 odp_event_t odp_event_second = event_em2odp(second_pkt);
457 (!is_odp_packet(odp_event_first) ||
458 !is_odp_packet(odp_event_second)))) {
460 "first_pkt and/or second_pkt not a packet");
464 const bool esv_ena = esv_enabled();
469 evhdl_t ev_hdl_original = {.event = *first_pkt};
471 odp_packet_t odp_pkt_first = odp_packet_from_event(odp_event_first);
472 odp_packet_t odp_pkt_second = odp_packet_from_event(odp_event_second);
476 ev_hdr_first = odp_packet_user_area(odp_pkt_first);
477 ev_hdr_second = odp_packet_user_area(odp_pkt_second);
479 evstate_free(*first_pkt, ev_hdr_first, EVSTATE__MARK_FREE);
480 evstate_free(second_pkt, ev_hdr_second, EVSTATE__MARK_FREE);
483 int ret = odp_packet_concat(&odp_pkt_first, odp_pkt_second);
485 if (unlikely(ret < 0)) {
488 evstate_unmark_free(*first_pkt, ev_hdr_first, EVSTATE__UNMARK_FREE);
489 evstate_unmark_free(second_pkt, ev_hdr_second, EVSTATE__UNMARK_FREE);
493 ev_hdr_first = odp_packet_user_area(odp_pkt_first);
495 evhdl_t ev_hdl_updated = {.event = event_odp2em(odp_packet_to_event(odp_pkt_first))};
497 *first_pkt = check_update_event(ev_hdl_original, ev_hdl_updated, ev_hdr_first);
500 evstate_unmark_free(*first_pkt, ev_hdr_first, EVSTATE__UNMARK_FREE);
#define INTERNAL_ERROR(error, escope, fmt,...)
#define RETURN_ERROR_IF(cond, error, escope, fmt,...)
#define EM_EVENT_GROUP_UNDEF
void em_free(em_event_t event)
void * em_packet_pull_head(em_event_t pktev, uint32_t len)
Pull in the beginning of the packet from the headroom.
void * em_packet_pull_tail(em_event_t pktev, uint32_t len)
void * em_packet_push_head(em_event_t pktev, uint32_t len)
Push out the beginning of the packet into the headroom.
void * em_packet_pointer(em_event_t pktev)
void * em_packet_pointer_and_size(em_event_t pktev, uint32_t *size)
Get the packet event data pointer as well as the packet size.
em_status_t em_packet_reset(em_event_t pktev, uint32_t size)
uint32_t em_packet_headroom(em_event_t pktev)
Packet event headroom length.
int em_packet_concat(em_event_t *first_pkt, em_event_t second_pkt)
Concatenate packet events.
uint32_t em_packet_size(em_event_t pktev)
Get the packet size.
void * em_packet_push_tail(em_event_t pktev, uint32_t len)
Push out the end of the packet into the tailroom.
void * em_packet_resize(em_event_t pktev, uint32_t size)
Resize a packet event.
uint32_t em_packet_tailroom(em_event_t pktev)
Packet event tailroom length.
ev_hdr_user_area_t user_area