diff options
-rw-r--r-- | config/odp-linux-generic.conf | 12 | ||||
-rw-r--r-- | platform/linux-generic/include/odp_packet_io_internal.h | 5 | ||||
-rw-r--r-- | platform/linux-generic/odp_packet_io.c | 33 | ||||
-rw-r--r-- | platform/linux-generic/test/inline-timer.conf | 2 | ||||
-rw-r--r-- | platform/linux-generic/test/process-mode.conf | 2 |
5 files changed, 51 insertions, 3 deletions
diff --git a/config/odp-linux-generic.conf b/config/odp-linux-generic.conf index 4b19c102d..5a3ca72ff 100644 --- a/config/odp-linux-generic.conf +++ b/config/odp-linux-generic.conf @@ -16,7 +16,7 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.11" +config_file_version = "0.1.12" # Shared memory options shm: { @@ -74,6 +74,16 @@ pool: { } } +# General pktio options +pktio: { + # Frame start offset from packet base pointer at packet input. This can + # be used (together with pool.pkt.base_align option) to tune packet data + # alignment for received frames. Currently, packet IO drivers + # (zero-copy DPDK, loop and ipc) that do not copy data ignore this + # option. + pktin_frame_offset = 0 +} + # DPDK pktio options pktio_dpdk: { # Default options diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h index fe26612ab..f7eca5792 100644 --- a/platform/linux-generic/include/odp_packet_io_internal.h +++ b/platform/linux-generic/include/odp_packet_io_internal.h @@ -139,6 +139,11 @@ typedef struct { odp_spinlock_t lock; odp_shm_t shm; + struct { + /* Frame start offset from base pointer at packet input */ + uint16_t pktin_frame_offset; + } config; + pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES]; } pktio_global_t; diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index 81ce4846e..019d35379 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -28,6 +28,7 @@ #include <odp/api/plat/time_inlines.h> #include <odp_pcapng.h> #include <odp/api/plat/queue_inlines.h> +#include <odp_libconfig_internal.h> #include <string.h> #include <inttypes.h> @@ -58,6 +59,32 @@ static inline pktio_entry_t *pktio_entry_by_index(int index) return pktio_entry_ptr[index]; } +static int read_config_file(pktio_global_t *pktio_glb) +{ + const char *str; + int val = 0; + + ODP_PRINT("Packet IO config:\n"); + + str = "pktio.pktin_frame_offset"; + if (!_odp_libconfig_lookup_int(str, &val)) { + ODP_ERR("Config option '%s' not found.\n", str); + return -1; + } + + if (val < 0 || val > UINT16_MAX) { + ODP_ERR("Bad value %s = %i\n", str, val); + return -1; + } + + pktio_glb->config.pktin_frame_offset = val; + ODP_PRINT(" %s: %i\n", str, val); + + ODP_PRINT("\n"); + + return 0; +} + int _odp_pktio_init_global(void) { pktio_entry_t *pktio_entry; @@ -76,6 +103,12 @@ int _odp_pktio_init_global(void) odp_spinlock_init(&pktio_global->lock); + if (read_config_file(pktio_global)) { + odp_shm_free(shm); + pktio_global = NULL; + return -1; + } + for (i = 0; i < ODP_CONFIG_PKTIO_ENTRIES; ++i) { pktio_entry = &pktio_global->entries[i]; diff --git a/platform/linux-generic/test/inline-timer.conf b/platform/linux-generic/test/inline-timer.conf index 45b456e8c..42ed09fb6 100644 --- a/platform/linux-generic/test/inline-timer.conf +++ b/platform/linux-generic/test/inline-timer.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.11" +config_file_version = "0.1.12" timer: { # Enable inline timer implementation diff --git a/platform/linux-generic/test/process-mode.conf b/platform/linux-generic/test/process-mode.conf index fd766e620..10cf48911 100644 --- a/platform/linux-generic/test/process-mode.conf +++ b/platform/linux-generic/test/process-mode.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.11" +config_file_version = "0.1.12" # Shared memory options shm: { |