/* 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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 " [] [help]|[ [] ...]" #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 [ ...]"; 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", "", 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", "", 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", "", " 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", "", IPMACSEC_CMD_SECY_NOTE_CIPHERID_SYNTAX, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_INDEX, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "index", "-i", "", 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", "", IPMACSEC_CMD_SECY_NOTE_CIPHERID_SYNTAX, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_INDEX, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "index", "-i", "", 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", "", 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", "", IPMACSEC_CMD_SECY_NO_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_KEYVAL, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "key", "-k", "", "MUST be exactly 2 x characters representing key hex digits", IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_SKDBKEY, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "skdb_key", "-skdb", "", "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", "", 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", "", 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", "", "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", "", IPMACSEC_CMD_SECY_AN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_REF_ID, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "reference", "-r", "", IPMACSEC_CMD_SECY_SA_REFID_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_KEYID, IPMACSEC_CMD_SECY_ARG_MANDATORY, "keyid", "-k", "", IPMACSEC_CMD_SECY_NOTE_KEYID_SYNTAX, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_NEXTPN, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "nextPN", "-n", "", 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", "", IPMACSEC_CMD_SECY_AN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_REF_ID, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "reference", "-r", "", 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", "", IPMACSEC_CMD_SECY_AN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_REF_ID, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "reference", "-r", "", 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", "", IPMACSEC_CMD_SECY_AN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_REF_ID, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "reference", "-r", "", 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", "", IPMACSEC_CMD_SECY_AN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_REF_ID, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "reference", "-r", "", 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", "", 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", "", 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", "", 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", "", IPMACSEC_CMD_SECY_NO_HELP, IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX }, { IPMACSEC_CMD_SECY_ARG_AN, IPMACSEC_CMD_SECY_ARG_MANDATORY, "association_number", "-an", "", IPMACSEC_CMD_SECY_AN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_REF_ID, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "reference", "-r", "", IPMACSEC_CMD_SECY_SA_REFID_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_KEYID, IPMACSEC_CMD_SECY_ARG_MANDATORY, "keyid", "-k", "", IPMACSEC_CMD_SECY_NOTE_KEYID_SYNTAX, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_NEXTPN, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "nextPN", "-n", "", IPMACSEC_CMD_SECY_SA_PN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_LOWESTPN, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "lowestPN", "-l", "", 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", "", IPMACSEC_CMD_SECY_NO_HELP, IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX }, { IPMACSEC_CMD_SECY_ARG_AN, IPMACSEC_CMD_SECY_ARG_MANDATORY, "association_number", "-an", "", IPMACSEC_CMD_SECY_AN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_REF_ID, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "reference", "-r", "", 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", "", IPMACSEC_CMD_SECY_NO_HELP, IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX }, { IPMACSEC_CMD_SECY_ARG_AN, IPMACSEC_CMD_SECY_ARG_MANDATORY, "association_number", "-an", "", IPMACSEC_CMD_SECY_AN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_REF_ID, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "reference", "-r", "", 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", "", IPMACSEC_CMD_SECY_SA_PN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_LOWESTPN, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "updtLowestPN", "-l", "", 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", "", IPMACSEC_CMD_SECY_NO_HELP, IPMACSEC_CMD_SECY_NOTE_SCI_SYNTAX }, { IPMACSEC_CMD_SECY_ARG_AN, IPMACSEC_CMD_SECY_ARG_MANDATORY, "association_number", "-an", "", IPMACSEC_CMD_SECY_AN_HELP, IPMACSEC_CMD_SECY_NO_HELP }, { IPMACSEC_CMD_SECY_ARG_REF_ID, IPMACSEC_CMD_SECY_ARG_OPTIONAL, "reference", "-r", "", 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", "", 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", "", "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", "", "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 "); 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 10)) return IPMACSEC_LMIERR_INVALID_PARAMETER; for (i=0;i 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 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