aboutsummaryrefslogtreecommitdiff
path: root/example/ipsec/odp_ipsec_stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'example/ipsec/odp_ipsec_stream.c')
-rw-r--r--example/ipsec/odp_ipsec_stream.c38
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;
}