Signed-off-by: Maxim Uvarov <[email protected]>
---
example/l2fwd_simple/l2fwd_simple_run.sh | 6 ++---
example/l2fwd_simple/odp_l2fwd_simple.c | 39 +++++++++++++++++++++++++++++---
2 files changed, 39 insertions(+), 6 deletions(-)
diff --git a/example/l2fwd_simple/l2fwd_simple_run.sh
b/example/l2fwd_simple/l2fwd_simple_run.sh
index 292d0e3..130a3a8 100755
--- a/example/l2fwd_simple/l2fwd_simple_run.sh
+++ b/example/l2fwd_simple/l2fwd_simple_run.sh
@@ -12,12 +12,12 @@ echo "using PCAP_IN = ${PCAP_IN}"
./odp_l2fwd_simple pcap:in=${PCAP_IN} pcap:out=pcapout.pcap 02:00:00:00:00:01
02:00:00:00:00:02 &
sleep 1
-kill $!
+kill -s SIGINT $!
wait $!
STATUS=$?
-if [ "$STATUS" -ne 143 ]; then
- echo "Error: status was: $STATUS, expected 143"
+if [ "$STATUS" -ne 0 ]; then
+ echo "Error: status was: $STATUS, expected 0"
exit 1
fi
diff --git a/example/l2fwd_simple/odp_l2fwd_simple.c
b/example/l2fwd_simple/odp_l2fwd_simple.c
index 8a14e7d..0682d2d 100644
--- a/example/l2fwd_simple/odp_l2fwd_simple.c
+++ b/example/l2fwd_simple/odp_l2fwd_simple.c
@@ -7,6 +7,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>
+#include <signal.h>
#include <odp_api.h>
#include <odp/helper/linux.h>
@@ -18,6 +19,9 @@
#define MAX_PKT_BURST 32
#define MAX_WORKERS 1
+static int exit_thr;
+static int g_ret;
+
struct {
odp_pktio_t if0, if1;
odp_pktin_queue_t if0in, if1in;
@@ -25,6 +29,12 @@ struct {
odph_ethaddr_t src, dst;
} global;
+static void sig_handler(int signo ODP_UNUSED)
+{
+ printf("sig_handler!\n");
+ exit_thr = 1;
+}
+
static odp_pktio_t create_pktio(const char *name, odp_pool_t pool,
odp_pktin_queue_t *pktin,
odp_pktout_queue_t *pktout)
@@ -74,6 +84,7 @@ static int run_worker(void *arg ODP_UNUSED)
{
odp_packet_t pkt_tbl[MAX_PKT_BURST];
int pkts, sent, tx_drops, i;
+ int total_pkts = 0;
if (odp_pktio_start(global.if0)) {
printf("unable to start input interface\n");
@@ -87,9 +98,9 @@ static int run_worker(void *arg ODP_UNUSED)
printf("started output interface\n");
printf("started all\n");
- for (;;) {
+ while (!exit_thr) {
pkts = odp_pktin_recv_tmo(global.if0in, pkt_tbl, MAX_PKT_BURST,
- ODP_PKTIN_WAIT);
+ ODP_PKTIN_NO_WAIT);
if (odp_unlikely(pkts <= 0))
continue;
@@ -108,10 +119,15 @@ static int run_worker(void *arg ODP_UNUSED)
sent = odp_pktout_send(global.if1out, pkt_tbl, pkts);
if (sent < 0)
sent = 0;
+ total_pkts += sent;
tx_drops = pkts - sent;
if (odp_unlikely(tx_drops))
odp_packet_free_multi(&pkt_tbl[sent], tx_drops);
}
+
+ if (total_pkts < 10)
+ g_ret = -1;
+
return 0;
}
@@ -192,8 +208,25 @@ int main(int argc, char **argv)
thr_params.thr_type = ODP_THREAD_WORKER;
thr_params.instance = instance;
+ signal(SIGINT, sig_handler);
+
odph_odpthreads_create(thd, &cpumask, &thr_params);
odph_odpthreads_join(thd);
- return 0;
+ if (odp_pool_destroy(pool)) {
+ printf("Error: pool destroy\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (odp_term_local()) {
+ printf("Error: term local\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (odp_term_global(instance)) {
+ printf("Error: term global\n");
+ exit(EXIT_FAILURE);
+ }
+
+ return g_ret;
}
--
2.7.1.250.gff4ea60