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

📄 hostm.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details   */#include <dnpap.h>#include <config.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <message.h>#include <mibsup.h>#include <mibrqs.h>#include <mac.h>#include "hoste.h"#include "hostc.h"#include "host.h"IMPORT BOOLEAN BeholderStrictRMON;#define CONTROLINDEXSIZE   1#define HOSTINDEXSIZE      7			/* not the real size, only used as switch value */#define TIMEINDEXSIZE      2static MIB_LOCAL *HostControlInstance = NULL;static MIB_LOCAL *HostMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen);static BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, HOST ** elem);static HOST *HostGetFirstNext(HOST_CONTROL * hostcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first);BOOLEAN HostMInit(VOID){LONG i, nriface;CHAR s[81];BOOLEAN v;MAC_IFACE *iface;LONG hostsource[] = {1,3,6,1,2,1,2,2,1,1,1};CHAR hostowner[] = "monitorHost";#define STATUSINDEX     11SNMP_OBJECT hostobj[] = {    { SNMP_PDU_SET, {1,3,6,1,2,1,16,4,1,1,6,1}, 12, SNMP_INTEGER },    { SNMP_PDU_SET, {1,3,6,1,2,1,16,4,1,1,5,1}, 12, SNMP_DISPLAYSTR },    { SNMP_PDU_SET, {1,3,6,1,2,1,16,4,1,1,2,1}, 12, SNMP_OBJECTID }};	MessageConfig(HOST_ERROR, "Host");	if (HostConfigInit() == FALSE)		return FALSE;    nriface = (LONG)MacIfaceCount();    for (i = 1; i <= nriface; i++)    {        sprintf(s, "beholder.host.iface.%ld", i);        if (ConfigGetBoolean(s, &v) == TRUE)        {            iface = MacIfaceGet((WORD)i);            if (iface != NULL && v == TRUE &&                (iface->type == MAC_TYPE_ETHERNET_CSMACD ||                 iface->type == MAC_TYPE_88023_CSMACD))            {                hostobj[0].Id[STATUSINDEX] = i;                hostobj[1].Id[STATUSINDEX] = i;                hostobj[2].Id[STATUSINDEX] = i;                hostobj[0].Syntax.LngInt = SNMP_INVALID;                MibRequest(&hostobj[0]);                hostobj[0].Syntax.LngInt = SNMP_CREATEREQUEST;                if (MibRequest(&hostobj[0]) != SNMP_NOERROR)                {                    DnpapMessage(DMC_WARNING, HOST_HOSTINIT, "host: couldn't create host collector %ld", i);                    continue;                }                strncpy(hostobj[1].Syntax.BufChr, hostowner, hostobj[1].SyntaxLen = strlen(hostowner));                if (MibRequest(&hostobj[1]) != SNMP_NOERROR)                {                    DnpapMessage(DMC_WARNING, HOST_HOSTINIT, "host: couldn't set owner of host collector %ld", i);                    hostobj[0].Syntax.LngInt = SNMP_INVALID;                    MibRequest(&hostobj[0]);                    continue;                }                memcpy(hostobj[2].Syntax.BufInt, hostsource, sizeof(hostsource));                hostobj[2].Syntax.BufInt[sizeof(hostsource)/sizeof(hostsource[0])-1] = i;                hostobj[2].SyntaxLen = sizeof(hostsource)/sizeof(hostsource[0]);                if (MibRequest(&hostobj[2]) != SNMP_NOERROR)                {                    DnpapMessage(DMC_WARNING, HOST_HOSTINIT, "host: couldn't set datasource of host collector %ld", i);                    hostobj[0].Syntax.LngInt = SNMP_INVALID;                    MibRequest(&hostobj[0]);                    continue;                }                hostobj[0].Syntax.LngInt = SNMP_VALID;                if (MibRequest(&hostobj[0]) != SNMP_NOERROR)                {                    DnpapMessage(DMC_WARNING, HOST_HOSTINIT, "host: couldn't set host collector %ld to valid", i);                    hostobj[0].Syntax.LngInt = SNMP_INVALID;                    MibRequest(&hostobj[0]);                    continue;                }            }        }    }	return TRUE;}MIB_LOCAL *HostMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen){	WORD addrlen;	if (local == NULL)		return NULL;	if (obj->Request != SNMP_PDU_NEXT)	{		if (obj->IdLen == idlen)			return NULL;		/* first search the right table */		while (local != NULL && local->Index < obj->Id[idlen])			local = local->Next;		if (local == NULL)			return NULL;		addrlen = ((HOST_CONTROL *) local->Data)->AddressLen;		if (local->Index != obj->Id[idlen] || addrlen == 0)			return NULL;		if (obj->IdLen != idlen + 1 + 1 + addrlen ||			obj->Id[idlen + 1] != addrlen)			return NULL;		return local;	}	if (obj->IdLen == idlen)			/* first instance */		return local;	while (local != NULL && local->Index < obj->Id[idlen])		local = local->Next;	if (local == NULL || local->Index < obj->Id[idlen])		return NULL;	return local;}BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, HOST ** elem){	BOOLEAN first = FALSE;	if (*local == NULL || indexsize < 1)		return FALSE;	switch (indexsize)	{	case HOSTINDEXSIZE:		while (*local != NULL && (*elem = HostGetFirstNext((HOST_CONTROL *) (*local)->Data, obj, idlen, first)) == NULL)		{			first = TRUE;			*local = (*local)->Next;		}		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		break;	case TIMEINDEXSIZE:	    if (obj->IdLen >= idlen + indexsize)		{			if (obj->Id[idlen + 1] < ((HOST_CONTROL *) (*local)->Data)->TableSize)			{				obj->Id[idlen] = (*local)->Index;				obj->Id[idlen + 1]++;				obj->IdLen = idlen + TIMEINDEXSIZE;				*elem = HostTimeSearch((HOST_CONTROL *) (*local)->Data, obj, idlen);				break;			}			*local = (*local)->Next;		}		while (*local != NULL && ((HOST_CONTROL *) (*local)->Data)->TableSize == 0)			*local = (*local)->Next;		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		obj->Id[idlen + 1] = 1;		obj->IdLen = idlen + TIMEINDEXSIZE;		*elem = HostTimeSearch((HOST_CONTROL *) (*local)->Data, obj, idlen);		break;	case CONTROLINDEXSIZE:	    if (obj->IdLen >= idlen + indexsize)		{			/* only go to next collector if requested index was higher or equal */			if (obj->Id[idlen] >= (*local)->Index)				*local = (*local)->Next;			if (*local == NULL)				return FALSE;		}		obj->Id[idlen] = (*local)->Index;		obj->IdLen = idlen + CONTROLINDEXSIZE;		break;	}	return TRUE;}HOST *HostGetFirstNext(HOST_CONTROL * hostcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first){	HOST host, *p;	INT i, len;	WORD addrlen = hostcontrol->AddressLen;	if (hostcontrol->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)	{		p = hostcontrol->LexList;		for (i = 0; i < addrlen; i++)			obj->Id[idlen + 2 + i] = (LONG) p->Address[i];		obj->Id[idlen + 1] = addrlen;		obj->IdLen = idlen + 1 + 1 + addrlen;		return p;	}	len = obj->IdLen - idlen - 2;	if (len < 0)		len = 0;	else if (len > addrlen)		len = addrlen;	for (i = 0; i < len; i++)		host.Address[i] = (BYTE) obj->Id[idlen + 2 + i];	p = HostSearchNext(hostcontrol, &host, len);	if (p != NULL)	{		for (i = 0; i < addrlen; i++)			obj->Id[idlen + 2 + i] = (LONG) p->Address[i];		obj->Id[idlen + 1] = addrlen;		obj->IdLen = idlen + 1 + 1 + addrlen;	}	return p;}WORD hostControlIndex(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	if ((local = MibRmon(Obj, HostControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		Obj->Syntax.LngInt = local->Index;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD hostControlDataSource(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	HOST_CONTROL *data;	MAC_IFACE *iface;	LONG IfaceOid[] =	{1, 3, 6, 1, 2, 1, 2, 2, 1, 1, 1};	WORD IfaceOidLen = sizeof(IfaceOid) / sizeof(LONG);	LONG ChannelOid[] =	{1, 3, 6, 1, 2, 1, 16, 7, 2, 1, 1, 1};	WORD ChannelOidLen = sizeof(ChannelOid) / sizeof(LONG);	if ((local = MibRmon(Obj, HostControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (HOST_CONTROL *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, HOST_BOOLEAN_DATASOURCE))			return SNMP_NOSUCHNAME;		memcpy(Obj->Syntax.BufInt, data->Source, data->SourceLen * sizeof(data->Source[0]));		Obj->SyntaxLen = data->SourceLen;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (HOST_CONTROL *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		if (IfaceOidLen == Obj->SyntaxLen &&			memcmp(IfaceOid, Obj->Syntax.BufInt, (IfaceOidLen - 1) * sizeof(IfaceOid[0])) == 0)		{			data->Channel = FALSE;			if ((iface = MacIfaceGet((WORD) Obj->Syntax.BufInt[Obj->SyntaxLen - 1])) == NULL)				return SNMP_BADVALUE;			if (iface->type != MAC_TYPE_ETHERNET_CSMACD && iface->type != MAC_TYPE_88023_CSMACD)				return SNMP_BADVALUE;			memcpy(data->Source, Obj->Syntax.BufInt, Obj->SyntaxLen * sizeof(data->Source[0]));			data->SourceLen = Obj->SyntaxLen;			data->Iface = iface;			BooleanSetTrue(data->ObjectSet, HOST_BOOLEAN_DATASOURCE);			return SNMP_NOERROR;		}		else if (ChannelOidLen == Obj->SyntaxLen &&				 memcmp(ChannelOid, Obj->Syntax.BufInt, (ChannelOidLen - 1) * sizeof(ChannelOid[0])) == 0)		{			data->Channel = TRUE;			memcpy(data->Source, Obj->Syntax.BufInt, Obj->SyntaxLen * sizeof(data->Source[0]));			data->SourceLen = Obj->SyntaxLen;			BooleanSetTrue(data->ObjectSet, HOST_BOOLEAN_DATASOURCE);			return SNMP_NOERROR;		}		return SNMP_BADVALUE;	}	return SNMP_GENERROR;}WORD hostControlTableSize(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	HOST_CONTROL *data;	if ((local = MibRmon(Obj, HostControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (HOST_CONTROL *) local->Data;		Obj->Syntax.LngInt = data->TableSize;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD hostControlLastDeleteTime(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	HOST_CONTROL *data;	if ((local = MibRmon(Obj, HostControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (HOST_CONTROL *) local->Data;		Obj->Syntax.LngUns = data->LastDeleteTime;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD hostControlOwner(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	HOST_CONTROL *data;	if ((local = MibRmon(Obj, HostControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (HOST_CONTROL *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, HOST_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 = (HOST_CONTROL *) 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, HOST_BOOLEAN_OWNER);		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD hostControlStatus(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	HOST_CONTROL *data;	local = MibRmon(Obj, HostControlInstance, IdLen, CONTROLINDEXSIZE);	switch (Obj->Request)	{	case SNMP_PDU_GET:		if (local == NULL)		{			Obj->Syntax.LngInt = SNMP_INVALID;			return SNMP_NOSUCHNAME;		}		data = (HOST_CONTROL *) local->Data;		Obj->Syntax.LngInt = data->Status;		return SNMP_NOERROR;	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, CONTROLINDEXSIZE, NULL) == FALSE)		{			Obj->Syntax.LngInt = SNMP_INVALID;			return SNMP_NOSUCHNAME;		}		data = (HOST_CONTROL *) 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, &HostControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)					return SNMP_GENERROR;				if ((local->Data = DnpapMalloc(sizeof(HOST_CONTROL))) == NULL)					return SNMP_GENERROR;				data = (HOST_CONTROL *) local->Data;				if (HostCInit(data) == TRUE)				{					data->Index = local->Index;					data->Status = SNMP_UNDERCREATION;					DnpapMessage(DMC_MESSAGE, HOST_CREATE, "host: collector %ld created", local->Index);					return SNMP_NOERROR;				}				DnpapFree(local->Data);				MibRemove(Obj, &HostControlInstance, IdLen, CONTROLINDEXSIZE);				return SNMP_GENERROR;			default:				return SNMP_NOSUCHNAME;			}		}		data = (HOST_CONTROL *) local->Data;		switch (data->Status)		{		case SNMP_UNDERCREATION:			switch (Obj->Syntax.LngInt)			{			case SNMP_VALID:				if (HostCStart(data) == TRUE)				{					data->Status = SNMP_VALID;					DnpapMessage(DMC_MESSAGE, HOST_START, "host: collector %ld active", local->Index);					return SNMP_NOERROR;				}				return SNMP_BADVALUE;			case SNMP_INVALID:				if (HostCStop(data) == TRUE)				{					DnpapFree(local->Data);					DnpapMessage(DMC_MESSAGE, HOST_DESTROY, "host: collector %ld destroyed", local->Index);					if (MibRemove(Obj, &HostControlInstance, IdLen, CONTROLINDEXSIZE) == TRUE)						return SNMP_NOERROR;				}				return SNMP_GENERROR;			default:				return SNMP_BADVALUE;			}		case SNMP_VALID:			switch (Obj->Syntax.LngInt)			{			case SNMP_VALID:				return SNMP_NOERROR;			case SNMP_INVALID:				if (HostCStop(data) == TRUE)

⌨️ 快捷键说明

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