📄 dmatrixm.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 <memory.h>#include <mibsup.h>#include <mac.h>#include "dmatrixd.h"#include "dmatrixe.h"#include "dmatrixc.h"#include "dmatrix.h"IMPORT BOOLEAN BeholderStrictRMON;#define CONTROLINDEXSIZE 1#define SRCDSTINDEXSIZE 13 /* not the real size, only used as switch value */#define RANKINDEXSIZE 8static MIB_LOCAL *MatrixControlInstance = NULL;static MIB_LOCAL *DnpapMatrixMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen);static MIB_LOCAL *DnpapMatrixRankMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen);static BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, ConnInfo ** elem, BOOLEAN SDorder, Host ** source, Host ** dest, INT * rank);static ConnInfo *SrcDstGetFirstNext(DNPAP_MATRIX_CONTROL * matrixcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first, BOOLEAN SDorder, Host ** source, Host ** dest, INT * rank);static ConnInfo *GetTopFirstNext(DNPAP_MATRIX_CONTROL * matrixcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first, BOOLEAN SDorder, Host ** source, Host ** dest, INT * rank);BOOLEAN DnpapMatrixMInit(VOID){ MessageConfig(DNPAP_MATRIX_ERROR, "DnpapMatrix"); return DnpapMatrixConfigInit();}MIB_LOCAL *DnpapMatrixMibRmon(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 = ((DNPAP_MATRIX_CONTROL *) local->Data)->AddressLen; if (local->Index != obj->Id[idlen] || addrlen == 0) return NULL; if (obj->IdLen != idlen + 1 + 2 + 2 * addrlen || obj->Id[idlen + 1] != addrlen || obj->Id[idlen + 1 + addrlen + 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;}MIB_LOCAL *DnpapMatrixRankMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen){ WORD addrlen; if (local == NULL) return NULL; if (obj->Request != SNMP_PDU_NEXT) { /* first search the right table */ while (local != NULL && local->Index < obj->Id[idlen]) local = local->Next; if (local == NULL) return NULL; addrlen = ((DNPAP_MATRIX_CONTROL *) local->Data)->AddressLen; if (local->Index != obj->Id[idlen] || addrlen == 0) return NULL; if (obj->IdLen != idlen + 1 + 1 + addrlen + 1 || 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, ConnInfo ** elem, BOOLEAN SDorder, Host ** source, Host ** dest, INT * rank){ BOOLEAN first = FALSE; if (*local == NULL || indexsize < 1) return FALSE; switch (indexsize) { case SRCDSTINDEXSIZE: while (*local != NULL && (*elem = SrcDstGetFirstNext((DNPAP_MATRIX_CONTROL *) (*local)->Data, obj, idlen, first, SDorder, source, dest, rank)) == NULL) { first = TRUE; *local = (*local)->Next; } if (*local == NULL) return FALSE; obj->Id[idlen] = (*local)->Index; break; case RANKINDEXSIZE: while (*local != NULL && (*elem = GetTopFirstNext((DNPAP_MATRIX_CONTROL *) (*local)->Data, obj, idlen, first, SDorder, source, dest, rank)) == NULL) { first = TRUE; *local = (*local)->Next; } if (*local == NULL) return FALSE; obj->Id[idlen] = (*local)->Index; 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;}WORD DnpapMatrixControlIndex(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; Host *source = NULL; Host *dest = NULL; if ((local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, 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 DnpapMatrixControlDataSource(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; DNPAP_MATRIX_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, 4, 1, 464, 2, 7, 2, 1, 1, 1}; WORD ChannelOidLen = sizeof(ChannelOid) / sizeof(LONG); Host *source = NULL; Host *dest = NULL; if ((local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_MATRIX_CONTROL *) local->Data; if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, MATRIX_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 = (DNPAP_MATRIX_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, MATRIX_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, MATRIX_BOOLEAN_DATASOURCE); return SNMP_NOERROR; } return SNMP_BADVALUE; } return SNMP_GENERROR;}WORD DnpapMatrixControlTableSize(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; DNPAP_MATRIX_CONTROL *data; Host *source = NULL; Host *dest = NULL; if ((local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_MATRIX_CONTROL *) local->Data; obj->Syntax.LngInt = data->TableSize; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD DnpapMatrixControlLastDelTime(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; DNPAP_MATRIX_CONTROL *data; Host *source = NULL; Host *dest = NULL; if ((local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_MATRIX_CONTROL *) local->Data; obj->Syntax.LngUns = data->LastDeleteTime; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD DnpapMatrixControlOwner(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; DNPAP_MATRIX_CONTROL *data; Host *source = NULL; Host *dest = NULL; if ((local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_MATRIX_CONTROL *) local->Data; if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, MATRIX_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_MATRIX_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, MATRIX_BOOLEAN_OWNER); return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapMatrixControlStatus(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; DNPAP_MATRIX_CONTROL *data; Host *source = NULL; Host *dest = NULL; local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE); switch (obj->Request) { case SNMP_PDU_GET: if (local == NULL) { obj->Syntax.LngInt = SNMP_INVALID; return SNMP_NOSUCHNAME; } data = (DNPAP_MATRIX_CONTROL *) local->Data; obj->Syntax.LngInt = data->Status; return SNMP_NOERROR; case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, NULL) == FALSE) { obj->Syntax.LngInt = SNMP_INVALID; return SNMP_NOSUCHNAME; } data = (DNPAP_MATRIX_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, &MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_GENERROR; if ((local->Data = DnpapMalloc(sizeof(DNPAP_MATRIX_CONTROL))) == NULL) return SNMP_GENERROR; data = (DNPAP_MATRIX_CONTROL *) local->Data; memset(data, 0, sizeof(DNPAP_MATRIX_CONTROL)); if (DnpapMatrixCInit(data) == TRUE) { data->Status = SNMP_UNDERCREATION; DnpapMessage(DMC_MESSAGE, DMATRIX_CREATE, "dmatrix: collector %ld created", local->Index); return SNMP_NOERROR; } DnpapFree(local->Data); MibRemove(obj, &MatrixControlInstance, idlen, CONTROLINDEXSIZE); return SNMP_GENERROR; default: return SNMP_NOSUCHNAME; } } data = (DNPAP_MATRIX_CONTROL *) local->Data; switch (data->Status) { case SNMP_UNDERCREATION: switch (obj->Syntax.LngInt) { case SNMP_VALID: if (DnpapMatrixCStart(data) == TRUE) { data->Status = SNMP_VALID; DnpapMessage(DMC_MESSAGE, DMATRIX_START, "dmatrix: collector %ld active", local->Index); return SNMP_NOERROR; } return SNMP_BADVALUE; case SNMP_INVALID: if (DnpapMatrixCStop(data) == TRUE) { DnpapFree(local->Data); DnpapMessage(DMC_MESSAGE, DMATRIX_DESTROY, "dmatrix: collector %ld destroyed", local->Index); if (MibRemove(obj, &MatrixControlInstance, 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 (DnpapMatrixCStop(data) == TRUE) { DnpapFree(local->Data); DnpapMessage(DMC_MESSAGE, DMATRIX_DESTROY, "dmatrix: collector %ld destroyed", local->Index); if (MibRemove(obj, &MatrixControlInstance, idlen, CONTROLINDEXSIZE) == TRUE) return SNMP_NOERROR; } return SNMP_GENERROR; default: return SNMP_BADVALUE; } } } return SNMP_GENERROR;}WORD DnpapMatrixSDSourceAddress(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; ConnInfo *data = NULL; INT rank = 0; Host *source = NULL; Host *dest = NULL; if ((local = DnpapMatrixMibRmon(obj, MatrixControlInstance, idlen)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, SRCDSTINDEXSIZE, &data, TRUE, &source, &dest, &rank) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: if (data == NULL && (data = DnpapMatrixSearchHostObj(local->Data, obj, idlen, TRUE, &source, &rank)) == NULL) return SNMP_NOSUCHNAME; memcpy(obj->Syntax.BufChr, source->Addr, obj->SyntaxLen = ((DNPAP_MATRIX_CONTROL *) local->Data)->AddressLen); return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -