给这个代码加上详细的注释:
static STATUS _qosPortMibUpdateCb()
{
// DW("_qosPortMibUpdateCb");
int ret = ERR_NO_ERROR;
char *key = NULL;
void *handler = NULL;
user_port logicPort = {};
user_port physicalPort = {};
QOS_PORT_RATE_DIFF_STRUCT rateDiff = {};
UINT64 ingressVal = 0;
UINT64 egressVal = 0;
UINT64 bcVal = 0;
UINT64 mcVal = 0;
UINT32 rate = 0;
TIMER_ID recoverTimer;
TIMER_ID_INIT(recoverTimer);
struct timespec timer = {};
char strUp[STR_STRUP_SIZE] = {};
char timerName[STR_TIMER_NAME_SIZE] = {};
APPQOS_ADCFG_OPT optCfg = {};
QOS_PORT_STATUS portStatus = {};
UINT32 lagId = 0;
UINT8 shutdownFlag = 0;
NTFY_QOS qosNtfy = {};
MAC_ADDRESS sysMac = {};
char macStr[STR_MAC_SIZE] = {};
char portStr[STR_STRUP_SIZE] = {};
memset(macStr, 0, 20);
libStkSysDevMacGet(UNIT_CURRENT, sysMac);
ether2str(macStr, sysMac, CSL_UPCASE, STR_TRANS_CLI);
qosTrapCounter++;
if (qosTrapCounter >= QOS_STORM_EXCEED_LOG_CYCLE) {
qosTrapCounter = 0;
l_ingressLogEnable = TRUE;
l_egressLogEnable = TRUE;
l_bcLogEnable = TRUE;
l_mcLogEnable = TRUE;
}
/* 置位flag */
BOOL f_ingressLogEnable = FALSE;
BOOL f_egressLogEnable = FALSE;
BOOL f_bcLogEnable = FALSE;
BOOL f_mcLogEnable = FALSE;
dal_ado_t *adoi;
adoi = dalAsdoiCreate(DMP_DEV_NAME_SWITCHMAC, DAL_MOD_PORT, DAL_CFG_TYPE_ENTRY);
APPL_ENSURE_DONE(ret, adoi, ERR_NO_MEMORY);
dalAdoiEntryTableAppend(adoi, DAL_PORT_K_MIB);
dalAdoiEntryOperAppend(adoi, DAL_PORT_K_MIB, DAL_OPER_GET_ALL);
if (PFM_ERR_C_OK != dalGet(adoi))
{
ret = ERR_BAD_PARAM;
goto done;
}
if (NULL != (handler = DAL_ADOI_ENTRY(adoi, DAL_PORT_K_MIB)))
{
DAL_ADOI_ENTRY_LOOP(handler)
{
if(NULL == (key = DAL_ADOI_ENTRY_KEY(handler)) || !DAL_ADOI_ENTRY_KEY_MATCH(handler, DAL_PORT_K_MIB_ALL))
{
continue;
}
DAL_PORT_KEY_MIB_PARSE_TO_UP(key, physicalPort);
/* QOS_TODO:所有端口启用功能并且link-up时存在性能问题
get交换机的时间戳,通过绝对时间来处理
*/
adQosGetPortLinkStatus(physicalPort, &portStatus);
if (portStatus.status == DISABLE)
{
continue;
}
/* KEY inner field&value loop */
if (DAL_ADOI_ENTRY_KEY_EMPTY(handler))
{
QOS_DEBUG_COMMON("Invalid operation: deleting Fixed entries!");
}
else
{
DAL_ADOI_ENTRY_FIELD_LOOP(handler, key)
{
if (DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_PORT_K_MIB_F_RXBYTEDIFF))
{
dalAdoiGetEntryUI64(adoi, DAL_PORT_K_MIB, &rateDiff.rxbyteDiff);
}
else if (DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_PORT_K_MIB_F_TXBYTEDIFF))
{
dalAdoiGetEntryUI64(adoi, DAL_PORT_K_MIB, &rateDiff.txbyteDiff);
}
else if (DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_PORT_K_MIB_F_BCNUMDIFF))
{
dalAdoiGetEntryUI64(adoi, DAL_PORT_K_MIB, &rateDiff.bcNumDiff);
}
else if (DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_PORT_K_MIB_F_MCNUMDIFF))
{
dalAdoiGetEntryUI64(adoi, DAL_PORT_K_MIB, &rateDiff.mcNumDiff);
}
}
}
qosGetLagIdOfPort(physicalPort, &lagId);
if (lagId)
{
UP_FROM_LAG(logicPort, lagId);
}
else
{
memcpy(&logicPort, &physicalPort, sizeof(user_port));
}
ret = dataQosGetPortConfig(logicPort, &optCfg);
if (ret != ERR_NO_ERROR)
{
continue;
}
if(optCfg.stormLogging)
{
QOS_DEBUG("upIdx:%d, rxbyteDiff:%d, txbyteDiff:%d, bcNumDiff:%d, mcNumDiff:%d",
UP_INDEX(logicPort), rateDiff.rxbyteDiff, rateDiff.txbyteDiff, rateDiff.bcNumDiff, rateDiff.mcNumDiff);
}
/* 入口带宽阈值 Byte/s */
ingressVal = (UINT64)(optCfg.ingressRateValue) * QOS_RATE_KBPS_THOUSAND / QOS_IFG_DELAY; /*1(sec)*1000*/
/* 出口带宽阈值 Byte/s */
egressVal = (UINT64)(optCfg.egressRateValue) * QOS_RATE_KBPS_THOUSAND / QOS_IFG_DELAY;
if (QOS_RATE_MODE_PPS != optCfg.rateMode) //PPS(包速率模式)、KBPS(kbit模式)、RATIO(端口带宽模式)
{
if (QOS_RATE_MODE_KBPS == optCfg.rateMode)
{
/* 广播流量阈值 */
bcVal = (UINT64)(optCfg.bcRate) * QOS_RATE_KBPS_THOUSAND / QOS_IFG_DELAY;
/* 组播流量阈值 */
mcVal = (UINT64)(optCfg.mcRate) * QOS_RATE_KBPS_THOUSAND / QOS_IFG_DELAY;
}
else if (QOS_RATE_MODE_RATIO == optCfg.rateMode)
{
rate = optCfg.bcRate;
_rateValueTransform(logicPort, &rate);
bcVal = (UINT64)(rate)*QOS_RATE_KBPS_THOUSAND / QOS_IFG_DELAY;
rate = optCfg.mcRate;
_rateValueTransform(logicPort, &rate);
mcVal = (UINT64)(rate)*QOS_RATE_KBPS_THOUSAND / QOS_IFG_DELAY;
}
}
else
{
bcVal = (UINT64)optCfg.bcRate; /*1 sec*/
mcVal = (UINT64)optCfg.mcRate;
}
/* 入口带宽超限 */
if (optCfg.ingressRateValue && rateDiff.rxbyteDiff > ingressVal)
{
if (l_ingressLogEnable)
{
//QOS_TODO: snmp trap、controller log
f_ingressLogEnable = TRUE;
QDW("ingress exceed:%d", UP_PORT(physicalPort));
memset(&qosNtfy, 0, sizeof(qosNtfy));
qosNtfy.physicalPort = physicalPort;
qosNtfy.ingressRate = optCfg.ingressRateValue;
stateQosSnmpTrapSet(QOS_SNMP_TRAP_TYPE_BANDWIDTH_INGRESS, &qosNtfy); //触发告警
PORT_UP2STR(physicalPort, portStr);
QOS_ADD_LOG_ONE_PARA(LOG_QOS_PORT_INGRESS_REACH, portStr); //触发日志
}
}
else
{
/*bc trap & notify*/
if (optCfg.bcRate && QOS_RATE_MODE_PPS != optCfg.rateMode && (rateDiff.rxbyteDiff > bcVal)&&(QOS_RATE_ADJUST_PAR * rateDiff.bcNumDiff >= bcVal))
{
double factor = 1;
int packet_length = rateDiff.rxbyteDiff/rateDiff.bcNumDiff;
AD_QOS_RATE_ADJUST_BY_PACKET_LENGTH(factor, packet_length);
QOS_DEBUG_COMMON("factor %4f, rateValNew.rxbyteDiff %d",factor,rateDiff.rxbyteDiff);
if(rateDiff.rxbyteDiff >= factor * bcVal)
{
shutdownFlag = TRUE;
if (l_bcLogEnable)
{
//QOS_TODO: snmp trap、controller log
f_bcLogEnable = TRUE;
QDW("bc exceed:%d",UP_PORT(physicalPort));
memset(&qosNtfy, 0, sizeof(qosNtfy));
qosNtfy.physicalPort = physicalPort;
qosNtfy.bcastRate = optCfg.bcRate;
qosNtfy.bcastMode = optCfg.rateMode;
stateQosSnmpTrapSet(QOS_SNMP_TRAP_TYPE_STORM_CTRL_BCAST, &qosNtfy);
stateQosPortStormOccursSet(physicalPort, QOS_RATE_STORM_MODE_BC, TRUE);
if (optCfg.stormLogging)
{
PORT_UP2STR(physicalPort, portStr);
QOS_ADD_LOG_ONE_PARA(LOG_QOS_BCSTORM_CONTROL_REACH, portStr);
syslogAdd_omada(QOS_LOG_MODULE_NAME, LOG_OMADA_STORM_DETECTED, OMADA_KEY_OSW_STORM, OMD_ALERT_REPORT, portStr, (ULONG)"Broadcast", (ULONG)macStr, (ULONG)portStr, 0, 0, 0);
}
}
}
}
if (optCfg.bcRate && QOS_RATE_MODE_PPS == optCfg.rateMode && rateDiff.bcNumDiff >= bcVal)
{
shutdownFlag = TRUE;
if (l_bcLogEnable)
{
//QOS_TODO: snmp trap、controller log
f_bcLogEnable = TRUE;
QDW("bc exceed:%d",UP_PORT(physicalPort));
memset(&qosNtfy, 0, sizeof(qosNtfy));
qosNtfy.physicalPort = physicalPort;
qosNtfy.bcastRate = optCfg.bcRate;
qosNtfy.bcastMode = optCfg.rateMode;
stateQosSnmpTrapSet(QOS_SNMP_TRAP_TYPE_STORM_CTRL_BCAST, &qosNtfy);
stateQosPortStormOccursSet(physicalPort, QOS_RATE_STORM_MODE_BC, TRUE);
if (optCfg.stormLogging)
{
PORT_UP2STR(physicalPort, portStr);
QOS_ADD_LOG_ONE_PARA(LOG_QOS_BCSTORM_CONTROL_REACH, portStr);
syslogAdd_omada(QOS_LOG_MODULE_NAME, LOG_OMADA_STORM_DETECTED, OMADA_KEY_OSW_STORM, OMD_ALERT_REPORT, portStr, (ULONG)"Broadcast", (ULONG)macStr, (ULONG)portStr, 0, 0, 0);
}
}
}
/*mc trap & notify*/
if (optCfg.mcRate && QOS_RATE_MODE_PPS != optCfg.rateMode && (rateDiff.rxbyteDiff > mcVal) && (QOS_RATE_ADJUST_PAR * rateDiff.mcNumDiff >= mcVal))
{
double factor = 1;
int packet_length = rateDiff.rxbyteDiff/rateDiff.mcNumDiff;
AD_QOS_RATE_ADJUST_BY_PACKET_LENGTH(factor, packet_length);
QOS_DEBUG_COMMON("factor %4f, rateValNew.rxbyteDiff %d",factor,rateDiff.rxbyteDiff);
if(rateDiff.rxbyteDiff >= factor * mcVal)
{
shutdownFlag = TRUE;
if (l_mcLogEnable)
{
//QOS_TODO: snmp trap、controller log
f_mcLogEnable = TRUE;
QDW("mc exceed:%d",UP_PORT(physicalPort));
memset(&qosNtfy, 0, sizeof(qosNtfy));
qosNtfy.physicalPort = physicalPort;
qosNtfy.mcastRate = optCfg.mcRate;
qosNtfy.mcastMode = optCfg.rateMode;
stateQosSnmpTrapSet(QOS_SNMP_TRAP_TYPE_STORM_CTRL_MCAST, &qosNtfy);
stateQosPortStormOccursSet(physicalPort, QOS_RATE_STORM_MODE_MC, TRUE);
if (optCfg.stormLogging)
{
PORT_UP2STR(physicalPort, portStr);
QOS_ADD_LOG_ONE_PARA(LOG_QOS_MCSTORM_CONTROL_REACH, portStr);
syslogAdd_omada(QOS_LOG_MODULE_NAME, LOG_OMADA_STORM_DETECTED, OMADA_KEY_OSW_STORM, OMD_ALERT_REPORT, portStr, (ULONG)"Multicast", (ULONG)macStr, (ULONG)portStr, 0, 0, 0);
}
}
}
}
}
if (optCfg.egressRateValue && rateDiff.txbyteDiff > egressVal)
{
if (l_egressLogEnable)
{
//QOS_TODO: snmp trap、syslog、controller log
f_egressLogEnable = TRUE;
QDW("egress exceed:%d",UP_PORT(physicalPort));
memset(&qosNtfy, 0, sizeof(qosNtfy));
qosNtfy.physicalPort = physicalPort;
qosNtfy.egressRate = optCfg.egressRateValue;
stateQosSnmpTrapSet(QOS_SNMP_TRAP_TYPE_BANDWIDTH_EGRESS, &qosNtfy);
PORT_UP2STR(physicalPort, portStr);
QOS_ADD_LOG_ONE_PARA(LOG_QOS_PORT_EGRESS_REACH, portStr);
}
}
/*if port belong to a LAG, the optCfg is LAG rate Config*/
if (optCfg.stormOper == QOS_STORM_EXCEED_SHUTDOWN && shutdownFlag /* && portStatus */)
{
QOS_DEBUG("QOS_STORM_EXCEED_SHUTDOWN");
shutdownFlag = FALSE;
adQosSetPortState(physicalPort, DISABLE);
stateQosPortBlockStatusSet(physicalPort, ENABLE);
PORT_UP2STR(physicalPort, portStr);
QOS_ADD_LOG_ONE_PARA(LOG_QOS_PORT_STORM_CONTROL_SHUTDOWN, portStr);
syslogAdd_omada(QOS_LOG_MODULE_NAME, LOG_OMADA_STORM_SHUTDOWN, OMADA_KEY_OSW_PB, OMD_ALERT_REPORT, portStr, (ULONG)macStr, (ULONG)portStr, 0, 0, 0, 0);
//QOS_TODO:堆叠时,向master发送notify更新block信息
if (optCfg.recoverTime) {
if (UP_IS_LAG(logicPort))
dataQosRcvrTimerIdLagGet(physicalPort,&recoverTimer);
else
dataQosRcvrTimerIdPhyGet(logicPort,&recoverTimer);
/*add timer, LAG member set their own logic timer ID: check the timer value, if not 0, LAG has a timer*/
/* controller独有bug,定时器存在,需删除*/
if (TIMER_ID_IS_VALID(recoverTimer))
{
DEL_TIMER(recoverTimer);
}
timer.tv_sec = optCfg.recoverTime;
timer.tv_nsec = 0;
user_port upArr[2] = {};
upArr[0] = physicalPort;
upArr[1] = logicPort;
usUp2Str(upArr[0],strUp,UP_STR_BRF_PRFX);
snprintf(timerName, sizeof(timerName), "qosRecoverTime:%s",strUp);
if (UP_IS_LAG(logicPort))
{
recoverTimer = add_timer(timerName, &timer, _qosRateRecoverTimerNotify, upArr, sizeof(upArr), EXECUTE_SINGLE);
if (TIMER_ID_IS_VALID(recoverTimer))
dataQosRcvrTimerIdLagSet(physicalPort, recoverTimer);
}
else
{
recoverTimer = add_timer(timerName, &timer, _qosRateRecoverTimerNotify, upArr, sizeof(upArr), EXECUTE_SINGLE);
if (TIMER_ID_IS_VALID(recoverTimer))
dataQosRcvrTimerIdPhySet(physicalPort, recoverTimer);
}
}
}
if(f_ingressLogEnable)
{
l_ingressLogEnable = FALSE;
f_ingressLogEnable = FALSE;
}
if(f_egressLogEnable)
{
l_egressLogEnable = FALSE;
f_egressLogEnable = FALSE;
}
if(f_bcLogEnable)
{
l_bcLogEnable = FALSE;
f_bcLogEnable = FALSE;
}
if(f_mcLogEnable)
{
l_mcLogEnable = FALSE;
f_mcLogEnable = FALSE;
}
}//end loop handler
}
done:
if(adoi)
{
dalAdoiDestroy(adoi);
}
return ret;
}
最新发布