📄 reachc.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 + -