📄 mplsfunc.c
字号:
return MPLS_SDP_CMD_SUCCESS;
}
/************************************************************************
* FUNCTION NAME : tranCharMask2Len()
* DESCRIPTION: : compute the len of dot mask
* INPUT : mask
* OUTPUT :
* AUTHOR/DATE : Sun Baoping/ 01.12.12
* GLOBAL :
* NOTE : ..
/************************************************************************/
unsigned short tranCharMask2Len(uchar *mask)
{
int i = 0;
ulong ipMask;
unsigned long mm = 0x80000000;
ipMask = atoinet(mask);
for(i = 0; i< 32; i++)
{
if(!(mm & ipMask))
break;
else
mm = mm>>1;
}
return i;
}
/************************************************************************
* FUNCTION NAME : tranUlongMask2Len()
* DESCRIPTION: : compute the len of ulong mask
* INPUT : mask
* OUTPUT :
* AUTHOR/DATE : Sun Baoping/ 01.12.12
* GLOBAL :
* NOTE : ..
/************************************************************************/
unsigned short tranUlongMask2Len(unsigned long ipMask)
{
int i = 0;
unsigned long mm = 0x80000000;
for(i = 0; i< 32; i++)
{
if(!(mm & ipMask))
break;
else
mm = mm>>1;
}
return i;
}
unsigned long tranLen2mask(unsigned char len)
{
return (0xffffffff <<(32- len));
}
/************************************************************************
* FUNCTION NAME : mplsFecFilterListNoPtr()
* DESCRIPTION: : get prt to filter by filter No
* INPUT : listNo procesId
* OUTPUT : Ptr
* AUTHOR/DATE : Sun Baoping/ 01.12.12
* GLOBAL :
* NOTE : ..
/************************************************************************/
ushort mplsFecFilterListNoPtr(ushort listNo, uchar procesId, mplsFecFilterAll_t **Ptr)
{
mplsFecFilterAll_t *tempPtr;
tempPtr = mplsFecFilterHead;
while((tempPtr->listNo!=0)&&(tempPtr->listNo!=listNo))
{
tempPtr = tempPtr->next;
}
if(tempPtr->listNo==listNo)
{
*Ptr = tempPtr;
return MPLS_OAM_CMD_SUCCESS;
}
else if(tempPtr->listNo==0)
{
if(procesId == MPLS_FEC_FILTER_CONFIG)
{ /* mplsFecFilterPF 始终指向最后一个有效的FEC filter,
mplsFecFilterPN 是mplsFecFilterPF 的next */
mplsFecFilterPF = mplsFecFilterPN;
mplsFecFilterPN = (mplsFecFilterAll_t *)GET_UB(sizeof(mplsFecFilterAll_t));
if(mplsFecFilterPN==MPLS_NULL) /* MEMERY ALLOCAT ERROR ADD SBP 2001-12-21 */
return MPLS_MEMERY_ALLOCAT_ERROR;
memset(mplsFecFilterPN,0,sizeof(mplsFecFilterAll_t));
mplsFecFilterPN->next = MPLS_NULL;
mplsFecFilterPF->next = mplsFecFilterPN;
mplsFecFilterPF->listNo = listNo;
mplsFecFilterPF->allFilterFlag = 0;
mplsFecFilterPF->FecFilter = (singleFecFilterAddr_t *)GET_UB(sizeof(singleFecFilterAddr_t));
if(mplsFecFilterPF==MPLS_NULL) /* MEMERY ALLOCAT ERROR ADD SBP 2001-12-21 */
return MPLS_MEMERY_ALLOCAT_ERROR;
memset(mplsFecFilterPF->FecFilter,0,sizeof(singleFecFilterAddr_t));
mplsFecFilterPF->FecFilter->filterFlag = MPLS_FEC_FILTER_DISABLE_ALL;
mplsFecFilterPF->FecFilter->next = MPLS_NULL;
*Ptr = mplsFecFilterPF;
return MPLS_OAM_CMD_SUCCESS;
}
else
return MPLS_OAM_CMD_NOT_DONE; /* 如果需要可以改为具体的错误号 sbp 2002-1-3 */
}
else
return MPLS_OAM_CMD_NOT_DONE;
}
/************************************************************************
* FUNCTION NAME : mplsFecFilterDelete()
* DESCRIPTION: : delete Fec filter
* INPUT : Ptr
* OUTPUT :
* AUTHOR/DATE : Sun Baoping/ 01.12.12
* GLOBAL : mplsFecFilterHead
* NOTE : ..
/************************************************************************/
int16 mplsFecFilterDelete(mplsFecFilterAll_t **Ptr)
{
mplsFecFilterAll_t *tempPF,*tempPN;
tempPF = tempPN = mplsFecFilterHead;
while(tempPN!=MPLS_NULL)
{
if(tempPN->listNo==(*Ptr)->listNo)
{
if(tempPN == mplsFecFilterHead)
{
mplsFecFilterHead = mplsFecFilterHead->next;
}
else
{
tempPF->next = tempPN->next;
}
/* release every pointer in the struct */
RET_UB(tempPN->FecFilter);
RET_UB(tempPN);
return MPLS_OAM_CMD_SUCCESS;
}
tempPF = tempPN;
tempPN = tempPN->next;
}
return MPLS_OAM_CMD_FAIL;
}
/************************************************************************
* FUNCTION NAME : mplsFecFilterConfiguring()
* DESCRIPTION: : set up Fec filter
* INPUT : c_action deny or permit
* addr address
* cmdFlag add or delete
* OUTPUT : Ptr
* AUTHOR/DATE : Sun Baoping/ 01.12.12
* GLOBAL :
* NOTE : ..
/************************************************************************/
int16 mplsFecFilterConfiguring(mplsFecFilterAll_t **Ptr, uchar c_action,fecFilterAddr_t addr,uchar cmdFlag)
{
ulong tempAddr;
uchar NotHead;
uchar NumFnd;
ushort RetMsgNo;
singleFecFilterAddr_t *tempPtr;
singleFecFilterAddr_t *tempPtrPF;
singleFecFilterAddr_t *tempPtrPN;
NotHead = 0;
NumFnd = 0;
tempPtr = (*Ptr)->FecFilter;
tempPtrPF = tempPtr;
if(cmdFlag==MPLS_OAM_CMD_FLAG)
{
while((tempPtr->filterFlag != MPLS_FEC_FILTER_DISABLE_ALL)&&(tempPtr->next!=NULL))
{
RetMsgNo = IpAddrMaskMatching(tempPtr->fecAddr.IpAddr,tempPtr->fecAddr.mask.addrMask,addr.IpAddr,addr.mask.addrMask);
if(RetMsgNo!=MPLS_SDP_CMD_SUCCESS)
return RetMsgNo;
tempPtrPF = tempPtr;
tempPtr=tempPtr->next;
}
tempPtr = (*Ptr)->FecFilter;
tempPtrPF = tempPtr;
while((tempPtr->filterFlag != MPLS_FEC_FILTER_DISABLE_ALL)&&(tempPtr->next!=NULL))
{
NotHead = 1;
tempPtrPF = tempPtr;
tempPtr=tempPtr->next;
}
tempPtrPN = (singleFecFilterAddr_t *)GET_UB(sizeof(singleFecFilterAddr_t));
if(tempPtrPN==MPLS_NULL) /* MEMERY ALLOCAT ERROR ADD SBP 2001-12-21 */
return MPLS_MEMERY_ALLOCAT_ERROR;
memset(tempPtrPN,0,sizeof(singleFecFilterAddr_t));
tempPtrPN->next = MPLS_NULL;
if(NotHead == 1)
{
tempPtrPF->next = tempPtrPN;
tempPtrPN->next = tempPtr;
/*tempPtr = tempPtrPN;*/
}
else
{
tempPtrPN->next = tempPtr;
(*Ptr)->FecFilter = tempPtrPN;
}
tempPtrPN->filterFlag = c_action;
tempPtrPN->fecAddr = addr;
return MPLS_OAM_CMD_SUCCESS;
}
else
{
while(tempPtrPF!=NULL)
{
NotHead ++;
if(tempPtrPF->filterFlag==c_action &&
(memcmp(&tempPtrPF->fecAddr ,&addr, sizeof(fecFilterAddr_t)) == 0))
{
NumFnd = 1;
break;
}
tempPtr = tempPtrPF;
tempPtrPF = tempPtr->next;
}
if(NotHead==1)
{
if(NumFnd==1)
{
(*Ptr)->FecFilter = tempPtrPF->next;
RET_UB(tempPtrPF);
return MPLS_OAM_CMD_SUCCESS;
}
else
return MPLS_OAM_CMD_NOT_DONE;
}
else if(NotHead>1)
{
if(NumFnd==1)
{
tempPtr->next = tempPtrPF->next;
RET_UB(tempPtrPF);
return MPLS_OAM_CMD_SUCCESS;
}
else
return MPLS_OAM_CMD_NOT_DONE;
}
}
}
/************************************************************************
* FUNCTION NAME : mplsFecFilterMatching()
* DESCRIPTION: : matching address from the Fec policy table
* INPUT : Ptr netAddr netMask
* OUTPUT :
* AUTHOR/DATE : Sun Baoping/ 01.12.12
* GLOBAL :
* NOTE : ..
/************************************************************************/
uchar mplsFecFilterMatching(mplsFecFilterAll_t **Ptr, ulong netAddr,ulong netMask)
{
singleFecFilterAddr_t *tempPtr;
ulong tempAddr,tempAddr1;
ulong tempMask;
tempPtr = (*Ptr)->FecFilter;
tempAddr = netAddr & netMask;
while(tempPtr->filterFlag != MPLS_FEC_FILTER_NONE)
{
if(tempPtr->filterFlag==MPLS_FEC_FILTER_ENABLE_ALL)
return MPLS_FEC_FILTER_PERMIT;
else if(tempPtr->filterFlag==MPLS_FEC_FILTER_DISABLE_ALL)
return MPLS_FEC_FILTER_DENY;
else
{
#if 1
/* 模糊匹配方法 */
tempMask = tempPtr->fecAddr.mask.addrMask & netMask;
if(tempMask == tempPtr->fecAddr.mask.addrMask)
{
tempAddr1 = (tempPtr->fecAddr.IpAddr)&(tempPtr->fecAddr.mask.addrMask);
if(tempAddr == tempAddr1)
{ /* tempAddr 和 tempPtr->fecAddr.IpAddr 完全匹配 */
if(tempPtr->filterFlag==MPLS_FEC_FILTER_ENABLE_SINGLE)
return MPLS_FEC_FILTER_PERMIT;
else
return MPLS_FEC_FILTER_DENY;
}
else
{
tempAddr = tempPtr->fecAddr.mask.addrMask & tempAddr;
if(tempAddr == tempPtr->fecAddr.IpAddr)
{ /* tempPtr->fecAddr.IpAddr包含 tempAddr */
if(tempPtr->filterFlag==MPLS_FEC_FILTER_ENABLE_SINGLE)
return MPLS_FEC_FILTER_PERMIT;
else
return MPLS_FEC_FILTER_DENY;
}
}
}
else if(tempMask < tempPtr->fecAddr.mask.addrMask)
{
return MPLS_FEC_FILTER_DENY;
/* if(tempAddr == tempPtr->fecAddr.IpAddr & tempAddr)
{ tempPtr->fecAddr.IpAddr 包含于 tempAddr
if(tempPtr->filterFlag==MPLS_FEC_FILTER_ENABLE_SINGLE)
return MPLS_FEC_FILTER_PERMIT;
else
return MPLS_FEC_FILTER_DENY;
}*/
}
#endif
/* 完
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -