~ubuntu-branches/ubuntu/natty/ntop/natty

« back to all changes in this revision

Viewing changes to reportUtils.c

  • Committer: Bazaar Package Importer
  • Author(s): Ludovico Cavedon, Jordan Metzmeier, Ludovico Cavedon
  • Date: 2010-12-15 20:06:19 UTC
  • mfrom: (5.1.5 sid)
  • Revision ID: james.westby@ubuntu.com-20101215200619-0ojz3iak95ihibun
Tags: 3:4.0.3+dfsg1-1
[ Jordan Metzmeier ]
* New upstream release (Closes: #522042)
* Move data files to /usr/share/ntop (Closes: #595450).
* Package architecture independent data in a separate ntop-data package.
* Use debhelper 7.
* Update Standards-Version to 3.9.1.
* Depend on python-mako.
* Do not include ntop.txt in binary packages as it is a copy of the man
  page.
* Do not include NEWS, as it is outdated.
* Switch to package source version 3.0 (quilt).
* Add password creation to debconf
* Changed init script to fix localization problems (thanks to Alejandro
  Varas <alej0varas@gmail.com>, LP: #257466)
* Remove manual update-rc.d calls from postrm and postinst. debhelper adds
  this for us.
* Add pre-depends on adduser for postinst script.
* Fix errors in the manpages: fix-manpage-errors.patch.
* Added fixes for matching active interfaces.
* Added a watch file.

[ Ludovico Cavedon ]
* Remove direct changes to upstream tree, and move them into specific patch
  files:
  - fix-manpage-errors.patch: fix typos in ntop.8.
  - dot-path.patch: fix path of /usr/bin/dot executable
* Add patches:
  - reduce-autogen-purged-files.patch: prevent agutogen.sh from reamoving
  too many files during cleanup.
  - Add build-without-ntop-darwin.patch, to fix compilation without
  ntop_darwin.c.
* No longer add faq.html, as it is not distributed in the upstream tarball.
* Use ${source:Version} in control file. Have ntop-data recommend
  ntop.
* Rename dirs to ntop.dirs and keep only empty directories that need
  to be created.
* Remove var/lib from ntop.install file, as it is empty (keeping it in
  ntop.dirs).
* Update po files.
* Breaks and Replaces instead of Conflitcs for ntop-data.
* Use a longer package description.
* Remove useless configure options from debian/rules.
* Move private shared libraries libraries in /usr/lib/ntop.
* Add change-plugin-dir.patch for adjusting plugin directory.
* Remove development files.
* Use system library for MochiKit.js.
* Rewrite DEP5 copyright file.
* Repackage upstream tarball in order to remove non-DFSG-compliant code. Add
  get-orig-source.sh script and get-orig-source target in debian/rules.
* Add explanation to README.Debian why geolocation is no longer working.
* Add avoid-copy-maxmind-db.patch to prevent copying of Geo*.dat
  files.
* Remove old unused patches.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 *  Copyright (C) 1998-2007 Luca Deri <deri@ntop.org>
 
2
 *  Copyright (C) 1998-2010 Luca Deri <deri@ntop.org>
3
3
 *
4
4
 *                          http://www.ntop.org/
5
5
 *
72
72
                        Counter topValue,
73
73
                        /* If this value != 0 then a percentage is printed */
74
74
                        int actualDeviceId) {
75
 
  char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32], hostLinkBuf[LEN_GENERAL_WORK_BUFFER];
 
75
  char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER];
76
76
  int i, sendHeader=0;
77
77
  HostTraffic *el;
78
78
 
493
493
           revertOrder ? "-" : "", column, showLocalityMode, showHostsMode);
494
494
 
495
495
  sendString("<CENTER><TABLE WIDTH=100%% BORDER=0 "TABLE_DEFAULTS"><TR><TD ALIGN=LEFT>");
 
496
 
 
497
  sendString("<p><form action=\"../\">\n<b>Hosts</b>:"
 
498
             "<select onchange=\"window.open(this.options[this.selectedIndex].value,'_top')\">\n");
496
499
  
497
500
  switch(showHostsMode) {
498
501
  case showOnlyLocalHosts:
499
502
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
500
 
              "<b>Hosts:</b> [ <A HREF=\"%s0\">All</A> ]&nbsp;"
501
 
              "[<B> Local Only </B>]&nbsp;"
502
 
              "[ <A HREF=\"%s2\">Remote Only</A> ]&nbsp;",
503
 
              theLink, theLink);
 
503
                  "<option value=\"%s0\" >All</option>\n"
 
504
                  "<option value=\"%s1\" selected>Local Only</option>\n"
 
505
                  "<option value=\"%s2\" >Remote Only</option>\n"
 
506
                  "</select>\n",
 
507
                  theLink, theLink, theLink);
504
508
    break;
505
509
  case showOnlyRemoteHosts:
506
510
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
507
 
             "<b>Hosts:</b> [ <A HREF=\"%s0\">All</A> ]&nbsp;"
508
 
             "[ <A HREF=\"%s1\">Local Only</A> ]&nbsp;"
509
 
             "[<B> Remote Only </B>]&nbsp;",
510
 
             theLink, theLink);
 
511
                  "<option value=\"%s0\" >All</option>\n"
 
512
                  "<option value=\"%s1\" >Local Only</option>\n"
 
513
                  "<option value=\"%s2\" selected>Remote Only</option>\n"
 
514
                  "</select>\n",
 
515
                  theLink, theLink, theLink);
511
516
    break;
512
517
  default:
513
518
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
514
 
             "<b>Hosts:</b> [<B> All </B>]&nbsp;"
515
 
             "[ <A HREF=\"%s1\">Local Only</A> ]&nbsp;"
516
 
             "[ <A HREF=\"%s2\">Remote Only</A> ]&nbsp;",
517
 
             theLink, theLink);
 
519
                  "<option value=\"%s0\" selected>All</option>\n"
 
520
                  "<option value=\"%s1\" >Local Only</option>\n"
 
521
                  "<option value=\"%s2\" >Remote Only</option>\n"
 
522
                  "</select>\n",
 
523
                  theLink, theLink, theLink);
518
524
    break;
519
525
  }
520
526
 
546
552
  sendString("</TD>");
547
553
 
548
554
  if(reportType != TRAFFIC_STATS) {
 
555
    sendString("<TD ALIGN=right><form action=\"../\">\n<b>Data</b>:"
 
556
               "<select onchange=\"window.open(this.options[this.selectedIndex].value,'_top')\">\n");
 
557
 
549
558
    switch(showLocalityMode) {
550
559
    case showSentReceived:
551
 
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TD ALIGN=right>"
552
 
             "<b>Data:</b> [<b> All </b>]&nbsp;"
553
 
             "[ <a href=\"%s?col=%s%d&showH=%d&showL=1\">Sent Only</a> ]&nbsp;"
554
 
             "[ <a href=\"%s?col=%s%d&showH=%d&showL=2\">Received Only</a> ]&nbsp;",
555
 
             url, revertOrder ? "-" : "", column, showHostsMode,
556
 
             url, revertOrder ? "-" : "", column, showHostsMode);
 
560
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
 
561
                    "<option value=\"%s?col=%s%d&showH=%d&showL=0\" selected>All</option>\n"
 
562
                    "<option value=\"%s?col=%s%d&showH=%d&showL=1\">Sent Only</option>\n"
 
563
                    "<option value=\"%s?col=%s%d&showH=%d&showL=2\">Received Only</option>\n",
 
564
                    url, revertOrder ? "-" : "", column, showHostsMode,
 
565
                    url, revertOrder ? "-" : "", column, showHostsMode,
 
566
                    url, revertOrder ? "-" : "", column, showHostsMode);
557
567
      break;
558
568
    case showOnlySent:
559
 
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TD ALIGN=right>"
560
 
             "<b>Data:</b> [ <a href=\"%s?col=%s%d&showH=%d&showL=0\">All</a> ]&nbsp;"
561
 
             "[<b> Sent Only </b>]&nbsp;"
562
 
             "[ <a href=\"%s?col=%s%d&showH=%d&showL=2\">Received Only</a> ]&nbsp;",
563
 
             url, revertOrder ? "-" : "", column, showHostsMode,
564
 
             url, revertOrder ? "-" : "", column, showHostsMode);
 
569
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
 
570
                    "<option value=\"%s?col=%s%d&showH=%d&showL=0\">All</option>\n"
 
571
                    "<option value=\"%s?col=%s%d&showH=%d&showL=1\" selected>Sent Only</option>\n"
 
572
                    "<option value=\"%s?col=%s%d&showH=%d&showL=2\">Received Only</option>\n",
 
573
                    url, revertOrder ? "-" : "", column, showHostsMode,
 
574
                    url, revertOrder ? "-" : "", column, showHostsMode,
 
575
                    url, revertOrder ? "-" : "", column, showHostsMode);
565
576
      break;
566
577
    default:
567
 
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TD ALIGN=right>"
568
 
             "<b>Data:</b> [ <a href=\"%s?col=%s%d&showH=%d&showL=0\">All</a> ]&nbsp;"
569
 
             "[ <a href=\"%s?col=%s%d&showH=%d&showL=1\">Sent Only</a> ]&nbsp;"
570
 
             "[<b> Received Only </b>]&nbsp;",
571
 
             url, revertOrder ? "-" : "", column, showHostsMode,
572
 
             url, revertOrder ? "-" : "", column, showHostsMode);
 
578
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
 
579
                    "<option value=\"%s?col=%s%d&showH=%d&showL=0\">All</option>\n"
 
580
                    "<option value=\"%s?col=%s%d&showH=%d&showL=1\">Sent Only</option>\n"
 
581
                    "<option value=\"%s?col=%s%d&showH=%d&showL=2\" selected>Received Only</option>\n",
 
582
                    url, revertOrder ? "-" : "", column, showHostsMode,
 
583
                    url, revertOrder ? "-" : "", column, showHostsMode,
 
584
                    url, revertOrder ? "-" : "", column, showHostsMode);
573
585
      break;
574
586
    }
575
587
 
582
594
  case SORT_DATA_SENT_PROTOS:
583
595
  case SORT_DATA_PROTOS:
584
596
    sendString("<CENTER>\n");
585
 
    safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"<TABLE BORDER=1 "TABLE_DEFAULTS"><TR "TR_ON" "DARK_BG">"
586
 
                "<TH "TH_BG">%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s</A></TH>\n"
587
 
                "<TH "TH_BG">%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Domain%s</A></TH>"
588
 
                "<TH "TH_BG" COLSPAN=2>%s0\">Data%s</A></TH>\n",
589
 
                theAnchor[0], arrow[0], theAnchor[1], arrow[1],
590
 
                theAnchor[2], arrow[2]);
 
597
    safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, 
 
598
                  ""TABLE_ON"<TABLE BORDER=1 "TABLE_DEFAULTS"><TR "TR_ON" "DARK_BG">"
 
599
                  "<TH "TH_BG">%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s</A></TH>\n"
 
600
                  "<TH "TH_BG">%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s</A></TH>"
 
601
                  "<TH "TH_BG" COLSPAN=2>%s0\">Data%s</A></TH>\n",
 
602
                  theAnchor[0], arrow[0], theAnchor[1], arrow[1],
 
603
                  theAnchor[2], arrow[2]);
591
604
    sendString(buf);
592
 
 
 
605
    
593
606
    for(i=0; i<=15; i++)
594
 
      if(abs(column) == i+1)  { arrow[i] = arrowGif; theAnchor[i] = htmlAnchor; } else { arrow[i] = ""; theAnchor[i] = htmlAnchor1;  }
 
607
      if(abs(column) == i+1) {
 
608
        arrow[i] = arrowGif; theAnchor[i] = htmlAnchor; 
 
609
      } else {
 
610
        arrow[i] = ""; theAnchor[i] = htmlAnchor1;  
 
611
      }
595
612
 
596
613
    safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "<TH "TH_BG">%s1\">TCP%s</A></TH>"
597
 
                "<TH "TH_BG">%s2\">UDP%s</A></TH><TH "TH_BG">%s3\">ICMP%s</A></TH>""<TH "TH_BG">%s4\">ICMPv6%s</A></TH>"
598
 
                "<TH "TH_BG">%s5\">DLC%s</A></TH><TH "TH_BG">%s6\">IPX%s</A>"
599
 
                "</TH><TH "TH_BG">%s7\">Decnet%s</A></TH>"
600
 
                "<TH "TH_BG">%s8\">(R)ARP%s</A></TH><TH "TH_BG">%s9\">AppleTalk%s</A></TH>",
601
 
                theAnchor[0], arrow[0], theAnchor[1], arrow[1],
602
 
                theAnchor[2], arrow[2], theAnchor[3], arrow[3],
603
 
                theAnchor[4], arrow[4],
604
 
                theAnchor[5], arrow[5], theAnchor[6], arrow[6],
605
 
                theAnchor[7], arrow[7], theAnchor[8], arrow[8]);
 
614
                  "<TH "TH_BG">%s2\">UDP%s</A></TH><TH "TH_BG">%s3\">ICMP%s</A></TH>"
 
615
                  "<TH "TH_BG">%s4\">ICMPv6%s</A></TH>"
 
616
                  "<TH "TH_BG">%s5\">DLC%s</A></TH><TH "TH_BG">%s6\">IPX%s</A>"
 
617
                  "</TH><TH "TH_BG">%s7\">IPsec%s</A></TH>"
 
618
                  "<TH "TH_BG">%s8\">(R)ARP%s</A></TH><TH "TH_BG">%s9\">AppleTalk%s</A></TH>",
 
619
                  theAnchor[0], arrow[0], theAnchor[1], arrow[1],
 
620
                  theAnchor[2], arrow[2], theAnchor[3], arrow[3],
 
621
                  theAnchor[4], arrow[4],
 
622
                  theAnchor[5], arrow[5], theAnchor[6], arrow[6],
 
623
                  theAnchor[7], arrow[7], theAnchor[8], arrow[8]);
606
624
    sendString(buf);
607
625
 
608
626
    safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER,
609
 
                "<TH "TH_BG">%s11\">NetBios%s</A></TH>"
610
 
                "<TH "TH_BG">%s13\">OSI%s</A></TH>"
611
 
                "<TH "TH_BG">%s14\">IPv6%s</A></TH>"
612
 
                "<TH "TH_BG">%s15\">STP%s</A></TH>",
613
 
                theAnchor[10], arrow[10],
614
 
                theAnchor[12], arrow[12],
615
 
                theAnchor[13], arrow[13],
616
 
                theAnchor[14], arrow[14]);
 
627
                  "<TH "TH_BG">%s11\">NetBios%s</A></TH>"
 
628
                  "<TH "TH_BG">%s13\">GRE%s</A></TH>"
 
629
                  "<TH "TH_BG">%s14\">IPv6%s</A></TH>"
 
630
                  "<TH "TH_BG">%s15\">STP%s</A></TH>",
 
631
                  theAnchor[10], arrow[10],
 
632
                  theAnchor[12], arrow[12],
 
633
                  theAnchor[13], arrow[13],
 
634
                  theAnchor[14], arrow[14]);
617
635
    sendString(buf);
618
636
 
619
637
    protoList = myGlobals.ipProtosList, idx=0;
647
665
    sendString("<CENTER>\n");
648
666
    safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"<TABLE BORDER=1 "TABLE_DEFAULTS"><TR "TR_ON" "DARK_BG">"
649
667
                "<TH "TH_BG">%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s</A></TH>\n"
650
 
                "<TH "TH_BG">%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Domain%s</A></TH>"
 
668
                "<TH "TH_BG">%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s</A></TH>"
651
669
                "<TH "TH_BG" COLSPAN=2>%s0\">Data%s</A></TH>\n",
652
670
                theAnchor[0], arrow[0], theAnchor[1], arrow[1],
653
671
                theAnchor[2], arrow[2]);
690
708
    sendString("<CENTER>\n");
691
709
    safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"<TABLE BORDER=1 "TABLE_DEFAULTS"><TR "DARK_BG">"
692
710
                "<TH "TH_BG">%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s</A></TH>"
693
 
                "<TH "TH_BG">%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Domain%s</A></TH>\n",
 
711
                "<TH "TH_BG">%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s</A></TH>\n",
694
712
                theAnchor[0], arrow[0], theAnchor[1], arrow[1]);
695
713
    sendString(buf);
696
714
    j = hourId;
710
728
  case SORT_DATA_SENT_THPT:
711
729
  case SORT_DATA_THPT:
712
730
    sendString("<CENTER>\n");
713
 
    safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"<TABLE BORDER=1 "TABLE_DEFAULTS"><TR "TR_ON" "DARK_BG">"
714
 
                "<TH "TH_BG" ROWSPAN=\"2\">%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s</A></TH>"
715
 
                "<TH "TH_BG" ROWSPAN=\"2\">%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Domain%s</A></TH>\n\n",
716
 
                theAnchor[0], arrow[0], theAnchor[1], arrow[1]);
 
731
    safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON
 
732
                  "<TABLE BORDER=1 "TABLE_DEFAULTS"><TR "TR_ON" "DARK_BG">"
 
733
                  "<TH "TH_BG" ROWSPAN=\"2\">%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s</A></TH>"
 
734
                  "<TH "TH_BG" ROWSPAN=\"2\">%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s</A></TH>\n\n",
 
735
                  theAnchor[0], arrow[0], theAnchor[1], arrow[1]);
717
736
    sendString(buf);
718
737
 
719
738
    updateThpt(0);
745
764
    break;
746
765
  case TRAFFIC_STATS:
747
766
    sendString("<CENTER>\n");
748
 
    safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"<TABLE BORDER=1 "TABLE_DEFAULTS"><TR "TR_ON" "DARK_BG">"
749
 
                "<TH "TH_BG">%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s</A></TH>"
750
 
                "<TH "TH_BG">%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Domain%s</A></TH>\n\n",
751
 
                theAnchor[0], arrow[0], theAnchor[1], arrow[1]);
 
767
    safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, 
 
768
                  ""TABLE_ON"<TABLE BORDER=1 "TABLE_DEFAULTS"><TR "TR_ON" "DARK_BG">"
 
769
                  "<TH "TH_BG">%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s</A></TH>"
 
770
                  "<TH "TH_BG">%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s</A></TH>\n\n",
 
771
                  theAnchor[0], arrow[0], theAnchor[1], arrow[1]);
752
772
    sendString(buf);
753
773
    break;
754
774
  }
830
850
    return(rc);
831
851
    break;
832
852
  case 2:
 
853
#ifdef ENABLE_FC
833
854
      if (isFcHost ((*a)) && isFcHost ((*b))) {
834
855
        if((*a)->fcCounters->hostFcAddress.domain > (*b)->fcCounters->hostFcAddress.domain)
835
856
              return(1);
849
870
                      return (0);
850
871
              }
851
872
          }
852
 
      }
853
 
      else {
 
873
      } else
 
874
#endif
 
875
        {
854
876
          rc = addrcmp(&(*a)->hostIpAddress,&(*b)->hostIpAddress);
855
877
          return(rc);
856
878
      }
857
879
    break;
858
880
  case 3:
 
881
#ifdef ENABLE_FC
859
882
      if (isFcHost ((*a)) && isFcHost ((*b))) {
860
883
          n_a = (*a)->fcCounters->vsanId, n_b = (*b)->fcCounters->vsanId;
861
884
          return ((n_a < n_b) ? -1 : (n_a > n_b) ? 1 : 0);
862
 
      }
863
 
      else {
 
885
      } else
 
886
#endif
 
887
        {
864
888
          return(strcasecmp((*a)->ethAddressString, (*b)->ethAddressString));
865
889
      }
866
890
  case 5:
 
891
#ifdef ENABLE_FC
867
892
      if (isFcHost ((*a)) && isFcHost ((*b))) {
868
893
        return(strcasecmp(getVendorInfo(&((*a)->fcCounters->pWWN.str[2]), 0),
869
894
                          getVendorInfo(&((*b)->fcCounters->pWWN.str[2]), 0)));
870
 
      }
871
 
      else {
 
895
      } else
 
896
#endif
 
897
        {
872
898
          return(strcasecmp(getVendorInfo((*a)->ethAddress, 0),
873
899
                            getVendorInfo((*b)->ethAddress, 0)));
874
900
      }
957
983
   return(strcasecmp((*a)->community ? (*a)->community : "",
958
984
                      (*b)->community ? (*b)->community : ""));
959
985
    break;
 
986
  case 12:
 
987
    return(memcmp(&(*a)->flags, &(*b)->flags, sizeof(fd_set)));
 
988
    break;
960
989
 
961
990
  case CONST_VLAN_COLUMN_SORT:
962
991
    n_a = (*a)->vlanId, n_b = (*b)->vlanId;
1068
1097
 
1069
1098
/* ******************************* */
1070
1099
 
 
1100
int cmpFctnLocationName(const void *_a, const void *_b) {
 
1101
  HostTraffic **a = (HostTraffic **)_a;
 
1102
  HostTraffic **b = (HostTraffic **)_b;
 
1103
  char *c_a = "", *c_b = "";
 
1104
 
 
1105
  if((a != NULL) && (*a != NULL)
 
1106
     && (*a)->geo_ip && ((*a)->geo_ip->country_code != NULL))
 
1107
    c_a = (*a)->geo_ip->country_code;
 
1108
 
 
1109
  if((b != NULL) && (*b != NULL) 
 
1110
     && (*b)->geo_ip && ((*b)->geo_ip->country_code != NULL))
 
1111
    c_b = (*b)->geo_ip->country_code;
 
1112
  
 
1113
  return(strcmp(c_a, c_b));
 
1114
}
 
1115
 
 
1116
/* ******************************* */
 
1117
 
1071
1118
int cmpFctn(const void *_a, const void *_b) {
1072
1119
  HostTraffic **a = (HostTraffic **)_a;
1073
1120
  HostTraffic **b = (HostTraffic **)_b;
1084
1131
  } else if((a == NULL) && (b == NULL)) {
1085
1132
    traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (3)");
1086
1133
    return(0);
1087
 
  }
1088
 
  if((*a == NULL) && (*b != NULL)) {
 
1134
  } else if((*a == NULL) && (*b != NULL)) {
1089
1135
    traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (4)");
1090
1136
    return(1);
1091
1137
  } else if((*a != NULL) && (*b == NULL)) {
1152
1198
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->ipxRcvd.value;
1153
1199
      break;
1154
1200
    case 7:
1155
 
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->decnetRcvd.value;
1156
 
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->decnetRcvd.value;
 
1201
      a_ = (*a)->ipsecRcvd.value;
 
1202
      b_ = (*b)->ipsecRcvd.value;
1157
1203
      break;
1158
1204
    case 8:
1159
1205
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->arp_rarpRcvd.value;
1168
1214
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->netbiosRcvd.value;
1169
1215
      break;
1170
1216
    case 13:
1171
 
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->osiRcvd.value;
1172
 
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->osiRcvd.value;
 
1217
      a_ = (*a)->greRcvd.value;
 
1218
      b_ = (*b)->greRcvd.value;
1173
1219
      break;
1174
1220
    case 14:
1175
 
      a_ = (*a)->ipv6Rcvd.value, b_ = (*b)->ipv6Rcvd.value;
 
1221
      a_ = (*a)->ipv6BytesRcvd.value, b_ = (*b)->ipv6BytesRcvd.value;
1176
1222
      break;
1177
1223
    case 15:
1178
1224
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpRcvd.value;
1185
1231
    default:
1186
1232
      if((myGlobals.columnSort >= BASE_PROTOS_IDX)
1187
1233
         && (myGlobals.columnSort < (BASE_PROTOS_IDX+myGlobals.numIpProtosList))) {
1188
 
        a_ = (*a)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->rcvd.value,
1189
 
          b_ = (*b)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->rcvd.value;
 
1234
        int idx = myGlobals.columnSort-BASE_PROTOS_IDX;
 
1235
 
 
1236
        if((*a)->ipProtosList && (*a)->ipProtosList[idx])
 
1237
          a_ = (*a)->ipProtosList[idx]->rcvd.value;
 
1238
        else
 
1239
          a_ = 0;
 
1240
 
 
1241
        if((*b)->ipProtosList && (*b)->ipProtosList[idx])
 
1242
          b_ = (*b)->ipProtosList[idx]->rcvd.value;
 
1243
        else
 
1244
          b_ = 0;
1190
1245
      }
1191
1246
      break;
1192
1247
    }
1210
1265
          b_ = 0;
1211
1266
      }
1212
1267
    } else {
1213
 
      a_ = (*a)->ipBytesRcvd.value, b_ = (*b)->ipBytesRcvd.value;
 
1268
      a_ = (*a)->ipv4BytesRcvd.value, b_ = (*b)->ipv4BytesRcvd.value;
1214
1269
 
1215
1270
      if(myGlobals.numIpProtosToMonitor == (columnProtoId-1)) {
1216
1271
        /* other IP */
1291
1346
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->ipxSent.value;
1292
1347
      break;
1293
1348
    case 7:
1294
 
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->decnetSent.value;
1295
 
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->decnetSent.value;
 
1349
      a_ = (*a)->ipsecSent.value;
 
1350
      b_ = (*b)->ipsecSent.value;
1296
1351
      break;
1297
1352
    case 8:
1298
1353
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->arp_rarpSent.value;
1307
1362
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->netbiosSent.value;
1308
1363
      break;
1309
1364
    case 13:
1310
 
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->osiSent.value;
1311
 
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->osiSent.value;
 
1365
      a_ = (*a)->greSent.value;
 
1366
      b_ = (*b)->greSent.value;
1312
1367
      break;
1313
1368
    case 14:
1314
 
      a_ = (*a)->ipv6Sent.value, b_ = (*b)->ipv6Sent.value;
 
1369
      a_ = (*a)->ipv6BytesSent.value, b_ = (*b)->ipv6BytesSent.value;
1315
1370
      break;
1316
1371
    case 15:
1317
1372
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpSent.value;
1324
1379
    default:
1325
1380
      if((myGlobals.columnSort >= BASE_PROTOS_IDX)
1326
1381
         && (myGlobals.columnSort < (BASE_PROTOS_IDX+myGlobals.numIpProtosList))) {
1327
 
        a_ = (*a)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->sent.value,
1328
 
          b_ = (*b)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->sent.value;
 
1382
        int idx = myGlobals.columnSort-BASE_PROTOS_IDX;
 
1383
 
 
1384
        if((*a)->ipProtosList && (*a)->ipProtosList[idx])
 
1385
          a_ = (*a)->ipProtosList[idx]->sent.value;
 
1386
        else 
 
1387
          a_ = 0;
 
1388
        
 
1389
        if((*b)->ipProtosList && (*b)->ipProtosList[idx])
 
1390
          b_ = (*b)->ipProtosList[idx]->sent.value;
 
1391
        else
 
1392
          b_ = 0;
1329
1393
      }
1330
1394
      break;
1331
1395
    }
1349
1413
          b_ = 0;
1350
1414
      }
1351
1415
    } else {
1352
 
      a_ = (*a)->ipBytesSent.value, b_ = (*b)->ipBytesSent.value;
 
1416
      a_ = (*a)->ipv4BytesSent.value, b_ = (*b)->ipv4BytesSent.value;
1353
1417
 
1354
1418
      if(myGlobals.numIpProtosToMonitor == (columnProtoId-1)) {
1355
1419
        /* other IP */
1432
1496
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->ipxSent.value+(*b)->nonIPTraffic->ipxRcvd.value;
1433
1497
      break;
1434
1498
    case 7:
1435
 
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->decnetSent.value+(*a)->nonIPTraffic->decnetRcvd.value;
1436
 
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->decnetSent.value+(*b)->nonIPTraffic->decnetRcvd.value;
 
1499
      a_ = (*a)->ipsecSent.value+(*a)->ipsecRcvd.value;
 
1500
      b_ = (*b)->ipsecSent.value+(*b)->ipsecRcvd.value;
1437
1501
      break;
1438
1502
    case 8:
1439
1503
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->arp_rarpSent.value+(*a)->nonIPTraffic->arp_rarpRcvd.value;
1448
1512
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->netbiosSent.value+(*b)->nonIPTraffic->netbiosRcvd.value;
1449
1513
      break;
1450
1514
    case 13:
1451
 
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->osiSent.value+(*a)->nonIPTraffic->osiRcvd.value;
1452
 
      b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->osiSent.value+(*b)->nonIPTraffic->osiRcvd.value;
 
1515
      a_ = (*a)->greSent.value + (*a)->greRcvd.value;
 
1516
      b_ = (*b)->greSent.value + (*b)->greRcvd.value;
1453
1517
      break;
1454
1518
    case 14:
1455
 
      a_ = (*a)->ipv6Rcvd.value+(*a)->ipv6Sent.value, b_ = (*b)->ipv6Rcvd.value+(*b)->ipv6Sent.value;
 
1519
      a_ = (*a)->ipv6BytesRcvd.value+(*a)->ipv6BytesSent.value, b_ = (*b)->ipv6BytesRcvd.value+(*b)->ipv6BytesSent.value;
1456
1520
      break;
1457
1521
    case 15:
1458
1522
      a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpSent.value+(*a)->nonIPTraffic->stpRcvd.value;
1465
1529
    default:
1466
1530
      if((myGlobals.columnSort >= BASE_PROTOS_IDX)
1467
1531
         && (myGlobals.columnSort < (BASE_PROTOS_IDX+myGlobals.numIpProtosList))) {
1468
 
        a_ = (*a)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->sent.value
1469
 
          +(*a)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->rcvd.value;
1470
 
        b_ = (*b)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->sent.value
1471
 
          +(*b)->ipProtosList[myGlobals.columnSort-BASE_PROTOS_IDX]->rcvd.value;
 
1532
        int idx = myGlobals.columnSort-BASE_PROTOS_IDX;
 
1533
 
 
1534
        if(((*a)->ipProtosList == NULL) && ((*b)->ipProtosList != NULL)) return(1);
 
1535
        else if(((*a)->ipProtosList != NULL) && ((*b)->ipProtosList == NULL)) return(-1);
 
1536
 
 
1537
        if((*a)->ipProtosList && (*a)->ipProtosList[idx])
 
1538
          a_ = (*a)->ipProtosList[idx]->sent.value +(*a)->ipProtosList[idx]->rcvd.value;
 
1539
        else
 
1540
          a_ = 0;
 
1541
        
 
1542
        if((*b)->ipProtosList && (*b)->ipProtosList[idx])
 
1543
          b_ = (*b)->ipProtosList[idx]->sent.value +(*b)->ipProtosList[idx]->rcvd.value;
 
1544
        else
 
1545
          b_ = 0;
1472
1546
      }
1473
1547
      break;
1474
1548
    }
1475
1549
    break;
1476
1550
  case SORT_DATA_IP:
1477
1551
    columnProtoId = myGlobals.columnSort - 1;
 
1552
    if(((*a)->protoIPTrafficInfos == NULL) && ((*b)->protoIPTrafficInfos != NULL)) return(1);
 
1553
    else if(((*a)->protoIPTrafficInfos != NULL) && ((*b)->protoIPTrafficInfos == NULL)) return(-1);
 
1554
 
1478
1555
    if((columnProtoId != -1) && (columnProtoId <= myGlobals.numIpProtosToMonitor)) {
1479
1556
      if(columnProtoId <= 0) {
1480
1557
        a_ = b_ = 0;
1481
1558
      } else {
1482
 
        if((*a)->protoIPTrafficInfos[columnProtoId-1])
 
1559
        if((*a)->protoIPTrafficInfos && (*a)->protoIPTrafficInfos[columnProtoId-1])
1483
1560
          a_ = (*a)->protoIPTrafficInfos[columnProtoId-1]->rcvdLoc.value+
1484
1561
            (*a)->protoIPTrafficInfos[columnProtoId-1]->rcvdFromRem.value+
1485
1562
            (*a)->protoIPTrafficInfos[columnProtoId-1]->sentLoc.value+
1487
1564
        else
1488
1565
          a_ = 0;
1489
1566
 
1490
 
        if((*b)->protoIPTrafficInfos[columnProtoId-1])
 
1567
        if((*b)->protoIPTrafficInfos && (*b)->protoIPTrafficInfos[columnProtoId-1])
1491
1568
          b_ = (*b)->protoIPTrafficInfos[columnProtoId-1]->rcvdLoc.value+
1492
1569
            (*b)->protoIPTrafficInfos[columnProtoId-1]->rcvdFromRem.value+
1493
1570
            (*b)->protoIPTrafficInfos[columnProtoId-1]->sentLoc.value+
1496
1573
          b_ = 0;
1497
1574
      }
1498
1575
    } else {
1499
 
      a_ = (*a)->ipBytesRcvd.value+(*a)->ipBytesSent.value;
1500
 
      b_ = (*b)->ipBytesRcvd.value+(*b)->ipBytesSent.value;
 
1576
      a_ = (*a)->ipv4BytesRcvd.value+(*a)->ipv4BytesSent.value;
 
1577
      b_ = (*b)->ipv4BytesRcvd.value+(*b)->ipv4BytesSent.value;
1501
1578
 
1502
1579
      if(myGlobals.numIpProtosToMonitor == (columnProtoId-1)) {
1503
1580
        /* other IP */
1727
1804
 
1728
1805
  switch(myGlobals.columnSort) {
1729
1806
  case 2: /* IP Address */
 
1807
#ifdef ENABLE_FC
1730
1808
    if(isFcHost((*a)) && isFcHost((*b))) {
1731
1809
      return(memcmp(((u_int8_t *)&(*a)->fcCounters->hostFcAddress), 
1732
1810
                    ((u_int8_t *)&(*b)->fcCounters->hostFcAddress),
1733
1811
                    LEN_FC_ADDRESS));
1734
1812
    }
1735
1813
    else
 
1814
#endif
1736
1815
      return(addrcmp(&(*a)->hostIpAddress, &(*b)->hostIpAddress));
1737
1816
    break;
1738
1817
 
1739
1818
  case 3: /* Data Sent */
 
1819
#ifdef ENABLE_FC
1740
1820
    if (isFcHost((*a)) && isFcHost((*b))) {
1741
1821
      a_ = (*a)->fcCounters->fcBytesSent.value;
1742
1822
      b_ = (*b)->fcCounters->fcBytesSent.value;
1743
 
    }
1744
 
    else {
 
1823
    } else
 
1824
#endif
 
1825
      {
1745
1826
      switch(myGlobals.sortFilter) {
1746
1827
      case FLAG_REMOTE_TO_LOCAL_ACCOUNTING:
1747
1828
        a_ = (*a)->bytesSentLoc.value;
1761
1842
    break;
1762
1843
 
1763
1844
  case 4: /* Data Rcvd */
 
1845
#ifdef ENABLE_FC
1764
1846
    if(isFcHost((*a)) && isFcHost((*b))) {
1765
1847
      a_ = (*a)->fcCounters->fcBytesRcvd.value;
1766
1848
      b_ = (*b)->fcCounters->fcBytesRcvd.value;
1767
 
    }
1768
 
    else {
 
1849
    } else
 
1850
#endif
 
1851
      {
1769
1852
      switch(myGlobals.sortFilter) {
1770
1853
      case FLAG_REMOTE_TO_LOCAL_ACCOUNTING:
1771
1854
        a_ = (*a)->bytesRcvdLoc.value;
1784
1867
    if(a_ < b_) return(1); else if (a_ > b_) return(-1); else return(0);
1785
1868
    break;
1786
1869
 
 
1870
#ifdef ENABLE_FC
1787
1871
  case 5: /* VSAN */
1788
1872
    if(isFcHost((*a)) && isFcHost((*b))) {
1789
1873
      a_ = (*a)->fcCounters->vsanId, b_ = (*b)->fcCounters->vsanId;
1790
1874
      return((a_ < b_) ? -1 : (a_ > b_) ? 1 : 0);
1791
1875
    }
1792
1876
    break;
1793
 
    
 
1877
#endif
 
1878
 
1794
1879
  default: /* Host Name */
1795
1880
    return(cmpFctnResolvedName(a, b));
1796
1881
  }
2201
2286
     if(totalSent > 0) {
2202
2287
        safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),
2203
2288
                    "<TD "TD_BG" ALIGN=RIGHT COLSPAN=2 BGCOLOR=white>"
2204
 
                    "<IMG SRC=hostFragmentDistrib-%s%s"CHART_FORMAT"?1 ALT=\"Sent Fragment Distribution for %s%s\"></TD>",
 
2289
                    "<IMG SRC=\"hostFragmentDistrib-%s%s"CHART_FORMAT"?1\" ALT=\"Sent Fragment Distribution for %s%s\"></TD>",
2205
2290
                    linkName, vlanStr, 
2206
2291
                    el->hostNumIpAddress[0] == '\0' ?  el->ethAddressString : el->hostNumIpAddress, vlanStr);
2207
2292
        sendString(buf);
2211
2296
 
2212
2297
      if(totalRcvd > 0) {
2213
2298
        safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),
2214
 
                    "<TD "TD_BG" ALIGN=RIGHT COLSPAN=2 BGCOLOR=white>"
2215
 
                    "<IMG SRC=hostFragmentDistrib-%s%s"CHART_FORMAT" ALT=\"Received Fragment Distribution for %s%s\"></TD>",
2216
 
                    linkName, vlanStr,
2217
 
                    el->hostNumIpAddress[0] == '\0' ?  el->ethAddressString : el->hostNumIpAddress, vlanStr);
 
2299
                      "<TD "TD_BG" ALIGN=RIGHT COLSPAN=2 BGCOLOR=white>"
 
2300
                      "<IMG SRC=\"hostFragmentDistrib-%s%s"CHART_FORMAT"\" ALT=\"Received Fragment Distribution for %s%s\"></TD>",
 
2301
                      linkName, vlanStr,
 
2302
                      el->hostNumIpAddress[0] == '\0' ?  el->ethAddressString : el->hostNumIpAddress, vlanStr);
2218
2303
        sendString(buf);
2219
2304
      } else {
2220
2305
        sendString("<TD "TD_BG" ALIGN=RIGHT COLSPAN=2>&nbsp;</TD>");
2221
2306
      }
2222
 
 
 
2307
      
2223
2308
      sendString("</TD></TR>");
2224
2309
 
2225
2310
      /* ***************************************** */
2387
2472
  ProtocolsList *protoList;
2388
2473
 
2389
2474
  totalSent = el->tcpSentLoc.value+el->tcpSentRem.value+el->udpSentLoc.value+el->udpSentRem.value;
2390
 
  totalSent += el->icmpSent.value+el->icmp6Sent.value+el->ipv6Sent.value;
 
2475
  totalSent += el->icmpSent.value+el->icmp6Sent.value+el->ipv6BytesSent.value;
 
2476
  totalSent += el->greSent.value + el->ipsecSent.value;
2391
2477
 
2392
2478
  if(el->nonIPTraffic != NULL)
2393
2479
    totalSent += el->nonIPTraffic->ipxSent.value+el->nonIPTraffic->dlcSent.value+el->nonIPTraffic->arp_rarpSent.value +
2394
 
      el->nonIPTraffic->decnetSent.value+el->nonIPTraffic->appletalkSent.value+el->nonIPTraffic->netbiosSent.value+
2395
 
      el->nonIPTraffic->osiSent.value+el->nonIPTraffic->stpSent.value+el->nonIPTraffic->otherSent.value;
 
2480
      el->nonIPTraffic->appletalkSent.value+el->nonIPTraffic->netbiosSent.value+
 
2481
      el->nonIPTraffic->stpSent.value+el->nonIPTraffic->otherSent.value;
2396
2482
  
2397
2483
  totalRcvd = el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value;
2398
2484
  totalRcvd += el->udpRcvdLoc.value+el->udpRcvdFromRem.value;
2399
 
  totalRcvd += el->icmpRcvd.value+el->icmp6Rcvd.value+el->ipv6Rcvd.value;
 
2485
  totalRcvd += el->icmpRcvd.value+el->icmp6Rcvd.value+el->ipv6BytesRcvd.value;
 
2486
  totalRcvd += el->greRcvd.value + el->ipsecRcvd.value;
2400
2487
 
2401
2488
  if(el->nonIPTraffic != NULL)
2402
2489
    totalRcvd += el->nonIPTraffic->ipxRcvd.value+el->nonIPTraffic->dlcRcvd.value+el->nonIPTraffic->arp_rarpRcvd.value +
2403
 
      el->nonIPTraffic->decnetRcvd.value+el->nonIPTraffic->appletalkRcvd.value +
2404
 
      el->nonIPTraffic->osiRcvd.value+el->nonIPTraffic->netbiosRcvd.value+el->nonIPTraffic->stpRcvd.value+el->nonIPTraffic->otherRcvd.value;
 
2490
      el->nonIPTraffic->appletalkRcvd.value +
 
2491
      el->nonIPTraffic->netbiosRcvd.value+el->nonIPTraffic->stpRcvd.value+el->nonIPTraffic->otherRcvd.value;
2405
2492
 
2406
2493
  protoList = myGlobals.ipProtosList;
2407
2494
  idx = 0;
2453
2540
                        (float)el->icmp6Rcvd.value/1024,
2454
2541
                        100*((float)SD(el->icmp6Rcvd.value, totalRcvd)));
2455
2542
 
2456
 
  printTableDoubleEntry(buf, sizeof(buf), "IPv6", CONST_COLOR_1, (float)el->ipv6Sent.value/1024,
2457
 
                        100*((float)SD(el->ipv6Sent.value, totalSent)),
2458
 
                        (float)el->ipv6Rcvd.value/1024,
2459
 
                        100*((float)SD(el->ipv6Rcvd.value, totalRcvd)));
 
2543
  printTableDoubleEntry(buf, sizeof(buf), "IPv6", CONST_COLOR_1, (float)el->ipv6BytesSent.value/1024,
 
2544
                        100*((float)SD(el->ipv6BytesSent.value, totalSent)),
 
2545
                        (float)el->ipv6BytesRcvd.value/1024,
 
2546
                        100*((float)SD(el->ipv6BytesRcvd.value, totalRcvd)));
2460
2547
 
 
2548
  printTableDoubleEntry(buf, sizeof(buf), "GRE", CONST_COLOR_1, (float)el->greSent.value/1024,
 
2549
                        100*((float)SD(el->greSent.value, totalSent)),
 
2550
                        (float)el->greRcvd.value/1024,
 
2551
                        100*((float)SD(el->greRcvd.value, totalRcvd)));
 
2552
  
 
2553
  printTableDoubleEntry(buf, sizeof(buf), "IPsec", CONST_COLOR_1, 
 
2554
                        (float)el->ipsecSent.value/1024,
 
2555
                        100*((float)SD(el->ipsecSent.value, totalSent)),
 
2556
                        (float)el->ipsecRcvd.value/1024,
 
2557
                        100*((float)SD(el->ipsecRcvd.value, totalRcvd)));
 
2558
  
2461
2559
  if(el->nonIPTraffic != NULL) {
2462
2560
    printTableDoubleEntry(buf, sizeof(buf), "(R)ARP", CONST_COLOR_1, (float)el->nonIPTraffic->arp_rarpSent.value/1024,
2463
2561
                          100*((float)SD(el->nonIPTraffic->arp_rarpSent.value, totalSent)),
2474
2572
                          (float)el->nonIPTraffic->ipxRcvd.value/1024,
2475
2573
                          100*((float)SD(el->nonIPTraffic->ipxRcvd.value, totalRcvd)));
2476
2574
 
2477
 
    printTableDoubleEntry(buf, sizeof(buf), "Decnet", CONST_COLOR_1, (float)el->nonIPTraffic->decnetSent.value/1024,
2478
 
                          100*((float)SD(el->nonIPTraffic->decnetSent.value, totalSent)),
2479
 
                          (float)el->nonIPTraffic->decnetRcvd.value/1024,
2480
 
                          100*((float)SD(el->nonIPTraffic->decnetRcvd.value, totalRcvd)));
2481
 
 
2482
2575
    printTableDoubleEntry(buf, sizeof(buf), "AppleTalk", CONST_COLOR_1, (float)el->nonIPTraffic->appletalkSent.value/1024,
2483
2576
                          100*((float)SD(el->nonIPTraffic->appletalkSent.value, totalSent)),
2484
2577
                          (float)el->nonIPTraffic->appletalkRcvd.value/1024,
2489
2582
                          (float)el->nonIPTraffic->netbiosRcvd.value/1024,
2490
2583
                          100*((float)SD(el->nonIPTraffic->netbiosRcvd.value, totalRcvd)));
2491
2584
 
2492
 
    printTableDoubleEntry(buf, sizeof(buf), "OSI", CONST_COLOR_1, (float)el->nonIPTraffic->osiSent.value/1024,
2493
 
                          100*((float)SD(el->nonIPTraffic->osiSent.value, totalSent)),
2494
 
                          (float)el->nonIPTraffic->osiRcvd.value/1024,
2495
 
                          100*((float)SD(el->nonIPTraffic->osiRcvd.value, totalRcvd)));
2496
 
 
2497
2585
    printTableDoubleEntry(buf, sizeof(buf), "STP", CONST_COLOR_1, (float)el->nonIPTraffic->stpSent.value/1024,
2498
2586
                          100*((float)SD(el->nonIPTraffic->stpSent.value, totalSent)),
2499
2587
                          (float)el->nonIPTraffic->stpRcvd.value/1024,
2522
2610
  {
2523
2611
    totalSent = el->tcpSentLoc.value+el->tcpSentRem.value+
2524
2612
      el->udpSentLoc.value+el->udpSentRem.value+
2525
 
      el->icmpSent.value+el->icmp6Sent.value+el->ipv6Sent.value;
 
2613
      el->icmpSent.value+el->icmp6Sent.value+el->ipv6BytesSent.value+
 
2614
      el->greSent.value+el->ipsecSent.value;
2526
2615
 
2527
2616
    totalRcvd = el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value+
2528
2617
      el->udpRcvdLoc.value+el->udpRcvdFromRem.value+
2529
 
      el->icmpRcvd.value+el->icmp6Rcvd.value+el->ipv6Rcvd.value;
 
2618
      el->icmpRcvd.value+el->icmp6Rcvd.value+el->ipv6BytesRcvd.value+
 
2619
      el->greRcvd.value+el->ipsecRcvd.value;
2530
2620
 
2531
2621
    if(el->nonIPTraffic) {
2532
2622
      totalSent += el->nonIPTraffic->stpSent.value+
2533
 
        el->nonIPTraffic->ipxSent.value+el->nonIPTraffic->osiSent.value+el->nonIPTraffic->dlcSent.value+
2534
 
        el->nonIPTraffic->arp_rarpSent.value+el->nonIPTraffic->decnetSent.value+el->nonIPTraffic->appletalkSent.value+
 
2623
        el->nonIPTraffic->ipxSent.value+el->nonIPTraffic->dlcSent.value+
 
2624
        el->nonIPTraffic->arp_rarpSent.value+el->nonIPTraffic->appletalkSent.value+
2535
2625
        el->nonIPTraffic->netbiosSent.value+el->nonIPTraffic->otherSent.value;
2536
2626
      
2537
2627
      totalRcvd += el->nonIPTraffic->stpRcvd.value+
2538
 
        el->nonIPTraffic->ipxRcvd.value+el->nonIPTraffic->osiRcvd.value+el->nonIPTraffic->dlcRcvd.value+
2539
 
        el->nonIPTraffic->arp_rarpRcvd.value+el->nonIPTraffic->decnetRcvd.value+el->nonIPTraffic->appletalkRcvd.value+
 
2628
        el->nonIPTraffic->ipxRcvd.value+el->nonIPTraffic->dlcRcvd.value+
 
2629
        el->nonIPTraffic->arp_rarpRcvd.value+el->nonIPTraffic->appletalkRcvd.value+
2540
2630
        el->nonIPTraffic->netbiosRcvd.value+el->nonIPTraffic->otherRcvd.value;
2541
2631
    }
2542
2632
 
2572
2662
 
2573
2663
     if(totalSent > 0) {
2574
2664
        safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),
2575
 
                    "<TD WIDTH=250 "TD_BG" ALIGN=RIGHT COLSPAN=2 BGCOLOR=white>"
2576
 
                    "<iframe frameborder=0 SRC=\"hostTrafficDistrib-%s%s"CHART_FORMAT"?1\"  width=400 height=250></iframe></TD>",
 
2665
                      "<TD WIDTH=250 "TD_BG" ALIGN=RIGHT COLSPAN=2 BGCOLOR=white>"
 
2666
                      "<iframe frameborder=0 SRC=\"hostTrafficDistrib-%s%s"CHART_FORMAT"?1\""
 
2667
                      "  width=400 height=250></iframe></TD>",
2577
2668
                      linkName, vlanStr);
2578
2669
        sendString(buf);
2579
2670
      } else {
2582
2673
 
2583
2674
      if(totalRcvd > 0) {
2584
2675
        safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),
2585
 
                    "<TD "TD_BG" ALIGN=RIGHT COLSPAN=2 BGCOLOR=white><iframe frameborder=0 SRC=hostTrafficDistrib-"
2586
 
                    "%s%s"CHART_FORMAT"  width=400 height=250></iframe></TD>",
 
2676
                    "<TD "TD_BG" ALIGN=RIGHT COLSPAN=2 BGCOLOR=white><iframe frameborder=0 SRC=\"hostTrafficDistrib-"
 
2677
                    "%s%s"CHART_FORMAT"\" width=400 height=250></iframe></TD>",
2587
2678
                      linkName, vlanStr);
2588
2679
        sendString(buf);
2589
2680
      } else {
2594
2685
 
2595
2686
      if((el->tcpSentLoc.value+el->tcpSentRem.value+el->udpSentLoc.value+el->udpSentRem.value
2596
2687
          +el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value+el->udpRcvdLoc.value+el->udpRcvdFromRem.value) > 0) {
2597
 
        safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">IP Distribution</TH>",
2598
 
                    getRowColor());
 
2688
        safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">"
 
2689
                      "IP Distribution</TH>",
 
2690
                      getRowColor());
2599
2691
        sendString(buf);
2600
 
 
 
2692
        
2601
2693
        if((el->tcpSentLoc.value+el->tcpSentRem.value+el->udpSentLoc.value+el->udpSentRem.value) > 0) {
2602
2694
          safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),
2603
2695
                      "<TD "TD_BG" ALIGN=RIGHT COLSPAN=2 BGCOLOR=white>"
2604
 
                      "<iframe frameborder=0 SRC=\"hostIPTrafficDistrib-%s%s"CHART_FORMAT"?1\"  width=400 height=250></iframe></TD>",
2605
 
                      linkName, vlanStr);
 
2696
                        "<iframe frameborder=0 SRC=\"hostIPTrafficDistrib-%s%s"CHART_FORMAT"?1\""
 
2697
                        "  width=400 height=250></iframe></TD>",
 
2698
                        linkName, vlanStr);
2606
2699
          sendString(buf);
2607
2700
        } else
2608
2701
          sendString("<TD "TD_BG" COLSPAN=2 WIDTH=250>&nbsp;</TD>");
2939
3032
/* ************************************ */
2940
3033
 
2941
3034
HostTraffic* quickHostLink(HostSerial theSerial, int deviceId, HostTraffic *el) {
2942
 
  int type;
 
3035
#ifdef ENABLE_FC
2943
3036
  FcNameServerCacheEntry *fcnsEntry;
2944
3037
  FcScsiCounters *tmp;
2945
3038
  HostTraffic *srcEl;
2946
 
 
 
3039
#endif
 
3040
  
2947
3041
  if(cmpSerial(&theSerial, &myGlobals.broadcastEntry->hostSerial)) {
2948
3042
    memcpy(el, myGlobals.broadcastEntry, sizeof(HostTraffic));
2949
3043
    return(el);
2952
3046
    return(0);
2953
3047
  }
2954
3048
 
 
3049
#ifdef ENABLE_FC
2955
3050
  tmp = el->fcCounters;
 
3051
#endif
2956
3052
  memset(el, 0, sizeof(HostTraffic));
 
3053
#ifdef ENABLE_FC
2957
3054
  el->fcCounters = tmp;
 
3055
#endif
2958
3056
  copySerial(&el->hostSerial, &theSerial);
2959
3057
 
2960
3058
  if((theSerial.serialType == SERIAL_IPV4) ||
2961
3059
     (theSerial.serialType == SERIAL_IPV6)){
2962
3060
    /* IP */
2963
 
    char sniffedName[MAXDNAME];
2964
3061
    char buf[LEN_GENERAL_WORK_BUFFER];
2965
3062
 
2966
3063
    addrcpy(&el->hostIpAddress,&theSerial.value.ipSerial.ipAddress);
2969
3066
    strncpy(el->hostNumIpAddress,
2970
3067
            _addrtostr(&el->hostIpAddress, buf, sizeof(buf)),
2971
3068
            sizeof(el->hostNumIpAddress));
2972
 
    if(myGlobals.runningPref.numericFlag == 0) {
2973
 
      fetchAddressFromCache(el->hostIpAddress, el->hostResolvedName, &type);
2974
 
 
2975
 
      el->hostResolvedNameType = type;
2976
 
      if((strcmp(el->hostResolvedName, el->hostNumIpAddress) == 0) || (el->hostResolvedName[0] == '\0')) {
2977
 
        if(getSniffedDNSName(el->hostNumIpAddress, sniffedName, sizeof(sniffedName))) {
2978
 
          int i;
2979
 
 
2980
 
          for(i=0; i<strlen(sniffedName); i++) {
2981
 
            if(isupper(sniffedName[i])) 
2982
 
              sniffedName[i] = tolower(sniffedName[i]);
2983
 
          }
2984
 
 
2985
 
          setResolvedName(el, sniffedName, FLAG_HOST_SYM_ADDR_TYPE_IP);
2986
 
        }
2987
 
      }
2988
 
    }
2989
 
  } else if (theSerial.serialType == SERIAL_FC) {
 
3069
 
 
3070
    // FIX -- Update address TODO
 
3071
  }
 
3072
#ifdef ENABLE_FC
 
3073
  else if (theSerial.serialType == SERIAL_FC) {
2990
3074
    memcpy ((u_int8_t *)&el->fcCounters->hostFcAddress,
2991
3075
            (u_int8_t *)&theSerial.value.fcSerial.fcAddress,
2992
3076
            LEN_FC_ADDRESS);
3016
3100
                  LEN_WWN_ADDRESS);
3017
3101
        }
3018
3102
    }
3019
 
  } else {
 
3103
  }
 
3104
#endif
 
3105
  else {
3020
3106
    /* MAC */
3021
3107
    char *ethAddr;
3022
3108
    char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY];
3036
3122
 
3037
3123
void printHostContactedPeers(HostTraffic *el, int actualDeviceId) {
3038
3124
  u_int i, titleSent = 0;
3039
 
  char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[LEN_GENERAL_WORK_BUFFER];
 
3125
  char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER];
3040
3126
  HostTraffic tmpEl;
3041
3127
 
 
3128
#ifdef ENABLE_FC
3042
3129
  if (isFcHost (el)) {
3043
3130
      printFcHostContactedPeers (el, actualDeviceId);
3044
3131
      return;
3045
3132
  }
3046
 
  
 
3133
#endif
 
3134
 
3047
3135
  if((el->pktSent.value != 0) || (el->pktRcvd.value != 0)) {
3048
3136
      int ok =0;
3049
3137
 
3143
3231
  switch (session->sessionState) {
3144
3232
  case FLAG_STATE_SYN:
3145
3233
    return("Sent&nbsp;Syn");
3146
 
  case FLAG_FLAG_STATE_SYN_ACK:
 
3234
  case FLAG_STATE_SYN_ACK:
3147
3235
    return("Rcvd&nbsp;Syn/Ack");
3148
3236
  case FLAG_STATE_ACTIVE:
3149
3237
    return("Active");
3183
3271
*/
3184
3272
 
3185
3273
u_short isHostHealthy(HostTraffic *el) {
3186
 
 
3187
 
  if((hasDuplicatedMac(el)) ||
3188
 
     (hasSentIpDataOnZeroPort(el)))
 
3274
  if(((myGlobals.runningPref.dontTrustMACaddr == 0) && hasDuplicatedMac(el)) 
 
3275
     || hasSentIpDataOnZeroPort(el))
3189
3276
    return(3);
3190
3277
 
3191
3278
  if(hasWrongNetmask(el))
3412
3499
/* ************************************ */
3413
3500
 
3414
3501
void printHostDetailedInfo(HostTraffic *el, int actualDeviceId) {
3415
 
  char buf[3*LEN_GENERAL_WORK_BUFFER], buf1[64], buf2[128], sniffedName[MAXDNAME], osBuf[512];
 
3502
  char buf[3*LEN_GENERAL_WORK_BUFFER], buf1[64], buf2[128], osBuf[512];
3416
3503
  float percentage;
3417
3504
  Counter total;
3418
3505
  int printedHeader, i;
3420
3507
  u_short as=0;
3421
3508
  HostTraffic *theHost, tmpEl;
3422
3509
  char formatBuf[LEN_TIMEFORMAT_BUFFER], formatBuf1[LEN_TIMEFORMAT_BUFFER], 
3423
 
    formatBuf2[32], hostLinkBuf[LEN_GENERAL_WORK_BUFFER];
 
3510
    formatBuf2[32], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER], custom_host_name[128];
3424
3511
 
3425
 
  accessAddrResMutex("printAllSessionsHTML");
 
3512
  safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "hostname.%s",
 
3513
                (el->hostNumIpAddress[0] != '\0') ? el->hostNumIpAddress : el->ethAddressString);
 
3514
  
 
3515
  if(fetchPrefsValue(buf, custom_host_name, sizeof(custom_host_name)) == -1) {
 
3516
    custom_host_name[0] = '\0';
 
3517
  }
3426
3518
 
3427
3519
  buf1[0]=0;
3428
 
  if(getSniffedDNSName(el->hostNumIpAddress, sniffedName, sizeof(sniffedName))) {
3429
 
    if(el->hostResolvedName[0] == '\0' || strcmp(sniffedName, el->hostResolvedName))
3430
 
      safe_snprintf(__FILE__, __LINE__, buf1, sizeof(buf1), " (%s)", sniffedName);
3431
 
  }
3432
3520
 
3433
3521
  if((el->hostResolvedName[0] != '\0') && (strcmp(el->hostResolvedName, el->hostNumIpAddress))) {
3434
3522
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Info about "
3435
3523
                " <A HREF=\"http://%s/\" TARGET=\"_blank\" "
3436
 
                  "TITLE=\"Link to web server on host, if available\" class=external>%s %s</A>\n",
3437
 
                el->hostResolvedName,
3438
 
                el->hostResolvedName, buf1);
 
3524
                  "TITLE=\"Link to web server on host, if available\" class=external>%s</A>\n",
 
3525
                  (custom_host_name[0] != '\0') ? custom_host_name : el->hostResolvedName,
 
3526
                  (custom_host_name[0] != '\0') ? custom_host_name : el->hostResolvedName);
3439
3527
 
3440
3528
    safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", el->hostResolvedName);
3441
3529
  } else if(el->hostNumIpAddress[0] != '\0') {
3442
3530
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Info about "
3443
 
                " <A HREF=\"http://%s%s%s/\" TARGET=\"_blank\" "
3444
 
                  "TITLE=\"Link to web server on host, if available\" class=tooltip>%s %s</A>\n",
3445
 
                el->hostIpAddress.hostFamily == AF_INET6 ? "[" : "",
3446
 
                el->hostNumIpAddress,
3447
 
                el->hostIpAddress.hostFamily == AF_INET6 ? "]" : "",
3448
 
                el->hostNumIpAddress, buf1);
 
3531
                  " <A HREF=\"http://%s%s%s/\" TARGET=\"_blank\" "
 
3532
                  "TITLE=\"Link to web server on host, if available\" class=tooltip>%s</A>\n",
 
3533
                  el->hostIpAddress.hostFamily == AF_INET6 ? "[" : "",
 
3534
                  el->hostNumIpAddress,
 
3535
                  el->hostIpAddress.hostFamily == AF_INET6 ? "]" : "",
 
3536
                  (custom_host_name[0] != '\0') ? custom_host_name : el->hostNumIpAddress);
3449
3537
 
3450
 
    safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", el->hostNumIpAddress);
 
3538
    safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", 
 
3539
                  (custom_host_name[0] != '\0') ? custom_host_name : el->hostNumIpAddress);
3451
3540
  } else {
3452
 
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Info about %s", el->ethAddressString);
 
3541
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Info about %s", 
 
3542
                  (custom_host_name[0] != '\0') ? custom_host_name : el->ethAddressString);
3453
3543
 
3454
 
    safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", el->ethAddressString);
 
3544
    safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", 
 
3545
                  (custom_host_name[0] != '\0') ? custom_host_name : el->ethAddressString);
3455
3546
  }
3456
3547
 
3457
 
  releaseAddrResMutex();
3458
3548
  printHTMLheader(buf2, buf, 0);
3459
3549
  sendString("<CENTER>\n<P>"TABLE_ON"<TABLE BORDER=1 "TABLE_DEFAULTS" WIDTH=80%%>\n");
3460
3550
 
3461
3551
  if(el->hostNumIpAddress[0] != '\0') {
3462
 
    char *countryIcon, *hostType, tmpBuf[64];
3463
 
 
3464
 
    accessAddrResMutex("printAllSessions-2");
3465
 
 
3466
 
    countryIcon = getHostCountryIconURL(el);
 
3552
    char *hostType, tmpBuf[64];
3467
3553
 
3468
3554
    if(broadcastHost(el)) hostType = "broadcast";
3469
3555
    else if(multicastHost(el)) hostType = "multicast";
3485
3571
      multivlaned = "";
3486
3572
 
3487
3573
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH>"
3488
 
                "<TD "TD_BG" ALIGN=RIGHT>%s&nbsp;%s&nbsp;[%s%s%s%s]",
3489
 
                getRowColor(),
3490
 
                "IP&nbsp;Address",
3491
 
                el->hostNumIpAddress,
3492
 
                countryIcon, hostType, dynIp, multihomed, multivlaned);
 
3574
                  "<TD "TD_BG" ALIGN=RIGHT>%s&nbsp;[%s%s%s%s]",
 
3575
                  getRowColor(),
 
3576
                  "IP&nbsp;Address", el->hostNumIpAddress,
 
3577
                  hostType, dynIp, multihomed, multivlaned);
3493
3578
    sendString(buf);
3494
3579
 
3495
3580
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
3629
3714
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH>"
3630
3715
                  "<TD "TD_BG" ALIGN=RIGHT>%s</TD><TD "TD_BG" ALIGN=RIGHT>%s</TD></TR>\n",
3631
3716
                  getRowColor(), "DHCP Unknown Msg",
3632
 
                  formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_UNKNOWN_MSG].value, formatBuf, sizeof(formatBuf)),
3633
 
                  formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_UNKNOWN_MSG].value, formatBuf1, sizeof(formatBuf1)));
 
3717
                  formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_UNKNOWN_MSG].value, 
 
3718
                             formatBuf, sizeof(formatBuf)),
 
3719
                  formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_UNKNOWN_MSG].value,
 
3720
                             formatBuf1, sizeof(formatBuf1)));
3634
3721
      sendString(buf);
3635
3722
 
3636
3723
      sendString("</TABLE>"TABLE_OFF"</TD></TR>\n");
3637
3724
    }
3638
3725
  }
3639
3726
 
 
3727
  safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
 
3728
                "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">Custom Host Name</TH>"
 
3729
                "<TD "TD_BG" ALIGN=RIGHT>"
 
3730
                "<FORM METHOD=GET ACTION=/editPrefs.html>"
 
3731
                "<INPUT TYPE=hidden name=key value=\"hostname.%s\">"
 
3732
                "<input type=text name=val value=\"%s\">"
 
3733
                "<INPUT TYPE=image src=/"CONST_EDIT_IMG" value=\"Submit\" alt=\"Set custom host name\"></TD></TR>\n",
 
3734
                getRowColor(),
 
3735
                (el->hostNumIpAddress[0] != '\0') ? el->hostNumIpAddress : el->ethAddressString,
 
3736
                custom_host_name);
 
3737
  sendString(buf);
 
3738
 
3640
3739
  safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH>"
3641
3740
              "<TD "TD_BG" ALIGN=RIGHT>"
3642
3741
              "%s&nbsp;&nbsp;-&nbsp;&nbsp;%s&nbsp;[Inactive since %s]</TD></TR>\n",
3647
3746
              formatSeconds(myGlobals.actTime-el->lastSeen, formatBuf2, sizeof(formatBuf2)));
3648
3747
  sendString(buf);
3649
3748
 
 
3749
 
3650
3750
  if(el->hostAS != 0) {
3651
 
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3652
 
                "<A class=external HREF=\"http://ws.arin.net/cgi-bin/whois.pl?queryinput=AS%d\">%d</A></TD></TR>\n",
3653
 
                getRowColor(), "Autonomous System", el->hostAS, el->hostAS);
 
3751
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
 
3752
                  "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
 
3753
                  "<A class=external HREF=\"http://ws.arin.net/cgi-bin/whois.pl?queryinput=AS%d\">%d</A>"
 
3754
                  "&nbsp;[%s]</TD></TR>\n",
 
3755
                  getRowColor(), "Autonomous System", 
 
3756
                  el->hostAS, el->hostAS, (el->hostASDescr != NULL) ? el->hostASDescr : "No AS info");
 
3757
    sendString(buf);
 
3758
  }
 
3759
 
 
3760
  if((el->known_subnet_id != UNKNOWN_SUBNET_ID) 
 
3761
     && (el->known_subnet_id < myGlobals.numKnownSubnets)) {
 
3762
    char subnet_buf[48];
 
3763
 
 
3764
    host2networkName(el, subnet_buf, sizeof(subnet_buf));
 
3765
 
 
3766
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
 
3767
                  "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
 
3768
                  "<A HREF=\""CONST_DOMAIN_STATS_HTML"?dom=%d&netmode=1\">%s</A></TD></TR>\n", getRowColor(),
 
3769
                  "Subnet", el->known_subnet_id, subnet_buf);
3654
3770
    sendString(buf);
3655
3771
  }
3656
3772
 
3657
3773
  if(el->dnsDomainValue && (el->dnsDomainValue[0] != '\0')) {
3658
 
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3659
 
                "%s</TD></TR>\n", getRowColor(),
3660
 
                "Domain", el->dnsDomainValue);
 
3774
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
 
3775
                  "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
 
3776
                  "%s</TD></TR>\n", getRowColor(),
 
3777
                  "Domain", el->dnsDomainValue);
3661
3778
    sendString(buf);
3662
3779
  }
3663
3780
 
3664
3781
  if((el->ethAddressString[0] != '\0')
3665
3782
     && strcmp(el->ethAddressString, "00:00:00:00:00:00")
3666
3783
     && strcmp(el->ethAddressString, "00:01:02:03:04:05") /* dummy address */) {
3667
 
    char *vendorName;
3668
3784
 
3669
3785
    if(isMultihomed(el)) {
3670
3786
      char *symMacAddr, symLink[32];
3682
3798
      sendString(buf);
3683
3799
 
3684
3800
    } else {
 
3801
      char * vendorName = getVendorInfo(el->ethAddress, 1);
3685
3802
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3686
 
                  "%s%s</TD></TR>\n",
3687
 
                  getRowColor(), "MAC&nbsp;Address <IMG ALT=\"Network Interface Card (NIC)\" SRC=/card.gif BORDER=0 "TABLE_DEFAULTS">",
3688
 
                  el->ethAddressString,
3689
 
                  myGlobals.separator /* it avoids empty cells not to be rendered */);
3690
 
      sendString(buf);
3691
 
    }
3692
 
 
3693
 
    vendorName = getVendorInfo(el->ethAddress, 1);
3694
 
    if(vendorName[0] != '\0') {
3695
 
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT NOWRAP>%s%s</TD></TR>\n",
3696
 
                  getRowColor(), "Nw&nbsp;Board&nbsp;Vendor",
3697
 
                  vendorName,
3698
 
                  myGlobals.separator /* it avoids empty cells not to be rendered */);
 
3803
                    "%s %s%s%s%s</TD></TR>\n",
 
3804
                    getRowColor(), "MAC&nbsp;Address <IMG ALT=\"Network Interface Card (NIC)\" SRC=/card.gif BORDER=0 "TABLE_DEFAULTS">",
 
3805
                    el->ethAddressString,
 
3806
                    myGlobals.separator /* it avoids empty cells not to be rendered */,
 
3807
                    (vendorName[0] != '\0') ? "[" : "",
 
3808
                    vendorName,
 
3809
                    (vendorName[0] != '\0') ? "]" : "");
3699
3810
      sendString(buf);
3700
3811
    }
3701
3812
  }
3710
3821
    /* Different MAC addresses */
3711
3822
    char *symMacAddr, symLink[32], shortBuf[64];
3712
3823
    char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY];
 
3824
    char *vendorName;
3713
3825
 
3714
3826
    symMacAddr = etheraddr_string(el->lastEthAddress, etherbuf);
3715
3827
    strcpy(symLink, symMacAddr);
3719
3831
      safe_snprintf(__FILE__, __LINE__, shortBuf, sizeof(shortBuf), "<A HREF=%s.html>%s</A>", symLink, symMacAddr);
3720
3832
    } else {
3721
3833
      strcpy(shortBuf, symMacAddr);
3722
 
    }
 
3834
    }    
 
3835
 
 
3836
    vendorName = getVendorInfo(el->lastEthAddress, 1);
3723
3837
 
3724
3838
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3725
 
                "%s"
3726
 
                "%s</TD></TR>\n",
3727
 
                getRowColor(),
3728
 
                "Last MAC Address/Router <IMG ALT=\"Network Interface Card (NIC)/Router\" SRC=/card.gif BORDER=0 "TABLE_DEFAULTS">",
3729
 
                shortBuf,
3730
 
                myGlobals.separator /* it avoids empty cells not to be rendered */);
 
3839
                  "%s %s%s%s%s"
 
3840
                  "</TD></TR>\n",
 
3841
                  getRowColor(),
 
3842
                  "Last MAC Address/Router <IMG ALT=\"Network Interface Card (NIC)/Router\" SRC=/card.gif BORDER=0 "TABLE_DEFAULTS">",
 
3843
                  shortBuf,
 
3844
                  myGlobals.separator /* it avoids empty cells not to be rendered */,
 
3845
                  (vendorName[0] != '\0') ? "[" : "",
 
3846
                  vendorName,
 
3847
                  (vendorName[0] != '\0') ? "]" : "");
3731
3848
    sendString(buf);
3732
3849
  }
3733
3850
 
3771
3888
      if(el->nonIPTraffic->nbAccountName) {
3772
3889
        if(el->nonIPTraffic->nbDomainName != NULL) {
3773
3890
          safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3774
 
                      "%s@%s&nbsp;[domain %s] (%s) %s</TD></TR>\n",
3775
 
                      getRowColor(), "NetBios&nbsp;Name",
3776
 
                      el->nonIPTraffic->nbAccountName, el->nonIPTraffic->nbHostName, el->nonIPTraffic->nbDomainName,
3777
 
                      getNbNodeType(el->nonIPTraffic->nbNodeType),
3778
 
                      el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : "");
 
3891
                        "%s@%s&nbsp;[domain %s] (%s) %s</TD></TR>\n",
 
3892
                        getRowColor(), "NetBios&nbsp;Name",
 
3893
                        el->nonIPTraffic->nbAccountName, el->nonIPTraffic->nbHostName, el->nonIPTraffic->nbDomainName,
 
3894
                        getNbNodeType(el->nonIPTraffic->nbNodeType),
 
3895
                        el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : "");
3779
3896
        } else {
3780
3897
          safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3781
3898
                      "%s@%s (%s) %s</TD></TR>\n",
3863
3980
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3864
3981
                    "%s</TD></TR>\n", getRowColor(),
3865
3982
                    "Host&nbsp;Location", 
3866
 
                    "Local (inside specified/local subnet)");
 
3983
                    "Local (inside specified/local subnet or known network list)");
3867
3984
    } else {
3868
 
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3869
 
                  "%s</TD></TR>\n", getRowColor(),
3870
 
                  "Host&nbsp;Location",
3871
 
                  "Remote (outside specified/local subnet)");
 
3985
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
 
3986
                    "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
 
3987
                    "%s</TD></TR>\n", getRowColor(),
 
3988
                    "Host&nbsp;Location",
 
3989
                    "Remote (outside specified/local subnet)");
3872
3990
    }
3873
3991
    sendString(buf);
3874
3992
  }
3875
3993
 
 
3994
 
 
3995
  if(el->geo_ip) {
 
3996
    char *countryIcon, buf3[512] = { '\0' };
 
3997
    
 
3998
    if(myGlobals.runningPref.mapperURL) buildMapLink(el, buf3, sizeof(buf3));
 
3999
    countryIcon = getHostCountryIconURL(el);
 
4000
 
 
4001
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
 
4002
                  "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
 
4003
                  "%s, %s %s&nbsp;%s&nbsp;</TD></TR>\n", getRowColor(), "Physical Location", 
 
4004
                  el->geo_ip->city ? el->geo_ip->city : "Unknown city", el->geo_ip->country_name, countryIcon, buf3);
 
4005
    sendString(buf);
 
4006
  }
 
4007
 
3876
4008
  if(el->community) {
3877
4009
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
3878
4010
                  "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3879
 
                  "%s</TD></TR>\n", getRowColor(), "Community", el->community);
 
4011
                  "<A HREF=/"CONST_COMMUNITIES_STATS_HTML"?community=%s>%s</A>"
 
4012
                  "</TD></TR>\n", getRowColor(), "Community", 
 
4013
                  el->community, el->community);
3880
4014
    sendString(buf);
3881
4015
  }
3882
4016
 
3913
4047
              );
3914
4048
  sendString(buf);
3915
4049
 
3916
 
  safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
 
4050
  safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),
 
4051
                "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3917
4052
              "%s Pkts</TD></TR>\n",
3918
4053
              getRowColor(), "Broadcast&nbsp;Pkts&nbsp;Sent",
3919
4054
              formatPkts(el->pktBroadcastSent.value, formatBuf, sizeof(formatBuf)));
3920
4055
  sendString(buf);
3921
4056
 
3922
4057
  if(el->routedTraffic != NULL) {
3923
 
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR  "TR_ON"%s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
 
4058
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),
 
4059
                  "<TR  "TR_ON"%s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>"
3924
4060
                "%s/%s Pkts</TD></TR>\n",
3925
4061
                getRowColor(), "Routed Traffic",
3926
4062
                formatBytes(el->routedTraffic->routedBytes.value, 1, formatBuf, sizeof(formatBuf)),
3929
4065
  }
3930
4066
 
3931
4067
  if((el->pktMulticastSent.value > 0) || (el->pktMulticastRcvd.value > 0)) {
3932
 
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>",
 
4068
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), 
 
4069
                  "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">%s</TH><TD "TD_BG" ALIGN=RIGHT>",
3933
4070
                getRowColor(), "Multicast&nbsp;Traffic");
3934
4071
    sendString(buf);
3935
4072
 
3961
4098
                              "Local", "Rem", -1, percentage, 0, 0);
3962
4099
 
3963
4100
    if(el->bytesSent.value > 0) {
3964
 
      percentage = (((float)el->ipBytesSent.value*100)/el->bytesSent.value);
 
4101
      percentage = (((float)el->ipv4BytesSent.value*100)/el->bytesSent.value);
3965
4102
      printTableEntryPercentage(buf, sizeof(buf), "IP&nbsp;vs.&nbsp;Non-IP&nbsp;Sent",
3966
4103
                                "IP", "Non-IP", -1, percentage, 0, 0);
3967
4104
    }
3987
4124
                                "Local", "Rem", -1, percentage, 0, 0);
3988
4125
 
3989
4126
  if(el->bytesRcvd.value > 0) {
3990
 
    percentage = (((float)el->ipBytesRcvd.value*100)/el->bytesRcvd.value);
 
4127
    percentage = (((float)el->ipv4BytesRcvd.value*100)/el->bytesRcvd.value);
3991
4128
    printTableEntryPercentage(buf, sizeof(buf), "IP&nbsp;vs.&nbsp;Non-IP&nbsp;Rcvd",
3992
4129
                              "IP", "Non-IP", -1, percentage, 0, 0);
3993
4130
  }
4066
4203
 
4067
4204
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">"
4068
4205
                  "%s</TH><TD "TD_BG" ALIGN=RIGHT>"
4069
 
                  "[ <A class=external HREF=\"http://www.radb.net/cgi-bin/radb/whois.cgi?obj=%s\">Whois</A> ]\n",
 
4206
                  "[ <A class=external HREF=\"http://ws.arin.net/cgi-bin/whois.pl?queryinput=%s\">Whois</A> ]\n",
4070
4207
                  getRowColor(), "Further Host Information", el->hostNumIpAddress);
4071
4208
    sendString(buf);
4072
 
    
4073
 
    if(myGlobals.runningPref.mapperURL) {      
4074
 
      sendString(" [");
4075
 
      buildMapLink(el, buf, sizeof(buf));
4076
 
      sendString(buf);
4077
 
      sendString(" ]");
4078
 
    }
4079
 
    
 
4209
        
4080
4210
    sendString("</TD></TR>\n");
4081
4211
  }
4082
4212
 
4083
4213
  /* RRD */
4084
4214
  if(el->hostNumIpAddress[0] != '\0') {
4085
 
    struct stat statbuf;
4086
 
    char *key;
4087
 
 
4088
 
    if((!myGlobals.runningPref.dontTrustMACaddr) && subnetPseudoLocalHost(el) 
4089
 
       && (el->ethAddressString[0] != '\0') /* Really safe in case a host that was supposed to be local isn't really so*/)
4090
 
      key = el->ethAddressString;
4091
 
    else
4092
 
      key = el->hostNumIpAddress;
4093
 
 
4094
 
    /* Do NOT add a '/' at the end of the path because Win32 will complain about it */
4095
 
    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/interfaces/%s/hosts/%s",
4096
 
             myGlobals.rrdPath != NULL ? myGlobals.rrdPath : ".",
4097
 
             myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName,
4098
 
             dotToSlash(key));
4099
 
 
4100
 
    revertSlashIfWIN32(buf, 0);
4101
 
 
4102
 
    if(stat(buf, &statbuf) == 0) {
 
4215
    char rrdBuf[LEN_GENERAL_WORK_BUFFER];
 
4216
 
 
4217
    hostRRdGraphLink(el, NETWORK_VIEW, 0, rrdBuf, sizeof(rrdBuf));
 
4218
 
 
4219
    if(rrdBuf[0] != '\0') {
4103
4220
      safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf),
4104
4221
                  "<TR "TR_ON" %s><TH "TH_BG" ALIGN=LEFT "DARK_BG">Historical Data</TH>\n"
4105
 
                  "<TD "TD_BG" ALIGN=\"right\">"
4106
 
                  "[ <a href=\"/" CONST_PLUGINS_HEADER 
4107
 
                  "rrdPlugin?action=list&amp;key=interfaces/%s/hosts/%s&amp;title=host%%20%s\">"
4108
 
                  "<img valign=\"top\" border=\"0\" src=\"/graph.gif\""
4109
 
                    " class=tooltip alt=\"view rrd graphs of historical data for this host\"></a> ]"
4110
 
                  "</TD></TR>\n",
4111
 
                  getRowColor(),
4112
 
                  myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName,
4113
 
                  dotToSlash(key),
4114
 
                  el->hostResolvedName[0] != '\0' ? el->hostResolvedName : el->hostNumIpAddress);
 
4222
                    "<TD "TD_BG" ALIGN=\"right\">%s</TD></TR>\n",
 
4223
                    getRowColor(), rrdBuf);
4115
4224
      sendString(buf);
4116
4225
    }
4117
4226
  }
4382
4491
  int idx = i*myGlobals.device[myGlobals.actualReportDeviceId].numHosts + j;
4383
4492
  char formatBuf[32], formatBuf1[32], formatBuf2[32], formatBuf3[32];
4384
4493
 
4385
 
  accessAddrResMutex("buildHTMLBrowserWindowsLabel");
4386
 
 
4387
4494
  if((myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx] == NULL)
4388
4495
     || ((myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesSent.value == 0)
4389
4496
         && (myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->bytesRcvd.value == 0)))
4414
4521
                formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].ipTrafficMatrix[idx]->pktsRcvd.value, formatBuf3, sizeof(formatBuf3)));
4415
4522
  }
4416
4523
 
4417
 
  releaseAddrResMutex();
4418
4524
  return(buf);
4419
4525
}
4420
4526
 
4476
4582
 
4477
4583
  safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER,
4478
4584
           "<center>\n"
4479
 
                "<p><img class=tooltip alt=\"Warning\" src=\"/warning.gif\"></p>\n"
 
4585
                "<p><img class=reflect alt=\"Warning\" src=\"/warning.gif\"></p>\n"
4480
4586
           "<p><font color=\"#FF0000\" size=\"+1\">%s</font></p>\n"
4481
4587
           "</center>\n", text);
4482
4588
  sendString(buf);
4527
4633
/* ******************************** */
4528
4634
 
4529
4635
void printHostsCharacterization(void) {
4530
 
  u_int a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, unhealthy=0, totHosts=0;
 
4636
  u_int a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, l=0, unhealthy=0, totHosts=0;
4531
4637
  HostTraffic *el;
4532
 
  char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[LEN_GENERAL_WORK_BUFFER], headerSent = 0;
 
4638
  char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER], headerSent = 0;
4533
4639
 
4534
4640
  printHTMLheader("Local Hosts Characterization", NULL, 0);
4535
4641
 
4582
4688
        if(isHostHealthy(el) != 0) { sendString("<TD ALIGN=CENTER>X</TD>"); unhealthy++; } else sendString("<TD>&nbsp;</TD>");
4583
4689
        if(isBridgeHost(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); a++; } else sendString("<TD>&nbsp;</TD>");
4584
4690
        if(gatewayHost(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); b++; } else sendString("<TD>&nbsp;</TD>");
4585
 
        if(isVoIPHost(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); b++; } else sendString("<TD>&nbsp;</TD>");
4586
 
        if(isPrinter(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); c++; } else sendString("<TD>&nbsp;</TD>");
4587
 
        if(nameServerHost(el) || isNtpServer(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); d++; } else sendString("<TD>&nbsp;</TD>");
4588
 
        if(isSMTPhost(el) || isIMAPhost(el) || isPOPhost(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); e++; } else sendString("<TD>&nbsp;</TD>");
4589
 
        if(isDirectoryHost(el) || isFTPhost(el) || isHTTPhost(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); f++; } else sendString("<TD>&nbsp;</TD>");
4590
 
        if(isDHCPServer(el) || isWINShost(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); g++; } else sendString("<TD>&nbsp;</TD>");
4591
 
        if(isDHCPClient(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); h++; } else sendString("<TD>&nbsp;</TD>");
4592
 
        if(isP2P(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); i++; } else sendString("<TD>&nbsp;</TD>");
 
4691
        if(isVoIPHost(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); c++; } else sendString("<TD>&nbsp;</TD>");
 
4692
        if(isPrinter(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); d++; } else sendString("<TD>&nbsp;</TD>");
 
4693
        if(nameServerHost(el) || isNtpServer(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); e++; } else sendString("<TD>&nbsp;</TD>");
 
4694
        if(isSMTPhost(el) || isIMAPhost(el) || isPOPhost(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); f++; } else sendString("<TD>&nbsp;</TD>");
 
4695
        if(isDirectoryHost(el) || isFTPhost(el) || isHTTPhost(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); g++; } else sendString("<TD>&nbsp;</TD>");
 
4696
        if(isDHCPServer(el) || isWINShost(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); h++; } else sendString("<TD>&nbsp;</TD>");
 
4697
        if(isDHCPClient(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); i++; } else sendString("<TD>&nbsp;</TD>");
 
4698
        if(isP2P(el)) { sendString("<TD ALIGN=CENTER>X</TD>"); l++; } else sendString("<TD>&nbsp;</TD>");
4593
4699
 
4594
4700
        sendString("</TR>\n");
4595
4701
      }
4653
4759
      sendString(buf);
4654
4760
    } else
4655
4761
      sendString("<TD>&nbsp;</TD>");
4656
 
    sendString("</TABLE></CENTER>\n");
 
4762
    if(l > 0) {
 
4763
          safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "<TD ALIGN=CENTER>%d</TD>", i);
 
4764
          sendString(buf);
 
4765
    } else
 
4766
      sendString("<TD>&nbsp;</TD>");
 
4767
        sendString("</TABLE></CENTER>\n");
4657
4768
  }
4658
4769
}
4659
4770
 
4787
4898
      countNotIP=0,
4788
4899
      countUnknownFP=0,
4789
4900
      countCantResolve=0;
4790
 
  char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[LEN_GENERAL_WORK_BUFFER];
 
4901
  char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER];
4791
4902
  char unknownFPs[LEN_GENERAL_WORK_BUFFER];
4792
4903
  int unknownFPsEtc=0;
4793
4904
 
4907
5018
      if(theOSs[i].name == NULL)
4908
5019
        break;
4909
5020
      else {
4910
 
        char *strtokState, *os, *word;
 
5021
        char *strtokState = NULL, *os, *word;
4911
5022
        int sentBR=0;
4912
5023
 
4913
5024
        sendString("<TH>");
5002
5113
/* ******************************************************** */
5003
5114
 
5004
5115
void printMutexStatus(int textPrintFlag, PthreadMutex *mutexId, char *mutexName) {
 
5116
#ifdef MUTEX_DEBUG
5005
5117
  char buf[LEN_GENERAL_WORK_BUFFER], bufAttempt[64], bufLock[64], bufUnlock[64];
5006
5118
  struct tm t;
5007
5119
 
5110
5222
                  mutexId->numLocks, mutexId->numReleases);
5111
5223
    sendString(buf);
5112
5224
  }
 
5225
#endif
5113
5226
}
5114
5227
 
 
5228
/* ************************************************ */
 
5229
 
 
5230
#ifdef ENABLE_FC
5115
5231
void printFcHeader(int reportType, int revertOrder, u_int column, u_int hourId, char *url) {
5116
5232
  char buf[LEN_GENERAL_WORK_BUFFER];
5117
5233
  char *sign, *arrowGif, *arrow[48], *theAnchor[48];
5266
5382
 
5267
5383
  sendString("</TR>\n");
5268
5384
}
 
5385
#endif
5269
5386
 
5270
5387
/* ************************************ */
5271
5388
 
5287
5404
  sendString("&nbsp;");
5288
5405
 
5289
5406
  sendString("</td>\n<td align=\"right\">"
5290
 
             "&nbsp;[ Back to <a href=\"../" CONST_SHOW_PLUGINS_HTML "\">plugins</a> ]"
 
5407
             "&nbsp;[ Back to <a href=\"/" CONST_SHOW_PLUGINS_HTML "\">plugins</a> ]"
5291
5408
             "</td></tr></table>\n<br>\n");
5292
5409
}
5293
5410
 
5296
5413
void buildMapLink(HostTraffic *el, char *buf, int buf_len) {
5297
5414
  if(privateIPAddress(el))
5298
5415
    buf[0] = '\0';
5299
 
  else
 
5416
  else {
 
5417
#if 0
5300
5418
    safe_snprintf(__FILE__, __LINE__, buf, buf_len,
5301
 
                " <A class=external href=\"#\" title=\"Physical Host Location\"onclick=\"window.open(\'%s?host=%s@%s\', "
 
5419
                " <A class=external href=\"#\" title=\"Physical Host Location\" "
 
5420
                  "onclick=\"window.open(\'%s?host=%s@%s\', "
5302
5421
                  "\'Host Map\', \'height=210, width=320,toolbar=nodirectories=no,status=no,"
5303
5422
                  "menubar=no,scrollbars=no,resizable=no\'); return false;\">"
5304
5423
                  "<IMG SRC=/marker.png border=0></A>\n",
5305
5424
                  myGlobals.runningPref.mapperURL,
5306
5425
                  el->hostResolvedName, el->hostNumIpAddress);
 
5426
#else
 
5427
    safe_snprintf(__FILE__, __LINE__, buf, buf_len,
 
5428
                  " <A class=external href=\"#\" title=\"Physical Host Location\" "
 
5429
                  "onclick=\"window.open(\'%s?host=%s&ip=%s\', "
 
5430
                  "\'Host Map\', \'height=530, width=750,toolbar=nodirectories=no,status=no,"
 
5431
                  "menubar=no,scrollbars=no,resizable=no\'); return false;\">"
 
5432
                  "<IMG SRC=/marker.png border=0></A>\n",
 
5433
                  myGlobals.runningPref.mapperURL,
 
5434
                  el->hostResolvedName, el->hostNumIpAddress);
 
5435
#endif
 
5436
  }
5307
5437
}
5308
5438
 
5309
5439
/* ************************************ */