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