📄 dchanm.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 + -