/*
-// Copyright (c) 2010-2017 Intel Corporation
+// Copyright (c) 2010-2020 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
idx++;
}
}
+ // Check that task id is valid and running
+ if (idx == -1)
+ return;
+
lconf->task_is_running[lconf->msg.task_id] = 0;
t = lconf->tasks_all[lconf->msg.task_id];
t->aux->start(t);
}
lconf->n_tasks_run = lconf->n_tasks_all;
+ return;
}
- else if (lconf->n_tasks_run == 0) {
+
+ // Check that task id is valid
+ if (lconf->msg.task_id >= lconf->n_tasks_all)
+ return;
+
+ if (lconf->n_tasks_run == 0) {
t = lconf->tasks_run[0] = lconf->tasks_all[lconf->msg.task_id];
lconf->n_tasks_run = 1;
lconf->task_is_running[lconf->msg.task_id] = 1;
t->aux->start(t);
}
else {
+ if (lconf->task_is_running[lconf->msg.task_id])
+ return;
for (int i = lconf->n_tasks_run - 1; i >= 0; --i) {
idx = lconf_get_task_id(lconf, lconf->tasks_run[i]);
if (idx == lconf->msg.task_id) {
+ // We should not come here as checking earlier if task id is running...
+ plog_warn("Unexpectedly get request to start task %d already running\n", idx);
break;
}
else if (idx > lconf->msg.task_id) {
struct task_base *t;
int ret = 0;
+ if ((lconf->msg.type == LCONF_MSG_TRACE) && (lconf->tasks_all[lconf->msg.task_id]->tx_pkt == tx_pkt_drop_all)) {
+ /* We are asked to dump packets through command dump.
+ * This usually means map RX and TX packets before printing them.
+ * However we do not transmit the packets in this case => use the DUMP_RX function.
+ * This will prevent seeing the received packets also printed as TX[255] (= dropped)
+ */
+ lconf->msg.type = LCONF_MSG_DUMP_RX;
+ }
+
switch (lconf->msg.type) {
case LCONF_MSG_STOP:
msg_stop(lconf);
if (lconf->msg.type == LCONF_MSG_DUMP ||
lconf->msg.type == LCONF_MSG_DUMP_TX) {
t->aux->task_rt_dump.n_print_tx = lconf->msg.val;
- if (t->tx_pkt == tx_pkt_l3) {
+ if ((t->tx_pkt == tx_pkt_l3) || (t->tx_pkt == tx_pkt_ndp)) {
if (t->aux->tx_pkt_orig)
t->aux->tx_pkt_l2 = t->aux->tx_pkt_orig;
t->aux->tx_pkt_orig = t->aux->tx_pkt_l2;
t = lconf->tasks_all[lconf->msg.task_id];
if (lconf->msg.val) {
- t->aux->task_rt_dump.n_trace = lconf->msg.val;
-
if (task_base_get_original_rx_pkt_function(t) != rx_pkt_dummy) {
+ t->aux->task_rt_dump.n_trace = lconf->msg.val;
task_base_add_rx_pkt_function(t, rx_pkt_trace);
- if (t->tx_pkt == tx_pkt_l3) {
+ if ((t->tx_pkt == tx_pkt_l3) || (t->tx_pkt == tx_pkt_ndp)) {
if (t->aux->tx_pkt_orig)
t->aux->tx_pkt_l2 = t->aux->tx_pkt_orig;
t->aux->tx_pkt_orig = t->aux->tx_pkt_l2;
}
} else {
t->aux->task_rt_dump.n_print_tx = lconf->msg.val;
- if (t->tx_pkt == tx_pkt_l3) {
+ if ((t->tx_pkt == tx_pkt_l3) || (t->tx_pkt == tx_pkt_ndp)) {
if (t->aux->tx_pkt_orig)
t->aux->tx_pkt_l2 = t->aux->tx_pkt_orig;
t->aux->tx_pkt_orig = t->aux->tx_pkt_l2;
for (uint8_t task_id = 0; task_id < lconf->n_tasks_all; ++task_id) {
t = lconf->tasks_all[task_id];
- if (t->tx_pkt == tx_pkt_l3) {
+ if ((t->tx_pkt == tx_pkt_l3) || (t->tx_pkt == tx_pkt_ndp)) {
t->aux->tx_pkt_orig = t->aux->tx_pkt_l2;
t->aux->tx_pkt_l2 = tx_pkt_distr;
} else {
for (uint8_t task_id = 0; task_id < lconf->n_tasks_all; ++task_id) {
t = lconf->tasks_all[task_id];
if (t->aux->tx_pkt_orig) {
- if (t->tx_pkt == tx_pkt_l3) {
+ if ((t->tx_pkt == tx_pkt_l3) || (t->tx_pkt == tx_pkt_ndp)) {
t->aux->tx_pkt_l2 = t->aux->tx_pkt_orig;
t->aux->tx_pkt_orig = NULL;
} else {
for (uint8_t task_id = 0; task_id < lconf->n_tasks_all; ++task_id) {
t = lconf->tasks_all[task_id];
- if (t->tx_pkt == tx_pkt_l3) {
+ if ((t->tx_pkt == tx_pkt_l3) || (t->tx_pkt == tx_pkt_ndp)) {
t->aux->tx_pkt_orig = t->aux->tx_pkt_l2;
t->aux->tx_pkt_l2 = tx_pkt_bw;
} else {
for (uint8_t task_id = 0; task_id < lconf->n_tasks_all; ++task_id) {
t = lconf->tasks_all[task_id];
if (t->aux->tx_pkt_orig) {
- if (t->tx_pkt == tx_pkt_l3) {
+ if ((t->tx_pkt == tx_pkt_l3) || (t->tx_pkt == tx_pkt_ndp)) {
t->aux->tx_pkt_l2 = t->aux->tx_pkt_orig;
t->aux->tx_pkt_orig = NULL;
} else {