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

📄 topn_m.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
📖 第 1 页 / 共 2 页
字号:
        obj->Syntax.LngInt = data->Status;        return SNMP_NOERROR;    case SNMP_PDU_NEXT:        if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE)        {            obj->Syntax.LngInt = SNMP_INVALID;            return SNMP_NOSUCHNAME;        }        data = (TOPN_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, &TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL)                    return SNMP_GENERROR;                if ((local->Data = DnpapMalloc(sizeof(TOPN_CONTROL))) == NULL)                    return SNMP_GENERROR;                data = (TOPN_CONTROL*) local->Data;                if (TopNCInit(data) == TRUE)                {                    data->Status = SNMP_UNDERCREATION;                    DnpapMessage(DMC_MESSAGE, TOPN_CREATE, "topN: collector %ld created", local->Index);                    return SNMP_NOERROR;                }                DnpapFree(local->Data);                MibRemove (obj, &TopNControlInstance, idlen, CONTROLINDEXSIZE);                return SNMP_GENERROR;            default:                return SNMP_NOSUCHNAME;            }        }        data = (TOPN_CONTROL*) local->Data;        switch (data->Status)        {        case SNMP_UNDERCREATION:            switch (obj->Syntax.LngInt)            {            case SNMP_VALID:                if (TopNCStart(data) == TRUE)                {                    data->Status = SNMP_VALID;                    DnpapMessage(DMC_MESSAGE, TOPN_START, "topN: collector %ld active", local->Index);                    return SNMP_NOERROR;                }                return SNMP_BADVALUE;            case SNMP_INVALID:                if (TopNCStop(data) == TRUE)                {                    DnpapFree(local->Data);                    DnpapMessage(DMC_MESSAGE, TOPN_DESTROY, "topN: collector %ld destroyed", local->Index);                    if (MibRemove (obj, &TopNControlInstance, 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 (TopNCStop(data) == TRUE)                {                    DnpapFree(local->Data);                    DnpapMessage(DMC_MESSAGE, TOPN_DESTROY, "topN: collector %ld destroyed", local->Index);                    if (MibRemove (obj, &TopNControlInstance, idlen, CONTROLINDEXSIZE) == TRUE)                        return SNMP_NOERROR;                }                return SNMP_GENERROR;            default:                return SNMP_BADVALUE;            }        }    }    return SNMP_GENERROR;}WORD HostTopNReport(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL   *local = NULL;TOPN_ENTRY  *data = NULL;    if ((local = MibRmon (obj, TopNControlInstance, idlen, TOPNINDEXSIZE)) == NULL)        return SNMP_NOSUCHNAME;            switch (obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (obj, &local, idlen, TOPNINDEXSIZE, &data) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:                                                  if (data == NULL && (data = TopNEntrySearch(local->Data, obj, idlen)) == NULL)            return SNMP_NOSUCHNAME;        obj->Syntax.LngInt = local->Index;        return SNMP_NOERROR;    case SNMP_PDU_SET:        return SNMP_READONLY;    }    return SNMP_GENERROR;}WORD HostTopNIndex(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL   *local = NULL;TOPN_ENTRY  *data = NULL;    if ((local = MibRmon (obj, TopNControlInstance, idlen, TOPNINDEXSIZE)) == NULL)        return SNMP_NOSUCHNAME;            switch (obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (obj, &local, idlen, TOPNINDEXSIZE, &data) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:                                                  if (data == NULL && (data = TopNEntrySearch(local->Data, obj, idlen)) == NULL)            return SNMP_NOSUCHNAME;        obj->Syntax.LngInt = obj->Id[idlen+1];        return SNMP_NOERROR;    case SNMP_PDU_SET:        return SNMP_READONLY;    }    return SNMP_GENERROR;}WORD HostTopNAddress(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL   *local = NULL;TOPN_ENTRY  *data = NULL;    if ((local = MibRmon (obj, TopNControlInstance, idlen, TOPNINDEXSIZE)) == NULL)        return SNMP_NOSUCHNAME;            switch (obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (obj, &local, idlen, TOPNINDEXSIZE, &data) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:                                                  if (data == NULL && (data = TopNEntrySearch(local->Data, obj, idlen)) == NULL)            return SNMP_NOSUCHNAME;        memcpy(obj->Syntax.BufChr, data->Address, obj->SyntaxLen = ((TOPN_CONTROL *)local->Data)->AddressLen);        return SNMP_NOERROR;    case SNMP_PDU_SET:        return SNMP_READONLY;    }    return SNMP_GENERROR;}WORD HostTopNRate(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL   *local = NULL;TOPN_ENTRY  *data = NULL;    if ((local = MibRmon (obj, TopNControlInstance, idlen, TOPNINDEXSIZE)) == NULL)        return SNMP_NOSUCHNAME;            switch (obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (obj, &local, idlen, TOPNINDEXSIZE, &data) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:                                                  if (data == NULL && (data = TopNEntrySearch(local->Data, obj, idlen)) == NULL)            return SNMP_NOSUCHNAME;        obj->Syntax.LngInt = data->Rate;        return SNMP_NOERROR;    case SNMP_PDU_SET:        return SNMP_READONLY;    }    return SNMP_GENERROR;}BOOLEAN TopNEntryReset(LONG hostcontrolindex, HOST *host, WORD addrlen){                                 TOPN_CONTROL *topncontrol;TOPN_ENTRY   *entry;MIB_LOCAL    *local;    for (local = TopNControlInstance; local != NULL; local = local->Next)    {        topncontrol = local->Data;        if (topncontrol->Status == SNMP_VALID && topncontrol->HostIndex == hostcontrolindex &&            topncontrol->TimeRemaining > 0)        {			if (topncontrol->AddressLen == 0)				topncontrol->AddressLen = addrlen;			else			if (topncontrol->AddressLen != addrlen)			{				DnpapMessage(DMC_FATAL, TOPN_INCONSISTENT, "topncontrol: inconsistent address length encountered");				DnpapExit(1);			}														   			            if ((entry = HashSearch(topncontrol->Table, host->Address, addrlen)) != NULL)                entry->PrevValue = 0;        }    }    return TRUE;}BOOLEAN TopNEntryUpdate(LONG hostcontrolindex, HOST *host, WORD addrlen){                                 TOPN_CONTROL *topncontrol;TOPN_ENTRY   *entry;MIB_LOCAL    *local;    for (local = TopNControlInstance; local != NULL; local = local->Next)    {        topncontrol = local->Data;        if (topncontrol->Status == SNMP_VALID && topncontrol->HostIndex == hostcontrolindex &&            topncontrol->TimeRemaining > 0)        {			if (topncontrol->AddressLen == 0)				topncontrol->AddressLen = addrlen;			else			if (topncontrol->AddressLen != addrlen)			{				DnpapMessage(DMC_FATAL, TOPN_INCONSISTENT, "topncontrol: inconsistent address length encountered");				DnpapExit(1);			}			            if ((entry = HashSearch(topncontrol->Table, host->Address, addrlen)) == NULL)            {                if ((entry = DnpapMalloc(sizeof(TOPN_ENTRY))) == NULL)                    return FALSE;                else                {                    memset(entry, 0, sizeof(TOPN_ENTRY));                    memcpy(entry->Address, host->Address, addrlen);                    entry->Rate = 0;                    switch (topncontrol->RateBase)                    {                    case TOPN_RATEINPKTS:                        entry->PrevValue = host->InPkts;                        break;                    case TOPN_RATEOUTPKTS:                        entry->PrevValue = host->OutPkts;                        break;                    case TOPN_RATEINOCTETS:                        entry->PrevValue = host->InOctets;                        break;                    case TOPN_RATEOUTOCTETS:                        entry->PrevValue = host->OutOctets;                        break;                    case TOPN_RATEOUTERRORS:                        entry->PrevValue = host->OutErrors;                        break;                    case TOPN_RATEOUTBROADCASTPKTS:                        entry->PrevValue = host->OutBroadcastPkts;                        break;                    case TOPN_RATEOUTMULTICASTPKTS:                        entry->PrevValue = host->OutMulticastPkts;                        break;                    }                    if (HashAdd(topncontrol->Table, entry->Address, addrlen, entry) == NULL)                    {                        DnpapFree(entry);                        return FALSE;                    }                       else                    {                        EntryAddList(topncontrol, entry);                        topncontrol->TableSize++;                    }                }            }            else            {                switch (topncontrol->RateBase)                {                case TOPN_RATEINPKTS:                    if (entry->PrevValue > host->InPkts)                        entry->Rate += host->InPkts + (ULONG_MAX - entry->PrevValue);                    else                        entry->Rate += host->InPkts - entry->PrevValue;                    entry->PrevValue = host->InPkts;                    break;                case TOPN_RATEOUTPKTS:                    if (entry->PrevValue > host->OutPkts)                        entry->Rate += host->OutPkts + (ULONG_MAX - entry->PrevValue);                    else                        entry->Rate += host->OutPkts - entry->PrevValue;                    entry->PrevValue = host->OutPkts;                    break;                case TOPN_RATEINOCTETS:                    if (entry->PrevValue > host->InOctets)                        entry->Rate += host->InOctets + (ULONG_MAX - entry->PrevValue);                    else                        entry->Rate += host->InOctets - entry->PrevValue;                    entry->PrevValue = host->InOctets;                    break;                case TOPN_RATEOUTOCTETS:                    if (entry->PrevValue > host->OutOctets)                        entry->Rate += host->OutOctets + (ULONG_MAX - entry->PrevValue);                    else                        entry->Rate += host->OutOctets - entry->PrevValue;                    entry->PrevValue = host->OutOctets;                    break;                case TOPN_RATEOUTERRORS:                    if (entry->PrevValue > host->OutErrors)                        entry->Rate += host->OutErrors + (ULONG_MAX - entry->PrevValue);                    else                        entry->Rate += host->OutErrors - entry->PrevValue;                    entry->PrevValue = host->OutErrors;                    break;                case TOPN_RATEOUTBROADCASTPKTS:                    if (entry->PrevValue > host->OutBroadcastPkts)                        entry->Rate += host->OutBroadcastPkts + (ULONG_MAX - entry->PrevValue);                    else                        entry->Rate += host->OutBroadcastPkts - entry->PrevValue;                    entry->PrevValue = host->OutBroadcastPkts;                    break;                case TOPN_RATEOUTMULTICASTPKTS:                    if (entry->PrevValue > host->OutMulticastPkts)                        entry->Rate += host->OutMulticastPkts + (ULONG_MAX - entry->PrevValue);                    else                        entry->Rate += host->OutMulticastPkts - entry->PrevValue;                    entry->PrevValue = host->OutMulticastPkts;                    break;                }                EntryUpdateList(topncontrol, entry);            }        }    }    return TRUE;}BOOLEAN TopNHostStop(LONG hostcontrolindex){                                 TOPN_CONTROL *topncontrol;MIB_LOCAL    *local;    for (local = TopNControlInstance; local != NULL; local = local->Next)    {        topncontrol = local->Data;        if (topncontrol->Status == SNMP_VALID && topncontrol->HostIndex == hostcontrolindex &&            topncontrol->TimeRemaining > 0)        {            topncontrol->TimeRemaining = 0;            if (FillEntryTable(topncontrol, topncontrol->RequestedSize) != TRUE)                DnpapMessage(DMC_WARNING, TOPN_FILLFAIL, "topN: creation of entry array failed");            TimerRemove(topncontrol->Timer);            topncontrol->Timer = NULL;        }    }    return TRUE;}

⌨️ 快捷键说明

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