📄 dfilterm.c
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details */#include <limits.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <memory.h>#include <mibsup.h>#include <message.h>#include <protocol.h>#include "dfiltere.h"#include "dfilterc.h"#include "dfilter.h"IMPORT BOOLEAN BeholderStrictRMON;#define INDEXSIZE 1static MIB_LOCAL *filter = NULL;static BOOLEAN RmonNext (SNMP_OBJECT *Obj, MIB_LOCAL **Local, WORD IdLen, WORD IdSze, DNPAP_FILTER **Elm);BOOLEAN DnpapFilterMInit(VOID){ MessageConfig(DNPAP_FILTER_ERROR, "DnpapFilter"); return TRUE;}/******************************************************************* NAME: RmonNext** SYNOPSIS: BOOLEAN RmonNext (SNMP_OBJECT *Obj,** MIB_LOCAL **Local, WORD IdLen,** WORD IdSze, VOID **Elm)** PARAMETERS: Obj: requested object** Local: local datastructure: a collector** IdLen: identifier length known to the MIB** IdSze: size part application of identifier** including the collector index !!** Elm: pointer to object if tables are used** DESCRIPTION: application specific RMON NEXT function.** only called after MibRmon() for next requests ** searches the next object in the collector** REMARKS: ONLY FOR INTERNAL USE** RETURNS: TRUE: object found** OPTIONAL: Elm -> pointer to object in table*******************************************************************/static BOOLEAN RmonNext(SNMP_OBJECT *Obj, MIB_LOCAL **Local, WORD IdLen, WORD IdSze, DNPAP_FILTER **Elm){ MIB_LOCAL *local = *Local; if (local == NULL) return FALSE; if (Obj->IdLen == IdLen || local->Index > Obj->Id[IdLen]) { /******************************************************************** ** OPTIONAL: search function to find first obj in a table !! ** if (not found) ** search next collector ** adjust object identifier to identifier first object ** Elm -> found table obj ********************************************************************/ Obj->IdLen = IdLen + IdSze; Obj->Id[IdLen] = local->Index; return TRUE; } /******************************************************************** ** OPTIONAL: search function to find next obj in a table !! ** if (found) ** adjust object identifier to identifier next object ** Elm -> found table obj ** return TRUE ********************************************************************/ *Local = local->Next; return (RmonNext(Obj, Local, IdLen, IdSze, Elm));}WORD DnpapFilterIndex(SNMP_OBJECT *Obj, WORD IdLen){ MIB_LOCAL *local = NULL; if ((local = MibRmon (Obj, filter, 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; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD DnpapFilterChannelIndex(SNMP_OBJECT *Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_FILTER *data; if ((local = MibRmon(Obj, filter, 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_FILTER*) local->Data; if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, FILTER_BOOLEAN_CHANNEL)) return SNMP_NOSUCHNAME; Obj->Syntax.LngInt = data->Channel; return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_FILTER*) local->Data; data->Channel = Obj->Syntax.LngInt; BooleanSetTrue(data->ObjectSet, FILTER_BOOLEAN_CHANNEL); return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapFilterPktDataOffset(SNMP_OBJECT *Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_FILTER *data; if ((local = MibRmon(Obj, filter, 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_FILTER*) local->Data; Obj->Syntax.LngInt = data->PktDataOffset; return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_FILTER*) local->Data; if (Obj->Syntax.LngInt < 0) return SNMP_BADVALUE; data->PktDataOffset = Obj->Syntax.LngInt; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapFilterPktData(SNMP_OBJECT *Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_FILTER *data; BYTE *datap, *maskp, *notp; WORD i; if ((local = MibRmon(Obj, filter, 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_FILTER*) local->Data; memcpy(Obj->Syntax.BufChr, data->PktData, Obj->SyntaxLen = data->PktDataLen); return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_FILTER*) local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; if (Obj->SyntaxLen > SNMP_SIZE_BUFCHR) return SNMP_BADVALUE; if ((datap = DnpapRealloc(data->PktData, Obj->SyntaxLen)) == NULL) return SNMP_GENERROR; if ((maskp = DnpapRealloc(data->PktDataMask, Obj->SyntaxLen)) == NULL) { DnpapFree(datap); return SNMP_GENERROR; } if ((notp = DnpapRealloc(data->PktDataNotMask, Obj->SyntaxLen)) == NULL) { DnpapFree(datap); DnpapFree(maskp); return SNMP_GENERROR; } data->PktData = datap; data->PktDataMask = maskp; data->PktDataNotMask = notp; for (i = data->PktDataMaskLen; i < Obj->SyntaxLen; i++) data->PktDataMask[i] = 0xff; if (Obj->SyntaxLen < data->PktDataMaskLen) data->PktDataMaskLen = Obj->SyntaxLen; for (i = data->PktDataNotMaskLen; i < Obj->SyntaxLen; i++) data->PktDataNotMask[i] = 0x00; if (Obj->SyntaxLen < data->PktDataNotMaskLen) data->PktDataNotMaskLen = Obj->SyntaxLen; memcpy(data->PktData, Obj->Syntax.BufChr, data->PktDataLen = Obj->SyntaxLen); return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapFilterPktDataMask(SNMP_OBJECT *Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_FILTER *data; WORD i; if ((local = MibRmon(Obj, filter, 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_FILTER*) local->Data; memcpy(Obj->Syntax.BufChr, data->PktDataMask, Obj->SyntaxLen = data->PktDataMaskLen); return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_FILTER*) local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; if (Obj->SyntaxLen > SNMP_SIZE_BUFCHR || Obj->SyntaxLen > data->PktDataLen) return SNMP_BADVALUE; memcpy(data->PktDataMask, Obj->Syntax.BufChr, Obj->SyntaxLen); for (i = Obj->SyntaxLen; i < data->PktDataLen; i++) data->PktDataMask[i] = 0xff; data->PktDataMaskLen = Obj->SyntaxLen; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapFilterPktDataNotMask(SNMP_OBJECT *Obj, WORD IdLen){ MIB_LOCAL *local = NULL; DNPAP_FILTER *data; WORD i; if ((local = MibRmon(Obj, filter, 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_FILTER*) local->Data; memcpy(Obj->Syntax.BufChr, data->PktDataNotMask, Obj->SyntaxLen = data->PktDataNotMaskLen); return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_FILTER*) local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; if (Obj->SyntaxLen > SNMP_SIZE_BUFCHR || Obj->SyntaxLen > data->PktDataLen) return SNMP_BADVALUE; memcpy(data->PktDataNotMask, Obj->Syntax.BufChr, Obj->SyntaxLen); for (i = Obj->SyntaxLen; i < data->PktDataLen; i++) data->PktDataNotMask[i] = 0x00; data->PktDataNotMaskLen = Obj->SyntaxLen; return SNMP_NOERROR; } return SNMP_GENERROR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -