diff options
author | Matias Elo <matias.elo@nokia.com> | 2022-06-09 16:10:08 +0300 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2022-06-23 11:13:22 +0300 |
commit | 6ce4abbea26b8cbaa733a393c2b0e0d90a17c0da (patch) | |
tree | e6bf168cee3347d622698b22ad0ed05ffaa26d6c /example | |
parent | d17e81a4ad88bde067b1a36923197337a017ed82 (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.c | 32 |
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; |