📄 discnodm.c
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details */#include <dnpap.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <message.h>#include <mibsup.h>#include <mac.h>#include "discd.h"#include "disce.h"#include "discnodc.h"#include "discnod.h"IMPORT BOOLEAN BeholderStrictRMON;static MIB_LOCAL *DiscNodeControlInstance = NULL;static BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, INT type, WORD indexsize, DISCNODE ** elem);static DISCNODE *DiscNodeGetFirstNext(DISCNODE_CONTROL * discnodecontrol, INT type, WORD indexsize, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first);static LONG TableSize(DISCNODE_CONTROL * discnodecontrol, INT type);static INT DiscTableType(SNMP_OBJECT * obj, WORD idlen);static WORD DiscTableLen(INT type, INT addrtype, WORD * offset, WORD * sublen);BOOLEAN DiscNodeMInit(VOID){ MessageConfig(DISCNODE_ERROR, "DiscNode"); return DiscNodeConfigInit();}BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, INT type, WORD indexsize, DISCNODE ** elem){ BOOLEAN first = FALSE; if (*local == NULL || indexsize < 1) return FALSE; switch (indexsize) { case DISC_ETHNODEINDEXSIZE: case DISC_IPNODEINDEXSIZE: case DISC_UDPNODEINDEXSIZE: /* case DISC_TCPNODEINDEXSIZE: */ while (*local != NULL && (*elem = DiscNodeGetFirstNext((DISCNODE_CONTROL *) (*local)->Data, type, indexsize, obj, idlen, first)) == NULL) { first = TRUE; *local = (*local)->Next; } if (*local == NULL) return FALSE; obj->Id[idlen] = (*local)->Index; break; case DISC_ETHTIMEINDEXSIZE: /* case DISC_IPTIMEINDEXSIZE: */ /* case DISC_UDPTIMEINDEXSIZE: */ /* case DISC_TCPTIMEINDEXSIZE: */ if (obj->IdLen >= idlen + indexsize) { if (obj->Id[idlen + 1] < TableSize((DISCNODE_CONTROL *) (*local)->Data, type)) { obj->Id[idlen] = (*local)->Index; obj->Id[idlen + 1]++; obj->IdLen = idlen + DISC_ETHTIMEINDEXSIZE; *elem = DiscNodeTimeSearch((DISCNODE_CONTROL *) (*local)->Data, type, obj, idlen); break; } *local = (*local)->Next; } while (*local != NULL && TableSize(((DISCNODE_CONTROL *) (*local)->Data), type) == 0) *local = (*local)->Next; if (*local == NULL) return FALSE; obj->Id[idlen] = (*local)->Index; obj->Id[idlen + 1] = 1; obj->IdLen = idlen + DISC_ETHTIMEINDEXSIZE; *elem = DiscNodeTimeSearch((DISCNODE_CONTROL *) (*local)->Data, type, 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;}DISCNODE *DiscNodeGetFirstNext(DISCNODE_CONTROL * discnodecontrol, INT type, WORD indexsize, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first){ DISCNODE disc, *p, *lexlist = NULL; INT len, addrlen = 0; if (discnodecontrol->TableSize == 0) return NULL; switch (type) { case DISC_TYPE_ETH: lexlist = discnodecontrol->EthLexList; addrlen = DISC_SIZE_ETHADDR; break; case DISC_TYPE_IP: lexlist = discnodecontrol->IPLexList; addrlen = DISC_SIZE_TOIPADDR; break; case DISC_TYPE_UDP: lexlist = discnodecontrol->UDPLexList; addrlen = DISC_SIZE_TOUDPADDR; break; case DISC_TYPE_TCP: lexlist = discnodecontrol->TCPLexList; addrlen = DISC_SIZE_TOTCPADDR; break; default: DnpapMessage(DMC_FATAL, DISC_TYPE, "discnodecontrol: unknown type"); DnpapExit(DISC_TYPE); } if (first == TRUE) { p = lexlist; obj->IdLen = Node2Id(type, p->Address, addrlen, obj->Id, idlen + 1); return p; } len = Id2Node(type, obj->Id, idlen + 1, obj->IdLen, disc.Address); p = DiscNodeSearchNext(discnodecontrol, type, &disc, len); if (p != NULL) obj->IdLen = Node2Id(type, p->Address, addrlen, obj->Id, idlen + 1); return p;}WORD DiscNodeControlIndex(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (Obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: Obj->Syntax.LngInt = local->Index; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DiscNodeControlDataSource(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DISCNODE_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, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (Obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DISCNODE_CONTROL *) local->Data; if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, DISC_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 = (DISCNODE_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, DISC_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, DISC_BOOLEAN_DATASOURCE); return SNMP_NOERROR; } return SNMP_BADVALUE; } return SNMP_GENERROR;}WORD DiscNodeControlEthTableSize(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DISCNODE_CONTROL *data; if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (Obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DISCNODE_CONTROL *) local->Data; Obj->Syntax.LngInt = data->EthTableSize; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DiscNodeControlIPTableSize(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DISCNODE_CONTROL *data; if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (Obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DISCNODE_CONTROL *) local->Data; Obj->Syntax.LngInt = data->IPTableSize; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DiscNodeControlUDPTableSize(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DISCNODE_CONTROL *data; if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (Obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DISCNODE_CONTROL *) local->Data; Obj->Syntax.LngInt = data->UDPTableSize; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DiscNodeControlTCPTableSize(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DISCNODE_CONTROL *data; if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (Obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DISCNODE_CONTROL *) local->Data; Obj->Syntax.LngInt = data->TCPTableSize; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DiscNodeControlTableSize(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DISCNODE_CONTROL *data; if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (Obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DISCNODE_CONTROL *) local->Data; Obj->Syntax.LngInt = data->TableSize; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DiscNodeControlLastDeleteTime(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DISCNODE_CONTROL *data; if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (Obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DISCNODE_CONTROL *) local->Data; Obj->Syntax.LngUns = data->LastDeleteTime; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DiscNodeControlOwner(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DISCNODE_CONTROL *data; if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (Obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DISCNODE_CONTROL *) local->Data; if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, DISC_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 = (DISCNODE_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, DISC_BOOLEAN_OWNER); return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DiscNodeControlStatus(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DISCNODE_CONTROL *data; local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE); switch (Obj->Request) { case SNMP_PDU_GET: if (local == NULL) { Obj->Syntax.LngInt = SNMP_INVALID; return SNMP_NOSUCHNAME; } data = (DISCNODE_CONTROL *) local->Data; Obj->Syntax.LngInt = data->Status; return SNMP_NOERROR; case SNMP_PDU_NEXT: if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE) { Obj->Syntax.LngInt = SNMP_INVALID; return SNMP_NOSUCHNAME; } data = (DISCNODE_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, &DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL) return SNMP_GENERROR; if ((local->Data = DnpapMalloc(sizeof(DISCNODE_CONTROL))) == NULL) return SNMP_GENERROR; data = (DISCNODE_CONTROL *) local->Data; if (DiscNodeCInit(data) == TRUE) { data->Status = SNMP_UNDERCREATION; DnpapMessage(DMC_MESSAGE, DISC_CREATE, "discnode: collector %ld created", local->Index); return SNMP_NOERROR; } DnpapFree(local->Data); MibRemove(Obj, &DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE); return SNMP_GENERROR; default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -