aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/odp-linux-generic.conf12
-rw-r--r--platform/linux-generic/include/odp_packet_io_internal.h5
-rw-r--r--platform/linux-generic/odp_packet_io.c33
-rw-r--r--platform/linux-generic/test/inline-timer.conf2
-rw-r--r--platform/linux-generic/test/process-mode.conf2
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: {