📄 ldpsess.c
字号:
/*****************************************************************************/
/*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 + -