📄 matrix_m.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 <config.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <memory.h>#include <message.h>#include <mibsup.h>#include <mibrqs.h>#include <mac.h>#include "matrix_d.h"#include "matrix_e.h"#include "matrix_c.h"#include "matrix.h"IMPORT BOOLEAN BeholderStrictRMON;#define CONTROLINDEXSIZE 1#define SRCDSTINDEXSIZE 13 /* not the real size, only used as switch value */static MIB_LOCAL *MatrixControlInstance = NULL;static MIB_LOCAL *MatrixMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen);static BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, SRCDST ** elem, BOOLEAN SDorder);static SRCDST *SrcDstGetFirstNext(MATRIX_CONTROL * matrixcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first, BOOLEAN SDorder);BOOLEAN MatrixMInit(VOID){LONG i, nriface;CHAR s[81];BOOLEAN v;MAC_IFACE *iface;LONG matrixsource[] = {1,3,6,1,2,1,2,2,1,1,1};CHAR matrixowner[] = "monitorMatrix";#define STATUSINDEX 11SNMP_OBJECT matrixobj[] = { { SNMP_PDU_SET, {1,3,6,1,2,1,16,6,1,1,6,1}, 12, SNMP_INTEGER }, { SNMP_PDU_SET, {1,3,6,1,2,1,16,6,1,1,5,1}, 12, SNMP_DISPLAYSTR }, { SNMP_PDU_SET, {1,3,6,1,2,1,16,6,1,1,2,1}, 12, SNMP_OBJECTID }}; MessageConfig(MATRIX_ERROR, "Matrix"); if (MatrixConfigInit() == FALSE) return FALSE; nriface = (LONG)MacIfaceCount(); for (i = 1; i <= nriface; i++) { sprintf(s, "beholder.matrix.iface.%ld", i); if (ConfigGetBoolean(s, &v) == TRUE) { iface = MacIfaceGet((WORD)i); if (iface != NULL && v == TRUE && (iface->type == MAC_TYPE_ETHERNET_CSMACD || iface->type == MAC_TYPE_88023_CSMACD)) { matrixobj[0].Id[STATUSINDEX] = i; matrixobj[1].Id[STATUSINDEX] = i; matrixobj[2].Id[STATUSINDEX] = i; matrixobj[0].Syntax.LngInt = SNMP_INVALID; MibRequest(&matrixobj[0]); matrixobj[0].Syntax.LngInt = SNMP_CREATEREQUEST; if (MibRequest(&matrixobj[0]) != SNMP_NOERROR) { DnpapMessage(DMC_WARNING, MATRIX_MATRIXINIT, "matrix: couldn't create matrix collector %ld", i); continue; } strncpy(matrixobj[1].Syntax.BufChr, matrixowner, matrixobj[1].SyntaxLen = strlen(matrixowner)); if (MibRequest(&matrixobj[1]) != SNMP_NOERROR) { DnpapMessage(DMC_WARNING, MATRIX_MATRIXINIT, "matrix: couldn't set owner of matrix collector %ld", i); matrixobj[0].Syntax.LngInt = SNMP_INVALID; MibRequest(&matrixobj[0]); continue; } memcpy(matrixobj[2].Syntax.BufInt, matrixsource, sizeof(matrixsource)); matrixobj[2].Syntax.BufInt[sizeof(matrixsource)/sizeof(matrixsource[0])-1] = i; matrixobj[2].SyntaxLen = sizeof(matrixsource)/sizeof(matrixsource[0]); if (MibRequest(&matrixobj[2]) != SNMP_NOERROR) { DnpapMessage(DMC_WARNING, MATRIX_MATRIXINIT, "matrix: couldn't set datasource of matrix collector %ld", i); matrixobj[0].Syntax.LngInt = SNMP_INVALID; MibRequest(&matrixobj[0]); continue; } matrixobj[0].Syntax.LngInt = SNMP_VALID; if (MibRequest(&matrixobj[0]) != SNMP_NOERROR) { DnpapMessage(DMC_WARNING, MATRIX_MATRIXINIT, "matrix: couldn't set matrix collector %ld to valid", i); matrixobj[0].Syntax.LngInt = SNMP_INVALID; MibRequest(&matrixobj[0]); continue; } } } } return TRUE;}MIB_LOCAL *MatrixMibRmon(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 = ((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;}BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, SRCDST ** elem, BOOLEAN SDorder){ BOOLEAN first = FALSE; if (*local == NULL || indexsize < 1) return FALSE; switch (indexsize) { case SRCDSTINDEXSIZE: while (*local != NULL && (*elem = SrcDstGetFirstNext((MATRIX_CONTROL *) (*local)->Data, obj, idlen, first, SDorder)) == 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;}SRCDST *SrcDstGetFirstNext(MATRIX_CONTROL * matrixcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first, BOOLEAN SDorder){ BYTE srcdst[2 * HOST_SIZE_ADDR]; SRCDST *p; INT i, len; BOOLEAN nextconn, firstconn; WORD addrlen = matrixcontrol->AddressLen; if (matrixcontrol->TableSize == 0) return NULL; nextconn = FALSE; firstconn = FALSE; if (first == FALSE) { if (obj->IdLen > idlen + 1) { if (obj->Id[idlen + 1] > addrlen) return NULL; if (obj->Id[idlen + 1] < addrlen) first = TRUE; } else first = TRUE; if (obj->IdLen > idlen + 1 + addrlen + 1) { if (obj->Id[idlen + 1 + addrlen + 1] > addrlen) nextconn = TRUE; if (obj->Id[idlen + 1 + addrlen + 1] < addrlen) firstconn = TRUE; } } if (first == TRUE) { if (SDorder == TRUE) { p = matrixcontrol->SrcDstList; for (i = 0; i < addrlen; i++) { obj->Id[idlen + 2 + i] = (LONG) p->SrcDst[i]; obj->Id[idlen + 3 + addrlen + i] = (LONG) p->SrcDst[addrlen + i]; obj->Id[idlen + 1] = addrlen; obj->Id[idlen + 1 + addrlen + 1] = addrlen; obj->IdLen = idlen + 1 + 2 + 2 * addrlen; } return p; } else { p = matrixcontrol->DstSrcList; for (i = 0; i < addrlen; i++) { obj->Id[idlen + 2 + i] = (LONG) p->SrcDst[addrlen + i]; obj->Id[idlen + 3 + addrlen + i] = (LONG) p->SrcDst[i]; obj->Id[idlen + 1] = addrlen; obj->Id[idlen + 1 + addrlen + 1] = addrlen; obj->IdLen = idlen + 1 + 2 + 2 * addrlen; } return p; } } len = obj->IdLen - idlen - 2; if (len < 0) len = 0; else if (len > addrlen) len--; if (len > 2 * addrlen) len = 2 * addrlen; /* fill in srcdst in both orders: SDorder or reverse */ for (i = 0; i < len; i++) srcdst[i] = (BYTE) obj->Id[idlen + 2 + (i < addrlen ? 0 : 1) + i]; if (firstconn == TRUE) len = addrlen; /* force finding of first connection */ if (nextconn == TRUE) { len = addrlen; /* force finding of next connection */ for (i = addrlen-1; i >= 0; i--) if (++srcdst[i] != 0) break; if (i < 0 && srcdst[0] == 0) return NULL; } p = MatrixSearchNext(matrixcontrol, srcdst, len, SDorder); if (p != NULL) { if (SDorder == TRUE) { for (i = 0; i < addrlen; i++) { obj->Id[idlen + 2 + i] = (LONG) p->SrcDst[i]; obj->Id[idlen + 3 + addrlen + i] = (LONG) p->SrcDst[addrlen + i]; } } else { for (i = 0; i < addrlen; i++) { obj->Id[idlen + 2 + i] = (LONG) p->SrcDst[addrlen + i]; obj->Id[idlen + 3 + addrlen + i] = (LONG) p->SrcDst[i]; } } obj->Id[idlen + 1] = addrlen; obj->Id[idlen + 1 + addrlen + 1] = addrlen; obj->IdLen = idlen + 1 + 2 + 2 * addrlen; } return p;}WORD MatrixControlIndex(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = 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) == 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 MatrixControlDataSource(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; 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, 2, 1, 16, 7, 2, 1, 1, 1}; WORD ChannelOidLen = sizeof(ChannelOid) / sizeof(LONG); 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) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (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 = (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 MatrixControlTableSize(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; MATRIX_CONTROL *data; 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) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (MATRIX_CONTROL *) local->Data; obj->Syntax.LngInt = data->TableSize; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD MatrixControlLastDeleteTime(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; MATRIX_CONTROL *data; 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) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (MATRIX_CONTROL *) local->Data; obj->Syntax.LngUns = data->LastDeleteTime; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD MatrixControlOwner(SNMP_OBJECT * obj, WORD idlen){ MIB_LOCAL *local = NULL; MATRIX_CONTROL *data; 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) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (MATRIX_CONTROL *) local->Data; if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, MATRIX_BOOLEAN_OWNER)) return SNMP_NOSUCHNAME;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -