⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 infom.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details   *//************************************************************************** MODULE INFORMATION **************************** FILE NAME:          infom.c** SYSTEM NAME:        beholder** MODULE NAME:        info** ORIGINAL AUTHOR(S): M.F.B. de Greeve** VERSION NUMBER:     1.0** CREATION DATE:      1992/7/13** DESCRIPTION:        beholderInfo-group: MIB-support**                     infoIndex, infoDataSource, infoLostPkts,**                     infoPkts, infoDiscardedPkts, infoTruncatedPkts,**                     infoBufferedPkts, infoStackedPkts,**                     infoOwner, infoStatus*************************************************************************/#include <stdlib.h>#include <stdio.h>#include <string.h>#include <dnpap.h>#include <mac.h>#include <snmp.h>#include <mibsup.h>#include <message.h>#include "infoe.h"#include "infoc.h"#include "info.h"#define INDEXSIZE       1static MIB_LOCAL    *beholderInfo = NULL;static BOOLEAN RmonNext (SNMP_OBJECT *Obj, MIB_LOCAL **Local, WORD IdLen, WORD IdSze, void *Elm);BOOLEAN InfoMInit(VOID){    MessageConfig(INFO_ERROR, "BeholderInfo");    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: number of indices after the MIB**              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, VOID **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 infoIndex (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL    *local = NULL;    if ((local = MibRmon (Obj, beholderInfo, 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;    }}WORD infoDataSource (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL       *local = NULL;    BEHOLDER_INFO   *data;    MAC_IFACE       *iface;    if ((local = MibRmon(Obj, beholderInfo, 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 = (BEHOLDER_INFO*) local->Data;            memcpy (Obj->Syntax.BufInt, data->Source, data->SourceLen * sizeof (LONG));            Obj->SyntaxLen = data->SourceLen;            return SNMP_NOERROR;        case SNMP_PDU_SET:            data = (BEHOLDER_INFO*) 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 (LONG)))                return SNMP_BADVALUE;            if ((iface = MacIfaceGet((WORD) Obj->Syntax.BufInt[Obj->SyntaxLen-1])) == NULL)                return SNMP_BADVALUE;            memcpy (data->Source, Obj->Syntax.BufInt, Obj->SyntaxLen * sizeof (LONG));            data->SourceLen = Obj->SyntaxLen;            data->Iface = iface;            return SNMP_NOERROR;    }}WORD infoLostPkts (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL    *local = NULL;    BEHOLDER_INFO  *data;    if ((local = MibRmon(Obj, beholderInfo, 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 = (BEHOLDER_INFO*) local->Data;            Obj->Syntax.LngUns = data->Stat.LostPkts;            return SNMP_NOERROR;    }}WORD infoPkts (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL    *local = NULL;    BEHOLDER_INFO  *data;    if ((local = MibRmon(Obj, beholderInfo, 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 = (BEHOLDER_INFO*) local->Data;            Obj->Syntax.LngUns = data->Stat.Pkts;            return SNMP_NOERROR;    }}                                                WORD infoDiscardedPkts (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL    *local = NULL;    BEHOLDER_INFO  *data;    if ((local = MibRmon(Obj, beholderInfo, 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 = (BEHOLDER_INFO*) local->Data;            Obj->Syntax.LngUns = data->Stat.DiscardedPkts;            return SNMP_NOERROR;    }}                                                WORD infoTruncatedPkts (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL    *local = NULL;    BEHOLDER_INFO  *data;    if ((local = MibRmon(Obj, beholderInfo, 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 = (BEHOLDER_INFO*) local->Data;            Obj->Syntax.LngUns = data->Stat.TruncatedPkts;            return SNMP_NOERROR;    }}                                                WORD infoBufferedPkts (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL    *local = NULL;    BEHOLDER_INFO  *data;    if ((local = MibRmon(Obj, beholderInfo, 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 = (BEHOLDER_INFO*) local->Data;            Obj->Syntax.LngUns = data->Stat.BufferedPkts;            return SNMP_NOERROR;    }}WORD infoStackedPkts (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL    *local = NULL;    BEHOLDER_INFO  *data;    if ((local = MibRmon(Obj, beholderInfo, 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 = (BEHOLDER_INFO*) local->Data;            Obj->Syntax.LngUns = data->Stat.StackedPkts;            return SNMP_NOERROR;    }}WORD infoOwner (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL       *local = NULL;    BEHOLDER_INFO   *data;    if ((local = MibRmon(Obj, beholderInfo, 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 = (BEHOLDER_INFO*) local->Data;            memcpy (Obj->Syntax.BufChr, data->Owner, data->OwnerLen);            Obj->SyntaxLen = data->OwnerLen;            return SNMP_NOERROR;        case SNMP_PDU_SET:            data = (BEHOLDER_INFO*) local->Data;            if (data->Status != SNMP_UNDERCREATION)                return SNMP_READONLY;            memcpy (data->Owner, Obj->Syntax.BufChr, Obj->SyntaxLen);            data->OwnerLen = Obj->SyntaxLen;            return SNMP_NOERROR;    }}WORD infoStatus (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL       *local = NULL;    BEHOLDER_INFO   *data;    local = MibRmon(Obj, beholderInfo, IdLen, INDEXSIZE);    switch (Obj->Request)    {        case SNMP_PDU_GET:            if (local == NULL)            {                Obj->Syntax.LngInt = SNMP_INVALID;                return SNMP_NOSUCHNAME;            }            data = (BEHOLDER_INFO*) 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 = (BEHOLDER_INFO*) 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, &beholderInfo, IdLen, INDEXSIZE)) == NULL)                            return SNMP_GENERROR;                        if ((local->Data = DnpapMalloc(sizeof(BEHOLDER_INFO))) == NULL)                            return SNMP_GENERROR;                        data = (BEHOLDER_INFO*) local->Data;                        memset(data, 0, sizeof(BEHOLDER_INFO));                        if (InfoInit(data) == TRUE)                        {                            ((BEHOLDER_INFO*) local->Data)->Status = SNMP_UNDERCREATION;                            DnpapMessage(DMC_MESSAGE, INFO_CREATE, "beholderInfo: collector %ld created", local->Index);                            return SNMP_NOERROR;                        }                        DnpapFree(local->Data);                        MibRemove (Obj, &beholderInfo, IdLen, INDEXSIZE);                        return SNMP_GENERROR;                    default:                        return SNMP_NOSUCHNAME;                }            }            data = (BEHOLDER_INFO*) local->Data;            switch (data->Status)            {                case SNMP_UNDERCREATION:                    switch (Obj->Syntax.LngInt)                    {                        case SNMP_VALID:                            if (InfoStart(data) == TRUE)                            {                                data->Status = SNMP_VALID;                                DnpapMessage(DMC_MESSAGE, INFO_ACTIVE, "beholderInfo: collector %ld active", local->Index);                                return SNMP_NOERROR;                            }                            else                                return SNMP_GENERROR;                        case SNMP_INVALID:                            if (InfoStop(data) == TRUE)                            {                                DnpapFree(local->Data);                                DnpapMessage(DMC_MESSAGE, INFO_DESTROY, "beholderInfo: collector %ld destroyed", local->Index);                                if (MibRemove (Obj, &beholderInfo, IdLen, INDEXSIZE) == TRUE)                                    return SNMP_NOERROR;                            }                            return SNMP_GENERROR;                        default:                            return SNMP_BADVALUE;                    }                case SNMP_VALID:                    switch (Obj->Syntax.LngInt)                    {                        case SNMP_INVALID:                            if (InfoStop(data) == TRUE)                            {                                DnpapFree(local->Data);                                DnpapMessage(DMC_MESSAGE, INFO_DESTROY, "beholderInfo: collector %ld destroyed", local->Index);                                if (MibRemove (Obj, &beholderInfo, IdLen, INDEXSIZE) == TRUE)                                    return SNMP_NOERROR;                            }                            return SNMP_GENERROR;                        case SNMP_VALID:                            return SNMP_NOERROR;                        default:                            return SNMP_BADVALUE;                    }            }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -