Files
m241Neelima/components/ip_net2-6.9/ipmacsec/src/ipmacsec_cmd.c
T
2026-07-30 11:19:44 +05:30

4645 lines
148 KiB
C

/* ipmacsec_cmd.c - MACsec Commands implementation */
/*
* Copyright (c) 2010 Wind River Systems, Inc.
*
* The right to copy, distribute, modify, or otherwise make use
* of this software may be licensed only pursuant to the terms
* of an applicable Wind River license agreement.
*
*/
/*
modification history
--------------------
01a,17may10,mry Created
*/
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
*/
/* Implementation of the MACsec shell commands.
*/
/*
****************************************************************************
* 2 INCLUDE FILES
****************************************************************************
*/
#define IPCOM_USE_CLIB_PROTO
#include <ipcom_type.h>
#include <ipcom_cstyle.h>
#include <ipcom_clib.h>
#include <ipcom_err.h>
#include <ipcom_sock.h>
#include <ipcom_syslog.h>
#include <ipcom_sysvar.h>
#include <ipcom_errno.h>
#include <ipcom_err.h>
#include <ipcom_os.h>
#include <ipcom_ipd.h>
#include <ipcom_os.h>
#include <ipcom_shell.h>
#include <ipnet_eth.h>
#include <ipcom_mib2.h>
#include "ipmacsec_debug.h"
#include "ipmacsec_sysvar.h"
#include "ipmacsec.h"
#include "ipmacsec_lmi.h"
#ifdef IPCOM_USE_KEY_DB
#include "ipcom_key_db.h"
#endif
/*
****************************************************************************
* 3 CONFIGURATION
****************************************************************************
*/
#include "ipmacsec_config.h"
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
#define IPMACSEC_CMD_DISPLAY_OFFSET " "
#define IPMACSEC_CMD_HELP_DISPLAY_OFFSET " "
#define IPMACSEC_CMD_SECY_ARG_DISPLAY_OFFSET " "
#define IPMACSEC_CMD_SECY_HELP_DISPLAY_OFFSET " "
#define IPMACSEC_CMD_USAGE_NOHELP IP_FALSE
#define IPMACSEC_CMD_USAGE_HELP IP_TRUE
#define IPMACSEC_CMD_SECY_NO_QUALIFIER IP_NULL
#define IPMACSEC_CMD_SECY_NO_ARGS IP_NULL
#define IPMACSEC_CMD_SECY_NO_ALT IP_NULL
#define IPMACSEC_CMD_SECY_NO_VAL IP_NULL
#define IPMACSEC_CMD_SECY_NO_HELP IP_NULL
#define IPMACSEC_CMD_SECY_ARG_OPTIONAL IP_TRUE
#define IPMACSEC_CMD_SECY_ARG_MANDATORY IP_FALSE
#define IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED 0xffffffffUL
#define IPMACSEC_CMD_SECY_ARG_VAL_ONOFF "on(1)|off(0)"
#define IPMACSEC_CMD_SECY_NOTE_EXEC_ON_DISABLED_ONLY "This operation is only allowed when SecY is disabled"
#define IPMACSEC_CMD_SECY_NOTE_EXCLUDE_STATS "Use this option to exclude statistics from the output"
#define IPMACSEC_CMD_SECY_NOTE_KEYID_SYNTAX "Valid keyid syntax is 1 to 16 characters representing hex digits"
#define IPMACSEC_CMD_SECY_AN_HELP "AN must be a value < maxRxKeys"
#define IPMACSEC_CMD_SECY_SA_REFID_HELP "If a reference Id is not specified, a value of 0 is used"
#define IPMACSEC_CMD_SECY_SA_PN_HELP "PN is a decimal or hex value from 1 to 2^32-1 (0xffffffff)"
#define IPMACSEC_CMD_SECY_NOTE_CIPHERID_SYNTAX "MUST be of the format XX-XX-XX-XX-XX-XX-XX-XX, where X is a hex digit"
#define IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX \
"Valid SCI formats:" "\n" \
" XX-YY-ZZ-WW-UU-VV-PP-QQ" "\n" \
" XX:YY:ZZ:WW:UU:VV:PP:QQ" "\n" \
" XXYYZZWWUUVVPPQQ" "\n" \
" where X, Y, Z, W, U, V, P and Q are characters representing hex digits"
#define IPMACSEC_CMD_SECY_SYNOPSIS "<if_name> [<qualifier>] <cmd> [help]|[<arg> [<val>] ...]"
#define IPMACSEC_CMD_SECY_ARG_FOUND(pargs,argid) ((pargs)->argfound[(argid)])
#define IPMACSEC_CMD_SECY_ARG_VAL(pargs,argid) \
((IPMACSEC_CMD_SECY_ARG_FOUND((pargs),(argid))) ? (pargs)->argval[(argid)] : IP_NULL)
/* Use this macro instead of ipmacsec_cmd_secy_usage_cmd() when you want to include individual argument help for the command */
#define IPMACSEC_CMD_SECY_USAGE_CMD(cmd_index, help) ipmacsec_cmd_secy_usage_cmd(cmd_index, help, IP_TRUE)
/* Use this macro instead of ip_assert(secy_cmd) to avoid unused variable warnings when IP_DEBUG is not defined */
#ifdef IP_DEBUG
#define IPMACSEC_SECYCMD_VERIFY(secy_cmd) ip_assert(secy_cmd)
#else
#define IPMACSEC_SECYCMD_VERIFY(secy_cmd) (void)(secy_cmd)
#endif
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
typedef Ip_err (*Ipmacsec_cmd_fn)(int argc, char** argv, Ip_u32 cmd_index);
/* MACsec SecY argument identifiers used in parsing logic */
typedef enum {
IPMACSEC_CMD_SECY_ARG_NONE = 0,
IPMACSEC_CMD_SECY_ARG_NO_STATS,
IPMACSEC_CMD_SECY_ARG_PROTECT_FRAMES,
IPMACSEC_CMD_SECY_ARG_ALWAYS_INCLUDE_SCI,
IPMACSEC_CMD_SECY_ARG_USE_ES,
IPMACSEC_CMD_SECY_ARG_USE_SCB,
IPMACSEC_CMD_SECY_ARG_VALIDATE_FRAMES,
IPMACSEC_CMD_SECY_ARG_REPLAY_PROTECT,
IPMACSEC_CMD_SECY_ARG_REPLAY_WINDOW,
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY_OFFSET,
IPMACSEC_CMD_SECY_ARG_PN_THRESHOLD,
IPMACSEC_CMD_SECY_ARG_INFO_NOTIFY,
IPMACSEC_CMD_SECY_ARG_TIMEOUT,
IPMACSEC_CMD_SECY_ARG_EXIT_ON_ERROR,
IPMACSEC_CMD_SECY_ARG_PID,
IPMACSEC_CMD_SECY_ARG_MAX_RX_SCS,
IPMACSEC_CMD_SECY_ARG_MAX_RX_KEYS,
IPMACSEC_CMD_SECY_ARG_MAX_TX_KEYS,
IPMACSEC_CMD_SECY_ARG_NUM_CREATED_RX_SCS,
IPMACSEC_CMD_SECY_ARG_NUM_ACTIVE_RX_SCS,
IPMACSEC_CMD_SECY_ARG_KEYID,
IPMACSEC_CMD_SECY_ARG_TX,
IPMACSEC_CMD_SECY_ARG_RX,
IPMACSEC_CMD_SECY_ARG_KEYSIZE,
IPMACSEC_CMD_SECY_ARG_KEYVAL,
IPMACSEC_CMD_SECY_ARG_SKDBKEY,
IPMACSEC_CMD_SECY_ARG_CP_ENABLED,
IPMACSEC_CMD_SECY_ARG_CP_MAC_ENABLED,
IPMACSEC_CMD_SECY_ARG_CP_MAC_OPER,
IPMACSEC_CMD_SECY_ARG_CP_ADMIN_PTP_MAC,
IPMACSEC_CMD_SECY_ARG_CP_OPER_PTP_MAC,
IPMACSEC_CMD_SECY_ARG_IDENTIFIER,
IPMACSEC_CMD_SECY_ARG_INDEX,
IPMACSEC_CMD_SECY_ARG_DETAILS,
IPMACSEC_CMD_SECY_ARG_AN,
IPMACSEC_CMD_SECY_ARG_REF_ID,
IPMACSEC_CMD_SECY_ARG_NEXTPN,
IPMACSEC_CMD_SECY_ARG_LOWESTPN,
IPMACSEC_CMD_SECY_ARG_ENABLE,
IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY,
__IPMACSEC_CMD_SECY_ARG_MAX /* Keep last */
} Ipmacsec_cmd_secy_arg_id;
/* This structure is populated with the argument values parsed from the command line.
* For each argument that is found on the command line, the "argfound" at the corresponding
* Ipmacsec_cmd_secy_arg_id index will be set and if that argument has a corresponding value
* associated with it, then the corresponding "argval" at the same index will point to that argv
* "nargs" will contain the total number of parsed args.
*/
typedef struct Ipmacsec_cmd_secy_parsed_args_st {
char *argval[__IPMACSEC_CMD_SECY_ARG_MAX];
Ip_bool argfound[__IPMACSEC_CMD_SECY_ARG_MAX];
Ip_u32 nargs;
} Ipmacsec_cmd_secy_parsed_args;
typedef Ip_err (*Ipmacsec_cmd_secy_fn)(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
/* MACsec SecY arguments */
typedef struct Ipmacsec_cmd_secy_args_st {
IP_CONST Ipmacsec_cmd_secy_arg_id id; /* Argument Identifier */
IP_CONST Ip_bool optional; /* Whether the argument is optional */
IP_CONST char *name; /* complete argument name */
IP_CONST char *alt; /* alternate argument name/switch */
IP_CONST char *val; /* Acceptable value for argument (if any) */
IP_CONST char *help; /* Argument specific help */
IP_CONST char *ind_help; /* Argument specific help used only on idividual command help */
} Ipmacsec_cmd_secy_args;
/* MACsec top level Commands */
typedef struct Ipmacsec_cmd_st {
IP_CONST char *cmd; /* mandatory */
IP_CONST char *args; /* optional */
IP_CONST char *help; /* optional */
Ipmacsec_cmd_fn func; /* mandatory */
} Ipmacsec_cmd;
/* MACsec SecY Commands */
typedef struct Ipmacsec_secy_cmd_st {
IP_CONST char *qualifier; /* optional */
IP_CONST char *alt_qualifier; /* optional */
IP_CONST char *cmd; /* mandatory */
IP_CONST Ipmacsec_cmd_secy_args *args; /* optional */
IP_CONST Ip_u32 min_args; /* Mainly used when a cmd has only optional arg and a minimum number (e.g. 1 out of 2) is mandatory */
IP_CONST Ip_u32 max_args; /* Mainly used when no more than a certain number of args is allows (e.g. 1) */
IP_CONST char *help; /* optional */
Ipmacsec_cmd_secy_fn func; /* mandatory */
} Ipmacsec_secy_cmd;
/*
****************************************************************************
* 6 EXTERN PROTOTYPES
****************************************************************************
*/
/*
****************************************************************************
* 7 LOCAL PROTOTYPES
****************************************************************************
*/
IP_GLOBAL Ip_err ipmacsec_cmd_init(void);
IP_GLOBAL Ipmacsec_lmi_error ipmacsec_cmd_macsec(int argc, char** argv);
IP_STATIC void ipmacsec_cmd_macsec_usage_cmd(Ip_u32 cmd_index, Ip_bool help);
IP_STATIC void ipmacsec_cmd_macsec_usage(Ip_bool help);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_help(int argc, char** argv, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_version(int argc, char** argv, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy(int argc, char** argv, Ip_u32 cmd_index);
IP_STATIC void ipmacsec_cmd_secy_usage_cmd(Ip_u32 cmd_index, Ip_bool help, Ip_bool ind_help);
IP_STATIC void ipmacsec_cmd_secy_usage(Ip_bool help);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_help(int argc, char** argv, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_exec(IPMACSEC_LMI_HANDLE lh,
char *ifname, int argc, char** argv);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_parse_and_verify_args(int argc, char** argv,
Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_enable(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_disable(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_status(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_dump(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_reset_stats(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_set(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_get(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_sak_install(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_sak_remove(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_sak_purge(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_sak_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_sak_list(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sc_create(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sc_delete(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sc_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_create(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_delete(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_enable(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_disable(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_list(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sc_create(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sc_delete(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sc_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sc_list(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sa_create(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sa_delete(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sa_control(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sa_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sa_list(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_monitor_start(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_monitor_exit(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cipher_set(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cipher_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cipher_list(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cipher_resolve(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cp_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cp_set(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cp_get(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_parse_onoff(char *argv, Ip_bool *boolval);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_parse_u32(char *argv, Ip_u32 *u32val);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_parse_u16(char *argv, Ip_u16 *u16val);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_parse_u8(char *argv, Ip_u8 *u16val);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_parse_validateFrames(char *argv,
Ipmacsec_validateFrames_type *validateFrames);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_parse_cipher_suite_id(char *argv,
Ip_u8 *cipher_suite_id);
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_parse_key_id(char *argv,
Ipmacsec_secy_key_id *key_id);
IP_STATIC Ip_u8* ipmacsec_cmd_parse_key_material(char *argval, Ip_u32 key_size);
#ifdef IPCOM_USE_KEY_DB
IP_STATIC Ip_u8* ipmacsec_cmd_skdb_get_key_material(char *skdb_keyid, Ip_u32 key_size);
#endif
/*
*
****************************************************************************
* 8 DATA
****************************************************************************
*/
/*
* =========================
* MACsec Top level Commands
* =========================
*/
IP_STATIC IP_CONST Ipmacsec_cmd ipmacsec_supported_cmds[] = {
{"help", IP_NULL, "MACsec command help",
ipmacsec_cmd_help},
{"secy", "help", "MACsec SecY command help",
ipmacsec_cmd_secy},
{"secy", IPMACSEC_CMD_SECY_SYNOPSIS, "MACsec SecY commands",
ipmacsec_cmd_secy},
{"version", IP_NULL, "MACsec protocol version",
ipmacsec_cmd_version}
};
IP_STATIC IP_CONST Ip_u32 ipmacsec_num_cmds = sizeof(ipmacsec_supported_cmds)/sizeof(ipmacsec_supported_cmds[0]);
IP_STATIC IP_CONST char *ipmacsec_cmd_synopsis = "macsec <command> [<arguments> ...]";
IP_STATIC IP_CONST char *ipmacsec_cmd_description = "MACsec commands";
/*
* =============================
* MACsec SecY Command Arguments
* =============================
*/
/* SecY dump command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_dump_args[] = {
{
IPMACSEC_CMD_SECY_ARG_NO_STATS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nostats",
"-ns",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NOTE_EXCLUDE_STATS,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY set command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_set_args[] = {
{
IPMACSEC_CMD_SECY_ARG_PROTECT_FRAMES,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"protectFrames",
"-pf",
IPMACSEC_CMD_SECY_ARG_VAL_ONOFF,
IPMACSEC_CMD_SECY_NOTE_EXEC_ON_DISABLED_ONLY,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_ALWAYS_INCLUDE_SCI,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"alwaysIncludeSCI",
"-ai",
IPMACSEC_CMD_SECY_ARG_VAL_ONOFF,
IPMACSEC_CMD_SECY_NOTE_EXEC_ON_DISABLED_ONLY,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_USE_ES,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"useES",
"-ue",
IPMACSEC_CMD_SECY_ARG_VAL_ONOFF,
IPMACSEC_CMD_SECY_NOTE_EXEC_ON_DISABLED_ONLY,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_USE_SCB,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"useSCB",
"-us",
IPMACSEC_CMD_SECY_ARG_VAL_ONOFF,
IPMACSEC_CMD_SECY_NOTE_EXEC_ON_DISABLED_ONLY,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_VALIDATE_FRAMES,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"validateFrames",
"-vf",
"d(disabled)|c(check)|s(strict)",
IPMACSEC_CMD_SECY_NOTE_EXEC_ON_DISABLED_ONLY,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REPLAY_PROTECT,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"replayProtect",
"-rp",
IPMACSEC_CMD_SECY_ARG_VAL_ONOFF,
IPMACSEC_CMD_SECY_NOTE_EXEC_ON_DISABLED_ONLY,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REPLAY_WINDOW,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"replayWindow",
"-rw",
"<window_size>",
IPMACSEC_CMD_SECY_NOTE_EXEC_ON_DISABLED_ONLY,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"tx_sci",
"-sci",
"<sci>",
IPMACSEC_CMD_SECY_NOTE_EXEC_ON_DISABLED_ONLY,
IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX
},
{
IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY_OFFSET,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"confidentialityOffset",
"-co",
"0|30|50",
IPMACSEC_CMD_SECY_NOTE_EXEC_ON_DISABLED_ONLY,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_PN_THRESHOLD,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"pn_threshold",
"-pt",
"<threshold>",
"<threshold> is a decimal or hex value from 1 to 2^32-1 (0xffffffff)",
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_INFO_NOTIFY,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"info_notify",
"-in",
IPMACSEC_CMD_SECY_ARG_VAL_ONOFF,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY get command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_get_args[] = {
{
IPMACSEC_CMD_SECY_ARG_PROTECT_FRAMES,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"protectFrames",
"-pf",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_ALWAYS_INCLUDE_SCI,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"alwaysIncludeSCI",
"-ai",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_USE_ES,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"useES",
"-ue",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_USE_SCB,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"useSCB",
"-us",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_VALIDATE_FRAMES,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"validateFrames",
"-vf",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REPLAY_PROTECT,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"replayProtect",
"-rp",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REPLAY_WINDOW,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"replayWindow",
"-rw",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"tx_sci",
"-sci",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY_OFFSET,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"confidentialityOffset",
"-co",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_PN_THRESHOLD,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"pn_threshold",
"-pt",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_INFO_NOTIFY,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"info_notify",
"-in",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_MAX_RX_SCS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"maxRxSCs",
"-rs",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_MAX_RX_KEYS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"maxRxKeys",
"-rk",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_MAX_TX_KEYS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"maxTxKeys",
"-tk",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_NUM_CREATED_RX_SCS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"numCreatedRxSCs",
"-cr",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_NUM_ACTIVE_RX_SCS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"numActiveRxSCs",
"-ar",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY cipher_suite set command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_cipher_set_args[] = {
{
IPMACSEC_CMD_SECY_ARG_IDENTIFIER,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"identifier",
"-id",
"<cipher_suite_identifier>",
IPMACSEC_CMD_SECY_NOTE_CIPHERID_SYNTAX,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_INDEX,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"index",
"-i",
"<cipher_suite_index>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY cipher_suite print command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_cipher_print_args[] = {
{
IPMACSEC_CMD_SECY_ARG_DETAILS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"details",
"-d",
IPMACSEC_CMD_SECY_NO_VAL,
"If this option is specified, cipher suite details are also displayed",
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY cipher_suite list command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_cipher_list_args[] = {
{
IPMACSEC_CMD_SECY_ARG_DETAILS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"details",
"-d",
IPMACSEC_CMD_SECY_NO_VAL,
"If this option is specified, cipher suite details are also displayed",
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY cipher_suite resolve command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_cipher_resolve_args[] = {
{
IPMACSEC_CMD_SECY_ARG_IDENTIFIER,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"identifier",
"-id",
"<cipher_suite_identifier>",
IPMACSEC_CMD_SECY_NOTE_CIPHERID_SYNTAX,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_INDEX,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"index",
"-i",
"<cipher_suite_index>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY Controlled_Port set command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_cp_set_args[] = {
{
IPMACSEC_CMD_SECY_ARG_CP_ENABLED,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"ControlledPortEnabled",
"-cpe",
IPMACSEC_CMD_SECY_ARG_VAL_ONOFF,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_CP_ADMIN_PTP_MAC,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"adminPointToPointMAC",
"-aptp",
IPMACSEC_CMD_SECY_ARG_VAL_ONOFF "|auto(a)",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY Controlled_Port get command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_cp_get_args[] = {
{
IPMACSEC_CMD_SECY_ARG_CP_ENABLED,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"ControlledPortEnabled",
"-cpe",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_CP_MAC_ENABLED,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"MAC_Enabled",
"-me",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_CP_MAC_OPER,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"MAC_Operational",
"-mo",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_CP_ADMIN_PTP_MAC,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"adminPointToPointMAC",
"-aptp",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_CP_OPER_PTP_MAC,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"operPointToPointMAC",
"-optp",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY Controlled_Port print command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_cp_print_args[] = {
{
IPMACSEC_CMD_SECY_ARG_NO_STATS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nostats",
"-ns",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NOTE_EXCLUDE_STATS,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY SAK install command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_sak_install_args[] = {
{
IPMACSEC_CMD_SECY_ARG_KEYID,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"keyid",
"-id",
"<key_id>",
IPMACSEC_CMD_SECY_NOTE_KEYID_SYNTAX,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_TX,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"transmits",
"-tx",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_RX,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"receives",
"-rx",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_KEYSIZE,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"keysize",
"-s",
"<key_octets>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_KEYVAL,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"key",
"-k",
"<key_material>",
"MUST be exactly 2 x <key_octets> characters representing key hex digits",
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_SKDBKEY,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"skdb_key",
"-skdb",
"<skdb_key_identifier>",
"MUST be the identifier of a valid key in the Secure Key DB",
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY SAK remove command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_sak_remove_args[] = {
{
IPMACSEC_CMD_SECY_ARG_KEYID,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"keyid",
"-id",
"<key_id>",
IPMACSEC_CMD_SECY_NOTE_KEYID_SYNTAX,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY SAK print command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_sak_print_args[] = {
{
IPMACSEC_CMD_SECY_ARG_KEYID,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"keyid",
"-id",
"<key_id>",
IPMACSEC_CMD_SECY_NOTE_KEYID_SYNTAX,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY tx_sc create command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_tx_sc_create_args[] = {
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"sci",
"-sci",
"<sci>",
"If not specified, the configured tx_sci value or a default value is used",
IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY tx_sc print command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_tx_sc_print_args[] = {
{
IPMACSEC_CMD_SECY_ARG_NO_STATS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nostats",
"-ns",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NOTE_EXCLUDE_STATS,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY tx_sa create command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_tx_sa_create_args[] = {
{
IPMACSEC_CMD_SECY_ARG_AN,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"association_number",
"-an",
"<an>",
IPMACSEC_CMD_SECY_AN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REF_ID,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"reference",
"-r",
"<rerefence_id>",
IPMACSEC_CMD_SECY_SA_REFID_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_KEYID,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"keyid",
"-k",
"<key_id>",
IPMACSEC_CMD_SECY_NOTE_KEYID_SYNTAX,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_NEXTPN,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nextPN",
"-n",
"<PN>",
IPMACSEC_CMD_SECY_SA_PN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"confidentiality",
"-c",
IPMACSEC_CMD_SECY_ARG_VAL_ONOFF,
"If not specified, the default SecY value is used",
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY tx_sa delete command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_tx_sa_delete_args[] = {
{
IPMACSEC_CMD_SECY_ARG_AN,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"association_number",
"-an",
"<an>",
IPMACSEC_CMD_SECY_AN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REF_ID,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"reference",
"-r",
"<rerefence_id>",
IPMACSEC_CMD_SECY_SA_REFID_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY tx_sa enable command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_tx_sa_enable_args[] = {
{
IPMACSEC_CMD_SECY_ARG_AN,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"association_number",
"-an",
"<an>",
IPMACSEC_CMD_SECY_AN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REF_ID,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"reference",
"-r",
"<rerefence_id>",
IPMACSEC_CMD_SECY_SA_REFID_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY tx_sa disable command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_tx_sa_disable_args[] = {
{
IPMACSEC_CMD_SECY_ARG_AN,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"association_number",
"-an",
"<an>",
IPMACSEC_CMD_SECY_AN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REF_ID,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"reference",
"-r",
"<rerefence_id>",
IPMACSEC_CMD_SECY_SA_REFID_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY tx_sa print command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_tx_sa_print_args[] = {
{
IPMACSEC_CMD_SECY_ARG_AN,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"association_number",
"-an",
"<an>",
IPMACSEC_CMD_SECY_AN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REF_ID,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"reference",
"-r",
"<rerefence_id>",
IPMACSEC_CMD_SECY_SA_REFID_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_NO_STATS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nostats",
"-ns",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NOTE_EXCLUDE_STATS,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY tx_sa list command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_tx_sa_list_args[] = {
{
IPMACSEC_CMD_SECY_ARG_NO_STATS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nostats",
"-ns",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NOTE_EXCLUDE_STATS,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY rx_sc create command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_rx_sc_create_args[] = {
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"sci",
"-sci",
"<sci>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY rx_sc delete command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_rx_sc_delete_args[] = {
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"sci",
"-sci",
"<sci>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY rx_sc print command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_rx_sc_print_args[] = {
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"sci",
"-sci",
"<sci>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX
},
{
IPMACSEC_CMD_SECY_ARG_NO_STATS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nostats",
"-ns",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NOTE_EXCLUDE_STATS,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY rx_sc list command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_rx_sc_list_args[] = {
{
IPMACSEC_CMD_SECY_ARG_NO_STATS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nostats",
"-ns",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NOTE_EXCLUDE_STATS,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY rx_sa create command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_rx_sa_create_args[] = {
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"sci",
"-sci",
"<sci>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX
},
{
IPMACSEC_CMD_SECY_ARG_AN,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"association_number",
"-an",
"<an>",
IPMACSEC_CMD_SECY_AN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REF_ID,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"reference",
"-r",
"<rerefence_id>",
IPMACSEC_CMD_SECY_SA_REFID_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_KEYID,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"keyid",
"-k",
"<key_id>",
IPMACSEC_CMD_SECY_NOTE_KEYID_SYNTAX,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_NEXTPN,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nextPN",
"-n",
"<PN>",
IPMACSEC_CMD_SECY_SA_PN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_LOWESTPN,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"lowestPN",
"-l",
"<PN>",
IPMACSEC_CMD_SECY_SA_PN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY rx_sa delete command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_rx_sa_delete_args[] = {
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"sci",
"-sci",
"<sci>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX
},
{
IPMACSEC_CMD_SECY_ARG_AN,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"association_number",
"-an",
"<an>",
IPMACSEC_CMD_SECY_AN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REF_ID,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"reference",
"-r",
"<rerefence_id>",
IPMACSEC_CMD_SECY_SA_REFID_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY rx_sa control command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_rx_sa_control_args[] = {
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"sci",
"-sci",
"<sci>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX
},
{
IPMACSEC_CMD_SECY_ARG_AN,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"association_number",
"-an",
"<an>",
IPMACSEC_CMD_SECY_AN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REF_ID,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"reference",
"-r",
"<rerefence_id>",
IPMACSEC_CMD_SECY_SA_REFID_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_ENABLE,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"enableReceive",
"-en",
IPMACSEC_CMD_SECY_ARG_VAL_ONOFF,
IPMACSEC_CMD_SECY_NOTE_KEYID_SYNTAX,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_NEXTPN,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"updtNextPN",
"-n",
"<PN>",
IPMACSEC_CMD_SECY_SA_PN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_LOWESTPN,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"updtLowestPN",
"-l",
"<PN>",
IPMACSEC_CMD_SECY_SA_PN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY rx_sa print command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_rx_sa_print_args[] = {
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"sci",
"-sci",
"<sci>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX
},
{
IPMACSEC_CMD_SECY_ARG_AN,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"association_number",
"-an",
"<an>",
IPMACSEC_CMD_SECY_AN_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_REF_ID,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"reference",
"-r",
"<rerefence_id>",
IPMACSEC_CMD_SECY_SA_REFID_HELP,
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_NO_STATS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nostats",
"-ns",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NOTE_EXCLUDE_STATS,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY rx_sa list command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_rx_sa_list_args[] = {
{
IPMACSEC_CMD_SECY_ARG_SCI,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"sci",
"-sci",
"<sci>",
IPMACSEC_CMD_SECY_NO_HELP,
IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX
},
{
IPMACSEC_CMD_SECY_ARG_NO_STATS,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"nostats",
"-ns",
IPMACSEC_CMD_SECY_NO_VAL,
IPMACSEC_CMD_SECY_NOTE_EXCLUDE_STATS,
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY monitor start command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_monitor_start_args[] = {
{
IPMACSEC_CMD_SECY_ARG_TIMEOUT,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"timeout",
"-t",
"<seconds>",
"Specify a timeout value after which the monitor will automatically exit",
IPMACSEC_CMD_SECY_NO_HELP
},
{
IPMACSEC_CMD_SECY_ARG_EXIT_ON_ERROR,
IPMACSEC_CMD_SECY_ARG_OPTIONAL,
"exit_on_error",
"-e",
IPMACSEC_CMD_SECY_NO_VAL,
"This option causes the monitor to exit when it encounters any error",
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/* SecY monitor exit command arguments */
IP_STATIC IP_CONST Ipmacsec_cmd_secy_args ipmacsec_cmd_secy_monitor_exit_args[] = {
{
IPMACSEC_CMD_SECY_ARG_PID,
IPMACSEC_CMD_SECY_ARG_MANDATORY,
"pid",
"-p",
"<pid>",
"Specify the pid value returned when the monitor was created",
IPMACSEC_CMD_SECY_NO_HELP
},
{IPMACSEC_CMD_SECY_ARG_NONE, 0, IP_NULL, IP_NULL, IP_NULL, IP_NULL, IP_NULL} /* Make sure this stays last */
};
/*
* ====================
* MACsec SecY Commands
* ====================
*
* IMPORTANT: Make sure you group commands with the same qualifier together
* --------- and that the NULL qualifier group is ALWAYS 1st.
*
*/
IP_STATIC IP_CONST Ipmacsec_secy_cmd ipmacsec_secy_cmds[] = {
/*-------------------------------------------------------------------------------------*/
{
IPMACSEC_CMD_SECY_NO_QUALIFIER, IPMACSEC_CMD_SECY_NO_ALT,
"enable",
IPMACSEC_CMD_SECY_NO_ARGS,
0, 0,
"Enable SecY",
ipmacsec_cmd_secy_enable
},
/*-------------------------------------------------------------------------------------*/
{
IPMACSEC_CMD_SECY_NO_QUALIFIER, IPMACSEC_CMD_SECY_NO_ALT,
"disable",
IPMACSEC_CMD_SECY_NO_ARGS,
0, 0,
"Disable SecY",
ipmacsec_cmd_secy_disable
},
/*-------------------------------------------------------------------------------------*/
{
IPMACSEC_CMD_SECY_NO_QUALIFIER, IPMACSEC_CMD_SECY_NO_ALT,
"status",
IPMACSEC_CMD_SECY_NO_ARGS,
0, 0,
"Display SecY status",
ipmacsec_cmd_secy_status
},
/*-------------------------------------------------------------------------------------*/
{
IPMACSEC_CMD_SECY_NO_QUALIFIER, IPMACSEC_CMD_SECY_NO_ALT,
"dump",
ipmacsec_cmd_secy_dump_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Dump SecY details",
ipmacsec_cmd_secy_dump
},
/*-------------------------------------------------------------------------------------*/
{
IPMACSEC_CMD_SECY_NO_QUALIFIER, IPMACSEC_CMD_SECY_NO_ALT,
"reset_stats",
IPMACSEC_CMD_SECY_NO_ARGS,
0, 0,
"Reset SecY statistics (only allowed when SecY is disabled)",
ipmacsec_cmd_secy_reset_stats
},
/*-------------------------------------------------------------------------------------*/
{
IPMACSEC_CMD_SECY_NO_QUALIFIER, IPMACSEC_CMD_SECY_NO_ALT,
"set",
ipmacsec_cmd_secy_set_args,
1, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Set SecY parameter(s) (Must specify one or more parameters)",
ipmacsec_cmd_secy_set
},
/*-------------------------------------------------------------------------------------*/
{
IPMACSEC_CMD_SECY_NO_QUALIFIER, IPMACSEC_CMD_SECY_NO_ALT,
"get",
ipmacsec_cmd_secy_get_args,
1, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Get SecY parameter(s) (Must specifu one or more parameters)",
ipmacsec_cmd_secy_get
},
/*-------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------*/
{
"cipher_suite", "ciph",
"set",
ipmacsec_cmd_secy_cipher_set_args,
1, 1,
"Set the SecY Cipher Suite (Specify \"identifier\" or \"index\" but not both)",
ipmacsec_cmd_secy_cipher_set
},
{
"cipher_suite", "ciph",
"print",
ipmacsec_cmd_secy_cipher_print_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Display the SecY's current Cipher Suite information",
ipmacsec_cmd_secy_cipher_print
},
{
"cipher_suite", "ciph",
"list",
ipmacsec_cmd_secy_cipher_list_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"List information for all supported Cipher Suites",
ipmacsec_cmd_secy_cipher_list
},
{
"cipher_suite", "ciph",
"resolve",
ipmacsec_cmd_secy_cipher_resolve_args,
1, 1,
"Resolve Cipher Suite \"identifier\" or \"index\" (Specify one or the other)",
ipmacsec_cmd_secy_cipher_resolve
},
/*-------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------*/
{
"controlled_port", "cp",
"set",
ipmacsec_cmd_secy_cp_set_args,
1, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Set SecY Controlled Port parameter(s)",
ipmacsec_cmd_secy_cp_set
},
{
"controlled_port", "cp",
"get",
ipmacsec_cmd_secy_cp_get_args,
1, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Get SecY Controlled Port parameter(s)",
ipmacsec_cmd_secy_cp_get
},
{
"controlled_port", "cp",
"print",
ipmacsec_cmd_secy_cp_print_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Display the SecY Controlled Port information",
ipmacsec_cmd_secy_cp_print
},
/*-------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------*/
{
"sak", IPMACSEC_CMD_SECY_NO_ALT,
"install",
ipmacsec_cmd_secy_sak_install_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Install a SecY SAK. MUST specify \"key\" or \"skdb_key\" but not both"
"\n MUST also specify \"transmits\" and/or \"receives\"",
ipmacsec_cmd_secy_sak_install
},
{
"sak", IPMACSEC_CMD_SECY_NO_ALT,
"remove",
ipmacsec_cmd_secy_sak_remove_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Remove an SecY SAK. MUST not be in use by an SA, or remove will fail",
ipmacsec_cmd_secy_sak_remove
},
{
"sak", IPMACSEC_CMD_SECY_NO_ALT,
"purge",
IPMACSEC_CMD_SECY_NO_ARGS,
0, 0,
"Purge all SecY SAKs. Will not remove any SAK that is in use by an SA",
ipmacsec_cmd_secy_sak_purge
},
{
"sak", IPMACSEC_CMD_SECY_NO_ALT,
"print",
ipmacsec_cmd_secy_sak_print_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Display the SecY specified SAK's information",
ipmacsec_cmd_secy_sak_print
},
{
"sak", IPMACSEC_CMD_SECY_NO_ALT,
"list",
IPMACSEC_CMD_SECY_NO_ARGS,
0, 0,
"List all installed SAKs' and their information",
ipmacsec_cmd_secy_sak_list
},
/*-------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------*/
{
"tx_sc", "TxSC",
"create",
ipmacsec_cmd_secy_tx_sc_create_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Create the SecY Transmit SC (only relevant if called on disabled SecY)",
ipmacsec_cmd_secy_tx_sc_create
},
{
"tx_sc", "TxSC",
"delete",
IPMACSEC_CMD_SECY_NO_ARGS,
0, 0,
"Delete the SecY Transmit SC",
ipmacsec_cmd_secy_tx_sc_delete
},
{
"tx_sc", "TxSC",
"print",
ipmacsec_cmd_secy_tx_sc_print_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Display the SecY Transmit SC information",
ipmacsec_cmd_secy_tx_sc_print
},
/*-------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------*/
{
"tx_sa", "TxSA",
"create",
ipmacsec_cmd_secy_tx_sa_create_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Create a SecY Transmit SA",
ipmacsec_cmd_secy_tx_sa_create
},
{
"tx_sa", "TxSA",
"delete",
ipmacsec_cmd_secy_tx_sa_delete_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Delete the specified SecY Transmit SA",
ipmacsec_cmd_secy_tx_sa_delete
},
{
"tx_sa", "TxSA",
"enable",
ipmacsec_cmd_secy_tx_sa_enable_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Enable the specified SecY Transmit SA",
ipmacsec_cmd_secy_tx_sa_enable
},
{
"tx_sa", "TxSA",
"disable",
ipmacsec_cmd_secy_tx_sa_disable_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Disable the specified SecY Transmit SA",
ipmacsec_cmd_secy_tx_sa_disable
},
{
"tx_sa", "TxSA",
"print",
ipmacsec_cmd_secy_tx_sa_print_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Display the specified SecY Transmit SA information",
ipmacsec_cmd_secy_tx_sa_print
},
{
"tx_sa", "TxSA",
"list",
ipmacsec_cmd_secy_tx_sa_list_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"List all the SecY Transmit SAs information",
ipmacsec_cmd_secy_tx_sa_list
},
/*-------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------*/
{
"rx_sc", "RxSC",
"create",
ipmacsec_cmd_secy_rx_sc_create_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Create a SecY Receive SC",
ipmacsec_cmd_secy_rx_sc_create
},
{
"rx_sc", "RxSC",
"delete",
ipmacsec_cmd_secy_rx_sc_delete_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Delete the specified SecY Receive SC",
ipmacsec_cmd_secy_rx_sc_delete
},
{
"rx_sc", "RxSC",
"print",
ipmacsec_cmd_secy_rx_sc_print_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Display the specified SecY Receive SC information",
ipmacsec_cmd_secy_rx_sc_print
},
{
"rx_sc", "RxSC",
"list",
ipmacsec_cmd_secy_rx_sc_list_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"List all the SecY Receive SCs information",
ipmacsec_cmd_secy_rx_sc_list
},
/*-------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------*/
{
"rx_sa", "RxSA",
"create",
ipmacsec_cmd_secy_rx_sa_create_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Create a SecY Receive SA",
ipmacsec_cmd_secy_rx_sa_create
},
{
"rx_sa", "RxSA",
"delete",
ipmacsec_cmd_secy_rx_sa_delete_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Delete the specified SecY Receive SA",
ipmacsec_cmd_secy_rx_sa_delete
},
{
"rx_sa", "RxSA",
"control",
ipmacsec_cmd_secy_rx_sa_control_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Update the specified SecY Receive SA controls",
ipmacsec_cmd_secy_rx_sa_control
},
{
"rx_sa", "RxSA",
"print",
ipmacsec_cmd_secy_rx_sa_print_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Display the specified SecY Receive SA information",
ipmacsec_cmd_secy_rx_sa_print
},
{
"rx_sa", "RxSA",
"list",
ipmacsec_cmd_secy_rx_sa_list_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"List all the SecY Receive SAs information for the specified Receive SC",
ipmacsec_cmd_secy_rx_sa_list
},
/*-------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------*/
{
"monitor", "mon",
"start",
ipmacsec_cmd_secy_monitor_start_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Start a SecY monitor",
ipmacsec_cmd_secy_monitor_start
},
{
"monitor", "mon",
"exit",
ipmacsec_cmd_secy_monitor_exit_args,
0, IPMACSEC_CMD_SECY_NUM_ARGS_UNSPECIFIED,
"Signal a SecY monitor to exit",
ipmacsec_cmd_secy_monitor_exit
}
/*-------------------------------------------------------------------------------------*/
};
IP_STATIC IP_CONST Ip_u32 ipmacsec_num_secy_cmds = sizeof(ipmacsec_secy_cmds)/sizeof(ipmacsec_secy_cmds[0]);
IP_STATIC IP_CONST char *ipmacsec_cmd_secy_synopsis = "macsec secy " IPMACSEC_CMD_SECY_SYNOPSIS;
/*
****************************************************************************
* 9 INLINE FUNCTIONS
****************************************************************************
*/
IP_INLINE IP_CONST Ipmacsec_secy_cmd *
ipmacsec_secy_cmd_retrieve(Ip_u32 cmd_index) {
ip_assert(cmd_index < ipmacsec_num_secy_cmds);
return &ipmacsec_secy_cmds[(cmd_index)];
}
/*
****************************************************************************
* 10 GLOBAL FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipmacsec_cmd_init
*===========================================================================
* Description: Registers the top level MACsec commands with the ipcom shell
* Parameters:
* Returns:
*
*/
IP_GLOBAL Ip_err
ipmacsec_cmd_init(void) {
return ipcom_shell_add_cmd("macsec", ipmacsec_cmd_synopsis, ipmacsec_cmd_description, ipmacsec_cmd_macsec,
IPCOM_PROC_PRIO_4, IPCOM_PROC_STACK_MAX);
;
}
/*
*===========================================================================
* ipmacsec_cmd_macsec
*===========================================================================
* Description: MACsec top level command handler
* Parameters:
* Returns:
*
*/
IP_GLOBAL Ipmacsec_lmi_error
ipmacsec_cmd_macsec(int argc, char** argv) {
Ip_u32 i;
char *cmd = IP_NULL;
Ipmacsec_cmd_fn fn = IP_NULL;
int n_argc = 0;
char **n_argv = IP_NULL;
Ipmacsec_lmi_error rc = IPMACSEC_LMIERR_UNSPECIFIED_ERROR;
if (argc < 2) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: MACsec command does not have enough keywords (%d < 2)***\n", argc);
#endif
ipmacsec_cmd_macsec_usage(IPMACSEC_CMD_USAGE_NOHELP);
rc = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto cmd_done;
}
/* find the command */
cmd = argv[1];
for (i=0; i < ipmacsec_num_cmds; i++) {
if (ipcom_strcasecmp(argv[1], ipmacsec_supported_cmds[i].cmd) == 0) {
fn = ipmacsec_supported_cmds[i].func;
n_argc = argc-2;
if (n_argc)
n_argv = &argv[2];
break;
}
}
if (fn == IP_NULL) {
/* command not found */
ipmacsec_cmd_macsec_usage(IPMACSEC_CMD_USAGE_NOHELP);
rc = IPMACSEC_LMIERR_CMD_NOT_FOUND;
goto cmd_done;
}
rc = fn(n_argc, n_argv, i);
cmd_done:
ipcom_printf("\n>>> macsec command %s (%d: %s).\n", ((rc == IPMACSEC_LMIERR_NONE) ? "Done" : "Failed"),
rc, ipmacsec_lmi_error_name(rc));
return rc;
}
/*
****************************************************************************
* 11 PRIVATE FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipmacsec_cmd_macsec_usage_cmd
*===========================================================================
* Description: Display usage/help info for specified MACsec top level command
* Parameters:
* Returns:
*
*/
IP_STATIC void
ipmacsec_cmd_macsec_usage_cmd(Ip_u32 cmd_index, Ip_bool help) {
if (cmd_index >= ipmacsec_num_cmds) {
ipcom_printf(" Invalid Command (id %d)\n", cmd_index);
return;
}
ipcom_printf(IPMACSEC_CMD_DISPLAY_OFFSET "macsec");
if (ipmacsec_supported_cmds[cmd_index].cmd)
ipcom_printf(" %s", ipmacsec_supported_cmds[cmd_index].cmd);
if (ipmacsec_supported_cmds[cmd_index].args)
ipcom_printf(" %s", ipmacsec_supported_cmds[cmd_index].args);
ipcom_printf("\n");
if (ipmacsec_supported_cmds[cmd_index].help && help)
ipcom_printf(IPMACSEC_CMD_HELP_DISPLAY_OFFSET "%s\n", ipmacsec_supported_cmds[cmd_index].help);
}
/*
*===========================================================================
* ipmacsec_cmd_macsec_usage
*===========================================================================
* Description: Display usage/help info for all MACsec top level commands
* Parameters:
* Returns:
*
*/
IP_STATIC void
ipmacsec_cmd_macsec_usage(Ip_bool help) {
Ip_u32 i;
ipcom_printf("IPMACSEC command shell\n");
ipcom_printf("Usage: %s\n", ipmacsec_cmd_synopsis);
for (i = 0; i < ipmacsec_num_cmds; i++) {
if (ipmacsec_supported_cmds[i].cmd)
ipmacsec_cmd_macsec_usage_cmd(i, help);
}
}
/*
*===========================================================================
* ipmacsec_cmd_help
*===========================================================================
* Description: Display MACsec top level command help
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_help(int argc, char** argv, Ip_u32 cmd_index) {
IPCOM_UNUSED_ARG(argc);
IPCOM_UNUSED_ARG(argv);
IPCOM_UNUSED_ARG(cmd_index);
ipmacsec_cmd_macsec_usage(IPMACSEC_CMD_USAGE_HELP);
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_version
*===========================================================================
* Description: Display Supported MACsec Protocol Version
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_version(int argc, char** argv, Ip_u32 cmd_index) {
IPCOM_UNUSED_ARG(argc);
IPCOM_UNUSED_ARG(argv);
IPCOM_UNUSED_ARG(cmd_index);
int ret = ipmacsec_lmi_protocol_version();
if (ret < 0) {
ipcom_printf("Supported MACsec Protocol Version cannot be determined\n");
return ret;
}
ipcom_printf("Supported MACsec Protocol Version: %u\n", (unsigned int)ret);
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy
*===========================================================================
* Description: MACsec SecY command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy(int argc, char** argv, Ip_u32 cmd_index) {
Ipmacsec_lmi_error rc = IPMACSEC_LMIERR_NONE;
IPMACSEC_LMI_HANDLE lh = IP_NULL;
char *ifname = IP_NULL;
if ((argc == 0) || !argv || !argv[0]) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: SecY command has no arguments***\n");
#endif
ipmacsec_cmd_secy_usage(IPMACSEC_CMD_USAGE_NOHELP);
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipcom_strcasecmp(argv[0], "help") == 0) {
return ipmacsec_cmd_secy_help(argc, argv, cmd_index);
}
if ((argc < 2) || !argv[1]) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: SecY command does not have enough arguments (argc = %d)***\n", argc);
#endif
ipmacsec_cmd_secy_usage(IPMACSEC_CMD_USAGE_NOHELP);
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
lh = ipmacsec_lmi_handle_create();
if (!lh) {
return IPMACSEC_LMIERR_HANDLE_CREATE_FAILED;
}
ifname = argv[0];
rc = ipmacsec_cmd_secy_exec(lh, ifname, argc-1, &argv[1]);
ipmacsec_lmi_handle_delete(lh);
return rc;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_usage_cmd
*===========================================================================
* Description: Display usage/help for specified MACsec SecY command
* Parameters:
* Returns:
*
*/
IP_STATIC void
ipmacsec_cmd_secy_usage_cmd(Ip_u32 cmd_index, Ip_bool help, Ip_bool ind_help) {
IP_CONST Ipmacsec_cmd_secy_args *args = IP_NULL;
IP_CONST Ipmacsec_secy_cmd *secy_cmd;
if (cmd_index >= ipmacsec_num_secy_cmds) {
ipcom_printf(" Invalid Command (id %d)\n", cmd_index);
return;
}
secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
ipcom_printf(IPMACSEC_CMD_DISPLAY_OFFSET "macsec secy <ifname>");
if (secy_cmd->qualifier)
ipcom_printf(" %s", secy_cmd->qualifier);
if (secy_cmd->alt_qualifier) {
ip_assert(secy_cmd->qualifier);
ipcom_printf("(%s)", secy_cmd->alt_qualifier);
}
ip_assert(secy_cmd->cmd);
ipcom_printf(" %s", secy_cmd->cmd);
args = secy_cmd->args;
if (args) {
ipcom_printf(" ...");
}
ipcom_printf("\n");
if (!help)
return;
if (help && secy_cmd->help)
ipcom_printf(IPMACSEC_CMD_HELP_DISPLAY_OFFSET "%s\n", secy_cmd->help);
if (args) {
int i;
ipcom_printf(IPMACSEC_CMD_HELP_DISPLAY_OFFSET "Arguments: \n");
for (i=0; args[i].id != IPMACSEC_CMD_SECY_ARG_NONE; i++) {
ipcom_printf(IPMACSEC_CMD_SECY_ARG_DISPLAY_OFFSET);
if (args[i].optional)
ipcom_printf("(OPTIONAL) ");
else
ipcom_printf("(MANDATORY) ");
ipcom_printf("%s", args[i].name);
if (args[i].alt) {
ipcom_printf("(%s)", args[i].alt);
}
if (args[i].val) {
ipcom_printf(" %s", args[i].val);
}
ipcom_printf("\n");
if (help && args[i].help) {
ipcom_printf(IPMACSEC_CMD_SECY_HELP_DISPLAY_OFFSET "%s\n", args[i].help);
}
if (help && ind_help && args[i].ind_help) {
ipcom_printf(IPMACSEC_CMD_SECY_HELP_DISPLAY_OFFSET "%s\n", args[i].ind_help);
}
}
}
}
/*
*===========================================================================
* ipmacsec_cmd_secy_usage
*===========================================================================
* Description: Display usage/help for all MACsec SecY commands
* Parameters:
* Returns:
*
*/
IP_STATIC void
ipmacsec_cmd_secy_usage(Ip_bool help) {
Ip_u32 i;
ipcom_printf("IPMACSEC SecY commands\n");
ipcom_printf("Usage: %s\n", ipmacsec_cmd_secy_synopsis);
for (i = 0; i < ipmacsec_num_secy_cmds; i++) {
if (ipmacsec_secy_cmds[i].cmd)
ipmacsec_cmd_secy_usage_cmd(i, help, IP_FALSE);
}
if (help)
ipcom_printf("\n" IPMACSEC_CMD_HELP_DISPLAY_OFFSET "%s\n", IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX);
}
/*
*===========================================================================
* ipmacsec_cmd_secy_help
*===========================================================================
* Description: Display help for all MACsec SecY commands
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_help(int argc, char** argv, Ip_u32 cmd_index) {
IPCOM_UNUSED_ARG(argc);
IPCOM_UNUSED_ARG(argv);
IPCOM_UNUSED_ARG(cmd_index);
ipmacsec_cmd_secy_usage(IPMACSEC_CMD_USAGE_HELP);
return IPMACSEC_LMIERR_NONE;
}
#ifdef IPMACSEC_DEBUG_CMD_PARSE
/*
*===========================================================================
* ipmacsec_cmd_secy_arg_name
*===========================================================================
* Description: retrieve the name of a SecY command argument
* Parameters:
* Returns:
*
*/
IP_STATIC IP_CONST char *
ipmacsec_cmd_secy_arg_name(Ipmacsec_cmd_secy_arg_id argid) {
IP_CONST char *name = "INVALID";
switch (argid) {
case IPMACSEC_CMD_SECY_ARG_NO_STATS:
name = "IPMACSEC_CMD_SECY_ARG_NO_STATS";
break;
case IPMACSEC_CMD_SECY_ARG_PROTECT_FRAMES:
name = "IPMACSEC_CMD_SECY_ARG_PROTECT_FRAMES";
break;
case IPMACSEC_CMD_SECY_ARG_ALWAYS_INCLUDE_SCI:
name = "IPMACSEC_CMD_SECY_ARG_ALWAYS_INCLUDE_SCI";
break;
case IPMACSEC_CMD_SECY_ARG_USE_ES:
name = "IPMACSEC_CMD_SECY_ARG_USE_ES";
break;
case IPMACSEC_CMD_SECY_ARG_USE_SCB:
name = "IPMACSEC_CMD_SECY_ARG_USE_SCB";
break;
case IPMACSEC_CMD_SECY_ARG_VALIDATE_FRAMES:
name = "IPMACSEC_CMD_SECY_ARG_VALIDATE_FRAMES";
break;
case IPMACSEC_CMD_SECY_ARG_REPLAY_PROTECT:
name = "IPMACSEC_CMD_SECY_ARG_REPLAY_PROTECT";
break;
case IPMACSEC_CMD_SECY_ARG_REPLAY_WINDOW:
name = "IPMACSEC_CMD_SECY_ARG_REPLAY_WINDOW";
break;
case IPMACSEC_CMD_SECY_ARG_KEYID:
name = "IPMACSEC_CMD_SECY_ARG_KEYID";
break;
case IPMACSEC_CMD_SECY_ARG_SCI:
name = "IPMACSEC_CMD_SECY_ARG_SCI";
break;
case IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY_OFFSET:
name = "IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY_OFFSET";
break;
case IPMACSEC_CMD_SECY_ARG_PN_THRESHOLD:
name = "IPMACSEC_CMD_SECY_ARG_PN_THRESHOLD";
break;
case IPMACSEC_CMD_SECY_ARG_INFO_NOTIFY:
name = "IPMACSEC_CMD_SECY_ARG_INFO_NOTIFY";
break;
case IPMACSEC_CMD_SECY_ARG_TIMEOUT:
name = "IPMACSEC_CMD_SECY_ARG_TIMEOUT";
break;
case IPMACSEC_CMD_SECY_ARG_EXIT_ON_ERROR:
name = "IPMACSEC_CMD_SECY_ARG_EXIT_ON_ERROR";
break;
case IPMACSEC_CMD_SECY_ARG_PID:
name = "IPMACSEC_CMD_SECY_ARG_PID";
break;
case IPMACSEC_CMD_SECY_ARG_MAX_RX_SCS:
name = "IPMACSEC_CMD_SECY_ARG_MAX_RX_SCS";
break;
case IPMACSEC_CMD_SECY_ARG_MAX_RX_KEYS:
name = "IPMACSEC_CMD_SECY_ARG_MAX_RX_KEYS";
break;
case IPMACSEC_CMD_SECY_ARG_MAX_TX_KEYS:
name = "IPMACSEC_CMD_SECY_ARG_MAX_TX_KEYS";
break;
case IPMACSEC_CMD_SECY_ARG_NUM_CREATED_RX_SCS:
name = "IPMACSEC_CMD_SECY_ARG_NUM_CREATED_RX_SCS";
break;
case IPMACSEC_CMD_SECY_ARG_NUM_ACTIVE_RX_SCS:
name = "IPMACSEC_CMD_SECY_ARG_NUM_ACTIVE_RX_SCS";
break;
case IPMACSEC_CMD_SECY_ARG_TX:
name = "IPMACSEC_CMD_SECY_ARG_TX";
break;
case IPMACSEC_CMD_SECY_ARG_RX:
name = "IPMACSEC_CMD_SECY_ARG_RX";
break;
case IPMACSEC_CMD_SECY_ARG_KEYSIZE:
name = "IPMACSEC_CMD_SECY_ARG_KEYSIZE";
break;
case IPMACSEC_CMD_SECY_ARG_KEYVAL:
name = "IPMACSEC_CMD_SECY_ARG_KEYVAL";
break;
case IPMACSEC_CMD_SECY_ARG_SKDBKEY:
name = "IPMACSEC_CMD_SECY_ARG_SKDBKEY";
break;
case IPMACSEC_CMD_SECY_ARG_CP_ENABLED:
name = "IPMACSEC_CMD_SECY_ARG_CP_ENABLED";
break;
case IPMACSEC_CMD_SECY_ARG_CP_MAC_ENABLED:
name = "IPMACSEC_CMD_SECY_ARG_CP_MAC_ENABLED";
break;
case IPMACSEC_CMD_SECY_ARG_CP_MAC_OPER:
name = "IPMACSEC_CMD_SECY_ARG_CP_MAC_OPER";
break;
case IPMACSEC_CMD_SECY_ARG_CP_ADMIN_PTP_MAC:
name = "IPMACSEC_CMD_SECY_ARG_CP_ADMIN_PTP_MAC";
break;
case IPMACSEC_CMD_SECY_ARG_CP_OPER_PTP_MAC:
name = "IPMACSEC_CMD_SECY_ARG_CP_OPER_PTP_MAC";
break;
case IPMACSEC_CMD_SECY_ARG_IDENTIFIER:
name = "IPMACSEC_CMD_SECY_ARG_IDENTIFIER";
break;
case IPMACSEC_CMD_SECY_ARG_INDEX:
name = "IPMACSEC_CMD_SECY_ARG_INDEX";
break;
case IPMACSEC_CMD_SECY_ARG_DETAILS:
name = "IPMACSEC_CMD_SECY_ARG_DETAILS";
break;
case IPMACSEC_CMD_SECY_ARG_AN:
name = "IPMACSEC_CMD_SECY_ARG_AN";
break;
case IPMACSEC_CMD_SECY_ARG_REF_ID:
name = "IPMACSEC_CMD_SECY_ARG_REF_ID";
break;
case IPMACSEC_CMD_SECY_ARG_NEXTPN:
name = "IPMACSEC_CMD_SECY_ARG_NEXTPN";
break;
case IPMACSEC_CMD_SECY_ARG_LOWESTPN:
name = "IPMACSEC_CMD_SECY_ARG_LOWESTPN";
break;
case IPMACSEC_CMD_SECY_ARG_ENABLE:
name = "IPMACSEC_CMD_SECY_ARG_ENABLE";
break;
case IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY:
name = "IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY";
break;
case IPMACSEC_CMD_SECY_ARG_NONE:
case __IPMACSEC_CMD_SECY_ARG_MAX:
break;
}
return name;
}
#endif
/*
*===========================================================================
* ipmacsec_cmd_secy_exec
*===========================================================================
* Description: Execute a MACsec SecY command
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_exec(IPMACSEC_LMI_HANDLE lh, char *ifname, int argc, char** argv) {
Ip_u32 i,cmd_index;
char *qualifier, *cmd;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = IP_NULL;
Ipmacsec_cmd_secy_fn fn = IP_NULL;
int n_argc = 0;
char **n_argv = IP_NULL;
Ipmacsec_cmd_secy_parsed_args pargs;
Ip_err rc = IPCOM_ERR_FAILED;
ip_assert(lh);
ip_assert(ifname);
if ((argc == 0) || !argv || !argv[0]) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: SecY command missing***\n");
#endif
ipmacsec_cmd_secy_usage(IPMACSEC_CMD_USAGE_NOHELP);
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipcom_strcasecmp(argv[0], "status") != 0) {
/* For all commands except the check command, make sure the SecY interface exists before going any further */
if (!ipmacsec_lmi_secy_exists(lh, ifname)) {
ipcom_printf("***SecY interface %s does not exist.***\n", ifname);
ipcom_printf("\n");
ipmacsec_cmd_secy_usage(IPMACSEC_CMD_USAGE_NOHELP);
return IPMACSEC_LMIERR_SECY_DOESNOT_EXIST;
}
}
/* find the start of the qualifier group */
qualifier = argv[0];
for (i=0; i < ipmacsec_num_secy_cmds; i++) {
if ((ipmacsec_secy_cmds[i].qualifier &&
(ipcom_strcasecmp(qualifier, ipmacsec_secy_cmds[i].qualifier) == 0)) ||
(ipmacsec_secy_cmds[i].alt_qualifier &&
(ipcom_strcasecmp(qualifier, ipmacsec_secy_cmds[i].alt_qualifier) == 0))
) {
if (argc < 2) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: SecY qualified command missing (qualifier = %s)***\n", qualifier);
#endif
ipmacsec_cmd_secy_usage(IPMACSEC_CMD_USAGE_NOHELP);
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
cmd = argv[1];
n_argc = argc-2;
if (n_argc)
n_argv = &argv[2];
break;
}
}
if (i == ipmacsec_num_secy_cmds) {
/* If we are here this is either a non-qualified command or a bad command, assume the former for now */
i = 0;
qualifier = IP_NULL;
cmd = argv[0];
n_argc = argc-1;
if (n_argc)
n_argv = &argv[1];
}
/* Find a qualified or non-qualified command */
for (cmd_index=i; cmd_index < ipmacsec_num_secy_cmds; cmd_index++) {
secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (qualifier &&
(secy_cmd->qualifier == IP_NULL) &&
(secy_cmd->alt_qualifier == IP_NULL))
break; /* We reached the end of the table */
if ((qualifier == IP_NULL) &&
((secy_cmd->qualifier != IP_NULL) ||
(secy_cmd->alt_qualifier != IP_NULL))
)
break; /* negative scan result for whole unqualified command group ==> bad command */
if (qualifier &&
((secy_cmd->qualifier && ipcom_strcasecmp(qualifier, secy_cmd->qualifier)) &&
(secy_cmd->alt_qualifier && ipcom_strcasecmp(qualifier, secy_cmd->alt_qualifier))))
break; /* negative scan result for whole qualified command group ==> bad command */
if (secy_cmd->cmd == IP_NULL) {
/* Something is wrong with the Command Table, we should always have a command*/
IP_PANIC();
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***PANIC: Null SecY cmd for cmd_index %d***\n", cmd_index);
#endif
return IPMACSEC_LMIERR_UNSPECIFIED_ERROR;
}
if (ipcom_strcasecmp(cmd, secy_cmd->cmd) == 0) {
/* found it */
fn = secy_cmd->func;
break;
}
}
if (fn == IP_NULL) {
/* command not found */
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: SecY command not found***\n");
#endif
ipmacsec_cmd_secy_usage(IPMACSEC_CMD_USAGE_NOHELP);
return IPMACSEC_LMIERR_CMD_NOT_FOUND;
}
if (n_argc && n_argv && n_argv[0] && (ipcom_strcasecmp(n_argv[0], "help") == 0)) {
IPMACSEC_CMD_SECY_USAGE_CMD(cmd_index, IPMACSEC_CMD_USAGE_HELP);
return IPMACSEC_LMIERR_NONE;
}
if (ipmacsec_cmd_secy_parse_and_verify_args(n_argc, n_argv, &pargs, cmd_index) != IPMACSEC_LMIERR_NONE) {
/* Something wrong with argument syntax or an unexpected arguments */
IPMACSEC_CMD_SECY_USAGE_CMD(cmd_index, IPMACSEC_CMD_USAGE_HELP);
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (pargs.nargs < secy_cmd->min_args) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: SecY command does not have enough arguments (%u < %u)***\n", pargs.nargs, secy_cmd->min_args);
#endif
IPMACSEC_CMD_SECY_USAGE_CMD(cmd_index, IPMACSEC_CMD_USAGE_HELP);
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (pargs.nargs > secy_cmd->max_args) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: SecY command has too many arguments (%u > %u)***\n", pargs.nargs, secy_cmd->max_args);
#endif
IPMACSEC_CMD_SECY_USAGE_CMD(cmd_index, IPMACSEC_CMD_USAGE_HELP);
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
#ifdef IPMACSEC_DEBUG_CMD_PARSE
{
/* display the results of the parsing */
Ipmacsec_cmd_secy_arg_id argid;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
ipcom_printf(">>PARSED COMMAND");
if (secy_cmd->qualifier)
ipcom_printf(" %s", secy_cmd->qualifier );
ip_assert(secy_cmd->cmd);
ipcom_printf(" %s\n", secy_cmd->cmd);
ipcom_printf(" nargs = %u\n", pargs.nargs);
for (argid = IPMACSEC_CMD_SECY_ARG_NONE; argid < __IPMACSEC_CMD_SECY_ARG_MAX; argid++) {
if (IPMACSEC_CMD_SECY_ARG_FOUND(&pargs,argid)) {
char *argval = IPMACSEC_CMD_SECY_ARG_VAL(&pargs,argid);
ipcom_printf(" %s = %s\n", ipmacsec_cmd_secy_arg_name(argid), (argval ? argval : "*NONE*"));
}
}
ipcom_printf("<<\n");
}
#endif
rc = fn(lh, ifname, &pargs, cmd_index);
if (rc == IPMACSEC_LMIERR_INVALID_CMD_SYNTAX) {
IPMACSEC_CMD_SECY_USAGE_CMD(cmd_index, IPMACSEC_CMD_USAGE_HELP);
}
return rc;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_parse_and_verify_args
*===========================================================================
* Description: Parse and verify SecY command arguments.
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_parse_and_verify_args(int argc, char** argv, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *cmd;
char *varg = (argv ? argv[0] : IP_NULL);
int rem_args = argc, argi = 0, carg = 0;
ip_assert(argc >= 0);
ip_assert(pargs);
ipcom_memset(pargs, 0, sizeof(Ipmacsec_cmd_secy_parsed_args));
if (argc && !argv) {
/* Should never happen really */
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: NULL argv (argc=%d)***\n", argc);
#endif
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
while (rem_args) {
Ip_bool found = IP_FALSE;
ip_assert(argi < argc);
varg = argv[argi];
if (!varg) {
/* Should never happen really */
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: NULL varg (rem_args=%d)***\n", rem_args);
#endif
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
argi++;
rem_args--;
ip_assert(rem_args>=0);
/* Parse each command line argument and make sure it matches one of the
* command's arguments.
*/
for (carg=0; cmd->args && (cmd->args[carg].id != IPMACSEC_CMD_SECY_ARG_NONE) & !found; carg++) {
IP_CONST Ipmacsec_cmd_secy_args *arg = &cmd->args[carg];
IP_CONST char *alt = (arg->alt ? arg->alt : "");
ip_assert(arg->name);
if ((ipcom_strcasecmp(arg->name, varg) != 0) && (ipcom_strcasecmp(alt, varg) != 0)) {
continue;
}
/* Found the argument, so make sure it is not repeated */
if (pargs->argfound[arg->id]) {
/* Repeated argument not allowed */
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: %s is repeated more than once***\n", varg);
#endif
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
pargs->nargs++;
pargs->argfound[arg->id] = IP_TRUE;
found = IP_TRUE;
pargs->argval[arg->id] = IP_NULL;
/* check if it requires a val, parse that and setup pargs */
if (arg->val) {
if (!rem_args) {
/* Missing argument value */
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: %s is missing the argument value***\n", varg);
#endif
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
} else {
ip_assert(argi < argc);
pargs->argval[arg->id] = argv[argi]; /* Update the parsed arg value */
argi++;
rem_args--;
ip_assert(rem_args>=0);
}
}
}
if (!found) {
/* Not a valid argument for this command */
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: %s is not a valid argument for this command***\n", varg);
#endif
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
/* Now make sure we did not miss any mandatory arguments */
for (carg=0; cmd->args && (cmd->args[carg].id != IPMACSEC_CMD_SECY_ARG_NONE); carg++) {
IP_CONST Ipmacsec_cmd_secy_args *arg = &cmd->args[carg];
if (!IPMACSEC_CMD_SECY_ARG_FOUND(pargs,arg->id)) {
if (!arg->optional) {
/* A mandatory argument is missing */
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: %s mandatory argument is missing***\n", arg->name);
#endif
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
}
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_enable
*===========================================================================
* Description: Secy enable command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_enable(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
IPCOM_UNUSED_ARG(pargs);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
return ipmacsec_lmi_secy_enable(lh, ifname, IP_TRUE);
}
/*
*===========================================================================
* ipmacsec_cmd_secy_disable
*===========================================================================
* Description: Secy disable command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_disable(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
IPCOM_UNUSED_ARG(pargs);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
return ipmacsec_lmi_secy_enable(lh, ifname, IP_FALSE);
}
/*
*===========================================================================
* ipmacsec_cmd_secy_status
*===========================================================================
* Description: Secy status command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_status(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_NONE;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
Ip_bool enabled = IP_FALSE;
IPCOM_UNUSED_ARG(pargs);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (!ipmacsec_lmi_secy_exists(lh, ifname)) {
ipcom_printf("SecY does not exist for interface %s\n", ifname);
return IPMACSEC_LMIERR_NONE;
}
ret = ipmacsec_lmi_secy_is_enabled(lh, ifname, &enabled);
if (ret == IPMACSEC_LMIERR_NONE) {
ipcom_printf("SecY for Interface %s is %s\n", ifname, (enabled ? "Enabled" : "Disabled"));
}
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_dump
*===========================================================================
* Description: Secy dump command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_dump(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
return ipmacsec_lmi_secy_dump(lh, ifname, !IPMACSEC_CMD_SECY_ARG_FOUND(pargs,IPMACSEC_CMD_SECY_ARG_NO_STATS));
}
/*
*===========================================================================
* ipmacsec_cmd_secy_reset_stats
*===========================================================================
* Description: Secy reset_stats command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_reset_stats(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
IPCOM_UNUSED_ARG(pargs);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
return ipmacsec_lmi_secy_reset_stats(lh, ifname);
}
/*
*===========================================================================
* ipmacsec_cmd_secy_set
*===========================================================================
* Description: Secy set command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_set(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ipmacsec_validateFrames_type validateFrames = __IPMACSEC_SECY_VALIDATEFRAMES_INVALID;
Ip_bool boolval = IP_FALSE;
Ip_u32 u32val = 0;
Ip_u16 u16val = 0;
Ip_u8 sci[IPMACSEC_SCI_LEN];
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_PROTECT_FRAMES)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_PROTECT_FRAMES);
if (ipmacsec_cmd_parse_onoff(argval, &boolval) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_protectFrames(lh, ifname, boolval);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_ALWAYS_INCLUDE_SCI)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_ALWAYS_INCLUDE_SCI);
if (ipmacsec_cmd_parse_onoff(argval, &boolval) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_alwaysIncludeSCI(lh, ifname, boolval);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_USE_ES)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_USE_ES);
if (ipmacsec_cmd_parse_onoff(argval, &boolval) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_useES(lh, ifname, boolval);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_USE_SCB)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_USE_SCB);
if (ipmacsec_cmd_parse_onoff(argval, &boolval) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_useSCB(lh, ifname, boolval);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_VALIDATE_FRAMES)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_VALIDATE_FRAMES);
if (ipmacsec_cmd_parse_validateFrames(argval, &validateFrames) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_validateFrames(lh, ifname, validateFrames);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REPLAY_PROTECT)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REPLAY_PROTECT);
if (ipmacsec_cmd_parse_onoff(argval, &boolval) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_replayProtect(lh, ifname, boolval);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REPLAY_WINDOW)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REPLAY_WINDOW);
if (ipmacsec_cmd_parse_u32(argval, &u32val) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_replayWindow(lh, ifname, u32val);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_SCI)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SCI);
if (ipmacsec_parse_sci_string(argval, sci) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_tx_sci(lh, ifname, sci);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY_OFFSET)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY_OFFSET);
if (ipmacsec_cmd_parse_u16(argval, &u16val) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_confidentialityOffset(lh, ifname, u16val);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_PN_THRESHOLD)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_PN_THRESHOLD);
if (ipmacsec_cmd_parse_u32(argval, &u32val) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_pn_threshold(lh, ifname, u32val);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_INFO_NOTIFY)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_INFO_NOTIFY);
if (ipmacsec_cmd_parse_onoff(argval, &boolval) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_info_notification(lh, ifname, boolval);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
done:
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_get
*===========================================================================
* Description: Secy get command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_get(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
IP_CONST char *err_str = "***retrieve failed***";
Ipmacsec_validateFrames_type validateFrames = __IPMACSEC_SECY_VALIDATEFRAMES_INVALID;
Ip_bool boolval = IP_FALSE;
Ip_u16 u16val = 0;
Ip_u32 u32val = 0;
Ip_u8 sci[IPMACSEC_SCI_LEN];
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_PROTECT_FRAMES)) {
ret = ipmacsec_lmi_secy_get_protectFrames(lh, ifname, &boolval);
ipcom_printf("protectFrames: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? IPMACSEC_BOOL_STRING(boolval) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_ALWAYS_INCLUDE_SCI)) {
ret = ipmacsec_lmi_secy_get_alwaysIncludeSCI(lh, ifname, &boolval);
ipcom_printf("alwaysIncludeSCI: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? IPMACSEC_BOOL_STRING(boolval) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_USE_ES)) {
ret = ipmacsec_lmi_secy_get_useES(lh, ifname, &boolval);
ipcom_printf("useES: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? IPMACSEC_BOOL_STRING(boolval) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_USE_SCB)) {
ret = ipmacsec_lmi_secy_get_useSCB(lh, ifname, &boolval);
ipcom_printf("useSCB: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? IPMACSEC_BOOL_STRING(boolval) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_VALIDATE_FRAMES)) {
ret = ipmacsec_lmi_secy_get_validateFrames(lh, ifname, &validateFrames);
if (ret == IPMACSEC_LMIERR_NONE)
ipcom_printf("validateFrames: %s\n",
ipmacsec_secy_validateFrames_name(validateFrames));
else
ipcom_printf("validateFrames: %s\n", err_str);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REPLAY_PROTECT)) {
ret = ipmacsec_lmi_secy_get_replayProtect(lh, ifname, &boolval);
ipcom_printf("replayProtect: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? IPMACSEC_BOOL_STRING(boolval) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REPLAY_WINDOW)) {
ret = ipmacsec_lmi_secy_get_replayWindow(lh, ifname, &u32val);
if (ret == IPMACSEC_LMIERR_NONE)
ipcom_printf("replayWindow: %u\n", u32val);
else
ipcom_printf("replayWindow: %s\n", err_str);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_SCI)) {
ret = ipmacsec_lmi_secy_get_tx_sci(lh, ifname, sci);
if (ret == IPMACSEC_LMIERR_NONE)
ipcom_printf("sci: " IPMACSEC_SCI_STRING, IPMACSEC_SCI_OCTETS(sci));
else
ipcom_printf("sci: %s", err_str);
ipcom_printf("\n");
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY_OFFSET)) {
ret = ipmacsec_lmi_secy_get_confidentialityOffset(lh, ifname, &u16val);
if (ret == IPMACSEC_LMIERR_NONE)
ipcom_printf("confidentialityOffset: %u\n", u16val);
else
ipcom_printf("confidentialityOffset: %s\n", err_str);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_PN_THRESHOLD)) {
ret = ipmacsec_lmi_secy_get_pn_threshold(lh, ifname, &u32val);
if (ret == IPMACSEC_LMIERR_NONE)
ipcom_printf("pn_threshold: %u (0x%x)\n", u32val, u32val);
else
ipcom_printf("pn_threshold: %s\n", err_str);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_INFO_NOTIFY)) {
ret = ipmacsec_lmi_secy_get_info_notification(lh, ifname, &boolval);
ipcom_printf("info_notify: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? IPMACSEC_BOOL_STRING(boolval) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_MAX_RX_SCS)) {
ret = ipmacsec_lmi_secy_get_maxRxSCs(lh, ifname, &u16val);
if (ret == IPMACSEC_LMIERR_NONE)
ipcom_printf("maxRxSCs: %u\n", u16val);
else
ipcom_printf("maxRxSCs: %s\n", err_str);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_MAX_RX_KEYS)) {
ret = ipmacsec_lmi_secy_get_maxRxKeys(lh, ifname, &u16val);
if (ret == IPMACSEC_LMIERR_NONE)
ipcom_printf("maxRxKeys: %u\n", u16val);
else
ipcom_printf("maxRxKeys: %s\n", err_str);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_MAX_TX_KEYS)) {
ret = ipmacsec_lmi_secy_get_maxTxKeys(lh, ifname, &u16val);
if (ret == IPMACSEC_LMIERR_NONE)
ipcom_printf("maxTxKeys: %u\n", u16val);
else
ipcom_printf("maxTxKeys: %s\n", err_str);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NUM_CREATED_RX_SCS)) {
ret = ipmacsec_lmi_secy_get_numCreatedRxSCs(lh, ifname, &u16val);
if (ret == IPMACSEC_LMIERR_NONE)
ipcom_printf("numCreatedRxSCs: %u\n", u16val);
else
ipcom_printf("numCreatedRxSCs: %s\n", err_str);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NUM_ACTIVE_RX_SCS)) {
ret = ipmacsec_lmi_secy_get_numActiveRxSCs(lh, ifname, &u16val);
if (ret == IPMACSEC_LMIERR_NONE)
ipcom_printf("numActiveRxSCs: %u\n", u16val);
else
ipcom_printf("numActiveRxSCs: %s\n", err_str);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
done:
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_sak_install
*===========================================================================
* Description: Secy SAK install command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_sak_install(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_NONE;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
Ipmacsec_secy_key_descriptor key_desc;
char *argval = IP_NULL;
Ip_u8 *key = IP_NULL;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
ipcom_memset(&key_desc, 0, sizeof(key_desc));
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_KEYID);
if (ipmacsec_cmd_parse_key_id(argval, &key_desc.key_id) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_KEYSIZE);
if (ipmacsec_cmd_parse_u32(argval, &key_desc.key_size) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_RX))
key_desc.key_type |= IPMACSEC_KEYTYPE_RECEIVE;
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_TX))
key_desc.key_type |= IPMACSEC_KEYTYPE_TRANSMIT;
if (key_desc.key_type == 0) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_KEYVAL) &&
IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_SKDBKEY))
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_KEYVAL)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_KEYVAL);
key = ipmacsec_cmd_parse_key_material(argval, key_desc.key_size);
if (!key) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: Invalid key material: %s ***\n", argval);
#endif
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
} else if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_SKDBKEY)) {
#ifdef IPCOM_USE_KEY_DB
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SKDBKEY);
key = ipmacsec_cmd_skdb_get_key_material(argval, key_desc.key_size);
if (!key) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: Invalid skbd key %s ***\n", argval);
#endif
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
#else
ipcom_printf("***ERROR: Secure Key database support missing ***\n", argval);
return IPMACSEC_LMIERR_NOT_SUPPORTED;
#endif
} else {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
#ifdef IPMACSEC_CMD_SECY_SAK_DISPLAY_KEY_MATERIAL
#warning This may expose sensitive keying material when secure key DB is used, so only use turn on for debugging purposes.
ipcom_printf("***KEY MATERIAL: ");
if (key) {
int i=0;
for (i=key_desc.key_size-1; i>=0 ;i--)
ipcom_printf("%.2x ", key[i]);
} else
ipcom_printf("(null)");
ipcom_printf("\n");
#endif
ret = ipmacsec_lmi_secy_key_install(lh, ifname, &key_desc, key);
if (key) {
ipcom_memset(key,0,key_desc.key_size);
ipcom_free(key);
}
if (ret != IPMACSEC_LMIERR_NONE)
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_sak_remove
*===========================================================================
* Description: Secy SAK remove command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_sak_remove(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ipmacsec_secy_key_descriptor key_desc;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_KEYID);
if (ipmacsec_cmd_parse_key_id(argval, &key_desc.key_id) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_key_remove(lh, ifname, &key_desc) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_sak_purge
*===========================================================================
* Description: Secy SAK purge command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_sak_purge(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
IPCOM_UNUSED_ARG(pargs);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (ipmacsec_lmi_secy_key_purge(lh, ifname) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_sak_print
*===========================================================================
* Description: Secy SAK print command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_sak_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ipmacsec_secy_key_id key_id;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_KEYID);
if (ipmacsec_cmd_parse_key_id(argval, &key_id) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
(void)ipmacsec_lmi_secy_print_key_info(lh, ifname, &key_id, IP_NULL);
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_sak_list
*===========================================================================
* Description: Secy SAK list command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_sak_list(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
IPCOM_UNUSED_ARG(pargs);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (ipmacsec_lmi_secy_print_key_info(lh, ifname, IP_NULL, IP_NULL) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_tx_sc_create
*===========================================================================
* Description: Secy tx_sc create command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sc_create(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_NONE;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 sci[IPMACSEC_SCI_LEN];
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_SCI)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SCI);
if (ipmacsec_parse_sci_string(argval, sci) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_tx_sci(lh, ifname, sci);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
ret = ipmacsec_lmi_secy_create_tx_sc(lh, ifname);
if (ret != IPMACSEC_LMIERR_NONE)
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
done:
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_tx_sc_delete
*===========================================================================
* Description: Secy tx_sc delete command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sc_delete(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_NONE;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
IPCOM_UNUSED_ARG(pargs);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
ret = ipmacsec_lmi_secy_delete_tx_sc(lh, ifname);
if (ret != IPMACSEC_LMIERR_NONE)
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_tx_sc_print
*===========================================================================
* Description: Secy tx_sc print command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sc_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (ipmacsec_lmi_secy_print_tx_sc(lh, ifname, IP_NULL,
!IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NO_STATS))
!= IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_tx_sa_create
*===========================================================================
* Description: Secy tx_sa create command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_create(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 an;
Ip_u32 ref = 0;
Ipmacsec_secy_key_id key_id;
Ipmacsec_secy_sa_descriptor sa_desc;
Ip_u32 nextPN = 0;
Ipmacsec_confidentiality confidentiality = IPMACSEC_CONFIDENTIALITY_UNSPECIFIED;
Ipmacsec_secy_sa_info sa_info;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_AN);
if (ipmacsec_cmd_parse_u8(argval, &an) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID);
if (ipmacsec_cmd_parse_u32(argval, &ref) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_KEYID);
if (ipmacsec_cmd_parse_key_id(argval, &key_id) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_sa_descriptor_init(&sa_desc, IP_NULL, an, IPMACSEC_TX, ref, &key_id) == IP_NULL) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NEXTPN)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_NEXTPN);
if (ipmacsec_cmd_parse_u32(argval, &nextPN) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (nextPN == 0) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: Invalid nextPN value: %u ***\n", nextPN);
#endif
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY)) {
Ip_bool boolval;
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_CONFIDENTIALITY);
if (ipmacsec_cmd_parse_onoff(argval, &boolval) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
confidentiality = (boolval ? IPMACSEC_CONFIDENTIALITY_ON : IPMACSEC_CONFIDENTIALITY_OFF);
}
if (ipmacsec_lmi_secy_tx_sa_info_init(&sa_info, nextPN, confidentiality) == IP_NULL) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_create_tx_sa(lh, ifname, &sa_desc, &sa_info) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_tx_sa_delete
*===========================================================================
* Description: Secy tx_sa delete command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_delete(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 an;
Ip_u32 ref = 0;
Ipmacsec_secy_sa_descriptor sa_desc;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_AN);
if (ipmacsec_cmd_parse_u8(argval, &an) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID);
if (ipmacsec_cmd_parse_u32(argval, &ref) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
if (ipmacsec_lmi_secy_sa_descriptor_init(&sa_desc, IP_NULL, an, IPMACSEC_TX, ref, IP_NULL) == IP_NULL) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_delete_tx_sa(lh, ifname, &sa_desc) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_tx_sa_enable
*===========================================================================
* Description: Secy tx_sa enable command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_enable(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 an;
Ip_u32 ref = 0;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_AN);
if (ipmacsec_cmd_parse_u8(argval, &an) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID);
if (ipmacsec_cmd_parse_u32(argval, &ref) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
if (ipmacsec_lmi_secy_enable_tx_sa(lh, ifname, an, ref, IP_TRUE) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_tx_sa_disable
*===========================================================================
* Description: Secy tx_sa disable command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_disable(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 an;
Ip_u32 ref = 0;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_AN);
if (ipmacsec_cmd_parse_u8(argval, &an) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID);
if (ipmacsec_cmd_parse_u32(argval, &ref) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
if (ipmacsec_lmi_secy_enable_tx_sa(lh, ifname, an, ref, IP_FALSE) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_tx_sa_print
*===========================================================================
* Description: Secy tx_sa print command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 an;
Ip_u32 ref = 0;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_AN);
if (ipmacsec_cmd_parse_u8(argval, &an) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID);
if (ipmacsec_cmd_parse_u32(argval, &ref) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
(void)ipmacsec_lmi_secy_print_tx_sa(lh, ifname, an, ref, IP_NULL,
!IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NO_STATS));
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_tx_sa_list
*===========================================================================
* Description: Secy tx_sa list command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_tx_sa_list(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
(void)ipmacsec_lmi_secy_print_tx_sa(lh, ifname, -1, 0, IP_NULL,
!IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NO_STATS));
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_rx_sc_create
*===========================================================================
* Description: Secy rx_sc create command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sc_create(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 sci[IPMACSEC_SCI_LEN];
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SCI);
if (ipmacsec_parse_sci_string(argval, sci) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_create_rx_sc(lh, ifname, sci) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_rx_sc_delete
*===========================================================================
* Description: Secy rx_sc delete command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sc_delete(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 sci[IPMACSEC_SCI_LEN];
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SCI);
if (ipmacsec_parse_sci_string(argval, sci) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_delete_rx_sc(lh, ifname, sci) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_rx_sc_print
*===========================================================================
* Description: Secy rx_sc print command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sc_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 sci[IPMACSEC_SCI_LEN];
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SCI);
if (ipmacsec_parse_sci_string(argval, sci) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_print_rx_sc(lh, ifname, sci, IP_NULL,
!IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NO_STATS))
!= IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_rx_sc_list
*===========================================================================
* Description: Secy rx_sc list command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sc_list(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (ipmacsec_lmi_secy_print_rx_sc(lh, ifname, IP_NULL, IP_NULL,
!IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NO_STATS))
!= IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_rx_sa_create
*===========================================================================
* Description: Secy rx_sa create command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sa_create(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 an;
Ip_u32 ref = 0;
Ip_u8 sci[IPMACSEC_SCI_LEN];
Ipmacsec_secy_key_id key_id;
Ipmacsec_secy_sa_descriptor sa_desc;
Ip_u32 nextPN = 0;
Ip_u32 lowestPN = 0;
Ipmacsec_secy_sa_info sa_info;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SCI);
if (ipmacsec_parse_sci_string(argval, sci) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_AN);
if (ipmacsec_cmd_parse_u8(argval, &an) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID);
if (ipmacsec_cmd_parse_u32(argval, &ref) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_KEYID);
if (ipmacsec_cmd_parse_key_id(argval, &key_id) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_sa_descriptor_init(&sa_desc, sci, an, IPMACSEC_RX, ref, &key_id) == IP_NULL) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NEXTPN)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_NEXTPN);
if (ipmacsec_cmd_parse_u32(argval, &nextPN) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (nextPN == 0) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: Invalid nextPN value: %u ***\n", nextPN);
#endif
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_LOWESTPN)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_LOWESTPN);
if (ipmacsec_cmd_parse_u32(argval, &lowestPN) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (lowestPN == 0) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: Invalid lowestPN value: %u ***\n", lowestPN);
#endif
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
}
if (ipmacsec_lmi_secy_rx_sa_info_init(&sa_info, nextPN, lowestPN) == IP_NULL) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_create_rx_sa(lh, ifname, &sa_desc, &sa_info) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_rx_sa_delete
*===========================================================================
* Description: Secy rx_sa delete command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sa_delete(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 an;
Ip_u32 ref = 0;
Ip_u8 sci[IPMACSEC_SCI_LEN];
Ipmacsec_secy_sa_descriptor sa_desc;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SCI);
if (ipmacsec_parse_sci_string(argval, sci) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_AN);
if (ipmacsec_cmd_parse_u8(argval, &an) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID);
if (ipmacsec_cmd_parse_u32(argval, &ref) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
if (ipmacsec_lmi_secy_sa_descriptor_init(&sa_desc, sci, an, IPMACSEC_RX, ref, IP_NULL) == IP_NULL) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_delete_rx_sa(lh, ifname, &sa_desc) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_rx_sa_control
*===========================================================================
* Description: Secy rx_sa control command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sa_control(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 an;
Ip_u32 ref = 0;
Ip_u8 sci[IPMACSEC_SCI_LEN];
Ipmacsec_secy_sa_descriptor sa_desc;
Ipmacsec_enable_flag enableRx = IPMACSEC_ENABLEFLAG_IGNORE;
Ip_u32 updtNextPN = 0;
Ip_u32 updtLowestPN = 0;
Ip_bool ctrl_option = IP_FALSE;
Ipmacsec_secy_sa_ctrl sa_ctrl;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SCI);
if (ipmacsec_parse_sci_string(argval, sci) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_AN);
if (ipmacsec_cmd_parse_u8(argval, &an) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID);
if (ipmacsec_cmd_parse_u32(argval, &ref) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
if (ipmacsec_lmi_secy_sa_descriptor_init(&sa_desc, sci, an, IPMACSEC_RX, ref, IP_NULL) == IP_NULL) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_ENABLE)) {
Ip_bool boolval;
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_ENABLE);
if (ipmacsec_cmd_parse_onoff(argval, &boolval) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
ctrl_option = IP_TRUE;
enableRx = (boolval ? IPMACSEC_ENABLEFLAG_ON : IPMACSEC_ENABLEFLAG_OFF);
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NEXTPN)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_NEXTPN);
if (ipmacsec_cmd_parse_u32(argval, &updtNextPN) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (updtNextPN == 0) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: Invalid updtNextPN value: %u ***\n", updtNextPN);
#endif
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
ctrl_option = IP_TRUE;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_LOWESTPN)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_LOWESTPN);
if (ipmacsec_cmd_parse_u32(argval, &updtLowestPN) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (updtLowestPN == 0) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: Invalid updtLowestPN value: %u ***\n", updtLowestPN);
#endif
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
ctrl_option = IP_TRUE;
}
if (!ctrl_option) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: RX SA Control option(s) missing ***\n");
#endif
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_rx_sa_ctrl_init(&sa_ctrl, enableRx, updtNextPN, updtLowestPN) == IP_NULL) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_lmi_secy_control_rx_sa(lh, ifname, &sa_desc, &sa_ctrl) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_rx_sa_print
*===========================================================================
* Description: Secy rx_sa print command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sa_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 an;
Ip_u32 ref = 0;
Ip_u8 sci[IPMACSEC_SCI_LEN];
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SCI);
if (ipmacsec_parse_sci_string(argval, sci) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_AN);
if (ipmacsec_cmd_parse_u8(argval, &an) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_REF_ID);
if (ipmacsec_cmd_parse_u32(argval, &ref) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
(void)ipmacsec_lmi_secy_print_rx_sa(lh, ifname, sci, an, ref, IP_NULL,
!IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NO_STATS));
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_rx_sa_list
*===========================================================================
* Description: Secy rx_sa list command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_rx_sa_list(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u8 sci[IPMACSEC_SCI_LEN];
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_SCI);
if (ipmacsec_parse_sci_string(argval, sci) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
(void)ipmacsec_lmi_secy_print_rx_sa(lh, ifname, sci, -1, 0, IP_NULL,
!IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_NO_STATS));
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_cipher_set
*===========================================================================
* Description: Secy cipher_suite set command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cipher_set(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_NONE;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ipmacsec_cipher_suite_index cipher_suite_index = __IPMACSEC_CIPHERSUITE_INVALID;
Ip_u8 cipher_suite_id[IPMACSEC_CIPHER_SUITE_ID_LEN];
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (pargs->nargs != 1) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
ipcom_memset(cipher_suite_id, 0, sizeof(cipher_suite_id));
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_INDEX)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_INDEX);
if (ipmacsec_cmd_parse_u32(argval, (Ip_u32 *)&cipher_suite_index) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
} else if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_IDENTIFIER)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_IDENTIFIER);
if (ipmacsec_cmd_parse_cipher_suite_id(argval, cipher_suite_id) != IPMACSEC_LMIERR_NONE) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: %s is not a valid cipher suite identifier***\n", argval);
#endif
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
ret = ipmacsec_lmi_cipher_suite_index_resolve(cipher_suite_id, &cipher_suite_index);
if (ret != IPMACSEC_LMIERR_NONE) {
return ret;
}
}
ret = ipmacsec_lmi_secy_set_cipher_suite(lh, ifname, cipher_suite_index);
if (ret != IPMACSEC_LMIERR_NONE)
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_cipher_print
*===========================================================================
* Description: Secy cipher_suite print command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cipher_print(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_NONE;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
Ipmacsec_ciphersuite_descriptor cipher_suite_desc;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
ret = ipmacsec_lmi_secy_get_cipher_suite(lh, ifname, &cipher_suite_desc);
if (ret == IPMACSEC_LMIERR_NONE) {
(void)ipmacsec_lmi_secy_print_cipher_suite_info(&cipher_suite_desc, IP_NULL,
IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_DETAILS));
} else {
ipcom_printf("***Failed to retrieve cipher suite details***\n");
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
}
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_cipher_list
*===========================================================================
* Description: Secy cipher_suite list command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cipher_list(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (ipmacsec_lmi_secy_print_cipher_suite_list(lh, ifname, IP_NULL,
IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_DETAILS))
!= IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_SECY_CMD_ERROR;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_cipher_resolve
*===========================================================================
* Description: Secy cipher_suite resolve command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error ipmacsec_cmd_secy_cipher_resolve(IPMACSEC_LMI_HANDLE lh,
char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ipmacsec_cipher_suite_index cipher_suite_index = 0;
Ip_u8 cipher_suite_id[IPMACSEC_CIPHER_SUITE_ID_LEN];
IPCOM_UNUSED_ARG(lh);
IPCOM_UNUSED_ARG(ifname);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (pargs->nargs != 1) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
ipcom_memset(cipher_suite_id, 0, sizeof(cipher_suite_id));
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_INDEX)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_INDEX);
if (ipmacsec_cmd_parse_u32(argval, (Ip_u32 *)&cipher_suite_index) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
ret = ipmacsec_lmi_cipher_suite_id_resolve(cipher_suite_index, cipher_suite_id);
} else if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_IDENTIFIER)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_IDENTIFIER);
if (ipmacsec_cmd_parse_cipher_suite_id(argval, cipher_suite_id) != IPMACSEC_LMIERR_NONE) {
#ifdef IPMACSEC_DEBUG_CMD
ipcom_printf("***ERROR: %s is not a valid cipher suite identifier***\n", argval);
#endif
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
ret = ipmacsec_lmi_cipher_suite_index_resolve(cipher_suite_id, &cipher_suite_index);
}
ipcom_printf("name: %s\n", ipmacsec_lmi_cipher_suite_name(cipher_suite_index));
ipcom_printf("selector index: %u, identifier: " IPMACSEC_CIPHER_SUITE_ID_STRING "\n",
cipher_suite_index, IPMACSEC_CIPHER_SUITE_ID_OCTETS(cipher_suite_id));
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_cp_print
*===========================================================================
* Description: Secy controlled_port print command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_cp_print(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
(void)ipmacsec_lmi_secy_print_port_info(lh, ifname, IP_NULL, IP_TRUE /*Controlled Port*/);
if (!IPMACSEC_CMD_SECY_ARG_FOUND(pargs,IPMACSEC_CMD_SECY_ARG_NO_STATS)) {
ipcom_printf("\n");
(void)ipmacsec_lmi_secy_print_port_stats(lh, ifname, IP_TRUE /*Controlled Port*/);
}
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_cp_set
*===========================================================================
* Description: Secy controlled_port set command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_cp_set(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_bool boolval = IP_FALSE;
Ip_portif_admin_ptp_mac_val admin_ptp_mac;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_CP_ENABLED)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_CP_ENABLED);
if (ipmacsec_cmd_parse_onoff(argval, &boolval) != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_ControlledPortEnabled(lh, ifname, boolval);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_CP_ADMIN_PTP_MAC)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_CP_ADMIN_PTP_MAC);
if (argval && ((ipcom_strcasecmp(argval, "auto") == 0) || (ipcom_strcasecmp(argval, "a") == 0))) {
admin_ptp_mac = IP_PORTIF_ADMIN_PTP_MAC_FORCE_AUTO;
} else if (ipmacsec_cmd_parse_onoff(argval, &boolval) == IPMACSEC_LMIERR_NONE) {
admin_ptp_mac = (boolval ? IP_PORTIF_ADMIN_PTP_MAC_FORCE_TRUE : IP_PORTIF_ADMIN_PTP_MAC_FORCE_FALSE);
} else {
ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
goto done;
}
ret = ipmacsec_lmi_secy_set_adminPointToPointMAC(lh, ifname, admin_ptp_mac);
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
done:
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_cp_get
*===========================================================================
* Description: Secy controlled_port get command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_cp_get(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
IP_CONST char *err_str = "***retrieve failed***";
Ip_bool boolval = IP_FALSE;
Ip_portif_admin_ptp_mac_val admin_ptp_mac;
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_CP_ENABLED)) {
ret = ipmacsec_lmi_secy_get_ControlledPortEnabled(lh, ifname, &boolval);
ipcom_printf("ControlledPortEnabled: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? IPMACSEC_BOOL_STRING(boolval) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_CP_ADMIN_PTP_MAC)) {
ret = ipmacsec_lmi_secy_get_adminPointToPointMAC(lh, ifname, &admin_ptp_mac);
ipcom_printf("adminPointToPointMAC: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? ipmacsec_secy_cp_adminPointToPointMAC_name(admin_ptp_mac) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_CP_MAC_ENABLED)) {
ret = ipmacsec_lmi_secy_get_MAC_Enabled(lh, ifname, &boolval, IP_TRUE /*Controlled Port*/);
ipcom_printf("MAC_Enabled: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? IPMACSEC_BOOL_STRING(boolval) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_CP_MAC_OPER)) {
ret = ipmacsec_lmi_secy_get_MAC_Operational(lh, ifname, &boolval, IP_TRUE /*Controlled Port*/);
ipcom_printf("MAC_Operational: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? IPMACSEC_BOOL_STRING(boolval) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_CP_OPER_PTP_MAC)) {
ret = ipmacsec_lmi_secy_get_operPointToPointMAC(lh, ifname, &boolval, IP_TRUE /*Controlled Port*/);
ipcom_printf("operPointToPointMAC: %s\n",
((ret==IPMACSEC_LMIERR_NONE) ? IPMACSEC_BOOL_STRING(boolval) : err_str));
if (ret != IPMACSEC_LMIERR_NONE) {
ret = IPMACSEC_LMIERR_SECY_CMD_ERROR;
goto done;
}
}
done:
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_monitor_start
*===========================================================================
* Description: Secy monitor start command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_monitor_start(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
Ipmacsec_lmi_error ret = IPMACSEC_LMIERR_NONE;
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u32 timeout = 0;
Ip_bool exit_on_error = IP_FALSE;
Ip_u32 pid;
IPCOM_UNUSED_ARG(lh);
IPCOM_UNUSED_ARG(ifname);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_TIMEOUT)) {
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_TIMEOUT);
if (ipmacsec_cmd_parse_u32(argval, &timeout) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
}
if (IPMACSEC_CMD_SECY_ARG_FOUND(pargs, IPMACSEC_CMD_SECY_ARG_EXIT_ON_ERROR)) {
exit_on_error = IP_TRUE;
}
ret = ipmacsec_lmi_monitor_start(timeout, exit_on_error, &pid, IP_NULL, 0);
return ret;
}
/*
*===========================================================================
* ipmacsec_cmd_secy_monitor_exit
*===========================================================================
* Description: Secy monitor exit command handler
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_secy_monitor_exit(IPMACSEC_LMI_HANDLE lh, char *ifname, Ipmacsec_cmd_secy_parsed_args *pargs, Ip_u32 cmd_index) {
IP_CONST Ipmacsec_secy_cmd *secy_cmd = ipmacsec_secy_cmd_retrieve(cmd_index);
char *argval = IP_NULL;
Ip_u32 pid;
IPCOM_UNUSED_ARG(lh);
IPCOM_UNUSED_ARG(ifname);
ip_assert(ifname);
ip_assert(pargs);
IPMACSEC_SECYCMD_VERIFY(secy_cmd);
argval = IPMACSEC_CMD_SECY_ARG_VAL(pargs, IPMACSEC_CMD_SECY_ARG_PID);
if (!argval) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
if (ipmacsec_cmd_parse_u32(argval, &pid) != IPMACSEC_LMIERR_NONE) {
return IPMACSEC_LMIERR_INVALID_CMD_SYNTAX;
}
return ipmacsec_lmi_monitor_exit(pid);
}
/*
*===========================================================================
* ipmacsec_cmd_parse_onoff
*===========================================================================
* Description: Parses On/Off parameter
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_parse_onoff(char *argv, Ip_bool *boolval) {
if (!argv || !boolval)
return IPMACSEC_LMIERR_INVALID_PARAMETER;
if ((ipcom_strcasecmp(argv, "on") == 0) || (ipcom_strcasecmp(argv, "1") == 0)) {
*boolval = IP_TRUE;
return IPMACSEC_LMIERR_NONE;
}
if ((ipcom_strcasecmp(argv, "off") == 0) || (ipcom_strcasecmp(argv, "0") == 0)) {
*boolval = IP_FALSE;
return IPMACSEC_LMIERR_NONE;
}
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
/*
*===========================================================================
* ipmacsec_cmd_parse_u32
*===========================================================================
* Description: Parses Ip_u32 parameter
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_parse_u32(char *argv, Ip_u32 *u32val) {
Ip_u32 len;
Ip_u32 i;
if (!argv || !u32val)
return IPMACSEC_LMIERR_INVALID_PARAMETER;
len = (Ip_u32)ipcom_strlen(argv);
if ((len > 2) && ((argv[0] == '0') && ((argv[1] == 'x') || (argv[1] == 'X')))) {
if ((len < 3) || (len > 10))
return IPMACSEC_LMIERR_INVALID_PARAMETER;
for (i=2;i<len;i++)
if (!ipcom_isxdigit(argv[i]))
return IPMACSEC_LMIERR_INVALID_PARAMETER;
*u32val = (Ip_u32)ipcom_strtoul(argv, IP_NULL, 16);
} else {
if ((len < 1) || (len > 10))
return IPMACSEC_LMIERR_INVALID_PARAMETER;
for (i=0;i<len;i++)
if (!ipcom_isdigit(argv[i]))
return IPMACSEC_LMIERR_INVALID_PARAMETER;
*u32val = (Ip_u32)ipcom_strtoul(argv, IP_NULL, 10);
}
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_parse_u16
*===========================================================================
* Description: Parses Ip_u16 parameter
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_parse_u16(char *argv, Ip_u16 *u16val) {
Ip_u32 u32val = 0;
if (!argv || !u16val)
return IPMACSEC_LMIERR_INVALID_PARAMETER;
if (ipmacsec_cmd_parse_u32(argv, &u32val) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_INVALID_PARAMETER;
if (u32val > 0x0000FFFFUL) {
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
*u16val = (Ip_u16)u32val;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_parse_u8
*===========================================================================
* Description: Parses Ip_u8 parameter
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_parse_u8(char *argv, Ip_u8 *u8val) {
Ip_u32 u32val = 0;
if (!argv || !u8val)
return IPMACSEC_LMIERR_INVALID_PARAMETER;
if (ipmacsec_cmd_parse_u32(argv, &u32val) != IPMACSEC_LMIERR_NONE)
return IPMACSEC_LMIERR_INVALID_PARAMETER;
if (u32val > 0x000000FFUL) {
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
*u8val = (Ip_u8)u32val;
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_parse_validateFrames
*===========================================================================
* Description: Parses validateFrames parameter
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_parse_validateFrames(char *argv, Ipmacsec_validateFrames_type *validateFrames) {
if (!argv || !validateFrames)
return IPMACSEC_LMIERR_INVALID_PARAMETER;
if ((ipcom_strcasecmp(argv, "disabled") == 0) || (ipcom_strcasecmp(argv, "d") == 0)) {
*validateFrames = IPMACSEC_SECY_VALIDATEFRAMES_DISABLED;
return IPMACSEC_LMIERR_NONE;
}
if ((ipcom_strcasecmp(argv, "check") == 0) || (ipcom_strcasecmp(argv, "c") == 0)) {
*validateFrames = IPMACSEC_SECY_VALIDATEFRAMES_CHECK;
return IPMACSEC_LMIERR_NONE;
}
if ((ipcom_strcasecmp(argv, "strict") == 0) || (ipcom_strcasecmp(argv, "s") == 0)) {
*validateFrames = IPMACSEC_SECY_VALIDATEFRAMES_STRICT;
return IPMACSEC_LMIERR_NONE;
}
return IPMACSEC_LMIERR_INVALID_PARAMETER;
}
/*
*===========================================================================
* ipmacsec_cmd_parse_cipher_suite_id
*===========================================================================
* Description: Parses cipher_suite_id parameter
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_parse_cipher_suite_id(char *argv, Ip_u8 *cipher_suite_id) {
int i;
char id[IPMACSEC_CIPHER_SUITE_ID_LEN*3];
if (!argv || !cipher_suite_id || (ipcom_strlen(argv) != (sizeof(id)-1)))
return IPMACSEC_LMIERR_INVALID_PARAMETER;
ipcom_strncpy(id, argv, sizeof(id));
for (i=0; i<IPMACSEC_CIPHER_SUITE_ID_LEN-1; i++) {
if (id[3*i+2]!='-')
return IPMACSEC_LMIERR_INVALID_PARAMETER;
id[3*i+2] = '\0';
cipher_suite_id[i] = (Ip_u8)ipcom_strtoul(&id[3*i], IP_NULL, 16);
}
cipher_suite_id[i] = (Ip_u8)ipcom_strtoul(&id[3*i], IP_NULL, 16);
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_parse_key_id
*===========================================================================
* Description: Parses key_id parameter
* Parameters:
* Returns:
*
*/
IP_STATIC Ipmacsec_lmi_error
ipmacsec_cmd_parse_key_id(char *argv, Ipmacsec_secy_key_id *key_id) {
Ip_u32 len;
char *ptr = argv;
int i;
char copy[16];
Ip_u32 octetlo, octethi;
if (!argv || !key_id)
return IPMACSEC_LMIERR_INVALID_PARAMETER;
len = (Ip_u32)ipcom_strlen(argv);
if ((len > 2) && ((argv[0] == '0') && ((argv[1] == 'x') || (argv[1] == 'X')))) {
len -=2;
ptr = &argv[2];
}
if ((len < 1) || (len > 16))
return IPMACSEC_LMIERR_INVALID_PARAMETER;
ipcom_memset(copy, '0', 16);
for (i=len-1;i>=0;i--) {
if (!ipcom_isxdigit(ptr[i]))
return IPMACSEC_LMIERR_INVALID_PARAMETER;
copy[16-len+i] = ptr[i];
}
for (i = 0; i < 8; i++) {
octethi = (ipcom_isdigit(copy[2*i]) ? (copy[2*i]-'0') : (ipcom_toupper(copy[2*i])-'A'+0xa));
octetlo = (ipcom_isdigit(copy[2*i+1]) ? (copy[2*i+1]-'0') : (ipcom_toupper(copy[2*i+1])-'A'+0xa));
key_id->octet[7-i] = (Ip_u8)((octethi << 4) | octetlo);
}
return IPMACSEC_LMIERR_NONE;
}
/*
*===========================================================================
* ipmacsec_cmd_parse_key_material
*===========================================================================
* Description: Parses key_material parameter
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_u8*
ipmacsec_cmd_parse_key_material(char *argval, Ip_u32 key_size) {
Ip_u32 len, i;
Ip_u8* key;
Ip_u32 octetlo, octethi;
if (!argval || !key_size)
return IP_NULL;
len = (Ip_u32)ipcom_strlen(argval);
if (len != 2*key_size)
return IP_NULL;
key = ipcom_malloc(key_size);
if (!key)
return IP_NULL;
for (i=0; i < key_size; i++) {
if ((!ipcom_isxdigit(argval[2*i])) || (!ipcom_isxdigit(argval[2*i+1]))) {
ipcom_memset(key,0,key_size);
ipcom_free(key);
return IP_NULL;
}
octethi = (ipcom_isdigit(argval[2*i]) ? (argval[2*i]-'0') : (ipcom_toupper(argval[2*i])-'A'+0xa));
octetlo = (ipcom_isdigit(argval[2*i+1]) ? (argval[2*i+1]-'0') : (ipcom_toupper(argval[2*i+1])-'A'+0xa));
key[i] = (Ip_u8)((octethi << 4) | octetlo);
}
return key;
}
#ifdef IPCOM_USE_KEY_DB
/*
*===========================================================================
* ipmacsec_cmd_skdb_get_key_material
*===========================================================================
* Description: Retrieves the key material for the specified secure key database
* key identifier.
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_u8*
ipmacsec_cmd_skdb_get_key_material(char *skdb_keyid, Ip_u32 key_size) {
Ip_u8 *key = IP_NULL;
int buf_len = (int)key_size;
if (!skdb_keyid || !key_size)
return IP_NULL;
key = ipcom_malloc(key_size);
if (!key)
return IP_NULL;
if (ipcom_key_db_buf_get(skdb_keyid, key, &buf_len) != IPCOM_SUCCESS) {
ipcom_memset(key,0,key_size);
ipcom_free(key);
return IP_NULL;
}
if (buf_len != (int)key_size) {
ipcom_memset(key,0,key_size);
ipcom_free(key);
return IP_NULL;
}
return key;
}
#endif