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

📄 f_comm.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 3 页
字号:
							ifindex2mod_req.mpls_platform      	= local_platform;
							mpls_ifindex2module(&ifindex2mod_req,&ifindex2mod_ack,MPLS_INTERFACE);
							if(ifindex2mod_ack.ack == MPLS_SUCCESS)
							{
								lspCb->downAtmLabel.module = ifindex2mod_ack.mod;
								lspCb->downAtmLabel.port   = ifindex2mod_ack.port;
							}
							else
							{
								DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldpFecSearchCheck, ERR get Down ATM Module & port\n");
								MPLS_ERR_LOG("ERR get UP ATM Module & port");
								/* should release up atm label */
								MPLS_FEC_LSPCB_DELETE(fecCb,lspCb);
								continue;
							}
							MPLS_INSERT_INTO_DOWN_LSP_LIST(session->lsp_down_cb_list,lspCb,lspCb);
							lspCb->status    = IDLE;
							lspCb->subStatus = IDLE;
							if(!(lspCb->waitflag & 0x1))
							LspCBFsm(session,MPLS_ROUTE_ADD,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
						}
						else
						    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldpFecSearchCheck,creat lspcb fail\n");
					}
					else
					{
					    MPLS_ERR_LOG("====Nexthop not belong to Session====");
					}
				}
			}
			else
			{
	            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(fecCb->nexthopSessionIndex)
						{
							MPLS_WALK_DOWN_BEGIN(fecCb,downCb,t_downCb);
							if(downCb != MPLS_NULL && downCb->downSessionIndex == fecCb->nexthopSessionIndex)
							{
								switch(downCb->state)
								{
									case ESTABLISHED:
										if(session)
										{
											if(session->index == downCb->downSessionIndex)
											       wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CLOSE);
											       
										}
										break;
									case RESPONSE_AWAITED:
										/* send to up notification: no route */
										downCb->waitflag |=0x1;
										wait_downlblmsg_append(downCb,fecCb,MPLS_LBLABORT_MSGTYPE);
										break;
									default:
										printf("mpls_err_log,ldpFecSearchCheck default 2");
										break;
								}	
							}
							MPLS_WALK_DOWN_END(fecCb,downCb,t_downCb)
						}
						fecCb->nexthopSessionIndex = session->index;
					}
		            /* maybe need check upCb list */									
					MPLS_UPCB_CREATE(fecCb,session,upCb)
					
					if(upCb)
					{
							upCb->upSessionIndex = session->index;
							upCb->upGenLabel     = fecCb->localGenLabel;
							upCb->upPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
							upCb->upPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
							upCb->state = ESTABLISHED;
							wait_uplblmsg_append(upCb,fecCb,MPLS_NULL,MPLS_NULL,MPLS_LBLMAP_MSGTYPE);
					}
				}
			}
		}
	}
	return;
}

/****************************************************************************/
/*      Product Name:   MPLS PACK1.0
 *      Module  Name:   LDP/CR_LDP
 *      File    Name:   f_comm.c
 *      Author  Name:   weng.qing shi.zhaohui hu.yonghong
 *      Creat   Date:   2002-6-18
 *      Version     :   1.0
 *      Input       :   void
 *      Output      :   void
 *      Function    :   priodic fec lspcb scan function
 *      Note        :   
*/      
/****************************************************************************/
#if MPLS_PROTECT
void ldpFecLspcbScan()
{
	mplsLdpFecEntry    * fecCb    = MPLS_NULL;
	mplsLdpLspCB       * lspCb    = MPLS_NULL;
	mplsLdpLspCB       * lspCb_t  = MPLS_NULL;
	mplsLdpCrLsp       * crlspCb  = MPLS_NULL; 
	unsigned short     i;
	
	if(fec_lspcb_scan.stop == 2)
	{
		fec_lspcb_scan.stop = 1; /* next time, from fec head scan */
		WALK_CRFEC_BEGIN(crlspCb)
		if(crlspCb)
		{
			if(crlspCb->crlspCb.up_lsp_session_list.prev)
			{
				if((crlspCb->crlspCb.up_lsp_session_list.prev)->up_lsp_session_list.next != &(crlspCb->crlspCb))
				{
					crlspCb->crlspCb.up_lsp_session_list.prev = MPLS_NULL;
					lspCb_t = &(crlspCb->crlspCb);
					while(lspCb_t->up_lsp_session_list.next)
					{
						lspCb_t = lspCb_t->up_lsp_session_list.next;
					}
					lspcb_scan ++;
					MPLS_INSERT_INTO_UP_LSP_LIST(g_up_lsp_list,
									 &(crlspCb->crlspCb), \
									 lspCb_t);
					break;
				}
			}
			if(crlspCb->crlspCb.down_lsp_session_list.prev)
			{
				if((crlspCb->crlspCb.down_lsp_session_list.prev)->down_lsp_session_list.next != &(crlspCb->crlspCb))
				{
					crlspCb->crlspCb.down_lsp_session_list.prev = MPLS_NULL;
					lspCb_t = &(crlspCb->crlspCb);
					while(lspCb_t->down_lsp_session_list.next)
					{
						lspCb_t = lspCb_t->down_lsp_session_list.next;
					}
					lspcb_scan ++;
					MPLS_INSERT_INTO_DOWN_LSP_LIST(g_down_lsp_list,
									 &(crlspCb->crlspCb), \
									 lspCb_t);
					break;
				}
			}
		}		
		WALK_CRFEC_END
	}
	
	if(fec_lspcb_scan.stop == 1)
	{
		fecCb = MPLS_AVL_FIRST(g_fec_avl_tree);
		fec_lspcb_scan.stop = 0;
	}
	else
	{
		MPLS_FEC_SEARCH(fec_lspcb_scan.addr,fec_lspcb_scan.addrLen,fecCb)
		if(fecCb == MPLS_NULL)
		{
			fecCb = MPLS_AVL_FIRST(g_fec_avl_tree);
			fec_lspcb_scan.stop = 0;
		}
	}
	i = 0;
	for(;;fecCb = MPLS_AVL_NEXT(fecCb->fec_avl_node))
	{
		if(fecCb == MPLS_NULL)
		{
		    fec_lspcb_scan.timer   = 0;
			fec_lspcb_scan.addr    = 0;
			fec_lspcb_scan.addrLen = 0;
			fec_lspcb_scan.stop    = 0;
		    return;
		}
		if(++i > 8)
		{
			fec_lspcb_scan.addr    = fecCb->fec_key.mplsFecAddr;
			fec_lspcb_scan.addrLen = fecCb->fec_key.mplsLdpFecAddrLen;
			fec_lspcb_scan.stop    = 0;
			fec_lspcb_scan.timer = 1;
			break;
		}
		else
		{
			MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
			if(lspCb)
			{
				if(lspCb->up_lsp_session_list.prev)
				{
					if((lspCb->up_lsp_session_list.prev)->up_lsp_session_list.next != lspCb)
					{
						lspCb->up_lsp_session_list.prev = MPLS_NULL;
						lspCb_t = lspCb;
						while(lspCb_t->up_lsp_session_list.next)
						{
							lspCb_t = lspCb_t->up_lsp_session_list.next;
						}
						lspcb_scan ++;
						MPLS_INSERT_INTO_UP_LSP_LIST(g_up_lsp_list,
									 lspCb, \
									 lspCb_t);
						break;
					}
				}
				if(lspCb->down_lsp_session_list.prev)
				{
					if((lspCb->down_lsp_session_list.prev)->down_lsp_session_list.next != lspCb)
					{
						lspCb->down_lsp_session_list.prev = MPLS_NULL;
						lspCb_t = lspCb;
						while(lspCb_t->down_lsp_session_list.next)
						{
							lspCb_t = lspCb_t->down_lsp_session_list.next;
						}
						lspcb_scan ++;
						MPLS_INSERT_INTO_DOWN_LSP_LIST(g_down_lsp_list,
									 lspCb, \
									 lspCb_t);
						break;
					}
				}
			}
			MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
		}
	}
	return;
}
#endif

/* wengqing modify algorithm of get/release lspindex 2002.12.09 */
unsigned long inn = 0;
unsigned long ldp_get_index()
{
	unsigned long i,j,k;
		
	if(inn & 0xfffC0000)
	    inn = 0;
	
	i = (inn >> 13);
	j = (inn - (i << 13));
        k = (inn & 0x1f);
	j = j >> 5;
	
	while(i < MPLS_ITEM_NO)
	{
		if(ldpIndex.item[i].nul < 8192)
		{
			for(; j < MPLS_INDEX_ITEM; j++)
			{
				for(; k < ((sizeof(unsigned long))<< 3); k++)
				{
					if(!(ldpIndex.item[i].index[j] & (1 << k)))
					{
					    ldpIndex.item[i].index[j] += (1 << k);
					    ldpIndex.item[i].nul++;
					    #ifdef __BGS10_MPLS_DEBUG
					    MPLS_ERR_LOG("ldp_get_index %x",inn);
					    #endif
					    return inn++;
					}
					else
					{
					    inn++;
					}
				}
				k = 0;
			}
			j = k = 0;
				}
		else
		{
			inn += 8192;
			}
			j = k = 0;
		i ++;
		if(inn & 0xfffC0000)
	    {
	        i = 0;
            inn = 0;
            MPLS_MEMSET(&ldpIndex,0,sizeof(mpls_ldpIndex));
		}
	}
    #ifdef __BGS10_MPLS_DEBUG
	MPLS_ERR_LOG("ldp_get_index 0xffffffff");
	#endif
	return 0xffffffff;
}

void ldp_rel_index(unsigned long index)
{
	unsigned long i,j,k;
	#ifdef __BGS10_MPLS_DEBUG
	MPLS_ERR_LOG("ldp_rel_index %x",index);
	#endif
	i = (index >> 13);
	j = (index - (i << 13));
	k = (index & 0x1f);
	j = j >> 5;
	/* wengqing 2002.12.05 protection of release index out of range */
	if(i >=MPLS_ITEM_NO || j >= MPLS_INDEX_ITEM || k >= ((sizeof(unsigned long))<< 3) )
	{
	    MPLS_ASSERT(0);
        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldp_rel_index out of range \n");
	    printf("ldp_rel_index out of range ");
	    return;
	}	
	if(ldpIndex.item[i].index[j] & (1 << k))
	{
		ldpIndex.item[i].index[j] &= (~(1 << k));
		ldpIndex.item[i].nul --;
	}
}

#if 0
/***********************************/
/* hyh lms pos */
/***********************************/
unsigned short mpls_lms_rel_genlabel(unsigned long l)
{
	printf("mpls_lms_rel_genlabel %d ",l);
	return MPLS_TRUE;
}

void mpls_ifindex2module(MPLS_IFINDEX2MOD_REQ * mpls_ifindex2mod_req,
                              MPLS_IFINDEX2MOD_ACK * mpls_ifindex2mod_ack,
                              unsigned short        ModorPortorIf)
{
	mpls_ifindex2mod_ack->ack = MPLS_SUCCESS;
	return;
}

void mpls_get_lms_label( mpls_lms_label_req       * label_req,
						 mpls_lms_label_ack	      * label_ack )
{
	static i = 16;
	
	label_ack -> ack = MPLS_SUCCESS;
    label_ack -> label.type = MPLS_LABEL_PER_PLATFORM;
    label_ack -> label.general_label.label.flags.gen_lbl = i++;
    label_ack -> label.general_label.label.flags.res = 0;
	
}

void mpls_rel_lms_label( mpls_lms_label_rel       * label_rel,
    					 mpls_lms_label_ack       * label_ack )
{
	label_ack->ack = MPLS_SUCCESS;
	return;
}
unsigned long   mpls_lms_get_genlabel(  )
{
	static i = 15;
	
	i++;
	return i;
}
#endif

⌨️ 快捷键说明

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