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

📄 ldptlv.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 4 页
字号:
/********************************************************************/
/*	Product Name:	mpls pack1.0                                  	*/
/*	Module  Name:	protocol   										*/
/*	File    Name:   ldptlv.c    						        	*/
/*	Author  Name:   shi.zhaohui               						*/
/*	Creat   Date:	06/21/2002										*/
/*	Version		:	1.0                                         	*/
/*	Function    :	ldp label message tlv process                   */
/*  History     :                                                   */
/* 2002.12.3 Huyonghong  crlsp for performance and dynamic crlsp    */
/*             building, we should have lspid tlv                    */
/* 2003.3.4 huyonghong modify path vector memmory manage */
/* 2003-12-10 lixia mod for debug mpls */
/********************************************************************/
#include "ldpvars.h"

/***********************************************************************/
/* FUNCTION NAME  : sndnotifymsgproc()
/* DESCRIPTION:   : send notify message process
/*  INPUT         : mplsLdpSession_t  * session,
                    unsigned long       statuscode,
                    unsigned long       msgid,
                    unsigned long       msgtype
/*  OUTPUT        : void
/*  AUTHOR/DATE   : shi.zhaohui/ 02.06.19
/*  GLOBAL        : none
/* History        :
/************************************************************************/
void  sndnotifymsgproc(mplsLdpSession_t  * session,  unsigned long  statuscode,
                       unsigned long msgid,  unsigned long msgtype)
{

	mplsLdpNotifMsg_t       	notifMsg;

	MPLS_MEMSET(&notifMsg, 0, sizeof(mplsLdpNotifMsg_t));

	/* conform error Notify message */
    BuildNotifMsg(&notifMsg,statuscode,msgid,msgtype);
    if(statuscode != SHUT_DOWN)
    {
        processldpstats(statuscode, session);
    }
    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== send notify msg to %x,status code = %x ====\n",session->peerIpaddr,statuscode);
    MPLS_ERR_LOG("==== notify msg,status code = %d ====",statuscode);
    #if 0
    SendTcpMsg(session,MPLS_NOT_MSGTYPE,&notifMsg);
    #endif
    Func_lblmsg_wait_proce(session,MPLS_NOT_MSGTYPE,&notifMsg);
    
	return ;
}

/* add by hyh 02-8-13 */
/* when receive abort msg,should respond notification msg with msg id tlv */
void mpls_send_abnot(mplsLdpSession_t  * session,  unsigned long  statuscode,
                       unsigned long msgid,  unsigned long msgtype,unsigned long tlvMsgid)
{
	mplsLdpNotifMsg_t       	notifMsg;

	MPLS_MEMSET(&notifMsg, 0, sizeof(mplsLdpNotifMsg_t));

	/* conform error Notify message */
    BuildNotifMsg(&notifMsg,statuscode,msgid,msgtype);

    notifMsg.baseMsg.msgId = messageId[NOT_M];
    AddMsgId(NOT_M);

    notifMsg.status.flags.flags.error      = 0;
    notifMsg.baseMsg.flags.flags.msgType   = MPLS_NOT_MSGTYPE;
	notifMsg.baseMsg.flags.flags.uBit      = 0;
	notifMsg.baseMsg.msgLength			   = 0;

    notifMsg.statusTlvExists                   = 1;
    notifMsg.status.baseTlv.flags.flags.uBit   = 0;
	notifMsg.status.baseTlv.flags.flags.fBit   = 1;
	notifMsg.status.baseTlv.flags.flags.type   = MPLS_NOT_ST_TLVTYPE;
	notifMsg.status.baseTlv.length             = MPLS_STATUSFIXLEN;
    notifMsg.status.flags.flags.forward        = 1;
    notifMsg.status.flags.flags.status         = statuscode;
    notifMsg.status.msgId      =  msgid;
    notifMsg.status.msgType    =  msgtype;

    notifMsg.lblMsgIdTlvExists		   = 1;
    notifMsg.lblMsgIdTlv.baseTlv.flags.flags.uBit	= 0;
    notifMsg.lblMsgIdTlv.baseTlv.flags.flags.fBit 	= 0;
    notifMsg.lblMsgIdTlv.baseTlv.flags.flags.type	= MPLS_REQMSGID_TLVTYPE;
    notifMsg.lblMsgIdTlv.baseTlv.length				= MPLS_MSGIDFIXLEN;
    notifMsg.lblMsgIdTlv.msgId         = tlvMsgid;
       
    notifMsg.exStatusTlvExists         = 0;
    notifMsg.retPduTlvExists           = 0;
    notifMsg.retMsgTlvExists           = 0;
    notifMsg.lspidTlvExists            = 0;
    notifMsg.unknownNo					= 0;

    if(statuscode != SHUT_DOWN)
    {
        processldpstats(statuscode, session);
    }
    
    MPLS_ERR_LOG("==== notify msg,status code = %d ====",statuscode);
    #if 0
    SendTcpMsg(session,MPLS_NOT_MSGTYPE,&notifMsg);
	#endif
	Func_lblmsg_wait_proce(session,MPLS_NOT_MSGTYPE,&notifMsg);
	return ;

}


/***********************************************************************/
/* FUNCTION NAME  : reclblmsgtlvproc()
/* DESCRIPTION:   : receive label message tlv pro to lspcb
/*  INPUT         : mplsLdpSession_t    * session,
                    void                * lblmessage,
                    void                * lspcb,
                    unsigned long               msgtype
/*  OUTPUT        : void
/*  AUTHOR/DATE   : shi.zhaohui/ 02.06.19
/*  GLOBAL        : none
/* History        :
/************************************************************************/
/* cbflag 1: mplsldpfecentry; 2: mplsldpcrlsp  */

void  reclblmsgtlvproc(mplsLdpSession_t    * session,
                       void                * lblmessage,
                       void                * lspcb,
                       void                * tempcb,
                       unsigned long       msgtype,
                       unsigned char       cbflag)
{
    switch(msgtype)
    {
        case MPLS_LBLREQ_MSGTYPE :
             rec_lblreq_tlvpro( session, lblmessage, lspcb, tempcb, cbflag );
             break;

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

        case MPLS_LBLREL_MSGTYPE:
             rec_lblrel_tlvpro( session, lblmessage, lspcb, tempcb, cbflag );
             break;

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

        case MPLS_LBLABORT_MSGTYPE:
             rec_lblabort_tlvpro( session, lblmessage, lspcb, tempcb, cbflag );
             break;

        default :  break;
    }

}


/***********************************************************************/
/* FUNCTION NAME  : rec_lblreq_tlvpro()
/* DESCRIPTION:   : receive label req message tlv pro to lspcb
/*  INPUT         : mplsLdpSession_t    * session,
                    void                * lblmessage,
                    void                * lspcb,
                    unsigned char               cbflag
/*  OUTPUT        : void
/*  AUTHOR/DATE   : shi.zhaohui/ 02.06.19
/*  GLOBAL        : none
/* History        :
/************************************************************************/
void   rec_lblreq_tlvpro(mplsLdpSession_t   * session,
                        void                * lblmessage,
                        void                * lspcb,
                        void                * tempcb,
                        unsigned char       cbflag)
{
    mplsLdpLblReqMsg_t      *lblReqMsg;
    mplsLdpFecEntry         *feclspcb;
    mplsLdpCrLsp            *crlspcbb;
    mplsLdpUpCB             *ldpupcb;
    mplsLdpLspCB            *ldpdodcb;
    lblmsgTlvExists         tlvexists;

    lblReqMsg  = (mplsLdpLblReqMsg_t *)lblmessage;
    if(cbflag == LDP_HOP_LSP)
    {
        feclspcb = (mplsLdpFecEntry *)lspcb;
//        lblreqtofectypemsg(lblReqMsg, feclspcb, LDP_HOP_LSP);
        if(session -> labelAdvertisement == 0) /* DU */
        {
            ldpupcb = (mplsLdpUpCB  *)tempcb;
            ldpupcb -> msgid = lblReqMsg->baseMsg.msgId;
            ldpupcb -> upSessionIndex = session -> index;
            if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
            {
                lblreqtocbbloopproc(lblReqMsg, &(ldpupcb->pAttr));
            }
        }
        else if(session -> labelAdvertisement == 1) /* DoD */
        {
            ldpdodcb = (mplsLdpLspCB *)tempcb;
            ldpdodcb -> upMsgid = lblReqMsg->baseMsg.msgId;
            ldpdodcb -> upSessionIndex = session -> index;
            if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
            {
                lblreqtocbbloopproc(lblReqMsg, &(ldpdodcb->pAttr));
            }
        }
    }
    else /*  cr lsp */
    {
        crlspcbb = (mplsLdpCrLsp *)lspcb;
//        lblreqtofectypemsg(lblReqMsg, feclspcb, LDP_CR_LSP);
        crlspcbb -> crfec_key.ingressid = lblReqMsg -> lspidTlv.routerId;
        crlspcbb -> crfec_key.locallspid = lblReqMsg -> lspidTlv.localCrlspId;
        crlspcbb -> crlspCb.upSessionIndex = session -> index;
        crlspcbb -> crlspCb.upMsgid = lblReqMsg->baseMsg.msgId;
        ldpdodcb = &(crlspcbb -> crlspCb);
        if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
        {
            lblreqtocbbloopproc(lblReqMsg, &(ldpdodcb->pAttr));
        }
        tlvexists.flags.fecTlvExists = lblReqMsg -> fecTlvExists;
        tlvexists.flags.hopCountTlvExists = lblReqMsg -> hopCountTlvExists;
        tlvexists.flags.pathVecTlvExists = lblReqMsg -> pathVecTlvExists;
        tlvexists.flags.lspidTlvExists = lblReqMsg -> lspidTlvExists;
        tlvexists.flags.erTlvExists = lblReqMsg -> erTlvExists;
        tlvexists.flags.trafficTlvExists = lblReqMsg -> trafficTlvExists;
        tlvexists.flags.pinningTlvExists = lblReqMsg -> pinningTlvExists;
        tlvexists.flags.recClassTlvExists = lblReqMsg -> recClassTlvExists;
        tlvexists.flags.preemptTlvExists = lblReqMsg -> preemptTlvExists;
        crlspcbb -> tlvExists = tlvexists.mark;
        if(lblReqMsg->erTlvExists == 1)
        {
            MPLS_MEMCPY(&(crlspcbb -> erTlv),&(lblReqMsg->erTlv),sizeof(mplsLdpErTlv_t));
        }
        else
        {
            MPLS_MEMSET(&(crlspcbb -> erTlv), 0, sizeof(mplsLdpErTlv_t));
        }
        if(lblReqMsg->trafficTlvExists == 1)
        {
            MPLS_MEMCPY(&(crlspcbb -> trafficTlv),&(lblReqMsg->trafficTlv), 
            		sizeof(mplsLdpTrafficTlv_t));
        }
        else
        {
            MPLS_MEMSET(&(crlspcbb -> trafficTlv), 0, sizeof(mplsLdpTrafficTlv_t));
        }
        if(lblReqMsg->pinningTlvExists == 1)
        {
            MPLS_MEMCPY(&(crlspcbb -> pinningTlv),&(lblReqMsg->pinningTlv),
            		sizeof(mplsLdpPinningTlv_t));
        }
        else
        {
            MPLS_MEMSET(&(crlspcbb -> pinningTlv), 0, sizeof(mplsLdpPinningTlv_t));
        }
        if(lblReqMsg->recClassTlvExists == 1)
        {
            MPLS_MEMCPY(&(crlspcbb -> resClassTlv),&(lblReqMsg->resClassTlv),
            		sizeof(mplsLdpResClsTlv_t));
        }
        else
        {
            MPLS_MEMSET(&(crlspcbb -> resClassTlv), 0, sizeof(mplsLdpResClsTlv_t));
        }
        if(lblReqMsg->preemptTlvExists == 1)
        {
            MPLS_MEMCPY(&(crlspcbb -> preemptTlv),&(lblReqMsg->preemptTlv),
            		sizeof(mplsLdpPreemptTlv_t));
        }
        else
        {
            MPLS_MEMSET(&(crlspcbb -> preemptTlv), 0, sizeof(mplsLdpPreemptTlv_t));
        }
    }
}



/***********************************************************************/
/* FUNCTION NAME  : rec_lblmap_tlvpro()
/* DESCRIPTION:   : receive label map message tlv pro to lspcb
/*  INPUT         : mplsLdpSession_t    * session,
                    void                * lblmessage,
                    void                * lspcb,
                    unsigned char               cbflag
/*  OUTPUT        : void
/*  AUTHOR/DATE   : shi.zhaohui/ 02.06.19
/*  GLOBAL        : none
/* History        :
/************************************************************************/
void rec_lblmap_tlvpro(mplsLdpSession_t   * session,
                        void              * lblmessage,
                        void              * lspcb,
                        void              * tempcb,
                        unsigned char     cbflag)
{
    mplsLdpLblMapMsg_t 	    *lblMapMsg;
    mplsLdpFecEntry         *feclspcb;
    mplsLdpCrLsp            *crlspcbb;
    mplsLdpDownCB           *ldpdowncb;
    mplsLdpAttr             *ldpattr;
    mplsLdpLspCB            *ldpdodcb;
    unsigned char           attrchan;
    mplsLdpUpCB             *searchupcb;
    mplsLdpSession_t        *session1 = MPLS_NULL;
	MIB_LDP_SESSION_ACK     sesAck1;
	ldpMibSessionIndexReq_t sesIndex_s;
    lblmsgTlvExists         tlvexists;
    /* update down msgtype when receive mapping 2003.1.16 */
	if(session->labelAdvertisement == DOWNSTREAMONDEMAND)
    {
    	((mplsLdpLspCB *)tempcb)->msgType = MPLS_LBLMAP_MSGTYPE;
    }
    MPLS_MEMSET(&sesIndex_s, 0, sizeof(ldpMibSessionIndexReq_t));
    /* no need fec tlv process  */
    lblMapMsg  = &(ldp_snd_msg.lblMapMsg);
    MPLS_MEMCPY(lblMapMsg,lblmessage,sizeof(mplsLdpLblMapMsg_t));
    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 */
        {
            ldpdowncb = (mplsLdpDownCB  *)tempcb;
            ldpdowncb -> msgid = lblMapMsg -> baseMsg.msgId;
            ldpdowncb -> downSessionIndex = session -> index;
            if(lblMapMsg -> genLblTlvExists == 1)
            {
                ldpdowncb -> downGenLabel = lblMapMsg -> genLblTlv.label;
            }
            else
            {
               /*  send notify message     */
               sndnotifymsgproc(session, NOLBLRESRC, lblMapMsg -> baseMsg.msgId,
                                MPLS_LBLMAP_MSGTYPE);
               #ifdef DEBUG_LDP
		            printf("==rec feclsp mapping message, encode genlabel error !!! ==");
	           #endif
	           return;
            }
            if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
            {
                attrchan = recfeclsp_mapmsg_looptlvproc_du(lblMapMsg,&(ldpdowncb->pAttr),
                                                ldpdowncb -> state);
                if(attrchan == 1 && session->index == feclspcb->nexthopSessionIndex) /* attr change, send mapping message */
                {
                	searchupcb = MPLS_NULL;
                    MPLS_WALK_UP_BEGIN(feclspcb,searchupcb,t_upCb);
                    if(searchupcb != MPLS_NULL)
                    {
                    	if(session->index != searchupcb -> upSessionIndex)
                    	{
	                        sesIndex_s.sessionIndex   = searchupcb -> upSessionIndex;
	                        sesIndex_s.indexFlag               = 1;
	                        session1 = (mplsLdpSession_t *)MibSession(&sesIndex_s, LDP_SEARCH);
	                        if (session1 != MPLS_NULL)
	                        {
                            genlbltolblmsg(feclspcb->localGenLabel, &(lblMapMsg->genLblTlv));
	                            #if 0 
                            SendTcpMsg(session1,MPLS_LBLMAP_MSGTYPE,&lblMapMsg);
                            #endif
                            Func_lblmsg_wait_proce(session1,MPLS_LBLMAP_MSGTYPE,lblMapMsg);
	                        }

⌨️ 快捷键说明

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