diff options
author | Kingwel Xie <kingwel.xie@ericsson.com> | 2019-01-25 05:18:51 -0500 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2019-02-05 15:02:53 +0000 |
commit | b8999b1070ce987dc168ac0776696cc9671132b4 (patch) | |
tree | 7c8769be21e5b69625f7c90cc64aaf00cc89521a | |
parent | 623eb5676689f6874716857a1085d0efd4974c4c (diff) |
crypto-input: fix broken buffer trace issue
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>
-rw-r--r-- | src/plugins/dpdk/ipsec/crypto_node.c | 53 |
1 files changed, 16 insertions, 37 deletions
diff --git a/src/plugins/dpdk/ipsec/crypto_node.c b/src/plugins/dpdk/ipsec/crypto_node.c index b9ed7af5ee3..6b57069ed22 100644 --- a/src/plugins/dpdk/ipsec/crypto_node.c +++ b/src/plugins/dpdk/ipsec/crypto_node.c @@ -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; |