From 622ee0bf3594b11ca825f51177f60e59e79aa7b9 Mon Sep 17 00:00:00 2001 From: Ankur Dwivedi Date: Thu, 10 Feb 2022 12:23:34 +0530 Subject: [PATCH] net/cnxk: add inline IPsec telemetry for CN10K Adds telemetry function to get information about inline outbound and inline inbound SA's. The function takes port id as input. Some fields in the structures roc_ot_ipsec_outb_sa and roc_ot_ipsec_inb_sa are returned as output. Signed-off-by: Ankur Dwivedi Reviewed-by: Jerin Jacob --- drivers/net/cnxk/cnxk_ethdev_sec_telemetry.c | 156 ++++++++++++++++++- 1 file changed, 154 insertions(+), 2 deletions(-) diff --git a/drivers/net/cnxk/cnxk_ethdev_sec_telemetry.c b/drivers/net/cnxk/cnxk_ethdev_sec_telemetry.c index 83015e11e2..dfad5af8fe 100644 --- a/drivers/net/cnxk/cnxk_ethdev_sec_telemetry.c +++ b/drivers/net/cnxk/cnxk_ethdev_sec_telemetry.c @@ -71,6 +71,152 @@ copy_inb_sa_9k(struct rte_tel_data *d, uint32_t i, void *sa) return 0; } +static int +copy_outb_sa_10k(struct rte_tel_data *d, uint32_t i, void *sa) +{ + struct roc_ot_ipsec_outb_sa *out_sa; + struct rte_tel_data *outer_hdr; + char str[STR_MAXLEN]; + char s64[W0_MAXLEN]; + uint32_t j; + + out_sa = (struct roc_ot_ipsec_outb_sa *)sa; + + snprintf(str, sizeof(str), "outsa_w0_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, out_sa->w0.u64); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "outsa_w1_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, out_sa->w1.u64); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "outsa_w2_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, out_sa->w2.u64); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "outsa_w10_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, out_sa->w10.u64); + rte_tel_data_add_dict_string(d, str, s64); + + outer_hdr = rte_tel_data_alloc(); + if (!outer_hdr) { + plt_err("Could not allocate space for outer header"); + return -ENOMEM; + } + + rte_tel_data_start_array(outer_hdr, RTE_TEL_U64_VAL); + + for (j = 0; j < RTE_DIM(out_sa->outer_hdr.ipv6.src_addr); j++) + rte_tel_data_add_array_u64(outer_hdr, + out_sa->outer_hdr.ipv6.src_addr[j]); + + for (j = 0; j < RTE_DIM(out_sa->outer_hdr.ipv6.dst_addr); j++) + rte_tel_data_add_array_u64(outer_hdr, + out_sa->outer_hdr.ipv6.dst_addr[j]); + + snprintf(str, sizeof(str), "outsa_outer_hdr_%u", i); + rte_tel_data_add_dict_container(d, str, outer_hdr, 0); + + snprintf(str, sizeof(str), "outsa_errctl_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, out_sa->ctx.err_ctl.u64); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "outsa_esnval_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, out_sa->ctx.esn_val); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "outsa_hl_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, out_sa->ctx.hard_life); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "outsa_sl_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, out_sa->ctx.soft_life); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "outsa_octs_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, out_sa->ctx.mib_octs); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "outsa_pkts_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, out_sa->ctx.mib_pkts); + rte_tel_data_add_dict_string(d, str, s64); + + return 0; +} + +static int +copy_inb_sa_10k(struct rte_tel_data *d, uint32_t i, void *sa) +{ + struct roc_ot_ipsec_inb_sa *in_sa; + struct rte_tel_data *outer_hdr; + char str[STR_MAXLEN]; + char s64[W0_MAXLEN]; + uint32_t j; + + in_sa = (struct roc_ot_ipsec_inb_sa *)sa; + + snprintf(str, sizeof(str), "insa_w0_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, in_sa->w0.u64); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "insa_w1_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, in_sa->w1.u64); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "insa_w2_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, in_sa->w2.u64); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "insa_w10_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, in_sa->w10.u64); + rte_tel_data_add_dict_string(d, str, s64); + + outer_hdr = rte_tel_data_alloc(); + if (!outer_hdr) { + plt_err("Could not allocate space for outer header"); + return -ENOMEM; + } + + rte_tel_data_start_array(outer_hdr, RTE_TEL_U64_VAL); + + for (j = 0; j < RTE_DIM(in_sa->outer_hdr.ipv6.src_addr); j++) + rte_tel_data_add_array_u64(outer_hdr, + in_sa->outer_hdr.ipv6.src_addr[j]); + + for (j = 0; j < RTE_DIM(in_sa->outer_hdr.ipv6.dst_addr); j++) + rte_tel_data_add_array_u64(outer_hdr, + in_sa->outer_hdr.ipv6.dst_addr[j]); + + snprintf(str, sizeof(str), "insa_outer_hdr_%u", i); + rte_tel_data_add_dict_container(d, str, outer_hdr, 0); + + snprintf(str, sizeof(str), "insa_arbase_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, in_sa->ctx.ar_base); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "insa_ar_validm_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, in_sa->ctx.ar_valid_mask); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "insa_hl_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, in_sa->ctx.hard_life); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "insa_sl_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, in_sa->ctx.soft_life); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "insa_octs_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, in_sa->ctx.mib_octs); + rte_tel_data_add_dict_string(d, str, s64); + + snprintf(str, sizeof(str), "insa_pkts_%u", i); + snprintf(s64, sizeof(s64), "%" PRIu64, in_sa->ctx.mib_pkts); + rte_tel_data_add_dict_string(d, str, s64); + + return 0; +} + static int ethdev_sec_tel_handle_info(const char *cmd __rte_unused, const char *params, struct rte_tel_data *d) @@ -111,7 +257,10 @@ ethdev_sec_tel_handle_info(const char *cmd __rte_unused, const char *params, if (dev->tx_offloads & RTE_ETH_TX_OFFLOAD_SECURITY) { tvar = NULL; RTE_TAILQ_FOREACH_SAFE(eth_sec, &dev->outb.list, entry, tvar) { - ret = copy_outb_sa_9k(d, i++, eth_sec->sa); + if (roc_model_is_cn10k()) + ret = copy_outb_sa_10k(d, i++, eth_sec->sa); + else + ret = copy_outb_sa_9k(d, i++, eth_sec->sa); if (ret < 0) return ret; } @@ -123,7 +272,10 @@ ethdev_sec_tel_handle_info(const char *cmd __rte_unused, const char *params, if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_SECURITY) { tvar = NULL; RTE_TAILQ_FOREACH_SAFE(eth_sec, &dev->inb.list, entry, tvar) { - ret = copy_inb_sa_9k(d, i++, eth_sec->sa); + if (roc_model_is_cn10k()) + ret = copy_inb_sa_10k(d, i++, eth_sec->sa); + else + ret = copy_inb_sa_9k(d, i++, eth_sec->sa); if (ret < 0) return ret; } -- 2.39.5