/* FILE NAME: air_cmd.c | |
* PURPOSE: | |
* Define the command line function in AIR SDK. | |
* NOTES: | |
*/ | |
/* INCLUDE FILE DECLARATIONS | |
*/ | |
#include "air.h" | |
/* NAMING CONSTANT DECLARATIONS | |
*/ | |
/* MACRO FUNCTION DECLARATIONS | |
*/ | |
#define MAC_STR "%02X%02X%02X%02X%02X%02X" | |
#define MAC2STR(m) (m)[0],(m)[1],(m)[2],(m)[3],(m)[4],(m)[5] | |
#define AIR_MAC_LEN (12) | |
#define CMD_NO_PARA (0xFFFFFFFF) | |
#define CMD_VARIABLE_PARA (0xFFFFFFFE) | |
#define L2_WDOG_KICK_NUM (100) | |
#define TOLOWER(x) ((x) | 0x20) | |
#define isxdigit(c) (('0' <= (c) && (c) <= '9') || ('a' <= (c) && (c) <= 'f') || ('A' <= (c) && (c) <= 'F')) | |
#define isdigit(c) ('0' <= (c) && (c) <= '9') | |
#define CMD_CHECK_PARA(__shift__, __op__, __size__) do \ | |
{ \ | |
if ((__shift__) __op__ (__size__)) \ | |
{ \ | |
; \ | |
} \ | |
else \ | |
{ \ | |
return (AIR_E_BAD_PARAMETER); \ | |
} \ | |
} while(0) | |
/* DATA TYPE DECLARATIONS | |
*/ | |
typedef struct { | |
C8_T* name; | |
AIR_ERROR_NO_T (*func)(UI32_T argc, C8_T *argv[]); | |
UI32_T argc_min; | |
C8_T* argc_errmsg; | |
} AIR_CMD_T; | |
/* GLOBAL VARIABLE DECLARATIONS | |
*/ | |
/* LOCAL SUBPROGRAM DECLARATIONS | |
*/ | |
/* String Utility */ | |
static BOOL_T _strcmp(const char *s1, const char *s2); | |
static C8_T * _strtok_r(C8_T *s, const C8_T *delim, C8_T **last); | |
static C8_T * _strtok(C8_T *s, const C8_T *delim, C8_T **last); | |
UI32_T _strtoul(const C8_T *cp, C8_T **endp, UI32_T base); | |
static I32_T _strtol(const C8_T *cp, C8_T **endp, UI32_T base); | |
/* Type Converter */ | |
static AIR_ERROR_NO_T _str2mac(C8_T *str, C8_T *mac); | |
static AIR_ERROR_NO_T _hex2bit(const UI32_T hex, UI32_T *ptr_bit); | |
static AIR_ERROR_NO_T _hex2bitstr(const UI32_T hex, C8_T *ptr_bit_str, UI32_T str_len); | |
static AIR_ERROR_NO_T _portListStr2Ary(const C8_T *str, UI32_T *ary, const UI32_T ary_num); | |
/* Register Operation */ | |
static AIR_ERROR_NO_T doRegRead(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doRegWrite(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doReg(UI32_T argc, C8_T *argv[]); | |
/* PHY Operation */ | |
static AIR_ERROR_NO_T doPhyCL22Read(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPhyCL22Write(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPhyCL22(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPhyCL45Read(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPhyCL45Write(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPhyCL45(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPhy(UI32_T argc, C8_T *argv[]); | |
/* Porting setting */ | |
static AIR_ERROR_NO_T doPortSetMatrix(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortSetVlanMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortGetMatrix(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortGetVlanMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPort(UI32_T argc, C8_T *argv[]); | |
/* Vlan setting */ | |
static AIR_ERROR_NO_T doVlanInitiate(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanCreate(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanDestroy(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanDestroyAll(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanDump(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanAddPortMem(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanDelPortMem(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetFid(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetMemPort(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetIVL(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetPortBaseStag(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetStag(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetEgsTagCtlEn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetEgsTagCtlCon(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetEgsTagCtl(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetPortActFrame(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetLeakyVlanEn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetPortVlanAttr(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetIgsPortETagAttr(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetPortETagAttr(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetPortOuterTPID(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSetPvid(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanGetPortActFrame(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanGetLeakyVlanEn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanGetPortVlanAttr(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanGetIgsPortETagAttr(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanGetPortETagAttr(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanGetPortOuterTPID(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanGetPvid(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlanGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doVlan(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doFlowCtrl(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doJumbo(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doL2Add(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doL2Del(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doL2Clear(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doL2Get(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doL2Set(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doL2Dump(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doL2(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAnMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLocalAdv(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doRemoteAdv(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortSpeed(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortDuplex(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortStatus(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortBckPres(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortPsMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortSmtSpdDwn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortSpTag(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortEnable(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPort5GBaseRMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortHsgmiiMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortSgmiiMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortRmiiMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doPortRgmiiMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSptagEn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSptagMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSptagDecode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSptagEncode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSptag(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMacAddr(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T _printMacEntry(AIR_MAC_ENTRY_T * mt, UI32_T age_unit, UI8_T count, UI8_T title); | |
static AIR_ERROR_NO_T doGetMacAddr(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMacAddrAgeOut(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doDumpMacAddr(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLagMember(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLagMemberCnt(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLagPtseed(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLagHashtype(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLagDstInfo(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLagState(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLagSpsel(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLagGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLagSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLag(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doStpPortstate(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doStpGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doStpSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doStp(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirrorGetSid(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirrorDelSid(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirrorAddRlist(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirrorAddTlist(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirrorSetSessionEnable(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirrorSetSession(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirrorSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirrorAdd(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirrorGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirrorDel(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMirror(UI32_T argc,C8_T *argv[]); | |
static AIR_ERROR_NO_T doMibClearPort(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMibClearAcl(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMibGetPort(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMibGetAcl(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMibClear(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMibGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doMib(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQosScheduleAlgo(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQosTrustMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQosPri2Queue(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQosDscp2Pri(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQosRateLimitEnable(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQosRateLimit(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQosPortPriority(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQosRateLimitExMngFrm(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQosGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQosSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doQos(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doDiagTxComply(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doDiagSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doDiagGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doDiag(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLedMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLedState(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLedUsrDef(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLedBlkTime(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLedSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLedGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doLed(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSwitchCpuPortEn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSwitchCpuPort(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSwitchPhyLCIntrEn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSwitchPhyLCIntrSts(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSwitchSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSwitchGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSwitch(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doShowVersion(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doShow(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doStormEnable(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doStormRate(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doFldMode(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSaLearning(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSaLimit(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSecGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSecSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doSec(UI32_T argc, C8_T *argv[]); | |
static void _air_acl_printRuleMap(UI32_T *rule_map, UI32_T ary_num); | |
static AIR_ERROR_NO_T doAclEn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclRule(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclUdfRule(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclRmvRule(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclRmvUdfRule(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclAction(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclRmvAction(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclDumpAction(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclTrtcm(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclTrtcmEn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclRmvTrtcm(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclPortEn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclDropEn(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclDropThrsh(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclDropPbb(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclMeter(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclDump(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclSet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclGet(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclDel(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAclClear(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T doAcl(UI32_T argc, C8_T *argv[]); | |
static AIR_ERROR_NO_T subcmd(const AIR_CMD_T tab[], UI32_T argc, C8_T *argv[]); | |
/* STATIC VARIABLE DECLARATIONS | |
*/ | |
const static C8_T *_sptag_vpm[] = | |
{ | |
"untagged", | |
"8100", | |
"predefined", | |
"unknown" | |
}; | |
const static C8_T *_sptag_pt[] = | |
{ | |
"disable pass through", | |
"enable pass through" | |
}; | |
const static C8_T *_air_mac_address_forward_control_string [] = | |
{ | |
"Default", | |
"CPU include", | |
"CPU exclude", | |
"CPU only", | |
"Drop" | |
}; | |
static AIR_CMD_T regCmds[] = | |
{ | |
{"r", doRegRead, 1, "reg r <reg(4'hex)>"}, | |
{"w", doRegWrite, 2, "reg w <reg(4'hex)> <value(8'hex)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T phyCL22Cmds[] = | |
{ | |
{"r", doPhyCL22Read, 2, "phy cl22 r <port(0..4)> <reg(2'hex)>"}, | |
{"w", doPhyCL22Write, 3, "phy cl22 w <port(0..4)> <reg(2'hex)> <value(4'hex)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T phyCL45Cmds[] = | |
{ | |
{"r", doPhyCL45Read, 3, "phy cl45 r <port(0..4)> <dev(2'hex)> <reg(3'hex)>"}, | |
{"w", doPhyCL45Write, 4, "phy cl45 w <port(0..4)> <dev(2'hex)> <reg(3'hex)> <value(4'hex)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T phyCmds[] = | |
{ | |
{"cl22", doPhyCL22, 0, NULL}, | |
{"cl45", doPhyCL45, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T portSetCmds[] = | |
{ | |
{"matrix", doPortSetMatrix, 2, "port set matrix <port(0..6)> <matrix(6:0)>"}, | |
{"vlanMode", doPortSetVlanMode, 2, "port set vlanMode <port(0..6)> <vlanMode(0:matrix,1:fallback,2:check,3:security)>"}, | |
{"flowCtrl", doFlowCtrl, 3, "port set flowCtrl <port(0..6)> <dir(0:Tx,1:Rx)> <fc_en(1:En,0:Dis)>"}, | |
{"jumbo", doJumbo, 2, "port set jumbo <pkt_len(0:1518,1:1536,2:1552,3:max)> <frame_len(2..15)>"}, | |
{"anMode", doAnMode, 2, "port set anMode <port(0..4)> <en(0:force,1:AN)>"}, | |
{"localAdv", doLocalAdv, 7, "port set localAdv <port(0..4)> <10H(1:En,0:Dis)> <10F(1:En,0:Dis)> <100H(1:En,0:Dis)> <100F(1:En,0:Dis)> <1000F(1:En,0:Dis)> <pause(1:En,0:Dis)>"}, | |
{"speed", doPortSpeed, 2, "port set speed <port(0..4)> <speed(0:10M,1:100M,2:1G,3:2.5G)>"}, | |
{"duplex", doPortDuplex, 2, "port set duplex <port(0..4)> <duplex(0:half,1:full)>"}, | |
{"bckPres", doPortBckPres, 2, "port set bckPres <port(0..6)> <bckPres(1:En,0:Dis)>"}, | |
{"psMode", doPortPsMode, 3, "port set psMode <port(0..4)> <ls(1:En,0:Dis)> <eee(1:En,0:Dis)>"}, | |
{"smtSpdDwn", doPortSmtSpdDwn, 3, "port set smtSpdDwn <port(0..4)> <en(1:En,0:Dis)> <retry(2..5)>"}, | |
{"spTag", doPortSpTag, 2, "port set spTag <port(0..6)> <en(1:En,0:Dis)>"}, | |
{"enable", doPortEnable, 2, "port set enable <port(0..4)> <en(1:En,0:Dis)>"}, | |
{"5GBaseRMode", doPort5GBaseRMode, CMD_NO_PARA, "port set 5GBaseRMode"}, | |
{"hsgmiiMode", doPortHsgmiiMode, CMD_NO_PARA, "port set hsgmiiMode"}, | |
{"sgmiiMode", doPortSgmiiMode, 2, "port set sgmiiMode <mode(0:AN,1:Force)> <speed(0:10M,1:100M,2:1G)>"}, | |
{"rmiiMode", doPortRmiiMode, 1, "port set rmiiMode <speed(0:10M,1:100M)>"}, | |
{"rgmiiMode", doPortRgmiiMode, 1, "port set rgmiiMode <speed(0:10M,1:100M,2:1G)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T portGetCmds[] = | |
{ | |
{"matrix", doPortGetMatrix, 1, "port get matrix <port(0..6)>"}, | |
{"vlanMode", doPortGetVlanMode, 1, "port get vlanMode <port(0..6)>"}, | |
{"flowCtrl", doFlowCtrl, 2, "port get flowCtrl <port(0..6)> <dir(0:Tx,1:Rx)>"}, | |
{"jumbo", doJumbo, CMD_NO_PARA, "port get jumbo"}, | |
{"anMode", doAnMode, 1, "port get anMode <port(0..4)>"}, | |
{"localAdv", doLocalAdv, 1, "port get localAdv <port(0..4)>"}, | |
{"remoteAdv", doRemoteAdv, 1, "port get remoteAdv <port(0..4)>"}, | |
{"speed", doPortSpeed, 1, "port get speed <port(0..4)>"}, | |
{"duplex", doPortDuplex, 1, "port get duplex <port(0..4)>"}, | |
{"status", doPortStatus, 1, "port get status <port(0..4)>"}, | |
{"bckPres", doPortBckPres, 1, "port get bckPres <port(0..6)>"}, | |
{"psMode", doPortPsMode, 1, "port get psMode <port(0..4)>"}, | |
{"smtSpdDwn", doPortSmtSpdDwn, 1, "port get smtSpdDwn <port(0..4)>"}, | |
{"spTag", doPortSpTag, 1, "port get spTag <port(0..6)>"}, | |
{"enable", doPortEnable, 1, "port get enable <port(0..4)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T portCmds[] = | |
{ | |
{"set", doPortSet, 0, NULL}, | |
{"get", doPortGet, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T sptagCmds[] = | |
{ | |
{"setEnable", doSptagEn, 2, "sptag setEnable port<port(0..6)> enable<1:enable 0:disable>"}, | |
{"getEnable", doSptagEn, 1, "sptag getEnable port<port(0..6)>"}, | |
{"setmode", doSptagMode, 2, "sptag setmode port<port(0..6)> mode<0:inset 1:replace>"}, | |
{"getmode", doSptagMode, 1, "sptag getmode port<port(0..6)>"}, | |
{"encode", doSptagEncode, 7, "sptag encode mode={ insert | replace } opc={ portmap | portid | lookup } dp={bitimap hex} vpm={ untagged | 8100 | 88a8 } pri=<UINT> cfi=<UINT> vid=<UINT> "}, | |
{"decode", doSptagDecode, 4, "sptag decode <byte(hex)> <byte(hex)> <byte(hex)> <byte(hex)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T vlanSetCmds[] = | |
{ | |
{"fid", doVlanSetFid, 2, "vlan set fid <vid(0..4095)> <fid(0..7)>"}, | |
{"memPort", doVlanSetMemPort, 2, "vlan set memPort <vid(0..4095)> <bitmap(6:0)>"}, | |
{"ivl", doVlanSetIVL, 2, "vlan set ivl <vid(0..4095)> <(1:En,0:Dis)>"}, | |
{"portBaseStag", doVlanSetPortBaseStag, 2, "vlan set portBaseStag <vid(0..4095)> <(1:En,0:Dis)>"}, | |
{"stag", doVlanSetStag, 2, "vlan set stag <vid(0..4095)> <stag(0..4095)>"}, | |
{"egsTagCtlEn", doVlanSetEgsTagCtlEn, 2, "vlan set egsTagCtlEn <vid(0..4095)> <(1:En,0:Dis)>"}, | |
{"egsTagCtlCon", doVlanSetEgsTagCtlCon, 2, "vlan set egsTagCtlCon <vid(0..4095)> <(1:En,0:Dis)>"}, | |
{"egsTagCtl", doVlanSetEgsTagCtl, 3, "vlan set egsTagCtl <vid(0..4095)> <port(0..6)> <ctlType(0:untag,2:tagged)>"}, | |
{"portActFrame", doVlanSetPortActFrame, 2, "vlan set portActFrame <port(0..6)> <frameType(0:all,1:tagged,2:untagged)>"}, | |
{"leakyVlanEn", doVlanSetLeakyVlanEn, 3, "vlan set LeakyVlanEn <port(0..6)> <pktType(0:uc,1:mc,2:bc,3:ipmc)> <(1:En,0:Dis)>"}, | |
{"portVlanAttr", doVlanSetPortVlanAttr, 2, "vlan set portVlanAttr <port(0..6)> <vlanAttr(0:user,1:stack,2:translation,3:transparent)>"}, | |
{"igsPortETagAttr", doVlanSetIgsPortETagAttr, 2, "vlan set igsPortETagAttr <port(0..6)> <egsTagAttr(0:disable,1:consistent,4:untagged,5:swap,6:tagged,7:stack)>"}, | |
{"portEgsTagAttr", doVlanSetPortETagAttr, 2, "vlan set portEgsTagAttr <port(0..6)> <egsTagAttr(0:untagged,1:swap,2:tagged,3:stack)>"}, | |
{"portOuterTPID", doVlanSetPortOuterTPID, 2, "vlan set portOuterTPID <port(0..6)> <TPID(hex)>"}, | |
{"pvid", doVlanSetPvid, 2, "vlan set pvid <port(0..6)> <vid(0..4095)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T vlanGetCmds[] = | |
{ | |
{"portActFrame", doVlanGetPortActFrame, 1, "vlan get portActFrame <port(0..6)>"}, | |
{"leakyVlanEn", doVlanGetLeakyVlanEn, 1, "vlan get leakyVlanEn <port(0..6)>"}, | |
{"portVlanAttr", doVlanGetPortVlanAttr, 1, "vlan get portVlanAttr <port(0..6)>"}, | |
{"igsPortETagAttr", doVlanGetIgsPortETagAttr, 1, "vlan get igsPortETagAttr <port(0..6)>"}, | |
{"portEgsTagAttr", doVlanGetPortETagAttr, 1, "vlan get portEgsTagAttr <port(0..6)>"}, | |
{"portOuterTPID", doVlanGetPortOuterTPID, 1, "vlan get portOuterTPID <port(0..6)>"}, | |
{"pvid", doVlanGetPvid, 1, "vlan get pvid <port(0..6)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T vlanCmds[] = | |
{ | |
{"initiate", doVlanInitiate, 9, "vlan initiate <vid(0..4095)> <fid(0..7)> <bitmap(6:0)> <ivl(1:En,0:Dis)> <portbasestag(1:En,0:Dis)> <stag(0..4095)> <egstagctlen(1:En,0:Dis)> <egstagcon(1:En,0:Dis)> <taggedbitmap(6:0)>"}, | |
{"create", doVlanCreate, 1, "vlan create <vid(0..4095)>"}, | |
{"destroy", doVlanDestroy, 1, "vlan destroy [ <vid(0..4095)> | <vidRange(vid0-vid1)> ]"}, | |
{"destroyAll", doVlanDestroyAll, 0, "vlan destroyAll [ <restoreDefVlan(0:false,1:true)> | ]"}, | |
{"dump", doVlanDump, 0, "vlan dump [ <vid(0..4095)> | <vidRange(vid0-vid1)> | ]"}, | |
{"addPortMem", doVlanAddPortMem, 2, "vlan addPortMem <vid(0..4095)> <port(0..6)>"}, | |
{"delPortMem", doVlanDelPortMem, 2, "vlan addPortMem <vid(0..4095)> <port(0..6)>"}, | |
{"set", doVlanSet, 0, NULL}, | |
{"get", doVlanGet, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T l2ClearCmds[] = | |
{ | |
{"mac", doMacAddr, CMD_NO_PARA, "l2 clear mac"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T l2DelCmds[] = | |
{ | |
{"mac", doMacAddr, 3, "l2 del mac <mac(12'hex)> [ vid <vid(0..4095)> | fid <fid(0..15)> ]"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T l2AddCmds[] = | |
{ | |
{"mac", doMacAddr, 7, "l2 add mac <static(0:dynamic,1:static)> <unauth(0:auth,1:unauth)> <mac(12'hex)> <portlist(uintlist)> [ vid <vid(0..4095)> | fid <fid(0..15)> ] <src_mac_forward=(0:default,1:cpu-exclude,2:cpu-include,3:cpu-only,4:drop)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T l2SetCmds[] = | |
{ | |
{"macAddrAgeOut", doMacAddrAgeOut, 1, "l2 set macAddrAgeOut <time(1, 1000000)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T l2GetCmds[] = | |
{ | |
{"mac", doGetMacAddr, 3, "l2 get mac <mac(12'hex)> [ vid <vid(0..4095)> | fid <fid(0..15)> ]"}, | |
{"macAddrAgeOut", doMacAddrAgeOut, CMD_NO_PARA, "l2 get macAddrAgeOut"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T l2DumpCmds[] = | |
{ | |
{"mac", doDumpMacAddr, 0, "l2 dump mac"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T l2Cmds[] = | |
{ | |
{"add", doL2Add, 0, NULL}, | |
{"del", doL2Del, 0, NULL}, | |
{"clear", doL2Clear, 0, NULL}, | |
{"get", doL2Get, 0, NULL}, | |
{"set", doL2Set, 0, NULL}, | |
{"dump", doL2Dump, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T lagGetCmds[] = | |
{ | |
{"member", doLagMember, 1, "lag get member group_id(0 or 1)"}, | |
{"dstInfo", doLagDstInfo, CMD_NO_PARA, "lag get dstInfo"}, | |
{"ptseed", doLagPtseed, CMD_NO_PARA, "lag get ptseed"}, | |
{"hashtype", doLagHashtype, CMD_NO_PARA, "lag get hashtype"}, | |
{"state", doLagState, CMD_NO_PARA, "lag get state"}, | |
{"spsel", doLagSpsel, CMD_NO_PARA, "lag get spsel"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T lagSetCmds[] = | |
{ | |
{"member", doLagMember, 4, "lag set member <group_id(0 or 1)> <member_index(0..3)> <enable(0,1)> <port index(0..6)>"}, | |
{"dstInfo", doLagDstInfo, 7, "lag set dstInfo <sp(1:En,0:Dis)> <sa(1:En,0:Dis)> <da(1:En,0:Dis)> <sip(1:En,0:Dis)> <dip(1:En,0:Dis)> <sport(1:En,0:Dis)> <dport(1:En,0:Dis)>"}, | |
{"ptseed", doLagPtseed, 1, "lag set ptseed <hex32>"}, | |
{"hashtype", doLagHashtype, 1, "lag set hashtype <0-crc32lsb;1-crc32msb;2-crc16;3-xor4>"}, | |
{"state", doLagState, 1, "lag set state <state(1:En,0:Dis)>"}, | |
{"spsel", doLagSpsel, 1, "lag set spsel <soure port enable(1:En,0:Dis)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T lagCmds[] = | |
{ | |
{"get", doLagGet, 0, NULL}, | |
{"set", doLagSet, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T stpGetCmds[] = | |
{ | |
{"portstate", doStpPortstate, 2, "stp get portstate <port(0..6)> <fid(0..15)>"}, | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T stpSetCmds[] = | |
{ | |
{"portstate", doStpPortstate, 3, "stp set portstate <port(0..6)> <fid(0..15)> <state(0:disable,1:listen,2:learn,3:forward)>"}, | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T stpCmds[] = | |
{ | |
{"get", doStpGet, 0, NULL}, | |
{"set", doStpSet, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T mirrorSetCmds[] = | |
{ | |
{"session", doMirrorSetSession, 6, "mirror set session <sid(0,1)> <dst_port(UINT)> <state(1:En,0:Dis)> <tag(1:on, 0:off)> <list(UINTLIST)> <dir(0:none,1:tx,2:rx,3:both)>"}, | |
{"session-enable", doMirrorSetSessionEnable, 2, "mirror set session-enable <sid(0,1)> <state(1:En,0:Dis)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T mirrorAddCmds[] = | |
{ | |
{"session-rlist", doMirrorAddRlist, 2, "mirror add session-rlist <sid(0,1)> <list(UINTLIST)>"}, | |
{"session-tlist", doMirrorAddTlist, 2, "mirror add session-tlist <sid(0,1)> <list(UINTLIST)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T mirrorGetCmds[] = | |
{ | |
{"session", doMirrorGetSid, 1, "mirror get session <sid(0,1)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T mirrorDelCmds[] = | |
{ | |
{"session", doMirrorDelSid, 1, "mirror del session <sid(0,1)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T mirrorCmds[] = | |
{ | |
{"set", doMirrorSet, 0, NULL}, | |
{"add", doMirrorAdd, 0, NULL}, | |
{"get", doMirrorGet, 0, NULL}, | |
{"del", doMirrorDel, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T mibClearCmds[] = | |
{ | |
{"port", doMibClearPort, 1, "mib clear port <port(0..6)>"}, | |
{"all", doMibClearPort, 0, "mib clear all"}, | |
{"acl", doMibClearAcl, 0, "mib clear acl"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T mibGetCmds[] = | |
{ | |
{"port", doMibGetPort, 1, "mib get port <port(0..6)>"}, | |
{"acl", doMibGetAcl, 1, "mib get acl <event(0..7)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T mibCmds[] = | |
{ | |
{"clear", doMibClear, 0, NULL}, | |
{"get", doMibGet, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T qosGetCmds[] = | |
{ | |
{"scheduleAlgo", doQosScheduleAlgo, 2, "qos get scheduleAlgo <portlist(UINTLIST)> <queue(UINT)>"}, | |
{"trustMode", doQosTrustMode, 1, "qos get trustMode <portlist(UINTLIST)>"}, | |
{"pri2Queue", doQosPri2Queue, 0, "qos get pri2Queue"}, | |
{"dscp2Pri", doQosDscp2Pri, 1, "qos get dscp2Pri <dscp(0..63)>"}, | |
{"rateLimitEnable", doQosRateLimitEnable, 1, "qos get rateLimitEnable <portlist(UINTLIST)>"}, | |
{"rateLimit", doQosRateLimit, 1, "qos get rateLimit <portlist(UINTLIST)>"}, | |
{"portPriority", doQosPortPriority, 1, "qos get portPriority <portlist(UINTLIST)>"}, | |
{"rateLmtExMngFrm", doQosRateLimitExMngFrm, 0, "qos get rateLmtExMngFrm"}, | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T qosSetCmds[] = | |
{ | |
{"scheduleAlgo", doQosScheduleAlgo, 4, "qos set scheduleAlgo <portlist(UINTLIST)> <queue(UINT)> <scheduler(0:SP,1:WRR,2:WFQ)> <weight(0..128)>, weight 0 is valid only on sp mode"}, | |
{"trustMode", doQosTrustMode, 2, "qos set trustMode <portlist(UINTLIST)> <mode(0:port,1:1p-port,2:dscp-port,3:dscp-1p-port>"}, | |
{"pri2Queue", doQosPri2Queue, 2, "qos set pri2Queue <priority(0..7)> <queue(0..7)>"}, | |
{"dscp2Pri", doQosDscp2Pri, 2, "qos set dscp2Pri <dscp(0..63)> <priority(0..7)>"}, | |
{"rateLimitEnable", doQosRateLimitEnable, 3, "qos set rateLimitEnable <portlist(UINTLIST)> <dir(0:egress,1:ingress)> <rate_en(1:En,0:Dis)>"}, | |
{"rateLimit", doQosRateLimit, 5, "qos set rateLimit <portlist(UINTLIST)> <I_CIR(0..80000)> <I_CBS(0..127)> <E_CIR(0..80000)> <E_CBS(0..127)>"}, | |
{"portPriority", doQosPortPriority, 2, "qos set portPriority <portlist(UINTLIST)> <priority(0..7)>"}, | |
{"rateLmtExMngFrm", doQosRateLimitExMngFrm, 2, "qos set rateLmtExMngFrm <dir(0:egress)> <en(0:include,1:exclude)>"}, | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T qosCmds[] = | |
{ | |
{"get", doQosGet, 0, NULL}, | |
{"set", doQosSet, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T diagSetCmds[] = | |
{ | |
{"txComply", doDiagTxComply, 2, "diag set txComply <phy(0..5)> <mode(0..8)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T diagGetCmds[] = | |
{ | |
{"txComply", doDiagTxComply, 1, "diag get txComply <phy(0..5)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T diagCmds[] = | |
{ | |
{"set", doDiagSet, 0, NULL}, | |
{"get", doDiagGet, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T ledSetCmds[] = | |
{ | |
{"mode", doLedMode, 1, "led set mode <mode(0:disable, 1..3:2 LED, 4:user-define)>"}, | |
{"state", doLedState, 2, "led set state <led(0..1)> <state(1:En,0:Dis)>"}, | |
{"usr", doLedUsrDef, 4, "led set usr <led(0..1)> <polarity(0:low, 1:high)> <on_evt(7'bin)> <blink_evt(10'bin)>"}, | |
{"time", doLedBlkTime, 1, "led set time <time(0..5:32ms~1024ms)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T ledGetCmds[] = | |
{ | |
{"mode", doLedMode, CMD_NO_PARA, "led get mode"}, | |
{"state", doLedState, 1, "led get state <led(0..1)>"}, | |
{"usr", doLedUsrDef, 1, "led get usr <led(0..1)>"}, | |
{"time", doLedBlkTime, CMD_NO_PARA, "led get time"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T ledCmds[] = | |
{ | |
{"set", doLedSet, 0, NULL}, | |
{"get", doLedGet, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T showCmds[] = | |
{ | |
{"version", doShowVersion, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T secGetCmds[] = | |
{ | |
{"stormEnable", doStormEnable, 2, "sec get stormEnable <port(0..6)> <type(0:bcst,1:mcst,2:ucst)>"}, | |
{"stormRate", doStormRate, 2, "sec get stormRate <port(0..6)> <type(0:bcst,1:mcst,2:ucst)>"}, | |
{"fldMode", doFldMode, 2, "sec get fldMode <port(0..6)> <type(0:bcst,1:mcst,2:ucst,3:qury>"}, | |
{"saLearning", doSaLearning, 1, "sec get saLearning <port(0..6)>"}, | |
{"saLimit", doSaLimit, 1, "sec get saLimit <port(0..6)>"}, | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T secSetCmds[] = | |
{ | |
{"stormEnable", doStormEnable, 3, "sec set stormEnable <port(0..6)> <type(0:bcst,1:mcst,2:ucst)> <en(1:En,0:Dis)>"}, | |
{"stormRate", doStormRate, 4, "sec set stormRate <port(0..6)> <type(0:bcst,1:mcst,2:ucst)> <count(0..255)> <unit(0:64k,1:256k,2:1M,3:4M,4:16M)>"}, | |
{"fldMode", doFldMode, 3, "sec set fldMode <port(0..6)> <type(0:bcst,1:mcst,2:ucst,3:qury> <en(1:En,0:Dis)>"}, | |
{"saLearning", doSaLearning, 2, "sec set saLearning <port(0..6)> <learn(0:disable,1:enable)>"}, | |
{"saLimit", doSaLimit, 3, "sec set saLimit <port(0..6)> <mode(0:disable,1:enable)> <count(0..4095)>"}, | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T secCmds[] = | |
{ | |
{"get", doSecGet, 0, NULL}, | |
{"set", doSecSet, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T switchSetCmds[] = | |
{ | |
{"cpuPortEn", doSwitchCpuPortEn, 1, "switch set cpuPortEn <cpu_en(1:En,0:Dis)>"}, | |
{"cpuPort", doSwitchCpuPort, 1, "switch set cpuPort <port_number>"}, | |
{"phyLCIntrEn", doSwitchPhyLCIntrEn, 2, "switch set phyLCIntrEn <phy(0..6)> <(1:En,0:Dis)>"}, | |
{"phyLCIntrSts", doSwitchPhyLCIntrSts, 2, "switch set phyLCIntrSts <phy(0..6)> <(1:Clear)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T switchGetCmds[] = | |
{ | |
{"cpuPortEn", doSwitchCpuPortEn, CMD_NO_PARA, "switch get cpuPortEn"}, | |
{"cpuPort", doSwitchCpuPort, CMD_NO_PARA, "switch get cpuPort"}, | |
{"phyLCIntrEn", doSwitchPhyLCIntrEn, 1, "switch get phyLCIntrEn <phy(0..6)>"}, | |
{"phyLCIntrSts", doSwitchPhyLCIntrSts, 1, "switch get phyLCIntrSts <phy(0..6)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T switchCmds[] = | |
{ | |
{"set", doSwitchSet, 0, NULL}, | |
{"get", doSwitchGet, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T aclSetCmds[] = | |
{ | |
{"en", doAclEn, 1, "acl set en <en(1:En,0:Dis)>"}, | |
{"rule", doAclRule, CMD_VARIABLE_PARA, "acl set rule <idx(0..127)>\n <state(0:Dis,1:En)> <reverse(0:Dis,1:En)> <end(0:Dis,1:En)>\n <portmap(7'bin)><ipv6(0:Dis,1:En,2:Not care)>\n[ dmac <dmac(12'hex)> <dmac_mask(12'hex)> ]\n[ smac <smac(12'hex)> <smac_mask(12'hex)> ]\n[ stag <stag(4'hex)> <stag_mask(4'hex)> ]\n[ ctag <ctag(4'hex)> <ctag_mask(4'hex)> ]\n[ etype <etype(4'hex)> <etype_mask(4'hex)> ]\n[ dip <dip(IPADDR)> <dip_mask(IPADDR)> ]\n[ sip <sip(IPADDR)> <sip_mask(IPADDR)> ]\n[ dscp <dscp(2'hex)> <dscp_mask(2'hex)> ]\n[ protocol <protocol(12'hex)> <protocol_mask(12'hex)> ]\n[ dport <dport(4'hex)> <dport_mask(4'hex)> ]\n[ sport <sport(4'hex)> <sport_mask(4'hex)> ]\n[ flow_label <flow_label(4'hex)> <flow_label_mask(4'hex)> ]\n[ udf <udf(4'hex)> <udf_mask(4'hex)> ] "}, | |
{"udfRule", doAclUdfRule, 7, "acl set udfRule <idx(0..15)> <mode(0:pattern, 1:threshold)> [ <pat(4'hex)> <mask(4'hex)> | <low(4'hex)> <high(4'hex)> ] <start(0:MAC header, 1:L2 payload, 2:IPv4 header, 3:IPv6 header, 4:L3 payload, 5:TCP header, 6:UDP header, 7: L4 payload)> <offset(0..127,unit:2 bytes)> <portmap(7'bin)>"}, | |
{"action", doAclAction, CMD_VARIABLE_PARA, "acl set action <idx(0..127)> \n[ forward <forward(0:Default,4:Exclude CPU,5:Include CPU,6:CPU only,7:Drop)> ]\n[ egtag <egtag(0:Default,1:Consistent,4:Untag,5:Swap,6:Tag,7:Stack)> ]\n[ mirrormap <mirrormap(2'bin)> ]\n[ priority <priority(0..7)> ]\n[ redirect <redirect(0:Dst,1:Vlan)> <portmap(7'bin)> ]\n[ leaky_vlan <leaky_vlan(1:En,0:Dis)> ]\n[ cnt_idx <cnt_idx(0..63)> ]\n[ rate_idx <rate_idx(0..31)> ] \n[ attack_idx <attack_idx(0..95)> ] \n[ vid <vid(0..4095)> ] \n[ manage <manage(1:En,0:Dis)> ] \n[ bpdu <bpdu(1:En,0:Dis)> ]\n[ class <class(0:Original,1:Defined)>[0..7] ]\n[ drop_pcd <drop_pcd(0:Original,1:Defined)> [red <red(0..7)>][yellow <yellow(0..7)>][green <green(0..7)>] ]\n[ color <color(0:Defined,1:Trtcm)> [ <defined_color(0:Dis,1:Green,2:Yellow,3:Red)> | <trtcm_idx(0..31)> ] ]"}, | |
{"trtcm", doAclTrtcm, 5, "acl set trtcm <idx(1..31)> <cir(4'hex)> <pir(4'hex)> <cbs(4'hex)> <pbs(4'hex)>"}, | |
{"trtcmEn", doAclTrtcmEn, 1, "acl set trtcmEn <en(1:En,0:Dis)>"}, | |
{"portEn", doAclPortEn, 2, "acl set portEn <port(0..6)> <en(1:En,0:Dis)>"}, | |
{"dropEn", doAclDropEn, 2, "acl set dropEn <port(0..6)> <en(1:En,0:Dis)>"}, | |
{"dropThrsh", doAclDropThrsh, 5, "acl set dropThrsh <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> <high(0..2047)> <low(0..2047)>"}, | |
{"dropPbb", doAclDropPbb, 4, "acl set dropPbb <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> <probability(0..1023)>"}, | |
{"meter", doAclMeter, 3, "acl set meter <idx(0..31)> <en(1:En,0:Dis)> <rate(0..65535)>\n Note: Limit rate = rate * 64Kbps"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T aclGetCmds[] = | |
{ | |
{"en", doAclEn, CMD_NO_PARA, "acl get en"}, | |
{"rule", doAclRule, 1, "acl get rule <idx(0..127)> "}, | |
{"udfRule", doAclUdfRule, 1, "acl get udfRule <idx(0..15)>"}, | |
{"action", doAclAction, 1, "acl get action <idx(0..127)>"}, | |
{"trtcm", doAclTrtcm, 1, "acl get trtcm <idx(1..31)>"}, | |
{"trtcmEn", doAclTrtcmEn, CMD_NO_PARA, "acl get trtcmEn"}, | |
{"portEn", doAclPortEn, 1, "acl get portEn <port(0..6)>"}, | |
{"dropEn", doAclDropEn, 1, "acl get dropEn <port(0..6)>"}, | |
{"dropThrsh", doAclDropThrsh, 3, "acl get dropThrsh <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)>"}, | |
{"dropPbb", doAclDropPbb, 3, "acl get dropPbb <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)>"}, | |
{"meter", doAclMeter, 1, "acl get meter <idx(0..31)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T aclDelCmds[] = | |
{ | |
{"rule", doAclRmvRule, 1, "acl del rule <idx(0..127)>"}, | |
{"udfRule", doAclRmvUdfRule, 1, "acl del udfRule <idx(0..15)>"}, | |
{"action", doAclRmvAction, 1, "acl del action <idx(0..127)>"}, | |
{"trtcm", doAclRmvTrtcm, 1, "acl del trtcm <idx(0..31)>"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T aclClearCmds[] = | |
{ | |
{"rule", doAclRmvRule, CMD_NO_PARA, "acl clear rule"}, | |
{"udfRule", doAclRmvUdfRule, CMD_NO_PARA, "acl clear udfRule"}, | |
{"action", doAclRmvAction, CMD_NO_PARA, "acl clear action"}, | |
{"trtcm", doAclRmvTrtcm, CMD_NO_PARA, "acl clear trtcm"}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T aclCmds[] = | |
{ | |
{"set", doAclSet, 0, NULL}, | |
{"get", doAclGet, 0, NULL}, | |
{"del", doAclDel, 0, NULL}, | |
{"clear", doAclClear, 0, NULL}, | |
{"dump", doAclDump, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
static AIR_CMD_T Cmds[] = | |
{ | |
{"reg", doReg, 0, NULL}, | |
{"phy", doPhy, 0, NULL}, | |
{"port", doPort, 0, NULL}, | |
{"vlan", doVlan, 0, NULL}, | |
{"l2", doL2, 0, NULL}, | |
{"lag", doLag, 0, NULL}, | |
{"stp", doStp, 0, NULL}, | |
{"mirror", doMirror, 0, NULL}, | |
{"mib", doMib, 0, NULL}, | |
{"qos", doQos, 0, NULL}, | |
{"diag", doDiag, 0, NULL}, | |
{"led", doLed, 0, NULL}, | |
{"switch", doSwitch, 0, NULL}, | |
{"show", doShow, 0, NULL}, | |
{"sec", doSec, 0, NULL}, | |
{"acl", doAcl, 0, NULL}, | |
{"sptag", doSptag, 0, NULL}, | |
/* last entry, do not modify this entry */ | |
{NULL, NULL, 0, NULL}, | |
}; | |
/* EXPORTED SUBPROGRAM BODIES | |
*/ | |
/* LOCAL SUBPROGRAM BODIES | |
*/ | |
static BOOL_T | |
_strcmp(const char *s1, const char *s2) | |
{ | |
while(*s1 == *s2++) | |
if (*s1++ == '\0') | |
return (0); | |
return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 -1)); | |
} | |
static C8_T * | |
_strtok_r( | |
C8_T *s, | |
const C8_T *delim, | |
C8_T **last) | |
{ | |
char *spanp; | |
int c = 0, sc = 0; | |
char *tok; | |
if (s == NULL && (s = *last) == NULL) | |
{ | |
return (NULL); | |
} | |
/* | |
* Skip (span) leading delimiters (s += strspn(s, delim), sort of). | |
*/ | |
for (;;) | |
{ | |
c = *s++; | |
spanp = (char *)delim; | |
do | |
{ | |
if (c == (sc = *spanp++)) | |
{ | |
break; | |
} | |
} while (sc != 0); | |
if (sc == 0) | |
{ | |
break; | |
} | |
} | |
if (c == 0) | |
{ /* no non-delimiter characters */ | |
*last = NULL; | |
return (NULL); | |
} | |
tok = s - 1; | |
/* | |
* Scan token (scan for delimiters: s += strcspn(s, delim), sort of). | |
* Note that delim must have one NUL; we stop if we see that, too. | |
*/ | |
for (;;) | |
{ | |
c = *s++; | |
spanp = (char *)delim; | |
do | |
{ | |
if ((sc = *spanp++) == c) | |
{ | |
if (c == 0) | |
{ | |
s = NULL; | |
} | |
else | |
{ | |
s[-1] = 0; | |
} | |
*last = s; | |
return (tok); | |
} | |
} while (sc != 0); | |
} | |
/* NOTREACHED */ | |
} | |
static C8_T * | |
_strtok( | |
C8_T *s, | |
const C8_T *delim, | |
C8_T **last) | |
{ | |
return _strtok_r(s, delim, last); | |
} | |
UI32_T | |
_strtoul( | |
const C8_T *cp, | |
C8_T **endp, | |
UI32_T base) | |
{ | |
UI32_T result = 0, value = 0; | |
if (!base) | |
{ | |
base = 10; | |
if (*cp == '0') | |
{ | |
base = 8; | |
cp++; | |
if ((TOLOWER(*cp) == 'x') && isxdigit(cp[1])) | |
{ | |
cp++; | |
base = 16; | |
} | |
} | |
} | |
else if (base == 16) | |
{ | |
if (cp[0] == '0' && TOLOWER(cp[1]) == 'x') | |
{ | |
cp += 2; | |
} | |
} | |
while (isxdigit(*cp) && | |
(value = isdigit(*cp) ? *cp-'0' : TOLOWER(*cp)-'a'+10) < base) | |
{ | |
result = result*base + value; | |
cp++; | |
} | |
if (endp) | |
{ | |
*endp = (char *)cp; | |
} | |
return result; | |
} | |
static I32_T | |
_strtol( | |
const C8_T *cp, | |
C8_T **endp, | |
UI32_T base) | |
{ | |
if(*cp=='-') | |
{ | |
return -_strtoul(cp + 1, endp, base); | |
} | |
return _strtoul(cp, endp, base); | |
} | |
static AIR_ERROR_NO_T | |
_str2mac( | |
C8_T *str, | |
C8_T *mac) | |
{ | |
UI32_T i = 0; | |
C8_T tmpstr[3]; | |
/* check str */ | |
AIR_CHECK_PTR(str); | |
AIR_PARAM_CHK(strlen(str) != AIR_MAC_LEN, AIR_E_BAD_PARAMETER); | |
AIR_CHECK_PTR(mac); | |
for(i=0; i<6; i++) | |
{ | |
strncpy(tmpstr, str+(i*2), 2); | |
tmpstr[2] = '\0'; | |
mac[i] = _strtoul(tmpstr, NULL, 16); | |
} | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
_str2ipv4( | |
const C8_T *ptr_str, | |
UI32_T *ptr_addr) | |
{ | |
UI32_T value = 0, idx = 0, shift = 0; | |
AIR_CHECK_PTR(ptr_str); | |
AIR_CHECK_PTR(ptr_addr); | |
/* e.g. 192.168.1.2, strlen = 11 */ | |
for (idx = 0; idx < strlen(ptr_str); idx++) | |
{ | |
if (('0' <= ptr_str[idx]) && ('9' >= ptr_str[idx])) | |
{ | |
value = (value * 10) + (ptr_str[idx] - '0'); | |
} | |
else if ('.' == ptr_str[idx]) | |
{ | |
CMD_CHECK_PARA(value, <, 256); /* Error: invalid value */ | |
CMD_CHECK_PARA(shift, <, 4); /* Error: mem-overwrite */ | |
*ptr_addr |= value << (24 - shift * 8); | |
shift += 1; | |
value = 0; | |
} | |
else | |
{ | |
return AIR_E_BAD_PARAMETER; /* Error: not a digit number or dot */ | |
} | |
} | |
CMD_CHECK_PARA(value, <, 256); /* Error: invalid value */ | |
CMD_CHECK_PARA(shift, ==, 3); /* Error: not an ipv4 addr */ | |
*ptr_addr |= value << (24 - shift * 8); | |
return AIR_E_OK; | |
} | |
AIR_ERROR_NO_T | |
_str2ipv6( | |
const C8_T *ptr_str, | |
UI8_T *ptr_addr) | |
{ | |
UI32_T hex_value = 0, dec_value = 0, idx = 0; | |
BOOL_T double_colon = FALSE, ipv4_compatible = FALSE; | |
UI32_T double_colon_pos = 0, last_pos = 0; | |
UI8_T tmp_ipv6[16] = {0}; | |
AIR_CHECK_PTR(ptr_str); | |
AIR_CHECK_PTR(ptr_addr); | |
/* e.g. invalid: | |
* 3ffe::c0a8:0: last cannot be colon except double-colon | |
* 3ffe:::c0a8:0 triple-colon | |
* 3ffe::c0a8::0 two double-colons | |
*/ | |
/* e.g. valid: | |
* 3ffe::c0a8:0 strlen = 12 (double-colon in middle) | |
* 3ffe:c0a8:0:: strlen = 13 (double-colon in last) | |
* ::3ffe:c0a8:0 strlen = 13 (double-colon in first) | |
* 3ffe::192.168.0.0 strlen = 17 (IPv4-compatible address) | |
*/ | |
for (idx = 0; idx < strlen(ptr_str); idx++) | |
{ | |
if (('0' <= ptr_str[idx]) && ('9' >= ptr_str[idx])) | |
{ | |
hex_value = (hex_value << 4) + (ptr_str[idx] - '0'); | |
dec_value = (dec_value * 10) + (ptr_str[idx] - '0'); | |
} | |
else if (('a' <= ptr_str[idx]) && ('f' >= ptr_str[idx])) | |
{ | |
hex_value = (hex_value << 4) + (ptr_str[idx] - 'a') + 10; | |
} | |
else if (('A' <= ptr_str[idx]) && ('F' >= ptr_str[idx])) | |
{ | |
hex_value = (hex_value << 4) + (ptr_str[idx] - 'A') + 10; | |
} | |
else if (':' == ptr_str[idx]) | |
{ | |
/* must belong to double-colon, calculate from last */ | |
if (0 == idx) | |
{ | |
continue; | |
} | |
/* not the first ch but a double-colon */ | |
else if (':' == ptr_str[idx - 1]) | |
{ | |
CMD_CHECK_PARA(double_colon, ==, FALSE); /* Error: triple-colon or two double-colons */ | |
double_colon = TRUE; | |
} | |
/* not the first ch and a double-colon */ | |
else | |
{ | |
CMD_CHECK_PARA(double_colon_pos, <, 15); /* Error: only 16 units for UI8_T */ | |
CMD_CHECK_PARA(last_pos, <, 15); /* Error: only 16 units for UI8_T */ | |
tmp_ipv6[last_pos] = (UI8_T)((hex_value >> 8) & 0xff); | |
tmp_ipv6[last_pos + 1] = (UI8_T)((hex_value >> 0) & 0xff); | |
double_colon_pos += (FALSE == double_colon)? 2 : 0; | |
last_pos += 2; | |
hex_value = 0; | |
dec_value = 0; | |
} | |
} | |
else if ('.' == ptr_str[idx]) | |
{ | |
CMD_CHECK_PARA(last_pos, <, 16); /* Error: only 16 units for UI8_T */ | |
tmp_ipv6[last_pos] = dec_value; | |
last_pos += 1; | |
dec_value = 0; | |
ipv4_compatible = TRUE; | |
} | |
else | |
{ | |
return AIR_E_BAD_PARAMETER; /* Error: not a hex number or colon */ | |
} | |
} | |
/* last data */ | |
if (':' != ptr_str[idx - 1]) | |
{ | |
if (FALSE == ipv4_compatible) | |
{ | |
CMD_CHECK_PARA(last_pos, <, 15); /* Error: only 16 units for UI8_T */ | |
tmp_ipv6[last_pos] = (UI8_T)((hex_value >> 8) & 0xff); | |
tmp_ipv6[last_pos + 1] = (UI8_T)((hex_value >> 0) & 0xff); | |
last_pos += 2; | |
} | |
else | |
{ | |
CMD_CHECK_PARA(last_pos, <, 16); /* Error: only 16 units for UI8_T */ | |
tmp_ipv6[last_pos] = dec_value; | |
last_pos += 1; | |
} | |
} | |
else | |
{ | |
if (':' != ptr_str[idx - 2]) | |
{ | |
return AIR_E_BAD_PARAMETER; /* Error: last cannot be colon except double-colon */ | |
} | |
} | |
/* move tmp_ipv6 to ptr_value */ | |
if (TRUE == double_colon) | |
{ | |
/* e.g. | |
* 3ffe::c0a8:0 double_colon_pos = 2, last_pos = 4+2, tmp_ipv6 = {3f,fe,c0,a8,00,00,...} | |
* 3ffe:c0a8:0:: double_colon_pos = 6, last_pos = 6, tmp_ipv6 = {3f,fe,c0,a8,00,00,...} | |
* ::3ffe:c0a8:0 double_colon_pos = 0, last_pos = 4+2, tmp_ipv6 = {3f,fe,c0,a8,00,00,...} | |
* 3ffe::192.168.0.0 double_colon_pos = 2, last_pos = 5+1, tmp_ipv6 = {3f,fe,c0,a8,00,00,...} | |
* | |
* 0 1 2 3 4 5 6 7 8 9 a b c d e f | |
* 3ffe::c0a8:0 ptr_value = {3f,fe,--,--,--,--,--,--,--,--,--,--,--,--,--,--} | |
* 3ffe:c0a8:0:: ptr_value = {3f,fe,c0,a8,00,00,--,--,--,--,--,--,--,--,--,--} | |
* ::3ffe:c0a8:0 ptr_value = {--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--} | |
* 3ffe::192.168.0.0 ptr_value = {3f,fe,--,--,--,--,--,--,--,--,--,--,--,--,--,--} | |
*/ | |
for (idx = 0; idx < double_colon_pos; idx++) | |
{ | |
ptr_addr[idx] = tmp_ipv6[idx]; | |
} | |
/* e.g. | |
* 0 1 2 3 4 5 6 7 8 9 a b c d e f | |
* 3ffe::c0a8:0 ptr_value = {3f,fe,--,--,--,--,--,--,--,--,--,--,c0,a8,00,00} | |
* 3ffe:c0a8:0:: ptr_value = {3f,fe,c0,a8,00,00,--,--,--,--,--,--,--,--,--,--} | |
* ::3ffe:c0a8:0 ptr_value = {--,--,--,--,--,--,--,--,--,--,3f,fe,c0,a8,00,00} | |
* 3ffe::192.168.0.0 ptr_value = {3f,fe,--,--,--,--,--,--,--,--,--,--,c0,a8,00,00} | |
*/ | |
for (idx = double_colon_pos; idx < last_pos; idx++) | |
{ | |
ptr_addr[16 - (last_pos - idx)] = tmp_ipv6[idx]; | |
} | |
} | |
else | |
{ | |
for (idx = 0; idx < 16; idx++) | |
{ | |
ptr_addr[idx] = tmp_ipv6[idx]; | |
} | |
} | |
return AIR_E_OK; | |
} | |
void | |
_showIpv6Str( | |
const UI8_T *ptr_ipv6, | |
C8_T *ptr_str) | |
{ | |
UI32_T idx = 0, next = 0, last = 16; | |
UI32_T cont_zero = 0; | |
while (idx < last) | |
{ | |
if ((0 == cont_zero) && (0 == ptr_ipv6[idx]) && (0 == ptr_ipv6[idx + 1])) | |
{ | |
next = idx + 2; | |
while (next < last) | |
{ | |
if ((ptr_ipv6[next]) || (ptr_ipv6[next + 1])) | |
{ | |
AIR_PRINT( | |
ptr_str + strlen(ptr_str), | |
40 - strlen(ptr_str), | |
"%s", (cont_zero) ? (":") : (":0")); | |
break; | |
} | |
if (0 == cont_zero) | |
{ | |
cont_zero = 1; | |
} | |
next += 2; | |
} | |
if (next == last) | |
{ | |
AIR_PRINT( | |
ptr_str + strlen(ptr_str), | |
40 - strlen(ptr_str), | |
"%s", (cont_zero) ? ("::") : (":0")); | |
} | |
idx = next; | |
} | |
else | |
{ | |
if (idx) | |
{ | |
AIR_PRINT( | |
ptr_str + strlen(ptr_str), | |
40 - strlen(ptr_str), | |
":"); | |
} | |
if (ptr_ipv6[idx]) | |
{ | |
AIR_PRINT( | |
ptr_str + strlen(ptr_str), | |
40 - strlen(ptr_str), | |
"%0x%02x", ptr_ipv6[idx], ptr_ipv6[idx + 1]); | |
} | |
else | |
{ | |
AIR_PRINT( | |
ptr_str + strlen(ptr_str), | |
40 - strlen(ptr_str), | |
"%0x", ptr_ipv6[idx + 1]); | |
} | |
idx += 2; | |
} | |
} | |
} | |
static AIR_ERROR_NO_T | |
_hex2bit( | |
const UI32_T hex, | |
UI32_T *ptr_bit) | |
{ | |
UI32_T i = 0; | |
/* Mistake proofing */ | |
AIR_CHECK_PTR(ptr_bit); | |
(*ptr_bit) = 0; | |
for(i=0; i<AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(hex & BIT(i)) | |
{ | |
(*ptr_bit) |= BITS_OFF_L(1UL, 4*(AIR_MAX_NUM_OF_PORTS - i - 1), 4); | |
} | |
} | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
_hex2bitstr( | |
const UI32_T hex, | |
C8_T *ptr_bit_str, | |
UI32_T str_len) | |
{ | |
UI32_T i = 0; | |
C8_T str_bitmap[AIR_MAX_NUM_OF_PORTS+1]; | |
/* Mistake proofing */ | |
AIR_CHECK_PTR(ptr_bit_str); | |
AIR_PARAM_CHK(str_len <= AIR_MAX_NUM_OF_PORTS, AIR_E_BAD_PARAMETER); | |
memset(str_bitmap, 0, AIR_MAX_NUM_OF_PORTS+1); | |
for(i=0; i<AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(hex & BIT(i)) | |
{ | |
str_bitmap[i] = '1'; | |
} | |
else | |
{ | |
str_bitmap[i] = '-'; | |
} | |
} | |
str_bitmap[i] = '\0'; | |
strncpy(ptr_bit_str, str_bitmap, i+1); | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
_portListStr2Ary( | |
const C8_T *str, | |
UI32_T *ary, | |
const UI32_T ary_num) | |
{ | |
UI32_T i = 0; | |
UI32_T str_len = 0; | |
UI32_T val = 0; | |
C8_T *str2; | |
C8_T *pch; | |
C8_T *last; | |
/* Mistake proofing */ | |
AIR_CHECK_PTR(str); | |
AIR_CHECK_PTR(ary); | |
AIR_PARAM_CHK(0 == ary_num, AIR_E_BAD_PARAMETER); | |
/* Allocate new string */ | |
str_len = strlen(str); | |
str2 = AIR_MALLOC(str_len+1); | |
AIR_CHECK_PTR(str2); | |
memset(str2, 0, str_len+1); | |
strncpy(str2, str, str_len+1); | |
/* clear array */ | |
memset(ary, 0, ary_num*4); | |
/* split string by ',' */ | |
pch = _strtok(str2, ",", &last); | |
while(NULL != pch) | |
{ | |
val = _strtoul(pch, NULL, 0); | |
ary[val/32] |= BIT(val%32); | |
pch = _strtok(NULL, ",", &last); | |
} | |
AIR_FREE(str2); | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
doRegRead( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
UI32_T reg = 0, val = 0; | |
reg = _strtoul(argv[0], NULL, 16); | |
aml_readReg(0, reg, &val); | |
AIR_PRINT("Read reg=0x%x, value=0x%x\n", reg, val); | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
doRegWrite( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
UI32_T reg = 0, val = 0; | |
reg = _strtoul(argv[0], NULL, 16); | |
val = _strtoul(argv[1], NULL, 16); | |
aml_writeReg(0, reg, val); | |
AIR_PRINT("Write reg=0x%x, value=0x%x\n", reg, val); | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
doReg( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(regCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doPhyCL22Read( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
UI32_T port = 0, reg = 0, val = 0; | |
port = _strtoul(argv[0], NULL, 0); | |
reg = _strtoul(argv[1], NULL, 16); | |
aml_readPhyReg(0, port, reg, &val); | |
AIR_PRINT("Phy read port=%d, reg=0x%x, value=0x%x\n", port, reg, val); | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
doPhyCL22Write( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
UI32_T port = 0, reg = 0, val = 0; | |
port = _strtoul(argv[0], NULL, 0); | |
reg = _strtoul(argv[1], NULL, 16); | |
val = _strtoul(argv[2], NULL, 16); | |
aml_writePhyReg(0, port, reg, val); | |
AIR_PRINT("Phy write port=%d, reg=0x%x, value=0x%x\n", port, reg, val); | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
doPhyCL22( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(phyCL22Cmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doPhyCL45Read( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
UI32_T port = 0, dev = 0, reg = 0, val = 0; | |
port = _strtoul(argv[0], NULL, 0); | |
dev = _strtoul(argv[1], NULL, 16); | |
reg = _strtoul(argv[2], NULL, 16); | |
aml_readPhyRegCL45(0, port, dev, reg, &val); | |
AIR_PRINT("Phy read port=%d, dev=0x%x, reg=0x%x, value=0x%x\n", port, dev, reg, val); | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
doPhyCL45Write( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
UI32_T port = 0, dev = 0, reg = 0, val = 0; | |
port = _strtoul(argv[0], NULL, 0); | |
dev = _strtoul(argv[1], NULL, 16); | |
reg = _strtoul(argv[2], NULL, 16); | |
val = _strtoul(argv[3], NULL, 16); | |
aml_writePhyRegCL45(0, port, dev, reg, val); | |
AIR_PRINT("Phy write port=%d, dev=0x%x, reg=0x%x, value=0x%x\n", port, dev, reg, val); | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
doPhyCL45( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(phyCL45Cmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doPhy( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(phyCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doPortSetMatrix(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
UI32_T matrix = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
matrix = _strtoul(argv[1], NULL, 16); | |
rc = air_port_setPortMatrix(0, port, matrix); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doPortSetVlanMode(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
AIR_PORT_VLAN_MODE_T vlan_mode; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
vlan_mode = _strtoul(argv[1], NULL, 0); | |
rc = air_port_setVlanMode(0, port, vlan_mode); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doPortSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(portSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doPortGetMatrix(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
UI32_T matrix = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
rc = air_port_getPortMatrix(0, port, &matrix); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
return rc; | |
} | |
AIR_PRINT("Port %d Matrix: %2x\n", port, matrix); | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doPortGetVlanMode(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
AIR_PORT_VLAN_MODE_T vlan_mode; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
rc = air_port_getVlanMode(0, port, &vlan_mode); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
return rc; | |
} | |
AIR_PRINT("Port %d Vlan Mode: ", port); | |
switch(vlan_mode) | |
{ | |
case AIR_PORT_VLAN_MODE_PORT_MATRIX: | |
AIR_PRINT("matrix(%d)\n", vlan_mode); | |
break; | |
case AIR_PORT_VLAN_MODE_FALLBACK: | |
AIR_PRINT("fallback(%d)\n", vlan_mode); | |
break; | |
case AIR_PORT_VLAN_MODE_CHECK: | |
AIR_PRINT("check(%d)\n", vlan_mode); | |
break; | |
case AIR_PORT_VLAN_MODE_SECURITY: | |
AIR_PRINT("security(%d)\n", vlan_mode); | |
break; | |
default: | |
AIR_PRINT("unknown(%d)\n", vlan_mode); | |
break; | |
}; | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doPortGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(portGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doPort( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(portCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doVlanInitiate(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0; | |
AIR_VLAN_ENTRY_ATTR_T vlan_entry = {0}; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
if (9 == argc) | |
{ | |
vlan_entry.vlan_entry_format.fid = _strtoul(argv[1], NULL, 0); | |
vlan_entry.vlan_entry_format.port_mem = _strtoul(argv[2], NULL, 0); | |
vlan_entry.vlan_entry_format.ivl = _strtoul(argv[3], NULL, 0); | |
vlan_entry.vlan_entry_format.port_stag = _strtoul(argv[4], NULL, 0); | |
vlan_entry.vlan_entry_format.stag = _strtoul(argv[5], NULL, 0); | |
vlan_entry.vlan_entry_format.eg_ctrl_en = _strtoul(argv[6], NULL, 0); | |
vlan_entry.vlan_entry_format.eg_con = _strtoul(argv[7], NULL, 0); | |
vlan_entry.vlan_entry_format.eg_ctrl = _strtoul(argv[8], NULL, 0); | |
rc = air_vlan_create(0, vid, &vlan_entry); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
rc = AIR_E_BAD_PARAMETER; | |
} | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_EXISTS: AIR_PRINT("VLAN already exist!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanCreate(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
rc = air_vlan_create(0, vid, NULL); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_EXISTS: AIR_PRINT("VLAN already exist!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanDestroy(UI32_T argc, C8_T *argv[]) | |
{ | |
C8_T *token = NULL; | |
UI16_T vid = 0, vid_limit = AIR_VLAN_ID_MAX; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
if (argc > 0) | |
{ | |
if (isdigit(argv[0][0])) | |
{ | |
token = _strtok(argv[0], "-", &argv[0]); | |
vid = _strtoul(token, NULL, 0); | |
if ((token = _strtok(argv[0], "-", &argv[0]))) | |
vid_limit = _strtoul(token, NULL, 0); | |
else | |
vid_limit = vid; | |
if (AIR_VLAN_ID_MAX < vid_limit) | |
{ | |
AIR_PRINT("vid number should less than %d!\n", AIR_VLAN_ID_MAX); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if (vid > vid_limit) | |
{ | |
AIR_PRINT("vid0 should less than vid1!\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Bad parameter!\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
} | |
for (; vid <= vid_limit; vid++) | |
{ | |
rc = air_vlan_destroy(0, vid); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanDestroyAll(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T restore_def_vlan = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
if (argc > 0) | |
{ | |
restore_def_vlan = _strtoul(argv[0], NULL, 0); | |
} | |
rc = air_vlan_destroyAll(0, restore_def_vlan); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanDump(UI32_T argc, C8_T *argv[]) | |
{ | |
C8_T *token = NULL; | |
UI16_T port = 0, valid_count = 0, vid = 0, vid_limit = AIR_VLAN_ID_MAX; | |
AIR_PORT_EGS_TAG_ATTR_T tag_ctl[AIR_MAX_NUM_OF_PORTS] = {0}; | |
AIR_VLAN_ENTRY_T vlan_entry = {0}; | |
if (argc > 0) | |
{ | |
if (isdigit(argv[0][0])) | |
{ | |
token = _strtok(argv[0], "-", &argv[0]); | |
vid = _strtoul(token, NULL, 0); | |
if ((token = _strtok(argv[0], "-", &argv[0]))) | |
vid_limit = _strtoul(token, NULL, 0); | |
else | |
vid_limit = vid; | |
if (AIR_VLAN_ID_MAX < vid_limit) | |
{ | |
AIR_PRINT("vid number should less than %d!\n", AIR_VLAN_ID_MAX); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if (vid > vid_limit) | |
{ | |
AIR_PRINT("vid0 should less than vid1!\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Bad parameter!\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
} | |
for (valid_count = 0; vid <= vid_limit; vid++) | |
{ | |
_air_vlan_readEntry(0, vid, &vlan_entry); | |
if (vlan_entry.valid) | |
{ | |
valid_count++; | |
if (1 == valid_count) | |
AIR_PRINT(" Vid Fid MemPort Ivl PortBaseStag Stag EgsTagCtlEn EgsTagCon EgsTagCtl\n======================================================================\n"); | |
for (port = 0; port < AIR_MAX_NUM_OF_PORTS; port++) | |
tag_ctl[port] = (vlan_entry.vlan_entry_format.eg_ctrl >> (port * 2)) & 0x3; | |
AIR_PRINT("%4d %3d %2x %3d %12d %4d %11d %9d %1x%1x%1x%1x%1x%1x%1x\n", | |
vid, vlan_entry.vlan_entry_format.fid, vlan_entry.vlan_entry_format.port_mem, vlan_entry.vlan_entry_format.ivl, | |
vlan_entry.vlan_entry_format.port_stag, vlan_entry.vlan_entry_format.stag, vlan_entry.vlan_entry_format.eg_ctrl_en, vlan_entry.vlan_entry_format.eg_con, | |
tag_ctl[6], tag_ctl[5], tag_ctl[4], tag_ctl[3], tag_ctl[2], tag_ctl[1], tag_ctl[0]); | |
} | |
} | |
if (!valid_count) | |
AIR_PRINT("not found!\n"); | |
else | |
AIR_PRINT("Found %d valid entries!\n", valid_count); | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
doVlanAddPortMem(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0, port = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
port = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_addMemberPort(0, vid, port); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_NOT_FOUND: AIR_PRINT("VLAN not found!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanDelPortMem(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0, port = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
port = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_delMemberPort(0, vid, port); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_NOT_FOUND: AIR_PRINT("VLAN not found!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetFid(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0; | |
UI8_T fid = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
fid = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setFid(0, vid, fid); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_NOT_FOUND: AIR_PRINT("VLAN not found!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetMemPort(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0, port_bitmap = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
port_bitmap = _strtoul(argv[1], NULL, 16); | |
rc = air_vlan_setMemberPort(0, vid, port_bitmap); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_NOT_FOUND: AIR_PRINT("VLAN not found!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetIVL(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0; | |
BOOL_T enable = TRUE; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
enable = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setIVL(0, vid, enable); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_NOT_FOUND: AIR_PRINT("VLAN not found!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetPortBaseStag(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0; | |
BOOL_T enable = TRUE; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
enable = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setPortBasedStag(0, vid, enable); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_NOT_FOUND: AIR_PRINT("VLAN not found!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetStag(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0, stag = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
stag = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setServiceTag(0, vid, stag); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_NOT_FOUND: AIR_PRINT("VLAN not found!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetEgsTagCtlEn(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0; | |
BOOL_T enable = TRUE; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
enable = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setEgsTagCtlEnable(0, vid, enable); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_NOT_FOUND: AIR_PRINT("VLAN not found!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetEgsTagCtlCon(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0; | |
BOOL_T enable = TRUE; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
enable = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setEgsTagConsistent(0, vid, enable); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_NOT_FOUND: AIR_PRINT("VLAN not found!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetEgsTagCtl(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T vid = 0, port = 0; | |
AIR_PORT_EGS_TAG_ATTR_T tag_ctl = AIR_PORT_EGS_TAG_ATTR_UNTAGGED; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
vid = _strtoul(argv[0], NULL, 0); | |
port = _strtoul(argv[1], NULL, 0); | |
tag_ctl = _strtoul(argv[2], NULL, 0); | |
rc = air_vlan_setPortEgsTagCtl(0, vid, port, tag_ctl); | |
switch (rc) | |
{ | |
case AIR_E_OK: break; | |
case AIR_E_ENTRY_NOT_FOUND: AIR_PRINT("VLAN not found!\n"); break; | |
default: AIR_PRINT("Error %d: Operation failed!\n", rc); break; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetPortActFrame(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T port = 0; | |
AIR_VLAN_ACCEPT_FRAME_TYPE_T type = AIR_VLAN_ACCEPT_FRAME_TYPE_ALL; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
type = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setPortAcceptFrameType(0, port, type); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetLeakyVlanEn(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T port = 0; | |
AIR_LEAKY_PKT_TYPE_T pkt_type = AIR_LEAKY_PKT_TYPE_UNICAST; | |
BOOL_T enable = TRUE; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
pkt_type = _strtoul(argv[1], NULL, 0); | |
enable = _strtoul(argv[2], NULL, 0); | |
rc = air_vlan_setPortLeakyVlanEnable(0, port, pkt_type, enable); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetPortVlanAttr(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T port = 0; | |
AIR_VLAN_PORT_ATTR_T attr = AIR_VLAN_PORT_ATTR_USER_PORT; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
attr = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setPortAttr(0, port, attr); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetIgsPortETagAttr(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T port = 0; | |
AIR_IGR_PORT_EG_TAG_ATTR_T attr = AIR_IGR_PORT_EG_TAG_ATTR_DISABLE; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
attr = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setIgrPortTagAttr(0, port, attr); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetPortETagAttr(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T port = 0; | |
AIR_PORT_EGS_TAG_ATTR_T attr = AIR_PORT_EGS_TAG_ATTR_UNTAGGED; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
attr = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setPortEgsTagAttr(0, port, attr); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetPortOuterTPID(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T port = 0, tpid = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
tpid = _strtoul(argv[1], NULL, 16); | |
rc = air_vlan_setPortOuterTPID(0, port, tpid); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSetPvid(UI32_T argc, C8_T *argv[]) | |
{ | |
UI16_T port = 0, pvid = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
pvid = _strtoul(argv[1], NULL, 0); | |
rc = air_vlan_setPortPVID(0, port, pvid); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(vlanSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doVlanGetPortActFrame(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
AIR_VLAN_ACCEPT_FRAME_TYPE_T type; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
rc = air_vlan_getPortAcceptFrameType(0, port, &type); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
return rc; | |
} | |
AIR_PRINT("Port %d Acceptable Frame Type: ", port); | |
switch(type) | |
{ | |
case AIR_VLAN_ACCEPT_FRAME_TYPE_ALL: | |
AIR_PRINT("all(%d)\n", type); | |
break; | |
case AIR_VLAN_ACCEPT_FRAME_TYPE_TAG_ONLY: | |
AIR_PRINT("tagged-only(%d)\n", type); | |
break; | |
case AIR_VLAN_ACCEPT_FRAME_TYPE_UNTAG_ONLY: | |
AIR_PRINT("untagged-only(%d)\n", type); | |
break; | |
default: | |
AIR_PRINT("unknown(%d)\n", type); | |
break; | |
}; | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanGetLeakyVlanEn(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
BOOL_T uc = FALSE, mc = FALSE, bc = FALSE; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
rc += air_vlan_getPortLeakyVlanEnable(0, port, AIR_LEAKY_PKT_TYPE_UNICAST, &uc); | |
rc += air_vlan_getPortLeakyVlanEnable(0, port, AIR_LEAKY_PKT_TYPE_MULTICAST, &mc); | |
rc += air_vlan_getPortLeakyVlanEnable(0, port, AIR_LEAKY_PKT_TYPE_BROADCAST, &bc); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
return rc; | |
} | |
AIR_PRINT("Port %d Leaky Vlan Enable\n", port); | |
AIR_PRINT("Unicast : %s\n", uc ? "TRUE" : "FALSE"); | |
AIR_PRINT("Multicast : %s\n", mc ? "TRUE" : "FALSE"); | |
AIR_PRINT("Broadcast : %s\n", bc ? "TRUE" : "FALSE"); | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanGetPortVlanAttr(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
AIR_VLAN_PORT_ATTR_T attr; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
rc = air_vlan_getPortAttr(0, port, &attr); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
return rc; | |
} | |
AIR_PRINT("Port %d Vlan Attr: ", port); | |
switch(attr) | |
{ | |
case AIR_VLAN_PORT_ATTR_USER_PORT: | |
AIR_PRINT("user port(%d)\n", attr); | |
break; | |
case AIR_VLAN_PORT_ATTR_STACK_PORT: | |
AIR_PRINT("stack port(%d)\n", attr); | |
break; | |
case AIR_VLAN_PORT_ATTR_TRANSLATION_PORT: | |
AIR_PRINT("translation port(%d)\n", attr); | |
break; | |
case AIR_VLAN_PORT_ATTR_TRANSPARENT_PORT: | |
AIR_PRINT("transparent port(%d)\n", attr); | |
break; | |
default: | |
AIR_PRINT("unknown(%d)\n", attr); | |
break; | |
}; | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanGetIgsPortETagAttr(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
AIR_IGR_PORT_EG_TAG_ATTR_T attr; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
rc = air_vlan_getIgrPortTagAttr(0, port, &attr); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
return rc; | |
} | |
AIR_PRINT("Port %d Incomming Port Egress Tag Attr: ", port); | |
switch(attr) | |
{ | |
case AIR_IGR_PORT_EG_TAG_ATTR_DISABLE: | |
AIR_PRINT("disable(%d)\n", attr); | |
break; | |
case AIR_IGR_PORT_EG_TAG_ATTR_CONSISTENT: | |
AIR_PRINT("consistent(%d)\n", attr); | |
break; | |
case AIR_IGR_PORT_EG_TAG_ATTR_UNTAGGED: | |
AIR_PRINT("untagged(%d)\n", attr); | |
break; | |
case AIR_IGR_PORT_EG_TAG_ATTR_SWAP: | |
AIR_PRINT("swap(%d)\n", attr); | |
break; | |
case AIR_IGR_PORT_EG_TAG_ATTR_TAGGED: | |
AIR_PRINT("tagged(%d)\n", attr); | |
break; | |
case AIR_IGR_PORT_EG_TAG_ATTR_STACK: | |
AIR_PRINT("stack(%d)\n", attr); | |
break; | |
default: | |
AIR_PRINT("unknown(%d)\n", attr); | |
break; | |
}; | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanGetPortETagAttr(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
AIR_PORT_EGS_TAG_ATTR_T attr; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
rc = air_vlan_getPortEgsTagAttr(0, port, &attr); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
return rc; | |
} | |
AIR_PRINT("Port %d Egress Tag Attr: ", port); | |
switch(attr) | |
{ | |
case AIR_PORT_EGS_TAG_ATTR_UNTAGGED: | |
AIR_PRINT("untagged(%d)\n", attr); | |
break; | |
case AIR_PORT_EGS_TAG_ATTR_SWAP: | |
AIR_PRINT("swap(%d)\n", attr); | |
break; | |
case AIR_PORT_EGS_TAG_ATTR_TAGGED: | |
AIR_PRINT("tagged(%d)\n", attr); | |
break; | |
case AIR_PORT_EGS_TAG_ATTR_STACK: | |
AIR_PRINT("stack(%d)\n", attr); | |
break; | |
default: | |
AIR_PRINT("unknown(%d)\n", attr); | |
break; | |
}; | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanGetPortOuterTPID(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
UI16_T tpid = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
rc = air_vlan_getPortOuterTPID(0, port, &tpid); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
return rc; | |
} | |
AIR_PRINT("Port %d Outer TPID: %4x\n", port, tpid); | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanGetPvid(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
UI16_T pvid = 0; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
rc = air_vlan_getPortPVID(0, port, &pvid); | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Error: Operation failed!\n"); | |
return rc; | |
} | |
AIR_PRINT("Port %d PVID: %d\n", port, pvid); | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doVlanGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(vlanGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doVlan( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(vlanCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doJumbo( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
I32_T pkt_len = 0, frame_len = 0; | |
if(0 == argc) | |
{ | |
/* get command */ | |
ret = air_port_getJumbo(0, &pkt_len, &frame_len); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get "); | |
switch(pkt_len) | |
{ | |
case 0: | |
AIR_PRINT("RX_1518 "); | |
break; | |
case 1: | |
AIR_PRINT("RX_1536 "); | |
break; | |
case 2: | |
AIR_PRINT("RX_1552 "); | |
break; | |
case 3: | |
AIR_PRINT("RX_JUMBO "); | |
break; | |
} | |
AIR_PRINT("frames lengths %d KBytes\n", frame_len); | |
} | |
else | |
{ | |
AIR_PRINT("Get Jumbo Fail.\n"); | |
} | |
} | |
else | |
{ | |
/* set command */ | |
pkt_len = _strtol(argv[0], NULL, 10); | |
frame_len = _strtol(argv[1], NULL, 10); | |
ret = air_port_setJumbo(0, pkt_len, frame_len); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set "); | |
switch(pkt_len) | |
{ | |
case 0: | |
AIR_PRINT("RX_1518 "); | |
break; | |
case 1: | |
AIR_PRINT("RX_1536 "); | |
break; | |
case 2: | |
AIR_PRINT("RX_1552 "); | |
break; | |
case 3: | |
AIR_PRINT("RX_JUMBO "); | |
break; | |
} | |
AIR_PRINT("frames lengths %d KBytes\n", frame_len); | |
} | |
else | |
AIR_PRINT("Set Jumbo Fail.\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doFlowCtrl( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
BOOL_T fc_en = 0, dir = 0; | |
I32_T port = 0; | |
port = _strtol(argv[0], NULL, 10); | |
dir = _strtol(argv[1], NULL, 10); | |
if(2 == argc) | |
{ | |
/* get command */ | |
ret = air_port_getFlowCtrl(0, port, dir, &fc_en); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Get Port%02d %s Flow Control %s\n", port, ((dir)?"RX":"TX"), ((fc_en)?"Enable":"Disable")); | |
else | |
AIR_PRINT("Get Flow Control Fail.\n"); | |
} | |
else | |
{ | |
/* set command */ | |
fc_en = _strtol(argv[2], NULL, 10); | |
ret = air_port_setFlowCtrl(0, port, dir, fc_en); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Set Port%02d %s Flow Control %s\n", port, ((dir)?"RX":"TX"), ((fc_en)?"Enable":"Disable")); | |
else | |
AIR_PRINT("Set Flow Control Fail.\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doL2Set( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(l2SetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doL2Get( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(l2GetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doL2Clear( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(l2ClearCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doL2Del( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(l2DelCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doL2Add( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(l2AddCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doL2( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(l2Cmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doAnMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
BOOL_T en = 0; | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get anCap <port> */ | |
ret = air_port_getAnMode(0, port, &en); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Get Port%02d Auto-Negotiation %s\n", port, ((en)?"Enabled":"Disabled")); | |
else | |
AIR_PRINT("Get Port%02d Auto-Negotiation Fail.\n", port); | |
} | |
else if(2 == argc) | |
{ | |
/* "port set anMode <port> <en> */ | |
en = _strtol(argv[1], NULL, 10); | |
ret = air_port_setAnMode(0, port, en); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Set Port%02d Auto-Negotiation Mode:%s\n", port, ((en)?"Enabled":"Disabled")); | |
else | |
AIR_PRINT("Set Port%02d Auto-Negotiation Fail.\n", port); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLocalAdv( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
AIR_AN_ADV_T adv; | |
memset(&adv, 0, sizeof(AIR_AN_ADV_T)); | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get localAdv <port> */ | |
ret = air_port_getLocalAdvAbility(0, port, &adv); | |
AIR_PRINT("Get Port%02d Local Auto-Negotiation Advertisement: ", port); | |
if(AIR_E_OK != ret) | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
} | |
else if(7 == argc) | |
{ | |
/* port set localAdv <port> <10H> <10F> <100H> <100F> <1000F> <pause> */ | |
adv.advCap10HDX = _strtol(argv[1], NULL, 0) & BIT(0); | |
adv.advCap10FDX = _strtol(argv[2], NULL, 0) & BIT(0); | |
adv.advCap100HDX = _strtol(argv[3], NULL, 0) & BIT(0); | |
adv.advCap100FDX = _strtol(argv[4], NULL, 0) & BIT(0); | |
adv.advCap1000FDX = _strtol(argv[5], NULL, 0) & BIT(0); | |
adv.advPause = _strtol(argv[6], NULL, 0) & BIT(0); | |
ret = air_port_setLocalAdvAbility(0, port, adv); | |
AIR_PRINT("Set Port%02d Local Auto-Negotiation Advertisement: ", port); | |
if(AIR_E_OK != ret) | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("\n"); | |
AIR_PRINT("\tAdvertise 10BASE-T Half Duplex: %s\n", (adv.advCap10HDX)?"Effective":"Not Effective" ); | |
AIR_PRINT("\tAdvertise 10BASE-T Full Duplex: %s\n", (adv.advCap10FDX)?"Effective":"Not Effective" ); | |
AIR_PRINT("\tAdvertise 100BASE-T Half Duplex: %s\n", (adv.advCap100HDX)?"Effective":"Not Effective" ); | |
AIR_PRINT("\tAdvertise 100BASE-T Full Duplex: %s\n", (adv.advCap100FDX)?"Effective":"Not Effective" ); | |
AIR_PRINT("\tAdvertise 1000BASE-T Full Duplex: %s\n", (adv.advCap1000FDX)?"Effective":"Not Effective" ); | |
AIR_PRINT("\tAdvertise Asynchronous Pause: %s\n", (adv.advPause)?"Effective":"Not Effective" ); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doRemoteAdv( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
AIR_AN_ADV_T lp_adv; | |
memset(&lp_adv, 0, sizeof(AIR_AN_ADV_T)); | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get remoteAdv <port> */ | |
ret = air_port_getRemoteAdvAbility(0, port, &lp_adv); | |
AIR_PRINT("Get Port%02d Remote Auto-Negotiation Advertisement: ", port); | |
if(AIR_E_OK != ret) | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("\n"); | |
AIR_PRINT("\tAdvertise 10BASE-T Half Duplex: %s\n", lp_adv.advCap10HDX?"Effective":"Not Effective" ); | |
AIR_PRINT("\tAdvertise 10BASE-T Full Duplex: %s\n", lp_adv.advCap10FDX?"Effective":"Not Effective" ); | |
AIR_PRINT("\tAdvertise 100BASE-T Half Duplex: %s\n", lp_adv.advCap100HDX?"Effective":"Not Effective" ); | |
AIR_PRINT("\tAdvertise 100BASE-T Full Duplex: %s\n", lp_adv.advCap100FDX?"Effective":"Not Effective" ); | |
AIR_PRINT("\tAdvertise 1000BASE-T Full Duplex: %s\n", (lp_adv.advCap1000FDX)?"Effective":"Not Effective" ); | |
AIR_PRINT("\tAdvertise Asynchronous Pause: %s\n", (lp_adv.advPause)?"Effective":"Not Effective" ); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortSpeed( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
UI32_T speed = 0; | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get speed <port> */ | |
ret = air_port_getSpeed(0, port, &speed); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get Port%02d Speed:", port); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d Speed Fail!\n", port); | |
} | |
} | |
else if(2 == argc) | |
{ | |
/* port set speed <port> <speed> */ | |
speed = _strtol(argv[1], NULL, 10); | |
ret = air_port_setSpeed(0, port, speed); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set Port%02d Speed:", port); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d Speed Fail!\n", port); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
switch(speed) | |
{ | |
case AIR_PORT_SPEED_10M: | |
AIR_PRINT(" 10 Mbps\n"); | |
break; | |
case AIR_PORT_SPEED_100M: | |
AIR_PRINT(" 100 Mbps\n"); | |
break; | |
case AIR_PORT_SPEED_1000M: | |
AIR_PRINT(" 1 Gbps\n"); | |
break; | |
case AIR_PORT_SPEED_2500M: | |
AIR_PRINT(" 2.5 Gbps\n"); | |
break; | |
default: | |
AIR_PRINT(" Reserved\n"); | |
break; | |
} | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortDuplex( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
UI32_T duplex = 0; | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get duplex <port> */ | |
ret = air_port_getDuplex(0, port, &duplex); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get Port%02d Duplex:%s\n", port, duplex?"Full":"Half"); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d Duplex Fail!\n", port); | |
} | |
} | |
else if(2 == argc) | |
{ | |
/* port set duplex <port> <duplex> */ | |
duplex = _strtol(argv[1], NULL, 10); | |
ret = air_port_setDuplex(0, port, duplex); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set Port%02d Duplex:%s\n", port, duplex?"Full":"Half"); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d Duplex Fail!\n", port); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortStatus( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
AIR_PORT_STATUS_T ps; | |
memset(&ps, 0, sizeof(AIR_PORT_STATUS_T)); | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get status <port> */ | |
ret = air_port_getLink(0, port, &ps); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get Port%02d Link-Status\n", port); | |
AIR_PRINT("\tLink: %s\n", ps.link?"Up":"Down"); | |
AIR_PRINT("\tDuplex: %s\n", ps.duplex?"Full":"Half"); | |
AIR_PRINT("\tSpeed: "); | |
switch(ps.speed) | |
{ | |
case AIR_PORT_SPEED_10M: | |
AIR_PRINT("10 Mbps\n"); | |
break; | |
case AIR_PORT_SPEED_100M: | |
AIR_PRINT("100 Mbps\n"); | |
break; | |
case AIR_PORT_SPEED_1000M: | |
AIR_PRINT("1 Gbps\n"); | |
break; | |
case AIR_PORT_SPEED_2500M: | |
AIR_PRINT("2.5 Gbps\n"); | |
break; | |
default: | |
AIR_PRINT("Reserved\n"); | |
break; | |
} | |
} | |
else | |
AIR_PRINT("Get Port%02d Link-Status Fail!", port); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortBckPres( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
UI32_T bckPres = 0; | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get bckPres <port> */ | |
ret = air_port_getBckPres(0, port, &bckPres); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Get Port%02d BckPres:%s\n", port, bckPres?"Enabled":"Disabled"); | |
else | |
AIR_PRINT("Get Port%02d BckPres Fail!\n", port); | |
} | |
else if(2 == argc) | |
{ | |
/* port set bckPres <port> <bckPres> */ | |
bckPres = _strtol(argv[1], NULL, 10); | |
ret = air_port_setBckPres(0, port, bckPres); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Set Port%02d BckPres:%s\n", port, bckPres?"Enabled":"Disabled"); | |
else | |
AIR_PRINT("Set Port%02d BckPres Fail!\n", port); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortPsMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
UI32_T mode = 0; | |
BOOL_T ls_en = 0; | |
BOOL_T eee_en = 0; | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get psMode <port> */ | |
ret = air_port_getPsMode(0, port, &mode); | |
AIR_PRINT("Get Port%02d Power-Saving: ", port); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Done\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
} | |
else if(3 == argc) | |
{ | |
/* port set psMode <port> <ls> <eee> */ | |
ls_en = _strtol(argv[1], NULL, 0); | |
eee_en = _strtol(argv[2], NULL, 0); | |
if(TRUE == ls_en) | |
{ | |
mode |= AIR_PORT_PS_LINKSTATUS; | |
} | |
if(TRUE == eee_en) | |
{ | |
mode |= AIR_PORT_PS_EEE; | |
} | |
ret = air_port_setPsMode(0, port, mode); | |
AIR_PRINT("Set Port%02d Power-Saving: ", port); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Done\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("\tLink status:%s\n", (mode & AIR_PORT_PS_LINKSTATUS)?"Enable":"Disable"); | |
AIR_PRINT("\tEEE:%s\n", (mode & AIR_PORT_PS_EEE)?"Enable":"Disable"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortSmtSpdDwn( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
UI32_T state = 0; | |
UI32_T retry = 0; | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get smtSpdDwn <port> */ | |
ret = air_port_getSmtSpdDwn(0, port, &state, &retry); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get Port%02d Smart Speed Down: %s\n", port, state?"Enabled":"Disabled"); | |
AIR_PRINT("Get Port%02d Retry Time: %d\n", port, retry + 2); | |
} | |
else | |
AIR_PRINT("Get Port%02d Smart-SpeedDown Fail!\n", port); | |
} | |
else if(3 == argc) | |
{ | |
/* port set smtSpdDwn <port> <en> <retry> */ | |
state = _strtol(argv[1], NULL, 10); | |
retry = _strtol(argv[2], NULL, 10); | |
if(retry >= 2) | |
{ | |
ret = air_port_setSmtSpdDwn(0, port, state, retry - 2); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set Port%02d Smart Speed Down: %s\n", port, state?"Enabled":"Disabled"); | |
AIR_PRINT("Set Port%02d Retry Time: %d\n", port, retry); | |
} | |
else | |
AIR_PRINT("Set Port%02d Smart-SpeedDown Fail!\n", port); | |
} | |
else | |
{ | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortSpTag( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
BOOL_T sptag_en = FALSE; | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get spTag <port> */ | |
ret = air_port_getSpTag(0, port, &sptag_en); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Get Port%02d Special Tag %s\n", port, ((sptag_en)?"Enabled":"Disabled")); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d Special Tag Fail.\n", port); | |
} | |
} | |
else if(2 == argc) | |
{ | |
/* port set spTag <port> <en> */ | |
sptag_en = _strtol(argv[1], NULL, 10); | |
ret = air_port_setSpTag(0, port, sptag_en); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Set Port%02d Special Tag:%s\n", port, ((sptag_en)?"Enabled":"Disabled")); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d Special Tag Fail.\n", port); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortEnable( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
UI32_T state = 0; | |
port = _strtol(argv[0], NULL, 10); | |
if(1 == argc) | |
{ | |
/* port get enable <port> */ | |
ret = air_port_getEnable(0, port, &state); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Get Port%02d State:%s\n", port, state?"Enable":"Disable"); | |
else | |
AIR_PRINT("Get Port%02d State Fail!\n", port); | |
} | |
else if(2 == argc) | |
{ | |
/* port set enable <port> <en> */ | |
state = _strtol(argv[1], NULL, 10); | |
ret = air_port_setEnable(0, port, state); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Set Port%02d State:%s\n", port, state?"Enable":"Disable"); | |
else | |
AIR_PRINT("Set Port%02d State Fail!\n", port); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPort5GBaseRMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
if(0 == argc) | |
{ | |
/* port set 5GBaseRMode */ | |
ret = air_port_set5GBaseRModeEn(0); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Set Port05 Mode: 5GBase-R\n"); | |
else | |
AIR_PRINT("Set Port05 HSGMII Mode Fail.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortHsgmiiMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
if(0 == argc) | |
{ | |
/* port set hsgmiiMode */ | |
ret = air_port_setHsgmiiModeEn(0); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Set Port05 Mode: HSGMII\n"); | |
else | |
AIR_PRINT("Set Port05 HSGMII Mode Fail.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortSgmiiMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T mode = 0; | |
UI32_T speed = 0; | |
if(2 == argc) | |
{ | |
/* port set sgmiiMode <mode(0:AN,1:Force)> <speed> */ | |
mode = _strtol(argv[0], NULL, 10); | |
speed = _strtol(argv[1], NULL, 10); | |
ret = air_port_setSgmiiMode(0, mode, speed); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Set Port05 SGMII Mode:%s\nIf in Force Mode, speed:", mode?"Force":"AN"); | |
else | |
AIR_PRINT("Set Port05 SGMII Mode Fail.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
switch(speed) | |
{ | |
case AIR_PORT_SPEED_10M: | |
AIR_PRINT(" 10 Mbps\n"); | |
break; | |
case AIR_PORT_SPEED_100M: | |
AIR_PRINT(" 100 Mbps\n"); | |
break; | |
case AIR_PORT_SPEED_1000M: | |
AIR_PRINT(" 1 Gbps\n"); | |
break; | |
default: | |
AIR_PRINT(" Reserved\n"); | |
break; | |
} | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortRmiiMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T speed = 0; | |
if(1 == argc) | |
{ | |
/* port set rmiiMode <speed> */ | |
speed = _strtol(argv[0], NULL, 10); | |
ret = air_port_setRmiiMode(0, speed); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set Port05 RMII Mode Speed:"); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port05 RMII Mode Fail!\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
switch(speed) | |
{ | |
case AIR_PORT_SPEED_10M: | |
AIR_PRINT(" 10 Mbps\n"); | |
break; | |
case AIR_PORT_SPEED_100M: | |
AIR_PRINT(" 100 Mbps\n"); | |
break; | |
default: | |
AIR_PRINT(" Reserved\n"); | |
break; | |
} | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doPortRgmiiMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T speed = 0; | |
if(1 == argc) | |
{ | |
/* port set rgmiiMode <speed> */ | |
speed = _strtol(argv[0], NULL, 10); | |
ret = air_port_setRgmiiMode(0, speed); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set Port05 RGMII Mode Speed:"); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port05 RGMII Mode Fail!\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
switch(speed) | |
{ | |
case AIR_PORT_SPEED_10M: | |
AIR_PRINT(" 10 Mbps\n"); | |
break; | |
case AIR_PORT_SPEED_100M: | |
AIR_PRINT(" 100 Mbps\n"); | |
break; | |
case AIR_PORT_SPEED_1000M: | |
AIR_PRINT(" 1 Gbps\n"); | |
break; | |
default: | |
AIR_PRINT(" Reserved\n"); | |
break; | |
} | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doSptagEn( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
BOOL_T sp_en = FALSE; | |
port = _strtol(argv[0], NULL, 10); | |
if (2 == argc) | |
{ | |
sp_en = _strtol(argv[1], NULL, 10); | |
ret = air_sptag_setState(0,port,sp_en); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("set port %d SpTag state %s sucess\n", port,sp_en?"Enable":"Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("set port %d SpTag state %s fail\n", port,sp_en?"Enable":"Disable"); | |
} | |
} | |
else if(1 == argc) | |
{ | |
air_sptag_getState(0,port,&sp_en); | |
AIR_PRINT("get port %d SpTag state: %s \n", port,sp_en?"Enable":"Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doSptagMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
BOOL_T sp_mode = FALSE; | |
port = _strtol(argv[0], NULL, 10); | |
if (2 == argc) | |
{ | |
sp_mode = _strtol(argv[1], NULL, 10); | |
ret = air_sptag_setMode(0,port,sp_mode); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("set port %d SpTag Mode %s sucess\n", port,sp_mode?"replace":"insert"); | |
} | |
else | |
{ | |
AIR_PRINT("set port %d SpTag state %s fail\n", port,sp_mode?"replace":"insert"); | |
} | |
} | |
else if(1 == argc) | |
{ | |
air_sptag_getMode(0,port,&sp_mode); | |
AIR_PRINT("get port %d SpTag state: %s \n", port,sp_mode?"replace":"insert"); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doSptagDecode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
AIR_SPTAG_RX_PARA_T sptag_rx = {0}; | |
UI8_T buf[AIR_STAG_BUF_LEN] = {0}; | |
UI32_T len = AIR_STAG_BUF_LEN, i = 0; | |
if (4 == argc) | |
{ | |
for(i = 0; i < len; i++) | |
{ | |
buf[i] = _strtoul(argv[i], NULL, 16); | |
} | |
ret = air_sptag_decodeRx(0, buf, len, &sptag_rx); | |
if (AIR_E_OK != ret) | |
{ | |
AIR_PRINT("SpTag decode fail\n"); | |
return ret; | |
} | |
AIR_PRINT("SpTag decode success:\n"); | |
AIR_PRINT("RSN : %s\n", _sptag_pt[sptag_rx.rsn]); | |
AIR_PRINT("VPM : %s\n", _sptag_vpm[sptag_rx.vpm]); | |
AIR_PRINT("SPN : %d\n", sptag_rx.spn); | |
AIR_PRINT("PRI : %d\n", sptag_rx.pri); | |
AIR_PRINT("CFI : %d\n", sptag_rx.cfi); | |
AIR_PRINT("VID : %d\n", sptag_rx.vid); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doSptagEncode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
AIR_STAG_TX_PARA_T sptag_tx = {0}; | |
UI8_T buf[AIR_STAG_BUF_LEN] = {0}; | |
UI32_T len = AIR_STAG_BUF_LEN; | |
char str[128] = {'\0'}; | |
UI32_T data = 0; | |
AIR_STAG_MODE_T mode = AIR_STAG_MODE_LAST; | |
if (7 == argc) | |
{ | |
if(_strcmp(argv[0],"mode=replace") == 0) | |
mode = AIR_STAG_MODE_REPLACE; | |
else if(_strcmp(argv[0],"mode=insert") == 0) | |
mode = AIR_STAG_MODE_INSERT; | |
else | |
printf("mode is wrong!!"); | |
if(_strcmp(argv[1],"opc=portmap") == 0) | |
sptag_tx.opc = AIR_STAG_OPC_PORTMAP; | |
else if(_strcmp(argv[1],"opc=portid") == 0) | |
sptag_tx.opc = AIR_STAG_OPC_PORTID; | |
else if(_strcmp(argv[1],"opc=lookup") == 0) | |
sptag_tx.opc = AIR_STAG_OPC_LOOKUP; | |
else | |
printf("opc is wrong!!"); | |
if(sscanf(argv[2],"dp=%x",&data) != -1) | |
{ | |
sptag_tx.pbm = data; | |
AIR_PRINT("sptag_tx.pbm %x\n",sptag_tx.pbm); | |
} | |
if(_strcmp(argv[3],"vpm=untagged") == 0) | |
sptag_tx.vpm = AIR_STAG_VPM_UNTAG; | |
else if(_strcmp(argv[3],"vpm=8100") == 0) | |
sptag_tx.vpm = AIR_STAG_VPM_TPID_8100; | |
else if(_strcmp(argv[3],"vpm=88a8") == 0) | |
sptag_tx.vpm = AIR_STAG_VPM_TPID_88A8; | |
else | |
printf("vpm is wrong!!"); | |
if(sscanf(argv[4],"pri=%d",&data) != -1) | |
{ | |
sptag_tx.pri = data; | |
AIR_PRINT("sptag_tx.pri %d\n",sptag_tx.pri); | |
} | |
if(sscanf(argv[5],"cfi=%d",&data) != -1) | |
{ | |
sptag_tx.cfi = data; | |
AIR_PRINT("sptag_tx.cfi %d\n",sptag_tx.cfi); | |
} | |
if(sscanf(argv[6],"vid=%d",&data) != -1) | |
{ | |
sptag_tx.vid = data; | |
AIR_PRINT("sptag_tx.vid %d\n",sptag_tx.vid); | |
} | |
ret = air_sptag_encodeTx(0,mode, &sptag_tx, (UI8_T *)&buf, &len); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("SpTag encode sucess, returned len=%d\n", len); | |
AIR_PRINT("Encoded SpTag: %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3]); | |
} | |
else | |
{ | |
AIR_PRINT("SpTag encode fail\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doSptag( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(sptagCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doL2Dump( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(l2DumpCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doMacAddr( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
AIR_MAC_ENTRY_T mt; | |
UI32_T fwd = 0; | |
memset(&mt, 0, sizeof(AIR_MAC_ENTRY_T)); | |
if(0 == argc) | |
{ | |
/* l2 clear mac */ | |
ret = air_l2_clearMacAddr(0); | |
if(ret == AIR_E_OK) | |
AIR_PRINT("Clear MAC Address Table Done.\n"); | |
else | |
AIR_PRINT("Clear MAC Address Table Fail.\n"); | |
} | |
else if(3 == argc) | |
{ | |
/* l2 del mac <mac(12'hex)> { vid <vid(0..4095)> | fid <fid(0..15)> } */ | |
ret = _str2mac(argv[0], (C8_T *)mt.mac); | |
if(ret != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return ret; | |
} | |
/* check argument 1 */ | |
if(FALSE == _strcmp(argv[1], "vid")) | |
{ | |
/* get mac entry by MAC address & vid */ | |
mt.cvid = _strtoul(argv[2], NULL, 0); | |
mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_IVL; | |
AIR_PRINT("Get MAC Address:" MAC_STR " with vid:%u", MAC2STR(mt.mac), mt.cvid); | |
} | |
else if(FALSE == _strcmp(argv[1], "fid")) | |
{ | |
/* get mac entry by MAC address & fid */ | |
mt.fid = _strtoul(argv[2], NULL, 0); | |
AIR_PRINT("Get MAC Address:" MAC_STR " with fid:%u", MAC2STR(mt.mac), mt.fid); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
ret = air_l2_delMacAddr(0, &mt); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT(" Done.\n"); | |
} | |
else | |
AIR_PRINT("\n Fail!\n"); | |
} | |
else if(7 == argc) | |
{ | |
/* l2 add mac <static(0:dynamic,1:static)> <unauth(0:auth,1:unauth)> <mac(12'hex)> <portlist(uintlist)> [ vid <vid(0..4095)> | fid <fid(0..15)> ] <src_mac_forward=(0:default,1:cpu-include,2:cpu-exclude,3:cpu-only,4:drop)> */ | |
if(argv[0]) | |
mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_STATIC; | |
if(argv[1]) | |
mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_UNAUTH; | |
ret = _str2mac(argv[2], (C8_T *)mt.mac); | |
if(ret != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return ret; | |
} | |
ret = _portListStr2Ary(argv[3], mt.port_bitmap, 1); | |
if(ret != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return ret; | |
} | |
/* check argument fid or vid */ | |
if(FALSE == _strcmp(argv[4], "vid")) | |
{ | |
/* get mac entry by MAC address & vid */ | |
mt.cvid = _strtoul(argv[5], NULL, 0); | |
mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_IVL; | |
} | |
else if(FALSE == _strcmp(argv[4], "fid")) | |
{ | |
/* get mac entry by MAC address & fid */ | |
mt.fid = _strtoul(argv[5], NULL, 0); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
fwd = _strtoul(argv[6], NULL, 0); | |
if(0 == fwd) | |
mt.sa_fwd = AIR_L2_FWD_CTRL_DEFAULT; | |
else if(1 == fwd) | |
mt.sa_fwd = AIR_L2_FWD_CTRL_CPU_INCLUDE; | |
else if(2 == fwd) | |
mt.sa_fwd = AIR_L2_FWD_CTRL_CPU_EXCLUDE; | |
else if(3 == fwd) | |
mt.sa_fwd = AIR_L2_FWD_CTRL_CPU_ONLY; | |
else if(4 == fwd) | |
mt.sa_fwd = AIR_L2_FWD_CTRL_DROP; | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
ret = air_l2_addMacAddr(0, &mt); | |
AIR_PRINT("Add MAC Address:" MAC_STR, MAC2STR(mt.mac)); | |
if(ret == AIR_E_OK) | |
AIR_PRINT(" Done.\n"); | |
else | |
AIR_PRINT(" Fail.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
_printMacEntry( | |
AIR_MAC_ENTRY_T *mt, | |
UI32_T age_unit, | |
UI8_T count, | |
UI8_T title) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
I32_T i = 0, j = 0; | |
UI8_T first = 0; | |
UI8_T find = 0; | |
if(title) | |
{ | |
AIR_PRINT("%-6s%-15s%-5s%-5s%-5s%-10s%-10s%-6s\n", | |
"unit", | |
"mac", | |
"ivl", | |
"vid", | |
"fid", | |
"age-time", | |
"forward", | |
"port"); | |
return ret; | |
} | |
for(i = 0; i < count; i++) | |
{ | |
AIR_PRINT("%-6d", age_unit); | |
AIR_PRINT(MAC_STR, MAC2STR(mt[i].mac)); | |
AIR_PRINT("..."); | |
if(mt[i].flags & AIR_L2_MAC_ENTRY_FLAGS_IVL) | |
{ | |
AIR_PRINT("%-3s..", "ivl"); | |
AIR_PRINT("%-5d", mt[i].cvid); | |
AIR_PRINT("%-5s", "....."); | |
} | |
else | |
{ | |
AIR_PRINT("%-3s..", "svl"); | |
AIR_PRINT("%-5s", "....."); | |
AIR_PRINT("%-5d", mt[i].fid); | |
} | |
if(mt[i].flags & AIR_L2_MAC_ENTRY_FLAGS_STATIC) | |
{ | |
AIR_PRINT("%-10s.", "static"); | |
} | |
else | |
{ | |
AIR_PRINT("%d sec..", mt[i].timer); | |
} | |
AIR_PRINT("%-10s", _air_mac_address_forward_control_string[mt[i].sa_fwd]); | |
first = 0; | |
find = 0; | |
for (j = (AIR_MAX_NUM_OF_PORTS - 1); j >= 0; j--) | |
{ | |
if((mt[i].port_bitmap[0]) & (1 << j)) | |
{ | |
first = j; | |
find = 1; | |
break; | |
} | |
} | |
if(find) | |
{ | |
for (j = 0; j < AIR_MAX_NUM_OF_PORTS; j++) | |
{ | |
if((mt[i].port_bitmap[0]) & (1 << j)) | |
{ | |
if(j == first) | |
AIR_PRINT("%-2d", j); | |
else | |
AIR_PRINT("%-2d,", j); | |
} | |
} | |
} | |
else | |
AIR_PRINT("no dst port"); | |
AIR_PRINT("\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doGetMacAddr( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI8_T count = 0; | |
AIR_MAC_ENTRY_T * ptr_mt; | |
if(3 == argc) | |
{ | |
ptr_mt = AIR_MALLOC(sizeof(AIR_MAC_ENTRY_T)); | |
if (NULL == ptr_mt) | |
{ | |
AIR_PRINT("***Error***, allocate memory fail\n"); | |
return AIR_E_OTHERS; | |
} | |
memset(ptr_mt, 0, sizeof(AIR_MAC_ENTRY_T)); | |
/* l2 get mac <mac(12'hex)> { vid <vid(0..4095)> | fid <fid(0..15)> } */ | |
ret = _str2mac(argv[0], (C8_T *)ptr_mt->mac); | |
if(ret != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
AIR_FREE(ptr_mt); | |
return ret; | |
} | |
/* check argument 1 */ | |
if(FALSE == _strcmp(argv[1], "vid")) | |
{ | |
/* get mac entry by MAC address & vid */ | |
ptr_mt->cvid = _strtoul(argv[2], NULL, 0); | |
ptr_mt->flags |= AIR_L2_MAC_ENTRY_FLAGS_IVL; | |
AIR_PRINT("Get MAC Address:" MAC_STR " with vid:%u", MAC2STR(ptr_mt->mac), ptr_mt->cvid); | |
} | |
else if(FALSE == _strcmp(argv[1], "fid")) | |
{ | |
/* get mac entry by MAC address & fid */ | |
ptr_mt->fid = _strtoul(argv[2], NULL, 0); | |
AIR_PRINT("Get MAC Address:" MAC_STR " with fid:%u", MAC2STR(ptr_mt->mac), ptr_mt->fid); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
AIR_FREE(ptr_mt); | |
return AIR_E_BAD_PARAMETER; | |
} | |
ret = air_l2_getMacAddr(0, &count, ptr_mt); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT(" Done.\n"); | |
_printMacEntry(ptr_mt, 0, 1, TRUE); | |
_printMacEntry(ptr_mt, 0, 1, FALSE); | |
} | |
else | |
AIR_PRINT("\n Not found!\n"); | |
AIR_FREE(ptr_mt); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doMacAddrAgeOut( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T time = 0; | |
if(0 == argc) | |
{ | |
/* l2 get macAddrAgeOut */ | |
ret = air_l2_getMacAddrAgeOut(0, &time); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get MAC Address Age Out Time Done.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Get MAC Address Age Out Time Fail.\n"); | |
} | |
} | |
else if(1 == argc) | |
{ | |
/* l2 set macAddrAgeOut <time(1, 1000000)> */ | |
time = _strtoul(argv[0], NULL, 0); | |
if(time < 1 || time > 1000000) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
ret = air_l2_setMacAddrAgeOut(0, time); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set MAC Address Age Out Time Done.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Set MAC Address Age Out Time Fail.\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("MAC Address Age Out Time: %u seconds.\n", time); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doDumpMacAddr( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
AIR_MAC_ENTRY_T *ptr_mt; | |
UI8_T count = 0; | |
UI32_T bucket_size = 0; | |
UI32_T total_count = 0; | |
if(0 != argc) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
/* get unit of aging time */ | |
ret = air_l2_getMacBucketSize(0, &bucket_size); | |
if(ret != AIR_E_OK) | |
{ | |
AIR_PRINT("Get MAC Age Time Fail!\n"); | |
return ret; | |
} | |
ptr_mt = AIR_MALLOC(sizeof(AIR_MAC_ENTRY_T) * bucket_size); | |
if (NULL == ptr_mt) | |
{ | |
AIR_PRINT("***Error***, allocate memory fail\n"); | |
return AIR_E_OTHERS; | |
} | |
memset(ptr_mt, 0, sizeof(AIR_MAC_ENTRY_T) * bucket_size); | |
_printMacEntry(ptr_mt, 0, count, TRUE); | |
/* get 1st entry of MAC table */ | |
ret = air_l2_getMacAddr(0, &count, ptr_mt); | |
switch(ret) | |
{ | |
case AIR_E_ENTRY_NOT_FOUND: | |
AIR_FREE(ptr_mt); | |
AIR_PRINT("Not Found!\n"); | |
return ret; | |
case AIR_E_TIMEOUT: | |
AIR_FREE(ptr_mt); | |
AIR_PRINT("Time Out!\n"); | |
return ret; | |
case AIR_E_BAD_PARAMETER: | |
AIR_FREE(ptr_mt); | |
AIR_PRINT("Bad Parameter!\n"); | |
return ret; | |
default: | |
break; | |
} | |
total_count += count; | |
_printMacEntry(ptr_mt, 0, count, FALSE); | |
/* get other entries of MAC table */ | |
while(1) | |
{ | |
memset(ptr_mt, 0, sizeof(AIR_MAC_ENTRY_T) * bucket_size); | |
ret = air_l2_getNextMacAddr(0, &count, ptr_mt); | |
if(AIR_E_OK != ret) | |
{ | |
break; | |
} | |
total_count += count; | |
_printMacEntry(ptr_mt, 0, count, FALSE); | |
} | |
switch(ret) | |
{ | |
case AIR_E_TIMEOUT: | |
AIR_PRINT("Time Out!\n"); | |
break; | |
case AIR_E_BAD_PARAMETER: | |
AIR_PRINT("Bad Parameter!\n"); | |
break; | |
default: | |
AIR_PRINT("Found %u %s\n", total_count, (total_count>1)?"entries":"entry"); | |
break; | |
} | |
AIR_FREE(ptr_mt); | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLagMember( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T portrunk_index = 0, member_index = 0, member_enable = 0, port_index = 0, i = 0; | |
AIR_LAG_PTGINFO_T member; | |
memset(&member,0,sizeof(AIR_LAG_PTGINFO_T)); | |
if(4 == argc) | |
{ | |
/* lag set member <port trunk index> <member index> <member enable> <port_index>*/ | |
portrunk_index = _strtol(argv[0], NULL, 10); | |
member_index = _strtol(argv[1], NULL, 10); | |
member_enable = _strtol(argv[2], NULL, 10); | |
port_index = _strtol(argv[3], NULL, 10); | |
ret = air_lag_setMember(0, portrunk_index, member_index, member_enable,port_index); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set port trunk index %d member_index:%d member_enable:%d, port_index:%d ok.\n", portrunk_index, member_index, member_enable,port_index); | |
} | |
else | |
{ | |
AIR_PRINT("Set port trunk index %d member_index:%d member_enable:%d, port_index:%d fail.\n", portrunk_index, member_index, member_enable,port_index); | |
} | |
memset(&member,0,sizeof(member)); | |
air_lag_getMember(0, portrunk_index, &member); | |
if(! member.csr_gp_enable[0]) | |
{ | |
AIR_PRINT("\r\n!!!!!!!!!Port trunk index %d member_index:0 must be set,or else have taffic issues.\n", portrunk_index); | |
} | |
} | |
else if(1 == argc) | |
{ | |
portrunk_index = _strtol(argv[0], NULL, 10); | |
/* lag get member <port> */ | |
memset(&member,0,sizeof(member)); | |
ret = air_lag_getMember(0, portrunk_index, &member); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get port trunk %u member:\n", portrunk_index); | |
for(i = 0; i < AIR_LAG_MAX_MEM_NUM; i++) | |
{ | |
if(member.csr_gp_enable[i]) | |
AIR_PRINT("port %d \r\n", member.csr_gp_port[i]); | |
} | |
AIR_PRINT("\r\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Get port trunk:%u Member Fail.\n", portrunk_index); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLagDstInfo( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
AIR_LAG_DISTINFO_T dstInfo; | |
memset(&dstInfo, 0, sizeof(AIR_LAG_DISTINFO_T)); | |
if(7 == argc) | |
{ | |
/* lag set dstInfo <sp> <sa> <da> <sip> <dip> <sport> <dport> */ | |
dstInfo.sp = _strtol(argv[0], NULL, 10) & BIT(0); | |
dstInfo.sa = _strtol(argv[1], NULL, 10) & BIT(0); | |
dstInfo.da = _strtol(argv[2], NULL, 10) & BIT(0); | |
dstInfo.sip = _strtol(argv[3], NULL, 10) & BIT(0); | |
dstInfo.dip = _strtol(argv[4], NULL, 10) & BIT(0); | |
dstInfo.sport = _strtol(argv[5], NULL, 10) & BIT(0); | |
dstInfo.dport = _strtol(argv[6], NULL, 10) & BIT(0); | |
ret = air_lag_setDstInfo(0, dstInfo); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set LAG packet distrubution.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Set LAG packet distrubution Fail.\n"); | |
} | |
} | |
else if(0 == argc) | |
{ | |
/* lag get dstInfo */ | |
ret = air_lag_getDstInfo(0, &dstInfo); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get LAG packet distrubution:\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Get LAG packet distrubution Fail.\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("%-5s|%-5s|%-5s|%-5s|%-5s|%-5s|%-5s\n", | |
"SP", "SA", "DA", "SIP", "DIP", "SPORT", "DPORT"); | |
AIR_PRINT("%-5s|%-5s|%-5s|%-5s|%-5s|%-5s|%-5s\n", | |
(dstInfo.sp)?"En":"Dis", | |
(dstInfo.sa)?"En":"Dis", | |
(dstInfo.da)?"En":"Dis", | |
(dstInfo.sip)?"En":"Dis", | |
(dstInfo.dip)?"En":"Dis", | |
(dstInfo.sport)?"En":"Dis", | |
(dstInfo.dport)?"En":"Dis"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLagHashtype( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T hashtype = 0; | |
if(1 == argc) | |
{ | |
hashtype = _strtol(argv[0], NULL, 10); | |
ret = air_lag_sethashtype(0, hashtype); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set LAG hashtype Ok.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Set LAG hashtype Fail.\n"); | |
} | |
} | |
else if(0 == argc) | |
{ | |
/* lag get dstInfo */ | |
ret = air_lag_gethashtype(0, &hashtype); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get LAG hashtype:\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Get LLAG hashtype Fail.\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
switch (hashtype) | |
{ | |
case 0: | |
AIR_PRINT("hashtype:crc32lsb.\n"); | |
break; | |
case 1: | |
AIR_PRINT("hashtype:crc32msb.\n"); | |
break; | |
case 2: | |
AIR_PRINT("hashtype:crc16.\n"); | |
break; | |
case 3: | |
AIR_PRINT("hashtype:xor4.\n"); | |
break; | |
default: | |
AIR_PRINT("wrong hashtype:%d.\n",hashtype); | |
} | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLagPtseed( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T ptseed = 0; | |
if(1 == argc) | |
{ | |
ptseed = _strtol(argv[0], NULL, 16); | |
ret = air_lag_setPTSeed(0, ptseed); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set LAG Port Seed:%x(hex) ok\n",ptseed); | |
} | |
else | |
{ | |
AIR_PRINT("Set LAG Port Seed:%x(hex) fail\n",ptseed); | |
} | |
} | |
else if(0 == argc) | |
{ | |
/* lag get seed */ | |
ret = air_lag_getPTSeed(0, &ptseed); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get port trunk seed: %x(hex)\n",ptseed); | |
} | |
else | |
{ | |
AIR_PRINT("Get port trunk seed Fail.\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLagSpsel( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
UI32_T state = 0; | |
if(1 == argc) | |
{ | |
/* lag set spsel <state> */ | |
state = _strtol(argv[0], NULL, 10); | |
ret = air_lag_setSpSel(0,state); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set source port compare function:%s.\n", (state)?"Enabled":"Disabled"); | |
} | |
else | |
{ | |
AIR_PRINT("Set source port compare function Fail.\n"); | |
} | |
} | |
else if(0 == argc) | |
{ | |
/* lag get spsel*/ | |
ret = air_lag_getSpSel(0, &state); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get source port compare function:%s.\n", (state)?"Enabled":"Disabled"); | |
} | |
else | |
{ | |
AIR_PRINT("Get source port compare function Fail.\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLagState( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
UI32_T state = 0; | |
if(1 == argc) | |
{ | |
/* lag set state <state> */ | |
state = _strtol(argv[0], NULL, 10); | |
ret = air_lag_set_ptgc_state(0,state); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set LAG Port Trunk State:%s.\n", (state)?"Enabled":"Disabled"); | |
} | |
else | |
{ | |
AIR_PRINT("Set LAG Port Trunk State Fail.\n"); | |
} | |
} | |
else if(0 == argc) | |
{ | |
/* lag get state*/ | |
ret = air_lag_get_ptgc_state(0, &state); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get LAG Port Trunk State:%s.\n", (state)?"Enabled":"Disabled"); | |
} | |
else | |
{ | |
AIR_PRINT("Get LAG Port Trunk State Fail.\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLagGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(lagGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doLagSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(lagSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doLag( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(lagCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doStpPortstate( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
UI32_T fid = 0; | |
UI32_T state = 0; | |
port = _strtol(argv[0], NULL, 10); | |
fid = _strtol(argv[1], NULL, 10); | |
if(3 == argc) | |
{ | |
/* stp set portstate <port> <fid(0..15)> <state> */ | |
state = _strtol(argv[2], NULL, 10); | |
ret = air_stp_setPortstate(0, port, fid, state); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set STP Port:%u FID:%u State:", port, fid); | |
switch(state) | |
{ | |
case AIR_STP_STATE_DISABLE: | |
AIR_PRINT("Disable(STP) / Discard(RSTP).\n"); | |
break; | |
case AIR_STP_STATE_LISTEN: | |
AIR_PRINT("Listening(STP) / Discard(RSTP).\n"); | |
break; | |
case AIR_STP_STATE_LEARN: | |
AIR_PRINT("Learning(STP) / Learning(RSTP).\n"); | |
break; | |
case AIR_STP_STATE_FORWARD: | |
AIR_PRINT("Forwarding(STP) / Forwarding(RSTP).\n"); | |
break; | |
default: | |
break; | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Set STP Port:%u FID:%u State Fail.", port, fid); | |
} | |
} | |
else if(2 == argc) | |
{ | |
/* stp get portstate <port> <fid(0..15)> */ | |
ret = air_stp_getPortstate(0, port, fid, &state); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get STP Port:%u FID:%u State:", port, fid); | |
switch(state) | |
{ | |
case AIR_STP_STATE_DISABLE: | |
AIR_PRINT("Disable(STP) / Discard(RSTP).\n"); | |
break; | |
case AIR_STP_STATE_LISTEN: | |
AIR_PRINT("Listening(STP) / Discard(RSTP).\n"); | |
break; | |
case AIR_STP_STATE_LEARN: | |
AIR_PRINT("Learning(STP) / Learning(RSTP).\n"); | |
break; | |
case AIR_STP_STATE_FORWARD: | |
AIR_PRINT("Forwarding(STP) / Forwarding(RSTP).\n"); | |
break; | |
default: | |
break; | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Get STP Port:%u FID:%u State Fail.", port, fid); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doStpGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(stpGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doStpSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(stpSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doStp( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(stpCmds, argc, argv); | |
} | |
static void | |
_mir_printPortList(UI32_T * mt) | |
{ | |
I8_T j = 0; | |
UI8_T first = 0; | |
UI8_T find = 0; | |
for(j = (AIR_MAX_NUM_OF_PORTS - 1); j >= 0; j--) | |
{ | |
if((*mt) & (1 << j)) | |
{ | |
first = j; | |
find = 1; | |
break; | |
} | |
} | |
if(find) | |
{ | |
for(j = 0; j < AIR_MAX_NUM_OF_PORTS; j++) | |
{ | |
if((*mt) & (1 << j)) | |
{ | |
if(j == first) | |
AIR_PRINT("%-2d", j); | |
else | |
AIR_PRINT("%-2d,", j); | |
} | |
} | |
} | |
else | |
AIR_PRINT("NULL"); | |
AIR_PRINT("\n"); | |
} | |
static void | |
_mir_printSrcPortList( | |
const UI32_T unit, | |
const UI32_T sessionid) | |
{ | |
I8_T i = 0; | |
AIR_MIR_SESSION_T session; | |
AIR_PORT_BITMAP_T txPbm = {0}, rxPbm = {0}; | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
memset(&session, 0, sizeof(session)); | |
session.src_port = i; | |
air_mir_getMirrorPort(unit, sessionid, &session); | |
if(session.flags & AIR_MIR_SESSION_FLAGS_DIR_TX) | |
{ | |
txPbm[0] |= (1 << i); | |
} | |
if(session.flags & AIR_MIR_SESSION_FLAGS_DIR_RX) | |
{ | |
rxPbm[0] |= (1 << i); | |
} | |
} | |
AIR_PRINT("Src PortList\n"); | |
AIR_PRINT(" - Rx portlist = "); | |
_mir_printPortList(rxPbm); | |
AIR_PRINT(" - Tx portlist = "); | |
_mir_printPortList(txPbm); | |
} | |
static void | |
_mir_printSession( | |
const UI32_T unit, | |
const UI32_T session_id, | |
const AIR_MIR_SESSION_T *ptr_session) | |
{ | |
AIR_PRINT("Session id: %d\n", session_id); | |
AIR_PRINT("State: %s \n", (ptr_session->flags & AIR_MIR_SESSION_FLAGS_ENABLE)? "enable": "disable"); | |
AIR_PRINT("Tx tag: %s \n", (ptr_session->flags & AIR_MIR_SESSION_FLAGS_TX_TAG_OBEY_CFG)? "On": "Off"); | |
AIR_PRINT("Dst port: %d \n", ptr_session->dst_port); | |
_mir_printSrcPortList(unit,session_id); | |
} | |
static AIR_ERROR_NO_T | |
doMirrorGetSid( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
UI32_T session_id = 0; | |
AIR_MIR_SESSION_T session = {0}; | |
I8_T i = 0; | |
session_id = _strtoul(argv[0], NULL, 0); | |
rc = air_mir_getSession(0, session_id, &session); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***, get mirror session fail\n"); | |
return rc; | |
} | |
/* print session information */ | |
if(session.dst_port == AIR_PORT_INVALID) | |
{ | |
AIR_PRINT("Session id %d not found\n", session_id); | |
} | |
else | |
{ | |
_mir_printSession(0, session_id, &session); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doMirrorDelSid( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
UI32_T session_id = 0; | |
AIR_MIR_SESSION_T session = {0}; | |
UI8_T i = 0; | |
session_id = _strtoul(argv[0], NULL, 0); | |
rc = air_mir_delSession(0, session_id); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***, del mirror session fail\n"); | |
return rc; | |
} | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
session.src_port = i; | |
rc = air_mir_setMirrorPort(0, session_id, &session); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***,port=%u error\n", i); | |
return rc; | |
} | |
} | |
if (rc != AIR_E_OK) | |
{ | |
AIR_PRINT("***Error***, delete mirror session fail\n"); | |
} | |
else | |
AIR_PRINT("***OK***, delete mirror session success\n"); | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doMirrorAddRlist( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
UI32_T session_id = 0; | |
AIR_MIR_SESSION_T session = {0}; | |
AIR_PORT_BITMAP_T rxPbm = {0}; | |
UI8_T i = 0; | |
/*mirror add session-rlist <sid(0..3)> <list(UINTLIST)>*/ | |
session_id = _strtoul(argv[0], NULL, 0); | |
rc = _portListStr2Ary(argv[1], rxPbm, 1); | |
if(rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return rc; | |
} | |
if(!rxPbm[0]) | |
{ | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
memset(&session, 0, sizeof(AIR_MIR_SESSION_T)); | |
session.src_port = i; | |
rc = air_mir_getMirrorPort(0, session_id, &session); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***,get port=%u error\n", i); | |
return rc; | |
} | |
session.flags &= ~AIR_MIR_SESSION_FLAGS_DIR_RX; | |
session.src_port = i; | |
rc = air_mir_setMirrorPort(0, session_id, &session); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***,set rx port=%u error\n", i); | |
return rc; | |
} | |
} | |
} | |
else | |
{ | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(rxPbm[0] & (1 << i)) | |
{ | |
memset(&session, 0, sizeof(AIR_MIR_SESSION_T)); | |
session.src_port = i; | |
rc = air_mir_getMirrorPort(0, session_id, &session); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***,get port=%u error\n", i); | |
return rc; | |
} | |
session.flags |= AIR_MIR_SESSION_FLAGS_DIR_RX; | |
session.src_port = i; | |
rc = air_mir_setMirrorPort(0, session_id, &session); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***,port=%u error\n", i); | |
return rc; | |
} | |
} | |
} | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doMirrorAddTlist( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
UI32_T session_id = 0; | |
AIR_MIR_SESSION_T session = {0}; | |
AIR_PORT_BITMAP_T txPbm = {0}; | |
UI8_T i = 0; | |
/*mirror add session-tlist <sid(0..3)> <list(UINTLIST)>*/ | |
session_id = _strtoul(argv[0], NULL, 0); | |
rc = _portListStr2Ary(argv[1], txPbm, 1); | |
if(rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return rc; | |
} | |
if(!txPbm[0]) | |
{ | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
memset(&session, 0, sizeof(AIR_MIR_SESSION_T)); | |
session.src_port = i; | |
rc = air_mir_getMirrorPort(0, session_id, &session); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***,get port=%u error\n", i); | |
return rc; | |
} | |
session.flags &= ~AIR_MIR_SESSION_FLAGS_DIR_TX; | |
session.src_port = i; | |
rc = air_mir_setMirrorPort(0, session_id, &session); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***,set rx port=%u error\n", i); | |
return rc; | |
} | |
} | |
} | |
else | |
{ | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(txPbm[0] & (1 << i)) | |
{ | |
memset(&session, 0, sizeof(AIR_MIR_SESSION_T)); | |
session.src_port = i; | |
rc = air_mir_getMirrorPort(0, session_id, &session); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***,get port=%u error\n", i); | |
return rc; | |
} | |
session.flags |= AIR_MIR_SESSION_FLAGS_DIR_TX; | |
session.src_port = i; | |
rc = air_mir_setMirrorPort(0, session_id, &session); | |
if (AIR_E_OK != rc) | |
{ | |
AIR_PRINT("***Error***,port=%u error\n", i); | |
return rc; | |
} | |
} | |
} | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doMirrorSetSessionEnable( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
UI32_T session_id = 0; | |
UI32_T enable = 0; | |
BOOL_T tmp_en = FALSE; | |
/*mirror set session-enable <sid(0..3)> <state(1:En,0:Dis)>*/ | |
session_id = _strtoul(argv[0], NULL, 0); | |
enable = _strtoul(argv[1], NULL, 0); | |
if(enable) | |
tmp_en = TRUE; | |
/* set port mirror state */ | |
rc = air_mir_setSessionAdminMode(0, session_id, tmp_en); | |
if(AIR_E_OK!=rc) | |
{ | |
AIR_PRINT("***Error***\n"); | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doMirrorSetSession( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
UI32_T session_id = 0; | |
UI32_T dst_port = 0; | |
UI8_T enable = 0; | |
UI8_T tag_en = 0; | |
UI8_T dir = 0; | |
AIR_MIR_SESSION_T session = {0}; | |
AIR_PORT_BITMAP_T rxPbm = {0}; | |
I8_T i = 0; | |
/*mirror set session <sid(0..3)> <dst_port(UINT)> <state(1:En,0:Dis)> <tag(1:on, 0:off)> <list(UINTLIST)> <dir(0:none,1:tx,2:rx,3:both)>*/ | |
session_id = _strtoul(argv[0], NULL, 0); | |
dst_port = _strtoul(argv[1], NULL, 0); | |
AIR_PRINT("session id %d dst port %d.\n", session_id, dst_port); | |
session.dst_port = dst_port; | |
enable = _strtoul(argv[2], NULL, 0); | |
if(enable) | |
{ | |
session.flags |= AIR_MIR_SESSION_FLAGS_ENABLE; | |
} | |
else | |
{ | |
session.flags &= ~AIR_MIR_SESSION_FLAGS_ENABLE; | |
} | |
tag_en = _strtoul(argv[3], NULL, 0); | |
if(tag_en) | |
{ | |
session.flags |= AIR_MIR_SESSION_FLAGS_TX_TAG_OBEY_CFG; | |
} | |
else | |
{ | |
session.flags &= ~AIR_MIR_SESSION_FLAGS_TX_TAG_OBEY_CFG; | |
} | |
rc = _portListStr2Ary(argv[4], rxPbm, 1); | |
if(rc != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return rc; | |
} | |
AIR_PRINT("pbm %x.\n", rxPbm); | |
dir = _strtoul(argv[5], NULL, 0); | |
if(dir == 1) | |
{ | |
session.flags |= AIR_MIR_SESSION_FLAGS_DIR_TX; | |
} | |
else if(dir == 2) | |
{ | |
session.flags |= AIR_MIR_SESSION_FLAGS_DIR_RX; | |
} | |
else if(dir == 3) | |
{ | |
session.flags |= AIR_MIR_SESSION_FLAGS_DIR_TX; | |
session.flags |= AIR_MIR_SESSION_FLAGS_DIR_RX; | |
} | |
else if (!dir) | |
{ | |
session.flags &= ~AIR_MIR_SESSION_FLAGS_DIR_TX; | |
session.flags &= ~AIR_MIR_SESSION_FLAGS_DIR_RX; | |
} | |
else | |
{ | |
return AIR_E_BAD_PARAMETER; | |
} | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(rxPbm[0] & (1 << i)) | |
{ | |
session.src_port = i; | |
/* set port mirror session */ | |
rc = air_mir_addSession(0, session_id, &session); | |
if(AIR_E_OK!=rc) | |
{ | |
AIR_PRINT("***Error***,dst-port=%u, src-port=%u error\n", session.dst_port, session.src_port); | |
return rc; | |
} | |
else | |
AIR_PRINT("add session %d,dst-port=%u, src-port=%u\n", session_id, session.dst_port, session.src_port); | |
} | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doMirrorSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(mirrorSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doMirrorAdd( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(mirrorAddCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doMirrorGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(mirrorGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doMirrorDel( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(mirrorDelCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doMirror( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(mirrorCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doMibClearPort( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
if(1 == argc) | |
{ | |
/* mib clear port */ | |
port = _strtoul(argv[0], NULL, 0); | |
ret = air_mib_clear_by_port(0,port); | |
AIR_PRINT("Clear port %d mib stats",port); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Done.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
} | |
} | |
else if(0 == argc) | |
{ | |
/*restart mib counter*/ | |
air_mib_clear(0); | |
AIR_PRINT("Clear all mib stats",port); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doMibClearAcl( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
if(0 == argc) | |
{ | |
/* mib clear acl */ | |
ret = air_mib_clearAclEvent(0); | |
AIR_PRINT("Clear ACL Event Counter "); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Done.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doMibGetPort( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0; | |
UI32_T tmp32 = 0xffffffff; | |
AIR_MIB_CNT_RX_T rx_mib = {0}; | |
AIR_MIB_CNT_TX_T tx_mib = {0}; | |
port = _strtoul(argv[0], NULL, 0); | |
if(1 == argc) | |
{ | |
/* mib get <port(0..6)> */ | |
ret = air_mib_get(0, port, &rx_mib, &tx_mib); | |
AIR_PRINT("Get MIB Counter of Port %u ", port); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Done.\n"); | |
AIR_PRINT("RX Drop Packet : %u\n", rx_mib.RDPC); | |
AIR_PRINT("RX filtering Packet : %u\n", rx_mib.RFPC); | |
AIR_PRINT("RX Unicast Packet : %u\n", rx_mib.RUPC); | |
AIR_PRINT("RX Multicast Packet : %u\n", rx_mib.RMPC); | |
AIR_PRINT("RX Broadcast Packet : %u\n", rx_mib.RBPC); | |
AIR_PRINT("RX Alignment Error Packet : %u\n", rx_mib.RAEPC); | |
AIR_PRINT("RX CRC Packet : %u\n", rx_mib.RCEPC); | |
AIR_PRINT("RX Undersize Packet : %u\n", rx_mib.RUSPC); | |
AIR_PRINT("RX Fragment Error Packet : %u\n", rx_mib.RFEPC); | |
AIR_PRINT("RX Oversize Packet : %u\n", rx_mib.ROSPC); | |
AIR_PRINT("RX Jabber Error Packet : %u\n", rx_mib.RJEPC); | |
AIR_PRINT("RX Pause Packet : %u\n", rx_mib.RPPC); | |
AIR_PRINT("RX Packet Length 64 bytes : %u\n", rx_mib.RL64PC); | |
AIR_PRINT("RX Packet Length 65 ~ 127 bytes : %u\n", rx_mib.RL65PC); | |
AIR_PRINT("RX Packet Length 128 ~ 255 bytes : %u\n", rx_mib.RL128PC); | |
AIR_PRINT("RX Packet Length 256 ~ 511 bytes : %u\n", rx_mib.RL256PC); | |
AIR_PRINT("RX Packet Length 512 ~ 1023 bytes : %u\n", rx_mib.RL512PC); | |
AIR_PRINT("RX Packet Length 1024 ~ 1518 bytes: %u\n", rx_mib.RL1024PC); | |
AIR_PRINT("RX Packet Length 1519 ~ max bytes : %u\n", rx_mib.RL1519PC); | |
AIR_PRINT("RX_CTRL Drop Packet : %u\n", rx_mib.RCDPC); | |
AIR_PRINT("RX Ingress Drop Packet : %u\n", rx_mib.RIDPC); | |
AIR_PRINT("RX ARL Drop Packet : %u\n", rx_mib.RADPC); | |
AIR_PRINT("FLow Control Drop Packet : %u\n", rx_mib.FCDPC); | |
AIR_PRINT("WRED Drop Packtet : %u\n", rx_mib.WRDPC); | |
AIR_PRINT("Mirror Drop Packet : %u\n", rx_mib.MRDPC); | |
AIR_PRINT("RX sFlow Sampling Packet : %u\n", rx_mib.SFSPC); | |
AIR_PRINT("Rx sFlow Total Packet : %u\n", rx_mib.SFTPC); | |
AIR_PRINT("Port Control Drop Packet : %u\n", rx_mib.RXC_DPC); | |
AIR_PRINT("RX Octets good or bad packtes l32 : %u\n", (UI32_T)(rx_mib.ROC & tmp32)); | |
AIR_PRINT("RX Octets good or bad packtes h32 : %u\n", (UI32_T)((rx_mib.ROC >> 32) & tmp32)); | |
AIR_PRINT("RX Octets bad packets l32 : %u\n", (UI32_T)(rx_mib.ROC2 & tmp32)); | |
AIR_PRINT("RX Octets bad packets h32 : %u\n", (UI32_T)((rx_mib.ROC2 >> 32) & tmp32)); | |
AIR_PRINT("\n"); | |
AIR_PRINT("TX Drop Packet : %u\n", tx_mib.TDPC); | |
AIR_PRINT("TX CRC Packet : %u\n", tx_mib.TCRC); | |
AIR_PRINT("TX Unicast Packet : %u\n", tx_mib.TUPC); | |
AIR_PRINT("TX Multicast Packet : %u\n", tx_mib.TMPC); | |
AIR_PRINT("TX Broadcast Packet : %u\n", tx_mib.TBPC); | |
AIR_PRINT("TX Collision Event Count : %u\n", tx_mib.TCEC); | |
AIR_PRINT("TX Single Collision Event Count : %u\n", tx_mib.TSCEC); | |
AIR_PRINT("TX Multiple Conllision Event Count: %u\n", tx_mib.TMCEC); | |
AIR_PRINT("TX Deferred Event Count : %u\n", tx_mib.TDEC); | |
AIR_PRINT("TX Late Collision Event Count : %u\n", tx_mib.TLCEC); | |
AIR_PRINT("TX Excessive Collision Event Count: %u\n", tx_mib.TXCEC); | |
AIR_PRINT("TX Pause Packet : %u\n", tx_mib.TPPC); | |
AIR_PRINT("TX Packet Length 64 bytes : %u\n", tx_mib.TL64PC); | |
AIR_PRINT("TX Packet Length 65 ~ 127 bytes : %u\n", tx_mib.TL65PC); | |
AIR_PRINT("TX Packet Length 128 ~ 255 bytes : %u\n", tx_mib.TL128PC); | |
AIR_PRINT("TX Packet Length 256 ~ 511 bytes : %u\n", tx_mib.TL256PC); | |
AIR_PRINT("TX Packet Length 512 ~ 1023 bytes : %u\n", tx_mib.TL512PC); | |
AIR_PRINT("TX Packet Length 1024 ~ 1518 bytes: %u\n", tx_mib.TL1024PC); | |
AIR_PRINT("TX Packet Length 1519 ~ max bytes : %u\n", tx_mib.TL1519PC); | |
AIR_PRINT("TX Oversize Drop Packet : %u\n", tx_mib.TODPC); | |
AIR_PRINT("TX Octets good or bad packtes l32 : %u\n", (UI32_T)(tx_mib.TOC & tmp32)); | |
AIR_PRINT("TX Octets good or bad packtes h32 : %u\n", (UI32_T)((tx_mib.TOC >> 32) & tmp32)); | |
AIR_PRINT("TX Octets bad packets l32 : %u\n", (UI32_T)(tx_mib.TOC2 & tmp32)); | |
AIR_PRINT("TX Octets bad packets h32 : %u\n", (UI32_T)((tx_mib.TOC2 >> 32) & tmp32)); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doMibGetAcl( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T event = 0; | |
UI32_T cnt = 0; | |
if(1 == argc) | |
{ | |
/* mib get acl <event(0..7)> */ | |
event = _strtoul(argv[0], NULL, 0); | |
ret = air_mib_getAclEvent(0, event, &cnt); | |
AIR_PRINT("Get counter of ACL event %u ", event); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Done.\n"); | |
AIR_PRINT("ACL Event Counter:%u\n", cnt); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doMibClear( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(mibClearCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doMibGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(mibGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doMib( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(mibCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doQosRateLimitExMngFrm( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T dir = 0; | |
BOOL_T enable = FALSE; | |
dir = _strtoul(argv[0], NULL, 0); | |
if(2 == argc) | |
{ | |
if(dir == 0) | |
dir = AIR_QOS_RATE_DIR_EGRESS; | |
else if(dir == 1) | |
dir = AIR_QOS_RATE_DIR_INGRESS; | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
return ret; | |
} | |
enable = _strtoul(argv[1], NULL, 0); | |
ret = air_qos_setRateLimitExMngFrm(0, dir, enable); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Success.\n"); | |
AIR_PRINT("Set %s Rate Limit Control %s management frame.\n", | |
(AIR_QOS_RATE_DIR_INGRESS == dir)?"Ingress":"Egress", | |
(TRUE == enable)?"exclude":"include"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
return ret; | |
} | |
} | |
else if(0 == argc) | |
{ | |
dir = AIR_QOS_RATE_DIR_EGRESS; | |
ret = air_qos_getRateLimitExMngFrm(0, dir, &enable); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Success.\n"); | |
AIR_PRINT("Get %s Rate Limit Control %s management frame.\n", | |
(AIR_QOS_RATE_DIR_INGRESS == dir)?"Ingress":"Egress", | |
(TRUE == enable)?"exclude":"include"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
return ret; | |
} | |
dir = AIR_QOS_RATE_DIR_INGRESS; | |
ret = air_qos_getRateLimitExMngFrm(0, dir, &enable); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Success.\n"); | |
AIR_PRINT("Get %s Rate Limit Control %s management frame.\n", | |
(AIR_QOS_RATE_DIR_INGRESS == dir)?"Ingress":"Egress", | |
(TRUE == enable)?"exclude":"include"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
return ret; | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doQosPortPriority( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
AIR_PORT_BITMAP_T portlist = {0}; | |
UI32_T priority = 0; | |
UI8_T i = 0; | |
ret = _portListStr2Ary(argv[0], portlist, 1); | |
if(ret != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return ret; | |
} | |
if(2 == argc) | |
{ | |
priority = _strtoul(argv[1], NULL, 0); | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(portlist[0] & (1 << i)) | |
{ | |
ret = air_qos_setPortPriority(0, i, priority); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set Port%02d port based priority %d Success.\n", i, priority); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d port based priority %d Fail.\n", i, priority); | |
} | |
} | |
} | |
} | |
else if(1 == argc) | |
{ | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(portlist[0] & (1 << i)) | |
{ | |
ret = air_qos_getPortPriority(0, i, &priority); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get Port%d port based priority %d.\n", i, priority); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%d port based priority Fail.\n", i); | |
} | |
} | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doQosRateLimit( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
AIR_PORT_BITMAP_T portlist = {0}; | |
AIR_QOS_RATE_LIMIT_CFG_T rl = {0}; | |
UI8_T i = 0; | |
ret = _portListStr2Ary(argv[0], portlist, 1); | |
if(ret != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return ret; | |
} | |
if(5 == argc) | |
{ | |
rl.ingress_cir = _strtoul(argv[1], NULL, 0); | |
rl.ingress_cbs = _strtoul(argv[2], NULL, 0); | |
rl.egress_cir = _strtoul(argv[3], NULL, 0); | |
rl.egress_cbs = _strtoul(argv[4], NULL, 0); | |
rl.flags |= AIR_QOS_RATE_LIMIT_CFG_FLAGS_ENABLE_INGRESS; | |
rl.flags |= AIR_QOS_RATE_LIMIT_CFG_FLAGS_ENABLE_EGRESS; | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(portlist[0] & (1 << i)) | |
{ | |
ret = air_qos_setRateLimit(0, i, &rl); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Set Port%02d Ingress CIR %d CBS %d Egress CIR %d CBS %d Success.\n", i, rl.ingress_cir, rl.ingress_cbs, rl.egress_cir, rl.egress_cbs); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d Ingress CIR %d CBS %d Egress CIR %d CBS %d Fail.\n", i, rl.ingress_cir, rl.ingress_cbs, rl.egress_cir, rl.egress_cbs); | |
} | |
} | |
} | |
} | |
else if(1 == argc) | |
{ | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(portlist[0] & (1 << i)) | |
{ | |
ret = air_qos_getRateLimit(0, i, &rl); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("Get Port%02d Ingress CIR %d CBS %d Egress CIR %d CBS %d\n", i, rl.ingress_cir, rl.ingress_cbs, rl.egress_cir, rl.egress_cbs); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d Rate Info Fail.\n", i); | |
} | |
} | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doQosRateLimitEnable( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
AIR_PORT_BITMAP_T portlist = {0}; | |
C8_T sten[2][10] = {"Disable", "Enable"}; | |
C8_T stdir[2][10] = {"Egress", "Ingress"}; | |
UI32_T dir = 0, en = 0; | |
AIR_QOS_RATE_DIR_T tmp_dir = AIR_QOS_RATE_DIR_LAST; | |
BOOL_T state = FALSE; | |
UI8_T i = 0; | |
ret = _portListStr2Ary(argv[0], portlist, 1); | |
if(ret != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return ret; | |
} | |
if(3 == argc) | |
{ | |
dir = _strtoul(argv[1], NULL, 0); | |
en = _strtoul(argv[2], NULL, 0); | |
if(dir == 0) | |
tmp_dir = AIR_QOS_RATE_DIR_EGRESS; | |
else if(dir == 1) | |
tmp_dir = AIR_QOS_RATE_DIR_INGRESS; | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(en) | |
state= TRUE; | |
else | |
state = FALSE; | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(portlist[0] & (1 << i)) | |
{ | |
ret = air_qos_setRateLimitEnable(0, i, tmp_dir, state); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Set Port%02d %s rate %s Success.\n", i, stdir[dir], sten[en]); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d %s rate %s Fail.\n", i, stdir[dir], sten[en]); | |
} | |
} | |
} | |
} | |
else if(1 == argc) | |
{ | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(portlist[0] & (1 << i)) | |
{ | |
tmp_dir = AIR_QOS_RATE_DIR_EGRESS; | |
dir = 0; | |
ret = air_qos_getRateLimitEnable(0, i, tmp_dir, &state); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Get Port%02d %s rate %s Success.\n", i, stdir[dir], sten[state]); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d %s rate state Fail.\n", i, stdir[dir]); | |
} | |
tmp_dir = AIR_QOS_RATE_DIR_INGRESS; | |
dir = 1; | |
ret = air_qos_getRateLimitEnable(0, i, tmp_dir, &state); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Get Port%02d %s rate %s Success.\n", i, stdir[dir], sten[state]); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d %s rate state Fail.\n", i, stdir[dir]); | |
} | |
} | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doQosDscp2Pri( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T dscp = 0, priority = 0; | |
dscp = _strtoul(argv[0], NULL, 0); | |
if(2 == argc) | |
{ | |
priority = _strtoul(argv[1], NULL, 0); | |
ret = air_qos_setDscp2Pri(0, dscp, priority); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Set DSCP %d to priority %d Success.\n", dscp, priority); | |
} | |
else | |
{ | |
AIR_PRINT("Set DSCP %d to priority %d Fail.\n", dscp, priority); | |
} | |
} | |
else if(1 == argc) | |
{ | |
ret = air_qos_getDscp2Pri(0, dscp, &priority); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Get DSCP %d to priority %d\n", dscp, priority); | |
} | |
else | |
{ | |
AIR_PRINT("Get DSCP %d to priority Fail.\n", dscp); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doQosPri2Queue( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T priority = 0, queue = 0; | |
priority = _strtoul(argv[1], NULL, 0); | |
if(2 == argc) | |
{ | |
priority = _strtoul(argv[0], NULL, 0); | |
queue = _strtoul(argv[1], NULL, 0); | |
ret = air_qos_setPri2Queue(0, priority, queue); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Set priority %d to queue %d Success.\n", priority, queue); | |
} | |
else | |
{ | |
AIR_PRINT("Set priority %d to queue %d Fail.\n", priority, queue); | |
} | |
} | |
else | |
{ | |
for(; priority < AIR_QOS_QUEUE_MAX_NUM; priority++) | |
{ | |
ret = air_qos_getPri2Queue(0, priority, &queue); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Get priority %d to queue %d\n", priority, queue); | |
} | |
else | |
{ | |
AIR_PRINT("Get priority %d to queue Fail.\n", priority); | |
} | |
} | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doQosTrustMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T mode = 0; | |
C8_T bs[4][13] = {"port", "1p_port", "dscp_port", "dscp_1p_port"}; | |
AIR_QOS_TRUST_MODE_T mode_t = AIR_QOS_TRUST_MODE_LAST; | |
AIR_PORT_BITMAP_T portlist = {0}; | |
UI8_T i = 0; | |
ret = _portListStr2Ary(argv[0], portlist, 1); | |
if(ret != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return ret; | |
} | |
if(2 == argc) | |
{ | |
mode = _strtoul(argv[1], NULL, 0); | |
if(mode == 0) | |
mode_t = AIR_QOS_TRUST_MODE_PORT; | |
else if(mode == 1) | |
mode_t = AIR_QOS_TRUST_MODE_1P_PORT; | |
else if(mode == 2) | |
mode_t = AIR_QOS_TRUST_MODE_DSCP_PORT; | |
else if(mode == 3) | |
mode_t = AIR_QOS_TRUST_MODE_DSCP_1P_PORT; | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(portlist[0] & (1 << i)) | |
{ | |
ret = air_qos_setTrustMode(0, i, mode_t); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("port %d Set Trust mode %s Success.\n", i, bs[mode]); | |
} | |
else | |
{ | |
AIR_PRINT("port %d Set Trust mode %s Fail.\n", i, bs[mode]); | |
} | |
} | |
} | |
} | |
else if(1 == argc) | |
{ | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(portlist[0] & (1 << i)) | |
{ | |
mode_t = AIR_QOS_TRUST_MODE_LAST; | |
ret = air_qos_getTrustMode(0, i, &mode_t); | |
if(AIR_E_OK == ret) | |
{ | |
if(mode_t == AIR_QOS_TRUST_MODE_PORT) | |
mode = 0; | |
else if(mode_t == AIR_QOS_TRUST_MODE_1P_PORT) | |
mode = 1; | |
else if(mode_t == AIR_QOS_TRUST_MODE_DSCP_PORT) | |
mode = 2; | |
else if(mode_t == AIR_QOS_TRUST_MODE_DSCP_1P_PORT) | |
mode = 3; | |
else | |
{ | |
AIR_PRINT("port %d Get Trust mode Fail.\n", i); | |
return AIR_E_OTHERS; | |
} | |
AIR_PRINT("port %d Get Trust mode %s\n", i, bs[mode]); | |
} | |
else | |
{ | |
AIR_PRINT("port %d Get Trust mode Fail.\n", i); | |
} | |
} | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doQosScheduleAlgo( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
AIR_PORT_BITMAP_T portlist = {0}; | |
AIR_QOS_SCH_MODE_T sch_mode = AIR_QOS_SCH_MODE_LAST; | |
UI32_T scheduler = 0; | |
UI8_T queue = 0; | |
C8_T sche[3][5] = {"SP", "WRR", "WFQ"}; | |
UI32_T weight = AIR_QOS_SHAPER_NOSETTING; | |
UI8_T i = 0; | |
ret = _portListStr2Ary(argv[0], portlist, 1); | |
if(ret != AIR_E_OK) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return ret; | |
} | |
AIR_PRINT("port list is %d\n", portlist[0]); | |
if(4 == argc) | |
{ | |
queue = _strtoul(argv[1], NULL, 0); | |
AIR_PRINT("queue is %d\n", queue); | |
scheduler = _strtoul(argv[2], NULL, 0); | |
AIR_PRINT("scheduler is %d\n", scheduler); | |
weight = _strtoul(argv[3], NULL, 0); | |
AIR_PRINT("weight is %d\n", weight); | |
if(scheduler == 0) | |
{ | |
sch_mode = AIR_QOS_SCH_MODE_SP; | |
weight = AIR_QOS_SHAPER_NOSETTING; | |
if(weight != AIR_QOS_SHAPER_NOSETTING) | |
AIR_PRINT("[Warning] SP schedule mode no need weight\n"); | |
} | |
else if(scheduler == 1) | |
{ | |
sch_mode = AIR_QOS_SCH_MODE_WRR; | |
if(weight == AIR_QOS_SHAPER_NOSETTING) | |
{ | |
AIR_PRINT("[Warning] No weight value input , plz check\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
AIR_PRINT("sch_mode is 1\n"); | |
} | |
else if(scheduler == 2) | |
{ | |
sch_mode = AIR_QOS_SCH_MODE_WFQ; | |
if(weight == AIR_QOS_SHAPER_NOSETTING) | |
{ | |
AIR_PRINT("[Warning] No weight value input , plz check\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unknown schedule mode, plz check again\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(portlist[0] & (1 << i)) | |
{ | |
AIR_PRINT("port %d\n", i); | |
ret = air_qos_setScheduleAlgo(0, i, queue, sch_mode, weight); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Set Port%02d Scheduler %s Success.\n", i, sche[scheduler]); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d Scheduler %s Fail.\n", i, sche[scheduler]); | |
} | |
} | |
} | |
} | |
else if(2 == argc) | |
{ | |
queue = _strtoul(argv[1], NULL, 0); | |
for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++) | |
{ | |
if(portlist[0] & (1 << i)) | |
{ | |
ret = air_qos_getScheduleAlgo(0, i, queue, &sch_mode, &weight); | |
if(AIR_E_OK == ret) | |
{ | |
if(sch_mode == AIR_QOS_SCH_MODE_SP) | |
AIR_PRINT("Get Port%02d queue %d Scheduler %s\n", i, queue, sche[sch_mode]); | |
else if((sch_mode == AIR_QOS_SCH_MODE_WRR) || (sch_mode == AIR_QOS_SCH_MODE_WFQ)) | |
AIR_PRINT("Get Port%02d queue %d Scheduler %s weight %d\n", i, queue, sche[sch_mode], weight); | |
else | |
AIR_PRINT("Get Port%02d queue %d Scheduler unknown\n", i, queue); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d queue %d Scheduler Fail.\n", i, queue); | |
} | |
} | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doQosGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(qosGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doQosSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(qosSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doQos( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(qosCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doDiagTxComply( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T phy = 0; | |
UI32_T mode = 0; | |
phy = _strtoul(argv[0], NULL, 0); | |
if(2 == argc) | |
{ | |
/* diag set txComply <phy(0~5)> <mode(0~8)> */ | |
mode = _strtoul(argv[1], NULL, 0); | |
ret = air_diag_setTxComplyMode(0, phy, mode); | |
AIR_PRINT("Set diagnostic function: PHY %u Tx Compliance mode = %u ", phy, mode); | |
} | |
else if(1 == argc) | |
{ | |
/* diag get txComply <phy(0~5)> */ | |
ret = air_diag_getTxComplyMode(0, phy, &mode); | |
AIR_PRINT("Get diagnostic function: PHY %u Tx Compliance mode ", phy); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Done.\n\tMode="); | |
switch(mode) | |
{ | |
case AIR_DIAG_TXCOMPLY_MODE_10M_NLP: | |
AIR_PRINT("%s\n", "10M_NLP"); | |
break; | |
case AIR_DIAG_TXCOMPLY_MODE_10M_RANDOM: | |
AIR_PRINT("%s\n", "10M_Random"); | |
break; | |
case AIR_DIAG_TXCOMPLY_MODE_10M_SINE: | |
AIR_PRINT("%s\n", "10M_Sine"); | |
break; | |
case AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_A: | |
AIR_PRINT("%s\n", "100M_Pair_a"); | |
break; | |
case AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_B: | |
AIR_PRINT("%s\n", "100M_Pair_b"); | |
break; | |
case AIR_DIAG_TXCOMPLY_MODE_1000M_TM1: | |
AIR_PRINT("%s\n", "1000M_TM1"); | |
break; | |
case AIR_DIAG_TXCOMPLY_MODE_1000M_TM2: | |
AIR_PRINT("%s\n", "1000M_TM2"); | |
break; | |
case AIR_DIAG_TXCOMPLY_MODE_1000M_TM3: | |
AIR_PRINT("%s\n", "1000M_TM3"); | |
break; | |
case AIR_DIAG_TXCOMPLY_MODE_1000M_TM4: | |
AIR_PRINT("%s\n", "1000M_TM4"); | |
break; | |
default: | |
break; | |
} | |
} | |
else | |
if(AIR_E_OTHERS == ret) | |
{ | |
AIR_PRINT("isn't setting.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doDiagSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(diagSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doDiagGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(diagGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doDiag( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(diagCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doLedMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T mode = 0; | |
if(1 == argc) | |
{ | |
/* led set mode <mode(0:disable, 1~3:2 LED, 4:User-Define)> */ | |
mode = _strtoul(argv[0], NULL, 0); | |
ret = air_led_setMode(0, 0, mode); | |
AIR_PRINT("Set LED mode "); | |
} | |
else if(0 == argc) | |
{ | |
/* led get mode */ | |
ret = air_led_getMode(0, 0, &mode); | |
AIR_PRINT("Get LED mode "); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
switch(mode) | |
{ | |
case AIR_LED_MODE_DISABLE: | |
AIR_PRINT(": Disabled.\n"); | |
break; | |
case AIR_LED_MODE_2LED_MODE0: | |
AIR_PRINT(": LED 0:Link / LED 1:Activity.\n"); | |
break; | |
case AIR_LED_MODE_2LED_MODE1: | |
AIR_PRINT(": LED 0:1000M Activity / LED 1:100M Activity.\n"); | |
break; | |
case AIR_LED_MODE_2LED_MODE2: | |
AIR_PRINT(": LED 0:1000M Activity / LED 1:10&100M Activity.\n"); | |
break; | |
case AIR_LED_MODE_USER_DEFINE: | |
AIR_PRINT(": User-Defined.\n"); | |
break; | |
default: | |
AIR_PRINT(": Fail.\n"); | |
break; | |
} | |
} | |
else | |
if(AIR_E_OTHERS == ret) | |
{ | |
AIR_PRINT(": Unrecognized.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLedState( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI8_T entity = 0; | |
BOOL_T state = FALSE; | |
entity = _strtoul(argv[0], NULL, 0); | |
if(2 == argc) | |
{ | |
/* led set state <led(0..1)> <state(1:En 0:Dis)> */ | |
state = _strtoul(argv[1], NULL, 0); | |
ret = air_led_setState(0, 0, entity, state); | |
AIR_PRINT("Set LED %u state ", entity); | |
} | |
else if(1 == argc) | |
{ | |
/* led get state <led(0..1)> */ | |
ret = air_led_getState(0, 0, entity, &state); | |
AIR_PRINT("Get LED %u state ", entity ); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT(": %s.\n", (state)?"Enable":"Disabled"); | |
} | |
else | |
if(AIR_E_OTHERS == ret) | |
{ | |
AIR_PRINT(": Unrecognized.\n"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLedUsrDef( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T i = 0; | |
UI8_T entity = 0; | |
BOOL_T polarity = LOW; | |
UI32_T on_evt_map = 0; | |
UI32_T blk_evt_map = 0; | |
AIR_LED_ON_EVT_T on_evt; | |
AIR_LED_BLK_EVT_T blk_evt; | |
entity = _strtoul(argv[0], NULL, 0); | |
if(4 == argc) | |
{ | |
/* led set usr <led(0..1)> <polarity(0:low, 1:high)> <on_evt(7'bin)> <blink_evt(10'bin)> */ | |
polarity = _strtoul(argv[1], NULL, 0); | |
on_evt_map = _strtoul(argv[2], NULL, 2); | |
blk_evt_map = _strtoul(argv[3], NULL, 2); | |
memset(&on_evt, 0, sizeof(AIR_LED_ON_EVT_T)); | |
if(on_evt_map & BIT(0)) | |
{ | |
on_evt.link_1000m = TRUE; | |
} | |
if(on_evt_map & BIT(1)) | |
{ | |
on_evt.link_100m = TRUE; | |
} | |
if(on_evt_map & BIT(2)) | |
{ | |
on_evt.link_10m = TRUE; | |
} | |
if(on_evt_map & BIT(3)) | |
{ | |
on_evt.link_dn = TRUE; | |
} | |
if(on_evt_map & BIT(4)) | |
{ | |
on_evt.fdx = TRUE; | |
} | |
if(on_evt_map & BIT(5)) | |
{ | |
on_evt.hdx = TRUE; | |
} | |
if(on_evt_map & BIT(6)) | |
{ | |
on_evt.force = TRUE; | |
} | |
memset(&blk_evt, 0, sizeof(AIR_LED_BLK_EVT_T)); | |
if(blk_evt_map & BIT(0)) | |
{ | |
blk_evt.tx_act_1000m = TRUE; | |
} | |
if(blk_evt_map & BIT(1)) | |
{ | |
blk_evt.rx_act_1000m = TRUE; | |
} | |
if(blk_evt_map & BIT(2)) | |
{ | |
blk_evt.tx_act_100m = TRUE; | |
} | |
if(blk_evt_map & BIT(3)) | |
{ | |
blk_evt.rx_act_100m = TRUE; | |
} | |
if(blk_evt_map & BIT(4)) | |
{ | |
blk_evt.tx_act_10m = TRUE; | |
} | |
if(blk_evt_map & BIT(5)) | |
{ | |
blk_evt.rx_act_10m = TRUE; | |
} | |
if(blk_evt_map & BIT(6)) | |
{ | |
blk_evt.cls = TRUE; | |
} | |
if(blk_evt_map & BIT(7)) | |
{ | |
blk_evt.rx_crc = TRUE; | |
} | |
if(blk_evt_map & BIT(8)) | |
{ | |
blk_evt.rx_idle = TRUE; | |
} | |
if(blk_evt_map & BIT(9)) | |
{ | |
blk_evt.force = TRUE; | |
} | |
ret = air_led_setUsrDef(0, 0, entity, polarity, on_evt, blk_evt); | |
AIR_PRINT("Set LED %u User-define ", entity); | |
} | |
else if(1 == argc) | |
{ | |
/* led get usr <led(0..1)> */ | |
ret = air_led_getUsrDef(0, 0, entity, &polarity, &on_evt, &blk_evt); | |
AIR_PRINT("Get LED %u User-define ", entity ); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Done.\n"); | |
AIR_PRINT("Polarity:%u.\n", polarity); | |
AIR_PRINT("On Event:\n"); | |
i = 6; | |
AIR_PRINT("\t(%u)Force on :%s\n", i--, (on_evt.force)?"On":"Off"); | |
AIR_PRINT("\t(%u)Half Duplex :%s\n", i--, (on_evt.hdx)?"On":"Off"); | |
AIR_PRINT("\t(%u)Full Duplex :%s\n", i--, (on_evt.fdx)?"On":"Off"); | |
AIR_PRINT("\t(%u)Link Down :%s\n", i--, (on_evt.link_dn)?"On":"Off"); | |
AIR_PRINT("\t(%u)Link 10M :%s\n", i--, (on_evt.link_10m)?"On":"Off"); | |
AIR_PRINT("\t(%u)Link 100M :%s\n", i--, (on_evt.link_100m)?"On":"Off"); | |
AIR_PRINT("\t(%u)Link 1000M :%s\n", i--, (on_evt.link_1000m)?"On":"Off"); | |
AIR_PRINT("Blinking Event:\n"); | |
i = 9; | |
AIR_PRINT("\t(%u)Force blinks :%s\n", i--, (blk_evt.force)?"On":"Off"); | |
AIR_PRINT("\t(%u)Rx Idle Error :%s\n", i--, (blk_evt.rx_idle)?"On":"Off"); | |
AIR_PRINT("\t(%u)Rx CRC Error :%s\n", i--, (blk_evt.rx_crc)?"On":"Off"); | |
AIR_PRINT("\t(%u)Collision :%s\n", i--, (blk_evt.cls)?"On":"Off"); | |
AIR_PRINT("\t(%u)10Mbps RX Activity :%s\n", i--, (blk_evt.rx_act_10m)?"On":"Off"); | |
AIR_PRINT("\t(%u)10Mbps TX Activity :%s\n", i--, (blk_evt.tx_act_10m)?"On":"Off"); | |
AIR_PRINT("\t(%u)100Mbps RX Activity :%s\n", i--, (blk_evt.rx_act_100m)?"On":"Off"); | |
AIR_PRINT("\t(%u)100Mbps TX Activity :%s\n", i--, (blk_evt.tx_act_100m)?"On":"Off"); | |
AIR_PRINT("\t(%u)1000Mbps RX Activity :%s\n", i--, (blk_evt.rx_act_1000m)?"On":"Off"); | |
AIR_PRINT("\t(%u)1000Mbps TX Activity :%s\n", i--, (blk_evt.tx_act_1000m)?"On":"Off"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLedBlkTime( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
AIR_LED_BLK_DUR_T time = 0; | |
if(1 == argc) | |
{ | |
/* led set time <time(0~5)> */ | |
time = _strtoul(argv[0], NULL, 0); | |
ret = air_led_setBlkTime(0, 0, time); | |
AIR_PRINT("Set Blinking Duration "); | |
} | |
else if(0 == argc) | |
{ | |
/* led get time */ | |
ret = air_led_getBlkTime(0, 0, &time); | |
AIR_PRINT("Get Blinking Duration "); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Done.\n"); | |
AIR_PRINT("\tBlinking duration : %u (ms)\n", (32 << time) ); | |
} | |
else | |
{ | |
AIR_PRINT("Fail.\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doLedSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(ledSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doLedGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(ledGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doLed( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(ledCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doShowVersion( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_PRINT("VERSION: %s\n", AIR_VER_SDK); | |
return AIR_E_OK; | |
} | |
static AIR_ERROR_NO_T | |
doShow( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(showCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doStormRate( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0, type = 0; | |
UI32_T unit = 0, count = 0; | |
C8_T stype[3][5] = {"Bcst", "Mcst", "Ucst"}; | |
UI32_T kb = 0; | |
port = _strtol(argv[0], NULL, 10); | |
type = _strtol(argv[1], NULL, 10); | |
if(4 == argc) | |
{ | |
count = _strtol(argv[2], NULL, 10); | |
unit = _strtol(argv[3], NULL, 10); | |
if(0 == unit) | |
kb = 64; | |
else if(1 == unit) | |
kb = 256; | |
else if(2 == unit) | |
kb = 1024; | |
else if(3 == unit) | |
kb = 4096; | |
else | |
kb = 16384; | |
ret = air_sec_setStormRate(0, port, type, count, unit); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Set Port%02d %s storm rate (%d * %d) = %d Kbps\n", port, stype[type], count, kb, (count*kb)); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d %s storm rate Fail.\n", port, stype[type]); | |
AIR_PRINT("Note: Port(0..4) can only select unit(0..3), port(5..6) can only select unit(4)\n"); | |
} | |
} | |
else if(2 == argc) | |
{ | |
ret = air_sec_getStormRate(0, port, type, &count, &unit); | |
if(AIR_E_OK == ret) | |
{ | |
if(0 == unit) | |
kb = 64; | |
else if(1 == unit) | |
kb = 256; | |
else if(2 == unit) | |
kb = 1024; | |
else if(3 == unit) | |
kb = 4096; | |
else | |
kb = 16384; | |
AIR_PRINT("Port%02d %s storm rate (%d * %d) = %d Kbps\n", port, stype[type], count, kb, (count*kb)); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d %s storm rate Fail\n", port, stype[type]); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doFldMode( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0, type = 0; | |
BOOL_T fld_en = 0; | |
C8_T stype[4][5] = {"Bcst", "Mcst", "Ucst", "Qury"}; | |
C8_T sen[2][10] = {"Disable", "Enable"}; | |
port = _strtol(argv[0], NULL, 10); | |
type = _strtol(argv[1], NULL, 10); | |
if(2 == argc) | |
{ | |
ret = air_sec_getFldMode(0, port, type, &fld_en); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Get Port%02d flooding %s frame %s\n", port, stype[type], sen[fld_en]); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d flooding %s frame Fail\n", port, stype[type]); | |
} | |
} | |
else if(3 == argc) | |
{ | |
fld_en = _strtol(argv[2], NULL, 10); | |
ret = air_sec_setFldMode(0, port, type, fld_en); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Set Port%02d flooding %s frame %s Success\n", port, stype[type], sen[fld_en]); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d flooding %s frame %s Fail\n", port, stype[type], sen[fld_en]); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doStormEnable( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T port = 0, type = 0; | |
BOOL_T en = 0; | |
C8_T sen[2][10] = {"Disable", "Enable"}; | |
C8_T stype[3][5] = {"Bcst", "Mcst", "Ucst"}; | |
port = _strtol(argv[0], NULL, 10); | |
type = _strtol(argv[1], NULL, 10); | |
if(3 == argc) | |
{ | |
en = _strtol(argv[2], NULL, 10); | |
ret = air_sec_setStormEnable(0, port, type, en); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Set Port%02d %s storm %s Success.\n", port, stype[type], sen[en]); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d %s storm %s Fail.\n", port, stype[type], sen[en]); | |
} | |
} | |
else if(2 == argc) | |
{ | |
ret = air_sec_getStormEnable(0, port, type, &en); | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("Port%02d %s storm %s\n", port, stype[type], sen[en]); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d %s storm Fail\n", port, stype[type]); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doSaLearning(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
AIR_SEC_PORTSEC_PORT_CONFIG_T port_config; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
if(2 == argc) | |
{ | |
memset(&port_config, 0, sizeof(AIR_SEC_PORTSEC_PORT_CONFIG_T)); | |
rc = air_sec_getPortSecPortCfg(0, port, &port_config); | |
port_config.sa_lrn_en = _strtoul(argv[1], NULL, 0); | |
rc = air_sec_setPortSecPortCfg(0, port, port_config); | |
if(AIR_E_OK == rc) | |
{ | |
AIR_PRINT("Set Port%02d sa learn %s Success.\n", port, port_config.sa_lrn_en?"Enable":"Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d sa learn %s Fail.\n", port, port_config.sa_lrn_en?"Enable":"Disable"); | |
} | |
} | |
else if(1 == argc) | |
{ | |
rc = air_sec_getPortSecPortCfg(0, port, &port_config); | |
if(AIR_E_OK == rc) | |
{ | |
AIR_PRINT("Port%02d sa learn: %s\n", port, port_config.sa_lrn_en?"Enable":"Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d sa learn Fail\n", port); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
rc = AIR_E_BAD_PARAMETER; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doSaLimit(UI32_T argc, C8_T *argv[]) | |
{ | |
UI32_T port = 0; | |
AIR_SEC_PORTSEC_PORT_CONFIG_T port_config; | |
AIR_ERROR_NO_T rc = AIR_E_OK; | |
port = _strtoul(argv[0], NULL, 0); | |
if(3 == argc) | |
{ | |
memset(&port_config, 0, sizeof(AIR_SEC_PORTSEC_PORT_CONFIG_T)); | |
rc = air_sec_getPortSecPortCfg(0, port, &port_config); | |
port_config.sa_lmt_en = _strtoul(argv[1], NULL, 0); | |
port_config.sa_lmt_cnt = _strtoul(argv[2], NULL, 0); | |
rc = air_sec_setPortSecPortCfg(0, port, port_config); | |
if(AIR_E_OK == rc) | |
{ | |
AIR_PRINT("Set Port%02d sa limit %s Success.\n", port, port_config.sa_lmt_en?"Enable":"Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Set Port%02d sa limit %s Fail.\n", port, port_config.sa_lmt_en?"Enable":"Disable"); | |
} | |
} | |
else if(1 == argc) | |
{ | |
rc = air_sec_getPortSecPortCfg(0, port, &port_config); | |
if(AIR_E_OK == rc) | |
{ | |
AIR_PRINT("Port%02d ", port); | |
AIR_PRINT("sa limit: %s\n", port_config.sa_lmt_en?"Enable":"Disable"); | |
if(TRUE == (port_config.sa_lmt_en && (AIR_MAX_NUM_OF_MAC == port_config.sa_lmt_cnt))) | |
{ | |
AIR_PRINT("Sa learning without limitation\n"); | |
} | |
else if(TRUE == (port_config.sa_lmt_en && (AIR_MAX_NUM_OF_MAC > port_config.sa_lmt_cnt))) | |
{ | |
AIR_PRINT("Rx sa allowable learning number: %d\n", port_config.sa_lmt_cnt); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Get Port%02d sa limit Fail\n", port); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
rc = AIR_E_BAD_PARAMETER; | |
} | |
return rc; | |
} | |
static AIR_ERROR_NO_T | |
doSecGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(secGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doSecSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(secSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doSec( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(secCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doSwitchCpuPortEn( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
BOOL_T cpu_en = FALSE; | |
if(0 == argc) | |
{ | |
/* switch get sysPhyEn */ | |
ret = air_switch_getCpuPortEn(0, &cpu_en); | |
AIR_PRINT("Get Cpu Port State "); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT(": %s\n", cpu_en?"Enable":"Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
} | |
else if(1 == argc) | |
{ | |
/* switch set sysPhyEn <phy_en> */ | |
cpu_en = _strtol(argv[0], NULL, 0); | |
ret = air_switch_setCpuPortEn(0, cpu_en); | |
AIR_PRINT("Set CPU port State "); | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT(": %s\n", cpu_en?"Enable":"Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doSwitchCpuPort( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
BOOL_T cpu_en = FALSE; | |
UI32_T port = 0; | |
C8_T str_temp[AIR_MAX_NUM_OF_PORTS+1]; | |
if(1 == argc) | |
{ | |
/* switch set cpuPort <portnumber> */ | |
port = _strtol(argv[0], NULL, 10); | |
ret = air_switch_setCpuPort(0, port); | |
AIR_PRINT("Set CPU Port "); | |
} | |
else if(0 == argc) | |
{ | |
/* switch get cpuPort */ | |
ret = air_switch_getCpuPort(0, &port); | |
AIR_PRINT("Get CPU Port "); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT(": %d\n", port); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doSwitchPhyLCIntrEn( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T phy = 0; | |
BOOL_T enable = FALSE; | |
if(2 == argc) | |
{ | |
/* switch set phyLCIntrEn <phy(0..6)> <(1:En,0:Dis)> */ | |
phy = _strtol(argv[0], NULL, 10); | |
enable = _strtol(argv[1], NULL, 10); | |
ret = air_switch_setSysIntrEn(0, (phy + AIR_SYS_INTR_TYPE_PHY0_LC), enable); | |
} | |
else if(1 == argc) | |
{ | |
/* switch get phyLCIntrEn <phy(0..6)> */ | |
phy = _strtol(argv[0], NULL, 10); | |
ret = air_switch_getSysIntrEn(0, (phy + AIR_SYS_INTR_TYPE_PHY0_LC), &enable); | |
AIR_PRINT("PHY(%d) LinkChange interrupt : %s\n", phy, (TRUE == enable) ? "enable" : "disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doSwitchPhyLCIntrSts( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T phy = 0; | |
BOOL_T enable = FALSE; | |
if(2 == argc) | |
{ | |
/* switch set phyLCIntrSts <phy(0..6)> <(1:En)> */ | |
phy = _strtol(argv[0], NULL, 10); | |
enable = _strtol(argv[1], NULL, 10); | |
ret = air_switch_setSysIntrStatus(0, (phy + AIR_SYS_INTR_TYPE_PHY0_LC), enable); | |
} | |
else if(1 == argc) | |
{ | |
/* switch get phyLCIntrSts <phy(0..6)> */ | |
phy = _strtol(argv[0], NULL, 10); | |
ret = air_switch_getSysIntrStatus(0, (phy + AIR_SYS_INTR_TYPE_PHY0_LC), &enable); | |
AIR_PRINT("PHY(%d) LinkChange interrupt state : %s\n", phy, (TRUE == enable) ? "set" : "unset"); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
ret = AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doSwitchSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(switchSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doSwitchGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(switchGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doSwitch( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(switchCmds, argc, argv); | |
} | |
static void _air_acl_printRuleMap(UI32_T *rule_map, UI32_T ary_num) | |
{ | |
UI32_T i; | |
BOOL_T first; | |
first = TRUE; | |
for(i=0; i<ary_num*32; i++) | |
{ | |
if(rule_map[i/32] & BIT(i%32)) | |
{ | |
if(TRUE == first) | |
{ | |
AIR_PRINT("%u", i); | |
first = FALSE; | |
} | |
else | |
{ | |
AIR_PRINT(",%u", i); | |
} | |
} | |
} | |
AIR_PRINT("\n"); | |
} | |
static AIR_ERROR_NO_T | |
doAclEn( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T argi=0; | |
UI32_T port = 0; | |
BOOL_T en = FALSE; | |
if(1 == argc) | |
{ | |
/* acl set en <en(1:En,0:Dis)> */ | |
en = _strtoul(argv[argi++], NULL, 2); | |
ret = air_acl_setGlobalState(0, en); | |
AIR_PRINT("Set Global ACL function "); | |
} | |
else if(0 == argc) | |
{ | |
/* acl get en */ | |
ret = air_acl_getGlobalState(0, &en); | |
AIR_PRINT("Get Global ACL function "); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT(": %s\n", (TRUE == en)?"Enable":"Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclRule( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T rule_idx = 0; | |
BOOL_T state = FALSE, reverse = FALSE, end = FALSE; | |
UI32_T argi = 0, ipv6 = 0, i = 0; | |
AIR_ACL_RULE_T rule; | |
UI8_T tmp_ip[16] = {0}; | |
C8_T str_temp[AIR_MAX_NUM_OF_PORTS+1]; | |
C8_T str[40]; | |
memset(&rule, 0, sizeof(AIR_ACL_RULE_T)); | |
if(argc >= 6) | |
{ | |
/* acl set rule <idx(0..255)> <state(0:Dis,1:En)> <reverse(0:Dis,1:En)> <end(0:Dis,1:En)> <portmap(7'bin)> | |
<ipv6(0:Dis,1:En,2:Not care)> | |
[ dmac <dmac(12'hex)> <dmac_mask(12'hex)> ] | |
[ smac <smac(12'hex)> <smac_mask(12'hex)> ] | |
[ stag <stag(4'hex)> <stag_mask(4'hex)> ] | |
[ ctag <ctag(4'hex)> <ctag_mask(4'hex)> ] | |
[ etype <etype(4'hex)> <etype_mask(4'hex)> ] | |
[ dip <dip(IPADDR)> <dip_mask(IPADDR)> ] | |
[ sip <sip(IPADDR)> <sip_mask(IPADDR)> ] | |
[ dscp <dscp(2'hex)> <dscp_mask(2'hex)> ] | |
[ protocol <protocol(2'hex)> <protocol_mask(2'hex)> ] | |
[ dport <dport(4'hex)> <dport_mask(4'hex)> ] | |
[ sport <sport(4'hex)> <sport_mask(4'hex)> ] | |
[ flow_label <flow_label(4'hex)> <flow_label_mask(4'hex)> ] | |
[ udf <udf(4'hex)> <udf_mask(4'hex)> ] */ | |
rule_idx = _strtoul(argv[argi++], NULL, 0); | |
rule.ctrl.rule_en = _strtoul(argv[argi++], NULL, 0); | |
rule.ctrl.reverse = _strtoul(argv[argi++], NULL, 0); | |
rule.ctrl.end = _strtoul(argv[argi++], NULL, 0); | |
rule.key.portmap = _strtoul(argv[argi++], NULL, 2); | |
rule.mask.portmap = (~rule.key.portmap) & AIR_ALL_PORT_BITMAP; | |
ipv6 = _strtoul(argv[argi++], NULL, 0); | |
if(0 == ipv6) | |
{ | |
rule.key.isipv6 = FALSE; | |
rule.mask.isipv6 = TRUE; | |
} | |
else if(1 == ipv6) | |
{ | |
rule.key.isipv6 = TRUE; | |
rule.mask.isipv6 = TRUE; | |
} | |
else | |
{ | |
rule.mask.isipv6 = FALSE; | |
} | |
if(0 == _strcmp(argv[argi], "dmac")) | |
{ | |
argi++; | |
_str2mac(argv[argi++], rule.key.dmac); | |
_str2mac(argv[argi++], rule.mask.dmac); | |
rule.key.fieldmap |= 1 << AIR_ACL_DMAC; | |
} | |
if(0 == _strcmp(argv[argi], "smac")) | |
{ | |
argi++; | |
_str2mac(argv[argi++], rule.key.smac); | |
_str2mac(argv[argi++], rule.mask.smac); | |
rule.key.fieldmap |= 1 << AIR_ACL_SMAC; | |
} | |
if(0 == _strcmp(argv[argi], "stag")) | |
{ | |
argi++; | |
rule.key.stag = _strtoul(argv[argi++], NULL, 16); | |
rule.mask.stag = _strtoul(argv[argi++], NULL, 16); | |
rule.key.fieldmap |= 1 << AIR_ACL_STAG; | |
} | |
if(0 == _strcmp(argv[argi], "ctag")) | |
{ | |
argi++; | |
rule.key.ctag = _strtoul(argv[argi++], NULL, 16); | |
rule.mask.ctag = _strtoul(argv[argi++], NULL, 16); | |
rule.key.fieldmap |= 1 << AIR_ACL_CTAG; | |
} | |
if(0 == _strcmp(argv[argi], "etype")) | |
{ | |
argi++; | |
rule.key.etype= _strtoul(argv[argi++], NULL, 16); | |
rule.mask.etype = _strtoul(argv[argi++], NULL, 16); | |
rule.key.fieldmap |= 1 << AIR_ACL_ETYPE; | |
} | |
if(0 == _strcmp(argv[argi], "dip")) | |
{ | |
argi++; | |
if(0 == ipv6) | |
{ | |
_str2ipv4(argv[argi++], rule.key.dip); | |
_str2ipv4(argv[argi++], rule.mask.dip); | |
} | |
else if(1 == ipv6) | |
{ | |
_str2ipv6(argv[argi++], tmp_ip); | |
rule.key.dip[3] = (tmp_ip[0]<<24) | (tmp_ip[1]<<16) | (tmp_ip[2]<<8) | tmp_ip[3]; | |
rule.key.dip[2] = (tmp_ip[4]<<24) | (tmp_ip[5]<<16) | (tmp_ip[6]<<8) | tmp_ip[7]; | |
rule.key.dip[1] = (tmp_ip[8]<<24) | (tmp_ip[9]<<16) | (tmp_ip[10]<<8) | tmp_ip[11]; | |
rule.key.dip[0] = (tmp_ip[12]<<24) | (tmp_ip[13]<<16) | (tmp_ip[14]<<8) | tmp_ip[15]; | |
_str2ipv6(argv[argi++], tmp_ip); | |
rule.mask.dip[3] = (tmp_ip[0]<<24) | (tmp_ip[1]<<16) | (tmp_ip[2]<<8) | tmp_ip[3]; | |
rule.mask.dip[2] = (tmp_ip[4]<<24) | (tmp_ip[5]<<16) | (tmp_ip[6]<<8) | tmp_ip[7]; | |
rule.mask.dip[1] = (tmp_ip[8]<<24) | (tmp_ip[9]<<16) | (tmp_ip[10]<<8) | tmp_ip[11]; | |
rule.mask.dip[0] = (tmp_ip[12]<<24) | (tmp_ip[13]<<16) | (tmp_ip[14]<<8) | tmp_ip[15]; | |
} | |
rule.key.fieldmap |= 1 << AIR_ACL_DIP; | |
} | |
if(0 == _strcmp(argv[argi], "sip")) | |
{ | |
argi++; | |
if(0 == ipv6) | |
{ | |
_str2ipv4(argv[argi++], rule.key.sip); | |
_str2ipv4(argv[argi++], rule.mask.sip); | |
} | |
else if(1 == ipv6) | |
{ | |
_str2ipv6(argv[argi++], tmp_ip); | |
rule.key.sip[3] = (tmp_ip[0]<<24) | (tmp_ip[1]<<16) | (tmp_ip[2]<<8) | tmp_ip[3]; | |
rule.key.sip[2] = (tmp_ip[4]<<24) | (tmp_ip[5]<<16) | (tmp_ip[6]<<8) | tmp_ip[7]; | |
rule.key.sip[1] = (tmp_ip[8]<<24) | (tmp_ip[9]<<16) | (tmp_ip[10]<<8) | tmp_ip[11]; | |
rule.key.sip[0] = (tmp_ip[12]<<24) | (tmp_ip[13]<<16) | (tmp_ip[14]<<8) | tmp_ip[15]; | |
_str2ipv6(argv[argi++], tmp_ip); | |
rule.mask.sip[3] = (tmp_ip[0]<<24) | (tmp_ip[1]<<16) | (tmp_ip[2]<<8) | tmp_ip[3]; | |
rule.mask.sip[2] = (tmp_ip[4]<<24) | (tmp_ip[5]<<16) | (tmp_ip[6]<<8) | tmp_ip[7]; | |
rule.mask.sip[1] = (tmp_ip[8]<<24) | (tmp_ip[9]<<16) | (tmp_ip[10]<<8) | tmp_ip[11]; | |
rule.mask.sip[0] = (tmp_ip[12]<<24) | (tmp_ip[13]<<16) | (tmp_ip[14]<<8) | tmp_ip[15]; | |
} | |
rule.key.fieldmap |= 1 << AIR_ACL_SIP; | |
} | |
if(0 == _strcmp(argv[argi], "dscp")) | |
{ | |
argi++; | |
rule.key.dscp = _strtoul(argv[argi++], NULL, 16); | |
rule.mask.dscp = _strtoul(argv[argi++], NULL, 16); | |
rule.key.fieldmap |= 1 << AIR_ACL_DSCP; | |
} | |
if(0 == _strcmp(argv[argi], "protocol")) | |
{ | |
argi++; | |
rule.key.protocol = _strtoul(argv[argi++], NULL, 16); | |
rule.mask.protocol = _strtoul(argv[argi++], NULL, 16); | |
rule.key.fieldmap |= 1 << AIR_ACL_PROTOCOL; | |
} | |
if(0 == _strcmp(argv[argi], "dport")) | |
{ | |
argi++; | |
rule.key.dport = _strtoul(argv[argi++], NULL, 16); | |
rule.mask.dport = _strtoul(argv[argi++], NULL, 16); | |
rule.key.fieldmap |= 1 << AIR_ACL_DPORT; | |
} | |
if(0 == _strcmp(argv[argi], "sport")) | |
{ | |
argi++; | |
rule.key.sport = _strtoul(argv[argi++], NULL, 16); | |
rule.mask.sport = _strtoul(argv[argi++], NULL, 16); | |
rule.key.fieldmap |= 1 << AIR_ACL_SPORT; | |
} | |
if(0 == _strcmp(argv[argi], "flow_label")) | |
{ | |
argi++; | |
rule.key.flow_label= _strtoul(argv[argi++], NULL, 16); | |
rule.mask.flow_label= _strtoul(argv[argi++], NULL, 16); | |
rule.key.fieldmap |= 1 << AIR_ACL_FLOW_LABEL; | |
} | |
if(0 == _strcmp(argv[argi], "udf")) | |
{ | |
argi++; | |
rule.key.udf = _strtoul(argv[argi++], NULL, 16); | |
rule.mask.udf = _strtoul(argv[argi++], NULL, 16); | |
rule.key.fieldmap |= 1 << AIR_ACL_UDF; | |
} | |
rule.mask.fieldmap = rule.key.fieldmap; | |
ret = air_acl_setRule(0, rule_idx, &rule); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Set ACL Rule(%u): %s\n", rule_idx, air_error_getString(ret)); | |
} | |
else if(1 == argc) | |
{ | |
rule_idx = _strtoul(argv[0], NULL, 0); | |
ret = air_acl_getRule(0, rule_idx, &rule); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Get ACL Rule(%u): %s\n", rule_idx, air_error_getString(ret)); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
if(TRUE == rule.ctrl.rule_en) | |
{ | |
AIR_PRINT("\t Rule end : %s\n", (TRUE == rule.ctrl.end)?"Enable":"Disable"); | |
AIR_PRINT("\t Rule reverse : %s\n", (TRUE == rule.ctrl.reverse)?"Enable":"Disable"); | |
_hex2bitstr((~rule.mask.portmap) & AIR_ALL_PORT_BITMAP, str_temp, AIR_MAX_NUM_OF_PORTS+1); | |
AIR_PRINT("\t Portmap[0:6] : %s\n", str_temp); | |
for(i = AIR_ACL_DMAC; i < AIR_ACL_FIELD_TYPE_LAST; i++) | |
{ | |
if((1 << i) & rule.mask.fieldmap) | |
{ | |
switch (i) | |
{ | |
case AIR_ACL_DMAC: | |
AIR_PRINT("\t dmac: "); | |
AIR_PRINT("%02x-%02x-%02x-%02x-%02x-%02x", | |
rule.key.dmac[0], rule.key.dmac[1], rule.key.dmac[2], | |
rule.key.dmac[3], rule.key.dmac[4], rule.key.dmac[5]); | |
AIR_PRINT(", dmac-mask: "); | |
AIR_PRINT("%02x-%02x-%02x-%02x-%02x-%02x\n", | |
rule.mask.dmac[0], rule.mask.dmac[1], rule.mask.dmac[2], | |
rule.mask.dmac[3], rule.mask.dmac[4], rule.mask.dmac[5]); | |
break; | |
case AIR_ACL_SMAC: | |
AIR_PRINT("\t smac: "); | |
AIR_PRINT("%02x-%02x-%02x-%02x-%02x-%02x", | |
rule.key.smac[0], rule.key.smac[1], rule.key.smac[2], | |
rule.key.smac[3], rule.key.smac[4], rule.key.smac[5]); | |
AIR_PRINT(", smac-mask: "); | |
AIR_PRINT("%02x-%02x-%02x-%02x-%02x-%02x\n", | |
rule.mask.smac[0], rule.mask.smac[1], rule.mask.smac[2], | |
rule.mask.smac[3], rule.mask.smac[4], rule.mask.smac[5]); | |
break; | |
case AIR_ACL_ETYPE: | |
AIR_PRINT("\t etype: 0x%x, etype-mask: 0x%x\n", rule.key.etype, rule.mask.etype); | |
break; | |
case AIR_ACL_STAG: | |
AIR_PRINT("\t stag: 0x%x, stag-mask: 0x%x\n", rule.key.stag, rule.mask.stag); | |
break; | |
case AIR_ACL_CTAG: | |
AIR_PRINT("\t ctag: 0x%x, ctag-mask: 0x%x\n", rule.key.ctag, rule.mask.ctag); | |
break; | |
case AIR_ACL_DPORT: | |
AIR_PRINT("\t dport: 0x%x, dport-mask: 0x%x\n", rule.key.dport, rule.mask.dport); | |
break; | |
case AIR_ACL_SPORT: | |
AIR_PRINT("\t sport: 0x%x, sport-mask: 0x%x\n", rule.key.sport, rule.mask.sport); | |
break; | |
case AIR_ACL_UDF: | |
AIR_PRINT("\t udf: 0x%x, udf-mask: 0x%x\n", rule.key.udf, rule.mask.udf); | |
break; | |
case AIR_ACL_DIP: | |
if (0 == rule.key.isipv6) | |
{ | |
AIR_PRINT("\t dip: "); | |
AIR_PRINT("%d.%d.%d.%d", | |
((rule.key.dip[0])&0xFF000000)>>24,((rule.key.dip[0])&0x00FF0000)>>16, | |
((rule.key.dip[0])&0x0000FF00)>>8, ((rule.key.dip[0])&0x000000FF)); | |
AIR_PRINT(", dip-mask: "); | |
AIR_PRINT("%d.%d.%d.%d\n ", | |
((rule.mask.dip[0])&0xFF000000)>>24,((rule.mask.dip[0])&0x00FF0000)>>16, | |
((rule.mask.dip[0])&0x0000FF00)>>8, ((rule.mask.dip[0])&0x000000FF)); | |
} | |
else | |
{ | |
for(i=0; i<4; i++){ | |
tmp_ip[i] = (rule.key.dip[3] >> (8*(3-i))) & 0xff; | |
AIR_PRINT("get tmp_ip[%d]=0x%x\n", i, tmp_ip[i]); | |
} | |
for(i=4; i<8; i++){ | |
tmp_ip[i] = (rule.key.dip[2] >> (8*(7-i))) & 0xff; | |
} | |
for(i=8; i<12; i++){ | |
tmp_ip[i] = (rule.key.dip[1] >> (8*(11-i))) & 0xff; | |
} | |
for(i=12; i<16; i++){ | |
tmp_ip[i] = (rule.key.dip[0] >> (8*(15-i))) & 0xff; | |
} | |
AIR_PRINT("\t dip: "); | |
AIR_PRINT("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", | |
tmp_ip[0], tmp_ip[1],tmp_ip[2], tmp_ip[3],tmp_ip[4], tmp_ip[5],tmp_ip[6], tmp_ip[7], | |
tmp_ip[8], tmp_ip[9],tmp_ip[10], tmp_ip[11],tmp_ip[12], tmp_ip[13],tmp_ip[14], tmp_ip[15]); | |
for(i=0; i<4; i++){ | |
tmp_ip[i] = (rule.mask.dip[3] >> (8*(3-i))) & 0xff; | |
} | |
for(i=4; i<8; i++){ | |
tmp_ip[i] = (rule.mask.dip[2] >> (8*(7-i))) & 0xff; | |
} | |
for(i=8; i<12; i++){ | |
tmp_ip[i] = (rule.mask.dip[1] >> (8*(11-i))) & 0xff; | |
} | |
for(i=12; i<16; i++){ | |
tmp_ip[i] = (rule.mask.dip[0] >> (8*(15-i))) & 0xff; | |
} | |
AIR_PRINT(", dip-mask: "); | |
AIR_PRINT("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", | |
tmp_ip[0], tmp_ip[1],tmp_ip[2], tmp_ip[3],tmp_ip[4], tmp_ip[5],tmp_ip[6], tmp_ip[7], | |
tmp_ip[8], tmp_ip[9],tmp_ip[10], tmp_ip[11],tmp_ip[12], tmp_ip[13],tmp_ip[14], tmp_ip[15]); | |
} | |
break; | |
case AIR_ACL_SIP: | |
if (0 == rule.key.isipv6) | |
{ | |
AIR_PRINT("\t sip: "); | |
AIR_PRINT("%d.%d.%d.%d ", | |
((rule.key.sip[0])&0xFF000000)>>24,((rule.key.sip[0])&0x00FF0000)>>16, | |
((rule.key.sip[0])&0x0000FF00)>>8, ((rule.key.sip[0])&0x000000FF)); | |
AIR_PRINT(", sip-mask: "); | |
AIR_PRINT("%d.%d.%d.%d\n ", | |
((rule.mask.sip[0])&0xFF000000)>>24,((rule.mask.sip[0])&0x00FF0000)>>16, | |
((rule.mask.sip[0])&0x0000FF00)>>8, ((rule.mask.sip[0])&0x000000FF)); | |
} | |
else | |
{ | |
for(i=0; i<4; i++){ | |
tmp_ip[i] = (rule.key.sip[3] >> (8*(3-i))) & 0xff; | |
} | |
for(i=4; i<8; i++){ | |
tmp_ip[i] = (rule.key.sip[2] >> (8*(7-i))) & 0xff; | |
} | |
for(i=8; i<12; i++){ | |
tmp_ip[i] = (rule.key.sip[1] >> (8*(11-i))) & 0xff; | |
} | |
for(i=12; i<16; i++){ | |
tmp_ip[i] = (rule.key.sip[0] >> (8*(15-i))) & 0xff; | |
} | |
AIR_PRINT("\t sip: "); | |
AIR_PRINT("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", | |
tmp_ip[0], tmp_ip[1],tmp_ip[2], tmp_ip[3],tmp_ip[4], tmp_ip[5],tmp_ip[6], tmp_ip[7], | |
tmp_ip[8], tmp_ip[9],tmp_ip[10], tmp_ip[11],tmp_ip[12], tmp_ip[13],tmp_ip[14], tmp_ip[15]); | |
for(i=0; i<4; i++){ | |
tmp_ip[i] = (rule.mask.sip[3] >> (8*(3-i))) & 0xff; | |
} | |
for(i=4; i<8; i++){ | |
tmp_ip[i] = (rule.mask.sip[2] >> (8*(7-i))) & 0xff; | |
} | |
for(i=8; i<12; i++){ | |
tmp_ip[i] = (rule.mask.sip[1] >> (8*(11-i))) & 0xff; | |
} | |
for(i=12; i<16; i++){ | |
tmp_ip[i] = (rule.mask.sip[0] >> (8*(15-i))) & 0xff; | |
} | |
AIR_PRINT(", sip-mask: "); | |
AIR_PRINT("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", | |
tmp_ip[0], tmp_ip[1],tmp_ip[2], tmp_ip[3],tmp_ip[4], tmp_ip[5],tmp_ip[6], tmp_ip[7], | |
tmp_ip[8], tmp_ip[9],tmp_ip[10], tmp_ip[11],tmp_ip[12], tmp_ip[13],tmp_ip[14], tmp_ip[15]); | |
} | |
break; | |
case AIR_ACL_DSCP: | |
AIR_PRINT("\t dscp: 0x%x, dscp-mask: 0x%x\n", rule.key.dscp, rule.mask.dscp); | |
break; | |
case AIR_ACL_PROTOCOL: | |
AIR_PRINT("\t protocol: 0x%x, protocol-mask: 0x%x\n", rule.key.protocol, rule.mask.protocol); | |
break; | |
case AIR_ACL_FLOW_LABEL: | |
AIR_PRINT("\t flow-label: 0x%x, flow-label-mask: 0x%x\n", rule.key.flow_label, rule.mask.flow_label); | |
break; | |
default: | |
AIR_PRINT("error\n"); | |
break; | |
} | |
} | |
} | |
} | |
else | |
{ | |
AIR_PRINT("Entry is Invalid.\n"); | |
} | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclRmvRule( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T rule_idx = 0; | |
if(1 == argc) | |
{ | |
/* acl del rule <idx(0..127)> */ | |
rule_idx = _strtoul(argv[0], NULL, 0); | |
ret = air_acl_delRule(0, rule_idx); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Delete ACL Rule(%u): %s\n", rule_idx, air_error_getString(ret)); | |
} | |
else if(0 == argc) | |
{ | |
/* acl clear rule */ | |
ret = air_acl_clearRule(0); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Clear ACL Rule: %s\n", air_error_getString(ret)); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclUdfRule( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T rule_idx; | |
AIR_ACL_UDF_RULE_T rule; | |
C8_T start_addr[8][12]= | |
{ | |
"MAC header", | |
"L2 payload", | |
"IPv4 header", | |
"IPv6 header", | |
"L3 payload", | |
"TCP header", | |
"UDP header", | |
"L4 payload" | |
}; | |
C8_T str_temp[AIR_MAX_NUM_OF_PORTS+1]; | |
memset(&rule, 0, sizeof(AIR_ACL_UDF_RULE_T)); | |
if(7 == argc) | |
{ | |
/* acl set rule <idx(0..255)> <mode(0:pattern, 1:threshold)> [ <pat(4'hex)> <mask(4'hex)> | <low(4'hex)> <high(4'hex)> ] <start(0:MAC,1:ether,2:IP,3:IP_data,4:TCP/UDP,5:TCP/UDP data,6:IPv6)> <offset(0..62,unit:2 bytes)> <portmap(7'bin)> */ | |
rule_idx = _strtoul(argv[0], NULL, 0); | |
rule.cmp_sel = _strtoul(argv[1], NULL, 2); | |
if(AIR_ACL_RULE_CMP_SEL_PATTERN == rule.cmp_sel) | |
{ | |
rule.pattern = _strtoul(argv[2], NULL, 16); | |
rule.mask = _strtoul(argv[3], NULL, 16); | |
} | |
else | |
{ | |
rule.low_threshold = _strtoul(argv[2], NULL, 16); | |
rule.high_threshold = _strtoul(argv[3], NULL, 16); | |
} | |
rule.offset_format = _strtoul(argv[4], NULL, 0); | |
rule.offset = _strtoul(argv[5], NULL, 0); | |
rule.portmap = _strtoul(argv[6], NULL, 2); | |
rule.valid = TRUE; | |
ret = air_acl_setUdfRule(0, rule_idx, rule); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Set ACL UDF Rule(%u): %s\n", rule_idx, air_error_getString(ret)); | |
} | |
else if(1 == argc) | |
{ | |
rule_idx = _strtoul(argv[0], NULL, 0); | |
ret = air_acl_getUdfRule(0, rule_idx, &rule); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Get ACL UDF Rule(%u): %s\n", rule_idx, air_error_getString(ret)); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
if(TRUE == rule.valid) | |
{ | |
AIR_PRINT("\tMode : %s\n", (AIR_ACL_RULE_CMP_SEL_PATTERN == rule.cmp_sel)?"Pattern":"Threshold"); | |
if(AIR_ACL_RULE_CMP_SEL_PATTERN == rule.cmp_sel) | |
{ | |
AIR_PRINT("\tPattern : 0x%04X\n", rule.pattern); | |
AIR_PRINT("\tMask : 0x%04X\n", rule.mask); | |
} | |
else | |
{ | |
AIR_PRINT("\tLow Threshold : 0x%04X\n", rule.low_threshold); | |
AIR_PRINT("\tHigh Threshold: 0x%04X\n", rule.high_threshold); | |
} | |
AIR_PRINT("\tOffset Start : %s\n", start_addr[rule.offset_format]); | |
AIR_PRINT("\tOffset : %u %s\n", rule.offset*2, (0==rule.offset)?"Byte":"Bytes"); | |
_hex2bitstr(rule.portmap, str_temp, AIR_MAX_NUM_OF_PORTS+1); | |
AIR_PRINT("\tPortmap[0:6] : %s\n", str_temp); | |
} | |
else | |
{ | |
AIR_PRINT("Entry is Invalid.\n"); | |
} | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclRmvUdfRule( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T rule_idx; | |
if(1 == argc) | |
{ | |
/* acl del udfRule <idx(0..15)> */ | |
rule_idx = _strtoul(argv[0], NULL, 0); | |
ret = air_acl_delUdfRule(0, rule_idx); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Delete ACL UDF Rule(%u): %s\n", rule_idx, air_error_getString(ret)); | |
} | |
else if(0 == argc) | |
{ | |
/* acl clear udfRule */ | |
ret = air_acl_clearUdfRule(0); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Clear ACL UDF Rule: %s\n", air_error_getString(ret)); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclAction( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T argi = 0; | |
UI32_T act_idx; | |
AIR_ACL_ACTION_T act; | |
UI32_T redirect, trtcm, fwd; | |
C8_T fwding[AIR_ACL_ACT_FWD_LAST][25] = | |
{ | |
"Default", | |
"Default", | |
"Default", | |
"Default", | |
"Default & CPU excluded", | |
"Default & CPU included", | |
"CPU only", | |
"Drop" | |
}; | |
C8_T trtcm_usr[AIR_ACL_ACT_USR_TCM_LAST][8] = | |
{ | |
"Default", | |
"Green", | |
"Yellow", | |
"Red" | |
}; | |
C8_T egtag[AIR_ACL_ACT_EGTAG_LAST][11] = | |
{ | |
"Default", | |
"Consistent", | |
"", | |
"", | |
"Untag", | |
"Swap", | |
"Tag", | |
"Stack" | |
}; | |
C8_T str_temp[20]; | |
memset(&act, 0, sizeof(AIR_ACL_ACTION_T)); | |
if(2 < argc) | |
{ | |
/* acl set action <idx(0..127)> | |
[ forward <forward(0:Default,4:Exclude CPU,5:Include CPU,6:CPU only,7:Drop)> ] | |
[ egtag <egtag(0:Default,1:Consistent,4:Untag,5:Swap,6:Tag,7:Stack)> ] | |
[ mirrormap <mirrormap(2'bin)> ] | |
[ priority <priority(0..7)> ] | |
[ redirect <redirect(0:Dst,1:Vlan)> <portmap(7'bin)> ] | |
[ leaky_vlan <leaky_vlan(1:En,0:Dis)> ] | |
[ cnt_idx <cnt_idx(0..63)> ] | |
[ rate_idx <rate_idx(0..31)> ] | |
[ attack_idx <attack_idx(0..95)> ] | |
[ vid <vid(0..4095)> ] | |
[ manage <manage(1:En,0:Dis)> ] | |
[ bpdu <bpdu(1:En,0:Dis)> ] | |
[ class <class(0:Original,1:Defined)>[0..7] ] | |
[ drop_pcd <drop_pcd(0:Original,1:Defined)> [red <red(0..7)>][yellow <yellow(0..7)>][green <green(0..7)>] ] | |
[ color <color(0:Defined,1:Trtcm)> [ <defined_color(0:Dis,1:Green,2:Yellow,3:Red)> | <trtcm_idx(0..31)> ] ]*/ | |
act_idx = _strtoul(argv[argi++], NULL, 0); | |
if(0 == _strcmp(argv[argi], "forward")) | |
{ | |
argi++; | |
fwd = _strtoul(argv[argi++], NULL, 0); | |
act.fwd_en = TRUE; | |
act.fwd = fwd; | |
} | |
if(0 == _strcmp(argv[argi], "egtag")) | |
{ | |
argi++; | |
act.egtag_en = TRUE; | |
act.egtag = _strtoul(argv[argi++], NULL, 0); | |
} | |
if(0 == _strcmp(argv[argi], "mirrormap")) | |
{ | |
argi++; | |
act.mirrormap = _strtoul(argv[argi++], NULL, 2); | |
} | |
if(0 == _strcmp(argv[argi], "priority")) | |
{ | |
argi++; | |
act.pri_user_en = TRUE; | |
act.pri_user= _strtoul(argv[argi++], NULL, 0); | |
} | |
if(0 == _strcmp(argv[argi], "redirect")) | |
{ | |
argi++; | |
redirect = _strtoul(argv[argi++], NULL, 0); | |
if(0 == redirect) | |
{ | |
act.port_en = TRUE; | |
act.dest_port_sel = TRUE; | |
act.portmap = _strtoul(argv[argi++], NULL, 2); | |
} | |
else | |
{ | |
act.port_en = TRUE; | |
act.vlan_port_sel = TRUE; | |
act.portmap = _strtoul(argv[argi++], NULL, 2); | |
} | |
} | |
if(0 == _strcmp(argv[argi], "leaky_vlan")) | |
{ | |
argi++; | |
act.lyvlan_en = TRUE; | |
act.lyvlan = _strtoul(argv[argi++], NULL, 0); | |
} | |
/* ACL event counter */ | |
if(0 == _strcmp(argv[argi], "cnt_idx")) | |
{ | |
argi++; | |
act.cnt_en = TRUE; | |
act.cnt_idx = _strtol(argv[argi++], NULL, 0); | |
} | |
if(0 == _strcmp(argv[argi], "rate_idx")) | |
{ | |
argi++; | |
act.rate_en = TRUE; | |
act.rate_idx = _strtol(argv[argi++], NULL, 0); | |
} | |
if(0 == _strcmp(argv[argi], "attack_idx")) | |
{ | |
argi++; | |
act.attack_en = TRUE; | |
act.attack_idx = _strtol(argv[argi++], NULL, 0); | |
} | |
if(0 == _strcmp(argv[argi], "vid")) | |
{ | |
argi++; | |
act.vlan_en = TRUE; | |
act.vlan_idx = _strtol(argv[argi++], NULL, 0); | |
} | |
/* Management frame */ | |
if(0 == _strcmp(argv[argi], "manage")) | |
{ | |
argi++; | |
act.mang = _strtoul(argv[argi++], NULL, 2); | |
} | |
if(0 == _strcmp(argv[argi], "bpdu")) | |
{ | |
argi++; | |
act.bpdu = _strtoul(argv[argi++], NULL, 2); | |
} | |
/* DSCP class remap */ | |
if(0 == _strcmp(argv[argi], "class")) | |
{ | |
argi++; | |
act.trtcm_en = TRUE; | |
act.trtcm.cls_slr_sel = _strtoul(argv[argi++], NULL, 2); | |
if(TRUE == act.trtcm.cls_slr_sel) | |
{ | |
act.trtcm.cls_slr = _strtoul(argv[argi++], NULL, 0); | |
} | |
} | |
if(0 == _strcmp(argv[argi], "drop_pcd")) | |
{ | |
argi++; | |
act.trtcm_en = TRUE; | |
act.trtcm.drop_pcd_sel = _strtoul(argv[argi++], NULL, 2); | |
if(TRUE == act.trtcm.drop_pcd_sel) | |
{ | |
if(0 == _strcmp(argv[argi], "red")) | |
{ | |
argi++; | |
act.trtcm.drop_pcd_r= _strtoul(argv[argi++], NULL, 0); | |
} | |
if(0 == _strcmp(argv[argi], "yellow")) | |
{ | |
argi++; | |
act.trtcm.drop_pcd_y= _strtoul(argv[argi++], NULL, 0); | |
} | |
if(0 == _strcmp(argv[argi], "green")) | |
{ | |
argi++; | |
act.trtcm.drop_pcd_g= _strtoul(argv[argi++], NULL, 0); | |
} | |
} | |
} | |
/* trTCM */ | |
if(0 == _strcmp(argv[argi], "color")) | |
{ | |
argi++; | |
act.trtcm_en = TRUE; | |
act.trtcm.tcm_sel = _strtoul(argv[argi++], NULL, 2); | |
trtcm = _strtoul(argv[argi++], NULL, 0); | |
if(FALSE == act.trtcm.tcm_sel) | |
{ | |
act.trtcm.usr_tcm = trtcm; | |
} | |
else | |
{ | |
act.trtcm.tcm_idx = trtcm; | |
} | |
} | |
ret = air_acl_setAction(0, act_idx, act); | |
AIR_PRINT("Set ACL Action(%u): %s\n", act_idx, air_error_getString(ret)); | |
} | |
else if(1 == argc) | |
{ | |
/* acl get action <idx(0..127)> */ | |
act_idx = _strtoul(argv[argi++], NULL, 0); | |
ret = air_acl_getAction(0, act_idx, &act); | |
AIR_PRINT("Get ACL Action(%u): %s\n", act_idx, air_error_getString(ret)); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
if(TRUE == act.fwd_en) | |
{ | |
AIR_PRINT("\t Forwarding : %s\n", fwding[act.fwd]); | |
} | |
if(TRUE == act.egtag_en) | |
{ | |
AIR_PRINT("\t Egress tag : %s\n", egtag[act.egtag]); | |
} | |
if(act.mirrormap) | |
{ | |
AIR_PRINT("\t Mirror Session Map : %u\n", act.mirrormap); | |
} | |
if(TRUE == act.pri_user_en) | |
{ | |
AIR_PRINT("\t User Priority : %u\n", act.pri_user); | |
} | |
if(TRUE == act.port_en) | |
{ | |
_hex2bitstr(act.portmap, str_temp, AIR_MAX_NUM_OF_PORTS+1); | |
if(TRUE == act.dest_port_sel) | |
{ | |
AIR_PRINT("\t Destination Port[0:6]: %s\n", str_temp); | |
} | |
else | |
{ | |
AIR_PRINT("\t VLAN Port[0:6] : %s\n", str_temp); | |
} | |
} | |
if(TRUE == act.lyvlan_en) | |
{ | |
AIR_PRINT("\t Leaky VLAN : %s\n", (TRUE == act.lyvlan)?"Enable":"Disable"); | |
} | |
AIR_PRINT("\t Management Frame : %s\n", (TRUE == act.mang)?"Enable":"Disable"); | |
AIR_PRINT("\t BPDU Frame : %s\n", (TRUE == act.bpdu)?"Enable":"Disable"); | |
if(TRUE == act.cnt_en) | |
{ | |
AIR_PRINT("\t Event Index : %u\n", act.cnt_idx); | |
} | |
/* trTCM*/ | |
if(TRUE == act.trtcm_en) | |
{ | |
if(TRUE == act.trtcm.cls_slr_sel) | |
{ | |
AIR_PRINT("\t Class Selector Remap : %u\n", act.trtcm.cls_slr); | |
} | |
else | |
{ | |
AIR_PRINT("\t Class Selector Remap : %s\n", "Disable"); | |
} | |
if(TRUE == act.trtcm.drop_pcd_sel) | |
{ | |
AIR_PRINT("\t Drop Precedence Remap(Red): %u\n", act.trtcm.drop_pcd_r); | |
AIR_PRINT("\t Drop Precedence Remap(Yel): %u\n", act.trtcm.drop_pcd_y); | |
AIR_PRINT("\t Drop Precedence Remap(Gre): %u\n", act.trtcm.drop_pcd_g); | |
} | |
else | |
{ | |
AIR_PRINT("\t Drop Precedence Remap: %s\n", "Disable"); | |
} | |
if(TRUE == act.trtcm.tcm_sel) | |
{ | |
AIR_PRINT("\t trTCM Meter Index : %u\n", act.trtcm.tcm_idx); | |
} | |
else | |
{ | |
AIR_PRINT("\t trTCM User Defined : %s\n", trtcm_usr[act.trtcm.usr_tcm]); | |
} | |
} | |
/* rate control */ | |
if(TRUE == act.rate_en) | |
{ | |
AIR_PRINT("\t Rate Control Index : %u\n", act.rate_idx); | |
} | |
if(TRUE == act.attack_en) | |
{ | |
AIR_PRINT("\t Attack Rate Control Index: %u\n", act.attack_idx); | |
} | |
if(TRUE == act.vlan_en) | |
{ | |
AIR_PRINT("\t ACL VLAN Index : %u\n", act.vlan_idx); | |
} | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclRmvAction( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T act_idx; | |
if(1 == argc) | |
{ | |
/* acl del action <idx(0..127)> */ | |
act_idx = _strtoul(argv[0], NULL, 0); | |
ret = air_acl_delAction(0, act_idx); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Delete ACL Action(%u): %s\n", act_idx, air_error_getString(ret)); | |
} | |
else if(0 == argc) | |
{ | |
/* acl clear action */ | |
ret = air_acl_clearAction(0); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Clear ACL Action: %s\n", air_error_getString(ret)); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclTrtcm( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T argi = 0; | |
UI32_T tcm_idx; | |
AIR_ACL_TRTCM_T tcm; | |
memset(&tcm, 0, sizeof(AIR_ACL_TRTCM_T)); | |
if(5 == argc) | |
{ | |
/* acl set trtcm <idx(0..31)> <cir(4'hex)> <pir(4'hex)> <cbs(4'hex)> <pbs(4'hex)> */ | |
tcm_idx = _strtoul(argv[argi++], NULL, 0); | |
tcm.cir = _strtoul(argv[argi++], NULL, 16); | |
tcm.pir = _strtoul(argv[argi++], NULL, 16); | |
tcm.cbs = _strtoul(argv[argi++], NULL, 16); | |
tcm.pbs = _strtoul(argv[argi++], NULL, 16); | |
ret = air_acl_setTrtcm(0, tcm_idx, tcm); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Set ACL trTCM(%u): %s\n", tcm_idx, air_error_getString(ret)); | |
} | |
else if(1 == argc) | |
{ | |
/* acl get trtcm <idx(1..31)> */ | |
tcm_idx = _strtoul(argv[argi++], NULL, 0); | |
ret = air_acl_getTrtcm(0, tcm_idx, &tcm); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Get ACL trTCM(%u): %s\n", tcm_idx, air_error_getString(ret)); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("\t CIR: 0x%04X(unit:64Kbps)\n", tcm.cir); | |
AIR_PRINT("\t PIR: 0x%04X(unit:64Kbps)\n", tcm.pir); | |
AIR_PRINT("\t CBS: 0x%04X(unit:Byte)\n", tcm.cbs); | |
AIR_PRINT("\t PBS: 0x%04X(unit:Byte)\n", tcm.pbs); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclTrtcmEn( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
BOOL_T state = FALSE; | |
if (1 == argc) | |
{ | |
/* acl set trtcmEn <en(1:En,0:Dis)> */ | |
state = _strtol(argv[0], NULL, 10); | |
ret = air_acl_setTrtcmEnable(0, state); | |
AIR_PRINT("Set trTCM State "); | |
} | |
else if (0 == argc) | |
{ | |
/* acl get trtcmEn */ | |
ret = air_acl_getTrtcmEnable(0, &state); | |
AIR_PRINT("Get trTCM State "); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if (ret == AIR_E_OK) | |
{ | |
AIR_PRINT(": %s\n", (TRUE == state) ? "Enable" : "Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclRmvTrtcm( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T tcm_idx; | |
if(1 == argc) | |
{ | |
/* acl del trtcm <idx(1..31)> */ | |
tcm_idx = _strtoul(argv[0], NULL, 0); | |
ret = air_acl_delTrtcm(0, tcm_idx); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Delete ACL TRTCM(%u): %s\n", tcm_idx, air_error_getString(ret)); | |
} | |
else if(0 == argc) | |
{ | |
/* acl clear trtcm */ | |
ret = air_acl_clearTrtcm(0); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Clear ACL TRTCM: %s\n", air_error_getString(ret)); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclPortEn( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T argi=0; | |
UI32_T port = 0; | |
BOOL_T en; | |
if(2 == argc) | |
{ | |
/* acl set portEn <port(0..6)> <en(1:En,0:Dis)> */ | |
port = _strtoul(argv[argi++], NULL, 0); | |
en = _strtoul(argv[argi++], NULL, 2); | |
ret = air_acl_setPortEnable(0, port, en); | |
AIR_PRINT("Set Port:%u ACL function ", port); | |
} | |
else if(1 == argc) | |
{ | |
/* acl get portEn <port(0..6)> */ | |
port = _strtoul(argv[argi++], NULL, 0); | |
ret = air_acl_getPortEnable(0, port, &en); | |
AIR_PRINT("Get Port:%u ACL function ", port); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT(": %s\n", (TRUE == en)?"Enable":"Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclDropEn( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T argi=0; | |
UI32_T port = 0; | |
BOOL_T en; | |
if(2 == argc) | |
{ | |
/* acl set dropEn <port(0..6)> <en(1:En,0:Dis)> */ | |
port = _strtoul(argv[argi++], NULL, 0); | |
en = _strtoul(argv[argi++], NULL, 2); | |
ret = air_acl_setDropEnable(0, port, en); | |
AIR_PRINT("Set ACL Drop precedence "); | |
} | |
else if(1 == argc) | |
{ | |
/* acl set dropEn <port(0..6)> */ | |
port = _strtoul(argv[argi++], NULL, 0); | |
ret = air_acl_getDropEnable(0, port, &en); | |
AIR_PRINT("Get ACL Drop precedence "); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("(Port %u):%s\n", | |
port, | |
(TRUE == en)?"Enable":"Disable"); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclDropThrsh( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T argi=0; | |
UI32_T port = 0; | |
AIR_ACL_DP_COLOR_T color; | |
UI8_T queue; | |
UI32_T high, low; | |
C8_T dp_color[AIR_ACL_DP_COLOR_LAST][7] = | |
{ | |
"Green", | |
"Yellow", | |
"Red" | |
}; | |
if(5 == argc) | |
{ | |
/* acl set dropThrsh <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> <high(0..2047)> <low(0..2047) */ | |
port = _strtoul(argv[argi++], NULL, 0); | |
color = _strtoul(argv[argi++], NULL, 0); | |
queue = _strtoul(argv[argi++], NULL, 0); | |
high = _strtoul(argv[argi++], NULL, 0); | |
low = _strtoul(argv[argi++], NULL, 0); | |
ret = air_acl_setDropThreshold(0, port, color, queue, high, low); | |
AIR_PRINT("Set ACL Drop precedence "); | |
} | |
else if(3 == argc) | |
{ | |
/* acl get dropThrsh <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> */ | |
port = _strtoul(argv[argi++], NULL, 0); | |
color = _strtoul(argv[argi++], NULL, 0); | |
queue = _strtoul(argv[argi++], NULL, 0); | |
ret = air_acl_getDropThreshold(0, port, color, queue, &high, &low); | |
AIR_PRINT("Get ACL Drop precedence "); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("(Port %u, color:%s, queue:%u):\n", | |
port, | |
dp_color[color], | |
queue); | |
AIR_PRINT("\tHigh Threshold :%u\n", high); | |
AIR_PRINT("\tLow Threshold :%u\n", low); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclDropPbb( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T argi=0; | |
UI32_T port = 0; | |
AIR_ACL_DP_COLOR_T color; | |
UI8_T queue; | |
UI32_T pbb; | |
C8_T dp_color[AIR_ACL_DP_COLOR_LAST][7] = | |
{ | |
"Green", | |
"Yellow", | |
"Red" | |
}; | |
if(4 == argc) | |
{ | |
/* acl set dropPbb <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> <probability(0..1023) */ | |
port = _strtoul(argv[argi++], NULL, 0); | |
color = _strtoul(argv[argi++], NULL, 0); | |
queue = _strtoul(argv[argi++], NULL, 0); | |
pbb = _strtoul(argv[argi++], NULL, 0); | |
ret = air_acl_setDropProbability(0, port, color, queue, pbb); | |
AIR_PRINT("Set ACL Drop precedence "); | |
} | |
else if(3 == argc) | |
{ | |
/* acl get dropPbb <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> */ | |
port = _strtoul(argv[argi++], NULL, 0); | |
color = _strtoul(argv[argi++], NULL, 0); | |
queue = _strtoul(argv[argi++], NULL, 0); | |
ret = air_acl_getDropProbability(0, port, color, queue, &pbb); | |
AIR_PRINT("Get ACL Drop precedence "); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(ret == AIR_E_OK) | |
{ | |
AIR_PRINT("(Port %u, color:%s, queue %u):\n", | |
port, | |
dp_color[color], | |
queue); | |
AIR_PRINT("\tDrop probability:%u(unit=1/1023)\n", pbb); | |
} | |
else | |
{ | |
AIR_PRINT("Fail!\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclMeter( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T argi = 0; | |
UI32_T meter_idx, state, rate; | |
if(3 == argc) | |
{ | |
/* acl set meter <idx(0..31)> <en(1:En,0:Dis)> <rate(0..65535)> | |
Note: Limit rate = rate * 64Kbps */ | |
meter_idx = _strtoul(argv[argi++], NULL, 0); | |
state = _strtoul(argv[argi++], NULL, 2); | |
rate = _strtoul(argv[argi++], NULL, 0); | |
ret = air_acl_setMeterTable(0, meter_idx, state, rate); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Set ACL Meter(%u): %s\n", meter_idx, air_error_getString(ret)); | |
} | |
else if(1 == argc) | |
{ | |
/* acl get meter <idx(0..31)> */ | |
meter_idx = _strtoul(argv[argi++], NULL, 0); | |
ret = air_acl_getMeterTable(0, meter_idx, &state, &rate); | |
if(ret < AIR_E_LAST) | |
AIR_PRINT("Get ACL Meter(%u): %s\n", meter_idx, air_error_getString(ret)); | |
} | |
else | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if(AIR_E_OK == ret) | |
{ | |
AIR_PRINT("\t State: %s\n", (TRUE == state)?"Enable":"Disable"); | |
if(TRUE == state) | |
{ | |
AIR_PRINT("\t Rate : %u(unit:64Kbps)\n", rate); | |
} | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclDump( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
AIR_ERROR_NO_T ret = AIR_E_OK; | |
UI32_T i, cnt = 0; | |
AIR_ACL_CTRL_T ctrl; | |
if(0 != argc) | |
{ | |
AIR_PRINT("Unrecognized command.\n"); | |
return AIR_E_BAD_PARAMETER; | |
} | |
for(i=0; i<ACL_MAX_RULE_NUM; i++) | |
{ | |
memset(&ctrl, 0, sizeof(AIR_ACL_CTRL_T)); | |
ret = air_acl_getRuleCtrl(0, i, &ctrl); | |
if(AIR_E_OK == ret) | |
{ | |
if(TRUE == ctrl.rule_en) | |
{ | |
cnt++; | |
AIR_PRINT("\t Entry-%d vaild\n", i); | |
} | |
} | |
} | |
if(0 == cnt) | |
{ | |
AIR_PRINT("\t No entry vaild\n"); | |
} | |
return ret; | |
} | |
static AIR_ERROR_NO_T | |
doAclSet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(aclSetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doAclGet( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(aclGetCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doAclDel( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(aclDelCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doAclClear( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(aclClearCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
doAcl( | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
return subcmd(aclCmds, argc, argv); | |
} | |
static AIR_ERROR_NO_T | |
subcmd( | |
const AIR_CMD_T tab[], | |
UI32_T argc, | |
C8_T *argv[]) | |
{ | |
const AIR_CMD_T *cmdp; | |
I32_T found = 0; | |
I32_T i, len; | |
if (argc < 1) | |
{ | |
goto print_out_cmds; | |
} | |
for (cmdp = tab; cmdp->name != NULL; cmdp++) | |
{ | |
if (strlen(argv[0]) == strlen(cmdp->name)) | |
{ | |
if (strncmp(argv[0], cmdp->name, strlen(argv[0])) == 0) | |
{ | |
found = 1; | |
break; | |
} | |
} | |
} | |
if(!found) | |
{ | |
C8_T buf[66]; | |
print_out_cmds: | |
AIR_PRINT("valid subcommands:\n"); | |
memset(buf, ' ', sizeof(buf)); | |
buf[64] = '\n'; | |
buf[65] = '\0'; | |
for (i=0, cmdp = tab; cmdp->name != NULL; cmdp++) | |
{ | |
len = strlen(cmdp->name); | |
strncpy(&buf[i*16], cmdp->name, (len > 16) ? 16 : len); | |
if(3 == i) | |
{ | |
AIR_PRINT("%s\n", buf); | |
memset(buf, ' ', sizeof(buf)); | |
buf[64] = '\n'; | |
buf[65] = '\0'; | |
} | |
i = (i + 1) % 4; | |
} | |
if (0 != i) | |
AIR_PRINT("%s\n", buf); | |
return AIR_E_BAD_PARAMETER; | |
} | |
if (CMD_NO_PARA == cmdp->argc_min) | |
{ | |
if (argc != 1) | |
{ | |
if (cmdp->argc_errmsg != NULL) | |
{ | |
AIR_PRINT("Usage: %s\n", cmdp->argc_errmsg); | |
} | |
return AIR_E_BAD_PARAMETER; | |
} | |
} | |
else if (CMD_VARIABLE_PARA == cmdp->argc_min) | |
{ | |
if (argc < 3) | |
{ | |
if (cmdp->argc_errmsg != NULL) | |
{ | |
AIR_PRINT("Usage: %s\n", cmdp->argc_errmsg); | |
} | |
return AIR_E_BAD_PARAMETER; | |
} | |
} | |
else | |
{ | |
if ((argc <= cmdp->argc_min) || ((cmdp->argc_min != 0) && (argc != (cmdp->argc_min + 1)))) | |
{ | |
if (cmdp->argc_errmsg != NULL) | |
{ | |
AIR_PRINT("Usage: %s\n", cmdp->argc_errmsg); | |
} | |
return AIR_E_BAD_PARAMETER; | |
} | |
} | |
if (cmdp->func) | |
{ | |
argc--; | |
argv++; | |
return (*cmdp->func)(argc, argv); | |
} | |
return AIR_E_OK; | |
} | |
/* FUNCTION NAME: air_parse_cmd | |
* PURPOSE: | |
* This function is used process diagnostic cmd | |
* INPUT: | |
* argc -- parameter number | |
* argv -- parameter strings | |
* OUTPUT: | |
* None | |
* RETURN: | |
* NPS_E_OK -- Successfully read the data. | |
* NPS_E_OTHERS -- Failed to read the data. | |
* NOTES: | |
* | |
*/ | |
AIR_ERROR_NO_T | |
air_parse_cmd( | |
const UI32_T argc, | |
const C8_T **argv) | |
{ | |
return subcmd(Cmds, argc, (C8_T **)argv); | |
} | |