aboutsummaryrefslogtreecommitdiff
path: root/example
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2022-06-09 16:10:08 +0300
committerMatias Elo <matias.elo@nokia.com>2022-06-23 11:13:22 +0300
commit6ce4abbea26b8cbaa733a393c2b0e0d90a17c0da (patch)
treee6bf168cee3347d622698b22ad0ed05ffaa26d6c /example
parentd17e81a4ad88bde067b1a36923197337a017ed82 (diff)
example: ping: fix odp_packet_input_index() usage
The indexes returned by odp_pktio_index() may not start from zero. Add a lookup table to handle this. Signed-off-by: Matias Elo <matias.elo@nokia.com> Reviewed-by: Janne Peltonen <janne.peltonen@nokia.com>
Diffstat (limited to 'example')
-rw-r--r--example/ping/odp_ping.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/example/ping/odp_ping.c b/example/ping/odp_ping.c
index df0360f76..2d83e3440 100644
--- a/example/ping/odp_ping.c
+++ b/example/ping/odp_ping.c
@@ -16,9 +16,12 @@
#include <odp/helper/odph_api.h>
#define MAX_PKTIOS 32
+#define MAX_PKTIO_INDEXES 1024
#define MAX_PKTIO_NAME 255
#define MAX_PKT_NUM 1024
+ODP_STATIC_ASSERT(MAX_PKTIOS < UINT8_MAX, "MAX_PKTIOS too large for index lookup");
+
typedef struct test_options_t {
uint64_t num_packet;
int verbose;
@@ -42,6 +45,9 @@ typedef struct test_global_t {
} pktio[MAX_PKTIOS];
+ /* Pktio index lookup table */
+ uint8_t pktio_from_idx[MAX_PKTIO_INDEXES];
+
} test_global_t;
static test_global_t test_global;
@@ -178,6 +184,9 @@ static int open_pktios(test_global_t *global)
return -1;
}
+ if (odp_pktio_max_index() >= MAX_PKTIO_INDEXES)
+ printf("Warning: max pktio index (%u) is too large\n", odp_pktio_max_index());
+
odp_pktio_param_init(&pktio_param);
pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
pktio_param.out_mode = ODP_PKTOUT_MODE_DIRECT;
@@ -244,6 +253,22 @@ static int open_pktios(test_global_t *global)
return 0;
}
+static int init_pktio_lookup_tbl(test_global_t *global)
+{
+ for (int i = 0; i < global->opt.num_pktio; i++) {
+ odp_pktio_t pktio = global->pktio[i].pktio;
+ int pktio_idx = odp_pktio_index(pktio);
+
+ if (pktio_idx < 0 || pktio_idx >= MAX_PKTIO_INDEXES) {
+ ODPH_ERR("Bad pktio index %i\n", pktio_idx);
+ return -1;
+ }
+
+ global->pktio_from_idx[pktio_idx] = i;
+ }
+ return 0;
+}
+
static int start_pktios(test_global_t *global)
{
int i;
@@ -497,7 +522,7 @@ static void icmp_reply(test_global_t *global, odp_packet_t pkt)
odph_ethhdr_t *eth_hdr;
uint16_t old, new;
uint32_t len = 0;
- int index = odp_packet_input_index(pkt);
+ int index = global->pktio_from_idx[odp_packet_input_index(pkt)];
odp_pktout_queue_t pktout = global->pktio[index].pktout;
odph_ethaddr_t *eth_addr = &global->pktio[index].eth_addr;
int icmp = odp_packet_has_icmp(pkt);
@@ -659,6 +684,11 @@ int main(int argc, char *argv[])
return -1;
}
+ if (init_pktio_lookup_tbl(global)) {
+ printf("Error: mapping pktio indexes failed\n");
+ return -1;
+ }
+
if (start_pktios(global)) {
printf("Error: pktio start failed\n");
return -1;