crypto-input: fix crash bug
[vpp.git] / src / plugins / dpdk / ipsec / crypto_node.c
index a5f8d8e..3945973 100644 (file)
@@ -22,6 +22,7 @@
 #include <vnet/ethernet/ethernet.h>
 #include <vnet/ipsec/ipsec.h>
 
+#include <dpdk/buffer.h>
 #include <dpdk/device/dpdk.h>
 #include <dpdk/device/dpdk_priv.h>
 #include <dpdk/ipsec/ipsec.h>
@@ -90,7 +91,7 @@ format_dpdk_crypto_input_trace (u8 * s, va_list * args)
 }
 
 static_always_inline void
-dpdk_crypto_check_check_op (vlib_main_t * vm, vlib_node_runtime_t * node,
+dpdk_crypto_input_check_op (vlib_main_t * vm, vlib_node_runtime_t * node,
                            struct rte_crypto_op *op0, u16 * next)
 {
   if (PREDICT_FALSE (op0->status != RTE_CRYPTO_OP_STATUS_SUCCESS))
@@ -166,6 +167,10 @@ dpdk_crypto_dequeue (vlib_main_t * vm, vlib_node_runtime_t * node,
                                               res->qp_id + outbound,
                                               ops, VLIB_FRAME_SIZE);
 
+  /* no op dequeued, do not proceed */
+  if (n_deq == 0)
+    return 0;
+
   res->inflights[outbound] -= n_ops;
 
   dpdk_crypto_input_trace (vm, node, ops, n_deq);
@@ -183,14 +188,14 @@ dpdk_crypto_dequeue (vlib_main_t * vm, vlib_node_runtime_t * node,
          CLIB_PREFETCH (ops[6], CLIB_CACHE_LINE_BYTES, LOAD);
          CLIB_PREFETCH (ops[7], CLIB_CACHE_LINE_BYTES, LOAD);
 
-         CLIB_PREFETCH (crypto_op_get_priv (ops[4]), CLIB_CACHE_LINE_BYTES,
-                        LOAD);
-         CLIB_PREFETCH (crypto_op_get_priv (ops[5]), CLIB_CACHE_LINE_BYTES,
-                        LOAD);
-         CLIB_PREFETCH (crypto_op_get_priv (ops[6]), CLIB_CACHE_LINE_BYTES,
-                        LOAD);
-         CLIB_PREFETCH (crypto_op_get_priv (ops[7]), CLIB_CACHE_LINE_BYTES,
-                        LOAD);
+         CLIB_PREFETCH (crypto_op_get_priv (ops[4]),
+                        CLIB_CACHE_LINE_BYTES, LOAD);
+         CLIB_PREFETCH (crypto_op_get_priv (ops[5]),
+                        CLIB_CACHE_LINE_BYTES, LOAD);
+         CLIB_PREFETCH (crypto_op_get_priv (ops[6]),
+                        CLIB_CACHE_LINE_BYTES, LOAD);
+         CLIB_PREFETCH (crypto_op_get_priv (ops[7]),
+                        CLIB_CACHE_LINE_BYTES, LOAD);
        }
 
       op0 = ops[0];
@@ -203,10 +208,10 @@ dpdk_crypto_dequeue (vlib_main_t * vm, vlib_node_runtime_t * node,
       next[2] = crypto_op_get_priv (op2)->next;
       next[3] = crypto_op_get_priv (op3)->next;
 
-      dpdk_crypto_check_check_op (vm, node, op0, next + 0);
-      dpdk_crypto_check_check_op (vm, node, op0, next + 1);
-      dpdk_crypto_check_check_op (vm, node, op0, next + 2);
-      dpdk_crypto_check_check_op (vm, node, op0, next + 3);
+      dpdk_crypto_input_check_op (vm, node, op0, next + 0);
+      dpdk_crypto_input_check_op (vm, node, op1, next + 1);
+      dpdk_crypto_input_check_op (vm, node, op2, next + 2);
+      dpdk_crypto_input_check_op (vm, node, op3, next + 3);
 
       b0 = vlib_buffer_from_rte_mbuf (op0->sym[0].m_src);
       b1 = vlib_buffer_from_rte_mbuf (op1->sym[0].m_src);
@@ -238,7 +243,7 @@ dpdk_crypto_dequeue (vlib_main_t * vm, vlib_node_runtime_t * node,
 
       next[0] = crypto_op_get_priv (op0)->next;
 
-      dpdk_crypto_check_check_op (vm, node, op0, next + 0);
+      dpdk_crypto_input_check_op (vm, node, op0, next + 0);
 
       /* XXX store bi0 and next0 in op0 private? */
       b0 = vlib_buffer_from_rte_mbuf (op0->sym[0].m_src);