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

📄 ldptlv.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 4 页
字号:
                        void                * tempcb,
                        unsigned char       cbflag)
{
    mplsLdpLblAbortMsg_t    * 	lblAbortMsg;
    mplsLdpFecEntry         *   feclspcb;
    mplsLdpCrLsp            *   crlspcbb;
    mplsLdpUpCB             *   ldpupcb;
    mplsLdpLspCB            *   ldpdodcb;

    lblAbortMsg = (mplsLdpLblAbortMsg_t *)lblmessage;
    if(cbflag == LDP_HOP_LSP)
    {
        feclspcb = (mplsLdpFecEntry  *)lspcb;
        if(session -> labelAdvertisement == 0) /* DU */
        {
            ldpupcb = (mplsLdpUpCB  *)tempcb;
            ldpupcb -> msgid = lblAbortMsg -> baseMsg.msgId;
            ldpupcb -> upSessionIndex = session -> index;
        }
        else if(session -> labelAdvertisement == 1) /* DoD */
        {
            ldpdodcb = (mplsLdpLspCB  *)tempcb;
            ldpdodcb -> upMsgid = lblAbortMsg -> baseMsg.msgId;
            ldpdodcb -> upSessionIndex = session -> index;
        }
    }
    else
    {
        crlspcbb = (mplsLdpCrLsp *)lspcb;
        ldpdodcb = &(crlspcbb -> crlspCb);
        ldpdodcb -> upMsgid = lblAbortMsg -> baseMsg.msgId;
        ldpdodcb -> upSessionIndex = session -> index;
    }
}

/***********************************************************************/
/* FUNCTION NAME  : sndlblmsgtlvproc()
/* DESCRIPTION:   : send  lspcb to label message tlv process
/*  INPUT         : mplsLdpSession_t    * session,
                    void                * lspcb,
                    unsigned long               msgtype
                    unsigned char               cbflag
/*  OUTPUT        : void
/*  AUTHOR/DATE   : shi.zhaohui/ 02.06.19
/*  GLOBAL        : none
/* History        : update down msgtype when send msg 2003.1.16 
/************************************************************************/
/* only send : lblmessabe isn't null, need tlv process : lblmessage is null ;
   cbflag 1: mplsldpfecentry; 2: mplsldpcrlsp  */

void  sndlblmsgtlvproc(mplsLdpSession_t    * session,
                        void               * lspcb,
                        void               * tempcb,
                        unsigned long      msgtype,
                        unsigned char      cbflag)
{
    switch(msgtype)
    {
        case MPLS_LBLREQ_MSGTYPE :
        	if(session->labelAdvertisement == DOWNSTREAMONDEMAND)
		    {
		    	((mplsLdpLspCB *)tempcb)->msgType = msgtype;
		    }
             snd_lblreq_tlvpro( session, lspcb, tempcb, cbflag  );
             break;

        case MPLS_LBLMAP_MSGTYPE:
             snd_lblmap_tlvpro( session, lspcb, tempcb, cbflag );
             break;

        case MPLS_LBLREL_MSGTYPE:
        	if(session->labelAdvertisement == DOWNSTREAMONDEMAND)
		    {
		    	((mplsLdpLspCB *)tempcb)->msgType = msgtype;
		    }
             snd_lblrel_tlvpro( session, lspcb, tempcb, cbflag  );
             break;

        case MPLS_LBLWITH_MSGTYPE:
             snd_lblwith_tlvpro( session, lspcb, tempcb, cbflag  );
             break;

        case MPLS_LBLABORT_MSGTYPE:
        	if(session->labelAdvertisement == DOWNSTREAMONDEMAND)
		    {
		    	((mplsLdpLspCB *)tempcb)->msgType = msgtype;
		    }
             snd_lblabort_tlvpro( session, lspcb, tempcb, cbflag  );
             break;

        default :  break;
    }
}



/***********************************************************************/
/* FUNCTION NAME  : snd_lblreq_tlvpro()
/* DESCRIPTION:   : send  lspcb to label req message tlv process
/*  INPUT         : mplsLdpSession_t    * session,
                    void                * lblmessage,
                    void                * lspcb,
                    unsigned long               msgtype
                    unsigned char               cbflag
/*  OUTPUT        : void
/*  AUTHOR/DATE   : shi.zhaohui/ 02.06.19
/*  GLOBAL        : none
/* History        :
/************************************************************************/
void  snd_lblreq_tlvpro( mplsLdpSession_t   * session,
                        void                * lspcb,
                        void                * tempcb,
                        unsigned char       cbflag)
{
    mplsLdpLblReqMsg_t		lblReqMsg;
    mplsLdpFecEntry         *feclspcb;
    mplsLdpCrLsp            *crlspcbb;
    mplsLdpDownCB           *ldpdowncb;
    mplsLdpAttr             *ldpattr;
    mplsLdpLspCB            *ldpdodcb;
    unsigned char           routetype;
    lblmsgTlvExists         tlvexists;


    MPLS_MEMSET(&lblReqMsg, 0, sizeof(mplsLdpLblReqMsg_t));
    lblReqMsg.baseMsg.flags.flags.msgType = MPLS_LBLREQ_MSGTYPE;
    lblReqMsg.baseMsg.flags.flags.uBit = 0;
    lblReqMsg.baseMsg.msgId   = messageId[LBLREQ_M];
    AddMsgId(LBLREQ_M);
    lblReqMsg.fecTlvExists = 1;

    if(cbflag == LDP_HOP_LSP)
    {
        feclspcb = (mplsLdpFecEntry *)lspcb;
        fectlvtolblmsg(feclspcb -> mplsLdpFecType, feclspcb ->fec_key.mplsLdpFecAddrLen,
                       feclspcb ->fec_key.mplsFecAddr, &(lblReqMsg.fecTlv));
        if(session -> labelAdvertisement == 0) /* DU */
        {
            ldpdowncb = (mplsLdpDownCB  *)tempcb;
            ldpdowncb -> msgid = lblReqMsg.baseMsg.msgId;
             /* add loop detection */
            if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
            {
                routetype = MPLS_NODE_INGRESS;
                cbbtolblreqtlvloopproc(MPLS_NULL, &lblReqMsg, routetype);
            }
        }
        else if(session -> labelAdvertisement == 1) /* DoD */
        {
            ldpdodcb = (mplsLdpLspCB *)tempcb;
            ldpdodcb -> downMsgid = lblReqMsg.baseMsg.msgId;
            /* add loop detection */
            if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
            {
                if(ldpdodcb -> nodeType == MPLS_NODE_INTERM_INGRESS)
                {
                    routetype = MPLS_NODE_INGRESS;
                }
                else
                {
                    routetype = ldpdodcb -> nodeType;
                }
                cbbtolblreqtlvloopproc(&(ldpdodcb->pAttr), &lblReqMsg, routetype);
            }
        }
    }
    else    /* cr lsp */
    {
        crlspcbb = (mplsLdpCrLsp *)lspcb;
        ldpdodcb = &(crlspcbb -> crlspCb);
        fectlvtolblmsg(crlspcbb -> mplsLdpFecType, crlspcbb -> mplsLdpFecAddrLen,
                       crlspcbb -> mplsFecAddr, &(lblReqMsg.fecTlv));
        /*********************************************************************/
        /* label request must have lspid tlv
         * wengqing add 
        */
        /*********************************************************************/
        lblReqMsg.lspidTlv.actFlag.flag.res = 0;
    	lblReqMsg.lspidTlv.actFlag.flag.ActFlag = MPLS_CRLSP_ACTION_INIT;
    	lblReqMsg.lspidTlv.baseTlv.length = MPLS_LSPIDTLV_FIXLEN;
		lblReqMsg.lspidTlv.baseTlv.flags.flags.uBit = 0;
		lblReqMsg.lspidTlv.baseTlv.flags.flags.fBit = 0;
		lblReqMsg.lspidTlv.baseTlv.flags.flags.type = MPLS_LSPID_TLVTYPE;
		lblReqMsg.lspidTlvExists = 1;
        /*********************************************************************/
        /* wengqing add end
        */
        /*********************************************************************/
        lblReqMsg.lspidTlv.routerId = crlspcbb ->crfec_key.ingressid ;
        lblReqMsg.lspidTlv.localCrlspId = crlspcbb ->crfec_key.locallspid;
        ldpdodcb -> downMsgid = lblReqMsg.baseMsg.msgId;
        /* loop detection */
        if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
        {
            routetype = ldpdodcb -> nodeType;
            cbbtolblreqtlvloopproc(&(ldpdodcb->pAttr), &lblReqMsg, routetype);
        }
    	tlvexists.mark = crlspcbb -> tlvExists;
    	if(tlvexists.flags.erTlvExists == 1)
        {
            lblReqMsg.erTlvExists = 1;
            MPLS_MEMCPY(&(lblReqMsg.erTlv),&(crlspcbb -> erTlv),sizeof(mplsLdpErTlv_t));
        }
        if(tlvexists.flags.trafficTlvExists == 1)
        {
            lblReqMsg.trafficTlvExists = 1;
            MPLS_MEMCPY(&(lblReqMsg.trafficTlv),&(crlspcbb -> trafficTlv),
            		sizeof(mplsLdpTrafficTlv_t)) ;
        }
        if(tlvexists.flags.pinningTlvExists == 1)
        {
            lblReqMsg.pinningTlvExists = 1;
            MPLS_MEMCPY(&(lblReqMsg.pinningTlv),&(crlspcbb -> pinningTlv),
            		sizeof(mplsLdpPinningTlv_t)) ;
        }
        if(tlvexists.flags.recClassTlvExists == 1)
        {
            lblReqMsg.recClassTlvExists = 1;
            MPLS_MEMCPY(&(lblReqMsg.resClassTlv),&(crlspcbb -> resClassTlv),
            		sizeof(mplsLdpResClsTlv_t));
        }
        if(tlvexists.flags.preemptTlvExists == 1)
        {
            lblReqMsg.preemptTlvExists = 1;
            MPLS_MEMCPY(&(lblReqMsg.preemptTlv),&(crlspcbb -> preemptTlv),
            	sizeof(mplsLdpPreemptTlv_t));
        }
    }
    #if 0
    SendTcpMsg(session,MPLS_LBLREQ_MSGTYPE,&lblReqMsg);
    #endif
    Func_lblmsg_wait_proce(session,MPLS_LBLREQ_MSGTYPE,&lblReqMsg);
}


/***********************************************************************/
/* FUNCTION NAME  : snd_lblmap_tlvpro()
/* DESCRIPTION:   : send  lspcb to label map message tlv process
/*  INPUT         : mplsLdpSession_t    * session,
                    void                * lblmessage,
                    void                * lspcb,
                    unsigned char               cbflag
/*  OUTPUT        : void
/*  AUTHOR/DATE   : shi.zhaohui/ 02.06.19
/*  GLOBAL        : none
/* History        :
/************************************************************************/
void  snd_lblmap_tlvpro(mplsLdpSession_t   * session,
                        void               * lspcb,
                        void               * tempcb,
                        unsigned char      cbflag)
{
    mplsLdpLblMapMsg_t 	    lblMapMsg;
    mplsLdpFecEntry         *feclspcb;
    mplsLdpCrLsp            *crlspcbb;
    mplsLdpDownCB           *ldpdowncb;
    mplsLdpUpCB             *ldpupcb;
    mplsLdpAttr             *ldpattr;
    mplsLdpLspCB            *ldpdodcb;
    unsigned char           routetype;
    mplsLdpSession_t        *downsession = MPLS_NULL;


    MPLS_MEMSET(&lblMapMsg, 0, sizeof(mplsLdpLblMapMsg_t));
    lblMapMsg.baseMsg.msgId = messageId[LBLMAP_M];
    lblMapMsg.baseMsg.flags.flags.uBit = 0;
    lblMapMsg.baseMsg.flags.flags.msgType = MPLS_LBLMAP_MSGTYPE;
    AddMsgId(LBLMAP_M);
    lblMapMsg.fecTlvExists = 1;
    if(cbflag == LDP_HOP_LSP)
    {
        feclspcb = (mplsLdpFecEntry *)lspcb;
        fectlvtolblmsg(feclspcb -> mplsLdpFecType, feclspcb ->fec_key.mplsLdpFecAddrLen,
                          feclspcb ->fec_key.mplsFecAddr, &(lblMapMsg.fecTlv));
        if(session -> labelAdvertisement == 0) /* DU */
        {
            ldpupcb = (mplsLdpUpCB *)tempcb;
            lblMapMsg.genLblTlvExists = 1;
            genlbltolblmsg(feclspcb->localGenLabel, &(lblMapMsg.genLblTlv));
            if(ldpupcb->state == RESPONSE_AWAITED)
            {
                lblMapMsg.lblMsgIdTlvExists = 1;
                reqmsgidtolblmsg(ldpupcb->msgid, &(lblMapMsg.lblMsgIdTlv));
            }
            ldpupcb -> msgid = lblMapMsg.baseMsg.msgId;
            /* loop detection process */
            if(session ->loopDetectionForPV == LOOPDETECT_HOPANDPV)
            {
            	MPLS_NEXTHOP_SESSION_SEARCH(feclspcb->nexthopAddr,downsession);
            	if(downsession != MPLS_NULL)
            	{
                	MPLS_DOWNCB_SEARCH(feclspcb,downsession,ldpdowncb);
                	if(ldpdowncb != MPLS_NULL)
                	{
                    	sndfeclsp_mapmsg_looptlvproc_du(&(ldpdowncb->pAttr),&lblMapMsg,
                                             feclspcb -> nodeType);
                	}
                	else
                	{
                    	printf("no find down cb !!!!  ");
                    	sndfeclsp_mapmsg_looptlvproc_du(MPLS_NULL,&lblMapMsg,
                                             feclspcb -> nodeType);
                	}
	            }
    	        else
            	{
        	        printf(" no find down session !!!!! ");
            	    sndfeclsp_mapmsg_looptlvproc_du(MPLS_NULL,&lblMapMsg,
                                             feclspcb -> nodeType);
            	}
            }	
        }
        else if(session -> labelAdvertisement == 1) /* DoD */
        {
            ldpdodcb = (mplsLdpLspCB *)tempcb;
            lblMapMsg.atmLblTlvExists = 1;
            atmlbltolblmsg(ldpdodcb -> upAtmLabel.vpi,
                           ldpdodcb -> upAtmLabel.vci,
                           &(lblMapMsg.atmLblTlv));
			/*************************************************************/
			/*	for dod, must add request msgid in mapping 
			*/
			/*************************************************************/
            lblMapMsg.lblMsgIdTlvExists = 1;
            reqmsgidtolblmsg(ldpdodcb->upMsgid, &(lblMapMsg.lblMsgIdTlv));
            /* loop detection  */
            if(session ->loopDetectionForPV == LOOPDETECT_HOPANDPV)
            {
            	if(ldpdodcb ->nodeType == MPLS_NODE_INTERM_EGRESS)
            	{
                	routetype = MPLS_NODE_EGRESS;
            	}
            	else
            	{
                	routetype = ldpdodcb ->nodeType;
            	}
            	sndfeclsp_mapmsg_looptlvproc_dod(&(ldpdodcb->pAttr), &lblMapMsg, routetype);
            }	
            ldpdodcb -> upMsgid = lblMapMsg.baseMsg.msgId;
        }
    #if 0
        SendTcpMsg(session,MPLS_LBLMAP_MSGTYPE,&lblMapMsg);
    #endif
    Func_lblmsg_wait_proce(session,MPLS_LBLMAP_MSGTYPE,&lblMapMsg);
    }
    else  /* cr lsp */
    {
        crlspcbb = (mplsLdpCrLsp *)lspcb;
        ldpdodcb = &(crlspcbb -> crlspCb);
        fectlvtolblmsg(crlspcbb -> mplsLdpFecType, crlspcbb -> mplsLdpFecAddrLen,
                       crlspcbb -> mplsFecAddr, &(lblMapMsg.fecTlv));
        /* crlsp for performance and dynamic crlsp building, we should have lspid tlv */
        lblMapMsg.lspidTlvExists = 1;
        setmsglspid(crlspcbb,&(lblMapMsg.lspidTlv));
        if(session -> labelAdvertisement == 0) /* DU */
        {
            lblMapMsg.genLblTlvExists = 1;
            genlbltolblmsg(ldpdodcb -> upGenLabel, &(lblMapMsg.genLblTlv));
        }
        else if(session -> labelAdvertisement == 1) /* DoD */
        {
            lblMapMsg.atmLblTlvExists = 1;
            atmlbltolblmsg(ldpdodcb -> upAtmLabel.vpi,
                           ldpdodcb -> upAtmLabel.vci,
                           &(lblMapMsg.atmLblTlv));
        }
        lblMapMsg.lblMsgIdTlvExists = 1;
        reqmsgidtolblmsg(ldpdodcb->upMsgid, &(lblMapMsg.lblMsgIdTlv));

⌨️ 快捷键说明

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