summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Simonart <xavier.simonart@intel.com>2018-01-08 10:58:14 +0100
committerXavier Simonart <xavier.simonart@intel.com>2018-01-08 10:58:14 +0100
commit96b22a70386a9f8bde6a63eb383ebb7587fe4045 (patch)
tree7b7303e0c577e3a4f4030006eb9720589747fe38
parentdd77bd89e11d84d378167468db85fb4ef35a0c7a (diff)
Fix stacking of rx receive functions
PROX can stack different RX functions, so that they are executed after each other. This feature is for instance used to dump packets or to print distribution of receive packets, without influencing the performance of the rx functions when no dump or print is needed. The previous implementation was wrong and causing some of the stacked functions not to be executed. This was causing for instance issues in latency measurement after enabling dumping packets. Change-Id: I766b8ee8e8852fa17cdaf60ee6e1fec0dc98c719 Signed-off-by: Xavier Simonart <xavier.simonart@intel.com>
-rw-r--r--VNFs/DPPD-PROX/rx_pkt.c10
-rw-r--r--VNFs/DPPD-PROX/task_base.h11
2 files changed, 11 insertions, 10 deletions
diff --git a/VNFs/DPPD-PROX/rx_pkt.c b/VNFs/DPPD-PROX/rx_pkt.c
index ec698d9a..bd06b267 100644
--- a/VNFs/DPPD-PROX/rx_pkt.c
+++ b/VNFs/DPPD-PROX/rx_pkt.c
@@ -388,13 +388,9 @@ static uint16_t call_prev_rx_pkt(struct task_base *tbase, struct rte_mbuf ***mbu
{
uint16_t ret;
- if (tbase->aux->rx_prev_idx + 1 == tbase->aux->rx_prev_count) {
- ret = tbase->aux->rx_pkt_prev[tbase->aux->rx_prev_idx](tbase, mbufs);
- } else {
- tbase->aux->rx_prev_idx++;
- ret = tbase->aux->rx_pkt_prev[tbase->aux->rx_prev_idx](tbase, mbufs);
- tbase->aux->rx_prev_idx--;
- }
+ tbase->aux->rx_prev_idx++;
+ ret = tbase->aux->rx_pkt_prev[tbase->aux->rx_prev_idx - 1](tbase, mbufs);
+ tbase->aux->rx_prev_idx--;
return ret;
}
diff --git a/VNFs/DPPD-PROX/task_base.h b/VNFs/DPPD-PROX/task_base.h
index ad00962f..f8c05242 100644
--- a/VNFs/DPPD-PROX/task_base.h
+++ b/VNFs/DPPD-PROX/task_base.h
@@ -213,8 +213,8 @@ static void task_base_add_rx_pkt_function(struct task_base *tbase, rx_pkt_func t
return;
}
- for (int16_t i = tbase->aux->rx_prev_count; i >= 0; --i) {
- tbase->aux->rx_pkt_prev[i + 1] = tbase->aux->rx_pkt_prev[i];
+ for (int16_t i = tbase->aux->rx_prev_count; i > 0; --i) {
+ tbase->aux->rx_pkt_prev[i] = tbase->aux->rx_pkt_prev[i - 1];
}
tbase->aux->rx_pkt_prev[0] = tbase->rx_pkt;
tbase->rx_pkt = to_add;
@@ -226,8 +226,13 @@ static void task_base_del_rx_pkt_function(struct task_base *tbase, rx_pkt_func t
int cur = 0;
int found = 0;
- if (tbase->aux->rx_prev_count == 1) {
+ if (unlikely(tbase->aux->rx_prev_count == 0)) {
+ return;
+ } else if (tbase->rx_pkt == to_del) {
tbase->rx_pkt = tbase->aux->rx_pkt_prev[0];
+ for (int16_t i = 0; i < tbase->aux->rx_prev_count - 1; ++i) {
+ tbase->aux->rx_pkt_prev[i] = tbase->aux->rx_pkt_prev[i + 1];
+ }
found = 1;
} else {
for (int16_t i = 0; i < tbase->aux->rx_prev_count; ++i) {