/* * * Copyright (C) 2001 Luca Deri * Copyright (C) 2002 Walter Brock * * http://www.ntop.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" #include "globals-report.h" /* ***** f o r w a r d ***** */ void printPdaData(HostTraffic* tmpTable[MAX_PDA_HOST_TABLE], u_int numEntries); void printPdaSummaryData(void); static void termPdaFunct(u_char termNtop /* 0=term plugin, 1=term ntop */); static void handlePDArequest(char* url); /* ****************************** */ static PluginInfo PDAPluginInfo[] = { { VERSION, /* current ntop version */ "PDA", "This plugin produces a minimal ntop report, suitable for display on a pda", "2.2a", /* version */ "W. Brock", "PDAPlugin", /* http://:/plugins/PDAPlugin */ 0, /* Active by default */ ViewOnly, 0, /* Inactive setup */ NULL, /* no special startup after init */ termPdaFunct, /* TermFunc */ NULL, /* PluginFunc */ handlePDArequest, /* http request handler */ NULL, /* no host creation/deletion handle */ NULL, /* BPF Filter */ NULL, /* no status */ NULL /* no extra pages */ } }; /* ****************************** */ /* Plugin entry fctn */ #ifdef MAKE_STATIC_PLUGIN PluginInfo* wapPluginEntryFctn(void) #else PluginInfo* PluginEntryFctn(void) #endif { traceEvent(CONST_TRACE_ALWAYSDISPLAY, "PDA: Welcome to %s. (C) 2001-2005 by L.Deri and W.Brock", PDAPluginInfo->pluginName); return(PDAPluginInfo); } /* ********************** */ static void printHtmlNotFoundError(void) { sendString("Unknown request"); } /* ********************** */ static int cmpPdaFctnSent(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; TrafficCounter a_, b_; if((a == NULL) && (b != NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpPdaFctnSent() (1)"); return(1); } else if((a != NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpPdaFctnSent() (2)"); return(-1); } else if((a == NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpPdaFctnSent() (3)"); return(0); } /* Data Sent */ a_ = (*a)->bytesSent; b_ = (*b)->bytesSent; if(a_.value < b_.value) return(1); else if (a_.value > b_.value) return(-1); else return(0); } static int cmpPdaFctnRcvd(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; TrafficCounter a_, b_; if((a == NULL) && (b != NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpPdaFctnRcvd() (1)"); return(1); } else if((a != NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpPdaFctnRcvd() (2)"); return(-1); } else if((a == NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpPdaFctnRcvd() (3)"); return(0); } /* Data Rcvd */ a_ = (*a)->bytesRcvd; b_ = (*b)->bytesRcvd; if(a_.value < b_.value) return(1); else if (a_.value > b_.value) return(-1); else return(0); } /* ********************** */ void printPdaData(HostTraffic* tmpTable[MAX_PDA_HOST_TABLE], u_int numEntries) { u_int idx; int i; HostTraffic *el; char *tmpName; char hostLinkBuf[LEN_GENERAL_WORK_BUFFER]; char linkName[256]; char buf[LEN_GENERAL_WORK_BUFFER]; char formatBuf[32]; sendString(" \n"); sendString(" \n"); /* Data Sent */ qsort(tmpTable, numEntries, sizeof(HostTraffic*), cmpPdaFctnSent); for(idx=0; idxhostNumIpAddress; strncpy(linkName, el->hostNumIpAddress, sizeof(linkName)); if((strcmp(tmpName, "0.0.0.0") == 0) || (tmpName[0] == '\0')){ tmpName = el->ethAddressString; strncpy(linkName, el->ethAddressString, sizeof(linkName)); for(i=0; linkName[i] != '\0'; i++) if(linkName[i] == ':') linkName[i] = '_'; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", linkName, tmpName, formatBytes(el->bytesSent.value, 1, formatBuf, sizeof(formatBuf))); sendString(buf); } sendString("
Top Sending HostsTotal
%s%s
\n" "

\n" "\n" " \n"); sendString(" \n"); sendString(" \n"); /* Data Rcvd */ qsort(tmpTable, numEntries, sizeof(HostTraffic*), cmpPdaFctnRcvd); for(idx=0; idxhostNumIpAddress; strncpy(linkName, el->hostNumIpAddress, sizeof(linkName)); if((strcmp(tmpName, "0.0.0.0") == 0) || (tmpName[0] == '\0')){ tmpName = el->ethAddressString; strncpy(linkName, el->ethAddressString, sizeof(linkName)); for(i=0; linkName[i] != '\0'; i++) if(linkName[i] == ':') linkName[i] = '_'; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", linkName, tmpName, formatBytes(el->bytesRcvd.value, 1, formatBuf, sizeof(formatBuf))); sendString(buf); } sendString("
Top Receiving HostsTotal
%s%s
\n"); sendString("

\n"); } /* ********************** */ void printPdaSummaryData(void) { char formatBuf[32]; Counter diff; char buf[LEN_GENERAL_WORK_BUFFER]; Counter unicastPkts=0; sendString(" \n"); sendString(" \n"); /** **/ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),"" "\n", formatSeconds((long)(myGlobals.actTime-myGlobals.initialSniffTime), formatBuf, sizeof(formatBuf))); sendString(buf); /** **/ diff = myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value - myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value - myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value; if(diff > 0) unicastPkts = 0; /* It shouldn't happen */ else unicastPkts = diff; if(myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value <= 0) myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value = 1; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),"\n", formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),"" "\n", formatPkts(unicastPkts, formatBuf, sizeof(formatBuf)), (float)(100*unicastPkts)/(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),"" "\n", formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value, formatBuf, sizeof(formatBuf)), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value) /(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value); sendString(buf); if(myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),"" "\n", formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value, formatBuf, sizeof(formatBuf)), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value) /(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value); sendString(buf); } /** **/ sendString("
StatsTotal
Sampling Time%s
Total%s
Unicast%s [%.1f%%]
Broadcast%s [%.1f%%]
Multicast%s [%.1f%%]
\n"); } /* ********************** */ static void printHtmlIndex(void) { u_int idx, numEntries=0; HostTraffic *el; HostTraffic* tmpTable[MAX_PDA_HOST_TABLE]; /* #ifdef WIN32 deviceId = 0; #else deviceId = (int)_deviceId; #endif actualDeviceId = getActualInterface(deviceId); */ for(idx=1; idx 0) printPdaData(tmpTable, numEntries); else sendString(" \n"); sendString("\n" "\n"); printPdaSummaryData(); } /* ********************** */ static void printHtmlHostInfo(char *host _UNUSED_) { sendString("Data for host "); sendString(host); sendString("
Currently this function is not available"); } /* ********************** */ static void handlePDArequest(char* url) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, BITFLAG_HTTP_NO_CACHE_CONTROL | BITFLAG_HTTP_MORE_FIELDS, 1); sendString((myGlobals.runningPref.w3c == TRUE) ? CONST_W3C_DOCTYPE_LINE_32 "\n" : ""); sendString("\n" "\n"); sendString((myGlobals.runningPref.w3c == TRUE) ? CONST_W3C_CHARTYPE_LINE "\n" : ""); sendString("\n" "ntop for PDAs\n"); /* sendString("\n"); */ sendString("\n" "\n" "ntop for PDAs\n" "

\n"); sendString("\n"); sendString("\n" "
\n"); if((url == NULL) || (url[0] == 0) || (strncmp(url, CONST_INDEX_HTML, strlen(CONST_INDEX_HTML)) == 0)) { printHtmlIndex(); } else if(strncmp(url, CONST_HOST_HTML, strlen(CONST_HOST_HTML)) == 0) printHtmlHostInfo(&url[strlen(CONST_HOST_HTML)+1]); else printHtmlNotFoundError(); sendString("
\n" "\n" "\n"); } /* ****************************** */ static void termPdaFunct(u_char termNtop /* 0=term plugin, 1=term ntop */) { traceEvent(CONST_TRACE_INFO, "PDA: Thanks for using ntop PDA plugin"); traceEvent(CONST_TRACE_ALWAYSDISPLAY, "PDA: Done"); }