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

📄 reachc.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   */#include <dnpap.h>#include <dmemory.h>#include <dtime.h>#include <ip.h>#include <ping.h>#include <echo.h>#include <config.h>#include "reache.h"#include "reachc.h"IMPORT BOOLEAN BeholderStrictRMON;#define TIMEOUT     ((ULONG) -1L)static DOUBLE ICMPweight = 1;static DOUBLE UDPweight  = 1;static BOOLEAN AddPingRequest(Reach *reach, PING_DESCR *ping);static BOOLEAN AddEchoRequest(Reach *reach, ECHO_DESCR *echo);static VOID DelPingRequest(Reach *reach, PING_DESCR *ping);static VOID DelEchoRequest(Reach *reach, ECHO_DESCR *echo);static BOOLEAN AbortPingRequests(Reach *reach);static BOOLEAN AbortEchoRequests(Reach *reach);static VOID EchoCallback(ECHO_DESCR *echo, ULONG time, USHORT seqnr, VOID *param);static VOID PingCallback(PING_DESCR *ping, ULONG time, USHORT seqnr, VOID *param);static VOID ReachCallback(TIMER_DESCR *timer, ULONG now, VOID *param);BOOLEAN ReachConfigInit(VOID){	ConfigGetDouble("beholder.reachability.ICMPweight", &ICMPweight);	ConfigGetDouble("beholder.reachability.UDPweight", &UDPweight);	return TRUE;}BOOLEAN ReachCInit(Reach *reach){    reach->IPAddress[0] = 127;    reach->IPAddress[1] = 0;    reach->IPAddress[2] = 0;    reach->IPAddress[3] = 1;	reach->Delay = 1000;	reach->Timeout = 10000;	reach->ValueSteps = 5;	reach->ICMPWeight = ICMPweight;	reach->UDPWeight = UDPweight;	reach->Remaining = 5;	reach->ICMPReceived = 0;	reach->UDPReceived = 0;	reach->ICMPDropped = 0;	reach->UDPDropped = 0;	reach->ICMPTime = 0;	reach->UDPTime = 0;	reach->ICMPTimeMin = 0;	reach->UDPTimeMin = 0;	reach->ICMPTimeMax = 0;	reach->UDPTimeMax = 0;	reach->TotalICMPTime = 0;	reach->TotalUDPTime = 0;	reach->Value = 0;	    reach->Owner[0] = '\0';    reach->OwnerLen = 0;    reach->Status = SNMP_UNDERCREATION;        reach->Timer = NULL;    reach->EchoSeqNr = 0;    reach->EchoList = NULL;    reach->EchoBuffer = NULL;    reach->PingSeqNr = 0;    reach->PingList = NULL;    reach->PingBuffer = NULL;	BooleanSetAllTrue(reach->ObjectSet);	BooleanSetFalse(reach->ObjectSet, REACH_BOOLEAN_ADDRESS);	BooleanSetFalse(reach->ObjectSet, REACH_BOOLEAN_OWNER);    return TRUE;}BOOLEAN ReachCStart(Reach *reach){               PING_DESCR *ping;ECHO_DESCR *echo;	if (BeholderStrictRMON && !BooleanCheckAllTrue(reach->ObjectSet))		return FALSE;	reach->ICMPReceived = 0;	reach->UDPReceived = 0;	reach->ICMPDropped = 0;	reach->UDPDropped = 0;	reach->ICMPTime = 0;	reach->UDPTime = 0;	reach->ICMPTimeMin = 0;	reach->UDPTimeMin = 0;	reach->ICMPTimeMax = 0;	reach->UDPTimeMax = 0;	reach->TotalICMPTime = 0;	reach->TotalUDPTime = 0;	reach->Value = 0;    reach->Timer = NULL;    reach->EchoSeqNr = 0;    reach->EchoList = NULL;    reach->PingSeqNr = 0;    reach->PingList = NULL;	    if ((reach->PingBuffer = DnpapMalloc(reach->ValueSteps*sizeof(ULONG))) == NULL)    {        DnpapMessage(DMC_ERROR, REACH_BUFFER, "reach: can not allocate ICMP buffer");        return FALSE;    }    if ((reach->EchoBuffer = DnpapMalloc(reach->ValueSteps*sizeof(ULONG))) == NULL)    {        DnpapMessage(DMC_ERROR, REACH_BUFFER, "reach: can not allocate UDP buffer");        return FALSE;    }    /*  we do the first request here, so after this routine there is one less remaining  */    if (reach->Remaining > 1 &&        (reach->Timer = TimerRegister(ReachCallback, (VOID*)reach, (ULONG) reach->Delay, (ULONG) reach->Remaining-1, TIMER_TYPE_RECOVER)) == NULL)    {        DnpapMessage(DMC_ERROR, REACH_TIMER, "reach: can not set timer");        return FALSE;    }    if ((echo = EchoSend(IpN2HDWord(mem2dword(reach->IPAddress)), reach->Timeout, 62, reach->EchoSeqNr++, EchoCallback, reach)) == NULL)    {        DnpapMessage(DMC_ERROR, REACH_ECHO, "reach: can not send UDP echo request");        TimerRemove(reach->Timer);        return FALSE;    }    if (AddEchoRequest(reach, echo) == FALSE)    {        DnpapMessage(DMC_FATAL, REACH_ECHO, "reach: can not register UDP echo request");        DnpapExit(1);    }    if ((ping = PingSend(IpN2HDWord(mem2dword(reach->IPAddress)), reach->Timeout, 56, reach->PingSeqNr++, PingCallback, reach)) == NULL)    {        DnpapMessage(DMC_ERROR, REACH_PING, "reach: can not send ICMP echo request");        TimerRemove(reach->Timer);        return FALSE;    }    if (AddPingRequest(reach, ping) == FALSE)    {        DnpapMessage(DMC_FATAL, REACH_PING, "reach: can not register ICMP echo request");        DnpapExit(1);    }    reach->Remaining--;    return TRUE;}BOOLEAN ReachCStop(Reach *reach){    if (reach->Remaining > 0)        TimerRemove(reach->Timer);    AbortEchoRequests(reach);    AbortPingRequests(reach);    DnpapFree(reach->EchoBuffer);    DnpapFree(reach->PingBuffer);    return TRUE;}VOID ReachCallback(TIMER_DESCR *timer, ULONG now, VOID *param){Reach *reach = param;PING_DESCR *ping;ECHO_DESCR *echo;                                if (timer != reach->Timer)    {        DnpapMessage(DMC_FATAL, REACH_TIMER, "reach: internal error in timer data");        DnpapExit(1);    }        if ((echo = EchoSend(IpN2HDWord(mem2dword(reach->IPAddress)), reach->Timeout, 62, reach->EchoSeqNr++, EchoCallback, reach)) == NULL)        DnpapMessage(DMC_ERROR, REACH_ECHO, "reach: can not send UDP echo request");    if (AddEchoRequest(reach, echo) == FALSE)    {        DnpapMessage(DMC_FATAL, REACH_ECHO, "reach: can not register UDP echo request");        DnpapExit(1);    }    if ((ping = PingSend(IpN2HDWord(mem2dword(reach->IPAddress)), reach->Timeout, 56, reach->PingSeqNr++, PingCallback, reach)) == NULL)        DnpapMessage(DMC_ERROR, REACH_PING, "reach: can not send ICMP echo request");    if (AddPingRequest(reach, ping) == FALSE)    {        DnpapMessage(DMC_FATAL, REACH_PING, "reach: can not register ICMP echo request");        DnpapExit(1);    }    if (--reach->Remaining == 0)        reach->Timer = NULL;}VOID EchoCallback(ECHO_DESCR *echo, ULONG time, USHORT seqnr, VOID *param){Reach *reach = param;    if (time == TIMEOUT)    {        DelEchoRequest(reach, echo);        reach->UDPDropped++;    }    else    {        DelEchoRequest(reach, echo);        reach->EchoBuffer[reach->UDPReceived % reach->ValueSteps] = time;        reach->UDPReceived++;        reach->UDPTime = time;        reach->TotalUDPTime += time;        if (reach->UDPTimeMin == 0 || time < reach->UDPTimeMin)            reach->UDPTimeMin = time;        if (time > reach->UDPTimeMax)            reach->UDPTimeMax = time;    }}VOID PingCallback(PING_DESCR *ping, ULONG time, USHORT seqnr, VOID *param){Reach *reach = param;    if (time == TIMEOUT)    {        DelPingRequest(reach, ping);        reach->ICMPDropped++;    }    else    {        DelPingRequest(reach, ping);        reach->PingBuffer[reach->ICMPReceived % reach->ValueSteps] = time;        reach->ICMPReceived++;        reach->ICMPTime = time;        reach->TotalICMPTime += time;        if (reach->ICMPTimeMin == 0 || time < reach->ICMPTimeMin)            reach->ICMPTimeMin = time;        if (time > reach->ICMPTimeMax)            reach->ICMPTimeMax = time;    }}BOOLEAN AddPingRequest(Reach *reach, PING_DESCR *ping){Request *request;    if ((request = DnpapMalloc(sizeof(Request))) == NULL)    {        DnpapMessage(DMC_FATAL, REACH_REQALLOC, "reach: can not allocate memory for echo request");        return FALSE;    }    request->Request = ping;    request->Next = reach->PingList;    reach->PingList = request;    return TRUE;}BOOLEAN AddEchoRequest(Reach *reach, ECHO_DESCR *echo){Request *request;    if ((request = DnpapMalloc(sizeof(Request))) == NULL)    {        DnpapMessage(DMC_FATAL, REACH_REQALLOC, "reach: can not allocate memory for echo request");        return FALSE;    }    request->Request = echo;    request->Next = reach->EchoList;    reach->EchoList = request;    return TRUE;}VOID DelPingRequest(Reach *reach, PING_DESCR *ping){Request *r, *s;    for (r = reach->PingList, s = NULL; r != NULL; s = r, r = r->Next)        if (r->Request == ping)            break;    if (r != NULL)    {        if (s == NULL)            reach->PingList = r->Next;        else            s->Next = r->Next;        DnpapFree(r);    }}VOID DelEchoRequest(Reach *reach, ECHO_DESCR *echo){Request *r, *s;    for (r = reach->EchoList, s = NULL; r != NULL; s = r, r = r->Next)        if (r->Request == echo)            break;    if (r != NULL)    {        if (s == NULL)            reach->EchoList = r->Next;        else            s->Next = r->Next;        DnpapFree(r);    }}BOOLEAN AbortPingRequests(Reach *reach){Request *r;    for (r = reach->PingList; r != NULL; r = r->Next)        PingAbort(r->Request);    for (r = reach->PingList; r != NULL; r = reach->PingList)        DelPingRequest(reach, r->Request);    return TRUE;}BOOLEAN AbortEchoRequests(Reach *reach){Request *r;    for (r = reach->EchoList; r != NULL; r = r->Next)        EchoAbort(r->Request);    for (r = reach->EchoList; r != NULL; r = reach->EchoList)        DelEchoRequest(reach, r->Request);    return TRUE;}

⌨️ 快捷键说明

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