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

📄 labelmap.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 2 页
字号:
			MPLS_SEND_NOTIFY(session,MISSPARAMETER,lblMapMsg->baseMsg.msgId, \
					lblMapMsg->baseMsg.flags.flags.msgType);
			return;
		}
	}
	else
	{
		/*********************************************************************/
		/* not for some reqest,currently no process for CRLDP attribute change
		 * directly search Fec link list
		*/
		/*********************************************************************/
		fecCb = MPLS_NULL;
		ret = MPLS_FALSE;
		/* policy check */
		for(loop = 0 ; loop < lblMapMsg->fecTlv.numberFecElements; loop ++)
		{
/*
			ret = mpls_policy_filter(lblMapMsg->fecTlv.fecElArray[loop].addressEl.address, \
				               lblMapMsg->fecTlv.fecElArray[loop].addressEl.preLen);
			if(ret == MPLS_FALSE)
			{
				mpls_release_label_map_fec(session,lblMapMsg,loop);	
				continue;
			}
*/			
			preLen = lblMapMsg->fecTlv.fecElemTypes[loop] == MPLS_HOSTADR_FEC ? \
						32: lblMapMsg->fecTlv.fecElArray[loop].addressEl.preLen;
			MPLS_FEC_SEARCH(lblMapMsg->fecTlv.fecElArray[loop].addressEl.address,preLen,fecCb)
			if(fecCb == MPLS_NULL)
			{
                if(lblMapMsg->genLblTlvExists != 1)
		        {
					mpls_release_label_map_fec(session,lblMapMsg,loop);	
					continue;
			    }
				MPLS_FEC_CREATE((lblMapMsg->fecTlv.fecElArray[loop].addressEl.address), \
				          (lblMapMsg->fecTlv.fecElArray[loop].addressEl.preLen),\
				           fecCb)
				if(fecCb)
				{
					fecCb->localGenLabel = MPLS_HUNT_GEN_LABEL();
					fecCb->owner 		|= MPLS_OWNER_LDP;		
					MPLS_DOWNCB_CREATE(session,downCb,fecCb)
					if(downCb)
					{
						downCb->downGenLabel = lblMapMsg->genLblTlv.label;
						downCb->downSessionIndex = session->index;
						rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
						downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
						downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
						downCb->state = ESTABLISHED;
					}
					else
					{
						MPLS_ERR_LOG("mpls_err_log");
						MPLS_FEC_DELETE(fecCb->fec_key.mplsFecAddr,fecCb->fec_key.mplsLdpFecAddrLen,fecCb);
						mpls_release_label_map(session,lblMapMsg);
					}
				}
				else
				{
					/* fec space is full, just discard the mapping */
					DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"FuncLblMap ,creat fec fail \n");
					printf("mpls_err_log,FuncLblMap,create fec error\n");
					mpls_release_label_map_fec(session,lblMapMsg,loop);
				}
				continue;	
			}
			/* search fecCb success */
			downCb = MPLS_NULL;
			lspCb  = MPLS_NULL;
			if(lblMapMsg->genLblTlvExists == 1)
			{
				MPLS_DOWNCB_SEARCH(fecCb,session,downCb)
				if(downCb != MPLS_NULL)
				{
					fecCb->owner  |= MPLS_OWNER_LDP;
					/* there exist downstream label mapping */
					if(downCb->downGenLabel == lblMapMsg->genLblTlv.label)
					{
						rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
						downCb->downSessionIndex = session->index;
						downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
						downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
						downCb->state = ESTABLISHED;
						if(fecCb->owner & MPLS_OWNER_ROUTE)
						{
							belong_to = MPLS_FALSE;
							MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
							if(belong_to == MPLS_TRUE)
							{
								if((downCb->waitflag) & 0x20){/* 原有标记整合操作*/
								    if((downCb->waitflag)& 0x4){  /*原有CLOSE操作 */
								    	downCb->waitflag &= 0xda;
								    	if(!((downCb->waitflag)&0xe0)){
								    		DownCB_locat_adjust(downCb,fecCb,0x2,&FecDelFlag);  
								    	}							    	
								    }							    
								    else
								    {
								    	;/* do nothing ! */
								    }
								}
								else
								{
									wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CREATE);
								}
							}
						}
					}
					else
					{
						mpls_release_label_map_fec(session,lblMapMsg,loop);
						#if 0
						if(fecCb->owner & MPLS_OWNER_ROUTE)
						{
							belong_to = MPLS_FALSE;
							MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
							if(belong_to == MPLS_TRUE)
							{
								if((downCb->waitflag) & 0x20){/* 原有标记整合操作*/
								    if(!((downCb->waitflag)& 0x4)){  /*原有CREAT操作 */
								    	downCb->downGenLabel = lblMapMsg->genLblTlv.label;						    	
								    }							    
								    else
								    {
								    	MPLS_DOWNCB_CREATE(session,downCb,fecCb)
							            if(downCb)
							            {
								            downCb->downGenLabel = lblMapMsg->genLblTlv.label;
								            downCb->downSessionIndex = session->index;
								            rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
								            downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
								            downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
								            downCb->state = ESTABLISHED;
							            }
								    	wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CREATE);
								    }
								}
								else
								{
									downCb->downGenLabel = lblMapMsg->genLblTlv.label;
									wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CREATE);
								}
								
							}
							else /* mapping not from next hop */
							{
								/* need not label process */
								if(!((downCb->waitflag) & 0x20))
								{
									rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
									downCb->downSessionIndex = session->index;
									downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
									downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
									downCb->state = ESTABLISHED;
								}
								else
								{
									MPLS_DOWNCB_CREATE(session,downCb,fecCb)
						            if(downCb)
						            {
							            downCb->downGenLabel = lblMapMsg->genLblTlv.label;
							            downCb->downSessionIndex = session->index;
							            rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
							            downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
							            downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
							            downCb->state = ESTABLISHED;
						            }
						            else
						            {
						            	MPLS_ERR_LOG(" downCb souce unavailable ");
						            }
								}
							}
						}
						else /* no route */ 
						{
							/* need not label process */
							if(!((downCb->waitflag) & 0x20))
							{
								rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
								downCb->downSessionIndex = session->index;
								downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
								downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
								downCb->state = ESTABLISHED;
							}
							else
							{
								MPLS_DOWNCB_CREATE(session,downCb,fecCb)
					            if(downCb)
					            {
						            downCb->downGenLabel = lblMapMsg->genLblTlv.label;
						            downCb->downSessionIndex = session->index;
						            rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
						            downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
						            downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
						            downCb->state = ESTABLISHED;
					            }
					            else
					            {
					            	MPLS_ERR_LOG(" downCb souce unavailable ");
					            }
							}
						}
						#endif
					}
				}
				else
				{
					MPLS_DOWNCB_CREATE(session,downCb,fecCb)
					if(downCb)
					{
						fecCb->owner  |= MPLS_OWNER_LDP;
						downCb->downGenLabel = lblMapMsg->genLblTlv.label;
						downCb->downSessionIndex = session->index;
						rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
						downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
						downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
						downCb->state = ESTABLISHED;
						if(fecCb->owner & MPLS_OWNER_ROUTE)
						{
							belong_to = MPLS_FALSE;
							MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
							if(belong_to == MPLS_TRUE)
							{
			                    wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CREATE);
							}
						}
					}
					else
					{
						printf("mpls_err_log");;
						MPLS_FEC_DELETE(fecCb->fec_key.mplsFecAddr,fecCb->fec_key.mplsLdpFecAddrLen,fecCb);
						mpls_release_label_map_fec(session,lblMapMsg);
						break;
					}
				}
			}
			else
			{
				MPLS_FEC_SESSION_DOWN_ATM_LABEL(session,lblMapMsg->atmLblTlv,
			                             &lblMapMsg->fecTlv,fecCb,lspCb);
				if(lspCb == MPLS_NULL)
				{
					mpls_release_label_map_fec(session,lblMapMsg,loop);
					continue;
				}
				rec_lblmap_tlvpro(session,lblMapMsg,fecCb,lspCb,LDP_HOP_LSP);
				continue;
			}
		}
	}
	return;
}


/****************************************************************************/
/*      Product Name:   MPLS PACK1.0
 *      Module  Name:   LDP/CR_LDP
 *      File    Name:   ldppdu.h
 *      Author  Name:   weng.qing shi.zhaohui hu.yonghong
 *      Creat   Date:   2002-6-18
 *      Version     :   1.0
 *      Input       :   mplsLdpSession_t *, inbound seesion pointer;
 *                      void *            , input message;
 *      Output      :   void
 *      Function    :   judge if the cb is crlspcb
 *      Note        :   after return, the function should assert the result
 *                      according to other information 
 *                      when dynamic crlsp, lspid should exists
*/      
/****************************************************************************/
MPLS_BOOL reqCrlsp(mplsLdpCrLsp * crlspCB,mplsLdpFecTlv_t * fecTlv,
                   mplsLdpSession_t * session,unsigned long msgid,unsigned char lspid)

{
	
	MPLS_BOOL     ret   = MPLS_FALSE;
	crlspCB = MPLS_NULL;
	
	if(fecTlv->fecElemTypes[0] == MPLS_CRLSP_FEC || lspid == 1)
	{
		ret = MPLS_TRUE;
	}
	else
	{
		MPLS_CRFEC_DOWN_SESSION_MSGID(session,msgid,crlspCB);
	}
	if(crlspCB != MPLS_NULL)
		ret = MPLS_TRUE;
	return ret;
}

⌨️ 快捷键说明

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