4440eb88dd
Use the Full context SA structures and command in IPsec fast path. For inline outbound, populate CPT instruction as per full context. Added new macros and functions with respect to full context. Populate WQE ptr in CPT instruction with proper offset from mbuf. Also add option to override outbound inline SA IV for debug Update mbuf length based on IP version in Rx post process purposes via environment variable. User can set env variable as: export ETH_SEC_IV_OVR="0x0, 0x0,..." Signed-off-by: Vidya Sagar Velumuri <vvelumuri@marvell.com> Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
286 lines
7.7 KiB
C
286 lines
7.7 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(C) 2022 Marvell.
|
|
*/
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <rte_telemetry.h>
|
|
|
|
#include <roc_api.h>
|
|
|
|
#include "cnxk_ethdev.h"
|
|
|
|
#define STR_MAXLEN 20
|
|
#define W0_MAXLEN 21
|
|
|
|
static int
|
|
copy_outb_sa_9k(struct rte_tel_data *d, uint32_t i, void *sa)
|
|
{
|
|
union {
|
|
struct roc_ie_on_sa_ctl ctl;
|
|
uint64_t u64;
|
|
} w0;
|
|
struct roc_ie_on_outb_sa *out_sa;
|
|
char strw0[W0_MAXLEN];
|
|
char str[STR_MAXLEN];
|
|
|
|
out_sa = (struct roc_ie_on_outb_sa *)sa;
|
|
w0.ctl = out_sa->common_sa.ctl;
|
|
|
|
snprintf(str, sizeof(str), "outsa_w0_%u", i);
|
|
snprintf(strw0, sizeof(strw0), "%" PRIu64, w0.u64);
|
|
rte_tel_data_add_dict_string(d, str, strw0);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
copy_inb_sa_9k(struct rte_tel_data *d, uint32_t i, void *sa)
|
|
{
|
|
union {
|
|
struct roc_ie_on_sa_ctl ctl;
|
|
uint64_t u64;
|
|
} w0;
|
|
struct roc_ie_on_inb_sa *in_sa;
|
|
char strw0[W0_MAXLEN];
|
|
char str[STR_MAXLEN];
|
|
|
|
in_sa = (struct roc_ie_on_inb_sa *)sa;
|
|
w0.ctl = in_sa->common_sa.ctl;
|
|
|
|
snprintf(str, sizeof(str), "insa_w0_%u", i);
|
|
snprintf(strw0, sizeof(strw0), "%" PRIu64, w0.u64);
|
|
rte_tel_data_add_dict_string(d, str, strw0);
|
|
|
|
snprintf(str, sizeof(str), "insa_esnh_%u", i);
|
|
rte_tel_data_add_dict_u64(d, str, in_sa->common_sa.seq_t.th);
|
|
|
|
snprintf(str, sizeof(str), "insa_esnl_%u", i);
|
|
rte_tel_data_add_dict_u64(d, str, in_sa->common_sa.seq_t.tl);
|
|
|
|
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)
|
|
{
|
|
struct cnxk_eth_sec_sess *eth_sec, *tvar;
|
|
struct rte_eth_dev *eth_dev;
|
|
struct cnxk_eth_dev *dev;
|
|
uint16_t port_id;
|
|
char *end_p;
|
|
uint32_t i;
|
|
int ret;
|
|
|
|
if (params == NULL || strlen(params) == 0 || !isdigit(*params))
|
|
return -EINVAL;
|
|
|
|
port_id = strtoul(params, &end_p, 0);
|
|
if (errno != 0)
|
|
return -EINVAL;
|
|
|
|
if (*end_p != '\0')
|
|
plt_err("Extra parameters passed to telemetry, ignoring it");
|
|
|
|
if (!rte_eth_dev_is_valid_port(port_id)) {
|
|
plt_err("Invalid port id %u", port_id);
|
|
return -EINVAL;
|
|
}
|
|
|
|
eth_dev = &rte_eth_devices[port_id];
|
|
if (!eth_dev) {
|
|
plt_err("Ethdev not available");
|
|
return -EINVAL;
|
|
}
|
|
|
|
dev = cnxk_eth_pmd_priv(eth_dev);
|
|
|
|
rte_tel_data_start_dict(d);
|
|
|
|
rte_tel_data_add_dict_int(d, "nb_outb_sa", dev->outb.nb_sess);
|
|
|
|
i = 0;
|
|
if (dev->tx_offloads & RTE_ETH_TX_OFFLOAD_SECURITY) {
|
|
tvar = NULL;
|
|
RTE_TAILQ_FOREACH_SAFE(eth_sec, &dev->outb.list, entry, tvar) {
|
|
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;
|
|
}
|
|
}
|
|
|
|
rte_tel_data_add_dict_int(d, "nb_inb_sa", dev->inb.nb_sess);
|
|
|
|
i = 0;
|
|
if (dev->rx_offloads & RTE_ETH_RX_OFFLOAD_SECURITY) {
|
|
tvar = NULL;
|
|
RTE_TAILQ_FOREACH_SAFE(eth_sec, &dev->inb.list, entry, tvar) {
|
|
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;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
RTE_INIT(cnxk_ipsec_init_telemetry)
|
|
{
|
|
rte_telemetry_register_cmd("/cnxk/ipsec/info",
|
|
ethdev_sec_tel_handle_info,
|
|
"Returns ipsec info. Parameters: port id");
|
|
}
|