crypto-input: fix broken buffer trace issue 79/17079/3
authorKingwel Xie <kingwel.xie@ericsson.com>
Fri, 25 Jan 2019 10:18:51 +0000 (05:18 -0500)
committerDave Barach <openvpp@barachs.net>
Tue, 5 Feb 2019 15:02:53 +0000 (15:02 +0000)
dpdk_crypto_input_trace was called before vlib_buffer_enqueue_to_next
then VLIB_FRAME_TRACE of next_frame->flag will be overwritten by
vlib_next_frame_change_ownership(), leading to a broken trace.

now it is working:

Packet 1

00:00:15:654983: dpdk-crypto-input
  dev_id 0 next-index 1
  00:00:15:654999: ip4-lookup
  fib 0 dpo-idx 0 flow hash: 0x00000000
  IPSEC_ESP: 18.1.0.71 -> 18.1.0.241
      tos 0x00, ttl 254, length 168, checksum 0x96ea
......

Change-Id: I73d77c06c11db8911866adb6240b2565b690f469
Signed-off-by: Kingwel Xie <kingwel.xie@ericsson.com>
src/plugins/dpdk/ipsec/crypto_node.c

index b9ed7af..6b57069 100644 (file)
@@ -50,34 +50,11 @@ extern vlib_node_registration_t dpdk_crypto_input_node;
 
 typedef struct
 {
-  u32 status;
+  /* dev id of this cryptodev */
+  u16 dev_id;
+  u16 next_index;
 } dpdk_crypto_input_trace_t;
 
-#define foreach_cryptodev_status \
-    _(SUCCESS, "success") \
-    _(NOT_PROCESSED, "not processed") \
-    _(AUTH_FAILED, "auth failed") \
-    _(INVALID_SESSION, "invalid session") \
-    _(INVALID_ARGS, "invalid arguments") \
-    _(ERROR, "error")
-
-static u8 *
-format_cryptodev_status (u8 * s, va_list * args)
-{
-  u32 status = va_arg (*args, u32);
-  char *str = 0;
-
-  switch (status)
-    {
-#define _(x, z) case RTE_CRYPTO_OP_STATUS_##x: str = z; break;
-      foreach_cryptodev_status
-#undef _
-    }
-  s = format (s, "%s", str);
-
-  return s;
-}
-
 static u8 *
 format_dpdk_crypto_input_trace (u8 * s, va_list * args)
 {
@@ -85,7 +62,7 @@ format_dpdk_crypto_input_trace (u8 * s, va_list * args)
   CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
   dpdk_crypto_input_trace_t *t = va_arg (*args, dpdk_crypto_input_trace_t *);
 
-  s = format (s, "status: %U", format_cryptodev_status, t->status);
+  s = format (s, "cryptodev-id %d next-index %d", t->dev_id, t->next_index);
 
   return s;
 }
@@ -110,9 +87,10 @@ dpdk_crypto_input_check_op (vlib_main_t * vm, vlib_node_runtime_t * node,
 
 always_inline void
 dpdk_crypto_input_trace (vlib_main_t * vm, vlib_node_runtime_t * node,
-                        struct rte_crypto_op **ops, u32 n_deq)
+                        u8 dev_id, u32 * bis, u16 * nexts, u32 n_deq)
 {
   u32 n_left, n_trace;
+
   if (PREDICT_FALSE ((n_trace = vlib_get_trace_count (vm, node))))
     {
       n_left = n_deq;
@@ -120,24 +98,25 @@ dpdk_crypto_input_trace (vlib_main_t * vm, vlib_node_runtime_t * node,
       while (n_trace && n_left)
        {
          vlib_buffer_t *b0;
-         struct rte_crypto_op *op0;
          u16 next;
+         u32 bi;
 
-         op0 = ops[0];
+         bi = bis[0];
+         next = nexts[0];
 
-         next = crypto_op_get_priv (op0)->next;
-
-         b0 = vlib_buffer_from_rte_mbuf (op0->sym[0].m_src);
+         b0 = vlib_get_buffer (vm, bi);
 
          vlib_trace_buffer (vm, node, next, b0, /* follow_chain */ 0);
 
          dpdk_crypto_input_trace_t *tr =
            vlib_add_trace (vm, node, b0, sizeof (*tr));
-         tr->status = op0->status;
+         tr->dev_id = dev_id;
+         tr->next_index = next;
 
          n_trace--;
          n_left--;
-         ops++;
+         nexts++;
+         bis++;
        }
       vlib_set_trace_count (vm, node, n_trace);
     }
@@ -173,8 +152,6 @@ dpdk_crypto_dequeue (vlib_main_t * vm, vlib_node_runtime_t * node,
 
   res->inflights -= n_ops;
 
-  dpdk_crypto_input_trace (vm, node, ops, n_deq);
-
   while (n_ops >= 4)
     {
       struct rte_crypto_op *op0, *op1, *op2, *op3;
@@ -263,6 +240,8 @@ dpdk_crypto_dequeue (vlib_main_t * vm, vlib_node_runtime_t * node,
 
   vlib_buffer_enqueue_to_next (vm, node, bis, nexts, n_deq);
 
+  dpdk_crypto_input_trace (vm, node, res->dev_id, bis, nexts, n_deq);
+
   crypto_free_ops (numa, cwm->ops, n_deq);
 
   return n_deq;