📄 dstatm.c
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details */#include <math.h>#include <memory.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <snmp.h>#include <mibsup.h>#include <message.h>#include <mac.h>#include "dstate.h"#include "dstatc.h"#include "dstat.h"IMPORT BOOLEAN BeholderStrictRMON;#define INDEXSIZE 1#define IFTINDEXSIZE 2#define LENGTHINDEXSIZE 3 /* not the real size, only needed for switch */#define TYPEINDEXSIZE 4 /* not the real size, only needed for switch */static MIB_LOCAL *etherStats = NULL;static BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, TypeEntry **entry);BOOLEAN DnpapEtherStatsMInit(VOID){ MessageConfig(DNPAP_STATISTICS_ERROR, "DnpapEtherStat"); return TRUE;}BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, TypeEntry **entry){ DNPAP_ETHER_STATS *data; if (*local == NULL || indexsize < 1) return FALSE; switch (indexsize) { case TYPEINDEXSIZE: if (obj->IdLen >= idlen + 2) { data = (DNPAP_ETHER_STATS *) (*local)->Data; if (data->Status == SNMP_VALID && data->TypeBuckets > 0 && obj->Id[idlen + 1] < data->TypeLast->Type) { if ((*entry = DnpapNextTypeEntry(data, obj->Id[idlen + 1])) == NULL) return FALSE; obj->Id[idlen] = (*local)->Index; obj->Id[idlen + 1] = (*entry)->Type; obj->IdLen = idlen + 2; break; } *local = (*local)->Next; } while (*local != NULL && (((DNPAP_ETHER_STATS *) (*local)->Data)->Status != SNMP_VALID || ((DNPAP_ETHER_STATS *) (*local)->Data)->TypeBuckets == 0)) *local = (*local)->Next; if (*local == NULL) return FALSE; obj->Id[idlen] = (*local)->Index; obj->Id[idlen + 1] = ((DNPAP_ETHER_STATS *)(*local)->Data)->TypeList->Type; obj->IdLen = idlen + 2; break; case LENGTHINDEXSIZE: if (obj->IdLen >= idlen + 2) { data = (DNPAP_ETHER_STATS *) (*local)->Data; if (data->Status == SNMP_VALID && obj->Id[idlen + 1] < data->LengthBuckets) { obj->Id[idlen] = (*local)->Index; obj->Id[idlen + 1]++; obj->IdLen = idlen + 2; break; } *local = (*local)->Next; } while (*local != NULL && (((DNPAP_ETHER_STATS *) (*local)->Data)->Status != SNMP_VALID || ((DNPAP_ETHER_STATS *) (*local)->Data)->LengthBuckets == 0)) *local = (*local)->Next; if (*local == NULL) return FALSE; obj->Id[idlen] = (*local)->Index; obj->Id[idlen + 1] = 1; obj->IdLen = idlen + 2; break; case IFTINDEXSIZE: if (obj->IdLen >= idlen + indexsize) { data = (DNPAP_ETHER_STATS *) (*local)->Data; if (data->Status == SNMP_VALID && obj->Id[idlen + 1] < data->IFTBuckets) { obj->Id[idlen] = (*local)->Index; obj->Id[idlen + 1]++; obj->IdLen = idlen + IFTINDEXSIZE; break; } *local = (*local)->Next; } while (*local != NULL && (((DNPAP_ETHER_STATS *) (*local)->Data)->Status != SNMP_VALID || ((DNPAP_ETHER_STATS *) (*local)->Data)->IFTBuckets == 0)) *local = (*local)->Next; if (*local == NULL) return FALSE; obj->Id[idlen] = (*local)->Index; obj->Id[idlen + 1] = 1; obj->IdLen = idlen + IFTINDEXSIZE; break; case INDEXSIZE: 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 + INDEXSIZE; break; } return TRUE;}WORD DnpapEtherStatsIndex(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; if ((local = MibRmon(Obj, etherStats, 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 DnpapEtherStatsDataSource(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; MAC_IFACE *iface; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, STAT_BOOLEAN_DATASOURCE)) return SNMP_NOSUCHNAME; memcpy(Obj->Syntax.BufInt, data->Source, data->SourceLen * sizeof(LONG)); Obj->SyntaxLen = data->SourceLen; return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_ETHER_STATS *) local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; if (data->SourceLen != Obj->SyntaxLen || memcmp(data->Source, Obj->Syntax.BufInt, (data->SourceLen - 1) * sizeof(data->Source[0]))) return SNMP_BADVALUE; 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, STAT_BOOLEAN_DATASOURCE); return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapEtherStatsDropEvents(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; MAC_STAT stat; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; if (data->Status != SNMP_VALID) { Obj->Syntax.LngUns = 0UL; return SNMP_NOERROR; } MacStatistics(data->Iface, &stat); Obj->Syntax.LngUns = stat.LostPkts + stat.DiscardedPkts - (data->BaseStat.LostPkts + data->BaseStat.DiscardedPkts); return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapEtherStatsOctets(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; Obj->Syntax.LngUns = data->Octets; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapEtherStatsPkts(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; Obj->Syntax.LngUns = data->Pkts; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapEtherStatsBroadcastPkts(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; MAC_STAT stat; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; if (data->Status != SNMP_VALID) { Obj->Syntax.LngUns = 0UL; return SNMP_NOERROR; } MacStatistics(data->Iface, &stat); Obj->Syntax.LngUns = stat.BroadcastPkts - data->BaseStat.BroadcastPkts; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapEtherStatsMulticastPkts(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; MAC_STAT stat; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; if (data->Status != SNMP_VALID) { Obj->Syntax.LngUns = 0UL; return SNMP_NOERROR; } MacStatistics(data->Iface, &stat); Obj->Syntax.LngUns = stat.MulticastPkts - data->BaseStat.MulticastPkts; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapEtherStatsCRCAlignErrors(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; MAC_STAT stat; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; if (data->Status != SNMP_VALID) { Obj->Syntax.LngUns = 0UL; return SNMP_NOERROR; } MacStatistics(data->Iface, &stat); Obj->Syntax.LngUns = stat.CRCAlignErrors - data->BaseStat.CRCAlignErrors; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapEtherStatsUndersizePkts(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; MAC_STAT stat; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; if (data->Status != SNMP_VALID) { Obj->Syntax.LngUns = 0UL; return SNMP_NOERROR; } MacStatistics(data->Iface, &stat); Obj->Syntax.LngUns = stat.UndersizePkts - data->BaseStat.UndersizePkts; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapEtherStatsOversizePkts(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; MAC_STAT stat; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; if (data->Status != SNMP_VALID) { Obj->Syntax.LngUns = 0UL; return SNMP_NOERROR; } MacStatistics(data->Iface, &stat); Obj->Syntax.LngUns = stat.OversizePkts - data->BaseStat.OversizePkts; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapEtherStatsFragments(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; MAC_STAT stat; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; if (data->Status != SNMP_VALID) { Obj->Syntax.LngUns = 0UL; return SNMP_NOERROR; } MacStatistics(data->Iface, &stat); Obj->Syntax.LngUns = stat.Fragments - data->BaseStat.Fragments; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapEtherStatsJabbers(SNMP_OBJECT * Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_ETHER_STATS *data; MAC_STAT stat; if ((local = MibRmon(Obj, etherStats, 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_ETHER_STATS *) local->Data; if (data->Status != SNMP_VALID)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -