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

📄 dmatrixm.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
📖 第 1 页 / 共 4 页
字号:
		}	}	if (first == TRUE)	{		if (SDorder == TRUE)		{			*source = matrixcontrol->SrcList;			conn = (*source)->LexList;			if (conn == NULL)	/* however, there should always be one */				return NULL;			*rank = DMatrixListSearchRank(*source, conn->ConnHost->Addr, &conn2, addrlen);			if (*rank == 0)		/* however, there should always be one */				return NULL;			for (i = 0; i < addrlen; i++)			{				obj->Id[idlen + 2 + i] = (LONG) (*source)->Addr[i];				obj->Id[idlen + 3 + i + addrlen] = (LONG) conn->ConnHost->Addr[i];			}			obj->Id[idlen + 1] = addrlen;			obj->Id[idlen + 1 + addrlen + 1] = addrlen;			obj->IdLen = idlen + 1 + 2 + 2 * addrlen;		}		else		{			*dest = matrixcontrol->DstList;			conn = (*dest)->LexList;			if (conn == NULL)	/* however, there should always be one */				return NULL;			*rank = DMatrixListSearchRank(*dest, conn->ConnHost->Addr, &conn2, addrlen);			if (*rank == 0)		/* however, there should always be one */				return NULL;			for (i = 0; i < addrlen; i++)			{				obj->Id[idlen + 2 + i] = (LONG) (*dest)->Addr[i];				obj->Id[idlen + 3 + i + addrlen] = (LONG) conn->ConnHost->Addr[i];			}			obj->Id[idlen + 1] = addrlen;			obj->Id[idlen + 1 + addrlen + 1] = addrlen;			obj->IdLen = idlen + 1 + 2 + 2 * addrlen;		}		return conn;	}	len = obj->IdLen - idlen - 2;	if (len < 0)		len = 0;	if (len > addrlen)		len--;	if (len > 2 * addrlen)		len = 2 * addrlen;	/* fill in srcdst in both orders: SDorder or reverse  */	for (i = 0; i < len; i++)		srcdst[i] = (BYTE) obj->Id[idlen + 2 + (i < addrlen ? 0 : 1) + i];	if (firstconn == TRUE)		len = addrlen;			/* force finding of first connection */	if (nextconn == TRUE)	{		len = addrlen;		/* force finding of next connection */		for (i = addrlen-1; i >= 0; i--)			if (++srcdst[i] != 0)				break;		if (i < 0 && srcdst[0] == 0)			return NULL;	}	if (SDorder == TRUE)	{		src = srcdst;		dst = srcdst + addrlen;		if (len == 0)		{			*source = matrixcontrol->SrcList;			conn = (*source)->LexList;		}		else if (len > 0 && len < addrlen)		{			*source = DnpapMatrixSearchHost(matrixcontrol, src, len, TRUE);			if (*source == NULL)				return NULL;			conn = (*source)->LexList;		}		else if (len >= addrlen && len <= 2 * addrlen)		{			*source = HashSearch(matrixcontrol->SrcTable, src, addrlen);			if (*source == NULL)			{                if ((*source = DnpapMatrixSearchHost(matrixcontrol, src, addrlen, TRUE)) == NULL)					return NULL;				conn = (*source)->LexList;			}			else			{				conn = DMatrixListSearchAddr(*source, dst, len - addrlen);				if (len == 2 * addrlen)				{					if (conn != NULL && memcmp(conn->ConnHost->Addr, dst, addrlen) == 0)						conn = conn->LexNext;					if (conn == NULL)					{						*source = (*source)->Next;						if (*source != NULL)							conn = (*source)->LexList;					}				}			}		}		if (conn != NULL)		{			for (i = 0; i < addrlen; i++)			{				obj->Id[idlen + 2 + i] = (*source)->Addr[i];				obj->Id[idlen + 3 + i + addrlen] = conn->ConnHost->Addr[i];			}			obj->Id[idlen + 1] = addrlen;			obj->Id[idlen + 1 + addrlen + 1] = addrlen;			obj->IdLen = idlen + 1 + 2 + 2 * addrlen;			*rank = DMatrixListSearchRank(*source, conn->ConnHost->Addr, &conn2, addrlen);		}	}	else	{		src = srcdst + addrlen;		dst = srcdst;		if (len == 0)		{			*dest = matrixcontrol->DstList;			conn = (*dest)->LexList;		}		else if (len > 0 && len < addrlen)		{			*dest = DnpapMatrixSearchHost(matrixcontrol, dst, len, FALSE);			if (*dest == NULL)				return NULL;			conn = (*dest)->LexList;		}		else if (len >= addrlen && len <= 2 * addrlen)		{			*dest = HashSearch(matrixcontrol->DstTable, dst, addrlen);			if (*dest == NULL)			{				if ((*dest = DnpapMatrixSearchHost(matrixcontrol, dst, addrlen, FALSE)) == NULL)					return NULL;				conn = (*dest)->LexList;			}			else			{				conn = DMatrixListSearchAddr(*dest, src, len - addrlen);				if (len == 2 * addrlen)				{					if (conn != NULL && memcmp(conn->ConnHost->Addr, src, addrlen) == 0)						conn = conn->LexNext;					if (conn == NULL)					{						*dest = (*dest)->Next;						if (*dest != NULL)							conn = (*dest)->LexList;					}				}			}		}		if (conn != NULL)		{			for (i = 0; i < addrlen; i++)			{				obj->Id[idlen + 2 + i] = (*dest)->Addr[i];				obj->Id[idlen + 3 + i + addrlen] = conn->ConnHost->Addr[i];			}			obj->Id[idlen + 1] = addrlen;			obj->Id[idlen + 1 + addrlen + 1] = addrlen;			obj->IdLen = idlen + 1 + 2 + 2 * addrlen;			*rank = DMatrixListSearchRank(*dest, conn->ConnHost->Addr, &conn2, addrlen);		}	}	return conn;}ConnInfo *GetTopFirstNext(DNPAP_MATRIX_CONTROL * matrixcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first, BOOLEAN SDorder, Host ** source, Host ** dest, INT * rank){	BYTE addr[HOST_SIZE_ADDR];	INT i, len;	ConnInfo *conn = NULL;	WORD addrlen = matrixcontrol->AddressLen;	*source = *dest = NULL;	*rank = 0;	if (matrixcontrol->TableSize == 0)		return NULL;	if (first == FALSE)	{		if (obj->IdLen > idlen + 1)		{			if (obj->Id[idlen + 1] > addrlen)				return NULL;			if (obj->Id[idlen + 1] < addrlen)				first = TRUE;		}		else			first = TRUE;	}	if (first == TRUE)	{		if (SDorder == TRUE)		{			*source = matrixcontrol->SrcList;			*rank = 1;			conn = (*source)->TopList;			if (conn == NULL)				return NULL;			for (i = 0; i < addrlen; i++)				obj->Id[idlen + 2 + i] = (LONG) (*source)->Addr[i];			obj->Id[idlen + 1] = addrlen;			obj->Id[idlen + 2 + addrlen] = *rank;			obj->IdLen = idlen + 1 + 1 + addrlen + 1;		}		else		{			*dest = matrixcontrol->DstList;			*rank = 1;			conn = (*dest)->TopList;			if (conn == NULL)				return NULL;			for (i = 0; i < addrlen; i++)				obj->Id[idlen + 2 + i] = (LONG) (*dest)->Addr[i];			obj->Id[idlen + 1] = addrlen;			obj->Id[idlen + 2 + addrlen] = *rank;			obj->IdLen = idlen + 1 + 1 + addrlen + 1;		}		return conn;	}	len = obj->IdLen - idlen - 2;	if (len < 0)		len = 0;	else if (len > addrlen + 1)		len = addrlen + 1;	for (i = 0; i < (len > addrlen ? addrlen : len); i++)		addr[i] = (BYTE) obj->Id[idlen + 2 + i];	if (SDorder == TRUE)	{		if (len == 0)		{			*source = matrixcontrol->SrcList;			*rank = 1;			conn = (*source)->TopList;		}		else if (len > 0 && len < addrlen)		{			*source = DnpapMatrixSearchHost(matrixcontrol, addr, len, TRUE);			if (*source == NULL)				return NULL;			*rank = 1;			conn = (*source)->TopList;		}		else if (len == addrlen)		{			*source = HashSearch(matrixcontrol->SrcTable, addr, addrlen);			if (*source == NULL)			{                if ((*source = DnpapMatrixSearchHost(matrixcontrol, addr, addrlen, TRUE)) == NULL)					return NULL;			}			*rank = 1;			conn = (*source)->TopList;		}		else if (len == addrlen + 1)		{			*source = HashSearch(matrixcontrol->SrcTable, addr, addrlen);			if (*source == NULL)			{                if ((*source = DnpapMatrixSearchHost(matrixcontrol, addr, addrlen, TRUE)) == NULL)					return NULL;				*rank = 1;				conn = (*source)->TopList;			}			else			{				*rank = obj->Id[idlen + 2 + addrlen];				conn = DMatrixListSearchTop(*source, *rank);				if (conn != NULL)				{					conn = conn->TopNext;					(*rank)++;				}				if (conn == NULL)				{					*source = (*source)->Next;					if (*source != NULL)					{						conn = (*source)->TopList;						*rank = 1;					}				}			}		}		if (conn != NULL)		{			for (i = 0; i < addrlen; i++)				obj->Id[idlen + 2 + i] = (LONG) (*source)->Addr[i];			obj->Id[idlen + 2 + addrlen] = *rank;			obj->Id[idlen + 1] = addrlen;			obj->IdLen = idlen + 1 + 1 + addrlen + 1;		}	}	else	{		if (len == 0)		{			*dest = matrixcontrol->DstList;			*rank = 1;			conn = (*dest)->TopList;		}		else if (len > 0 && len < addrlen)		{			*dest = DnpapMatrixSearchHost(matrixcontrol, addr, len, FALSE);			if (*dest == NULL)				return NULL;			*rank = 1;			conn = (*dest)->TopList;		}		else if (len == addrlen)		{			*dest = HashSearch(matrixcontrol->DstTable, addr, addrlen);			if (*dest == NULL)			{				if ((*dest = DnpapMatrixSearchHost(matrixcontrol, addr, addrlen, FALSE)) == NULL)					return NULL;			}			*rank = 1;			conn = (*dest)->TopList;		}		else if (len == addrlen + 1)		{			*dest = HashSearch(matrixcontrol->DstTable, addr, addrlen);			if (*dest == NULL)			{				if ((*dest = DnpapMatrixSearchHost(matrixcontrol, addr, addrlen, FALSE)) == NULL)					return NULL;				*rank = 1;				conn = (*dest)->TopList;			}			else			{				*rank = obj->Id[idlen + 2 + addrlen];				conn = DMatrixListSearchTop(*dest, *rank);				if (conn != NULL)				{					conn = conn->TopNext;					(*rank)++;				}				if (conn == NULL)				{					*dest = (*dest)->Next;					if (*dest != NULL)					{						conn = (*dest)->TopList;						*rank = 1;					}				}			}		}		if (conn != NULL)		{			for (i = 0; i < addrlen; i++)				obj->Id[idlen + 2 + i] = (LONG) (*dest)->Addr[i];			obj->Id[idlen + 2 + addrlen] = *rank;			obj->Id[idlen + 1] = addrlen;			obj->IdLen = idlen + 1 + 1 + addrlen + 1;		}	}	return conn;}VOID DnpapMatrixChannelStop(LONG channelIndex){	MIB_LOCAL *matrixinstance;	DNPAP_MATRIX_CONTROL *matrixcontrol;	for (matrixinstance = MatrixControlInstance; matrixinstance != NULL; matrixinstance = matrixinstance->Next)	{		matrixcontrol = matrixinstance->Data;		if (matrixcontrol->Status == SNMP_VALID &&			matrixcontrol->Channel == TRUE &&			matrixcontrol->ChannelAccept == TRUE &&			matrixcontrol->Source[matrixcontrol->SourceLen - 1] == channelIndex)			matrixcontrol->ChannelAccept = FALSE;	}}VOID DnpapMatrixPkt(LONG channelIndex, PROT_PKT * pkt){	MIB_LOCAL *matrixinstance;	DNPAP_MATRIX_CONTROL *matrixcontrol;	for (matrixinstance = MatrixControlInstance; matrixinstance != NULL; matrixinstance = matrixinstance->Next)	{		matrixcontrol = matrixinstance->Data;		if (matrixcontrol->Status == SNMP_VALID &&			matrixcontrol->Channel == TRUE &&			matrixcontrol->ChannelAccept == TRUE &&			matrixcontrol->Source[matrixcontrol->SourceLen - 1] == channelIndex)			DnpapMatrixHandlePkt(matrixcontrol, pkt);	}}

⌨️ 快捷键说明

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