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

📄 mplsshow.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************************/
/* Product Name: MPLS                                                                 */
/* File Name   : mplsshow.c                                                           */
/* Author      : gao.xiaoqing                                                         */
/* Create Date : 2002.6.27                                                            */
/* Update      :                                                                      */
/*2002.11.28 sbp 处理HOP ADDRESS 与hop no 的关系                                       */
/*2002.12.23 Sbp 在路由动荡时,对SHOW 命令加保护                                        */
/* sbp  2003-1-16  同一优先级同一目的地只能建10调TUNNEL      
/* 2003.1.21  sbp            增加show mpls tunnel local范围的命令 */                       
/* 2003.1.28  Huyonghong 显示pvc时判断块的状态增加子状态                                  */
/*2003.2.19  Sunbaoping 没有考虑0地址查询问题和没有考虑TUNNEL号不存在的情况*/
/* sbp 2003-2-22 严格判断显示信息                                  */
/*   2003-11-12 szh mod MplsPortDataTable1代替MplsPortDataTable
/**************************************************************************************/

#include "mplsshow.h"
#include "mplsldp.h"
#include "mplsfun.h"
#include "mpls.h"
#include "mplsni.h"
#include "oamport.h"
#include "ldpvars.h"

extern mplsPort_t                                  MplsPortDataTable1;
extern mplsLdpParam_t                              mplsLdpParam;

extern unsigned short                              arrayLen[MPLS_DATA_ARRAY_MAX];
extern mplsLsrAttr_t                               mplsLsrAttrEntry;
extern MplsInterfaceConfTable_t                    mplsInterfaceConfEntry[MPLS_LDP_INTERFACE_MAX];
extern MplsTrafficParamTable_t                     mplsTrafficParamEntry[MPLS_LDP_INTERFACE_MAX];
extern MplsLdpEntityTable_t                        mplsLdpEntityEntry[MPLS_LDP_INTERFACE_MAX];
extern MplsLdpEntityAtmParamsTable_t               mplsLdpEntityAtmParamsEntry[MPLS_LDP_INTERFACE_MAX];
extern MplsLdpEntityConfAtmLabelRangeTable_t       mplsLdpEntityConfAtmLabelRangeEntry[MPLS_LDP_INTERFACE_MAX];
extern mplsLdpEntityStatsTable_t                   mplsLdpEntityStatsEntry[MPLS_LDP_INTERFACE_MAX];
extern mplsLdpPeerTable_t                          mplsLdpPeerEntry[MPLS_LDP_PEER_MAX];     
extern mplsLdpHelloAdjacencyTable_t                mplsLdpHelloAdjacencyEntry[MPLS_LDP_PEER_MAX];
extern MplsLdpSessionTable_t                       mplsLdpSessionEntry[MPLS_LDP_SESSION_MAX];
extern mplsLdpSessionStatsTable_t                  mplsLdpSessionStatsEntry[MPLS_LDP_SESSION_MAX];
extern forwardingtable_t                           mplsForwardingEntry[MPLS_LDP_INTERFACE_MAX];
extern mplsldpparamtable_t                         mplsLdpEntityParamEntry[MPLS_LDP_INTERFACE_MAX];
extern if_transport_table_t                        mplsIfTransportAddressEntry[MPLS_LDP_INTERFACE_MAX];
extern libtable_t                                  mplsLibEntry[MPLS_LDP_INTERFACE_MAX];
extern mplsLdpDiscovery_t                          mplsLdpDiscoveryEntry[MPLS_LDP_INTERFACE_MAX];
extern mplsAtmLdpCapability_t                      mplsAtmLdpCapEntry[MPLS_LDP_INTERFACE_MAX];
extern mplsLdpAtmSessionTable_t                    mplsLdpAtmSessionEntry[MPLS_LDP_INTERFACE_MAX];
extern mplsLdpSessionPeerAddressTable_t            mplsLdpSessionPeerAddressEntry[MPLS_LDP_SESSION_MAX];
extern MplsLdpEntityConfGenericLabelRangeTable_t   mplsLdpEntityConfGenericLabelRangeEntry[MPLS_LDP_INTERFACE_MAX];
extern mplsLdpGeneralSessionTable_t                mplsLdpGeneralSessionEntry[MPLS_LDP_INTERFACE_MAX];

typedef struct {
    
    mpls_comm_oam_t    oam_t_value;
    forwardingtable_t  forwart_t_value[MPLS_TABLE_SHOW_ITEM_LEN];
    
}mpls_forward_table_show;

extern unsigned long tranLen2mask(unsigned char len);

/*void showMplsDataWrite(uchar dataType, uchar dataLen, uchar *data, mpls_opr_data_t *pData, BYTE rtnNum)
{
	pData->Type = dataType;
	pData->Len = dataLen;
	pData->Data = data;
	pData = (mpls_opr_data_t *)(pData->Data + pData->Len);
	rtnNum++;
}*/

/*******************************************************************************/
/* cmd: show mpls ldp neighbor                                                           */
/*******************************************************************************/
void showMplsLdpNeighborWrite(mplsLdpHelloAdjacencyTable_t *neighbor, 
                                           mpls_opr_data_t **pData, BYTE *rtnNum)
{
	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = neighbor->entityLdpId.lsrAddress;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_WORD;
	(*pData)->Len = 2;
	*(WORD *)(*pData)->Data = neighbor->entityLdpId.labelSpace;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD*)(*pData)->Data = neighbor->entityindex;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD*)(*pData)->Data = neighbor->peerLdpId.lsrAddress;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_WORD;
	(*pData)->Len = 2;
	*(WORD*)(*pData)->Data = neighbor->peerLdpId.labelSpace;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD*)(*pData)->Data = neighbor->adjacencyindex;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;

	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = neighbor->adjacencyholdtimeremaining;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;

	(*pData)->Type = DATA_TYPE_WORD;
	(*pData)->Len = 2;
	*(WORD *)(*pData)->Data = neighbor->adjacencytype;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_WORD;
	(*pData)->Len = 2;
	*(WORD *)(*pData)->Data = neighbor->connect.localPort;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_WORD;
	(*pData)->Len = 2;
	*(WORD *)(*pData)->Data = neighbor->connect.peerPort;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = neighbor->connect.localAddr;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = neighbor->connect.peerAddr;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_BYTE;
	(*pData)->Len = 1;
	*(BYTE *)(*pData)->Data = neighbor->ifName.module;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_BYTE;
	(*pData)->Len = 1;
	*(BYTE *)(*pData)->Data = neighbor->ifName.port;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_BYTE;
	(*pData)->Len = 1;
	*(BYTE *)(*pData)->Data = neighbor->ifName.lsrType;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_WORD;
	(*pData)->Len = 2;
	*(WORD *)(*pData)->Data = neighbor->ifIndex;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
}

/* cmd: show mpls ldp neighbor address <A.B.C.D> */
void showMplsLdpNeighborAddr(mpls_sh_data_t *in, mpls_comm_oam_t *out)
{
	int i;
	BYTE rtnNum = 0;
	ushort dataSize = 0;
	mpls_opr_data_t *pData = out->Data;

	for(i = in->lastData[0]; i < arrayLen[NOADJACENCY]; i++)
	{
		if(mplsLdpHelloAdjacencyEntry[i].peerLdpId.lsrAddress == in->inTypeData.addr)
		{
			showMplsLdpNeighborWrite(&mplsLdpHelloAdjacencyEntry[i], &pData, &rtnNum);
			dataSize++;
			if(dataSize >= MPLS_LDP_NEIGHBOR_SIZE)
			{
				out->RetCode = SUCC_CMD_NOT_FINISHED;
				out->lastData[0] = i + 1;
				out->CmdRestartFlag = in->CmdRestartFlag;
				out->DataNum = rtnNum;
				out->DataLen = (WORD)((int)pData - (int)out->Data);
				return;
			}
		}
	}
		
	if(!dataSize)
		out->RetCode = SUCC_AND_NOPARA;
	else
		out->RetCode = SUCC_AND_HAVEPARA;			
	memset(out->lastData, 0, sizeof(out->lastData));
	out->CmdRestartFlag = in->CmdRestartFlag;
	out->DataNum = rtnNum;
	out->DataLen = (WORD)((int)pData - (int)out->Data);
	
	return;
}

/* cmd: show mpls ldp neighbor interface <module no/port no> */
void showMplsLdpNeighborPort(mpls_sh_data_t *in, mpls_comm_oam_t *out)
{
	int i;
	BYTE rtnNum = 0;
	ushort dataSize = 0;
	mpls_opr_data_t *pData = out->Data;
	ushort module, port;
	
	module = ((in->inTypeData.port >> 16) & 0xFFFF);
	port = in->inTypeData.port & 0xFFFF;

	for(i = in->lastData[0]; i < arrayLen[NOADJACENCY]; i++)
	{
		if(mplsLdpHelloAdjacencyEntry[i].ifName.module == module &&
		   mplsLdpHelloAdjacencyEntry[i].ifName.port == port)
		{
			showMplsLdpNeighborWrite(&mplsLdpHelloAdjacencyEntry[i], &pData, &rtnNum);
			dataSize++;
			if(dataSize >= MPLS_LDP_NEIGHBOR_SIZE)
			{
				out->RetCode = SUCC_CMD_NOT_FINISHED;
				out->lastData[0] = i + 1;
				out->CmdRestartFlag = in->CmdRestartFlag;
				out->DataNum = rtnNum;
				out->DataLen = (WORD)((int)pData - (int)out->Data);
				return;
			}
		}
	}
		
	if(!dataSize)
		out->RetCode = SUCC_AND_NOPARA;
	else
		out->RetCode = SUCC_AND_HAVEPARA;			
	memset(out->lastData, 0, sizeof(out->lastData));
	out->CmdRestartFlag = in->CmdRestartFlag;
	out->DataNum = rtnNum;
	out->DataLen = (WORD)((int)pData - (int)out->Data);
	
	return;
}

/* cmd: show mpls ldp neighbor */
void showMplsLdpNeighborAll(mpls_sh_data_t *in, mpls_comm_oam_t *out)
{
	int i;
	BYTE rtnNum = 0;
	ushort dataSize = 0;
	mpls_opr_data_t *pData = out->Data;

	for(i = in->lastData[0]; i < arrayLen[NOADJACENCY]; i++)
	{
		showMplsLdpNeighborWrite(&mplsLdpHelloAdjacencyEntry[i], &pData, &rtnNum);
		dataSize++;
		if(dataSize >= MPLS_LDP_NEIGHBOR_SIZE)
		{
			out->RetCode = SUCC_CMD_NOT_FINISHED;
			out->lastData[0] = i + 1;
			out->CmdRestartFlag = in->CmdRestartFlag;
			out->DataNum = rtnNum;
			out->DataLen = (WORD)((int)pData - (int)out->Data);
			return;
		}
	}
		
	if(!dataSize)
		out->RetCode = SUCC_AND_NOPARA;
	else
		out->RetCode = SUCC_AND_HAVEPARA;			
	memset(out->lastData, 0, sizeof(out->lastData));
	out->CmdRestartFlag = in->CmdRestartFlag;
	out->DataNum = rtnNum;
	out->DataLen = (WORD)((int)pData - (int)out->Data);
	
	return;
}

/* cmd: show mpls ldp neighbor */
void showMplsLdpNeighbor(mpls_sh_data_t *in, mpls_comm_oam_t *out)
{	
	switch(in->type)
	{
		case SHOW_IPADDR:
			showMplsLdpNeighborAddr(in, out);
			break;
		case SHOW_PORT:
			showMplsLdpNeighborPort(in, out);
			break;
		default:
			showMplsLdpNeighborAll(in, out);
			break;
	}
	return;
}

/******************************************************************************/
/* cmd: show mpls ldp session                                                            */
/******************************************************************************/
void showMplsLdpSessionWrite(MplsLdpSessionTable_t *sessTable, 
                                          mpls_opr_data_t **pData, BYTE *rtnNum)
{
	int i;
	
	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = sessTable->entityLdpId.lsrAddress;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_WORD;
	(*pData)->Len = 2;
	*(WORD *)(*pData)->Data = sessTable->entityLdpId.labelSpace;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = sessTable->peerLdpId.lsrAddress;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_WORD;
	(*pData)->Len = 2;
	*(WORD *)(*pData)->Data = sessTable->peerLdpId.labelSpace;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = sessTable->index;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_WORD;
	(*pData)->Len = 2;
	*(WORD *)(*pData)->Data = sessTable->state;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_WORD;
	(*pData)->Len = 2;
	*(WORD *)(*pData)->Data = sessTable->protocolversion;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;

	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = sessTable->keepaliveholdtimeremaining;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;

	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = sessTable->maxpdulength;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;

	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = sessTable->discontinuitytime;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_BYTE;
	(*pData)->Len = 1;
	*(BYTE *)(*pData)->Data = sessTable->role;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_BYTE;
	(*pData)->Len = 1;
	*(BYTE *)(*pData)->Data = sessTable->vcNumeberdType;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	(*pData)->Type = DATA_TYPE_BYTE;
	(*pData)->Len = 1;
	*(BYTE *)(*pData)->Data = sessTable->lblRngNum;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;
	
	for(i = 0; i < sessTable->lblRngNum; i++)
	{
		(*pData)->Type = DATA_TYPE_WORD;
		(*pData)->Len = 2;
		*(WORD *)(*pData)->Data = sessTable->lblRngList[i].minvpi;
		*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
		(*rtnNum)++;
	
		(*pData)->Type = DATA_TYPE_WORD;
		(*pData)->Len = 2;
		*(WORD *)(*pData)->Data = sessTable->lblRngList[i].minvci;
		*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
		(*rtnNum)++;
		
		(*pData)->Type = DATA_TYPE_WORD;
		(*pData)->Len = 2;
		*(WORD *)(*pData)->Data = sessTable->lblRngList[i].maxvpi;
		*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
		(*rtnNum)++;

		(*pData)->Type = DATA_TYPE_WORD;
		(*pData)->Len = 2;
		*(WORD *)(*pData)->Data = sessTable->lblRngList[i].maxvci;
		*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
		(*rtnNum)++;
	}

	(*pData)->Type = DATA_TYPE_DWORD;
	(*pData)->Len = 4;
	*(DWORD *)(*pData)->Data = sessTable->helloArrayNum;
	*pData = (mpls_opr_data_t *)((*pData)->Data + (*pData)->Len);
	(*rtnNum)++;

⌨️ 快捷键说明

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