#include <rte_ether.h>
#include "cperf_options.h"
+#include "cperf_test_vectors.h"
#define AES_BLOCK_SIZE 16
#define DES_BLOCK_SIZE 8
" --pmd-cyclecount-delay-ms N: set delay between enqueue\n"
" and dequeue in pmd-cyclecount benchmarking mode\n"
" --csv-friendly: enable test result output CSV friendly\n"
+ " --modex-len N: modex length, supported lengths are "
+ "60, 128, 255, 448. Default: 128\n"
#ifdef RTE_LIB_SECURITY
" --pdcp-sn-sz N: set PDCP SN size N <5/7/12/15/18>\n"
" --pdcp-domain DOMAIN: set PDCP domain <control/user>\n"
return ret;
}
+static int
+parse_modex_len(struct cperf_options *opts, const char *arg)
+{
+ int ret = parse_uint16_t(&opts->modex_len, arg);
+
+ if (ret)
+ RTE_LOG(ERR, USER1, "failed to parse modex len");
+ return ret;
+}
+
static int
parse_burst_sz(struct cperf_options *opts, const char *arg)
{
{
cperf_op_type_strs[CPERF_DOCSIS],
CPERF_DOCSIS
+ },
+ {
+ cperf_op_type_strs[CPERF_IPSEC],
+ CPERF_IPSEC
+ },
+ {
+ cperf_op_type_strs[CPERF_ASYM_MODEX],
+ CPERF_ASYM_MODEX
}
};
{
char *test_name = (char *) rte_zmalloc(NULL,
sizeof(char) * (strlen(arg) + 3), 0);
+ if (test_name == NULL) {
+ RTE_LOG(ERR, USER1, "Failed to rte zmalloc with size: %zu\n",
+ strlen(arg) + 3);
+ return -1;
+ }
+
snprintf(test_name, strlen(arg) + 3, "[%s]", arg);
opts->test_name = test_name;
const char *cperf_pdcp_domain_strs[] = {
[RTE_SECURITY_PDCP_MODE_CONTROL] = "control",
- [RTE_SECURITY_PDCP_MODE_DATA] = "data"
+ [RTE_SECURITY_PDCP_MODE_DATA] = "data",
+ [RTE_SECURITY_PDCP_MODE_SHORT_MAC] = "short_mac"
};
static int
cperf_pdcp_domain_strs
[RTE_SECURITY_PDCP_MODE_DATA],
RTE_SECURITY_PDCP_MODE_DATA
+ },
+ {
+ cperf_pdcp_domain_strs
+ [RTE_SECURITY_PDCP_MODE_SHORT_MAC],
+ RTE_SECURITY_PDCP_MODE_SHORT_MAC
}
};
static struct option lgopts[] = {
{ CPERF_PTEST_TYPE, required_argument, 0, 0 },
+ { CPERF_MODEX_LEN, required_argument, 0, 0 },
{ CPERF_POOL_SIZE, required_argument, 0, 0 },
{ CPERF_TOTAL_OPS, required_argument, 0, 0 },
opts->pdcp_ses_hfn_en = 0;
opts->docsis_hdr_sz = 17;
#endif
+ opts->modex_data = (struct cperf_modex_test_data *)&modex_perf_data[0];
}
static int
{
struct long_opt_parser parsermap[] = {
{ CPERF_PTEST_TYPE, parse_cperf_test_type },
+ { CPERF_MODEX_LEN, parse_modex_len },
{ CPERF_SILENT, parse_silent },
{ CPERF_POOL_SIZE, parse_pool_sz },
{ CPERF_TOTAL_OPS, parse_total_ops },
int
cperf_options_check(struct cperf_options *options)
{
+ int i;
+
if (options->op_type == CPERF_CIPHER_ONLY ||
options->op_type == CPERF_DOCSIS)
options->digest_sz = 0;
* If segment size is not set, assume only one segment,
* big enough to contain the largest buffer and the digest
*/
- if (options->segment_sz == 0)
+ if (options->segment_sz == 0) {
options->segment_sz = options->max_buffer_size +
options->digest_sz;
+ /* In IPsec operation, packet length will be increased
+ * by some bytes depend upon the algorithm, so increasing
+ * the segment size by headroom to cover most of
+ * the scenarios.
+ */
+ if (options->op_type == CPERF_IPSEC)
+ options->segment_sz += RTE_PKTMBUF_HEADROOM;
+ }
if (options->segment_sz < options->digest_sz) {
RTE_LOG(ERR, USER1,
return -EINVAL;
}
+ if (options->modex_len) {
+ if (options->op_type != CPERF_ASYM_MODEX) {
+ RTE_LOG(ERR, USER1, "Option modex len should be used only with "
+ " optype: modex.\n");
+ return -EINVAL;
+ }
+
+ for (i = 0; i < (int)RTE_DIM(modex_perf_data); i++) {
+ if (modex_perf_data[i].modulus.len ==
+ options->modex_len) {
+ options->modex_data =
+ (struct cperf_modex_test_data
+ *)&modex_perf_data[i];
+ break;
+ }
+ }
+ if (i == (int)RTE_DIM(modex_perf_data)) {
+ RTE_LOG(ERR, USER1,
+ "Option modex len: %d is not supported\n",
+ options->modex_len);
+ return -EINVAL;
+ }
+ }
+
#ifdef RTE_LIB_SECURITY
if (options->op_type == CPERF_DOCSIS) {
if (check_docsis_buffer_length(options) < 0)