/* * Copyright (C) 1998-2007 Luca Deri * * 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" typedef struct osInfo { char *name, *link; } OsInfo; typedef struct osNumInfo { char *name; unsigned short num; } OsNumInfo; static OsInfo osInfos[] = { { "Windows", CONST_IMG_OS_WINDOWS }, { "IRIX", CONST_IMG_OS_IRIX }, { "Linux", CONST_IMG_OS_LINUX }, { "SunOS", CONST_IMG_OS_SUNOS }, { "Solaris", CONST_IMG_OS_SOLARIS }, { "HP/JETdirect", CONST_IMG_OS_HP_JETDIRET }, { "Mac", CONST_IMG_OS_MAC }, { "Novell", CONST_IMG_OS_NOVELL }, { "BSD", CONST_IMG_OS_BSD }, { "Unix", CONST_IMG_OS_UNIX }, { "Berkeley", CONST_IMG_OS_BERKELEY }, { "HP-UX", CONST_IMG_OS_HP_UX }, { "AIX", CONST_IMG_OS_AIX }, { "Cisco", CONST_IMG_OS_CISCO }, { NULL, NULL } }; /* ************************* */ void *mallocAndInitWithReportWarn(int sz, char *from) { void *tmpTable; tmpTable = malloc(sz); if (tmpTable == NULL) { traceEvent(CONST_TRACE_ERROR, "Unable to allocate temporary table (%d) for %s", sz, from); traceEvent(CONST_TRACE_INFO, "User warned, continuing without generating report"); printFlagedWarning("SORRY: An internal error does not allow creation of this report."); } else { memset (tmpTable, 0, sz); } return tmpTable; } /* ************************************ */ void formatUsageCounter(UsageCounter usageCtr, Counter topValue, /* If this value != 0 then a percentage is printed */ int actualDeviceId) { char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32], hostLinkBuf[LEN_GENERAL_WORK_BUFFER]; int i, sendHeader=0; HostTraffic *el; if(topValue == 0) { /* No percentage is printed */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", formatPkts(usageCtr.value.value, formatBuf, sizeof(formatBuf))); sendString(buf); } else { float pctg; pctg = ((float)usageCtr.value.value/(float)topValue)*100; if(pctg > 100) pctg = 100; /* This should not happen ! */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s [%.0f %%]", formatPkts(usageCtr.value.value, formatBuf, sizeof(formatBuf)), pctg); sendString(buf); } for(i=0; i\n"); else sendString(" \n"); } /* ********************************** */ void printTableDoubleEntry(char *buf, int bufLen, char *label, char* color, float totalS, float percentageS, float totalR, float percentageR) { int int_perc; char formatBuf[32]; if((totalS == 0) && (totalR == 0)) return; if(percentageS < 0.5) { int_perc = 0; percentageS = 0; } else if(percentageS > 99.5) { int_perc = 100; percentageS = 100; } else { int_perc = (int) percentageS + 0.5; } switch(int_perc) { case 0: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s" " \n", getRowColor(), label, formatKBytes(totalS, formatBuf, sizeof(formatBuf))); break; case 100: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s" "\"100%%\"\n", getRowColor(), label, formatKBytes(totalS, formatBuf, sizeof(formatBuf))); break; default: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s" "" "" "
\"%d%%\"" "

 

"TABLE_OFF"\n", getRowColor(), label, formatKBytes(totalS, formatBuf, sizeof(formatBuf)), int_perc, (100*int_perc)/100, (100*(100-int_perc))/100); } sendString(buf); /* ************************ */ if(totalR == 0) percentageR = 0; if(percentageR < 0.5) { int_perc = 0; percentageR = 0; } else if(percentageR > 99.5) { int_perc = 100; percentageR = 100; } else { int_perc = (int) percentageR + 0.5; } switch(int_perc) { case 0: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" " \n", formatKBytes(totalR, formatBuf, sizeof(formatBuf))); break; case 100: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "\"100\"\n", formatKBytes(totalR, formatBuf, sizeof(formatBuf))); break; default: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "" "
\"%d%%\"" "" "

 

\n", formatKBytes(totalR, formatBuf, sizeof(formatBuf)), int_perc, (100*int_perc)/100, (100*(100-int_perc))/100); } sendString(buf); } /* ********************************** */ void printTableEntryPercentage(char *buf, int bufLen, char *label, char* label_1, char* label_2, float total, float percentage, u_int showFlows, Counter flows) { int int_perc; char formatBuf[32], flowBuf[64], tmpBuf[32]; if(percentage < 0.5) int_perc = 0; else if(percentage > 99.5) int_perc = 100; else int_perc = (int) (percentage + 0.5); if(showFlows == 0) flowBuf[0] = '\0'; else safe_snprintf(__FILE__, __LINE__, flowBuf, sizeof(flowBuf), "%s", formatPkts(flows, tmpBuf, sizeof(tmpBuf))); switch(int_perc) { case 0: if(total == -1) { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "" "" "" "" "
%s 0 %%" "" "
 
%s 100 %%
\n", getRowColor(), label, CONST_COLOR_1, flowBuf, /* label_1, */ CONST_COLOR_2, CONST_COLOR_2, label_2); } else { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s %s" "" "" "" "" "
%s 0 %%" "" "
 
%s 100 %%
\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, CONST_COLOR_1, label_1, CONST_COLOR_2, CONST_COLOR_1, label_2); } break; case 100: if(total == -1) { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "" "" "" "" "
%s 100 %%" "" "
 
%s 0 %%
\n", getRowColor(), label, CONST_COLOR_1, label_1, CONST_COLOR_1, CONST_COLOR_2, label_2); } else { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s %s" "" "" "" "" "
%s 100 %%" "" "
 
%s 0 %%
\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, CONST_COLOR_1, label_1, CONST_COLOR_1, CONST_COLOR_2, label_2); } break; default: if(total == -1) { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "" "" "" "" "
%s %.1f %%" "" "" "
  
%s %.1f %%
\n", getRowColor(), label, CONST_COLOR_1, label_1, percentage, int_perc, CONST_COLOR_1, (100-int_perc), CONST_COLOR_2, CONST_COLOR_2, label_2, (100-percentage)); } else { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s%s %s" "" "" "" "
%s %.1f %%" "" "" "
  
%s %.1f %%
\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, CONST_COLOR_1, label_1, percentage, int_perc, CONST_COLOR_1, (100-int_perc), CONST_COLOR_2, CONST_COLOR_2, label_2, (100-percentage)); } } sendString(buf); } /* ******************************* */ void printFooterHostLink(void) { ; } /* ******************************* */ static void printFooterTrafficPct(void) { char buf[LEN_GENERAL_WORK_BUFFER]; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "

" "" "" "" "" "" "" "" "" "" "
The percentage value is - for a given host - the traffic for that host " "during that hour divided by the total traffic for that host for the last 24 hours.
0%% 0%% to %d%% %d%% to %d%% >%d%% to 100%%
\n", CONST_PCTG_LOW, CONST_PCTG_LOW, CONST_PCTG_MID, CONST_PCTG_MID); sendString(buf); } /* ******************************* */ void printFooter(int reportType) { switch(reportType) { case TRAFFIC_STATS: break; case SORT_DATA_RECEIVED_PROTOS: case SORT_DATA_SENT_PROTOS: case SORT_DATA_PROTOS: case SORT_DATA_RECEIVED_IP: case SORT_DATA_SENT_IP: case SORT_DATA_IP: case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_RECEIVED_THPT: case SORT_DATA_SENT_THPT: case SORT_DATA_THPT: case SORT_DATA_HOST_TRAFFIC: break; } sendString("

\n"); switch(reportType) { case TRAFFIC_STATS: break; case SORT_DATA_RECEIVED_PROTOS: case SORT_DATA_RECEIVED_IP: case SORT_DATA_SENT_PROTOS: case SORT_DATA_SENT_IP: case SORT_DATA_PROTOS: case SORT_DATA_IP: printFooterHostLink(); break; case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_HOST_TRAFFIC: printFooterHostLink(); printFooterTrafficPct(); break; case SORT_DATA_RECEIVED_THPT: case SORT_DATA_SENT_THPT: case SORT_DATA_THPT: printFooterHostLink(); sendString("

Peak values are the maximum value for any 10 second interval." "
Average values are recomputed each 60 seconds, using values " "accumulated since this run of ntop was started.

\n"); sendString("

Note: Both values are reset each time ntop is restarted.

\n"); break; } sendString("
\n"); } /* ******************************* */ void printHeader(int reportType, int revertOrder, u_int column, HostsDisplayPolicy showHostsMode, LocalityDisplayPolicy showLocalityMode, char *vlanList, u_short vlanId) { char buf[LEN_GENERAL_WORK_BUFFER]; char *sign, *arrowGif, *arrow[128], *theAnchor[128], *url=NULL; int i, soFar=2, idx, j, hourId, useVlans = 0; char htmlAnchor[128], htmlAnchor1[128], theLink[128], theVlanLink[128]; ProtocolsList *protoList; char theDate[8]; struct tm t; char hours[][24] = {"12
AM", "1
AM", "2
AM", "3
AM", "4
AM", "5
AM", "6
AM", "7
AM", "8
AM", "9
AM", "10
AM", "11
AM", "12
PM", "1
PM", "2
PM", "3
PM", "4
PM", "5
PM", "6
PM", "7
PM", "8
PM", "9
PM", "10
PM", "11
PM"}; for(i=0; i%d<-\n",showHostsMode); */ strftime(theDate, 8, CONST_TOD_HOUR_TIMESPEC, localtime_r(&myGlobals.actTime, &t)); hourId = atoi(theDate); memset(arrow, 0, sizeof(arrow)); memset(theAnchor, 0, sizeof(theAnchor)); memset(htmlAnchor, 0, sizeof(htmlAnchor)); memset(htmlAnchor1, 0, sizeof(htmlAnchor1)); if(revertOrder) { sign = ""; arrowGif = " " CONST_IMG_ARROW_UP; } else { sign = "-"; arrowGif = " " CONST_IMG_ARROW_DOWN; } memset(buf, 0, sizeof(buf)); switch(reportType) { case TRAFFIC_STATS: url = CONST_TRAFFIC_STATS_HTML; break; case SORT_DATA_PROTOS: url = CONST_SORT_DATA_PROTOS_HTML; break; case SORT_DATA_IP: url = CONST_SORT_DATA_IP_HTML; break; case SORT_DATA_THPT: url = CONST_SORT_DATA_THPT_HTML; break; case SORT_DATA_HOST_TRAFFIC: url = CONST_SORT_DATA_HOST_TRAFFIC_HTML; break; } safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), " 0) && (vlanId < MAX_VLAN)) safe_snprintf(__FILE__, __LINE__, theLink, sizeof(theLink), "/%s?col=%s%d&vlan=%d&showL=%d&showH=", url, revertOrder ? "-" : "", column, vlanId, showLocalityMode); else safe_snprintf(__FILE__, __LINE__, theLink, sizeof(theLink), "/%s?col=%s%d&showL=%d&showH=", url, revertOrder ? "-" : "", column, showLocalityMode); safe_snprintf(__FILE__, __LINE__, theVlanLink, sizeof(theVlanLink), "/%s?col=%s%d&showL=%d&showH=%d", url, revertOrder ? "-" : "", column, showLocalityMode, showHostsMode); sendString("
"); if(reportType != TRAFFIC_STATS) { switch(showLocalityMode) { case showSentReceived: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
"); switch(showHostsMode) { case showOnlyLocalHosts: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Hosts: [ All ] " "[ Local Only ] " "[ Remote Only ] ", theLink, theLink); break; case showOnlyRemoteHosts: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Hosts: [ All ] " "[ Local Only ] " "[ Remote Only ] ", theLink, theLink); break; default: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Hosts: [ All ] " "[ Local Only ] " "[ Remote Only ] ", theLink, theLink); break; } sendString(buf); if(useVlans) { u_char found = 0; sendString("

VLAN: "); for(i=0; i%d ] ", i), found = 1; else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "[ %d ] ", theVlanLink, i, i); sendString(buf); } if(!found) safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "[ All ] "); else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "[ All ] ", theVlanLink); sendString(buf); } sendString("

" "Data: [ All ] " "[ Sent Only ] " "[ Received Only ] ", url, revertOrder ? "-" : "", column, showHostsMode, url, revertOrder ? "-" : "", column, showHostsMode); break; case showOnlySent: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "Data: [ All ] " "[ Sent Only ] " "[ Received Only ] ", url, revertOrder ? "-" : "", column, showHostsMode, url, revertOrder ? "-" : "", column, showHostsMode); break; default: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "Data: [ All ] " "[ Sent Only ] " "[ Received Only ] ", url, revertOrder ? "-" : "", column, showHostsMode, url, revertOrder ? "-" : "", column, showHostsMode); break; } sendString(buf); sendString("

"); } switch(reportType) { case SORT_DATA_RECEIVED_PROTOS: case SORT_DATA_SENT_PROTOS: case SORT_DATA_PROTOS: sendString("

\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"" "\n" "" "\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2]); sendString(buf); for(i=0; i<=15; i++) if(abs(column) == i+1) { arrow[i] = arrowGif; theAnchor[i] = htmlAnchor; } else { arrow[i] = ""; theAnchor[i] = htmlAnchor1; } safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" """" "" "", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2], theAnchor[3], arrow[3], theAnchor[4], arrow[4], theAnchor[5], arrow[5], theAnchor[6], arrow[6], theAnchor[7], arrow[7], theAnchor[8], arrow[8]); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" "" "" "", theAnchor[10], arrow[10], theAnchor[12], arrow[12], theAnchor[13], arrow[13], theAnchor[14], arrow[14]); sendString(buf); protoList = myGlobals.ipProtosList, idx=0; while(protoList != NULL) { if(abs(column) == BASE_PROTOS_IDX+idx) { arrow[BASE_PROTOS_IDX+idx] = arrowGif; theAnchor[BASE_PROTOS_IDX+idx] = htmlAnchor; } else { arrow[BASE_PROTOS_IDX+idx] = ""; theAnchor[BASE_PROTOS_IDX+idx] = htmlAnchor1; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", theAnchor[BASE_PROTOS_IDX+idx], BASE_PROTOS_IDX+idx, protoList->protocolName, arrow[BASE_PROTOS_IDX+idx]); sendString(buf); idx++, protoList = protoList->next; } safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "", theAnchor[15], arrow[15]); sendString(buf); break; case SORT_DATA_RECEIVED_IP: case SORT_DATA_SENT_IP: case SORT_DATA_IP: sendString("
\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"
%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Domain%s%s0\">Data%s%s1\">TCP%s%s2\">UDP%s%s3\">ICMP%s%s4\">ICMPv6%s%s5\">DLC%s%s6\">IPX%s" "%s7\">Decnet%s%s8\">(R)ARP%s%s9\">AppleTalk%s%s11\">NetBios%s%s13\">OSI%s%s14\">IPv6%s%s15\">STP%s%s%d\">%s%s%s16\">Other%s
" "\n" "" "\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2]); sendString(buf); if(abs(column) == 1) { arrow[0] = arrowGif; theAnchor[0] = htmlAnchor; } else { arrow[0] = ""; theAnchor[0] = htmlAnchor1; } for(i=0; i%s%d\">%s%s", theAnchor[0], i+2, myGlobals.ipTrafficProtosNames[i], arrow[0]); sendString(buf); soFar++; } if(abs(column) == soFar) { arrow[0] = arrowGif; theAnchor[0] = htmlAnchor; } else { arrow[0] = ""; theAnchor[0] = htmlAnchor1; } safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "", theAnchor[0], i+2, arrow[0]); sendString(buf); break; case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_HOST_TRAFFIC: sendString("
\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"
%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Domain%s%s0\">Data%s%s%d\">Other IP%s
" "" "\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1]); sendString(buf); j = hourId; for (i = 0; i < 24; i++) { j = j % 24; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", hours[j]); sendString (buf); if (!j) { j = 23; } else { j--; } } break; case SORT_DATA_RECEIVED_THPT: case SORT_DATA_SENT_THPT: case SORT_DATA_THPT: sendString("
\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"
%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Domain%s%s
" "" "\n\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1]); sendString(buf); updateThpt(0); if(abs(column) == 1) { arrow[0] = arrowGif; theAnchor[0] = htmlAnchor; } else { arrow[0] = ""; theAnchor[0] = htmlAnchor1; } if(abs(column) == 2) { arrow[1] = arrowGif; theAnchor[1] = htmlAnchor; } else { arrow[1] = ""; theAnchor[1] = htmlAnchor1; } if(abs(column) == 3) { arrow[2] = arrowGif; theAnchor[2] = htmlAnchor; } else { arrow[2] = ""; theAnchor[2] = htmlAnchor1;} if(abs(column) == 4) { arrow[3] = arrowGif; theAnchor[3] = htmlAnchor; } else { arrow[3] = ""; theAnchor[3] = htmlAnchor1;} if(abs(column) == 5) { arrow[4] = arrowGif; theAnchor[4] = htmlAnchor; } else { arrow[4] = ""; theAnchor[4] = htmlAnchor1;} if(abs(column) == 6) { arrow[5] = arrowGif; theAnchor[5] = htmlAnchor; } else { arrow[5] = ""; theAnchor[5] = htmlAnchor1;} safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" "" ""); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" "" "" "" "", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2], theAnchor[3], arrow[3], theAnchor[4], arrow[4], theAnchor[5], arrow[5]); sendString(buf); break; case TRAFFIC_STATS: sendString("
\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"
%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Domain%sDataPackets
%s1\">Current%s%s2\">Avg%s%s3\">Peak%s%s4\">Current%s%s5\">Avg%s%s6\">Peak%s
" "" "\n\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1]); sendString(buf); break; } sendString("\n"); } /* ******************************* */ char* _getOSFlag(HostTraffic *el, char *elOsName, int showOsName, char *tmpStr, int tmpStrLen, char *file, int line) { /* Lengthen tmpString buffer - to handle long name given by nmap for Win2k Courtesy of Marcel Hauser */ char *flagImg = ""; char *theOsName; int i; if((el == NULL) && (elOsName == NULL)) return(""); tmpStr[0] = '\0'; if(elOsName != NULL) theOsName = elOsName; else { if(el->fingerprint == NULL) return(""); if(el->fingerprint[0] != ':') setHostFingerprint(el); if(el->fingerprint[0] != ':') return(""); theOsName = &el->fingerprint[1]; } if(theOsName[0] == '\0') return(""); flagImg = NULL; for(i=0; osInfos[i].link != NULL; i++) { if(strstr(theOsName, osInfos[i].name) != NULL) { flagImg = osInfos[i].link; break; } } if(!showOsName) { if(flagImg != NULL) { safe_snprintf(file, line, tmpStr, tmpStrLen, "%s", flagImg); } else tmpStr[0] = '\0'; } else { if(flagImg != NULL) { safe_snprintf(file, line, tmpStr, tmpStrLen, "%s [%s]", flagImg, theOsName); } else { safe_snprintf(file, line, tmpStr, tmpStrLen, "%s", theOsName); } } return(tmpStr); } /* ******************************* */ int sortHostFctn(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; int rc, n_a, n_b; char *nameA, *nameB, nameA_str[32], nameB_str[32]; if((a == NULL) && (b != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortHostFctn() error (1)"); return(1); } else if((a != NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortHostFctn() error (2)"); return(-1); } else if((a == NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortHostFctn() error (3)"); return(0); } switch(myGlobals.columnSort) { case 1: rc=cmpFctnResolvedName(a, b); return(rc); break; case 2: if (isFcHost ((*a)) && isFcHost ((*b))) { if((*a)->fcCounters->hostFcAddress.domain > (*b)->fcCounters->hostFcAddress.domain) return(1); else if ((*a)->fcCounters->hostFcAddress.domain < (*b)->fcCounters->hostFcAddress.domain) return (-1); else { if ((*a)->fcCounters->hostFcAddress.area > (*b)->fcCounters->hostFcAddress.area) return (1); else if ((*a)->fcCounters->hostFcAddress.area < (*b)->fcCounters->hostFcAddress.area) return (-1); else { if ((*a)->fcCounters->hostFcAddress.port > (*b)->fcCounters->hostFcAddress.port) return (1); else if ((*a)->fcCounters->hostFcAddress.port < (*b)->fcCounters->hostFcAddress.port) return (-1); else return (0); } } } else { rc = addrcmp(&(*a)->hostIpAddress,&(*b)->hostIpAddress); return(rc); } break; case 3: if (isFcHost ((*a)) && isFcHost ((*b))) { n_a = (*a)->fcCounters->vsanId, n_b = (*b)->fcCounters->vsanId; return ((n_a < n_b) ? -1 : (n_a > n_b) ? 1 : 0); } else { return(strcasecmp((*a)->ethAddressString, (*b)->ethAddressString)); } case 5: if (isFcHost ((*a)) && isFcHost ((*b))) { return(strcasecmp(getVendorInfo(&((*a)->fcCounters->pWWN.str[2]), 0), getVendorInfo(&((*b)->fcCounters->pWWN.str[2]), 0))); } else { return(strcasecmp(getVendorInfo((*a)->ethAddress, 0), getVendorInfo((*b)->ethAddress, 0))); } break; case 6: if((*a)->nonIPTraffic == NULL) { nameA = ""; } else { if((*a)->nonIPTraffic->nbHostName != NULL) nameA = (*a)->nonIPTraffic->nbHostName; else if((*a)->nonIPTraffic->atNodeName != NULL) nameA = (*a)->nonIPTraffic->atNodeName; else if((*a)->nonIPTraffic->atNetwork != 0) { safe_snprintf(__FILE__, __LINE__, nameA_str, sizeof(nameA_str), "%d.%d", (*a)->nonIPTraffic->atNetwork, (*a)->nonIPTraffic->atNode); nameA = nameA_str; } else if((*a)->nonIPTraffic->ipxHostName != NULL) nameA = (*a)->nonIPTraffic->ipxHostName; else nameA = ""; } if((*b)->nonIPTraffic == NULL) { nameB = ""; } else { if((*b)->nonIPTraffic->nbHostName != NULL) nameB = (*b)->nonIPTraffic->nbHostName; else if((*b)->nonIPTraffic->atNodeName != NULL) nameB = (*b)->nonIPTraffic->atNodeName; else if((*b)->nonIPTraffic->atNetwork != 0) { safe_snprintf(__FILE__, __LINE__, nameB_str, sizeof(nameB_str), "%d.%d", (*b)->nonIPTraffic->atNetwork, (*b)->nonIPTraffic->atNode); nameB = nameB_str; } else if((*b)->nonIPTraffic->ipxHostName != NULL) nameB = (*b)->nonIPTraffic->ipxHostName; else nameB = ""; } return(strcasecmp(nameA, nameB)); break; case 7: n_a = guessHops(*a); n_b = guessHops(*b); if(n_a < n_b) return(1); else if(n_a > n_b) return(-1); else return(0); break; case 8: n_a = (*a)->totContactedSentPeers+(*a)->totContactedRcvdPeers; n_b = (*b)->totContactedSentPeers+(*b)->totContactedRcvdPeers; if(n_a < n_b) return(1); else if(n_a > n_b) return(-1); else return(0); break; case 9: n_a = (*a)->lastSeen-(*a)->firstSeen; n_b = (*b)->lastSeen-(*b)->firstSeen; if(n_a < n_b) return(1); else if(n_a > n_b) return(-1); else return(0); break; case 10: n_a = (*a)->hostAS, n_b = (*b)->hostAS; if(n_a < n_b) return(1); else if(n_a > n_b) return(-1); else return(0); break; case 11: return(strcasecmp((*a)->community ? (*a)->community : "", (*b)->community ? (*b)->community : "")); break; case CONST_VLAN_COLUMN_SORT: n_a = (*a)->vlanId, n_b = (*b)->vlanId; if(n_a < n_b) return(1); else if(n_a > n_b) return(-1); else return(0); break; case FLAG_DOMAIN_DUMMY_IDX: rc = cmpFctnLocationName(a, b); return(rc); break; case 4: default: if((*a)->actBandwidthUsage < (*b)->actBandwidthUsage) return(1); else if ((*a)->actBandwidthUsage > (*b)->actBandwidthUsage) return(-1); else return(0); break; } } /* ******************************* */ int cmpUsersTraffic(const void *_a, const void *_b) { UsersTraffic **a = (UsersTraffic **)_a; UsersTraffic **b = (UsersTraffic **)_b; Counter sum_a, sum_b; if((a == NULL) && (b != NULL)) { return(1); } else if((a != NULL) && (b == NULL)) { return(-1); } else if((a == NULL) && (b == NULL)) { return(0); } sum_a = (*a)->bytesSent + (*a)->bytesRcvd; sum_b = (*b)->bytesSent + (*b)->bytesRcvd; if(sum_a > sum_b) return(-1); else if (sum_a == sum_b) return(0); else return(1); } /* ******************************* */ int cmpProcesses(const void *_a, const void *_b) { ProcessInfo **a = (ProcessInfo **)_a; ProcessInfo **b = (ProcessInfo **)_b; if((a == NULL) && (b != NULL)) { return(1); } else if((a != NULL) && (b == NULL)) { return(-1); } else if((a == NULL) && (b == NULL)) { return(0); } switch(myGlobals.columnSort) { case 2: /* PID */ if((*a)->pid == (*b)->pid) return(0); else if((*a)->pid < (*b)->pid) return(1); else return(-1); break; case 3: /* User */ return(strcasecmp((*a)->user, (*b)->user)); break; case 4: /* Sent */ if((*a)->bytesSent.value == (*b)->bytesSent.value) return(0); else if((*a)->bytesSent.value < (*b)->bytesSent.value) return(1); else return(-1); break; case 5: /* Rcvd */ if((*a)->bytesRcvd.value == (*b)->bytesRcvd.value) return(0); else if((*a)->bytesRcvd.value < (*b)->bytesRcvd.value) return(1); else return(-1); break; default: /* Process name */ return(strcasecmp((*a)->command, (*b)->command)); } } /* ******************************* */ static int cmpOSFctn(const void *_a, const void *_b) { OsNumInfo *a = (OsNumInfo *)_a; OsNumInfo *b = (OsNumInfo *)_b; if(a->num < b->num) return(1); else return(-1); } /* ******************************* */ int cmpFctn(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter a_=0, b_=0, a_val, b_val; float fa_=0, fb_=0; short floatCompare=0, columnProtoId; if((a == NULL) && (b != NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (1)"); return(1); } else if((a != NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (2)"); return(-1); } else if((a == NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (3)"); return(0); } if((*a == NULL) && (*b != NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (4)"); return(1); } else if((*a != NULL) && (*b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (5)"); return(-1); } else if((*a == NULL) && (*b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (6)"); return(0); } if(myGlobals.columnSort == FLAG_HOST_DUMMY_IDX) { return(cmpFctnResolvedName(a, b)); } else if(myGlobals.columnSort == FLAG_DOMAIN_DUMMY_IDX) { int rc; fillDomainName(*a); fillDomainName(*b); #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "%s='%s'/'%s' - %s='%s'/'%s'", (*a)->hostResolvedName, (*a)->ip2ccValue, (*a)->dnsDomainValue, (*b)->hostResolvedName, (*b)->ip2ccValue, (*b)->dnsDomainValue ); #endif rc = cmpFctnLocationName(a, b); return(rc); } #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "reportKind=%d/columnSort=%d/numIpProtosToMonitor=%d\n", myGlobals.reportKind, myGlobals.columnSort, myGlobals.numIpProtosToMonitor); #endif switch(myGlobals.reportKind) { case SORT_DATA_RECEIVED_PROTOS: switch(myGlobals.columnSort) { case 0: a_ = (*a)->bytesRcvd.value, b_ = (*b)->bytesRcvd.value; break; case 1: a_ = (*a)->tcpRcvdLoc.value + (*a)->tcpRcvdFromRem.value; b_ = (*b)->tcpRcvdLoc.value + (*b)->tcpRcvdFromRem.value; break; case 2: a_ = (*a)->udpRcvdLoc.value + (*a)->udpRcvdFromRem.value; b_ = (*b)->udpRcvdLoc.value + (*b)->udpRcvdFromRem.value; break; case 3: a_ = (*a)->icmpRcvd.value, b_ = (*b)->icmpRcvd.value; break; case 4: a_ = (*a)->icmp6Rcvd.value, b_ = (*b)->icmp6Rcvd.value; break; case 5: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->dlcRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->dlcRcvd.value; break; case 6: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->ipxRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->ipxRcvd.value; break; case 7: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->decnetRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->decnetRcvd.value; break; case 8: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->arp_rarpRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->arp_rarpRcvd.value; break; case 9: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->appletalkRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->appletalkRcvd.value; break; case 11: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->netbiosRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->netbiosRcvd.value; break; case 13: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->osiRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->osiRcvd.value; break; case 14: a_ = (*a)->ipv6Rcvd.value, b_ = (*b)->ipv6Rcvd.value; break; case 15: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->stpRcvd.value; break; case 16: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->otherRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->otherRcvd.value; break; default: if((myGlobals.columnSort >= BASE_PROTOS_IDX) && (myGlobals.columnSort < (BASE_PROTOS_IDX+myGlobals.numIpProtosList))) { a_ = (*a)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->rcvd.value, b_ = (*b)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->rcvd.value; } break; } break; case SORT_DATA_RECEIVED_IP: columnProtoId = myGlobals.columnSort - 1; if((columnProtoId != -1) && (columnProtoId <= myGlobals.numIpProtosToMonitor)) { if(columnProtoId <= 0) { a_ = b_ = 0; } else { if((*a)->protoIPTrafficInfos[columnProtoId-1]) a_ = (*a)->protoIPTrafficInfos[columnProtoId-1]->rcvdLoc.value+ (*a)->protoIPTrafficInfos[columnProtoId-1]->rcvdFromRem.value; else a_ = 0; if((*b)->protoIPTrafficInfos[columnProtoId-1]) b_ = (*b)->protoIPTrafficInfos[columnProtoId-1]->rcvdLoc.value+ (*b)->protoIPTrafficInfos[columnProtoId-1]->rcvdFromRem.value; else b_ = 0; } } else { a_ = (*a)->ipBytesRcvd.value, b_ = (*b)->ipBytesRcvd.value; if(myGlobals.numIpProtosToMonitor == (columnProtoId-1)) { /* other IP */ int i; for(i=0; iprotoIPTrafficInfos[i]) a_val = ((*a)->protoIPTrafficInfos[i]->rcvdLoc.value +(*a)->protoIPTrafficInfos[i]->rcvdFromRem.value); else a_val = 0; if((*b)->protoIPTrafficInfos[i]) b_val = ((*b)->protoIPTrafficInfos[i]->rcvdLoc.value +(*b)->protoIPTrafficInfos[i]->rcvdFromRem.value); else b_val = 0; /* Better be safe... */ if(a_ > a_val) a_ -= a_val; else a_ = 0; if(b_ > b_val) b_ -= b_val; else b_ = 0; } } } break; case SORT_DATA_RECEIVED_THPT: switch(myGlobals.columnSort) { case 1: fa_ = (*a)->actualRcvdThpt, fb_ = (*b)->actualRcvdThpt, floatCompare = 1; break; case 2: fa_ = (*a)->averageRcvdThpt, fb_ = (*b)->averageRcvdThpt, floatCompare = 1; break; case 3: fa_ = (*a)->peakRcvdThpt, fb_ = (*b)->peakRcvdThpt, floatCompare = 1; break; case 4: fa_ = (*a)->actualRcvdPktThpt, fb_ = (*b)->actualRcvdPktThpt, floatCompare = 1; break; case 5: fa_ = (*a)->averageRcvdPktThpt, fb_ = (*b)->averageRcvdPktThpt, floatCompare = 1; break; case 6: fa_ = (*a)->peakRcvdPktThpt, fb_ = (*b)->peakRcvdPktThpt, floatCompare = 1; break; } break; case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_HOST_TRAFFIC: /* Nothing */ break; case SORT_DATA_SENT_PROTOS: switch(myGlobals.columnSort) { case 0: a_ = (*a)->bytesSent.value, b_ = (*b)->bytesSent.value; break; case 1: a_ = (*a)->tcpSentLoc.value + (*a)->tcpSentRem.value; b_ = (*b)->tcpSentLoc.value + (*b)->tcpSentRem.value; break; case 2: a_ = (*a)->udpSentLoc.value + (*a)->udpSentRem.value; b_ = (*b)->udpSentLoc.value + (*b)->udpSentRem.value; break; case 3: a_ = (*a)->icmpSent.value, b_ = (*b)->icmpSent.value; break; case 4: a_ = (*a)->icmp6Sent.value, b_ = (*b)->icmp6Sent.value; break; case 5: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->dlcSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->dlcSent.value; break; case 6: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->ipxSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->ipxSent.value; break; case 7: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->decnetSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->decnetSent.value; break; case 8: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->arp_rarpSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->arp_rarpSent.value; break; case 9: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->appletalkSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->appletalkSent.value; break; case 11: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->netbiosSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->netbiosSent.value; break; case 13: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->osiSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->osiSent.value; break; case 14: a_ = (*a)->ipv6Sent.value, b_ = (*b)->ipv6Sent.value; break; case 15: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->stpSent.value; break; case 16: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->otherSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->otherSent.value; break; default: if((myGlobals.columnSort >= BASE_PROTOS_IDX) && (myGlobals.columnSort < (BASE_PROTOS_IDX+myGlobals.numIpProtosList))) { a_ = (*a)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->sent.value, b_ = (*b)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->sent.value; } break; } break; case SORT_DATA_SENT_IP: columnProtoId = myGlobals.columnSort - 1; if((columnProtoId != -1) && (columnProtoId <= myGlobals.numIpProtosToMonitor)) { if(columnProtoId <= 0) { a_ = b_ = 0; } else { if((*a)->protoIPTrafficInfos[columnProtoId-1]) a_ = (*a)->protoIPTrafficInfos[columnProtoId-1]->sentLoc.value +(*a)->protoIPTrafficInfos[columnProtoId-1]->sentRem.value; else a_ = 0; if((*b)->protoIPTrafficInfos[columnProtoId-1]) b_ = (*b)->protoIPTrafficInfos[columnProtoId-1]->sentLoc.value +(*b)->protoIPTrafficInfos[columnProtoId-1]->sentRem.value; else b_ = 0; } } else { a_ = (*a)->ipBytesSent.value, b_ = (*b)->ipBytesSent.value; if(myGlobals.numIpProtosToMonitor == (columnProtoId-1)) { /* other IP */ int i; for(i=0; iprotoIPTrafficInfos[i]) a_val = ((*a)->protoIPTrafficInfos[i]->sentLoc.value +(*a)->protoIPTrafficInfos[i]->sentRem.value); else a_val = 0; if((*b)->protoIPTrafficInfos[i]) b_val = ((*b)->protoIPTrafficInfos[i]->sentLoc.value +(*b)->protoIPTrafficInfos[i]->sentRem.value); else b_val = 0; /* Better be safe... */ if(a_ > a_val) a_ -= a_val; else a_ = 0; if(b_ > b_val) b_ -= b_val; else b_ = 0; } } } break; case SORT_DATA_SENT_THPT: switch(myGlobals.columnSort) { case 1: fa_ = (*a)->actualSentThpt, fb_ = (*b)->actualSentThpt, floatCompare = 1; break; case 2: fa_ = (*a)->averageSentThpt, fb_ = (*b)->averageSentThpt, floatCompare = 1; break; case 3: fa_ = (*a)->peakSentThpt, fb_ = (*b)->peakSentThpt, floatCompare = 1; break; case 4: fa_ = (*a)->actualSentPktThpt, fb_ = (*b)->actualSentPktThpt, floatCompare = 1; break; case 5: fa_ = (*a)->averageSentPktThpt, fb_ = (*b)->averageSentPktThpt, floatCompare = 1; break; case 6: fa_ = (*a)->peakSentPktThpt, fb_ = (*b)->peakSentPktThpt, floatCompare = 1; break; } break; case TRAFFIC_STATS: /* Nothing */ break; case SORT_DATA_PROTOS: switch(myGlobals.columnSort) { case 0: a_ = (*a)->bytesRcvd.value+(*a)->bytesSent.value, b_ = (*b)->bytesRcvd.value+(*b)->bytesSent.value; break; case 1: a_ = (*a)->tcpRcvdLoc.value + (*a)->tcpRcvdFromRem.value + (*a)->tcpSentLoc.value + (*a)->tcpSentRem.value; b_ = (*b)->tcpRcvdLoc.value + (*b)->tcpRcvdFromRem.value + (*b)->tcpSentLoc.value + (*b)->tcpSentRem.value; break; case 2: a_ = (*a)->udpRcvdLoc.value + (*a)->udpRcvdFromRem.value + (*a)->udpSentLoc.value + (*a)->udpSentRem.value; b_ = (*b)->udpRcvdLoc.value + (*b)->udpRcvdFromRem.value + (*b)->udpSentLoc.value + (*b)->udpSentRem.value; break; case 3: a_ = (*a)->icmpRcvd.value+(*a)->icmpSent.value, b_ = (*b)->icmpRcvd.value+(*b)->icmpSent.value; break; case 4: a_ = (*a)->icmp6Rcvd.value+(*a)->icmp6Sent.value, b_ = (*b)->icmp6Rcvd.value+(*b)->icmp6Sent.value; break; case 5: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpSent.value+(*a)->nonIPTraffic->stpRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->stpSent.value+(*b)->nonIPTraffic->stpRcvd.value; break; case 6: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->ipxSent.value+(*a)->nonIPTraffic->ipxRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->ipxSent.value+(*b)->nonIPTraffic->ipxRcvd.value; break; case 7: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->decnetSent.value+(*a)->nonIPTraffic->decnetRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->decnetSent.value+(*b)->nonIPTraffic->decnetRcvd.value; break; case 8: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->arp_rarpSent.value+(*a)->nonIPTraffic->arp_rarpRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->arp_rarpSent.value+(*b)->nonIPTraffic->arp_rarpRcvd.value; break; case 9: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->appletalkSent.value+(*a)->nonIPTraffic->appletalkRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->appletalkSent.value+(*b)->nonIPTraffic->appletalkRcvd.value; break; case 11: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->netbiosSent.value+(*a)->nonIPTraffic->netbiosRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->netbiosSent.value+(*b)->nonIPTraffic->netbiosRcvd.value; break; case 13: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->osiSent.value+(*a)->nonIPTraffic->osiRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->osiSent.value+(*b)->nonIPTraffic->osiRcvd.value; break; case 14: a_ = (*a)->ipv6Rcvd.value+(*a)->ipv6Sent.value, b_ = (*b)->ipv6Rcvd.value+(*b)->ipv6Sent.value; break; case 15: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpSent.value+(*a)->nonIPTraffic->stpRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->stpSent.value+(*b)->nonIPTraffic->stpRcvd.value; break; case 16: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->otherSent.value+(*a)->nonIPTraffic->otherRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->otherSent.value+(*b)->nonIPTraffic->otherRcvd.value; break; default: if((myGlobals.columnSort >= BASE_PROTOS_IDX) && (myGlobals.columnSort < (BASE_PROTOS_IDX+myGlobals.numIpProtosList))) { a_ = (*a)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->sent.value +(*a)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->rcvd.value; b_ = (*b)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->sent.value +(*b)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->rcvd.value; } break; } break; case SORT_DATA_IP: columnProtoId = myGlobals.columnSort - 1; if((columnProtoId != -1) && (columnProtoId <= myGlobals.numIpProtosToMonitor)) { if(columnProtoId <= 0) { a_ = b_ = 0; } else { if((*a)->protoIPTrafficInfos[columnProtoId-1]) a_ = (*a)->protoIPTrafficInfos[columnProtoId-1]->rcvdLoc.value+ (*a)->protoIPTrafficInfos[columnProtoId-1]->rcvdFromRem.value+ (*a)->protoIPTrafficInfos[columnProtoId-1]->sentLoc.value+ (*a)->protoIPTrafficInfos[columnProtoId-1]->sentRem.value; else a_ = 0; if((*b)->protoIPTrafficInfos[columnProtoId-1]) b_ = (*b)->protoIPTrafficInfos[columnProtoId-1]->rcvdLoc.value+ (*b)->protoIPTrafficInfos[columnProtoId-1]->rcvdFromRem.value+ (*b)->protoIPTrafficInfos[columnProtoId-1]->sentLoc.value+ (*b)->protoIPTrafficInfos[columnProtoId-1]->sentRem.value; else b_ = 0; } } else { a_ = (*a)->ipBytesRcvd.value+(*a)->ipBytesSent.value; b_ = (*b)->ipBytesRcvd.value+(*b)->ipBytesSent.value; if(myGlobals.numIpProtosToMonitor == (columnProtoId-1)) { /* other IP */ int i; for(i=0; iprotoIPTrafficInfos[i]) a_val = ((*a)->protoIPTrafficInfos[i]->rcvdLoc.value +(*a)->protoIPTrafficInfos[i]->rcvdFromRem.value +(*a)->protoIPTrafficInfos[i]->sentLoc.value +(*a)->protoIPTrafficInfos[i]->sentRem.value); else a_val = 0; if((*b)->protoIPTrafficInfos[i]) b_val = ((*b)->protoIPTrafficInfos[i]->rcvdLoc.value +(*b)->protoIPTrafficInfos[i]->rcvdFromRem.value +(*b)->protoIPTrafficInfos[i]->sentLoc.value +(*b)->protoIPTrafficInfos[i]->sentRem.value); else b_val = 0; /* Better be safe... */ if(a_ > a_val) a_ -= a_val; else a_ = 0; if(b_ > b_val) b_ -= b_val; else b_ = 0; } } } break; case SORT_DATA_THPT: switch(myGlobals.columnSort) { case 1: fa_ = (*a)->actualTThpt; fb_ = (*b)->actualTThpt; floatCompare = 1; break; case 2: fa_ = (*a)->averageTThpt; fb_ = (*b)->averageTThpt; floatCompare = 1; break; case 3: fa_ = (*a)->peakTThpt; fb_ = (*b)->peakTThpt; floatCompare = 1; break; case 4: fa_ = (*a)->actualTPktThpt; fb_ = (*b)->actualTPktThpt; floatCompare = 1; break; case 5: fa_ = (*a)->averageTPktThpt; fb_ = (*b)->averageTPktThpt; floatCompare = 1; break; case 6: fa_ = (*a)->peakTPktThpt; fb_ = (*b)->peakTPktThpt; floatCompare = 1; break; } break; } /* traceEvent(CONST_TRACE_INFO, "%s=%u - %s=%u", (*a)->hostResolvedName, (unsigned long)a_, (*b)->hostResolvedName, (unsigned long)b_); */ if(floatCompare == 0) { if(a_ < b_) { return(1); } else if (a_ > b_) { return(-1); } else { return(0); } } else { if(fa_ < fb_) { return(1); } else if (fa_ > fb_) { return(-1); } else { return(0); } } } /* ******************************* */ int cmpMulticastFctn(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; int rc; if((a == NULL) && (b != NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpMulticastFctn() error (1)"); return(1); } else if((a != NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpMulticastFctn() error (2)"); return(-1); } else if((a == NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpMulticastFctn() error (3)"); return(0); } switch(myGlobals.columnSort) { case 2: if((*a)->pktMulticastSent.value < (*b)->pktMulticastSent.value) return(1); else if ((*a)->pktMulticastSent.value > (*b)->pktMulticastSent.value) return(-1); else return(0); break; /* NOTREACHED */ case 3: if((*a)->bytesMulticastSent.value < (*b)->bytesMulticastSent.value) return(1); else if ((*a)->bytesMulticastSent.value > (*b)->bytesMulticastSent.value) return(-1); else return(0); break; /* NOTREACHED */ case 4: if((*a)->pktMulticastRcvd.value < (*b)->pktMulticastRcvd.value) return(1); else if ((*a)->pktMulticastRcvd.value > (*b)->pktMulticastRcvd.value) return(-1); else return(0); break; /* NOTREACHED */ case 5: if((*a)->bytesMulticastRcvd.value < (*b)->bytesMulticastRcvd.value) return(1); else if ((*a)->bytesMulticastRcvd.value > (*b)->bytesMulticastRcvd.value) return(-1); else return(0); break; /* NOTREACHED */ default: rc=cmpFctnResolvedName(a, b); return(rc); } } /* *********************************** */ static char* getBgPctgColor(float pctg) { if(pctg == 0) return(TD_BG); else if(pctg <= CONST_PCTG_LOW) /* < 25% */ return(CONST_CONST_PCTG_LOW_COLOR); else if(pctg <= CONST_PCTG_MID) /* 25% <=> 75% */ return(CONST_CONST_PCTG_MID_COLOR); else /* > 75% */ return(CONST_PCTG_HIGH_COLOR); } /* ******************************* */ void printHostThtpShort(HostTraffic *el, int reportType, u_int hourId) { int i, j; Counter tc; char buf[64]; if(el->trafficDistribution == NULL) return; for(i=0, tc=0; i<24; i++) { switch(reportType) { case SORT_DATA_RCVD_HOST_TRAFFIC: tc += el->trafficDistribution->last24HoursBytesRcvd[i].value; break; case SORT_DATA_SENT_HOST_TRAFFIC: tc += el->trafficDistribution->last24HoursBytesSent[i].value; break; case SORT_DATA_HOST_TRAFFIC: case TRAFFIC_STATS: tc += el->trafficDistribution->last24HoursBytesRcvd[i].value + el->trafficDistribution->last24HoursBytesSent[i].value; break; } } j = hourId; for(i=0; i<24; i++) { float pctg=0; j = j % 24; if(tc > 0) { switch(reportType) { case SORT_DATA_RCVD_HOST_TRAFFIC: pctg = (float)(el->trafficDistribution->last24HoursBytesRcvd[j].value*100)/(float)tc; break; case SORT_DATA_SENT_HOST_TRAFFIC: pctg = (float)(el->trafficDistribution->last24HoursBytesSent[j].value*100)/(float)tc; break; case SORT_DATA_HOST_TRAFFIC: case TRAFFIC_STATS: pctg = ( (float)(el->trafficDistribution->last24HoursBytesRcvd[j].value*100) + (float)(el->trafficDistribution->last24HoursBytesSent[j].value*100) ) / (float)tc; break; } } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getBgPctgColor(pctg)); sendString(buf); if (!j) { j = 23; } else { j--; } } } /* ******************************* */ int cmpHostsFctn(const void *_a, const void *_b) { struct hostTraffic **a = (struct hostTraffic **)_a; struct hostTraffic **b = (struct hostTraffic **)_b; Counter a_=0, b_=0; switch(myGlobals.columnSort) { case 2: /* IP Address */ if(isFcHost((*a)) && isFcHost((*b))) { return(memcmp(((u_int8_t *)&(*a)->fcCounters->hostFcAddress), ((u_int8_t *)&(*b)->fcCounters->hostFcAddress), LEN_FC_ADDRESS)); } else return(addrcmp(&(*a)->hostIpAddress, &(*b)->hostIpAddress)); break; case 3: /* Data Sent */ if (isFcHost((*a)) && isFcHost((*b))) { a_ = (*a)->fcCounters->fcBytesSent.value; b_ = (*b)->fcCounters->fcBytesSent.value; } else { switch(myGlobals.sortFilter) { case FLAG_REMOTE_TO_LOCAL_ACCOUNTING: a_ = (*a)->bytesSentLoc.value; b_ = (*b)->bytesSentLoc.value; break; case FLAG_LOCAL_TO_REMOTE_ACCOUNTING: a_ = (*a)->bytesSentRem.value; b_ = (*b)->bytesSentRem.value; break; case FLAG_LOCAL_TO_LOCAL_ACCOUNTING: a_ = (*a)->bytesSentLoc.value; b_ = (*b)->bytesSentLoc.value; break; } } if(a_ < b_) return(1); else if (a_ > b_) return(-1); else return(0); break; case 4: /* Data Rcvd */ if(isFcHost((*a)) && isFcHost((*b))) { a_ = (*a)->fcCounters->fcBytesRcvd.value; b_ = (*b)->fcCounters->fcBytesRcvd.value; } else { switch(myGlobals.sortFilter) { case FLAG_REMOTE_TO_LOCAL_ACCOUNTING: a_ = (*a)->bytesRcvdLoc.value; b_ = (*b)->bytesRcvdLoc.value; break; case FLAG_LOCAL_TO_REMOTE_ACCOUNTING: a_ = (*a)->bytesRcvdFromRem.value; b_ = (*b)->bytesRcvdFromRem.value; break; case FLAG_LOCAL_TO_LOCAL_ACCOUNTING: a_ = (*a)->bytesRcvdLoc.value; b_ = (*b)->bytesRcvdLoc.value; break; } } if(a_ < b_) return(1); else if (a_ > b_) return(-1); else return(0); break; case 5: /* VSAN */ if(isFcHost((*a)) && isFcHost((*b))) { a_ = (*a)->fcCounters->vsanId, b_ = (*b)->fcCounters->vsanId; return((a_ < b_) ? -1 : (a_ > b_) ? 1 : 0); } break; default: /* Host Name */ return(cmpFctnResolvedName(a, b)); } return(-1); } /* ************************************ */ void printPacketStats(HostTraffic *el, int actualDeviceId) { char buf[LEN_GENERAL_WORK_BUFFER]; char formatBuf[32]; int headerSent = 0; char *tableHeader = "
%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Domain%s
 
"; /* *********************** */ if(el->secHostPkts != NULL) { if(((el->secHostPkts->rejectedTCPConnSent.value.value+ el->secHostPkts->rejectedTCPConnRcvd.value.value+ el->secHostPkts->establishedTCPConnSent.value.value+ el->secHostPkts->establishedTCPConnRcvd.value.value+ el->secHostPkts->synPktsSent.value.value+ el->secHostPkts->synPktsRcvd.value.value) > 0)) { if(!headerSent) { printSectionTitle("Packet Statistics"); sendString(tableHeader); headerSent = 1; } sendString("
\n" ""TABLE_ON"" "" "" "\n"); if((el->secHostPkts->synPktsSent.value.value+el->secHostPkts->synPktsRcvd.value.value) > 0) { sendString(""); formatUsageCounter(el->secHostPkts->synPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->synPktsRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->establishedTCPConnSent.value.value+el->secHostPkts->establishedTCPConnRcvd.value.value) > 0) { sendString(""); formatUsageCounter(el->secHostPkts->establishedTCPConnSent, el->secHostPkts->synPktsSent.value.value, actualDeviceId); formatUsageCounter(el->secHostPkts->establishedTCPConnRcvd, el->secHostPkts->synPktsRcvd.value.value, actualDeviceId); sendString("\n"); } if((el->secHostPkts->terminatedTCPConnServer.value.value + el->secHostPkts->terminatedTCPConnClient.value.value) > 0) { sendString(""); formatUsageCounter(el->secHostPkts->terminatedTCPConnServer, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->terminatedTCPConnClient, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->rejectedTCPConnSent.value.value+el->secHostPkts->rejectedTCPConnRcvd.value.value) > 0) { sendString(""); formatUsageCounter(el->secHostPkts->rejectedTCPConnSent, el->secHostPkts->synPktsSent.value.value, actualDeviceId); formatUsageCounter(el->secHostPkts->rejectedTCPConnRcvd, el->secHostPkts->synPktsRcvd.value.value, actualDeviceId); sendString("\n"); } sendString("
TCP ConnectionsDirected toRcvd From
Attempted
Established
Terminated
Rejected
"TABLE_OFF"

\n"); sendString("

\n"); } /* *********************** */ if((el->secHostPkts->synPktsSent.value.value+el->secHostPkts->synPktsRcvd.value.value +el->secHostPkts->rstAckPktsSent.value.value+el->secHostPkts->rstAckPktsRcvd.value.value +el->secHostPkts->rstPktsSent.value.value+el->secHostPkts->rstPktsRcvd.value.value +el->secHostPkts->synFinPktsSent.value.value+el->secHostPkts->synFinPktsRcvd.value.value +el->secHostPkts->finPushUrgPktsSent.value.value+el->secHostPkts->finPushUrgPktsRcvd.value.value +el->secHostPkts->nullPktsSent.value.value+el->secHostPkts->nullPktsRcvd.value.value) > 0) { if(!headerSent) { printSectionTitle("Packet Statistics"); sendString(tableHeader); headerSent = 1; } sendString("
\n" ""TABLE_ON"" "" "\n"); if((el->secHostPkts->synPktsSent.value.value+el->secHostPkts->synPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->synPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->synPktsRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->rstAckPktsSent.value.value+el->secHostPkts->rstAckPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->rstAckPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->rstAckPktsRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->rstPktsSent.value.value+el->secHostPkts->rstPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->rstPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->rstPktsRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->synFinPktsSent.value.value+el->secHostPkts->synFinPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->synFinPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->synFinPktsRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->finPushUrgPktsSent.value.value+el->secHostPkts->finPushUrgPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->finPushUrgPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->finPushUrgPktsRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->nullPktsSent.value.value+el->secHostPkts->nullPktsRcvd.value.value) > 0) { sendString(""); formatUsageCounter(el->secHostPkts->nullPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->nullPktsRcvd, 0, actualDeviceId); sendString("\n"); } sendString("
TCP FlagsPkts SentPkts Rcvd
SYN
RST|ACK
RST
SYN|FIN
FIN|PUSH|URG
NULL
"TABLE_OFF"

\n"); sendString("

\n"); } /* *********************** */ if(((el->secHostPkts->ackXmasFinSynNullScanSent.value.value+el->secHostPkts->ackXmasFinSynNullScanRcvd.value.value +el->secHostPkts->udpToClosedPortSent.value.value +el->secHostPkts->udpToClosedPortRcvd.value.value +el->secHostPkts->udpToDiagnosticPortSent.value.value +el->secHostPkts->udpToDiagnosticPortRcvd.value.value +el->secHostPkts->tcpToDiagnosticPortSent.value.value +el->secHostPkts->tcpToDiagnosticPortRcvd.value.value +el->secHostPkts->tinyFragmentSent.value.value +el->secHostPkts->tinyFragmentRcvd.value.value +el->secHostPkts->icmpFragmentSent.value.value +el->secHostPkts->icmpFragmentRcvd.value.value +el->secHostPkts->overlappingFragmentSent.value.value +el->secHostPkts->overlappingFragmentRcvd.value.value +el->secHostPkts->closedEmptyTCPConnSent.value.value +el->secHostPkts->closedEmptyTCPConnRcvd.value.value +el->secHostPkts->icmpPortUnreachSent.value.value +el->secHostPkts->icmpPortUnreachRcvd.value.value +el->secHostPkts->icmpHostNetUnreachSent.value.value +el->secHostPkts->icmpHostNetUnreachRcvd.value.value +el->secHostPkts->icmpProtocolUnreachSent.value.value +el->secHostPkts->icmpProtocolUnreachRcvd.value.value +el->secHostPkts->icmpAdminProhibitedSent.value.value +el->secHostPkts->icmpAdminProhibitedRcvd.value.value +el->secHostPkts->malformedPktsSent.value.value +el->secHostPkts->malformedPktsRcvd.value.value ) > 0)) { if(!headerSent) { printSectionTitle("Packet Statistics"); sendString(tableHeader); headerSent = 1; } sendString("
\n" ""TABLE_ON"" "" "" "\n"); if((el->secHostPkts->ackXmasFinSynNullScanSent.value.value+el->secHostPkts->ackXmasFinSynNullScanRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->ackXmasFinSynNullScanSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->ackXmasFinSynNullScanRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->udpToClosedPortSent.value.value+ el->secHostPkts->udpToClosedPortRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->udpToClosedPortSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->udpToClosedPortRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->udpToDiagnosticPortSent.value.value+ el->secHostPkts->udpToDiagnosticPortRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->udpToDiagnosticPortSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->udpToDiagnosticPortRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->tcpToDiagnosticPortSent.value.value+ el->secHostPkts->tcpToDiagnosticPortRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->tcpToDiagnosticPortSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->tcpToDiagnosticPortRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->tinyFragmentSent.value.value+ el->secHostPkts->tinyFragmentRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->tinyFragmentSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->tinyFragmentRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->icmpFragmentSent.value.value+ el->secHostPkts->icmpFragmentRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->icmpFragmentSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->icmpFragmentRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->overlappingFragmentSent.value.value+ el->secHostPkts->overlappingFragmentRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->overlappingFragmentSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->overlappingFragmentRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->closedEmptyTCPConnSent.value.value+ el->secHostPkts->closedEmptyTCPConnRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->closedEmptyTCPConnSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->closedEmptyTCPConnRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->icmpPortUnreachSent.value.value+ el->secHostPkts->icmpPortUnreachRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->icmpPortUnreachSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->icmpPortUnreachRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->icmpHostNetUnreachSent.value.value+ el->secHostPkts->icmpHostNetUnreachRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->icmpHostNetUnreachSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->icmpHostNetUnreachRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->icmpProtocolUnreachSent.value.value+ el->secHostPkts->icmpProtocolUnreachRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->icmpProtocolUnreachSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->icmpProtocolUnreachRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->icmpAdminProhibitedSent.value.value+ el->secHostPkts->icmpAdminProhibitedRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->icmpAdminProhibitedSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->icmpAdminProhibitedRcvd, 0, actualDeviceId); sendString("\n"); } if((el->secHostPkts->malformedPktsSent.value.value+ el->secHostPkts->malformedPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->malformedPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->malformedPktsRcvd, 0, actualDeviceId); sendString("\n"); } sendString("
AnomalyPkts Sent toPkts Rcvd from
ACK/XMAS/SYN/FIN/NULL Scan
UDP Pkt to Closed Port
UDP Pkt Disgnostic Port
TCP Pkt Disgnostic Port
Tiny Fragments
ICMP Fragments
Overlapping Fragments
Closed Empty TCP Conn.
ICMP Port Unreachable
ICMP Net Unreachable
ICMP Protocol Unreachable
ICMP Administratively Prohibited
Malformed Pkts
"TABLE_OFF"

\n"); sendString("

\n"); } } if(el->nonIPTraffic) { if(el->nonIPTraffic->arpReqPktsSent.value+el->nonIPTraffic->arpReplyPktsSent.value+el->nonIPTraffic->arpReplyPktsRcvd.value > 0) { if(!headerSent) { printSectionTitle("Packet Statistics"); sendString(tableHeader); headerSent = 1; } sendString("
\n" ""TABLE_ON"" "" "" "\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", getRowColor(), formatPkts(el->nonIPTraffic->arpReqPktsSent.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", getRowColor(), formatPkts(el->nonIPTraffic->arpReplyPktsRcvd.value, formatBuf, sizeof(formatBuf)), ((el->nonIPTraffic->arpReqPktsSent.value > 0) ? (float)((el->nonIPTraffic->arpReplyPktsRcvd.value*100)/(float)el->nonIPTraffic->arpReqPktsSent.value) : 0)); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", getRowColor(), formatPkts(el->nonIPTraffic->arpReplyPktsSent.value, formatBuf, sizeof(formatBuf))); sendString(buf); sendString("
ARPPacket
Request Sent%s
Reply Rcvd%s (%.1f %%)
Reply Sent%s
"TABLE_OFF"

\n"); sendString("

\n"); } } if(headerSent) { sendString("
"TABLE_OFF"
"); } } /* ************************************ */ void printHostFragmentStats(HostTraffic *el, int actualDeviceId) { Counter totalSent, totalRcvd; char buf[LEN_GENERAL_WORK_BUFFER]; char linkName[LEN_GENERAL_WORK_BUFFER/2], vlanStr[32]; totalSent = el->tcpFragmentsSent.value + el->udpFragmentsSent.value + el->icmpFragmentsSent.value; totalRcvd = el->tcpFragmentsRcvd.value + el->udpFragmentsRcvd.value + el->icmpFragmentsRcvd.value; if((totalSent == 0) && (totalRcvd == 0)) return; printSectionTitle("IP Fragments Distribution"); sendString("
\n" ""TABLE_ON"" "" "\n"); printTableDoubleEntry(buf, sizeof(buf), "TCP", CONST_COLOR_1, (float)el->tcpFragmentsSent.value/1024, 100*((float)SD(el->tcpFragmentsSent.value, totalSent)), (float)el->tcpFragmentsRcvd.value/1024, 100*((float)SD(el->tcpFragmentsRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "UDP", CONST_COLOR_1, (float)el->udpFragmentsSent.value/1024, 100*((float)SD(el->udpFragmentsSent.value, totalSent)), (float)el->udpFragmentsRcvd.value/1024, 100*((float)SD(el->udpFragmentsRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "ICMP", CONST_COLOR_1, (float)el->icmpFragmentsSent.value/1024, 100*((float)SD(el->icmpFragmentsSent.value, totalSent)), (float)el->icmpFragmentsRcvd.value/1024, 100*((float)SD(el->icmpFragmentsRcvd.value, totalRcvd))); { if((totalSent > 0) || (totalRcvd > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); if(el->hostNumIpAddress[0] != '\0') { strncpy(linkName, el->hostNumIpAddress, sizeof(linkName)); } else { strncpy(linkName, el->ethAddressString, sizeof(linkName)); } /* For Ethernet and IPv6 addresses */ urlFixupToRFC1945Inplace(linkName); if(el->vlanId > 0) { safe_snprintf(__FILE__, __LINE__, vlanStr, sizeof(vlanStr), "-%d", el->vlanId); } else vlanStr[0] = '\0'; if(totalSent > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", linkName, vlanStr, el->hostNumIpAddress[0] == '\0' ? el->ethAddressString : el->hostNumIpAddress, vlanStr); sendString(buf); } else { sendString(""); } if(totalRcvd > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", linkName, vlanStr, el->hostNumIpAddress[0] == '\0' ? el->ethAddressString : el->hostNumIpAddress, vlanStr); sendString(buf); } else { sendString(""); } sendString(""); /* ***************************************** */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); if(totalSent > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", linkName, vlanStr, el->hostNumIpAddress[0] == '\0' ? el->ethAddressString : el->hostNumIpAddress, vlanStr); sendString(buf); } else { sendString(""); } if(totalRcvd > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", linkName, vlanStr, el->hostNumIpAddress[0] == '\0' ? el->ethAddressString : el->hostNumIpAddress, vlanStr); sendString(buf); } else { sendString(""); } sendString(""); } } sendString("
ProtocolData SentData Rcvd
Fragment Distribution" "\"Sent " "\"Received 
IP Fragment Distribution" "\"Sent " "\"Received 
"TABLE_OFF"

\n"); sendString("

\n"); } /* ************************************ */ static char* sap2name(u_int16_t proto, char *sap, int sap_len) { switch(proto) { case SAP_NULL: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "NULL LSAP"); break; case SAP_LLC_SLMGMT: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "LLC Sub-Layer Management"); break; case SAP_SNA_PATHCTRL: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "SNA Path Control"); break; case SAP_IP: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "TCP/IP"); break; case SAP_SNA1: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "SNA"); break; case SAP_SNA2: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "SNA"); break; case SAP_PROWAY_NM_INIT: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "PROWAY (IEC955) Network Management and Initialization"); break; case SAP_TI: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Texas Instruments"); break; case SAP_BPDU: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Spanning Tree BPDU"); break; case SAP_RS511: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "EIA RS-511 Manufacturing Message Service"); break; case SAP_X25: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "ISO 8208 (X.25 over 802.2)"); break; case 0x7F: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "ISO 802.2"); break; case SAP_XNS: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "XNS"); break; case SAP_BACNET: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "BACnet"); break; case SAP_NESTAR: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Nestar"); break; case SAP_PROWAY_ASLM: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "PROWAY (IEC955) Active Station List Maintenance"); break; case SAP_ARP: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "ARP"); break; case SAP_SNAP: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "SNAP"); break; case SAP_VINES1: case SAP_VINES2: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Banyan Vines"); break; case SAP_NETWARE: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "NetWare"); break; case SAP_NETBIOS: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "NetBIOS"); break; case SAP_IBMNM: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "IBM Net Management"); break; case SAP_HPEXT: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "HP Extended LLC"); break; case SAP_UB: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Ungermann-Bass"); break; case SAP_RPL: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Remote Program Load"); break; case SAP_OSINL: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "ISO Network Layer"); break; case SAP_GLOBAL: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Global LSAP"); break; default: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "0x%X", proto); break; } return(sap); } /* ************************************ */ static void printUnknownProto(UnknownProto proto) { char buf[64]; switch(proto.protoType) { case 1: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • Ethernet Type: 0x%04X\n", proto.proto.ethType); break; case 2: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • SAP: DSAP=0x%02X/SSAP=0x%02X\n", proto.proto.sapType.dsap, proto.proto.sapType.ssap); break; case 3: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • IP Protocol: 0x%d\n", proto.proto.ipType); break; default: return; } sendString(buf); } /* ************************************ */ void printHostTrafficStats(HostTraffic *el, int actualDeviceId) { Counter totalSent, totalRcvd; Counter actTotalSent, actTotalRcvd; char buf[LEN_GENERAL_WORK_BUFFER], vlanStr[32]; char linkName[LEN_GENERAL_WORK_BUFFER/2]; int i, idx; ProtocolsList *protoList; totalSent = el->tcpSentLoc.value+el->tcpSentRem.value+el->udpSentLoc.value+el->udpSentRem.value; totalSent += el->icmpSent.value+el->icmp6Sent.value+el->ipv6Sent.value; if(el->nonIPTraffic != NULL) totalSent += el->nonIPTraffic->ipxSent.value+el->nonIPTraffic->dlcSent.value+el->nonIPTraffic->arp_rarpSent.value + el->nonIPTraffic->decnetSent.value+el->nonIPTraffic->appletalkSent.value+el->nonIPTraffic->netbiosSent.value+ el->nonIPTraffic->osiSent.value+el->nonIPTraffic->stpSent.value+el->nonIPTraffic->otherSent.value; totalRcvd = el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value; totalRcvd += el->udpRcvdLoc.value+el->udpRcvdFromRem.value; totalRcvd += el->icmpRcvd.value+el->icmp6Rcvd.value+el->ipv6Rcvd.value; if(el->nonIPTraffic != NULL) totalRcvd += el->nonIPTraffic->ipxRcvd.value+el->nonIPTraffic->dlcRcvd.value+el->nonIPTraffic->arp_rarpRcvd.value + el->nonIPTraffic->decnetRcvd.value+el->nonIPTraffic->appletalkRcvd.value + el->nonIPTraffic->osiRcvd.value+el->nonIPTraffic->netbiosRcvd.value+el->nonIPTraffic->stpRcvd.value+el->nonIPTraffic->otherRcvd.value; protoList = myGlobals.ipProtosList; idx = 0; while(protoList != NULL) { if(el->ipProtosList[idx] != NULL) { totalSent += el->ipProtosList[idx]->sent.value; totalRcvd += el->ipProtosList[idx]->rcvd.value; } idx++, protoList = protoList->next; } actTotalSent = el->tcpSentLoc.value+el->tcpSentRem.value; actTotalRcvd = el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value; printHostHourlyTraffic(el); printPacketStats(el, actualDeviceId); if((totalSent == 0) && (totalRcvd == 0)) return; printSectionTitle("Protocol Distribution"); sendString("
    \n" ""TABLE_ON"" "" "\n"); printTableDoubleEntry(buf, sizeof(buf), "TCP", CONST_COLOR_1, (float)actTotalSent/1024, 100*((float)SD(actTotalSent, totalSent)), (float)actTotalRcvd/1024, 100*((float)SD(actTotalRcvd, totalRcvd))); actTotalSent = el->udpSentLoc.value+el->udpSentRem.value; actTotalRcvd = el->udpRcvdLoc.value+el->udpRcvdFromRem.value; printTableDoubleEntry(buf, sizeof(buf), "UDP", CONST_COLOR_1, (float)actTotalSent/1024, 100*((float)SD(actTotalSent, totalSent)), (float)actTotalRcvd/1024, 100*((float)SD(actTotalRcvd, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "ICMP", CONST_COLOR_1, (float)el->icmpSent.value/1024, 100*((float)SD(el->icmpSent.value, totalSent)), (float)el->icmpRcvd.value/1024, 100*((float)SD(el->icmpRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "ICMPv6", CONST_COLOR_1, (float)el->icmp6Sent.value/1024, 100*((float)SD(el->icmp6Sent.value, totalSent)), (float)el->icmp6Rcvd.value/1024, 100*((float)SD(el->icmp6Rcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "IPv6", CONST_COLOR_1, (float)el->ipv6Sent.value/1024, 100*((float)SD(el->ipv6Sent.value, totalSent)), (float)el->ipv6Rcvd.value/1024, 100*((float)SD(el->ipv6Rcvd.value, totalRcvd))); if(el->nonIPTraffic != NULL) { printTableDoubleEntry(buf, sizeof(buf), "(R)ARP", CONST_COLOR_1, (float)el->nonIPTraffic->arp_rarpSent.value/1024, 100*((float)SD(el->nonIPTraffic->arp_rarpSent.value, totalSent)), (float)el->nonIPTraffic->arp_rarpRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->arp_rarpRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "DLC", CONST_COLOR_1, (float)el->nonIPTraffic->dlcSent.value/1024, 100*((float)SD(el->nonIPTraffic->dlcSent.value, totalSent)), (float)el->nonIPTraffic->dlcRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->dlcRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "IPX", CONST_COLOR_1, (float)el->nonIPTraffic->ipxSent.value/1024, 100*((float)SD(el->nonIPTraffic->ipxSent.value, totalSent)), (float)el->nonIPTraffic->ipxRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->ipxRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "Decnet", CONST_COLOR_1, (float)el->nonIPTraffic->decnetSent.value/1024, 100*((float)SD(el->nonIPTraffic->decnetSent.value, totalSent)), (float)el->nonIPTraffic->decnetRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->decnetRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "AppleTalk", CONST_COLOR_1, (float)el->nonIPTraffic->appletalkSent.value/1024, 100*((float)SD(el->nonIPTraffic->appletalkSent.value, totalSent)), (float)el->nonIPTraffic->appletalkRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->appletalkRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "NetBios", CONST_COLOR_1, (float)el->nonIPTraffic->netbiosSent.value/1024, 100*((float)SD(el->nonIPTraffic->netbiosSent.value, totalSent)), (float)el->nonIPTraffic->netbiosRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->netbiosRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "OSI", CONST_COLOR_1, (float)el->nonIPTraffic->osiSent.value/1024, 100*((float)SD(el->nonIPTraffic->osiSent.value, totalSent)), (float)el->nonIPTraffic->osiRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->osiRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "STP", CONST_COLOR_1, (float)el->nonIPTraffic->stpSent.value/1024, 100*((float)SD(el->nonIPTraffic->stpSent.value, totalSent)), (float)el->nonIPTraffic->stpRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->stpRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "Other (Non IP)", CONST_COLOR_1, (float)el->nonIPTraffic->otherSent.value/1024, 100*((float)SD(el->nonIPTraffic->otherSent.value, totalSent)), (float)el->nonIPTraffic->otherRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->otherRcvd.value, totalRcvd))); } { protoList = myGlobals.ipProtosList; idx = 0; while(protoList != NULL) { printTableDoubleEntry(buf, sizeof(buf), protoList->protocolName, CONST_COLOR_1, el->ipProtosList[idx] != NULL ? (float)el->ipProtosList[idx]->sent.value/1024 : 0, el->ipProtosList[idx] != NULL ? 100*((float)SD(el->ipProtosList[idx]->sent.value, totalSent)) : 0, el->ipProtosList[idx] != NULL ? (float)el->ipProtosList[idx]->rcvd.value/1024 : 0, el->ipProtosList[idx] != NULL ? 100*((float)SD(el->ipProtosList[idx]->rcvd.value, totalRcvd)) : 0); idx++, protoList = protoList->next; } } { totalSent = el->tcpSentLoc.value+el->tcpSentRem.value+ el->udpSentLoc.value+el->udpSentRem.value+ el->icmpSent.value+el->icmp6Sent.value+el->ipv6Sent.value; totalRcvd = el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value+ el->udpRcvdLoc.value+el->udpRcvdFromRem.value+ el->icmpRcvd.value+el->icmp6Rcvd.value+el->ipv6Rcvd.value; if(el->nonIPTraffic) { totalSent += el->nonIPTraffic->stpSent.value+ el->nonIPTraffic->ipxSent.value+el->nonIPTraffic->osiSent.value+el->nonIPTraffic->dlcSent.value+ el->nonIPTraffic->arp_rarpSent.value+el->nonIPTraffic->decnetSent.value+el->nonIPTraffic->appletalkSent.value+ el->nonIPTraffic->netbiosSent.value+el->nonIPTraffic->otherSent.value; totalRcvd += el->nonIPTraffic->stpRcvd.value+ el->nonIPTraffic->ipxRcvd.value+el->nonIPTraffic->osiRcvd.value+el->nonIPTraffic->dlcRcvd.value+ el->nonIPTraffic->arp_rarpRcvd.value+el->nonIPTraffic->decnetRcvd.value+el->nonIPTraffic->appletalkRcvd.value+ el->nonIPTraffic->netbiosRcvd.value+el->nonIPTraffic->otherRcvd.value; } protoList = myGlobals.ipProtosList; idx = 0; while(protoList != NULL) { if(el->ipProtosList[idx] != NULL) { totalSent += el->ipProtosList[idx]->sent.value; totalRcvd += el->ipProtosList[idx]->rcvd.value; } idx++, protoList = protoList->next; } if((totalSent > 0) || (totalRcvd > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); if(el->hostNumIpAddress[0] != '\0') { strncpy(linkName, el->hostNumIpAddress, sizeof(linkName)); } else { strncpy(linkName, el->ethAddressString, sizeof(linkName)); } /* For Ethernet and Ipv6 addresses */ urlFixupToRFC1945Inplace(linkName); if(el->vlanId > 0) { safe_snprintf(__FILE__, __LINE__, vlanStr, sizeof(vlanStr), "-%d", el->vlanId); } else vlanStr[0] = '\0'; if(totalSent > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", linkName, vlanStr); sendString(buf); } else { sendString(""); } if(totalRcvd > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", linkName, vlanStr); sendString(buf); } else { sendString(""); } sendString(""); if((el->tcpSentLoc.value+el->tcpSentRem.value+el->udpSentLoc.value+el->udpSentRem.value +el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value+el->udpRcvdLoc.value+el->udpRcvdFromRem.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); if((el->tcpSentLoc.value+el->tcpSentRem.value+el->udpSentLoc.value+el->udpSentRem.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", linkName, vlanStr); sendString(buf); } else sendString(""); if((el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value+el->udpRcvdLoc.value+el->udpRcvdFromRem.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", linkName, vlanStr); sendString(buf); } else sendString(""); sendString(""); } } } sendString("
    ProtocolData SentData Rcvd
    Protocol Distribution" "  
    IP Distribution" " 
     
    "TABLE_OFF"

    \n"); sendString("

    \n"); /* ************************************** */ if(el->nonIpProtoTrafficInfos != NULL) { NonIpProtoTrafficInfo *nonIp = el->nonIpProtoTrafficInfos; printSectionTitle("Non IP Protocol Distribution"); sendString("
    \n" ""TABLE_ON"" "" "\n"); while(nonIp != NULL) { char buf1[64]; printTableDoubleEntry(buf, sizeof(buf), sap2name(nonIp->protocolId, buf1, sizeof(buf1)), CONST_COLOR_1, (float)nonIp->sentBytes.value/1024, 100*((float)SD(nonIp->sentBytes.value, el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->otherSent.value)), (float)nonIp->rcvdBytes.value/1024, 100*((float)SD(nonIp->rcvdBytes.value, el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->otherRcvd.value))); nonIp = nonIp->next; } sendString("
    ProtocolData SentData Rcvd
    "TABLE_OFF"

    \n"); sendString("

    \n"); } /* ************************************** */ if(el->nonIPTraffic != NULL) { if(el->nonIPTraffic->unknownProtoSent || el->nonIPTraffic->unknownProtoRcvd) { printSectionTitle("Unknown Protocols"); sendString("
    \n" ""TABLE_ON"" "" "\n"); if(el->nonIPTraffic->unknownProtoSent == NULL) { sendString(""); } else { sendString(""); } if(el->nonIPTraffic->unknownProtoRcvd == NULL) { sendString(""); } else { sendString(""); } sendString("
    Data SentData Rcvd
     
    "); for(i=0; inonIPTraffic->unknownProtoSent[i]); sendString("  
    "); for(i=0; inonIPTraffic->unknownProtoRcvd[i]); sendString(" 
    "TABLE_OFF"

    \n"); sendString("

    \n"); } } } /* ************************************ */ #ifdef INET6 void printIcmpv6Stats(HostTraffic *el) { char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32], formatBuf1[32]; sendString("
    \n

    ICMPv6 Traffic

    \n"); sendString("\n"); sendString("" "" "\n"); if(el->icmpInfo->icmpMsgSent[ICMP6_ECHO_REQUEST].value+el->icmpInfo->icmpMsgRcvd[ICMP6_ECHO_REQUEST].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP6_ECHO_REQUEST].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP6_ECHO_REQUEST].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP6_ECHO_REPLY].value+el->icmpInfo->icmpMsgRcvd[ICMP6_ECHO_REPLY].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP6_ECHO_REPLY].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP6_ECHO_REPLY].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP6_DST_UNREACH].value+el->icmpInfo->icmpMsgRcvd[ICMP6_DST_UNREACH].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP6_DST_UNREACH].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP6_DST_UNREACH].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ND_REDIRECT].value+el->icmpInfo->icmpMsgRcvd[ND_REDIRECT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ND_REDIRECT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ND_REDIRECT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ND_ROUTER_ADVERT].value+el->icmpInfo->icmpMsgRcvd[ND_ROUTER_ADVERT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ND_ROUTER_ADVERT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ND_ROUTER_ADVERT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ND_ROUTER_SOLICIT].value+el->icmpInfo->icmpMsgRcvd[ND_ROUTER_SOLICIT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ND_ROUTER_SOLICIT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ND_ROUTER_SOLICIT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ND_NEIGHBOR_SOLICIT].value+el->icmpInfo->icmpMsgRcvd[ND_NEIGHBOR_SOLICIT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ND_NEIGHBOR_SOLICIT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ND_NEIGHBOR_SOLICIT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ND_NEIGHBOR_ADVERT].value+el->icmpInfo->icmpMsgRcvd[ND_NEIGHBOR_ADVERT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ND_NEIGHBOR_ADVERT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ND_NEIGHBOR_ADVERT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } sendString("
    TypePkt SentPkt Rcvd
    Echo Request%s%s
    Echo Reply%s%s
    Unreach%s%s
    Redirect%s%s
    Router Advertisement%s%s
    Router solicitation%s%s
    Neighbor solicitation%s%s
    Neighbor advertisment%s%s
    "TABLE_OFF"

    \n"); } #endif /* ******************************************** */ void printIcmpv4Stats(HostTraffic *el) { char buf[LEN_GENERAL_WORK_BUFFER]; char formatBuf[32], formatBuf1[32]; printSectionTitle("ICMP Traffic"); sendString("
    \n"); sendString("" "" "\n"); if(el->icmpInfo->icmpMsgSent[ICMP_ECHO].value+el->icmpInfo->icmpMsgRcvd[ICMP_ECHO].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_ECHO].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_ECHO].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_ECHOREPLY].value+el->icmpInfo->icmpMsgRcvd[ICMP_ECHOREPLY].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_ECHOREPLY].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_ECHOREPLY].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_UNREACH].value+el->icmpInfo->icmpMsgRcvd[ICMP_UNREACH].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_UNREACH].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_UNREACH].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_REDIRECT].value+el->icmpInfo->icmpMsgRcvd[ICMP_REDIRECT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_REDIRECT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_REDIRECT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_ROUTERADVERT].value+el->icmpInfo->icmpMsgRcvd[ICMP_ROUTERADVERT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_ROUTERADVERT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_ROUTERADVERT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_TIMXCEED].value+el->icmpInfo->icmpMsgRcvd[ICMP_TIMXCEED].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_TIMXCEED].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_TIMXCEED].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_PARAMPROB].value+el->icmpInfo->icmpMsgRcvd[ICMP_PARAMPROB].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_PARAMPROB].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_PARAMPROB].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_MASKREQ].value+el->icmpInfo->icmpMsgRcvd[ICMP_MASKREQ].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_MASKREQ].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_MASKREQ].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_MASKREPLY].value+el->icmpInfo->icmpMsgRcvd[ICMP_MASKREPLY].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_MASKREPLY].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_MASKREPLY].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_SOURCE_QUENCH].value+el->icmpInfo->icmpMsgRcvd[ICMP_SOURCE_QUENCH].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_SOURCE_QUENCH].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_SOURCE_QUENCH].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_TIMESTAMP].value+el->icmpInfo->icmpMsgRcvd[ICMP_TIMESTAMP].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_TIMESTAMP].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_TIMESTAMP].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_INFO_REQUEST].value+el->icmpInfo->icmpMsgRcvd[ICMP_INFO_REQUEST].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_INFO_REQUEST].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_INFO_REQUEST].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_INFO_REPLY].value+el->icmpInfo->icmpMsgRcvd[ICMP_INFO_REPLY].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_INFO_REPLY].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_INFO_REPLY].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } /************ ICMPv6 info*********************/ sendString("
    TypePkt SentPkt Rcvd
    Echo Request%s%s
    Echo Reply%s%s
    Unreach%s%s
    Redirect%s%s
    Router Advertisement%s%s
    Time Exceeded%s%s
    Parameter Problem%s%s
    Network Mask Request%s%s
    Network Mask Reply%s%s
    Source Quench%s%s
    Timestamp%s%s
    Info Request%s%s
    Info Reply%s%s
    "TABLE_OFF"
    \n"); } /* ************************************ */ void printHostIcmpStats(HostTraffic *el){ int family; if(el->icmpInfo == NULL) return; family = el->hostIpAddress.hostFamily; if (family == AF_INET) printIcmpv4Stats(el); #ifdef INET6 else if (family == AF_INET6) printIcmpv6Stats(el); #endif } /* ************************************ */ void printHostHTTPVirtualHosts(HostTraffic *el, int actualDeviceId) { char buf[LEN_GENERAL_WORK_BUFFER]; char formatBuf[32], formatBuf1[32]; if((el->protocolInfo != NULL) && (el->protocolInfo->httpVirtualHosts != NULL)) { VirtualHostList *list = el->protocolInfo->httpVirtualHosts; printSectionTitle("HTTP Virtual Hosts Traffic"); sendString("
    \n\n"); } } /* ************************************ */ static void printUserList(HostTraffic *el) { char buf[LEN_GENERAL_WORK_BUFFER]; UserList *list = el->protocolInfo->userList; int num = 0; while(list != NULL) { if(num > 0) sendString("
    "); if(FD_ISSET(BITFLAG_SMTP_USER, &(list->userFlags))) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s [ SMTP ]\n", list->userName, list->userName); sendString(buf); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s [", list->userName); sendString(buf); if(FD_ISSET(BITFLAG_POP_USER, &(list->userFlags))) sendString(" POP "); if(FD_ISSET(BITFLAG_IMAP_USER, &(list->userFlags))) sendString(" IMAP "); if(FD_ISSET(BITFLAG_SMTP_USER, &(list->userFlags))) sendString(" SMTP "); if(FD_ISSET(BITFLAG_P2P_USER, &(list->userFlags))) sendString(" P2P "); if(FD_ISSET(BITFLAG_FTP_USER, &(list->userFlags))) sendString(" FTP "); if(FD_ISSET(BITFLAG_MESSENGER_USER, &(list->userFlags))) sendString(" MSG "); if(FD_ISSET(BITFLAG_VOIP_USER, &(list->userFlags))) sendString(" VoIP "); if(FD_ISSET(BITFLAG_DAAP_USER, &(list->userFlags))) sendString(" DAAP "); sendString("]\n"); } list = list->next; num++; } } /* ************************************ */ void checkHostProvidedServices(HostTraffic *el) { char buf[LEN_GENERAL_WORK_BUFFER]; if(isServer(el) || isWorkstation(el) || isMasterBrowser(el) || isPrinter(el) || isBridgeHost(el) || nameServerHost(el) || isNtpServer(el) || gatewayHost(el) || isVoIPHost(el) || isSMTPhost(el) || isIMAPhost(el) || isPOPhost(el) || isDirectoryHost(el) || isFTPhost(el) || isHTTPhost(el) || isWINShost(el) || isDHCPClient(el) || isDHCPServer(el) ) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" ""); } } /* ************************************ */ void printHostDetailedInfo(HostTraffic *el, int actualDeviceId) { char buf[3*LEN_GENERAL_WORK_BUFFER], buf1[64], buf2[128], sniffedName[MAXDNAME], osBuf[512]; float percentage; Counter total; int printedHeader, i; char *dynIp, *multihomed, *multivlaned; u_short as=0; HostTraffic *theHost, tmpEl; char formatBuf[LEN_TIMEFORMAT_BUFFER], formatBuf1[LEN_TIMEFORMAT_BUFFER], formatBuf2[32], hostLinkBuf[LEN_GENERAL_WORK_BUFFER]; accessAddrResMutex("printAllSessionsHTML"); buf1[0]=0; if(getSniffedDNSName(el->hostNumIpAddress, sniffedName, sizeof(sniffedName))) { if(el->hostResolvedName[0] == '\0' || strcmp(sniffedName, el->hostResolvedName)) safe_snprintf(__FILE__, __LINE__, buf1, sizeof(buf1), " (%s)", sniffedName); } if((el->hostResolvedName[0] != '\0') && (strcmp(el->hostResolvedName, el->hostNumIpAddress))) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Info about " " %s %s\n", el->hostResolvedName, el->hostResolvedName, buf1); safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", el->hostResolvedName); } else if(el->hostNumIpAddress[0] != '\0') { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Info about " " %s %s\n", el->hostIpAddress.hostFamily == AF_INET6 ? "[" : "", el->hostNumIpAddress, el->hostIpAddress.hostFamily == AF_INET6 ? "]" : "", el->hostNumIpAddress, buf1); safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", el->hostNumIpAddress); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Info about %s", el->ethAddressString); safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", el->ethAddressString); } releaseAddrResMutex(); printHTMLheader(buf2, buf, 0); sendString("
    \n

    "TABLE_ON"

    \n"); sendString(""TABLE_ON"" "" "\n"); while(list != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "\n", getRowColor(), list->virtualHostName, formatBytes(list->bytesSent.value, 1, formatBuf, sizeof(formatBuf)), formatBytes(list->bytesRcvd.value, 1, formatBuf1, sizeof(formatBuf1))); sendString(buf); list = list->next; } sendString("
    Virtual HostSentRcvd
    %s%s %s 
    "TABLE_OFF"\n"); sendString("
    NOTE: The above table is not updated in realtime but when connections are terminated.
    \n"); sendString("

    \n"); } } /* ************************************ */ HostTraffic* quickHostLink(HostSerial theSerial, int deviceId, HostTraffic *el) { int type; FcNameServerCacheEntry *fcnsEntry; FcScsiCounters *tmp; HostTraffic *srcEl; if(cmpSerial(&theSerial, &myGlobals.broadcastEntry->hostSerial)) { memcpy(el, myGlobals.broadcastEntry, sizeof(HostTraffic)); return(el); } else if(cmpSerial(&theSerial, &myGlobals.otherHostEntry->hostSerial)) { memcpy(el, myGlobals.otherHostEntry, sizeof(HostTraffic)); return(0); } tmp = el->fcCounters; memset(el, 0, sizeof(HostTraffic)); el->fcCounters = tmp; copySerial(&el->hostSerial, &theSerial); if((theSerial.serialType == SERIAL_IPV4) || (theSerial.serialType == SERIAL_IPV6)){ /* IP */ char sniffedName[MAXDNAME]; char buf[LEN_GENERAL_WORK_BUFFER]; addrcpy(&el->hostIpAddress,&theSerial.value.ipSerial.ipAddress); el->vlanId = theSerial.value.ipSerial.vlanId; strncpy(el->hostNumIpAddress, _addrtostr(&el->hostIpAddress, buf, sizeof(buf)), sizeof(el->hostNumIpAddress)); if(myGlobals.runningPref.numericFlag == 0) { fetchAddressFromCache(el->hostIpAddress, el->hostResolvedName, &type); el->hostResolvedNameType = type; if((strcmp(el->hostResolvedName, el->hostNumIpAddress) == 0) || (el->hostResolvedName[0] == '\0')) { if(getSniffedDNSName(el->hostNumIpAddress, sniffedName, sizeof(sniffedName))) { int i; for(i=0; ifcCounters->hostFcAddress, (u_int8_t *)&theSerial.value.fcSerial.fcAddress, LEN_FC_ADDRESS); safe_snprintf (__FILE__, __LINE__, el->fcCounters->hostNumFcAddress, sizeof(el->fcCounters->hostNumFcAddress), "%02x.%02x.%02x", el->fcCounters->hostFcAddress.domain, el->fcCounters->hostFcAddress.area, el->fcCounters->hostFcAddress.port); setResolvedName(el, el->fcCounters->hostNumFcAddress, FLAG_HOST_SYM_ADDR_TYPE_FCID); el->fcCounters->vsanId = theSerial.value.fcSerial.vsanId; el->l2Family = FLAG_HOST_TRAFFIC_AF_FC; el->fcCounters->devType = SCSI_DEV_UNINIT; el->magic = CONST_MAGIC_NUMBER; if((srcEl = findHostBySerial (theSerial, deviceId)) != NULL) { strcpy (el->hostResolvedName, srcEl->hostResolvedName); el->hostResolvedNameType = srcEl->hostResolvedNameType; } else { fcnsEntry = findFcHostNSCacheEntry (&el->fcCounters->hostFcAddress, el->fcCounters->vsanId); if (fcnsEntry != NULL) { if (fcnsEntry->alias != NULL) { setResolvedName(el, fcnsEntry->alias, FLAG_HOST_SYM_ADDR_TYPE_FC_ALIAS); } else { setResolvedName(el, (char*)fcnsEntry->pWWN.str, FLAG_HOST_SYM_ADDR_TYPE_FC_WWN); } memcpy((u_int8_t *)el->fcCounters->pWWN.str, (u_int8_t *)fcnsEntry->pWWN.str, LEN_WWN_ADDRESS); } } } else { /* MAC */ char *ethAddr; char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY]; memcpy(el->ethAddress, theSerial.value.ethSerial.ethAddress, LEN_ETHERNET_ADDRESS); el->vlanId = theSerial.value.ethSerial.vlanId; ethAddr = etheraddr_string(el->ethAddress, etherbuf); strncpy(el->ethAddressString, ethAddr, sizeof(el->ethAddressString)); if (el->hostIpAddress.hostFamily == AF_INET) el->hostIp4Address.s_addr = 0x1234; /* dummy */ } return(el); } /* ************************************ */ void printHostContactedPeers(HostTraffic *el, int actualDeviceId) { u_int i, titleSent = 0; char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[LEN_GENERAL_WORK_BUFFER]; HostTraffic tmpEl; if (isFcHost (el)) { printFcHostContactedPeers (el, actualDeviceId); return; } if((el->pktSent.value != 0) || (el->pktRcvd.value != 0)) { int ok =0; for(i=0; icontactedSentPeers.peersSerials[i]) && (!cmpSerial(&el->contactedSentPeers.peersSerials[i], &myGlobals.otherHostEntry->hostSerial))) || ((!emptySerial(&el->contactedRcvdPeers.peersSerials[i]) && (!cmpSerial(&el->contactedRcvdPeers.peersSerials[i], &myGlobals.otherHostEntry->hostSerial)))))) { ok = 1; break; } if(ok) { HostTraffic *el2; int numEntries; for(numEntries = 0, i=0; icontactedSentPeers.peersSerials[i]) && (!cmpSerial(&el->contactedSentPeers.peersSerials[i], &myGlobals.otherHostEntry->hostSerial))) { if((el2 = quickHostLink(el->contactedSentPeers.peersSerials[i], myGlobals.actualReportDeviceId, &tmpEl)) != NULL) { if(numEntries == 0) { printSectionTitle("Last Contacted Peers"); titleSent = 1; sendString("

    \n
    \n"); sendString(""TABLE_ON"" "" "\n"); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), makeHostLink(el2, 0, 0, 0, hostLinkBuf, sizeof(hostLinkBuf)), el2->hostNumIpAddress); sendString(buf); numEntries++; } } if(numEntries > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (unsigned long)el->totContactedSentPeers); sendString(buf); sendString("
    Sent ToIP Address
    %s%s 
    Total Contacts%lu
    "TABLE_OFF"
    \n"); } else sendString(" \n"); /* ***************************************************** */ for(numEntries = 0, i=0; icontactedRcvdPeers.peersSerials[i])) && (!cmpSerial(&el->contactedRcvdPeers.peersSerials[i], &myGlobals.otherHostEntry->hostSerial))) { if((el2 = quickHostLink(el->contactedRcvdPeers.peersSerials[i], myGlobals.actualReportDeviceId, &tmpEl)) != NULL) { if(numEntries == 0) { if(!titleSent) printSectionTitle("Last Contacted Peers"); sendString("
    "TABLE_ON"" "" "\n"); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), makeHostLink(el2, 0, 0, 0, hostLinkBuf, sizeof(hostLinkBuf)), el2->hostNumIpAddress); sendString(buf); numEntries++; } } if(numEntries > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (unsigned long)el->totContactedRcvdPeers); sendString(buf); sendString("
    Received FromIP Address
    %s%s 
    Total Contacts%lu
    "TABLE_OFF"\n"); } sendString("
    "TABLE_OFF"

    \n"); sendString("

    \n"); } /* ok */ } } /* ************************************ */ /* Function below courtesy of Andreas Pfaller */ char *getSessionState(IPSession *session) { switch (session->sessionState) { case FLAG_STATE_SYN: return("Sent Syn"); case FLAG_FLAG_STATE_SYN_ACK: return("Rcvd Syn/Ack"); case FLAG_STATE_ACTIVE: return("Active"); case FLAG_STATE_FIN1_ACK0: return("Fin1 Ack0"); case FLAG_STATE_FIN1_ACK1: return("Fin1 Ack1"); case FLAG_STATE_FIN2_ACK0: return("Fin2 Ack0"); case FLAG_STATE_FIN2_ACK1: return("Fin2 Ack1"); case FLAG_STATE_FIN2_ACK2: return("Fin2 Ack2"); case FLAG_STATE_TIMEOUT: return("Timeout"); case FLAG_STATE_END: return("End"); } return("*Unknown*"); } /* ************************************ */ void printHostSessions(HostTraffic *el, int actualDeviceId) { printActiveTCPSessions(actualDeviceId, 0, el); } /* ******************************* */ /* Return codes: OK 0 Minor 1 Warning 2 Error 3! */ u_short isHostHealthy(HostTraffic *el) { if((hasDuplicatedMac(el)) || (hasSentIpDataOnZeroPort(el))) return(3); if(hasWrongNetmask(el)) return(2); if((el->totContactedSentPeers > CONTACTED_PEERS_THRESHOLD) || (el->totContactedRcvdPeers > CONTACTED_PEERS_THRESHOLD)) { /* Mail/DNS/HTTP server usually touch many hosts */ if(!(isSMTPhost(el) || nameServerHost(el) || isHTTPhost(el))) { return(2); } } if((el->secHostPkts != NULL) && ((el->secHostPkts->nullPktsSent.value.value > 0) || (el->secHostPkts->synFinPktsSent.value.value > 0) || (el->secHostPkts->ackXmasFinSynNullScanSent.value.value > 0) || (el->secHostPkts->tinyFragmentSent.value.value > 0) || (el->secHostPkts->icmpFragmentSent.value.value > 0) || (el->secHostPkts->overlappingFragmentSent.value.value > 0) || (el->secHostPkts->malformedPktsRcvd.value.value > 0))) { return(2); } if((el->secHostPkts != NULL) && ((el->secHostPkts->rstPktsRcvd.value.value > 0) || (el->secHostPkts->rejectedTCPConnRcvd.value.value > 0) || (el->secHostPkts->udpToClosedPortRcvd.value.value > 0) || (el->secHostPkts->udpToDiagnosticPortSent.value.value > 0) || (el->secHostPkts->closedEmptyTCPConnSent.value.value > 0) || (el->secHostPkts->icmpPortUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpHostNetUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpProtocolUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpAdminProhibitedRcvd.value.value > 0))) { return(1); } return(0); } /* ************************************ */ static void checkHostHealthness(HostTraffic *el) { char buf[LEN_GENERAL_WORK_BUFFER]; if(hasWrongNetmask(el) || hasDuplicatedMac(el) || hasSentIpDataOnZeroPort(el) || (el->totContactedSentPeers > CONTACTED_PEERS_THRESHOLD) || (el->totContactedRcvdPeers > CONTACTED_PEERS_THRESHOLD) || ((el->secHostPkts != NULL) && ((el->secHostPkts->nullPktsSent.value.value > 0) || (el->secHostPkts->synFinPktsSent.value.value > 0) || (el->secHostPkts->rstPktsRcvd.value.value > 0) || (el->secHostPkts->ackXmasFinSynNullScanSent.value.value > 0) || (el->secHostPkts->rejectedTCPConnRcvd.value.value > 0) || (el->secHostPkts->udpToClosedPortRcvd.value.value > 0) || (el->secHostPkts->udpToDiagnosticPortSent.value.value > 0) || (el->secHostPkts->tinyFragmentSent.value.value > 0) || (el->secHostPkts->icmpFragmentSent.value.value > 0) || (el->secHostPkts->overlappingFragmentSent.value.value > 0) || (el->secHostPkts->closedEmptyTCPConnSent.value.value > 0) || (el->secHostPkts->icmpPortUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpHostNetUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpProtocolUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpAdminProhibitedRcvd.value.value > 0) || (el->secHostPkts->malformedPktsRcvd.value.value > 0)))) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
    %s " CONST_IMG_HIGH_RISK CONST_IMG_MEDIUM_RISK CONST_IMG_LOW_RISK "
      ", getRowColor(), "Host Healthness (Risk Flags)"); sendString(buf); if(hasDuplicatedMac(el)) sendString("
    1. " CONST_IMG_HIGH_RISK "" "Duplicated MAC found for this IP address (spoofing?)\n"); if(hasSentIpDataOnZeroPort(el)) sendString("
    2. " CONST_IMG_HIGH_RISK "" "Traffic on suspicious IP ports\n"); if(hasWrongNetmask(el)) sendString("
    3. " CONST_IMG_MEDIUM_RISK "" "Wrong network mask or bridging enabled\n"); if((el->totContactedSentPeers > CONTACTED_PEERS_THRESHOLD) || (el->totContactedRcvdPeers > CONTACTED_PEERS_THRESHOLD)) { sendString("
    4. " CONST_IMG_MEDIUM_RISK "" "Suspicious activities: too many host contacts\n"); } if((el->secHostPkts != NULL) && ((el->secHostPkts->nullPktsSent.value.value > 0) || (el->secHostPkts->synFinPktsSent.value.value > 0) || (el->secHostPkts->ackXmasFinSynNullScanSent.value.value > 0) || (el->secHostPkts->tinyFragmentSent.value.value > 0) || (el->secHostPkts->icmpFragmentSent.value.value > 0) || (el->secHostPkts->overlappingFragmentSent.value.value > 0) || (el->secHostPkts->malformedPktsRcvd.value.value > 0))) { sendString("
    5. " CONST_IMG_MEDIUM_RISK "" "Unexpected packets (e.g. traffic to closed port or connection reset):
      \n"); if(el->secHostPkts->synFinPktsSent.value.value > 0) sendString("[Sent: syn-fin] "); if(el->secHostPkts->ackXmasFinSynNullScanSent.value.value > 0) sendString("[Sent: xmas] "); if(el->secHostPkts->tinyFragmentSent.value.value > 0) sendString("[Sent: Tiny frag] "); if(el->secHostPkts->icmpFragmentSent.value.value > 0) sendString("[Sent: icmp frag] "); if(el->secHostPkts->overlappingFragmentSent.value.value > 0) sendString("[Sent: overlapfrag] "); if(el->secHostPkts->malformedPktsRcvd.value.value > 0) sendString("[Rcvd: malformed] "); } if((el->secHostPkts != NULL) && ((el->secHostPkts->rejectedTCPConnRcvd.value.value > 0) || (el->secHostPkts->udpToClosedPortRcvd.value.value > 0) || (el->secHostPkts->udpToDiagnosticPortSent.value.value > 0) || (el->secHostPkts->rstPktsRcvd.value.value > 0) || (el->secHostPkts->closedEmptyTCPConnSent.value.value > 0) || (el->secHostPkts->icmpPortUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpHostNetUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpProtocolUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpAdminProhibitedRcvd.value.value > 0))) { sendString("
    6. " CONST_IMG_LOW_RISK "" "Unexpected packets (e.g. traffic to closed port or connection reset):
      \n"); if(el->secHostPkts->rejectedTCPConnRcvd.value.value > 0) sendString("[Rcvd: rejected] "); if(el->secHostPkts->udpToClosedPortRcvd.value.value > 0) sendString("[Sent: udp to closed] "); if(el->secHostPkts->udpToDiagnosticPortSent.value.value > 0) sendString("[Sent: udp to diag] "); if(el->secHostPkts->rstPktsRcvd.value.value > 0) sendString("[Rcvd: rst] "); if(el->secHostPkts->closedEmptyTCPConnSent.value.value > 0) sendString("[Sent: closed-empty] "); if(el->secHostPkts->icmpPortUnreachRcvd.value.value > 0) sendString("[Rcvd: port unreac] "); if(el->secHostPkts->icmpHostNetUnreachRcvd.value.value > 0) sendString("[Rcvd: hostnet unreac] "); if(el->secHostPkts->icmpProtocolUnreachRcvd.value.value > 0) sendString("[Rcvd: proto unreac] "); if(el->secHostPkts->icmpAdminProhibitedRcvd.value.value > 0) sendString("[Rcvd: admin prohib] "); } sendString("
    %s", getRowColor(), "Host Type"); sendString(buf); if(isServer(el)) sendString("Server
    \n"); if(isWorkstation(el)) sendString("Workstation
    \n"); if(isMasterBrowser(el)) sendString("Master Browser
    \n"); if(isPrinter(el)) sendString("Printer " CONST_IMG_PRINTER "
    \n"); if(isBridgeHost(el)) sendString("Layer-2 Switch/Bridge " CONST_IMG_BRIDGE "
    \n"); if(nameServerHost(el)) sendString("Name Server " CONST_IMG_DNS_SERVER "
    \n"); if(isNtpServer(el)) sendString("NTP Server " CONST_IMG_NTP_SERVER "
    \n"); if(gatewayHost(el)) sendString("Gateway/Router " CONST_IMG_ROUTER "
    \n"); if(isVoIPGateway(el) && (!isVoIPClient(el))) sendString("VoIP Gateway " CONST_IMG_VOIP_HOST "
    \n"); else if(isVoIPClient(el)) sendString("VoIP Host " CONST_IMG_VOIP_HOST "
    \n"); if(isSMTPhost(el)) sendString("SMTP (Mail) Server " CONST_IMG_SMTP_SERVER "
    \n"); if(isPOPhost(el)) sendString("POP Server " CONST_IMG_POP_SERVER "
    \n"); if(isIMAPhost(el)) sendString("IMAP Server " CONST_IMG_IMAP_SERVER "
    \n"); if(isDirectoryHost(el)) sendString("Directory Server " CONST_IMG_DIRECTORY_SERVER "
    \n"); if(isFTPhost(el)) sendString("FTP Server " CONST_IMG_FTP_SERVER "
    \n"); if(isHTTPhost(el)) sendString("HTTP Server " CONST_IMG_HTTP_SERVER "
    \n"); if(isWINShost(el)) sendString("WINS Server
    \n"); if(isDHCPClient(el)) sendString("BOOTP/DHCP Client " CONST_IMG_DHCP_CLIENT "
    \n"); if(isDHCPServer(el)) sendString("BOOTP/DHCP Server " CONST_IMG_DHCP_SERVER "
    \n"); sendString("
    \n"); if(el->hostNumIpAddress[0] != '\0') { char *countryIcon, *hostType, tmpBuf[64]; accessAddrResMutex("printAllSessions-2"); countryIcon = getHostCountryIconURL(el); if(broadcastHost(el)) hostType = "broadcast"; else if(multicastHost(el)) hostType = "multicast"; else hostType = "unicast"; if(isDHCPClient(el)) dynIp = "/dynamic"; else dynIp = ""; if(isMultihomed(el) && (!broadcastHost(el))) multihomed = " - multihomed " CONST_IMG_MULTIHOMED; else multihomed = ""; if(isMultivlaned(el) && (!broadcastHost(el))) multivlaned = " - multivlaned " CONST_IMG_MULTIVLANED; else multivlaned = ""; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n"); if(isMultihomed(el) && (!broadcastHost(el))) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), ""); } /* traceEvent(CONST_TRACE_INFO, "-> %d", el->network_mask); */ if((el->network_mask > 0) && (el->network_mask != 32)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "Host Network", host2networkName(el, buf1, sizeof(buf1))); sendString(buf); } if((el->protocolInfo != NULL) && (el->protocolInfo->dhcpStats != NULL)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor(), "DHCP Information"); sendString(buf); sendString("\n"); } } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "First/Last Seen", formatTime(&(el->firstSeen), formatBuf, sizeof(formatBuf)), formatTime(&(el->lastSeen), formatBuf1, sizeof(formatBuf1)), formatSeconds(myGlobals.actTime-el->lastSeen, formatBuf2, sizeof(formatBuf2))); sendString(buf); if(el->hostAS != 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Autonomous System", el->hostAS, el->hostAS); sendString(buf); } if(el->dnsDomainValue && (el->dnsDomainValue[0] != '\0')) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Domain", el->dnsDomainValue); sendString(buf); } if((el->ethAddressString[0] != '\0') && strcmp(el->ethAddressString, "00:00:00:00:00:00") && strcmp(el->ethAddressString, "00:01:02:03:04:05") /* dummy address */) { char *vendorName; if(isMultihomed(el)) { char *symMacAddr, symLink[32]; char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY]; symMacAddr = etheraddr_string(el->ethAddress, etherbuf); strcpy(symLink, symMacAddr); urlFixupToRFC1945Inplace(symLink); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Main Host MAC Address", symLink, symMacAddr, myGlobals.separator /* it avoids empty cells not to be rendered */); sendString(buf); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "MAC Address \"Network", el->ethAddressString, myGlobals.separator /* it avoids empty cells not to be rendered */); sendString(buf); } vendorName = getVendorInfo(el->ethAddress, 1); if(vendorName[0] != '\0') { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Nw Board Vendor", vendorName, myGlobals.separator /* it avoids empty cells not to be rendered */); sendString(buf); } } if(((el->lastEthAddress[0] != 0) || (el->lastEthAddress[1] != 0) || (el->lastEthAddress[2] != 0) || (el->lastEthAddress[3] != 0) || (el->lastEthAddress[4] != 0) || (el->lastEthAddress[5] != 0) /* The address isn't empty */) && (memcmp(el->lastEthAddress, el->ethAddress, LEN_ETHERNET_ADDRESS) != 0)) { /* Different MAC addresses */ char *symMacAddr, symLink[32], shortBuf[64]; char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY]; symMacAddr = etheraddr_string(el->lastEthAddress, etherbuf); strcpy(symLink, symMacAddr); urlFixupToRFC1945Inplace(symLink); if(!myGlobals.runningPref.dontTrustMACaddr) { safe_snprintf(__FILE__, __LINE__, shortBuf, sizeof(shortBuf), "%s", symLink, symMacAddr); } else { strcpy(shortBuf, symMacAddr); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Last MAC Address/Router \"Network", shortBuf, myGlobals.separator /* it avoids empty cells not to be rendered */); sendString(buf); } if(el->hostNumIpAddress[0] != '\0') { setHostFingerprint(el); if((el->fingerprint != NULL) && (el->fingerprint[0] == ':') && (strlen(el->fingerprint) > 2)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "OS Name", getOSFlag(el, NULL, 1, osBuf, sizeof(osBuf)), myGlobals.separator /* it avoids empty cells not to be rendered */); sendString(buf); } } if((as = getHostAS(el)) != 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Origin AS", CONST_DOMAIN_STATS_HTML, as, as); sendString(buf); } if(el->vlanId != NO_VLAN) { char tmpBuf[64]; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "VLAN Id", vlan2name(el->vlanId, tmpBuf, sizeof(tmpBuf))); sendString(buf); } if(el->ifId != NO_INTERFACE) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Interface Id", el->ifId); sendString(buf); } if(el->nonIPTraffic) { if((el->nonIPTraffic->nbHostName != NULL) || (el->nonIPTraffic->nbDomainName != NULL)) { if(el->nonIPTraffic->nbAccountName) { if(el->nonIPTraffic->nbDomainName != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "NetBios Name", el->nonIPTraffic->nbAccountName, el->nonIPTraffic->nbHostName, el->nonIPTraffic->nbDomainName, getNbNodeType(el->nonIPTraffic->nbNodeType), el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : ""); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "NetBios Name", el->nonIPTraffic->nbAccountName, el->nonIPTraffic->nbHostName, getNbNodeType(el->nonIPTraffic->nbNodeType), el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : ""); } } else { if(el->nonIPTraffic->nbDomainName != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "NetBios Name", el->nonIPTraffic->nbHostName != NULL ? el->nonIPTraffic->nbHostName : "", el->nonIPTraffic->nbDomainName, getNbNodeType(el->nonIPTraffic->nbNodeType), el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : ""); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "NetBios Name", el->nonIPTraffic->nbHostName, getNbNodeType(el->nonIPTraffic->nbNodeType), el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : ""); } } sendString(buf); } else if(el->nonIPTraffic->nbHostName != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "NetBios Name", el->nonIPTraffic->nbHostName, getNbNodeType(el->nonIPTraffic->nbNodeType), el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : ""); sendString(buf); } if(el->nonIPTraffic->atNetwork != 0) { char *nodeName = el->nonIPTraffic->atNodeName; if(nodeName == NULL) nodeName = ""; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", el->nonIPTraffic->atNetwork, el->nonIPTraffic->atNode); sendString(buf); } if(el->nonIPTraffic->ipxHostName != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n"); } } if(!multicastHost(el)) { if(subnetPseudoLocalHost(el)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Host Location", "Local (inside specified/local subnet)"); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Host Location", "Remote (outside specified/local subnet)"); } sendString(buf); } if(el->community) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Community", el->community); sendString(buf); } if(el->hwModel) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Hardware Model", el->hwModel); sendString(buf); } if(el->description) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Description", el->description); sendString(buf); } if(el->minTTL > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "IP TTL (Time to Live)", el->minTTL, el->maxTTL, guessHops(el)); sendString(buf); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Total Data Sent", formatBytes(el->bytesSent.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(el->pktSent.value, formatBuf1, sizeof(formatBuf1)), formatPkts(el->pktDuplicatedAckSent.value, formatBuf2, sizeof(formatBuf2)), (int)(((float)el->pktDuplicatedAckSent.value*100)/(float)(el->pktSent.value+1)) ); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Broadcast Pkts Sent", formatPkts(el->pktBroadcastSent.value, formatBuf, sizeof(formatBuf))); sendString(buf); if(el->routedTraffic != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Routed Traffic", formatBytes(el->routedTraffic->routedBytes.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(el->routedTraffic->routedPkts.value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if((el->pktMulticastSent.value > 0) || (el->pktMulticastRcvd.value > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n"); } if(el->bytesSent.value == 0) percentage = 0; else percentage = 100 - (((float)el->bytesSentRem.value*100)/el->bytesSent.value); if(el->hostNumIpAddress[0] != '\0') { printTableEntryPercentage(buf, sizeof(buf), "Data Sent Stats", "Local", "Rem", -1, percentage, 0, 0); if(el->bytesSent.value > 0) { percentage = (((float)el->ipBytesSent.value*100)/el->bytesSent.value); printTableEntryPercentage(buf, sizeof(buf), "IP vs. Non-IP Sent", "IP", "Non-IP", -1, percentage, 0, 0); } } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), "Total Data Rcvd", formatBytes(el->bytesRcvd.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(el->pktRcvd.value, formatBuf1, sizeof(formatBuf1)), formatPkts(el->pktDuplicatedAckRcvd.value, formatBuf2, sizeof(formatBuf2)), (int)((float)(el->pktDuplicatedAckRcvd.value*100)/(float)(el->pktRcvd.value+1))); sendString(buf); if(el->bytesRcvd.value == 0) percentage = 0; else percentage = 100 - (((float)el->bytesRcvdFromRem.value*100)/el->bytesRcvd.value); if(el->hostNumIpAddress[0] != '\0') printTableEntryPercentage(buf, sizeof(buf), "Data Rcvd Stats", "Local", "Rem", -1, percentage, 0, 0); if(el->bytesRcvd.value > 0) { percentage = (((float)el->ipBytesRcvd.value*100)/el->bytesRcvd.value); printTableEntryPercentage(buf, sizeof(buf), "IP vs. Non-IP Rcvd", "IP", "Non-IP", -1, percentage, 0, 0); } total = el->pktSent.value+el->pktRcvd.value; if(total > 0) { percentage = ((float)el->pktSent.value*100)/((float)total); printTableEntryPercentage(buf, sizeof(buf), "Sent vs. Rcvd Pkts", "Sent", "Rcvd", -1, percentage, 0, 0); } total = el->bytesSent.value+el->bytesRcvd.value; if(total > 0) { percentage = ((float)el->bytesSent.value*100)/((float)total); printTableEntryPercentage(buf, sizeof(buf), "Sent vs. Rcvd Data", "Sent", "Rcvd", -1, percentage, 0, 0); } /* ******************** */ printedHeader=0; for(i=0; icontactedRouters.peersSerials[i])) { HostSerial routerIdx = el->contactedRouters.peersSerials[i]; if(!emptySerial(&routerIdx)) { HostTraffic *router = quickHostLink(routerIdx, myGlobals.actualReportDeviceId, &tmpEl); if(router != NULL) { if(!printedHeader) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n"); /* **************************** */ if((el->protocolInfo) && (el->protocolInfo->userList != NULL)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n"); } /* **************************** */ if((el->hostNumIpAddress[0] != '\0') && (!subnetPseudoLocalHost(el)) && (!multicastHost(el)) && (!privateIPAddress(el))) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n"); } /* RRD */ if(el->hostNumIpAddress[0] != '\0') { struct stat statbuf; char *key; if((!myGlobals.runningPref.dontTrustMACaddr) && subnetPseudoLocalHost(el) && (el->ethAddressString[0] != '\0') /* Really safe in case a host that was supposed to be local isn't really so*/) key = el->ethAddressString; else key = el->hostNumIpAddress; /* Do NOT add a '/' at the end of the path because Win32 will complain about it */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/interfaces/%s/hosts/%s", myGlobals.rrdPath != NULL ? myGlobals.rrdPath : ".", myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName, dotToSlash(key)); revertSlashIfWIN32(buf, 0); if(stat(buf, &statbuf) == 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n" "\n", getRowColor(), myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName, dotToSlash(key), el->hostResolvedName[0] != '\0' ? el->hostResolvedName : el->hostNumIpAddress); sendString(buf); } } checkHostHealthness(el); sendString("
    %s%s %s [%s%s%s%s]", getRowColor(), "IP Address", el->hostNumIpAddress, countryIcon, hostType, dynIp, multihomed, multivlaned); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), " [ Purge Asset ]", serial2str(el->hostSerial, tmpBuf, sizeof(tmpBuf))); sendString(buf); sendString("
    %s 
      ", getRowColor(), "Multihomed Addresses"); sendString(buf); for(theHost=getFirstHost(actualDeviceId); theHost != NULL; theHost = getNextHost(actualDeviceId, theHost)) { if((theHost != el) && (memcmp(theHost->ethAddress, el->ethAddress, LEN_ETHERNET_ADDRESS) == 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
    1. %s", theHost->hostNumIpAddress, theHost->hostNumIpAddress); sendString(buf); } } /* for */ sendString("
    %s%s
    %s\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "DHCP Server", _intoa(el->protocolInfo->dhcpStats->dhcpServerIpAddress, buf1, sizeof(buf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "Previous IP Address", _intoa(el->protocolInfo->dhcpStats->previousIpAddress, buf1, sizeof(buf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "Address Assigned on", formatTime(&(el->protocolInfo->dhcpStats->assignTime), formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "To be Renewed Before", formatTime(&(el->protocolInfo->dhcpStats->renewalTime), formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "Lease Ends on", formatTime(&(el->protocolInfo->dhcpStats->leaseTime), formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor()); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "DHCP Discover", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_DISCOVER_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_DISCOVER_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "DHCP Offer", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_OFFER_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_OFFER_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "DHCP Request", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_REQUEST_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_REQUEST_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "DHCP Decline", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_DECLINE_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_DECLINE_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "DHCP Ack", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_ACK_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_ACK_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "DHCP Nack", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_NACK_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_NACK_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "DHCP Release", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_RELEASE_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_RELEASE_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "DHCP Inform", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_INFORM_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_INFORM_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), "DHCP Unknown Msg", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_UNKNOWN_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_UNKNOWN_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); sendString("
    %s%s
    %s%s
    %s%s
    %s%s
    %s%s
    DHCP PacketsSentRcvd
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    "TABLE_OFF"
    %s" "%s  -  %s [Inactive since %s]
    %s" "%d
    %s" "%s
    %s" "%s%s
    %s" "%s%s
    %s%s%s
    %s" "%s" "%s
    %s" "%s%s
    %s" "%d
    %s" "%s
    %s" "%d
    %s" "%s@%s [domain %s] (%s) %s
    %s" "%s@%s (%s) %s
    %s" "%s [domain %s] (%s) %s
    %s" "%s (%s) %s
    %s" "%s (%s) %s
    %s" "%s \n", getRowColor(), "AppleTalk Name", nodeName); sendString(buf); if(el->nonIPTraffic->atNodeType[0] != NULL) { sendString("("); for(i=0; inonIPTraffic->atNodeType[i] == NULL) break; else { if(i > 0) sendString("/"); sendString(el->nonIPTraffic->atNodeType[i]); } sendString(") "); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "[%d.%d]
    %s" "%s [", getRowColor(), "IPX Name", el->nonIPTraffic->ipxHostName); sendString(buf); for(i=0; inonIPTraffic->numIpxNodeTypes; i++) { if(i>0) sendString("/"); sendString(getSAPInfo(el->nonIPTraffic->ipxNodeType[i], 1)); } sendString("]
    %s" "%s
    %s" "%s
    %s" "%s
    %s" "%s
    %s" "%s
    %s" "%d:%d [~%d hop(s)]
    %s" "" "%s/%s Pkts/%s Retran. Pkts [%d%%]
    %s" "%s Pkts
    %s" "%s/%s Pkts
    %s", getRowColor(), "Multicast Traffic"); sendString(buf); if(el->pktMulticastSent.value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Sent %s/%s Pkts ", formatBytes(el->bytesMulticastSent.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(el->pktMulticastSent.value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->pktMulticastRcvd.value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%sRcvd %s/%s Pkts", (el->pktMulticastSent.value > 0) ? " - " : "", formatBytes(el->bytesMulticastRcvd.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(el->pktMulticastRcvd.value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } sendString("
    %s" "" "%s/%s Pkts/%s Retran. Pkts [%d%%]
    " "Used Subnet Routers\n", getRowColor()); sendString(buf); } printedHeader++; if(printedHeader > 1) sendString("
    "); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s\n", makeHostLink(router, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString(buf); } } } } checkHostProvidedServices(el); /* Fix courtesy of Albert Chin-A-Young */ if(printedHeader > 1) sendString("
    " "Known Users " CONST_IMG_HAS_USERS "\n", getRowColor()); sendString(buf); printUserList(el); sendString("
    \n
    " "%s" "[ Whois ]\n", getRowColor(), "Further Host Information", el->hostNumIpAddress); sendString(buf); if(myGlobals.runningPref.mapperURL) { sendString(" ["); buildMapLink(el, buf, sizeof(buf)); sendString(buf); sendString(" ]"); } sendString("
    Historical Data" "[ " "\"view ]" "
    "TABLE_OFF"

    \n"); sendString("

    \n"); } /* ************************************ */ void printServiceStats(char* svcName, ServiceStats* ss, short printSentStats) { char buf[LEN_GENERAL_WORK_BUFFER]; Counter tot, tot1; float f1, f2, f3, f4; char formatBuf[32], formatBuf1[32], formatBuf2[32], formatBuf3[32], formatBuf4[32], formatBuf5[32], formatBuf6[32], formatBuf7[32]; if(ss != NULL) { if(printSentStats) { tot = ss->numLocalReqSent.value+ss->numRemReqSent.value; if(tot == 0) f1 = f2 = 0; else { f1 = (ss->numLocalReqSent.value*100)/tot; f2 = (ss->numRemReqSent.value*100)/tot; } tot1 = ss->numPositiveReplRcvd.value+ss->numNegativeReplRcvd.value; if(tot1 == 0) f3 = f4 = 0; else { f3 = (ss->numPositiveReplRcvd.value*100)/tot1; f4 = (ss->numNegativeReplRcvd.value*100)/tot1; } if((tot > 0) || (tot1 > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s%.1f%%" "%s%.1f%%" "%s%.1f%%" "%s%.1f%%" "%s - %s%s - %s" "\n", getRowColor(), svcName, formatPkts(ss->numLocalReqSent.value, formatBuf, sizeof(formatBuf)), f1, formatPkts(ss->numRemReqSent.value, formatBuf1, sizeof(formatBuf1)), f2, formatPkts(ss->numPositiveReplRcvd.value, formatBuf2, sizeof(formatBuf2)), f3, formatPkts(ss->numNegativeReplRcvd.value, formatBuf3, sizeof(formatBuf3)), f4, formatMicroSeconds(ss->fastestMicrosecLocalReqMade, formatBuf4, sizeof(formatBuf4)), formatMicroSeconds(ss->slowestMicrosecLocalReqMade, formatBuf5, sizeof(formatBuf5)), formatMicroSeconds(ss->fastestMicrosecRemReqMade, formatBuf6, sizeof(formatBuf6)), formatMicroSeconds(ss->slowestMicrosecRemReqMade, formatBuf7, sizeof(formatBuf7)) ); sendString(buf); } } else { tot = ss->numLocalReqRcvd.value+ss->numRemReqRcvd.value; if(tot == 0) f1 = f2 = 0; else { f1 = (ss->numLocalReqRcvd.value*100)/tot; f2 = (ss->numRemReqRcvd.value*100)/tot; } tot1 = ss->numPositiveReplSent.value+ss->numNegativeReplSent.value; if(tot1 == 0) f3 = f4 = 0; else { f3 = (ss->numPositiveReplSent.value*100)/tot1; f4 = (ss->numNegativeReplSent.value*100)/tot1; } if((tot > 0) || (tot1 > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s%.1f%%" "%s%.1f%%" "%s%.1f%%" "%s%.1f%%" "%s - %s%s - %s" "\n", getRowColor(), svcName, formatPkts(ss->numLocalReqRcvd.value, formatBuf, sizeof(formatBuf)), f1, formatPkts(ss->numRemReqRcvd.value, formatBuf1, sizeof(formatBuf1)), f2, formatPkts(ss->numPositiveReplSent.value, formatBuf2, sizeof(formatBuf2)), f3, formatPkts(ss->numNegativeReplSent.value, formatBuf3, sizeof(formatBuf3)), f4, formatMicroSeconds(ss->fastestMicrosecLocalReqServed, formatBuf4, sizeof(formatBuf4)), formatMicroSeconds(ss->slowestMicrosecLocalReqServed, formatBuf5, sizeof(formatBuf5)), formatMicroSeconds(ss->fastestMicrosecRemReqServed, formatBuf6, sizeof(formatBuf6)), formatMicroSeconds(ss->slowestMicrosecRemReqServed, formatBuf7, sizeof(formatBuf7)) ); sendString(buf); } } } } /* ************************************ */ void printHostUsedServices(HostTraffic *el, int actualDeviceId) { Counter tot; if((el->protocolInfo == NULL) || ((el->protocolInfo->dnsStats == NULL) && (el->protocolInfo->httpStats == NULL))) return; tot = 0; if(el->protocolInfo->dnsStats) tot += el->protocolInfo->dnsStats->numLocalReqSent.value + el->protocolInfo->dnsStats->numRemReqSent.value; if(el->protocolInfo->httpStats) tot += el->protocolInfo->httpStats->numLocalReqSent.value + el->protocolInfo->httpStats->numRemReqSent.value; if(tot > 0) { printSectionTitle("IP Service Stats: Client Role"); sendString("
    \n"); sendString(""TABLE_ON"\n" "" "" "" "" "" "" "" "\n"); if(el->protocolInfo->dnsStats) printServiceStats("DNS", el->protocolInfo->dnsStats, 1); if(el->protocolInfo->httpStats) printServiceStats("HTTP", el->protocolInfo->httpStats, 1); sendString("
     # Loc. Req. Sent# Rem. Req. Sent# Pos. Reply Rcvd# Neg. Reply RcvdLocal RndTripRem RndTrip
    "TABLE_OFF"\n"); sendString("
    \n"); } /* ************ */ tot = 0; if(el->protocolInfo->dnsStats) tot += el->protocolInfo->dnsStats->numLocalReqRcvd.value+el->protocolInfo->dnsStats->numRemReqRcvd.value; if(el->protocolInfo->httpStats) tot += el->protocolInfo->httpStats->numLocalReqRcvd.value+el->protocolInfo->httpStats->numRemReqRcvd.value; if(tot > 0) { printSectionTitle("IP Service Stats: Server Role"); sendString("
    \n"); sendString("

    "TABLE_ON"\n" "" "" "" "" "" "" "" "\n"); if(el->protocolInfo->dnsStats) printServiceStats("DNS", el->protocolInfo->dnsStats, 0); if(el->protocolInfo->httpStats) printServiceStats("HTTP", el->protocolInfo->httpStats, 0); sendString("
     # Loc. Req. Rcvd# Rem. Req. Rcvd# Pos. Reply Sent# Neg. Reply SentLocal RndTripRem RndTrip
    "TABLE_OFF"\n"); sendString("

    \n"); } } /* ********************************** */ void printTableEntry(char *buf, int bufLen, char *label, char* color, float total, float percentage, u_int showFlows, Counter flows, u_int showRRD) { int int_perc; char formatBuf[32], flowBuf[64], tmpBuf[32], rrdBuf[768]; struct stat statbuf; char _label[256]; encodeString(label, _label, sizeof(_label)); /* traceEvent(CONST_TRACE_INFO, "'%s' -> '%s'", label, _label); */ if(total == 0) return; int_perc = (int)percentage; /* This shouldn't happen */ if(int_perc < 0) { int_perc = 0; percentage = 0; } else if(int_perc > 100) { int_perc = 100; percentage = 100; } if(!showFlows) flowBuf[0] = '\0'; else safe_snprintf(__FILE__, __LINE__, flowBuf, sizeof(flowBuf), "%s", formatPkts(flows, tmpBuf, sizeof(tmpBuf))); if(!showRRD) rrdBuf[0] = '\0'; else { safe_snprintf(__FILE__, __LINE__, rrdBuf, sizeof(rrdBuf), "%s/interfaces/%s/IP_%sBytes.rrd", myGlobals.rrdPath != NULL ? myGlobals.rrdPath : ".", myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName, label); revertSlashIfWIN32(rrdBuf, 0); if(stat(rrdBuf, &statbuf) == 0) { time_t now = time(NULL); safe_snprintf(__FILE__, __LINE__, rrdBuf, sizeof(rrdBuf), "

    " "
    " "" " 
    \n", _label, myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName, _label, myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName, now-12*3600, now); } else { rrdBuf[0] = '\0'; /* traceEvent(CONST_TRACE_INFO, "-> Unable to find file '%s'", rrdBuf); */ } } switch(int_perc) { case 0: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s %s0%%" " %s\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, rrdBuf); break; case 100: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s %s100%%" "\"100%%\"%s" "\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, rrdBuf); break; default: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s %s%.1f%%" "" "
    \"%.1f%%\"%s" "" "

     

    "TABLE_OFF"\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, percentage, percentage, (260*int_perc)/100, rrdBuf, (260*(100-int_perc))/100, getActualRowColor()); } sendString(buf); } /* ************************ */ char* buildHTMLBrowserWindowsLabel(int i, int j, u_short forIpTraffic) { static char buf[LEN_GENERAL_WORK_BUFFER]; int idx = i*myGlobals.device[myGlobals.actualReportDeviceId].numHosts + j; char formatBuf[32], formatBuf1[32], formatBuf2[32], formatBuf3[32]; accessAddrResMutex("buildHTMLBrowserWindowsLabel"); if((myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx] == NULL) || ((myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesSent.value == 0) && (myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesRcvd.value == 0))) buf[0]='\0'; else if ((myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesSent.value > 0) && (myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesRcvd.value == 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "(%s->%s)=%s/%s Pkts", myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrixHosts[i]->hostResolvedName, myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrixHosts[j]->hostResolvedName, formatBytes(myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesSent.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->pktsSent.value, formatBuf1, sizeof(formatBuf1))); } else if ((myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesSent.value == 0) && (myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesRcvd.value > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "(%s->%s)=%s/%s Pkts", myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrixHosts[j]->hostResolvedName, myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrixHosts[i]->hostResolvedName, formatBytes(myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesRcvd.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->pktsRcvd.value, formatBuf1, sizeof(formatBuf1))); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "(%s->%s)=%s/%s Pkts, (%s->%s)=%s/%s Pkts", myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrixHosts[i]->hostResolvedName, myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrixHosts[j]->hostResolvedName, formatBytes(myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesSent.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->pktsSent.value, formatBuf1, sizeof(formatBuf1)), myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrixHosts[j]->hostResolvedName, myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrixHosts[i]->hostResolvedName, formatBytes(myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesRcvd.value, 1, formatBuf2, sizeof(formatBuf2)), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->pktsRcvd.value, formatBuf3, sizeof(formatBuf3))); } releaseAddrResMutex(); return(buf); } /* *********************************** */ void printHostHourlyTrafficEntry(HostTraffic *el, int i, Counter tcSent, Counter tcRcvd) { float pctg; char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32]; if(el->trafficDistribution == NULL) return; safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "%s", formatBytes(el->trafficDistribution->last24HoursBytesSent[i].value, 0, formatBuf, sizeof(formatBuf))); sendString(buf); if(tcSent > 0) pctg = (float)(el->trafficDistribution->last24HoursBytesSent[i].value*100)/(float)tcSent; else pctg = 0; safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "%.1f %%", getBgPctgColor(pctg), pctg); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "%s", formatBytes(el->trafficDistribution->last24HoursBytesRcvd[i].value, 0, formatBuf, sizeof(formatBuf))); sendString(buf); if(tcRcvd > 0) pctg = (float)(el->trafficDistribution->last24HoursBytesRcvd[i].value*100)/(float)tcRcvd; else pctg = 0; safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "%.1f %%", getBgPctgColor(pctg), pctg); sendString(buf); } /* ************************************ */ char* getNbNodeType(char nodeType) { switch(nodeType) { case 0x0: return("Workstation"); case 0x20: default: return("Server"); } return(""); /* NOTREACHED */ } /* ********************************** */ void printFlagedWarning(char *text) { char buf[LEN_GENERAL_WORK_BUFFER]; safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "

    \n" "

    \"Warning\"

    \n" "

    %s

    \n" "
    \n", text); sendString(buf); } /* ********************************** */ void printPageTitle(char *text) { sendString("

     

    \n"); switch (myGlobals.ntopRunState) { case FLAG_NTOPSTATE_RUN: break; case FLAG_NTOPSTATE_STOPCAP: sendString("
    " "Packet capture stopped" "
    \n"); break; case FLAG_NTOPSTATE_SHUTDOWN: sendString("
    " "ntop shutting down" "
    \n"); break; case FLAG_NTOPSTATE_TERM: sendString("
    " "ntop stopped" "
    \n"); break; } sendString("
    \n

    "); sendString(text); sendString("

    \n
    \n"); } /* ******************************** */ void printSectionTitle(char *text) { sendString("

     

    \n" "
    \n

    "); sendString(text); sendString("

    \n
    \n"); } /* ******************************** */ void printHostsCharacterization(void) { u_int a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, unhealthy=0, totHosts=0; HostTraffic *el; char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[LEN_GENERAL_WORK_BUFFER], headerSent = 0; printHTMLheader("Local Hosts Characterization", NULL, 0); for(el=getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if((broadcastHost(el) == 0) /* No broadcast addresses please */ && (multicastHost(el) == 0) /* No multicast addresses please */ && subnetPseudoLocalHost(el)) { totHosts++; if(el->community && (!isAllowedCommunity(el->community))) continue; if(isPrinter(el) || isBridgeHost(el) || nameServerHost(el) || isNtpServer(el) || gatewayHost(el) || isVoIPHost(el) || isSMTPhost(el) || isIMAPhost(el) || isPOPhost(el) || isDirectoryHost(el) || isFTPhost(el) || isHTTPhost(el) || isWINShost(el) || isDHCPClient(el) || isDHCPServer(el) || isP2P(el) || (isHostHealthy(el) != 0) ) { if(!headerSent) { sendString("
    "TABLE_ON"\n" "" "" "" "" "" "" "" "" "" "" "" "\n" ); headerSent = 1; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor(), makeHostLink(el, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString(buf); if(isHostHealthy(el) != 0) { sendString(""); unhealthy++; } else sendString(""); if(isBridgeHost(el)) { sendString(""); a++; } else sendString(""); if(gatewayHost(el)) { sendString(""); b++; } else sendString(""); if(isVoIPHost(el)) { sendString(""); b++; } else sendString(""); if(isPrinter(el)) { sendString(""); c++; } else sendString(""); if(nameServerHost(el) || isNtpServer(el)) { sendString(""); d++; } else sendString(""); if(isSMTPhost(el) || isIMAPhost(el) || isPOPhost(el)) { sendString(""); e++; } else sendString(""); if(isDirectoryHost(el) || isFTPhost(el) || isHTTPhost(el)) { sendString(""); f++; } else sendString(""); if(isDHCPServer(el) || isWINShost(el)) { sendString(""); g++; } else sendString(""); if(isDHCPClient(el)) { sendString(""); h++; } else sendString(""); if(isP2P(el)) { sendString(""); i++; } else sendString(""); sendString("\n"); } } } if(!headerSent) { printNoDataYet(); } else { sendString(""); if(unhealthy > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", unhealthy, (float)(unhealthy*100)/(float)totHosts); sendString(buf); } else sendString(""); if(a > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", a); sendString(buf); } else sendString(""); if(b > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", b); sendString(buf); } else sendString(""); if(c > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", c); sendString(buf); } else sendString(""); if(d > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", d); sendString(buf); } else sendString(""); if(e > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", e); sendString(buf); } else sendString(""); if(f > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", f); sendString(buf); } else sendString(""); if(g > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", g); sendString(buf); } else sendString(""); if(h > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", h); sendString(buf); } else sendString(""); if(i > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", i); sendString(buf); } else sendString(""); sendString("
    HostUnhealthy
    Host
    L2 Switch
    Bridge
    GatewayVoIP
    Host
    PrinterNTP/DNS
    Server
    SMTP/POP/IMAP
    Server
    Directory/FTP/HTTP
    Server
    DHCP/WINS
    Server
    DHCP
    Client
    P2P
    %sX X X X X X X X X X X 
    Total%d [%.1f %%] %d %d %d %d %d %d %d %d %d 
    \n"); } } /* ******************************** */ static void printFingerprintCounts(int countScanned, int countWithoutFP, int countBroadcast, int countMulticast, int countRemote, int countNotIP, int countUnknownFP, int unknownFPsEtc, int countCantResolve, int fingerprintRemote, char *unknownFPs) { char buf[LEN_GENERAL_WORK_BUFFER]; struct tm t; sendString("


    \n"); printSectionTitle("Statistics"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "

    \n\n" "\n" "\n" "\n" "\n" "\n" "\n", countScanned, countWithoutFP, countBroadcast, countMulticast); sendString(buf); if(fingerprintRemote != TRUE) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", countRemote); sendString(buf); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n" "\n" "\n", countNotIP, countScanned - countWithoutFP - countBroadcast - countMulticast - countRemote - countNotIP); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", countCantResolve); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", countUnknownFP); sendString(buf); sendString("\n
    Scanned
    Hosts%d
    Less:
    No fingerprint%d
    Broadcast%d
    Multicast%d
    Remote%d
    Non IP host%d
    Gives:
    Possible to report%d
    Less: Can not resolve*%d
    Less: Unknown Fingerprint**%d
    \n

    \n"); sendString("\n"); sendString("\n"); sendString("
    * Can not resolve means " "either the fingerprint was incomplete, or we tried to resolve " "it on a previous scan and it was not on file. " "No further action will occur for these hosts.
    ** Unknown Fingerprints means " "we have not tried to resolve them yet.\n" "
      "); if((myGlobals.nextFingerprintScan > 0) && (countUnknownFP > 0) && (myGlobals.runningPref.debugMode != 1)) { strftime(buf, sizeof(buf), CONST_LOCALE_TIMESPEC, localtime_r(&myGlobals.nextFingerprintScan, &t)); sendString("
    • May be resolved during the next scan, scheduled for "); sendString(buf); sendString(" (approximately).
    • \n"); } if(unknownFPs[0] != '\0') { unknownFPs[0]=' '; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
    • Are: %s%s
    • \n", unknownFPs, unknownFPsEtc == 1 ? " ..." : ""); sendString(buf); } #ifdef CONST_ETTERCAP_HOMEPAGE safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
    • Click " "here " "to visit Ettercap's home page at SourceForge. " "And, click " "here " " to upload new fingerprints, or download additional (unverified) ones.

    • \n", CONST_ETTERCAP_HOMEPAGE, CONST_ETTERCAP_HOMEPAGE, CONST_ETTERCAP_FINGERPRINT); sendString(buf); #endif sendString("
    • You can use the 'make dnetter' command, part of the ntop source distribution, " "to download the latest fingerprint file from the Ettercap cvs.

    • \n"); if(fingerprintRemote != TRUE) sendString("
    Fingerprinting of non-local hosts may be erroneous " "- routers and intermediate hosts can alter the characteristics used to " "determine the operating system. Unfortunately, this can also occur because " "of entries not in the signature file, " CONST_OSFINGERPRINT_FILE "(.gz) - " "and there's no way to tell." "\n
    That said, if you would like to see a page with ALL host fingerprints, " "local and remote, click here

    \n"); } /* ******************************** */ void printHostsStats(int fingerprintRemote) { u_int idx, numEntries=0, maxHosts; HostTraffic *el, **tmpTable; OsNumInfo theOSs[MAX_NUM_OS]; int i, countScanned=0, countWithoutFP=0, countBroadcast=0, countMulticast=0, countRemote=0, countNotIP=0, countUnknownFP=0, countCantResolve=0; char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[LEN_GENERAL_WORK_BUFFER]; char unknownFPs[LEN_GENERAL_WORK_BUFFER]; int unknownFPsEtc=0; memset(theOSs, 0, sizeof(theOSs)); memset(unknownFPs, 0, sizeof(unknownFPs)); if(fingerprintRemote == 1) printHTMLheader("All Host Fingerprints (Local+Remote)", NULL, BITFLAG_HTML_NO_REFRESH); else printHTMLheader("Local Host Fingerprints", NULL, BITFLAG_HTML_NO_REFRESH); printSectionTitle("OS Summary"); if(myGlobals.device[myGlobals.actualReportDeviceId].dummyDevice) { printFlagedWarning("Host statistics (OS fingerprinting) are not available for virtual interfaces"); return; } maxHosts = myGlobals.device[myGlobals.actualReportDeviceId].hostsno; /* save it as it can change */ tmpTable = (HostTraffic**)mallocAndInitWithReportWarn(maxHosts*sizeof(HostTraffic*), "printHostsStats"); if(tmpTable == NULL) return; for(el=getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { countScanned++; if(el->community && (!isAllowedCommunity(el->community))) continue; if(el->fingerprint == NULL) { countWithoutFP++; continue; } if(broadcastHost(el)) { /* No broadcast addresses please */ countBroadcast++; continue; } if(multicastHost(el)) { /* No multicast addresses please */ countMulticast++; continue; } if((!subnetPseudoLocalHost(el)) && (fingerprintRemote != TRUE)) { /* Local only */ countRemote++; continue; } if((el->fingerprint[0] != ':') /* fingerprint has not been computed */ && ((el->hostNumIpAddress[0] == '\0') || (addrnull(&el->hostIpAddress)))) { countNotIP++; continue; } if(el->fingerprint[0] != ':') setHostFingerprint(el); if(el->fingerprint[0] != ':') { countUnknownFP++; if(strstr(unknownFPs, el->fingerprint) == NULL) { if(strlen(unknownFPs) + strlen(el->fingerprint) > (sizeof(unknownFPs) - 5)) { unknownFPsEtc=1; } else { strncat(unknownFPs, ", ", (sizeof(unknownFPs) - strlen(unknownFPs) - 1)); strncat(unknownFPs, el->fingerprint, (sizeof(unknownFPs) - strlen(unknownFPs) - 1)); } } continue; } if((el->fingerprint[0] == ':') && (el->fingerprint[1] == '\0')) { /* Too short */ countCantResolve++; continue; } tmpTable[numEntries++] = el; for(i=0; ifingerprint[1]) == 0) { theOSs[i].num++; break; } } if(theOSs[i].name == NULL) { theOSs[i].name = strdup(&el->fingerprint[1]); theOSs[i].num++; } if(numEntries >= maxHosts) break; } if(numEntries <= 0) { printNoDataYet(); free(tmpTable); printFingerprintCounts(countScanned, countWithoutFP, countBroadcast, countMulticast, countRemote, countNotIP, countUnknownFP, unknownFPsEtc, countCantResolve, fingerprintRemote, unknownFPs); return; } myGlobals.columnSort = 0; qsort(tmpTable, numEntries, sizeof(HostTraffic*), cmpFctn); sendString("
    \n"); sendString(""TABLE_ON"\n"); for(i=0; i"); os = strdup(theOSs[i].name); word = strtok_r(os, " ", &strtokState); while(word != NULL) { if((sentBR++) > 0) sendString("
    \n"); sendString(word); word = strtok_r(NULL, " ", &strtokState); } free(os); sendString(""); } } sendString("
    \n"); for(idx=0; idxhostNumIpAddress; if((tmpName1[0] == '\0') || (strcmp(tmpName1, "0.0.0.0") == 0)) tmpName1 = myGlobals.separator; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor(), makeHostLink(el, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString(buf); for(i=0; ifingerprint[1]) == 0) { if((el->protocolInfo != NULL) && (el->protocolInfo->userList != NULL)) { sendString(""); } else { if((el->nonIPTraffic != NULL) && (el->nonIPTraffic->nbDomainName != NULL)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", el->nonIPTraffic->nbDomainName); sendString(buf); } else sendString(""); } } else sendString(""); } } /* for */ sendString("\n"); } } sendString("
    Host
    %s"); printUserList(el); sendString("
    \n
    [ %s ]X 
    \n

     

    "); /* ********************************** */ qsort(theOSs, MAX_NUM_OS, sizeof(OsNumInfo), cmpOSFctn); sendString("
    " TABLE_ON "\n" "\n\n"); for(i=0; i\n" "\n", theOSs[i].name, theOSs[i].num); sendString(buf); free(theOSs[i].name); } } sendString("
    OSTotal
    %s%d
    \n
    \n"); free(tmpTable); printFingerprintCounts(countScanned, countWithoutFP, countBroadcast, countMulticast, countRemote, countNotIP, countUnknownFP, unknownFPsEtc, countCantResolve, fingerprintRemote, unknownFPs); } /* ******************************************************** */ void printMutexStatus(int textPrintFlag, PthreadMutex *mutexId, char *mutexName) { char buf[LEN_GENERAL_WORK_BUFFER], bufAttempt[64], bufLock[64], bufUnlock[64]; struct tm t; if(mutexId->numLocks == 0) /* Mutex never used */ return; memset(bufAttempt, 0, sizeof(bufAttempt)); if(mutexId->attempt.time.tv_sec > 0) { strftime(bufAttempt, sizeof(bufAttempt), CONST_LOCALE_TIMESPEC, localtime_r((const time_t*)&mutexId->attempt.time.tv_sec, &t)); strncat(bufAttempt, "
    \n", (sizeof(bufAttempt) - strlen(bufAttempt) - 1)); } memset(bufLock, 0, sizeof(bufLock)); if(mutexId->lock.time.tv_sec > 0) { strftime(bufLock, sizeof(bufLock), CONST_LOCALE_TIMESPEC, localtime_r((const time_t*)&mutexId->lock.time.tv_sec, &t)); strncat(bufLock, "
    \n", (sizeof(bufLock) - strlen(bufLock) - 1)); } memset(bufUnlock, 0, sizeof(bufUnlock)); if(mutexId->unlock.time.tv_sec > 0) { strftime(bufUnlock, sizeof(bufUnlock), CONST_LOCALE_TIMESPEC, localtime_r((const time_t*)&mutexId->unlock.time.tv_sec, &t)); strncat(bufUnlock, "
    \n", (sizeof(bufUnlock) - strlen(bufUnlock) - 1)); } if(textPrintFlag == TRUE) { if(myGlobals.runningPref.disableMutexExtraInfo) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Mutex %s is %s, locked: %u times.\n", mutexName, mutexId->isLocked ? "locked" : "unlocked", mutexId->numLocks); sendString(buf); } else if(mutexId->attempt.line > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Mutex %s is %s.\n" " locked: %u times, last was at %s %s:%d(%d %u)\n" " blocked: at %s:%d(%d %u)\n", mutexName, mutexId->isLocked ? "locked" : "unlocked", mutexId->numLocks, bufLock, mutexId->lock.file, mutexId->lock.line, mutexId->lock.pid, mutexId->lock.thread, mutexId->attempt.file, mutexId->attempt.line, mutexId->attempt.pid, mutexId->attempt.thread); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), " unlocked: %u times, last was %s:%d(%d %u)\n" " longest: %.6f sec from %s:%d\n", mutexId->numReleases, mutexId->unlock.file, mutexId->unlock.line, mutexId->unlock.pid, mutexId->unlock.thread, mutexId->maxLockedDuration, mutexId->max.file, mutexId->max.line); sendString(buf); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Mutex %s, is %s.\n" " locked: %u times, last was at %s %s:%d(%d %u)\n" " unlocked: %u times, last was at %s %s:%d(%d %u)\n" " longest: %.6f sec from %s:%d\n", mutexName, mutexId->isLocked ? "locked" : "unlocked", mutexId->numLocks, bufLock, mutexId->lock.file, mutexId->lock.line, mutexId->lock.pid, mutexId->lock.thread, mutexId->numReleases, bufUnlock, mutexId->unlock.file, mutexId->unlock.line, mutexId->unlock.pid, mutexId->unlock.thread, mutexId->maxLockedDuration, mutexId->max.file, mutexId->max.line); sendString(buf); } } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s\n%s\n", mutexName, mutexId->isLocked ? "locked" : "unlocked"); sendString(buf); if(!myGlobals.runningPref.disableMutexExtraInfo) { if(mutexId->attempt.line == 0) { sendString(" \n"); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s, %s:%d p:%d t:%u\n", bufAttempt, mutexId->attempt.file, mutexId->attempt.line, mutexId->attempt.pid, mutexId->attempt.thread); sendString(buf); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s %s:%d p:%d t:%u\n", bufLock, mutexId->lock.file, mutexId->lock.line, mutexId->lock.pid, mutexId->lock.thread); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s %s:%d p:%d t:%u\n", bufUnlock, mutexId->unlock.file, mutexId->unlock.line, mutexId->unlock.pid, mutexId->unlock.thread); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%.6f seconds %s:%d\n", mutexId->maxLockedDuration, mutexId->max.file, mutexId->max.line); sendString(buf); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%u / %u\n", mutexId->numLocks, mutexId->numReleases); sendString(buf); } } void printFcHeader(int reportType, int revertOrder, u_int column, u_int hourId, char *url) { char buf[LEN_GENERAL_WORK_BUFFER]; char *sign, *arrowGif, *arrow[48], *theAnchor[48]; char htmlAnchor[64], htmlAnchor1[64]; char hours[][24] = {"12
    AM", "1
    AM", "2
    AM", "3
    AM", "4
    AM", "5
    AM", "6
    AM", "7
    AM", "8
    AM", "9
    AM", "10
    AM", "11
    AM", "12
    PM", "1
    PM", "2
    PM", "3
    PM", "4
    PM", "5
    PM", "6
    PM", "7
    PM", "8
    PM", "9
    PM", "10
    PM", "11
    PM"}; int i, j; /* printf("->%d<-\n",screenNumber); */ if(revertOrder) { sign = ""; arrowGif = " " CONST_IMG_ARROW_UP; } else { sign = "-"; arrowGif = " " CONST_IMG_ARROW_DOWN; } memset(buf, 0, sizeof(buf)); safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), "\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"" "\n" "\n" "\n", theAnchor[1], arrow[1], theAnchor[0], arrow[0], theAnchor[2], arrow[2]); sendString(buf); if(abs(column) == 1) { arrow[0] = arrowGif; theAnchor[0] = htmlAnchor; } else { arrow[0] = ""; theAnchor[0] = htmlAnchor1; } if(abs(column) == 2) { arrow[1] = arrowGif; theAnchor[1] = htmlAnchor; } else { arrow[1] = ""; theAnchor[1] = htmlAnchor1;} if(abs(column) == 3) { arrow[2] = arrowGif; theAnchor[2] = htmlAnchor; } else { arrow[2] = ""; theAnchor[2] = htmlAnchor1; } if(abs(column) == 4) { arrow[3] = arrowGif; theAnchor[3] = htmlAnchor; } else { arrow[3] = ""; theAnchor[3] = htmlAnchor1; } if(abs(column) == 5) { arrow[4] = arrowGif; theAnchor[4] = htmlAnchor; } else { arrow[4] = ""; theAnchor[4] = htmlAnchor1; } if(abs(column) == 6) { arrow[5] = arrowGif; theAnchor[5] = htmlAnchor; } else { arrow[5] = ""; theAnchor[5] = htmlAnchor1; } if(abs(column) == 7) { arrow[6] = arrowGif; theAnchor[6] = htmlAnchor1; } safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" "" "" "", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2], theAnchor[3], arrow[3], theAnchor[4], arrow[4], theAnchor[5], arrow[5]); sendString(buf); break; case SORT_FC_ACTIVITY: sendString("
    \n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"
    %s" FLAG_DOMAIN_DUMMY_IDX_STR "\">VSAN%s%s" FLAG_HOST_DUMMY_IDX_STR "\">FC_Port%s%s0\">Total Bytes%s%s1\">SCSI%s%s2\">ELS%s%s3\">NS%s%s4\">IP/FC%s%s5\">SWILS%s%s6\">Other%s
    " "" "\n", theAnchor[1], arrow[1], theAnchor[0], arrow[0]); sendString(buf); j = hourId; for (i = 0; i < 24; i++) { j = j % 24; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", hours[j]); sendString (buf); if (!j) { j = 23; } else { j--; } } break; case SORT_FC_THPT: sendString("
    \n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"
    %s" FLAG_DOMAIN_DUMMY_IDX_STR "\">VSAN%s%s" FLAG_HOST_DUMMY_IDX_STR "\">FC_Port%s%s
    " "" "", theAnchor[1], arrow[1], theAnchor[0], arrow[0]); sendString(buf); updateThpt(0); if(abs(column) == 1) { arrow[0] = arrowGif; theAnchor[0] = htmlAnchor; } else { arrow[0] = ""; theAnchor[0] = htmlAnchor1; } if(abs(column) == 2) { arrow[1] = arrowGif; theAnchor[1] = htmlAnchor; } else { arrow[1] = ""; theAnchor[1] = htmlAnchor1; } if(abs(column) == 3) { arrow[2] = arrowGif; theAnchor[2] = htmlAnchor; } else { arrow[2] = ""; theAnchor[2] = htmlAnchor1;} if(abs(column) == 4) { arrow[3] = arrowGif; theAnchor[3] = htmlAnchor; } else { arrow[3] = ""; theAnchor[3] = htmlAnchor1;} if(abs(column) == 5) { arrow[4] = arrowGif; theAnchor[4] = htmlAnchor; } else { arrow[4] = ""; theAnchor[4] = htmlAnchor1;} if(abs(column) == 6) { arrow[5] = arrowGif; theAnchor[5] = htmlAnchor; } else { arrow[5] = ""; theAnchor[5] = htmlAnchor1;} safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" "" ""); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" "" "" "" "", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2], theAnchor[3], arrow[3], theAnchor[4], arrow[4], theAnchor[5], arrow[5]); sendString(buf); break; default: safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "

    ERROR: reportType=%d

    \n", reportType); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"
    %s" FLAG_DOMAIN_DUMMY_IDX_STR "\">VSAN%s%s" FLAG_HOST_DUMMY_IDX_STR "\">FC_Port%sBytesPackets
    %s1\">Current%s%s2\">Avg%s%s3\">Peak%s%s4\">Current%s%s5\">Avg%s%s6\">Peak%s
    " "" "", theAnchor[1], arrow[1], theAnchor[0], arrow[0]); sendString(buf); break; } sendString("\n"); } /* ************************************ */ void printPluginTrailer(char *left, char *middle) { sendString("
    \n
    \n
    \n
    %s" FLAG_DOMAIN_DUMMY_IDX_STR "\">VSAN%s%s" FLAG_HOST_DUMMY_IDX_STR "\">FC_Port%s
    "); if(left != NULL) { sendString("\n"); /* So there's at least something in to cell */ } sendString("\n
    [ Refresh this data ]"); sendString(" "); sendString(" "); if(middle != NULL) sendString(middle); sendString(" "); sendString("" " [ Back to plugins ]" "
    \n
    \n"); } /* ************************************ */ void buildMapLink(HostTraffic *el, char *buf, int buf_len) { if(privateIPAddress(el)) buf[0] = '\0'; else safe_snprintf(__FILE__, __LINE__, buf, buf_len, "
    " "\n", myGlobals.runningPref.mapperURL, el->hostResolvedName, el->hostNumIpAddress); } /* ************************************ */