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

📄 dchanm.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details   */#include <stdlib.h>#include <stdio.h>#include <memory.h>#include <string.h>#include <mibsup.h>#include <message.h>#include <mac.h>#include "dchane.h"#include "dchanc.h"#include "dchan.h"IMPORT BOOLEAN BeholderStrictRMON;#define INDEXSIZE   1static MIB_LOCAL *channel = NULL;static BOOLEAN RmonNext(SNMP_OBJECT * Obj, MIB_LOCAL ** Local, WORD IdLen, WORD IdSze, DNPAP_CHANNEL ** Elm);BOOLEAN DnpapChannelMInit(VOID){	MessageConfig(DNPAP_CHANNEL_ERROR, "DnpapChannel");	return TRUE;}BOOLEAN RmonNext(SNMP_OBJECT * Obj, MIB_LOCAL ** Local, WORD IdLen, WORD IdSze, DNPAP_CHANNEL ** Elm){	MIB_LOCAL *local = *Local;	if (local == NULL)		return FALSE;	if (Obj->IdLen == IdLen || local->Index > Obj->Id[IdLen])	{		Obj->IdLen = IdLen + IdSze;		Obj->Id[IdLen] = local->Index;		return TRUE;	}	*Local = local->Next;	return (RmonNext(Obj, Local, IdLen, IdSze, Elm));}WORD DnpapChannelIndex(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return (SNMP_NOSUCHNAME);	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		Obj->Syntax.LngInt = local->Index;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelIfIndex(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	MAC_IFACE *iface;	DNPAP_CHANNEL *data;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return (SNMP_NOSUCHNAME);	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_CHANNEL *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, CHANNEL_BOOLEAN_INDEX))			return SNMP_NOSUCHNAME;		Obj->Syntax.LngInt = data->IfIndex;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_CHANNEL *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		if ((iface = MacIfaceGet((WORD) Obj->Syntax.LngInt)) == NULL)			return SNMP_BADVALUE;		if (iface->type != MAC_TYPE_ETHERNET_CSMACD && iface->type != MAC_TYPE_88023_CSMACD)			return SNMP_BADVALUE;		data->IfIndex = Obj->Syntax.LngInt;		data->Iface = iface;		BooleanSetTrue(data->ObjectSet, CHANNEL_BOOLEAN_INDEX);		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelAcceptType(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_CHANNEL *data;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return (SNMP_NOSUCHNAME);	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_CHANNEL *) local->Data;		Obj->Syntax.LngInt = data->AcceptType;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_CHANNEL *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		if (Obj->Syntax.LngInt != 1 && Obj->Syntax.LngInt != 2)			return SNMP_BADVALUE;		data->AcceptType = Obj->Syntax.LngInt;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelDataControl(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_CHANNEL *data;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return (SNMP_NOSUCHNAME);	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_CHANNEL *) local->Data;		Obj->Syntax.LngInt = data->DataControl;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_CHANNEL *) local->Data;		if (Obj->Syntax.LngInt != 1 && Obj->Syntax.LngInt != 2)			return SNMP_BADVALUE;		data->DataControl = Obj->Syntax.LngInt;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelTurnOnEventIndex(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_CHANNEL *data;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return (SNMP_NOSUCHNAME);	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_CHANNEL *) local->Data;		Obj->Syntax.LngInt = data->TurnOnEventIndex;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_CHANNEL *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		data->TurnOnEventIndex = Obj->Syntax.LngInt;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelTurnOffEventIndex(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_CHANNEL *data;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return (SNMP_NOSUCHNAME);	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_CHANNEL *) local->Data;		Obj->Syntax.LngInt = data->TurnOffEventIndex;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_CHANNEL *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		data->TurnOffEventIndex = Obj->Syntax.LngInt;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelEventIndex(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_CHANNEL *data;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return (SNMP_NOSUCHNAME);	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_CHANNEL *) local->Data;		Obj->Syntax.LngInt = data->EventIndex;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_CHANNEL *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		data->EventIndex = Obj->Syntax.LngInt;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelEventStatus(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_CHANNEL *data;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return (SNMP_NOSUCHNAME);	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_CHANNEL *) local->Data;		Obj->Syntax.LngInt = data->EventStatus;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_CHANNEL *) local->Data;		if (Obj->Syntax.LngInt != 1 && Obj->Syntax.LngInt != 3)			return SNMP_BADVALUE;		data->EventStatus = Obj->Syntax.LngInt;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelMatches(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_CHANNEL *data;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return (SNMP_NOSUCHNAME);	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_CHANNEL *) local->Data;		Obj->Syntax.LngInt = data->Matches;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelDescription(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_CHANNEL *data;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return (SNMP_NOSUCHNAME);	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_CHANNEL *) local->Data;		memcpy(Obj->Syntax.BufChr, data->Description, data->DescriptionLen);		Obj->SyntaxLen = data->DescriptionLen;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_CHANNEL *) local->Data;		memcpy(data->Description, Obj->Syntax.BufChr, Obj->SyntaxLen);		data->DescriptionLen = Obj->SyntaxLen;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelOwner(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_CHANNEL *data;	if ((local = MibRmon(Obj, channel, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_CHANNEL *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, CHANNEL_BOOLEAN_OWNER))			return SNMP_NOSUCHNAME;		memcpy(Obj->Syntax.BufChr, data->Owner, data->OwnerLen);		Obj->SyntaxLen = data->OwnerLen;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_CHANNEL *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		memcpy(data->Owner, Obj->Syntax.BufChr, Obj->SyntaxLen);		data->OwnerLen = Obj->SyntaxLen;		BooleanSetTrue(data->ObjectSet, CHANNEL_BOOLEAN_OWNER);		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapChannelStatus(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_CHANNEL *data;	local = MibRmon(Obj, channel, IdLen, INDEXSIZE);	switch (Obj->Request)	{	case SNMP_PDU_GET:		if (local == NULL)		{			Obj->Syntax.LngInt = SNMP_INVALID;			return SNMP_NOSUCHNAME;		}		data = (DNPAP_CHANNEL *) local->Data;		Obj->Syntax.LngInt = data->Status;		return SNMP_NOERROR;	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)		{			Obj->Syntax.LngInt = SNMP_INVALID;			return SNMP_NOSUCHNAME;		}		data = (DNPAP_CHANNEL *) local->Data;		Obj->Syntax.LngInt = data->Status;		return SNMP_NOERROR;	case SNMP_PDU_SET:		if (local == NULL)		{			switch (Obj->Syntax.LngInt)			{			case SNMP_CREATEREQUEST:				if ((local = MibInsert(Obj, &channel, IdLen, INDEXSIZE)) == NULL)					return SNMP_GENERROR;				if ((local->Data = DnpapMalloc(sizeof(DNPAP_CHANNEL))) == NULL)					return SNMP_GENERROR;				data = (DNPAP_CHANNEL *) local->Data;				memset(data, 0, sizeof(DNPAP_CHANNEL));				if (DnpapChannelInit(data) == TRUE)				{					data->Index = local->Index;					data->Status = SNMP_UNDERCREATION;					DnpapMessage(DMC_MESSAGE, DCHANNEL_CREATE, "channel: collector %ld created", local->Index);					return SNMP_NOERROR;				}				DnpapFree(local->Data);				MibRemove(Obj, &channel, IdLen, INDEXSIZE);				return SNMP_GENERROR;			default:				return SNMP_NOSUCHNAME;			}		}		data = (DNPAP_CHANNEL *) local->Data;		switch (data->Status)		{		case SNMP_UNDERCREATION:			switch (Obj->Syntax.LngInt)			{			case SNMP_VALID:				if (DnpapChannelStart(data) == TRUE)				{					data->Status = SNMP_VALID;					DnpapMessage(DMC_MESSAGE, DCHANNEL_ACTIVE, "channel: collector %ld active", local->Index);					return SNMP_NOERROR;				}				else					return SNMP_BADVALUE;			case SNMP_INVALID:				if (DnpapChannelStop(data) == TRUE)				{					DnpapFree(local->Data);					DnpapMessage(DMC_MESSAGE, DCHANNEL_DESTROY, "channel: collector %ld destroyed", local->Index);					if (MibRemove(Obj, &channel, IdLen, INDEXSIZE) == TRUE)						return SNMP_NOERROR;				}				return SNMP_GENERROR;			default:				return SNMP_BADVALUE;			}		case SNMP_VALID:			switch (Obj->Syntax.LngInt)			{			case SNMP_INVALID:				if (DnpapChannelStop(data) == TRUE)				{					DnpapFree(local->Data);					DnpapMessage(DMC_MESSAGE, DCHANNEL_DESTROY, "channel: collector %ld destroyed", local->Index);					if (MibRemove(Obj, &channel, IdLen, INDEXSIZE) == TRUE)						return SNMP_NOERROR;				}				return SNMP_GENERROR;			case SNMP_VALID:				return SNMP_NOERROR;			default:				return SNMP_BADVALUE;			}		}	}	return SNMP_GENERROR;}VOID DnpapChannelEventGenerated(LONG eventIndex){	MIB_LOCAL *local;	DNPAP_CHANNEL *data;	for (local = channel; local != NULL; local = local->Next)	{		data = (DNPAP_CHANNEL *) local->Data;		if (eventIndex == data->TurnOnEventIndex)			data->DataControl = 1;		if (eventIndex == data->TurnOffEventIndex)			data->DataControl = 2;	}}INT DnpapChannelType(LONG channelIndex){	MIB_LOCAL *local;	DNPAP_CHANNEL *data;	for (local = channel; local != NULL; local = local->Next)	{		if (channelIndex == local->Index)		{			data = (DNPAP_CHANNEL *) local->Data;			if (data->Status != SNMP_VALID)				break;			return (MacIfaceGet((WORD) data->IfIndex))->type;		}	}	return 0;}MAC_IFACE *DnpapChannelGetIface(LONG channelIndex){	MIB_LOCAL *local;	DNPAP_CHANNEL *data;	for (local = channel; local != NULL; local = local->Next)	{		if (channelIndex == local->Index)		{			data = (DNPAP_CHANNEL *) local->Data;			if (data->Status != SNMP_VALID)				break;			return MacIfaceGet((WORD) data->IfIndex);		}	}	return NULL;}

⌨️ 快捷键说明

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