diff options
Diffstat (limited to 'example/ipsec/odp_ipsec_stream.c')
-rw-r--r-- | example/ipsec/odp_ipsec_stream.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/example/ipsec/odp_ipsec_stream.c b/example/ipsec/odp_ipsec_stream.c index 9f953e4a9..d689c6198 100644 --- a/example/ipsec/odp_ipsec_stream.c +++ b/example/ipsec/odp_ipsec_stream.c @@ -168,7 +168,8 @@ void resolve_stream_db(void) odp_packet_t create_ipv4_packet(stream_db_entry_t *stream, uint8_t *dmac, - odp_pool_t pkt_pool) + odp_pool_t pkt_pool, + uint32_t max_len) { ipsec_cache_entry_t *entry = NULL; odp_packet_t pkt; @@ -188,10 +189,18 @@ odp_packet_t create_ipv4_packet(stream_db_entry_t *stream, else if (stream->output.entry) entry = stream->output.entry; + /* Make sure there is enough space for protocol overhead */ + if ((stream->length + 200) > max_len) { + ODPH_ERR("Error: too large test packet\n"); + return ODP_PACKET_INVALID; + } + /* Get packet */ - pkt = odp_packet_alloc(pkt_pool, 0); - if (ODP_PACKET_INVALID == pkt) + pkt = odp_packet_alloc(pkt_pool, max_len); + if (ODP_PACKET_INVALID == pkt) { + ODPH_ERR("Error: packet alloc failed\n"); return ODP_PACKET_INVALID; + } base = odp_packet_data(pkt); data = odp_packet_data(pkt); @@ -358,7 +367,7 @@ odp_packet_t create_ipv4_packet(stream_db_entry_t *stream, } /* Correct set packet length offsets */ - odp_packet_push_tail(pkt, data - base); + odp_packet_pull_tail(pkt, max_len - (data - base)); odp_packet_l2_offset_set(pkt, (uint8_t *)eth - base); odp_packet_l3_offset_set(pkt, (uint8_t *)ip - base); odp_packet_l4_offset_set(pkt, ((uint8_t *)ip - base) + sizeof(*ip)); @@ -545,14 +554,23 @@ int create_stream_db_inputs(void) { int created = 0; odp_pool_t pkt_pool; + odp_pool_info_t pool_info; stream_db_entry_t *stream = NULL; + uint32_t max_len; /* Lookup the packet pool */ pkt_pool = odp_pool_lookup("packet_pool"); if (pkt_pool == ODP_POOL_INVALID) { ODPH_ERR("Error: pkt_pool not found\n"); - exit(EXIT_FAILURE); + return -1; } + if (odp_pool_info(pkt_pool, &pool_info)) { + ODPH_ERR("Error: pool info failed\n"); + return -1; + } + + /* Only single segment packets are supported */ + max_len = pool_info.params.pkt.seg_len; /* For each stream create corresponding input packets */ for (stream = stream_db->list; NULL != stream; stream = stream->next) { @@ -579,15 +597,15 @@ int create_stream_db_inputs(void) for (count = stream->count; count > 0; count--) { odp_packet_t pkt; - pkt = create_ipv4_packet(stream, dmac, pkt_pool); + pkt = create_ipv4_packet(stream, dmac, pkt_pool, max_len); if (ODP_PACKET_INVALID == pkt) { - printf("Packet buffers exhausted\n"); + ODPH_ERR("Error: packet buffers exhausted\n"); break; } stream->created++; if (odp_pktout_send(queue, &pkt, 1) != 1) { odp_packet_free(pkt); - printf("Queue enqueue failed\n"); + ODPH_ERR("Error: queue enqueue failed\n"); break; } @@ -596,6 +614,10 @@ int create_stream_db_inputs(void) created++; } } + if ((stream_db->index > 0) && created == 0) { + ODPH_ERR("Error: failed to create any input streams\n"); + return -1; + } return created; } |