Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
168837a
example: sysinfo: print snow5g crypto capabilities
JannePeltonen Jan 12, 2026
7235030
validation: crypto: add snow5g based algorithms
JannePeltonen Jan 12, 2026
5811ec2
example: ipsec_crypto: do not set output_pool crypto session parameter
JannePeltonen Jan 12, 2026
2a2dbda
test: performance: crypto: use odp_crypto_session_param_init()
JannePeltonen Jan 12, 2026
7b72d98
m4: dpdk: check dpdk version during configure
MatiasElo Jan 19, 2026
7316c8f
linux-gen: m4: remove now unnecessary extra dpdk cflags
MatiasElo Jan 19, 2026
6cc7519
test: sched_pktio: decrease pool size to reduce memory usage
MatiasElo Jan 9, 2026
f5f3a7f
linux-gen: crypto: add missing auth/cipher algorithm print support
MatiasElo Jan 26, 2026
22fd232
linux-gen: loop: check for packet references with odp_packet_has_ref()
MatiasElo Jan 26, 2026
cbecd17
linux-gen: sysinfo: print used CONFIG_CACHE_PAD_LINES value
MatiasElo Jan 26, 2026
4c92c69
github_ci: update coverity test container
MatiasElo Jan 28, 2026
c2c6125
linux-gen: pktio: remove dead input queue flush code
MatiasElo Jan 28, 2026
2cf3b19
linux-gen: check actual api pool type in alloc calls
MatiasElo Feb 3, 2026
3a0f360
test: bench_queue: match test names to api functions
MatiasElo Dec 22, 2025
f1cb1f6
test: bench_queue: add test for odp_schedule_multi_wait()
MatiasElo Feb 11, 2026
6daa138
linux-gen: dpdk: fix min_rx_burst config file option usage
MatiasElo Feb 12, 2026
b6f2d41
linux-gen: dpdk: enable making all dpdk pktio options driver specific
MatiasElo Feb 12, 2026
908c11b
validation: pktio: combine global data into a struct
MatiasElo Jan 16, 2026
61f7c65
validation: pktio: save pktio capabilities in suite init
MatiasElo Jan 16, 2026
395e281
validation: pktio: simplify capability check functions
MatiasElo Jan 16, 2026
2273f79
test: pool_perf: add support for testing single event alloc/free func…
MatiasElo Feb 25, 2026
c7c2243
linux-gen: pool: optimize single event free operations
MatiasElo Feb 24, 2026
d40c319
linux-gen: pool: optimize single event alloc operations
MatiasElo Feb 25, 2026
ff1cd82
linux-gen: buffer: optimize odp_buffer_alloc() implementation
MatiasElo Feb 25, 2026
a0fac8b
test: common: add free ctrl and remove len from test_packet_md_t
JannePeltonen Mar 17, 2026
8ccb365
linux-gen: packet: initialize L2 offset to ODP_PACKET_OFFSET_INVALID
JannePeltonen Mar 17, 2026
0715968
validation: packet: check packet metadata default values better
JannePeltonen Mar 17, 2026
b7ed79f
test: packet_gen: fix packet pool destroying after startup error
JannePeltonen Mar 23, 2026
609d7a4
validation: pktio: reduce code duplication in checksum tests
JannePeltonen Mar 23, 2026
60fd92f
validation: pktio: set has_udp and has_sctp flags only when needed
JannePeltonen Mar 23, 2026
98f4da3
linux-gen: crypto: ipsec: tm: fix handling of static packet references
JannePeltonen Mar 24, 2026
47eef7b
validation: crypto: add testing with static packet references
JannePeltonen Mar 24, 2026
5e8ea6d
linux-gen: packet: fix odp_packet_rem_data() when removing from tail
JannePeltonen Mar 26, 2026
dcb05a5
linux-gen: packet: optimize odp_packet_{add,rem}_data() a little
JannePeltonen Mar 26, 2026
77f6787
api: queue: add odp_queue_len() function
MatiasElo Mar 6, 2026
738e5ae
linux-gen: queue: implement odp_queue_len() function
MatiasElo Mar 6, 2026
ed20247
validation: queue: combine all test global data
MatiasElo Mar 9, 2026
63edbff
validation: add missing inactive test prints
MatiasElo Mar 11, 2026
3c3994c
validation: queue: make non-blocking and lock-free queue tests condit…
MatiasElo Mar 9, 2026
8cd5c74
validation: queue: add basic test for wait-free plain queues
MatiasElo Mar 9, 2026
9841c9f
validation: queue: add test for odp_queue_len()
MatiasElo Mar 9, 2026
f011b7b
validation: schedule: add test for odp_queue_len()
MatiasElo Mar 9, 2026
de752cf
api: timer: refactor periodic timer expiration event configuration
TuomasTaipale Feb 25, 2026
1ab0b9e
test: bench_timer: add test for periodic timeout check
TuomasTaipale Mar 25, 2026
ee05c51
api: timer: add timer busy error code
TuomasTaipale Jan 28, 2026
ae273d3
validation: timer: add tests for busy error code
TuomasTaipale Feb 12, 2026
820949d
test: timer_stress: handle new timer busy error code
TuomasTaipale Feb 13, 2026
e6d5c4a
test: pipeline: handle new timer busy error code
TuomasTaipale Feb 13, 2026
272374b
test: timer_accuracy: handle new timer busy error code
TuomasTaipale Feb 13, 2026
0c3530f
api: packet: clarify l2/l3/l4 pointer value when offset is too large
JannePeltonen Mar 17, 2026
e7005b9
api: timer: support period setting directly with frequency
TuomasTaipale Mar 6, 2026
a5db1ff
example: sysinfo: print new periodic timer capabilities
TuomasTaipale Mar 29, 2026
451fc0b
api: timer: add flow control parameter for periodic timer timeout events
MatiasElo Feb 4, 2026
b32cb75
validation: timer: add tests for periodic timer flow control
MatiasElo Feb 6, 2026
d1544ce
example: sysinfo: print new timer pool flow control capabilities
MatiasElo Mar 30, 2026
85ca2b7
validation: packet: make packet ref tests work with the coming API too
JannePeltonen Mar 27, 2026
c80a8f4
api: packet: do not refer to odp_packet_l2_ptr() as data start
JannePeltonen Mar 17, 2026
416a1f3
api: packet: improve dynamic and static packet references
JannePeltonen Nov 11, 2025
59ef4a1
linux-gen: packet: reduce cos field size in packet header
JannePeltonen Mar 27, 2026
4d7bc7c
linux-gen: packet: implement the improved packet references
JannePeltonen Mar 27, 2026
4c9eb3e
linux-gen: pktio: add support for packet references
JannePeltonen Mar 27, 2026
477023b
linux-gen: crypto: add support for referencing packets
JannePeltonen Mar 27, 2026
cfaf79c
linux-gen: tm: add support for packet references
JannePeltonen Mar 27, 2026
c329314
linux-gen: ipsec: add support for referencing packets
JannePeltonen Mar 27, 2026
bbe67b3
validation: pktio: add testing with referencing and referenced packets
JannePeltonen Mar 27, 2026
2e46567
validation: crypto: add testing with referencing and referenced packets
JannePeltonen Mar 27, 2026
b576ba7
validation: packet: add validation tests for new packet references
JannePeltonen Mar 27, 2026
2b52a9c
test: bench_packet: add odp_packet_is_referencing()
JannePeltonen Mar 27, 2026
12c5926
test: packet_gen: check pktio capa when using static reference TX mode
JannePeltonen Mar 27, 2026
a0196b7
example: sysinfo: print the new packet ref related pktio capa flags
JannePeltonen Mar 27, 2026
3643be7
doc: userguide: update the chapter on packet references
JannePeltonen Mar 31, 2026
14db298
api: increment ODP API version to 1.50.0
MatiasElo Mar 27, 2026
b00e201
Merge ODP v1.50.0.0
MatiasElo Apr 16, 2026
0a1ce42
Port cbecd1792 "linux-gen: sysinfo: print used CONFIG_CACHE_PAD_LINES…
MatiasElo Apr 17, 2026
f465619
Port 2cf3b1976 "linux-gen: check actual api pool type in alloc calls"
MatiasElo Apr 17, 2026
3d06bfe
Port ff1cd8250 "linux-gen: buffer: optimize odp_buffer_alloc() implem…
MatiasElo Apr 17, 2026
e33fd93
Port 5e8ea6d2f "linux-gen: packet: fix odp_packet_rem_data() when rem…
MatiasElo Apr 17, 2026
0867cc6
Port dcb05a543 "linux-gen: packet: optimize odp_packet_{add,rem}_data…
MatiasElo Apr 17, 2026
69afa10
Port 8ccb36560 "linux-gen: packet: initialize L2 offset to ODP_PACKET…
MatiasElo Apr 29, 2026
bef5746
Port b6f2d4182 "linux-gen: dpdk: enable making all dpdk pktio options…
MatiasElo May 6, 2026
91693f9
Port 738e5ae7f "linux-gen: queue: implement odp_queue_len() function"
MatiasElo May 6, 2026
4959419
Port de752cfdc "api: timer: refactor periodic timer expiration event …
MatiasElo Apr 20, 2026
75b83b5
Port e7005b945 "api: timer: support period setting directly with freq…
MatiasElo Apr 20, 2026
39929bd
Port 59ef4a1b9 "linux-gen: packet: reduce cos field size in packet he…
MatiasElo Apr 16, 2026
7b49bb6
Port 98f4da362 "linux-gen: crypto: ipsec: tm: fix handling of static …
MatiasElo Apr 17, 2026
8f67fc3
Port 477023b1e "linux-gen: crypto: add support for referencing packets"
MatiasElo May 6, 2026
105399b
linux-dpdk: packet: fix odp_packet_extend_head() new segment allocation
MatiasElo Apr 30, 2026
69fd80d
linux-dpdk: packet: use pool seg_len in odp_packet_align()
MatiasElo Apr 29, 2026
1b1ac0f
linux-dpdk: packet: add helper for mbuf to packet header conversion
MatiasElo May 8, 2026
abb2a61
Port 4d7bc7cdd "linux-gen: packet: implement the improved packet refe…
MatiasElo Apr 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/coverity.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
schedule:
- cron: '0 0 * * *' # Once every day at 00:00 UTC
env:
CC: gcc

Check failure on line 7 in .github/workflows/coverity.yml

View workflow job for this annotation

GitHub Actions / Checkpatch

ERROR: Unrecognized email address: 'gcc'

Check failure on line 7 in .github/workflows/coverity.yml

View workflow job for this annotation

GitHub Actions / Checkpatch

WARNING: Do not use whitespace before Cc:
ARCH: x86_64
CONTAINER_NAMESPACE: ghcr.io/opendataplane/odp-docker-images
OS: ubuntu_20.04
OS: ubuntu_24.04
COVERITY_EMAIL: dummy@opendataplane.org
COVERITY_PROJECT: ODP-DPDK

Expand Down
123 changes: 123 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,5 +1,128 @@
# Changelog

## OpenDataPlane (1.50.0.0)

### Backward incompatible API changes

#### IPsec
* Change `odp_ipsec_out_inline()` function specification to state that packets
that share data with other packets may not be sent using this function unless
the pktout to be used has the relevant capability.

#### Packet
* Redefine the semantics of `odp_packet_ref()` in a way that makes it simpler to
support packet data sharing. Also, specify better rules for packet data layout
manipulation operations, allowing private packet data also in the tail of
packets that reference other packets.
* Change `odp_packet_ref_pkt()` function specification to match updated
`odp_packet_ref()` specification.
* Change `odp_packet_has_ref()` to indicate whether a packet is referenced by
another packet, not whether the packet shares data with another packet. In
particular, `odp_packet_ref()` returns a packet that shares data with the given
packet but is not itself referenced by other packets.

#### Packet IO
* Add `odp_pktio_capability_t.packet_ref` capability to indicate whether a pktio
supports sending packets with shared data without using the `dont_free` flag.

#### Timer
* Change periodic timer expiration event configuration. Instead of configuring a
single event to be sent for periodic timer expirations, application now
configures a timeout pool to be created as part of timer pool creation
(`odp_timer_pool_param_t.periodic`).
* Add `odp_timer_periodic_param_init()` function for initializing periodic timer
parameters (`odp_timer_periodic_param_t`).
* Add `odp_timer_periodic_alloc()` function for allocating periodic timers. Old
`odp_timer_alloc()` function is used only for single shot timers.
* Change `odp_timer_periodic_start_t` to only include first expiration tick. The
remaining previous parameters have been moved to `odp_timer_periodic_param_t`.
* Change `odp_timer_periodic_ack()` return values to not have a specific value
for events from a cancelled timer (not last).
* Add `ODP_TIMER_BUSY` return value to `odp_timer_start()`,
`odp_timer_restart()`, and `odp_timer_periodic_start()` functions.
* Add alternative method for configuring periodic timer frequency for timer
pools and timers. The new method introduces a new periodic timer type
`ODP_TIMER_TYPE_PERIODIC_FREQ` to be used with periodic timer capability checks
and timer pool creation. Old periodic timer type `ODP_TIMER_TYPE_PERIODIC` is
renamed to `ODP_TIMER_TYPE_PERIODIC_BASE_MUL` to better reflect the differences
between these two types.

#### Traffic Manager
* Add `odp_tm_capabilities_t.packet_ref` capability to indicate whether packets
that reference other packets or are referenced by other packets can be enqueued
to TM.

### Backward compatible API changes

#### Event Vector
* Add `odp_event_aggr_capability_t.stats` capability for supported statistics
counters.

#### Packet
* Add `odp_packet_is_referencing()` function for testing whether a packet
references another packet but is not a static reference.
* Clarify how `odp_packet_free()` function operates with packets that
participate in packet data sharing.
* Clarify how `odp_packet_concat()` function operates with packets that
participate in packet data sharing.
* Clarify that `odp_packet_copy()` function returns always a normal packet, even
if the source packet is a referencing packet.
* Change `odp_packet_free_ctrl_set()` function specification to allow usage with
packets that participate in packet data sharing.
* Clarify that even though `odp_packet_l2/l3/l4_offset_set()` functions require
the offset not exceed packet data length, later packet truncation and pulling
may result in the offset exceeding packet data length.
* Clarify that `odp_packet_l2/l3/l4_ptr()` pointer value is undefined when
l2/l3/l4 offset metadata of a packet is larger than the length of the packet
e.g. after truncating the packet.
* Fix `odp_packet_head()` specification to not refer to `odp_packet_l2_ptr()`
as data start.

#### Queue
* Add `odp_queue_len()` function for reading the number of events currently in
the queue, or in case of an aggregator queue handle, the number of events
currently waiting for vector generation.
* Add supported statistics counters (`odp_queue_stats_opt_t`) for each plain
queue type into `odp_queue_capability_t`.

#### Scheduler
* Add `odp_schedule_capability_t.queue_stats` capability for supported
statistics counters.

#### Timer
* Add `odp_timeout_is_periodic()` function for checking if a timeout is from a
periodic timer.
* Add new `odp_timer_pool_param_t.periodic.max_pending_tmo` parameter and
matching capabilities `odp_timer_capability_t.periodic.min/max_pending_tmo`
for configuring flow control for periodic timer pools.

### Implementation
* Optimize implementations for single event alloc functions (other event types
than packet).
* Optimize implementations for single event free functions (other event types
than packet).

### Performance Tests

#### bench_queue
* Match test results output to API function names also in throughput mode.
* Add missing test for `odp_schedule_multi_wait()` function.

#### bench_packet
* Add test for `odp_packet_is_referencing()` function.

#### bench_timer
* Add tests for `odp_timeout_is_periodic()` function.

#### pool_perf
* Add support for testing single event `odp_buffer_alloc/free()` and
`odp_packet_alloc/free()` functions by setting burst size to zero
(`--burst 0`).
* Change default burst size to 32.

#### sched_pktio
* Decrease packet pool size to 16k to reduce memory usage.

## OpenDataPlane (1.49.0.0)

### Backward compatible API changes
Expand Down
6 changes: 5 additions & 1 deletion config/odp-linux-dpdk.conf
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ pktio: {
}

# DPDK pktio options
#
# All options can also be driver specific. If a driver specific option is
# defined, it overrides the matching generic option. Driver specific options are
# defined in sections named according to DPDK PMD names (e.g. net_ixgbe).
pktio_dpdk: {
# Default options

Expand All @@ -118,7 +122,7 @@ pktio_dpdk: {
# Enable multi segment transmit offload (RTE_ETH_TX_OFFLOAD_MULTI_SEGS)
tx_offload_multi_segs = 0

# Driver specific options (use PMD names from DPDK)
# ixgbe driver specific options
net_ixgbe: {
rx_drop_en = 1
}
Expand Down
6 changes: 5 additions & 1 deletion config/odp-linux-generic.conf
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,10 @@ pktio: {
}

# DPDK pktio options
#
# All options can also be driver specific. If a driver specific option is
# defined, it overrides the matching generic option. Driver specific options are
# defined in sections named according to DPDK PMD names (e.g. net_ixgbe).
pktio_dpdk: {
# Default options
num_rx_desc = 128
Expand All @@ -139,7 +143,7 @@ pktio_dpdk: {
# values. Use 0 for implementation defaults.
min_rx_burst = 0

# Driver specific options (use PMD names from DPDK)
# ixgbe driver specific options
net_ixgbe: {
rx_drop_en = 1
}
Expand Down
2 changes: 1 addition & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ AC_PREREQ([2.5])
# ODP API version
##########################################################################
m4_define([odp_version_generation], [1])
m4_define([odp_version_major], [49])
m4_define([odp_version_major], [50])
m4_define([odp_version_minor], [0])
m4_define([odp_version_patch], [0])

Expand Down
68 changes: 40 additions & 28 deletions doc/users-guide/users-guide-packet.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@ function like:
int xmit_pkt(odp_pktout_queue_t queue, odp_packet_t pkt)
{
odp_packet_t ref = odp_packet_ref_static(pkt);
/* send through a pktio that supports static packet references */
return ref == ODP_PACKET_INVALID ? -1 : odp_pktout_send(queue, ref, 1);
}
-----
Expand All @@ -330,7 +331,8 @@ This transmits a reference to `pkt` so that `pkt` is retained by the caller,
which means that the caller is free to retransmit it if needed at a later
time. When a higher level protocol (_e.g.,_ receipt of a TCP ACK packet)
confirms that the transmission was successful, `pkt` can then be discarded via
an `odp_packet_free()` call.
an `odp_packet_free()` call. The pktio through which the reference is
sent must support sending static packet references.

The key characteristic of a static reference is that because there are
multiple independent handles that refer to the same packet, the caller should
Expand All @@ -349,8 +351,9 @@ int odp_packet_has_ref(odp_packet_t pkt);
-----

that indicates whether other packets exist that share bytes with this
packet. If this routine returns 0 then the caller can be assured that it is
safe to modify it as this handle is the only reference to the packet.
packet. If this routine returns 0 and the packet is not a dynamic reference,
then the caller can be assured that it is safe to modify the packet as this
handle is the only reference to the packet.

==== Dynamic References
While static references are convenient and efficient, they are limited by the
Expand Down Expand Up @@ -380,12 +383,19 @@ image::ref.svg[align="center"]
Following a successful reference creation, the bytes of `pkt` beginning at
offset `offset` are shared with the created reference. These bytes should be
treated as read only since multiple references point to them. Each reference,
however still retains its own individual headroom and metadata that is not
shared with any other reference. This allows unique headers to be created by
calling `odp_packet_push_head()` or `odp_packet_extend_head()` on either
handle. This allows multiple references to the same packet to prefix unique
headers onto common shared data it so that they can be properly multicast
using code such as:
however, has its own metadata that is not shared with any other packet.

Packet data and layout of the referenced packet `pkt` must not be
modified as long as references to the packet exist. Packet layout of the
referencing packet, `ref_pkt`, may be modified. The push and extend
variants of packet manipulation functions always add non-shared data
to a dynamic reference and pull and trunc functions remove any kind
(shared or non-shared) data from the reference. Non-shared packet data
of the referencing packet may be modified.

Prefixing dynamic references with non-shared packet data makes it possible to
have multiple packets that prefix the same packet data with unique headers,
which enables multicast without packet data copying using code such as:

[source,c]
-----
Expand All @@ -401,6 +411,10 @@ int pkt_fanout(odp_packet_t payload, odp_queue_t fanout_queue[], int num_queues)
Receiver worker threads can then operate on each reference to the packet in
parallel to prefix a unique transmit header onto it and send it out.

Dynamic references and referencing packets can be sent to a pktio only
if the pktio advertises the capability to send such packets or if the
packets are sent with the `ODP_PACKET_FREE_CTRL_DONT_FREE` option.

==== Dynamic References with Headers
The dynamic references discussed so far have one drawback in that the headers
needed to make each reference unique must be constructed individually after
Expand Down Expand Up @@ -457,7 +471,7 @@ Here two separate header packets are prefixed onto the same shared packet, each
at their own specified offset, which may or may not be the same. The result is
three packets visible to the application:

* The original `pkt`, which can still be accessed and manipulated directly.
* The original `pkt`, which can still be accessed as read only.
* The first reference, which consists of `hdr_pkt1` followed by bytes
contained in `pkt` starting at `offset1`.
* The second reference, which consists of `hdr_pkt2` followed by bytes
Expand All @@ -468,10 +482,9 @@ references exist.

===== Data Sharing with References
Because a `pkt` is a shared object when referenced, applications must observe
certain disciplines when working with them. For best portability and
reliability, the shared data contained in any packet referred to by references
should be treated as read only once it has been successfully referenced until
it is known that all references to it have been freed.
certain disciplines when working with them. Shared data contained in any
packet should be treated as read only and all packet data of packets referenced
by other packets should be treaded as read only.

To assist applications in working with references, ODP provides the additional
API:
Expand All @@ -481,24 +494,23 @@ API:
int odp_packet_has_ref(odp_packet_t pkt);
-----
The `odp_packet_has_ref()` API says whether any other packets
exist that share any bytes with this packet.
exist that reference packet data of this packet.

===== Compound References
Note that architecturally ODP does not limit referencing and so it is possible
that a reference may be used as a basis for creating another reference. The
result is a _compound reference_ that should still behave as any other
[source,c]
-----
int odp_packet_is_referencing(odp_packet_t pkt);
-----
The `odp_packet_is_referencing()` API says whether this packet is a dynamic
reference.

As noted earlier, the intent behind references is that they are lightweight
objects that can be implemented without requiring data copies. The existence
of compound references may complicate this goal for some implementations. As a
result, implementations are always free to perform partial or full copies of
packets as part of any reference creation call.
===== Compound References

Note also that a packet may not reference itself, nor may circular reference
relationships be formed, _e.g.,_ packet A is used as a header for a reference
to packet B and B is used as a header for a reference to packet A. Results
are undefined if such circular references are attempted.
Static packet reference may be created to a packet it is already a static
packet reference. Static packet reference may not be created to a packet
that is a dynamic reference or a packet that is referenced by a dynamic
reference. Dynamic references may not be created to packets that are
static or dynamic references, but may be created to packets that are
already referenced by another dynamic reference.

=== Packet Parsing, Checksum Processing, and Overrides
Packet parsing is normally triggered automatically as part of packet RX
Expand Down
1 change: 0 additions & 1 deletion example/ipsec_crypto/odp_ipsec_cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ int create_ipsec_cache_entry(sa_db_entry_t *cipher_sa,
params.op = (in) ? ODP_CRYPTO_OP_DECODE : ODP_CRYPTO_OP_ENCODE;
params.op_type = ODP_CRYPTO_OP_TYPE_BASIC;
params.auth_cipher_text = TRUE;
params.output_pool = ODP_POOL_INVALID;
if (CRYPTO_API_SYNC == api_mode) {
params.op_mode = ODP_CRYPTO_SYNC;
params.compl_queue = ODP_QUEUE_INVALID;
Expand Down
Loading