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

📄 ldpsess.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:

/*****************************************************************************/
/*file:     ldpsess.c                                                        */
/*date:     2001.08.13                                                       */
/*Author:   weng.qing                                                        */
/*Modify:   hu.yonghong  2002-7-6                                            */
/*function: mpls ldp process session state machine                           */
/* 2002.11.23 Huyonghong when delete session directly, check helloarray, if exist, delete it */
/* 2003-7-8 szh mod 增加对maxvpi特殊值65535的处理
/* szh mod 2003-10-20 LDP向A041发送的消息改成函数调用session进行了相应改进 */
/* 2003-12-10 lixia mod for debug mpls   */
/* 2004-9-17 lixia mod checkSessionHello,procTcpTimeOut_RelAwait for delPeerTable*/
/*****************************************************************************/

#include "ldpvars.h"


extern UCHAR	A041TcpipOn;
void procRelMsgAck( mplsLdpSession_t * session );
/******************************************************************************/
/*function:     FuncSendLost                                                */
/*Author:       weng.qing                                                     */
/*decription:                                                                 */
/*              check label range intersect                                   */
/*              set to session                                                */
/*              if fail return LDP_FALSE                                      */
/*              else return LDP_TRUE                                          */
/******************************************************************************/
void FuncSendLost(mplsLdpSession_t * session)
{
	SessionDown(session);
 	return;
}

void sessTimeout(mplsLdpSession_t * session)
{
	SessionFSM(session,TIMEOUT,NULL);
	return;
}

/************************************************************************/
/* FUNCTION NAME  : mplsLoopDetectEnableGet()                           */         
/* DESCRIPTION:   : get mpls loop detection enable of the interface     */         
/*  INPUT         : ifIndex: interface index                       	    */
/*  OUTPUT        : loop detection data of the interface				*/								
/*  AUTHOR/DATE   : sun baoping 2002-1-16                               */
/************************************************************************/
loopDetection_t  mplsLoopDetectEnableGet(ushort  ifIndex)
{
    ushort             num;
    loopDetection_t    loopdetection;
    
    loopdetection.loopDection = LOOPDETECT_NONE;
    loopdetection.pvLimit = 0;
    loopdetection.hcLimit = 0;
       
    for(num=0; num<allEntity.num; num++)
    {
        if(ifIndex == allEntity.entity[num].ifArray)
        {    
        	loopdetection.loopDection =  allEntity.entity[num].loopDetectionCapable;
        	loopdetection.pvLimit = allEntity.entity[num].pathvectorlimit;
            loopdetection.hcLimit = allEntity.entity[num].hopcountlimit;
        }
    }
    
    return loopdetection;  /* for safe */
}


/******************************************************************************/
/*function:     IntersecLblrng                                                */
/*Author:       weng.qing                                                     */
/*decription:                                                                 */
/*              check label range intersect                                   */
/*              set to session                                                */
/*              if fail return LDP_FALSE                                      */
/*              else return LDP_TRUE                                          */
/******************************************************************************/
/*      计算label range的交叉范围,放入session中             */
short     IntersecLblrng
(mplsLdpSession_t  * session,  mplsLdpInitMsg_t  * initMsg)
{
    mplsLdpAtmLblRng_t  lblRng1, lblRng2;
    unsigned long     minvpi1,minvci1,maxvpi1,maxvci1,minvpi2,minvci2,\
               maxvpi2,maxvci2,minvpi,minvci,maxvpi,maxvci;
    unsigned short     ii,nn = 0xffff;
    unsigned char      len;
    
   	
   	for (ii=0; ii<allInterface.num; ii++)
        if (allInterface.interface[ii].ifIndex == session->ifIndex)
        {
            nn = ii;
            break;
        }
    if (nn == 0xffff)  
    {
        printf("in IntersecLblrng,can not find interface %d\n",session->ifIndex);
        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_SESSION,"in IntersecLblrng,can not find interface %d\n",session->ifIndex);        
        return LDP_FALSE;
    }
    /*  65535是一个特殊值,表示svccvpi没有配置 szh 2003-7-8 */
    if(allInterface.interface[nn].conflblRngList.maxvpi == 65535)
    {
        printf("in IntersecLblrng,maxvpi is 65535\n");
        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_SESSION,"in IntersecLblrng,maxvpi is 65535\n");        
        return LDP_FALSE;
    }    
    memcpy(&lblRng1,&(allInterface.interface[nn].conflblRngList),\
                sizeof(mplsLdpAtmLblRng_t));
    minvpi1     = lblRng1.flags.flags.minVpi;
    minvci1     = lblRng1.flags.flags.minVci;
    maxvpi1     = lblRng1.flags.flags.maxVpi;
    maxvci1     = lblRng1.flags.flags.maxVci;
    len         = 0;
    
    for (ii = 0; ii < MPLS_ATMLBLMAXLEN; ii++)
    {
        memcpy(&lblRng2,&(initMsg->asp.lblRngList[ii]),\
                sizeof(mplsLdpAtmLblRng_t));
        minvpi2     = lblRng2.flags.flags.minVpi;
        minvci2     = lblRng2.flags.flags.minVci;
        maxvpi2     = lblRng2.flags.flags.maxVpi;
        maxvci2     = lblRng2.flags.flags.maxVci;
        
        if ((maxvpi2==0)&&(minvpi2==0)&&(maxvci2==0)&&(minvci2==0))
        	continue; 
        
        minvpi = minvpi1 <= minvpi2 ? minvpi2 : minvpi1;	/* big in min  */
        maxvpi = maxvpi1 >= maxvpi2 ? maxvpi2 : maxvpi1;	/* small in max */
        minvci = minvci1 <= minvci2 ? minvci2 : minvci1;	/* big in min  */
        maxvci = maxvci1 >= maxvci2 ? maxvci2 : maxvci1;	/* small in max */
        
        if(( minvpi > maxvpi ) ||( minvci > maxvci )||( minvci < 32 ))
        {
            continue;
        }
        else
        {
            session->LdpLblRng.atmlblrnglist[len].flags.flags.minVpi   = minvpi;
            session->LdpLblRng.atmlblrnglist[len].flags.flags.maxVpi   = maxvpi;
            session->LdpLblRng.atmlblrnglist[len].flags.flags.res1     = 0;
            session->LdpLblRng.atmlblrnglist[len].flags.flags.minVci   = minvci;
            session->LdpLblRng.atmlblrnglist[len].flags.flags.maxVci   = maxvci;
            session->LdpLblRng.atmlblrnglist[len].flags.flags.res2     = 0;
            len++;
        }
    }
     
    if (len == 0)   
    	return  LDP_FALSE;
    else    
    {
        session->lblRngNum  = len;
        return  LDP_TRUE;
    }
    
}

/****************   处理SESSION的TCP重连尝试定时器   ****************/
void ProcSessTcpTimer(mplsLdpSession_t * session)
{
    SessionFSM(session,TCPTIMEOUT,NULL);
	return;
}


/******************************************************************************/
/*function:     SendTcpRel                                                    */
/*Author:       weng.qing                                                     */
/*decription:                                                                 */
/*              Send to PP TCP Release Request,                               */
/*              Transit Session state to TCP_RELEASE_AWAITED,                 */
/*              Transit Session subState to RELMSGACK,                        */
/*              set Release Message ACK timer, time is 5 seconds              */
/******************************************************************************/

void SendTcpRel(mplsLdpSession_t * session)
{
	TCP_CONNECT_MSG		tcpRelMsg;
	
	tcpRelMsg.LocalIpaddr  = session->localIpaddr;
	tcpRelMsg.PeerIpaddr   = session->peerIpaddr;
	tcpRelMsg.LocalPort    = session->LocalPort;
	tcpRelMsg.PeerPort     = session->PeerPort;
/*	MPLS_PSEND(TCP_RELEASE_REQ,&tcpRelMsg,sizeof(TCP_CONNECT_MSG),udptcpPid);   */
    if( A041TcpipOn )
	{
	    send_ldpmsg_to_eppc(2, 0, &tcpRelMsg);
	}
	#ifdef SESSION_DEBUG
    	//#ifdef __BGS10_MPLS_DEBUG
    		printf("========Session %d,MODULE :%d  SEND TCP RELEASE =======\n",session->ifIndex,
    		        selfLdpPid.module);
    		printf("==== localAddr %x, peerAddr %x, LocalPort %d, PeerPort %d ====\n",
    		        tcpRelMsg.LocalIpaddr,
    		        tcpRelMsg.PeerIpaddr,
    		        tcpRelMsg.LocalPort,
    		        tcpRelMsg.PeerPort);
    		DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_SESSION,"========Session %d,MODULE :%d  SEND TCP RELEASE =======\n",session->ifIndex,
    		        selfLdpPid.module);
    		DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_SESSION,"==== localAddr %x, peerAddr %x, LocalPort %d, PeerPort %d ====\n",
    		        tcpRelMsg.LocalIpaddr,
    		        tcpRelMsg.PeerIpaddr,
    		        tcpRelMsg.LocalPort,
    		        tcpRelMsg.PeerPort);
    		
    		
    	//#endif
    #endif
	
	/* 5 sconds, wait for the message ack */
/*	MPLS_SET_TIMER(REL_MSG_TIME,(void *)ProcSessTcpTimer,session,ldptime_q,session->tmidCon);   */
    #if 0
    #ifdef SESSION_DEBUG
	    #ifdef __BGS10_MPLS_DEBUG
			printf("========MODULE :%d  SET TCP Timer; %d =======\n",
				selfLdpPid.module,session->tmidCon);
	    #endif
	#endif
	#endif
	session->state      = TCP_RELEASE_AWAITED;
	session->subState   = REL_MSG_AWAIT;
    procRelMsgAck(session);
    
	return ;	
}    

/******************************************************************************/
/*function:     SendTcpReq                                                    */
/*Author:       weng.qing                                                     */
/*decription:                                                                 */
/*              Send to PP TCP Connect Request,                               */
/*              Transit Session state to TCP_CONNECT_AWAITED,                 */
/*              Transit Session subState to NONIDLE,                          */
/*              set TCP Connect timer, time is 15 seconds                     */
/******************************************************************************/
    
void SendTcpReq(mplsLdpSession_t * session)
{
    TCP_CONNECT_MSG	        tcpConMsg;

	/* if role == ACTIVE send TCP Connect Req */
    if (session->role == ACTIVE)
    {
        tcpConMsg.LocalIpaddr	= session->localIpaddr;
        tcpConMsg.PeerIpaddr	= session->peerIpaddr;
/*        MPLS_PSEND(TCP_CONNECT_REQ, &tcpConMsg, sizeof(TCP_CONNECT_MSG), udptcpPid);  */
        if( A041TcpipOn )
	    {	        
            send_ldpmsg_to_eppc(1, 0, &tcpConMsg);
        }
        #ifdef SESSION_DEBUG
          //  #ifdef __BGS10_MPLS_DEBUG
    		    printf("====Session %d,Module:%d SEND TCP_CONNECT_REQ ====\n",session->ifIndex,
    		            selfLdpPid.module);
    		    printf("====TCP_CONNECT_REQ localIpaddr %x,peerIpaddr %x====\n",
    		            session->localIpaddr, 
    		            session->peerIpaddr);
    		    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_SESSION,"====Session %d,Module:%d SEND TCP_CONNECT_REQ ====\n",session->ifIndex,
    		            selfLdpPid.module);
    		    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_SESSION,"====TCP_CONNECT_REQ localIpaddr %x,peerIpaddr %x====\n",
    		            session->localIpaddr, 
    		            session->peerIpaddr);
    		//#endif
        #endif
        /* tcp timer timer6, transit state to TCP_CONNECT_AWAITED */
		MPLS_SET_TIMER(TCPREQ_TIME,(void *)ProcSessTcpTimer,session,ldptime_q,session->tmidCon);
	    session->state      = TCP_CONNECT_AWAITED;
	    session->subState   = NONIDLE;
	    #ifdef SESSION_DEBUG
		    #ifdef __BGS10_MPLS_DEBUG
				printf("========MODULE :%d  SET TCP Timer; %d =======\n",
					selfLdpPid.module,session->tmidCon);
		    #endif
		#endif
    }
    return;
}

/*      发送INIT消息, 成功返回LDP_TRUE,不成功返回LDP_FALSE        */
/* sbp 2002-2-4 change loop detection from global to one interface */
short   SendInitMsg(mplsLdpSession_t * session)
{    
    long                    ii,jj;
	mplsLdpEntity_t			*pEntity = MPLS_NULL;
	
	pEntity = ldp_session_search_entity(session);
	if(pEntity == MPLS_NULL)
		return LDP_FALSE;
		
    /* 构造INIT消息*/
    MPLS_MEMSET(&(ldp_snd_msg.initMsg),0,sizeof(mplsLdpInitMsg_t));
    InitInitMsg( &(ldp_snd_msg.initMsg) );
    ldp_snd_msg.initMsg.baseMsg.msgId        = messageId[INIT_M];
    AddMsgId(INIT_M);
        
    ldp_snd_msg.initMsg.csp.protocolVersion  = (unsigned short)(pEntity->protocolVersion);
    ldp_snd_msg.initMsg.csp.holdTime         = (unsigned short)(pEntity->keepAliveHoldTimer);
    ldp_snd_msg.initMsg.csp.flags.flags.lad  = (unsigned short)(pEntity->labelDistributionMethod);

	ldp_snd_msg.initMsg.csp.flags.flags.ld   = pEntity->loopDetectionCapable;
    ldp_snd_msg.initMsg.csp.flags.flags.pvl  = pEntity->pathvectorlimit;
    ldp_snd_msg.initMsg.csp.maxPduLen        = pEntity->maxPduLength;
    ldp_snd_msg.initMsg.csp.rcvLsrAddress    = session->peerLdpId.lsrAddress;
    ldp_snd_msg.initMsg.csp.rcvLsId          = session->peerLdpId.labelSpace;
    
    if(ldp_snd_msg.initMsg.csp.flags.flags.lad == DOWNSTREAMONDEMAND)
    {
		ldp_snd_msg.initMsg.aspExists                      = 1;
		ldp_snd_msg.initMsg.asp.baseTlv.flags.flags.uBit   = 0;
		ldp_snd_msg.initMsg.asp.baseTlv.flags.flags.fBit   = 0;
		ldp_snd_msg.initMsg.asp.baseTlv.flags.flags.type   = MPLS_ASP_TLVTYPE;
		ldp_snd_msg.initMsg.asp.baseTlv.length     	    = MPLS_ASPFIXLEN + 8;
		ldp_snd_msg.initMsg.asp.flags.flags.res            = 0;
    	
	    ldp_snd_msg.initMsg.asp.flags.flags.mergeType  = pEntity->atmMergeCap;
	    ldp_snd_msg.initMsg.asp.flags.flags.numLblRng  = pEntity->ifNumber;
	    ldp_snd_msg.initMsg.asp.flags.flags.dir        = pEntity->atmVcDirectionality;
    
	    jj = 0;
	    for (ii=0 ; ii< allInterface.num; ii++)
	    {
	        if (allInterface.interface[ii].ifIndex == session->ifIndex)
	        {
	            memcpy(&(ldp_snd_msg.initMsg.asp.lblRngList[jj]),&(allInterface.interface[ii].conflblRngList),\
	                        sizeof(mplsLdpAtmLblRng_t));
	            break;
	        }
	    }
	}
	
    ii = SendTcpMsg(session,MPLS_INIT_MSGTYPE,&(ldp_snd_msg.initMsg));

⌨️ 快捷键说明

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