OK,
The function in y.c:
static GT_STATUS pirl2DataToResource
(
IN GT_QD_DEV *dev,
IN GT_PIRL2_DATA *pirlData,
OUT GT_PIRL2_RESOURCE *res
)
{
GT_U32 typeMask;
GT_U32 data;
gtMemSet((void*)res,0,sizeof(GT_PIRL2_RESOURCE));
data = (GT_U32)(pirlData->accountQConf|pirlData->accountFiltered|
pirlData->mgmtNrlEn|pirlData->saNrlEn|pirlData->daNrlEn|
pirlData->samplingMode);
if (data > 1)
{
DBG_INFO(("GT_BAD_PARAM (Boolean)\n"));
printf("pirl2DataToResource data > 1\r\n");
return GT_BAD_PARAM;
}
if (IS_IN_DEV_GROUP(dev,DEV_RESTRICTED_PIRL2_RESOURCE))
{
if (pirlData->samplingMode != GT_FALSE)
{
DBG_INFO(("GT_BAD_PARAM (sampling mode)\n"));
printf("GT_BAD_PARAM (sampling mode) data > 1\r\n");
return GT_BAD_PARAM;
}
}
res->accountQConf = pirlData->accountQConf;
res->accountFiltered = pirlData->accountFiltered;
res->mgmtNrlEn = pirlData->mgmtNrlEn;
res->saNrlEn = pirlData->saNrlEn;
res->daNrlEn = pirlData->daNrlEn;
res->samplingMode = pirlData->samplingMode;
switch(pirlData->actionMode)
{
case PIRL_ACTION_ACCEPT:
case PIRL_ACTION_USE_LIMIT_ACTION:
res->actionMode = pirlData->actionMode;
break;
default:
printf("pirlData->actionMode=%d\r\n", pirlData->actionMode);
DBG_INFO(("GT_BAD_PARAM actionMode\n"));
return GT_BAD_PARAM;
}
switch(pirlData->ebsLimitAction)
{
case ESB_LIMIT_ACTION_DROP:
case ESB_LIMIT_ACTION_FC:
res->ebsLimitAction = pirlData->ebsLimitAction;
break;
default:
printf("pirlData->ebsLimitAction=%d\r\n", pirlData->ebsLimitAction);
DBG_INFO(("GT_BAD_PARAM ebsLimitAction\n"));
return GT_BAD_PARAM;
}
switch(pirlData->fcDeassertMode)
{
case GT_PIRL_FC_DEASSERT_EMPTY:
case GT_PIRL_FC_DEASSERT_CBS_LIMIT:
res->fcDeassertMode = pirlData->fcDeassertMode;
break;
default:
if(res->ebsLimitAction != ESB_LIMIT_ACTION_FC)
{
res->fcDeassertMode = GT_PIRL_FC_DEASSERT_EMPTY;
break;
}
DBG_INFO(("GT_BAD_PARAM fcDeassertMode\n"));
printf("pirlData->fcDeassertMode=%d\r\n", pirlData->fcDeassertMode);
return GT_BAD_PARAM;
}
if(pirlData->customSetup.isValid == GT_TRUE)
{
res->ebsLimit = pirlData->customSetup.ebsLimit;
res->cbsLimit = pirlData->customSetup.cbsLimit;
res->bktIncrement = pirlData->customSetup.bktIncrement;
res->bktRateFactor = pirlData->customSetup.bktRateFactor;
}
else
{
if(pirlData->ingressRate == 0)
{
DBG_INFO(("GT_BAD_PARAM ingressRate(%i)\n",pirlData->ingressRate));
printf("pirlData->ingressRate == 0\r\n", pirlData->fcDeassertMode);
return GT_BAD_PARAM;
}
if(pirlData->ingressRate < 1000) /* less than 1Mbps */
{
/* it should be divided by 64 */
if(pirlData->ingressRate % 64)
{
DBG_INFO(("GT_BAD_PARAM ingressRate(%i)\n",pirlData->ingressRate));
printf("pirlData->ingressRate % 64\r\n");
return GT_BAD_PARAM;
}
res->bktRateFactor = pirlData->ingressRate/64;
}
else if(pirlData->ingressRate < 10000) /* less than or equal to 10Mbps */
{
/* it should be divided by 1000 */
if(pirlData->ingressRate % 1000)
{
DBG_INFO(("GT_BAD_PARAM ingressRate(%i)\n",pirlData->ingressRate));
printf("pirlData->ingressRate % 1000\r\n");
return GT_BAD_PARAM;
}
res->bktRateFactor = pirlData->ingressRate/128 + ((pirlData->ingressRate % 128)?1:0);
}
else if(pirlData->ingressRate < 100000) /* less than or equal to 100Mbps */
{
/* it should be divided by 1000 */
if(pirlData->ingressRate % 1000)
{
DBG_INFO(("GT_BAD_PARAM ingressRate(%i)\n",pirlData->ingressRate));
printf("pirlData->ingressRate % 1000 2\r\n");
return GT_BAD_PARAM;
}
res->bktRateFactor = pirlData->ingressRate/1000;
}
else if(pirlData->ingressRate <= 200000) /* less than or equal to 200Mbps */
{
/* it should be divided by 10000 */
if(pirlData->ingressRate % 10000)
{
DBG_INFO(("GT_BAD_PARAM ingressRate(%i)\n",pirlData->ingressRate));
printf("pirlData->ingressRate % 100000 \r\n");
return GT_BAD_PARAM;
}
res->bktRateFactor = pirlData->ingressRate/1000;
}
else
{
DBG_INFO(("GT_BAD_PARAM ingressRate(%i)\n",pirlData->ingressRate));
printf("GT_BAD_PARAM ingressRate(%i)\r\n", pirlData->ingressRate);
return GT_BAD_PARAM;
}
res->ebsLimit = RECOMMENDED_ESB_LIMIT(dev, pirlData->ingressRate);
res->cbsLimit = RECOMMENDED_CBS_LIMIT(dev, pirlData->ingressRate);
res->bktIncrement = RECOMMENDED_BUCKET_INCREMENT(dev, pirlData->ingressRate);
}
switch(pirlData->bktRateType)
{
case BUCKET_TYPE_TRAFFIC_BASED:
res->bktRateType = pirlData->bktRateType;
typeMask = 0x7FFF;
if (pirlData->bktTypeMask > typeMask)
{
DBG_INFO(("GT_BAD_PARAM bktTypeMask(%#x)\n",pirlData->bktTypeMask));
printf("pirlData->bktTypeMask > typeMask \r\n");
return GT_BAD_PARAM;
}
res->bktTypeMask = pirlData->bktTypeMask;
if (pirlData->bktTypeMask & BUCKET_TRAFFIC_ARP)
{
res->bktTypeMask &= ~BUCKET_TRAFFIC_ARP;
res->bktTypeMask |= 0x80;
}
if (pirlData->priORpt > 1)
{
DBG_INFO(("GT_BAD_PARAM rpiORpt\n"));
printf("pirlData->priORpt > 1)\r\n");
return GT_BAD_PARAM;
}
res->priORpt = pirlData->priORpt;
if (pirlData->priMask >= (1 << 4))
{
DBG_INFO(("GT_BAD_PARAM priMask(%#x)\n",pirlData->priMask));
printf("pirlData->priMask >= (1 << 4)\r\n");
return GT_BAD_PARAM;
}
res->priMask = pirlData->priMask;
break;
case BUCKET_TYPE_RATE_BASED:
res->bktRateType = pirlData->bktRateType;
res->bktTypeMask = pirlData->bktTypeMask;
res->priORpt = pirlData->priORpt;
res->priMask = pirlData->priMask;
break;
default:
DBG_INFO(("GT_BAD_PARAM bktRateType(%#x)\n",pirlData->bktRateType));
printf("GT_BAD_PARAM bktRateType:%d\r\n", pirlData->bktRateType);
return GT_BAD_PARAM;
}
switch(pirlData->byteTobeCounted)
{
case GT_PIRL2_COUNT_FRAME:
case GT_PIRL2_COUNT_ALL_LAYER1:
case GT_PIRL2_COUNT_ALL_LAYER2:
case GT_PIRL2_COUNT_ALL_LAYER3:
res->byteTobeCounted = pirlData->byteTobeCounted;
break;
default:
DBG_INFO(("GT_BAD_PARAM byteTobeCounted(%#x)\n",pirlData->byteTobeCounted));
printf("pirlData->byteTobeCounted=%d\r\n", pirlData->byteTobeCounted);
return GT_BAD_PARAM;
}
return GT_OK;
}
code in z.c:
GT_STATUS swSetPortTrafficRateLimit2(GT_RATE_LIMIT_MODE traffic_type, GT_U32 ingressRate, GT_U32 port)
{
GT_STATUS status = 0;
GT_PIRL2_DATA pirlData = {0};
GT_U32 irlUnit = 0; /* always use 0 bucket. */
GT_U32 devId = 0;
GT_LPORT port_num_indev = 0;
if (port >= GT_PORT_MAX)
{
return(GT_BAD_PARAM);
}
if (ingressRate <= 0 || ingressRate > 200000)
{
return GT_BAD_PARAM;
}
pirlData.ingressRate = ingressRate;
pirlData.accountQConf = GT_FALSE;
//pirlData.accountFiltered = GT_TRUE;
// pirlData.ebsLimitAction = ESB_LIMIT_ACTION_FC;
pirlData.bktRateType = BUCKET_TYPE_RATE_BASED;
pirlData.bktTypeMask = 0xFFF;
pirlData.byteTobeCounted = GT_PIRL_COUNT_ALL_LAYER3;
devId = port/GT_PORT_PER_DEVICE;
port_num_indev = port%GT_PORT_PER_DEVICE;
if (devId >= N_OF_QD_DEVICES)
return GT_BAD_PARAM;
sem_wait_ex(&sem_swrw);
status = gpirl2WriteResource((GT_QD_DEV *)get_qd_dev_p(devId),port_num_indev, irlUnit, &pirlData);
sem_post_ex(&sem_swrw);
switch (status)
{
case GT_OK:
SWMGMT_DBG_printf(SWMGMT_DBG_SHELL,"IRL Unit %d is activated rate %dM.\n", irlUnit, ingressRate);
break;
case GT_BAD_PARAM:
SWMGMT_DBG_printf(SWMGMT_DBG_SHELL,"Invalid parameters are given.\n");
break;
case GT_NOT_SUPPORTED:
SWMGMT_DBG_printf(SWMGMT_DBG_SHELL,"Device is not supporting PIRL.\n");
break;
default:
printf("Failure to configure device. status=%d\r\n", status);
SWMGMT_DBG_printf(SWMGMT_DBG_SHELL,"Failure to configure device.\n");
break;
}
return status;
}
GT_STATUS swGetPortTrafficRateLimit2(GT_U32 *traffic_type, GT_U32 port, GT_U32 *limitRate)
{
GT_STATUS status;
GT_PRI0_RATE rate;
GT_RATE_LIMIT_MODE mode;
GT_U32 devId;
GT_U32 port_num_indev;
GT_PIRL2_DATA pirl_data = {0};
if (port >= GT_PORT_MAX)
{
return(GT_BAD_PARAM);
}
if (traffic_type ==NULL || limitRate == NULL)
return GT_BAD_PARAM;
devId = port/GT_PORT_PER_DEVICE;
port_num_indev = port%GT_PORT_PER_DEVICE;
if (devId >= N_OF_QD_DEVICES)
return GT_BAD_PARAM;
sem_wait_ex(&sem_swrw);
status = gpirl2ReadResource((GT_QD_DEV *)get_qd_dev_p(devId), port_num_indev, 0, &pirl_data);
if (status != GT_OK)
SWMGMT_DBG_printf(SWMGMT_DBG_SHELL,"grcGetLimitMode status=%d.\n", status);
sem_post_ex(&sem_swrw);
*limitRate = pirl_data.ingressRate;
return status;
}
Today I try find references by Ctrl+/ on ingressRate in function swSetPortTrafficRateLimit2(),
SE list the refernces in function swGetPortTrafficRateLimit2 and the structure definition in x.h,.