⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fec.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
/***********************************************************************/
/* FUNCTION NAME  : lspdelspecpro()                                     */
/* DESCRIPTION:   : del lsp to ldp( lsp down)                           */
/*  INPUT         : msg, in                             				*/
/*  OUTPUT        : void												*/
/*  AUTHOR/DATE   : shi.zhaohui/ 01.12.04                               */
/*  GLOBAL        : none												*/
/*  NOTE          :  ..                                                 */
/* History        : kong.yong weng.qing                                 */
/************************************************************************/
void    lspdelspecpro(FecMsg *msg,  void *in, unsigned char lsptype)
{
    mplsErLspTable_t        *erlspstr;
    unsigned char                   temp;
    PID                     Receiver;
    int                     rtnCode=1;

    GET_PID("LDPPROCESS",&Receiver);
    if(lsptype == MPLS_CR_LSP_TYPE)
    {
        erlspstr = (mplsErLspTable_t *)in;
        temp = (erlspstr -> ConnStatus & LSP_SET_STATUS_ABORT);
        if(temp == 0)
        {
            /*use for sb module to mfu port */
        	msg->Fec.sbPort=(unsigned short)fecModule2Port( erlspstr -> SbModule );
			msg->Fec.sbPort = erlspstr -> SbModule ;
        	msg->Fec.RouteType = INGRESS;
        	msg->OperateType = LBLABORT_TYPE;
        	Receiver.module = mplsManagerOamPID.module ;
       		msg->Fec.lspidTlv.routerId = Switcher.LsrId;
        	ASEND(MPLS_FEC_SETUP, msg, sizeof(FecMsg), Receiver);
        	/*EXTRA_KILL_TIMER(erlspstr -> TimerId);*/
        	if(erlspstr->TimerId)
        	MPLS_CLEAR_TIMER(erlspstr->TimerId, mpls_oam_timer_q, rtnCode);
        	erlspstr->TimerId = 0;
        	MPLS_ASSERT(rtnCode==1);
        	//lspnumpro(erlspstr -> SbModule , MPLS_LSP_DELETE);
			mplsQosFilterNoBindingAddorDelete(erlspstr-> delFilterNo,erlspstr->lsp_key.localLspId, 
											MPLS_OAM_DEL_BY_LSP);
        	 /* 删除绑定,拆除tunnel */
            if(erlspstr->FecGetSource&MPLS_FILTER_TUNNEL_DELETE)   
	        {
	            erlspstr->statusCode = TUNNELFILTERERROR;
	            erlspstr -> ConnStatus = LSP_SET_STATUS_DOWN;
	            erlspstr->FecGetSource = FECROUTECREATE;    
	            erlspstr-> delFilterNo = 0;   
            }
            else
        	mplsLspNoDelLsp(&erlspstr->lsp_key, lsptype);/* after lblabort, del er lsp*/
        	#ifdef __BGS10_MPLS_DEBUG
			printf("==== telnet send delete cr lsp,lspno : %d, fec send lblabort message to ldp module : %d(status:down)!!!====",
						erlspstr->lsp_key.localLspId,Receiver.module);
			#endif
        }
        else
        {
            /*EXTRA_KILL_TIMER(erlspstr -> TimerId);*/
            if(erlspstr->TimerId)
            MPLS_CLEAR_TIMER(erlspstr->TimerId, mpls_oam_timer_q, rtnCode);
            erlspstr->TimerId = 0;
            MPLS_ASSERT(rtnCode==1);
//            lspnumpro(erlspstr -> SbModule , MPLS_LSP_DELETE);
            mplsQosFilterNoBindingAddorDelete(erlspstr-> delFilterNo,erlspstr->lsp_key.localLspId, 
											MPLS_OAM_DEL_BY_LSP);
             /* 删除绑定,拆除tunnel */
            if(erlspstr->FecGetSource&MPLS_FILTER_TUNNEL_DELETE)   
	        {
	            erlspstr->statusCode = TUNNELFILTERERROR;
	            erlspstr -> ConnStatus = LSP_SET_STATUS_DOWN;
	            erlspstr->FecGetSource = FECROUTECREATE;    
	            erlspstr-> delFilterNo = 0;   
            }
            else
            mplsLspNoDelLsp(&erlspstr->lsp_key, lsptype);
        }
    }
}

/***********************************************************************/
/* FUNCTION NAME  : nodetypechanpro()                                   */
/* DESCRIPTION:   : erhop type change                                   */
/*  INPUT         : type                                				*/
/*  OUTPUT        : unsigned short												*/
/*  AUTHOR/DATE   : shi.zhaohui/ 01.12.04                               */
/*  GLOBAL        : none												*/
/*  NOTE          :  ..                                                 */
/* History        : kong.yong weng.qing                                 */
/************************************************************************/
unsigned short	nodetypechanpro(unsigned char	type)
{
	switch(type)
	{
		case NODE_TYPE_ERHOP_IPV4:
			return MPLS_ERHOP_IPV4_TLVTYPE;
			break;

		case NODE_TYPE_ERHOP_IPV6:
			return MPLS_ERHOP_IPV6_TLVTYPE;
			break;

		case NODE_TYPE_ERHOP_AS:
			return MPLS_ERHOP_AS_TLVTYPE;
			break;

		case NODE_TYPE_ERHOP_LSPID:
			return MPLS_ERHOP_LSPID_TLVTYPE;
			break;

		default :
		return 0;
		break;
	}
}

unsigned char	nodetypechanpro2(unsigned short	type)
{
	switch(type)
	{
		case MPLS_ERHOP_IPV4_TLVTYPE:
			return NODE_TYPE_ERHOP_IPV4;
			break;

		case MPLS_ERHOP_IPV6_TLVTYPE:
			return NODE_TYPE_ERHOP_IPV6;
			break;

		case MPLS_ERHOP_AS_TLVTYPE:
			return NODE_TYPE_ERHOP_AS;
			break;

		case MPLS_ERHOP_LSPID_TLVTYPE:
			return NODE_TYPE_ERHOP_LSPID;
			break;

		default :
		return 0;
		break;
	}
}

/***********************************************************************/
/* FUNCTION NAME  : crsetupvaluepro()                                     */
/* DESCRIPTION:   : cr lsp value                                        */
/*  INPUT         : FecMsg  *out,   mplsErLspTable_t *in            	*/
/*  OUTPUT        : void												*/
/*  AUTHOR/DATE   : shi.zhaohui/ 01.12.04                               */
/*  GLOBAL        : none												*/
/*  NOTE          :  ..                                                 */
/* History        : kong.yong weng.qing                                 */
/*2002.11.28 sbp 处理HOP ADDRESS 与hop no 的关系*/
/************************************************************************/
void  crsetupvaluepro(FecMsg  *out,   mplsErLspTable_t *in)
{
	unsigned short                 loop,loop1;
	QosMulitFieldFilter_t   *qosstr;

	out ->LspNo = in->lsp_key.localLspId;
    out ->Fec.TlvExists.flags = in -> tlvExist;
    if(out ->Fec.TlvExists.flags.lspidTlvExists == 1)
    {
    	out ->Fec.lspidTlv.localCrlspId = in->lsp_key.localLspId;
    	out ->Fec.lspidTlv.routerId = Switcher.LsrId;
    	out ->Fec.lspidTlv.actFlag.flag.res = 0;
    	out ->Fec.lspidTlv.actFlag.flag.ActFlag = MPLS_CRLSP_ACTION_INIT;
    	out ->Fec.lspidTlv.baseTlv.length = MPLS_LSPIDTLV_FIXLEN;
		out ->Fec.lspidTlv.baseTlv.flags.flags.uBit = 0;
		out ->Fec.lspidTlv.baseTlv.flags.flags.fBit = 0;
		out ->Fec.lspidTlv.baseTlv.flags.flags.type = MPLS_LSPID_TLVTYPE;
    }
    if(out ->Fec.TlvExists.flags.fecTlvExists == 1)
    {
    	/* out ->Fec.fecElArray[0].crlspEl.type = in -> ErlspFecElemType; */
    	
    	out ->Fec.fecElemNum = 1;
    	for(loop = 0; loop < out ->Fec.fecElemNum; loop++)
    	{
        	out ->Fec.fecElemTypes[loop] = in -> ErlspFecElemType;
        	out ->Fec.fecElArray[loop].crlspEl.type      = in -> ErlspFecElemType;
        	out ->Fec.fecElArray[loop].addressEl.address = 
        	             in -> FecTlv[loop].ipaddr&in -> FecTlv[loop].ipmask;
            out ->Fec.fecElArray[loop].addressEl.preLen = 
        	             masktoprelen(in -> FecTlv[loop].ipmask);
    	}
    }
	if(out ->Fec.TlvExists.flags.trafficTlvExists == 1)
	{
		out ->Fec.Traffic.baseTlv.length = MPLS_TRAFFICPARAMLENGTH * 6;
		out ->Fec.Traffic.baseTlv.flags.flags.uBit = 0;
		out ->Fec.Traffic.baseTlv.flags.flags.fBit = 0;
		out ->Fec.Traffic.baseTlv.flags.flags.type = MPLS_TRAFFIC_TLVTYPE;
	}
	/* get traffic para */
    if(in -> tlvExist.trafficTlvExists == 0)
    {
    	out ->Fec.Traffic.flags.mark = Switcher.MplsTraff[ 0 ].flag;
    	out ->Fec.Traffic.freq = Switcher.MplsTraff[ 0 ].freq; /*UNSPECIFIED */
    	out ->Fec.Traffic.res=0;
    	out ->Fec.Traffic.weight = Switcher.MplsTraff[ 0 ].weight;
    	out ->Fec.Traffic.pdr.pdr=(float)((unsigned long)(Switcher.MplsTraff[ 0 ].pdr)*48);
    	out ->Fec.Traffic.pbs.pbs=(float)((unsigned long)(Switcher.MplsTraff[ 0 ].pbs)*48);
    	out ->Fec.Traffic.cdr.cdr=(float)((unsigned long)(Switcher.MplsTraff[ 0 ].cdr)*48);
    	out ->Fec.Traffic.cbs.cbs=(float)((unsigned long)(Switcher.MplsTraff[ 0 ].cbs)*48);
    	out ->Fec.Traffic.ebs.ebs=(float)((unsigned long)(Switcher.MplsTraff[ 0 ].ebs)*48);
    }
    else
    {
    	out ->Fec.Traffic.flags.mark = in -> traffic.ErlspFlag;
    	out ->Fec.Traffic.freq = in -> traffic.ErlspFreq; /*UNSPECIFIED */
    	out ->Fec.Traffic.res=0;
    	out ->Fec.Traffic.weight = in -> traffic.ErlspWeight;
    	out ->Fec.Traffic.pdr.pdr=(float)((unsigned long)(in -> traffic.ErlspPdr)*48);
    	out ->Fec.Traffic.pbs.pbs=(float)((unsigned long)(in -> traffic.ErlspPbs)*48);
    	out ->Fec.Traffic.cdr.cdr=(float)((unsigned long)(in -> traffic.ErLspCdr)*48);
    	out ->Fec.Traffic.cbs.cbs=(float)((unsigned long)(in -> traffic.ErlspCbs)*48);
    	out ->Fec.Traffic.ebs.ebs=(float)((unsigned long)(in -> traffic.ErlspEbs)*48);
    }
    if(out ->Fec.TlvExists.flags.erTlvExists == 1)
    {
    	out ->Fec.erTlv.numberErHops = in -> ErlspNumberErHops;
    	out ->Fec.erTlv.baseTlv.length = out ->Fec.erTlv.numberErHops
    	                *(MPLS_ERHOP_IPV4_FIXLEN+4);
    	out ->Fec.erTlv.baseTlv.flags.flags.uBit = 0;
		out ->Fec.erTlv.baseTlv.flags.flags.fBit = 0;
		out ->Fec.erTlv.baseTlv.flags.flags.type = MPLS_ER_TLVTYPE;

        loop = 0;
        loop1 = 0;
        while(loop<in -> ErlspNumberErHops)
    	{
    		if(in -> ErAddress[loop1].addr==0)
    		{
    		    loop1++;
    		}
    		else
    	{
        	out ->Fec.erTlv.erHopTypes[loop] =
        	    	nodetypechanpro(in -> ErAddress[loop1].nodeType);
        	out ->Fec.erTlv.erHopArray[loop].erIpv4.address =
                        in -> ErAddress[loop1].addr;
        	out ->Fec.erTlv.erHopArray[loop].erIpv4.flags.flags.l =
                        in -> ErAddress[loop1].routeType;
        	out ->Fec.erTlv.erHopArray[loop].erIpv4.flags.flags.preLen=
                        in -> ErAddress[loop1].mask.addrLen;
        	out ->Fec.erTlv.erHopArray[loop].erIpv4.flags.flags.res = 0;
        	out ->Fec.erTlv.erHopArray[loop].erIpv4.baseTlv.length =
        	        MPLS_ERHOP_IPV4_FIXLEN;
            out ->Fec.erTlv.erHopArray[loop].erIpv4.baseTlv.flags.flags.uBit = 0;
            out ->Fec.erTlv.erHopArray[loop].erIpv4.baseTlv.flags.flags.fBit = 0;
        	out ->Fec.erTlv.erHopArray[loop].erIpv4.baseTlv.flags.flags.type =
        	          MPLS_ERHOP_IPV4_TLVTYPE;
        	    loop++;
        	    loop1++;
        	}
    	}
    }
    if(out ->Fec.TlvExists.flags.pinningTlvExists == 1)
    {
    	out ->Fec.pinningTlv.flags.flags.pBit = in -> ErlspPinFlag;
    	out ->Fec.pinningTlv.flags.flags.res = 0;
    	out ->Fec.pinningTlv.baseTlv.length = 4;
    	out ->Fec.pinningTlv.baseTlv.flags.flags.uBit = 0;
		out ->Fec.pinningTlv.baseTlv.flags.flags.fBit = 0;
		out ->Fec.pinningTlv.baseTlv.flags.flags.type = MPLS_PINNING_TLVTYPE;
    }
    if(out ->Fec.TlvExists.flags.recClassTlvExists == 1)
    {
    	out ->Fec.resClassTlv.rsCls = in -> ErlspRsCls;
    	out ->Fec.resClassTlv.baseTlv.length = 4;
    	out ->Fec.resClassTlv.baseTlv.flags.flags.uBit = 0;
		out ->Fec.resClassTlv.baseTlv.flags.flags.fBit = 0;
		out ->Fec.resClassTlv.baseTlv.flags.flags.type = MPLS_RESCLASS_TLVTYPE;
    }
    out ->Fec.preemptTlv.res = 0;
    out ->Fec.preemptTlv.setPrio = in -> preempt.ErlspSetPrio;
    out ->Fec.preemptTlv.holdPrio = in -> preempt.ErlspHoldPrio;
    out ->Fec.preemptTlv.baseTlv.length = MPLS_PREEMPTTLV_FIXLEN;
    out ->Fec.preemptTlv.baseTlv.flags.flags.uBit = 0;
	out ->Fec.preemptTlv.baseTlv.flags.flags.fBit = 0;
	out ->Fec.preemptTlv.baseTlv.flags.flags.type = MPLS_PREEMPT_TLVTYPE;
    out ->Fec.loadShare                   =  in ->loadbalance;
    out ->Fec.pathType                    =  in ->lspType;      /*  dynamic, explicit */
    out ->Fec.metric   =  in ->metric;
	loop = mplsQosFilterNoGetPtr(in -> delFilterNo,&((unsigned long *)qosstr));
    if(loop == MPLS_OAM_CMD_SUCCESS)
    {
        out ->Fec.qosfilterstr = *qosstr;
    }
    else
    {
        MPLS_MEMSET(&(out ->Fec.qosfilterstr), 0, sizeof(QosMulitFieldFilter_t));
    }
}
/***********************************************************************/
/* FUNCTION NAME  : crlsppro()	                                        */
/* DESCRIPTION:   : create or delete cr lsp to ldp                      */
/*  INPUT         : hoplspstr, opertype                  				*/
/*  OUTPUT        : void												*/
/*  AUTHOR/DATE   : shi.zhaohui/ 01.12.04                               */
/*  GLOBAL        : none												*/
/*  NOTE          :  ..                                                 */
/* History        : kong.yong weng.qing                                 */
/************************************************************************/
void    crlsppro(mplsErLspTable_t *in, unsigned char opertype)
{
    MPLS_MEMSET(&fecmsgstr, 0, sizeof(FecMsg));
    fecmsgstr.OperateType = opertype;
    crsetupvaluepro(&fecmsgstr, in);

    switch(opertype)
    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -