2
* Copyright (C) 1998-2004 Luca Deri <deri@ntop.org>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
* Do not use local defs for pnggraph
23
* (included by ntop.h)
31
#include "globals-report.h"
33
static unsigned long clr[] = { 0xf08080L, 0x4682b4L, 0x66cdaaL,
34
0xf4a460L, 0xb0c4deL, 0x90ee90L,
35
0xffd700L, 0x87ceebL, 0xdda0ddL,
36
0x7fffd4L, 0xffb6c1L, 0x708090L,
37
0x6495edL, 0xdeb887L, 0x6b8e23L,
38
0xf08080L, 0x4682b4L, 0x66cdaaL,
39
0xf4a460L, 0xb0c4deL, 0x90ee90L,
40
0xffd700L, 0x87ceebL, 0xdda0ddL };
42
/* ******************************************************************* */
48
#define M_PI 3.14159265358979323846
52
/* ******************************************************************* */
54
/**********************************************************/
55
/* Guess at the version of gd from various breadcrumbs in */
56
/* the library (only things checkable at run-time, since */
57
/* just because it was compiled against a version doesn't */
58
/* mean that's what it's running on...) */
59
/**********************************************************/
61
char* gdVersionGuess(void) {
63
#if GD2_VERS == 2 /* GD 2.x detected */
69
#if (defined(HAVE_DIRENT_H) && defined(HAVE_DLFCN_H)) || defined(DARWIN)
72
gdPtr = (void*)dlopen(CONST_LIBGD_SO, RTLD_NOW); /* Load the library */
75
traceEvent(CONST_TRACE_WARNING, "GDVERCHK: Unable to load gd, message is '%s'", dlerror());
76
#if GD2_VERS == 2 /* GD 2.x detected */
83
#define test_gd_function(a, b) if((void*)dlsym(gdPtr, a) != NULL) { dlclose(gdPtr); return(b); }
85
test_gd_function("gdImageCreateFromPngPtr", "2.0.21+");
86
test_gd_function("gdFontCacheSetup", "2.0.16-2.0.20");
87
test_gd_function("gdImageSetClip", "2.0.12-2.0.15");
88
test_gd_function("gdImageCopyRotated", "2.0.8-2.0.11");
89
test_gd_function("gdImageStringFTEx", "2.0.5-2.0.7");
90
test_gd_function("gdFreeFontCache", "2.0.4");
91
test_gd_function("gdImageCreateTrueColor", "2.0.0-2.0.3");
92
test_gd_function("gdImageCreateFromJpeg", "1.8.4");
94
#undef test_gd_function
98
return("1.8.3 or below");
107
/* ************************************************** */
109
static void drawLegend(gdImagePtr im,
113
char *labels[], /* slice labels */
115
int colors[], int labelColor) {
117
int edge_x, edge_y, i;
118
#ifdef SHOW_PERCENTAGE
123
edge_x = (width*.75)+10;
124
edge_y = (height/10);
126
#ifdef SHOW_PERCENTAGE
127
for(i=0, total=0; i<num_points; i++)
131
for(i=0; i<num_points; i++) {
132
gdImageFilledRectangle(im, edge_x, edge_y, edge_x+CONST_LEGEND_BOX_SIZE,
133
edge_y+CONST_LEGEND_BOX_SIZE, colors[i]);
134
gdImageRectangle(im, edge_x-1, edge_y-1, edge_x+CONST_LEGEND_BOX_SIZE+1,
135
edge_y+CONST_LEGEND_BOX_SIZE+1, labelColor);
136
#ifdef SHOW_PERCENTAGE
137
if(snprintf(str, sizeof(str), "%s(%.1f%%)", labels[i], (data[i]*100)/total) < 0)
139
gdImageString(im, gdFontSmall, edge_x+CONST_LEGEND_BOX_SIZE+5, edge_y-5, str, labelColor);
141
gdImageString(im, gdFontSmall, edge_x+CONST_LEGEND_BOX_SIZE+5, edge_y-3, labels[i], labelColor);
143
edge_y += gdFontSmall->h*1.5;
147
/* ************************ */
149
void drawPie(short width,
151
FILE* filepointer, /* open file pointer, can be stdout */
153
char *labels[], /* slice labels */
156
int black, white, colors[64], numColors, i;
157
int center_x, center_y, radius, begDeg, endDeg, x, y;
162
im = gdImageCreate(width, height);
164
white = gdImageColorAllocate(im, 255, 255, 255); /* bg color */
165
black = gdImageColorAllocate(im, 0, 0, 0);
166
numColors = sizeof(clr)/sizeof(unsigned long);
167
for(i=0; i<numColors; i++) {
168
colors[i] = gdImageColorAllocate(im, clr[i]>>16, clr[i]>>8, clr[i]&0x0000FF);
171
/* ******************************* */
173
for(i=0, total=0; i<num_points; i++)
176
center_x = width/3, center_y = height/2;
180
gdImageArc(im, center_x, center_y, 2*radius, 2*radius, 0, 360, black);
181
radiant = begDeg-90; radiant /= 360; radiant *= 2*M_PI;
182
x = center_x+(radius)*cos(radiant);
183
y = center_y+(radius)*sin(radiant);
184
gdImageLine(im, center_x, center_y, x,y, black);
187
if(num_points == 0) {
192
for(i=0; i<num_points; i++) {
193
displ = (360*data[i])/total;
195
if(i < (num_points-1))
196
endDeg = begDeg+displ;
200
#if GD2_VERS == 2 /* GD 2.x detected */
201
gdImageFilledArc(im, center_x, center_y, 2*radius, 2*radius,
202
begDeg+270, endDeg+270, colors[i], gdArc);
204
radiant = begDeg-90; radiant /= 360; radiant *= 2*M_PI;
205
x = center_x+(radius)*cos(radiant);
206
y = center_y+(radius)*sin(radiant);
207
gdImageArc(im, center_x, center_y, 2*radius, 2*radius,
208
begDeg+270, endDeg+270, black);
209
gdImageLine(im, center_x, center_y, x,y, black);
211
begDeg = (begDeg+endDeg)/2;
212
radiant = begDeg-90; radiant /= 360; radiant *= 2*M_PI;
213
x = center_x+(radius/2)*cos(radiant);
214
y = center_y+(radius/2)*sin(radiant);
215
gdImageFillToBorder(im, x, y, black, colors[i]);
221
#if GD2_VERS == 2 /* GD 2.x detected */
222
gdImageArc(im, center_x, center_y, 2*radius, 2*radius, 0, 360, black);
225
drawLegend(im, width, height, num_points, labels, data, colors, black);
226
gdImagePng(im, filepointer);
230
/* ************************ */
232
/* Fix for large numbers (over 4Gb) courtesy of
233
Kouprie Robbert <r.kouprie@dto.tudelft.nl>
235
void drawBar(short width,
237
FILE* filepointer, /* open file pointer, can be stdout */
239
char *labels[], /* slice labels */
242
int black, white, gray, colors[64], numColors, i, ngrid, base, padding;
243
int center_x, center_y, vmargin, hmargin, xsize, ysize, xpos, ypos, dypix;
244
float maxval, total, yscale, txtsz, txtht;
245
float dydat, xmax, ymax, xmin, ymin;
247
im = gdImageCreate(width, height);
249
white = gdImageColorAllocate(im, 255, 255, 255); /* bg color */
250
black = gdImageColorAllocate(im, 0, 0, 0);
251
gray = gdImageColorAllocate(im, 200, 200, 200);
252
numColors = sizeof(clr)/sizeof(unsigned long);
253
for(i=0; i<numColors; i++) {
254
colors[i] = gdImageColorAllocate(im, clr[i]>>16, clr[i]>>8, clr[i]&0x0000FF);
257
/* ******************************* */
261
for(i=0, total=0; i<num_points; i++) {
263
if(data[i] > maxval) maxval = data[i];
266
center_x = width/3, center_y = height/2;
268
/* ************************* */
270
vmargin = 20; // top (bottom) vertical margin for title (x-labels)
271
hmargin = 60; // left horizontal margin for y-labels
273
base = floor((((width*.75)) - hmargin) / num_points); // distance between columns
275
ysize = height - 2 * vmargin; // y-size of plot
276
xsize = num_points * base; // x-size of plot
278
// y labels and grid lines
279
ngrid = 4; // number of grid lines
281
dydat = maxval / ngrid; // data units between grid lines
282
dypix = ysize / (ngrid + 1); // pixels between grid lines
284
// make y-axis text label from height of grid line (in data units)
285
for (i = 0; i <= (ngrid + 1); i++) {
287
char *theStr = formatBytes(i * dydat, 0, buf, sizeof(buf)); // make label text
289
txtsz = gdFontSmall->w*strlen(theStr); // pixel-width of label
290
txtht = gdFontSmall->h; // pixel-height of label
292
// height of grid line in pixels
293
ypos = vmargin + ysize - (i*dypix);
294
xpos = hmargin - 10 - txtsz;
295
if(xpos < 1) xpos = 1;
297
gdImageString(im, gdFontSmall, xpos, ypos - (int)(txtht/2), theStr, black);
299
if (!(i == 0) && !(i > ngrid)) {
300
gdImageLine(im, hmargin, ypos, hmargin + xsize, ypos, gray);
304
// columns and x labels
305
padding = 3; // half of spacing between columns
306
yscale = (float)ysize/((ngrid+1) * dydat); // pixels per data unit
308
for (i = 0; i<num_points; i++) {
310
ymax = vmargin + ysize;
312
if(ymax > (int)(data[i]*yscale)) {
313
ymin = ymax - (int)(data[i]*yscale);
314
if(ymin < vmargin) ymin = vmargin;
319
xmax = hmargin + (i+1)*base - padding;
320
xmin = hmargin + i*base + padding;
322
if((xmax-xmin) > 100) {
326
gdImageFilledRectangle(im, xmin, ymin, xmax, ymax, colors[i]);
327
gdImageRectangle(im, xmin, ymin, xmax, ymax, black);
330
txtsz = gdFontSmall->w * strlen(labels[i]);
332
xpos = xmin + (int)((base - txtsz) / 2);
333
if(xmin > xpos) xpos = xmin; else xmin = xpos;
334
ypos = ymax + 3; // distance from x axis
338
gdImageRectangle(im, hmargin, vmargin, hmargin + xsize, vmargin + ysize, black);
340
/* ************************* */
342
drawLegend(im, width, height, num_points, labels, data, colors, black);
343
gdImagePng(im, filepointer);
347
/* ************************** */
349
void drawArea(short width,
351
FILE* filepointer, /* open file pointer, can be stdout */
353
char *labels[], /* slice labels */
357
u_short formatYlabels) {
359
int black, white, colors[64], numColors, i;
361
int center_x, center_y, base;
362
float total, yscale, txtsz, txtht;
363
float vmargin, hmargin, xsize, ysize, ngrid, dydat, dypix, ydat, xpos, ypos;
364
float padding, ymax, ymin, xmax, xmin, gray;
367
im = gdImageCreate(width, height);
369
white = gdImageColorAllocate(im, 255, 255, 255); /* bg color */
370
black = gdImageColorAllocate(im, 0, 0, 0);
371
gray = gdImageColorAllocate(im, 200, 200, 200);
372
numColors = sizeof(clr)/sizeof(unsigned long);
373
for(i=0; i<numColors; i++) {
374
colors[i] = gdImageColorAllocate(im, clr[i]>>16, clr[i]>>8, clr[i]&0x0000FF);
377
/* ******************************* */
378
for(i=0, total=0; i<num_points; i++) {
380
if(data[i] > maxval) maxval = data[i];
383
center_x = width/2, center_y = height/2;
385
/* ************************* */
387
vmargin = 40; // top (bottom) vertical margin for title (x-labels)
388
hmargin = 70; // left horizontal margin for y-labels
390
base = (int)((width - hmargin) / (1+num_points)); // distance between columns
392
xsize = num_points * base; // x-size of plot
393
ysize = height - (1.5 * vmargin); // y-size of plot
395
/* printf("x-size=%.1f/y-size=%.1f\n", xsize, ysize); */
396
// y labels and grid lines
397
ngrid = 4; // number of grid lines
399
dydat = maxval / ngrid; // data units between grid lines
400
dypix = ysize / (ngrid + 1); // pixels between grid lines
402
for (i = 0; i <= (ngrid + 1); i++) {
403
// height of grid line in units of data
405
if(snprintf(str, sizeof(str), "%.1f", ydat) < 0)
408
// height of grid line in pixels
409
ypos = vmargin/2 + ysize - (int)(i*dypix);
410
txtht = gdFontSmall->h;
414
txtsz = gdFontSmall->w*strlen(str);
415
xpos = hmargin - txtsz; if(xpos < 1) xpos = 1;
416
gdImageString(im, gdFontSmall, xpos-5, ypos - (int)(txtht/2), str, black);
419
char *theStr = formatThroughput(i * dydat, 0, buf, sizeof(buf));
421
/* traceEvent(CONST_TRACE_INFO, "%u/%s", i * dydat, theStr); */
423
txtsz = gdFontSmall->w*strlen(theStr);
424
xpos = hmargin - txtsz; if(xpos < 1) xpos = 1;
425
gdImageString(im, gdFontSmall, xpos-5, ypos - (int)(txtht/2), theStr, black);
429
if (!(i == 0) && !(i > ngrid)) {
430
gdImageLine(im, hmargin, ypos, hmargin + xsize, ypos, gray);
434
// columns and x labels
435
padding = 0; // half of spacing between columns
436
yscale = (float)ysize / ((ngrid+1) * dydat); // pixels per data unit
441
memset(points, 0, sizeof(points));
443
for (i = 0; i<num_points; i++) {
445
ymax = vmargin/2 + ysize;
446
ymin = ymax - (int)(data[i]*yscale);
447
xmax = hmargin + (i+1)*base - padding;
448
xmin = hmargin + i*base + padding;
451
points[0].x = xmin; points[0].y = ymin;
452
points[1].x = xmin; points[1].y = ymax;
453
points[2].x = xmax; points[2].y = ymax;
454
points[3].x = xmax; points[3].y = ymin;
456
points[0].x = points[3].x; points[0].y = points[3].y;
457
points[1].x = points[2].x; points[1].y = points[2].y;
458
points[2].x = xmax; points[2].y = ymax;
459
points[3].x = xmax; points[3].y = ymin;
462
points[4].x = points[0].x; points[4].y = points[0].y;
464
gdImageFilledPolygon(im, points, 5, colors[0]);
465
gdImageFilledRectangle(im, points[0].x-1, points[0].y-1, points[0].x+1, points[0].y+1, black);
466
gdImageFilledRectangle(im, points[3].x-1, points[3].y-1, points[3].x+1, points[3].y+1, black);
467
gdImageLine(im, points[0].x, points[0].y, points[3].x, points[3].y, black);
470
if(snprintf(str, sizeof(str), "%5s",labels[i]) < 0)
472
gdImageStringUp(im, gdFontSmall, points[0].x-gdFontSmall->w, height-2, str, black);
476
txtsz = gdFontSmall->w * strlen(labels[i]);
478
xpos = xmin + (int)((base - txtsz) / 2);
479
if(xmin > xpos) xpos = xmin; else xmin = xpos;
480
ypos = ymax + 3; // distance from x axis
485
gdImageRectangle(im, hmargin, vmargin/2, hmargin + xsize, vmargin/2 + ysize, black);
488
gdImageString(im, gdFontSmall, (width/2)-(strlen(xtitle)*gdFontSmall->w)/2,
489
height-gdFontSmall->h-2, xtitle, black);
492
gdImageString(im, gdFontSmall, 5, 2, ytitle, black);
494
gdImagePng(im, filepointer);
498
/* ************************ */
500
void sendGraphFile(char* fileName, int doNotUnlink) {
504
int bufSize=sizeof(tmpStr)-1, totLen = 0;
506
if((fd = fopen(fileName, "rb")) != NULL) {
509
len = fread(tmpStr, sizeof(char), bufSize, fd);
511
sendStringLen(tmpStr, len);
518
traceEvent(CONST_TRACE_WARNING, "Unable to open file %s - graphic not sent", fileName);
520
if (doNotUnlink == 0) {
525
/* ************************ */
527
void hostTrafficDistrib(HostTraffic *theHost, short dataSent) {
528
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
530
char *lbl[] = { "", "", "", "", "", "", "", "", "",
531
"", "", "", "", "", "", "", "", "", "" };
534
TrafficCounter totTraffic;
535
int useFdOpen = 0, idx = 0;
536
ProtocolsList *protoList = myGlobals.ipProtosList;
539
totTraffic.value = theHost->tcpSentLoc.value+theHost->tcpSentRem.value+
540
theHost->udpSentLoc.value+theHost->udpSentRem.value+
541
theHost->icmpSent.value+theHost->stpSent.value
542
+theHost->ipxSent.value+theHost->osiSent.value+theHost->dlcSent.value+
543
theHost->arp_rarpSent.value+theHost->decnetSent.value+theHost->appletalkSent.value+
544
theHost->netbiosSent.value+theHost->ipv6Sent.value+theHost->otherSent.value;
547
while(protoList != NULL) {
548
totTraffic.value += theHost->ipProtosList[idx].sent.value;
549
idx++, protoList = protoList->next;
552
totTraffic.value = theHost->tcpRcvdLoc.value+theHost->tcpRcvdFromRem.value+
553
theHost->udpRcvdLoc.value+theHost->udpRcvdFromRem.value+
554
theHost->icmpRcvd.value+theHost->stpRcvd.value
555
+theHost->ipxRcvd.value+theHost->osiRcvd.value+theHost->dlcRcvd.value+
556
theHost->arp_rarpRcvd.value+theHost->decnetRcvd.value+theHost->appletalkRcvd.value+
557
theHost->netbiosRcvd.value+theHost->ipv6Rcvd.value+theHost->otherRcvd.value;
560
while(protoList != NULL) {
561
totTraffic.value += theHost->ipProtosList[idx].rcvd.value;
562
idx++, protoList = protoList->next;
566
if(totTraffic.value > 0) {
568
if(theHost->tcpSentLoc.value+theHost->tcpSentRem.value > 0) {
569
p[num] = (float)((100*(theHost->tcpSentLoc.value+
570
theHost->tcpSentRem.value))/totTraffic.value);
571
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "TCP";
574
if(theHost->udpSentLoc.value+theHost->udpSentRem.value > 0) {
575
p[num] = (float)((100*(theHost->udpSentLoc.value+
576
theHost->udpSentRem.value))/totTraffic.value);
577
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "UDP";
580
if(theHost->icmpSent.value > 0) {
581
p[num] = (float)((100*theHost->icmpSent.value)/totTraffic.value);
582
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "ICMP";
585
if(theHost->stpSent.value > 0) {
586
p[num] = (float)((100*theHost->stpSent.value)/totTraffic.value);
587
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "STP";
590
if(theHost->ipxSent.value > 0) {
591
p[num] = (float)((100*theHost->ipxSent.value)/totTraffic.value);
592
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "IPX";
595
if(theHost->dlcSent.value > 0) {
596
p[num] = (float)((100*theHost->dlcSent.value)/totTraffic.value);
597
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "DLC";
600
if(theHost->osiSent.value > 0) {
601
p[num] = (float)((100*theHost->osiSent.value)/totTraffic.value);
602
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "OSI";
605
if(theHost->arp_rarpSent.value > 0) {
606
p[num] = (float)((100*theHost->arp_rarpSent.value)/totTraffic.value);
607
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "(R)ARP";
610
if(theHost->decnetSent.value > 0) {
611
p[num] = (float)((100*theHost->decnetSent.value)/totTraffic.value);
612
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "DECNET";
615
if(theHost->appletalkSent.value > 0) {
616
p[num] = (float)((100*theHost->appletalkSent.value)/totTraffic.value);
617
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "AppleTalk";
620
if(theHost->netbiosSent.value > 0) {
621
p[num] = (float)((100*theHost->netbiosSent.value)/totTraffic.value);
622
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "NetBios";
625
if(theHost->ipv6Sent.value > 0) {
626
p[num] = (float)((100*theHost->ipv6Sent.value)/totTraffic.value);
627
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "IPv6";
630
if(theHost->otherSent.value > 0) {
631
p[num] = (float)((100*theHost->otherSent.value)/totTraffic.value);
632
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "Other";
635
if(theHost->tcpRcvdLoc.value+theHost->tcpRcvdFromRem.value > 0) {
636
p[num] = (float)((100*(theHost->tcpRcvdLoc.value+
637
theHost->tcpRcvdFromRem.value))/totTraffic.value);
638
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "TCP";
641
if(theHost->udpRcvdLoc.value+theHost->udpRcvdFromRem.value > 0) {
642
p[num] = (float)((100*(theHost->udpRcvdLoc.value+
643
theHost->udpRcvdFromRem.value))/totTraffic.value);
644
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "UDP";
647
if(theHost->icmpRcvd.value > 0) {
648
p[num] = (float)((100*theHost->icmpRcvd.value)/totTraffic.value);
649
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "ICMP";
652
if(theHost->stpRcvd.value > 0) {
653
p[num] = (float)((100*theHost->stpRcvd.value)/totTraffic.value);
654
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "STP";
657
if(theHost->ipxRcvd.value > 0) {
658
p[num] = (float)((100*theHost->ipxRcvd.value)/totTraffic.value);
659
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "IPX";
662
if(theHost->dlcRcvd.value > 0) {
663
p[num] = (float)((100*theHost->dlcRcvd.value)/totTraffic.value);
664
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "DLC";
667
if(theHost->osiRcvd.value > 0) {
668
p[num] = (float)((100*theHost->osiRcvd.value)/totTraffic.value);
669
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "OSI";
672
if(theHost->arp_rarpRcvd.value > 0) {
673
p[num] = (float)((100*theHost->arp_rarpRcvd.value)/totTraffic.value);
674
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "(R)ARP";
677
if(theHost->decnetRcvd.value > 0) {
678
p[num] = (float)((100*theHost->decnetRcvd.value)/totTraffic.value);
679
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "DECNET";
682
if(theHost->appletalkRcvd.value > 0) {
683
p[num] = (float)((100*theHost->appletalkRcvd.value)/totTraffic.value);
684
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "AppleTalk";
687
if(theHost->netbiosRcvd.value > 0) {
688
p[num] = (float)((100*theHost->netbiosRcvd.value)/totTraffic.value);
689
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "NetBios";
692
if(theHost->ipv6Rcvd.value > 0) {
693
p[num] = (float)((100*theHost->ipv6Rcvd.value)/totTraffic.value);
694
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "IPv6";
697
if(theHost->otherRcvd.value > 0) {
698
p[num] = (float)((100*theHost->otherRcvd.value)/totTraffic.value);
699
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "Other";
703
idx = 0; protoList = myGlobals.ipProtosList;
704
while(protoList != NULL) {
706
if(theHost->ipProtosList[idx].sent.value > 0) {
707
p[num] = (float)((100*theHost->ipProtosList[idx].sent.value)/totTraffic.value);
708
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = protoList->protocolName;
711
if(theHost->ipProtosList[idx].rcvd.value > 0) {
712
p[num] = (float)((100*theHost->ipProtosList[idx].rcvd.value)/totTraffic.value);
713
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = protoList->protocolName;
717
idx++, protoList = protoList->next;
721
traceEvent(CONST_TRACE_WARNING, "Graph failure (1)");
722
return; /* TODO: this has to be handled better */
728
if(myGlobals.newSock < 0)
734
fd = fdopen(abs(myGlobals.newSock), "ab");
736
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
738
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
741
if(num == 1) p[0] = 100; /* just to be safe */
744
fd, /* open file pointer */
745
num, /* number of slices */
746
lbl, /* slice labels */
751
sendGraphFile(fileName, 0);
755
/* ************************ */
757
void hostFragmentDistrib(HostTraffic *theHost, short dataSent) {
758
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
760
char *lbl[] = { "", "", "", "", "", "", "", "", "",
761
"", "", "", "", "", "", "", "", "", "" };
764
TrafficCounter totTraffic;
768
totTraffic.value = theHost->tcpFragmentsSent.value+theHost->udpFragmentsSent.value+theHost->icmpFragmentsSent.value;
770
totTraffic.value = theHost->tcpFragmentsRcvd.value+theHost->udpFragmentsRcvd.value+theHost->icmpFragmentsRcvd.value;
772
if(totTraffic.value > 0) {
774
if(theHost->tcpFragmentsSent.value > 0) {
775
p[num] = (float)((100*(theHost->tcpFragmentsSent.value))/totTraffic.value);
776
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "TCP";
779
if(theHost->udpFragmentsSent.value > 0) {
780
p[num] = (float)((100*(theHost->udpFragmentsSent.value))/totTraffic.value);
781
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "UDP";
784
if(theHost->icmpFragmentsSent.value > 0) {
785
p[num] = (float)((100*(theHost->icmpFragmentsSent.value))/totTraffic.value);
786
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "ICMP";
789
if(theHost->tcpFragmentsRcvd.value > 0) {
790
p[num] = (float)((100*(theHost->tcpFragmentsRcvd.value))/totTraffic.value);
791
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "TCP";
794
if(theHost->udpFragmentsRcvd.value > 0) {
795
p[num] = (float)((100*(theHost->udpFragmentsRcvd.value))/totTraffic.value);
796
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "UDP";
799
if(theHost->icmpFragmentsRcvd.value > 0) {
800
p[num] = (float)((100*(theHost->icmpFragmentsRcvd.value))/totTraffic.value);
801
if(p[num] > MIN_SLICE_PERCENTAGE) lbl[num++] = "ICMP";
806
traceEvent(CONST_TRACE_WARNING, "Graph failure (2)");
807
return; /* TODO: this has to be handled better */
813
if(myGlobals.newSock < 0)
819
fd = fdopen(abs(myGlobals.newSock), "ab");
821
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
823
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
826
if(num == 1) p[0] = 100; /* just to be safe */
828
fd, /* open file pointer */
829
num, /* number of slices */
830
lbl, /* slice labels */
836
sendGraphFile(fileName, 0);
840
/* ************************ */
842
void hostTimeTrafficDistribution(HostTraffic *theHost, short dataSent) {
843
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
845
char *lbl[] = { "", "", "", "", "", "", "", "", "",
846
"", "", "", "", "", "", "", "", "",
847
"", "", "", "", "", "", "", "", "", "" };
852
for(i=0; i<24; i++) {
856
traf.value = theHost->trafficDistribution->last24HoursBytesSent[i].value;
858
traf.value = theHost->trafficDistribution->last24HoursBytesRcvd[i].value;
864
lbl[num++] = "12PM-1AM";
867
lbl[num++] = "1-2AM";
870
lbl[num++] = "2-3AM";
873
lbl[num++] = "3-4AM";
876
lbl[num++] = "4-5AM";
879
lbl[num++] = "5-6AM";
882
lbl[num++] = "6-7AM";
885
lbl[num++] = "7-8AM";
888
lbl[num++] = "8-9AM";
891
lbl[num++] = "9-10AM";
894
lbl[num++] = "10-11AM";
897
lbl[num++] = "11-12AM";
900
lbl[num++] = "12AM-1PM";
903
lbl[num++] = "1-2PM";
906
lbl[num++] = "2-3PM";
909
lbl[num++] = "3-4PM";
912
lbl[num++] = "4-5PM";
915
lbl[num++] = "5-6PM";
918
lbl[num++] = "6-7PM";
921
lbl[num++] = "7-8PM";
924
lbl[num++] = "8-9PM";
927
lbl[num++] = "9-10PM";
930
lbl[num++] = "10-11PM";
933
lbl[num++] = "11-12PM";
940
traceEvent(CONST_TRACE_WARNING, "Graph failure (2)");
941
return; /* TODO: this has to be handled better */
947
if(myGlobals.newSock < 0)
953
fd = fdopen(abs(myGlobals.newSock), "ab");
955
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
957
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
960
if(num == 1) p[0] = 100; /* just to be safe */
962
fd, /* open file pointer */
963
num, /* number of slices */
964
lbl, /* slice labels */
970
sendGraphFile(fileName, 0);
973
/* ************************ */
975
void hostTotalFragmentDistrib(HostTraffic *theHost, short dataSent) {
976
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
978
char *lbl[] = { "", "", "", "", "", "", "", "", "",
979
"", "", "", "", "", "", "", "", "", "" };
982
TrafficCounter totFragmentedTraffic, totTraffic;
986
totTraffic.value = theHost->ipBytesSent.value;
987
totFragmentedTraffic.value = theHost->tcpFragmentsSent.value+theHost->udpFragmentsSent.value
988
+theHost->icmpFragmentsSent.value;
990
totTraffic.value = theHost->ipBytesRcvd.value;
991
totFragmentedTraffic.value = theHost->tcpFragmentsRcvd.value+theHost->udpFragmentsRcvd.value
992
+theHost->icmpFragmentsRcvd.value;
995
if(totTraffic.value > 0) {
996
p[num] = (float)((100*totFragmentedTraffic.value)/totTraffic.value);
999
p[num] = 100-((float)(100*totFragmentedTraffic.value)/totTraffic.value);
1000
if(p[num] > 0) { lbl[num++] = "Non Frag"; }
1003
traceEvent(CONST_TRACE_WARNING, "Graph failure (3)");
1004
return; /* TODO: this has to be handled better */
1010
if(myGlobals.newSock < 0)
1016
fd = fdopen(abs(myGlobals.newSock), "ab");
1018
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1020
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1023
if(num == 1) p[0] = 100; /* just to be safe */
1025
fd, /* open file pointer */
1026
num, /* number of slices */
1027
lbl, /* slice labels */
1028
p); /* data array */
1033
sendGraphFile(fileName, 0);
1037
/* ************************ */
1039
void hostIPTrafficDistrib(HostTraffic *theHost, short dataSent) {
1040
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1041
float p[MAX_NUM_PROTOS];
1042
char *lbl[] = { "", "", "", "", "", "", "", "", "",
1043
"", "", "", "", "", "", "", "", "", "" };
1046
TrafficCounter traffic, totalIPTraffic, diffTraffic;
1049
if(theHost->protoIPTrafficInfos == NULL) {
1050
traceEvent(CONST_TRACE_WARNING, "Graph failure (5)");
1054
totalIPTraffic.value = 0;
1055
diffTraffic.value = 0;
1058
totalIPTraffic.value = theHost->ipBytesSent.value;
1060
totalIPTraffic.value = theHost->ipBytesRcvd.value;
1062
if(totalIPTraffic.value > 0) {
1063
for(i=0; i<myGlobals.numIpProtosToMonitor; i++) {
1065
traffic.value = theHost->protoIPTrafficInfos[i].sentLoc.value+theHost->protoIPTrafficInfos[i].sentRem.value;
1067
traffic.value = theHost->protoIPTrafficInfos[i].rcvdLoc.value+theHost->protoIPTrafficInfos[i].rcvdFromRem.value;
1069
if(traffic.value > 0) {
1070
p[num] = (float)((100*traffic.value)/totalIPTraffic.value);
1071
diffTraffic.value += traffic.value;
1072
lbl[num++] = myGlobals.protoIPTrafficInfos[i];
1075
if(num >= MAX_NUM_PROTOS) break; /* Too much stuff */
1081
lbl[num++] = "Other";
1083
if(diffTraffic.value < totalIPTraffic.value) {
1084
diffTraffic.value = totalIPTraffic.value - diffTraffic.value;
1085
p[num] = (float)((100*diffTraffic.value)/totalIPTraffic.value);
1086
lbl[num++] = "Other";
1093
if(myGlobals.newSock < 0)
1099
fd = fdopen(abs(myGlobals.newSock), "ab");
1101
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1103
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1106
if(num == 1) p[0] = 100;
1108
if(num == 1) p[0] = 100; /* just to be safe */
1110
fd, /* open file pointer */
1111
num, /* number of slices */
1112
lbl, /* slice labels */
1113
p); /* data array */
1118
sendGraphFile(fileName, 0);
1121
/* ********************************** */
1123
void pktSizeDistribPie(void) {
1124
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1126
char *lbl[] = { "", "", "", "", "", "", "" };
1131
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo64.value > 0) {
1132
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo64.value)/
1133
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1134
lbl[num++] = "< 64";
1137
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo128.value > 0) {
1138
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo128.value)/
1139
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1140
lbl[num++] = "< 128";
1143
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo256.value > 0) {
1144
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo256.value)/
1145
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1146
lbl[num++] = "< 256";
1149
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo512.value > 0) {
1150
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo512.value)/
1151
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1152
lbl[num++] = "< 512";
1155
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo1024.value > 0) {
1156
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo1024.value)/
1157
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1158
lbl[num++] = "< 1024";
1161
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo1518.value > 0) {
1162
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo1518.value)/
1163
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1164
lbl[num++] = "< 1518";
1167
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.above1518.value > 0) {
1168
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.above1518.value)/
1169
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1170
lbl[num++] = "> 1518";
1177
if(myGlobals.newSock < 0)
1183
fd = fdopen(abs(myGlobals.newSock), "ab");
1185
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1187
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1190
if(num == 1) p[0] = 100; /* just to be safe */
1192
fd, /* open file pointer */
1193
num, /* number of slices */
1194
lbl, /* slice labels */
1195
p); /* data array */
1200
sendGraphFile(fileName, 0);
1203
/* ********************************** */
1205
void pktTTLDistribPie(void) {
1206
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1208
char *lbl[] = { "", "", "", "", "", "", "" };
1213
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo32.value > 0) {
1214
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo32.value)/
1215
(float)myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value;
1216
lbl[num++] = "< 32";
1219
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo64.value > 0) {
1220
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo64.value)/
1221
(float)myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value;
1222
lbl[num++] = "< 64";
1225
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo96.value > 0) {
1226
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo96.value)/
1227
(float)myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value;
1228
lbl[num++] = "< 96";
1231
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo128.value > 0) {
1232
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo128.value)/
1233
(float)myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value;
1234
lbl[num++] = "< 128";
1237
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo160.value > 0) {
1238
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo160.value)/
1239
(float)myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value;
1240
lbl[num++] = "< 160";
1243
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo192.value > 0) {
1244
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo192.value)/
1245
(float)myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value;
1246
lbl[num++] = "< 192";
1249
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo224.value > 0) {
1250
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo224.value)/
1251
(float)myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value;
1252
lbl[num++] = "< 224";
1255
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo255.value > 0) {
1256
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo255.value)/
1257
(float)myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value;
1258
lbl[num++] = "<= 255";
1264
if(myGlobals.newSock < 0)
1270
fd = fdopen(abs(myGlobals.newSock), "ab");
1272
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1274
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1277
if(num == 1) p[0] = 100; /* just to be safe */
1279
fd, /* open file pointer */
1280
num, /* number of slices */
1281
lbl, /* slice labels */
1282
p); /* data array */
1287
sendGraphFile(fileName, 0);
1290
/* ************************ */
1292
void ipProtoDistribPie(void) {
1293
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1295
char *lbl[] = { "Loc", "Rem->Loc", "Loc->Rem" };
1300
p[num] = (float)(myGlobals.device[myGlobals.actualReportDeviceId].tcpGlobalTrafficStats.local.value+
1301
myGlobals.device[myGlobals.actualReportDeviceId].udpGlobalTrafficStats.local.value)/1024;
1306
p[num] = (float)(myGlobals.device[myGlobals.actualReportDeviceId].tcpGlobalTrafficStats.remote2local.value+
1307
myGlobals.device[myGlobals.actualReportDeviceId].udpGlobalTrafficStats.remote2local.value)/1024;
1309
lbl[num++] = "Rem->Loc";
1312
p[num] = (float)(myGlobals.device[myGlobals.actualReportDeviceId].tcpGlobalTrafficStats.local2remote.value+
1313
myGlobals.device[myGlobals.actualReportDeviceId].udpGlobalTrafficStats.local2remote.value)/1024;
1315
lbl[num++] = "Loc->Rem";
1321
if(myGlobals.newSock < 0)
1327
fd = fdopen(abs(myGlobals.newSock), "ab");
1329
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1331
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1334
if(num == 1) p[0] = 100; /* just to be safe */
1336
fd, /* open file pointer */
1337
num, /* number of slices */
1338
lbl, /* slice labels */
1339
p); /* data array */
1344
sendGraphFile(fileName, 0);
1347
/* ************************ */
1349
void interfaceTrafficPie(void) {
1350
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1351
float p[MAX_NUM_DEVICES];
1354
TrafficCounter totPkts;
1355
char *lbl[MAX_NUM_DEVICES];
1361
for(i=0; i<myGlobals.numDevices; i++) {
1362
if(myGlobals.device[i].pcapPtr && (!myGlobals.device[i].virtualDevice)) {
1363
p[i] = (float)myGlobals.device[i].ethernetPkts.value;
1364
totPkts.value += myGlobals.device[i].ethernetPkts.value;
1369
if(totPkts.value == 0)
1372
for(i=0; i<myGlobals.numDevices; i++) {
1373
if((!myGlobals.device[i].virtualDevice) && (p[i] > 0)) {
1374
p[myDevices] = 100*(((float)p[i])/totPkts.value);
1375
lbl[myDevices] = myGlobals.device[i].name;
1383
if(myGlobals.newSock < 0)
1389
fd = fdopen(abs(myGlobals.newSock), "ab");
1391
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1393
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1396
if(myDevices == 1) p[0] = 100; /* just to be safe */
1398
fd, /* open file pointer */
1399
myDevices, /* number of slices */
1400
lbl, /* slice labels */
1401
p); /* data array */
1406
sendGraphFile(fileName, 0);
1409
/* ************************ */
1411
void pktCastDistribPie(void) {
1412
char fileName[64] = "/tmp/graph-XXXXXX";
1414
char *lbl[] = { "", "", "" };
1415
int num=0, useFdOpen = 0;
1417
TrafficCounter unicastPkts;
1419
unicastPkts.value = myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value
1420
- myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value
1421
- myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value;
1423
if(unicastPkts.value > 0) {
1424
p[num] = (float)(100*unicastPkts.value)/(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1425
lbl[num++] = "Unicast";
1428
if(myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value > 0) {
1429
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value)/
1430
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1431
lbl[num++] = "Broadcast";
1434
if(myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value > 0) {
1438
for(i=0; i<num; i++)
1441
if(p[num] < 0) p[num] = 0;
1442
lbl[num++] = "Multicast";
1448
if(myGlobals.newSock < 0)
1454
fd = fdopen(abs(myGlobals.newSock), "ab");
1456
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1458
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1461
if(num == 1) p[0] = 100; /* just to be safe */
1463
fd, /* open file pointer */
1464
num, /* number of slices */
1465
lbl, /* slice labels */
1466
p); /* data array */
1471
sendGraphFile(fileName, 0);
1474
/* ************************ */
1476
void drawTrafficPie(void) {
1477
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1480
char *lbl[] = { "IP", "Non IP" };
1485
if(myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value == 0) return;
1487
ip.value = myGlobals.device[myGlobals.actualReportDeviceId].ipBytes.value;
1489
p[0] = ip.value*100/myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value; num++;
1498
if(myGlobals.newSock < 0)
1504
fd = fdopen(abs(myGlobals.newSock), "ab");
1506
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1508
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1511
if(num == 1) p[0] = 100; /* just to be safe */
1513
fd, /* open file pointer */
1514
num, /* number of slices */
1515
lbl, /* slice labels */
1516
p); /* data array */
1521
sendGraphFile(fileName, 0);
1524
/* ************************ */
1526
void drawThptGraph(int sortedColumn) {
1527
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1529
char labels[60][32];
1533
float graphData[60];
1537
memset(graphData, 0, sizeof(graphData));
1542
if(myGlobals.newSock < 0)
1548
fd = fdopen(abs(myGlobals.newSock), "ab");
1550
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1552
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1555
switch(sortedColumn) {
1556
case 1: /* 60 Minutes */
1557
for(i=0; i<60; i++) {
1558
lbls[59-i] = labels[i];
1559
labels[i][0] = '\0';
1562
len = myGlobals.device[myGlobals.actualReportDeviceId].numThptSamples;
1563
if(len > 60) len = 60;
1564
for(i=0; i<len; i++) {
1565
tmpTime = myGlobals.actTime-i*60;
1566
strftime(labels[i], 32, CONST_TOD_NOSEC_TIMESPEC, localtime_r(&tmpTime, &t));
1569
for(i=0; i<len; i++)
1570
graphData[59-i] = myGlobals.device[myGlobals.actualReportDeviceId].last60MinutesThpt[i].trafficValue;
1572
drawArea(600, 300, /* width, height */
1573
fd, /* open FILE pointer */
1574
60, /* num points per data set */
1575
(char**)lbls, /* X labels array of char* */
1576
graphData, NULL, /* dataset 1 */
1579
case 2: /* 24 Hours */
1580
for(i=0; i<24; i++) {
1581
lbls[23-i] = labels[i];
1582
labels[i][0] = '\0';
1585
len = myGlobals.device[myGlobals.actualReportDeviceId].numThptSamples/60;
1586
if(len > 24) len = 24;
1587
for(i=0; i<len; i++) {
1588
tmpTime = myGlobals.actTime-((i+1)*60*60);
1589
strftime(labels[i], 32, CONST_THPTLABEL_TIMESPEC, localtime_r(&tmpTime, &t));
1592
for(i=0; i<len; i++)
1593
graphData[23-i] = myGlobals.device[myGlobals.actualReportDeviceId].last24HoursThpt[i].trafficValue;
1595
drawArea(600, 300, /* width, height */
1596
fd, /* open FILE pointer */
1597
24, /* num points per data set */
1598
lbls, /* X labels array of char* */
1599
graphData, NULL, /* dataset 1 */
1602
case 3: /* 30 Days */
1603
for(i=0; i<30; i++) {
1604
lbls[29-i] = labels[i];
1605
labels[i][0] = '\0';
1608
len = myGlobals.device[myGlobals.actualReportDeviceId].numThptSamples/(24*60);
1609
if(len > 30) len = 30;
1610
for(i=0; i<len; i++) {
1611
tmpTime = myGlobals.actTime-((i+1)*(60*60*24));
1612
strftime(labels[i], 32, CONST_THPTLABEL_TIMESPEC, localtime_r(&tmpTime, &t));
1615
for(i=0; i<len; i++)
1616
graphData[29-i] = myGlobals.device[myGlobals.actualReportDeviceId].last30daysThpt[i];
1618
drawArea(600, 300, /* width, height */
1619
fd, /* open FILE pointer */
1620
30, /* num points per data set */
1621
lbls, /* X labels array of char* */
1630
sendGraphFile(fileName, 0);
1633
/* ************************ */
1635
void drawGlobalProtoDistribution(void) {
1636
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1638
float p[256]; /* Fix courtesy of Andreas Pfaller <apfaller@yahoo.com.au> */
1644
ip.value = myGlobals.device[myGlobals.actualReportDeviceId].ipBytes.value;
1646
if(myGlobals.device[myGlobals.actualReportDeviceId].tcpBytes.value > 0) {
1647
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].tcpBytes.value; lbl[idx] = "TCP"; idx++; }
1648
if(myGlobals.device[myGlobals.actualReportDeviceId].udpBytes.value > 0) {
1649
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].udpBytes.value; lbl[idx] = "UDP"; idx++; }
1650
if(myGlobals.device[myGlobals.actualReportDeviceId].icmpBytes.value > 0) {
1651
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].icmpBytes.value; lbl[idx] = "ICMP"; idx++; }
1652
if(myGlobals.device[myGlobals.actualReportDeviceId].otherIpBytes.value > 0) {
1653
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].otherIpBytes.value; lbl[idx] = "Other IP"; idx++; }
1654
if(myGlobals.device[myGlobals.actualReportDeviceId].arpRarpBytes.value > 0) {
1655
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].arpRarpBytes.value; lbl[idx] = "(R)ARP"; idx++; }
1656
if(myGlobals.device[myGlobals.actualReportDeviceId].dlcBytes.value > 0) {
1657
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].dlcBytes.value; lbl[idx] = "DLC"; idx++; }
1658
if(myGlobals.device[myGlobals.actualReportDeviceId].ipxBytes.value > 0) {
1659
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].ipxBytes.value; lbl[idx] = "IPX"; idx++; }
1660
if(myGlobals.device[myGlobals.actualReportDeviceId].decnetBytes.value > 0) {
1661
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].decnetBytes.value;lbl[idx] = "Decnet"; idx++; }
1662
if(myGlobals.device[myGlobals.actualReportDeviceId].atalkBytes.value > 0) {
1663
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].atalkBytes.value; lbl[idx] = "AppleTalk"; idx++; }
1664
if(myGlobals.device[myGlobals.actualReportDeviceId].netbiosBytes.value > 0) {
1665
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].netbiosBytes.value; lbl[idx] = "NetBios"; idx++; }
1666
if(myGlobals.device[myGlobals.actualReportDeviceId].osiBytes.value > 0) {
1667
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].osiBytes.value; lbl[idx] = "OSI"; idx++; }
1668
if(myGlobals.device[myGlobals.actualReportDeviceId].ipv6Bytes.value > 0) {
1669
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].ipv6Bytes.value; lbl[idx] = "IPv6"; idx++; }
1670
if(myGlobals.device[myGlobals.actualReportDeviceId].stpBytes.value > 0) {
1671
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].stpBytes.value; lbl[idx] = "STP"; idx++; }
1672
if(myGlobals.device[myGlobals.actualReportDeviceId].otherBytes.value > 0) {
1673
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].otherBytes.value; lbl[idx] = "Other"; idx++; }
1677
ProtocolsList *protoList = myGlobals.ipProtosList;
1680
while(protoList != NULL) {
1682
if(myGlobals.device[myGlobals.actualReportDeviceId].ipProtosList[idx1].value > 0) {
1683
p[idx] = myGlobals.device[myGlobals.actualReportDeviceId].ipProtosList[idx1].value;
1684
lbl[idx] = protoList->protocolName; idx++;
1687
idx1++, protoList = protoList->next;
1695
if(myGlobals.newSock < 0)
1701
fd = fdopen(abs(myGlobals.newSock), "ab");
1703
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1705
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1708
drawBar(600, 250, /* width/height */
1709
fd, /* open file pointer */
1710
idx, /* number of slices */
1711
lbl, /* slice labels */
1712
p); /* data array */
1717
sendGraphFile(fileName, 0);
1720
/* ************************ */
1722
void drawGlobalIpProtoDistribution(void) {
1723
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1724
int i, idx=0, idx1 = 0, maxNumDisplayProto = 13;
1729
ProtocolsList *protoList = myGlobals.ipProtosList;
1730
float total, partialTotal = 0;
1732
total = (float)myGlobals.device[myGlobals.actualReportDeviceId].ipBytes.value;
1734
while(protoList != NULL) {
1735
if(total > (float)myGlobals.device[myGlobals.actualReportDeviceId].ipProtosList[idx1].value)
1736
total -= (float)myGlobals.device[myGlobals.actualReportDeviceId].ipProtosList[idx1].value;
1740
idx1++, protoList = protoList->next;
1743
for(i=0; i<myGlobals.numIpProtosToMonitor; i++) {
1744
p[idx] = (float)myGlobals.device[myGlobals.actualReportDeviceId].ipProtoStats[i].local.value
1745
+myGlobals.device[myGlobals.actualReportDeviceId].ipProtoStats[i].remote.value;
1746
p[idx] += (float)myGlobals.device[myGlobals.actualReportDeviceId].ipProtoStats[i].remote2local.value
1747
+myGlobals.device[myGlobals.actualReportDeviceId].ipProtoStats[i].local2remote.value;
1748
if((p[idx] > 0) && ((p[idx]*100/total) > 1 /* the proto is at least 1% */)) {
1749
partialTotal += p[idx];
1750
lbl[idx] = myGlobals.protoIPTrafficInfos[i];
1754
if(idx >= maxNumDisplayProto) break;
1757
/* Add a bar for the Other TCP/UDP based protocols
1758
Courtesy of Robbert Kouprie <r.kouprie@dto.tudelft.nl>
1760
if (total > partialTotal) {
1762
p[idx] = total - partialTotal;
1769
if(myGlobals.newSock < 0)
1775
fd = fdopen(abs(myGlobals.newSock), "ab");
1777
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1779
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1782
drawBar(600, 300, /* width/height */
1783
fd, /* open file pointer */
1784
idx, /* number of slices */
1785
lbl, /* slice labels */
1786
p); /* data array */
1791
sendGraphFile(fileName, 0);
1794
/* ******************************** */
1796
int drawHostsDistanceGraph(int checkOnly) {
1797
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1798
int i, j, numPoints=0;
1799
char *lbls[32], labels[32][8];
1801
float graphData[60];
1805
memset(graphData, 0, sizeof(graphData));
1807
for(i=0; i<=30; i++) {
1808
if(snprintf(labels[i], sizeof(labels[i]), "%d", i) < 0)
1810
lbls[i] = labels[i];
1814
for(el=getFirstHost(myGlobals.actualReportDeviceId);
1815
el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) {
1816
if(!subnetPseudoLocalHost(el)) {
1818
if((j > 0) && (j <= 30)) {
1831
if(myGlobals.newSock < 0)
1837
fd = fdopen(abs(myGlobals.newSock), "ab");
1839
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1841
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1844
drawArea(400, 250, /* width, height */
1845
fd, /* open FILE pointer */
1846
30, /* num points per data set */
1847
lbls, /* X labels array of char* */
1848
graphData, "Hops (TTL)",
1849
"Number of Hosts", 0);
1854
sendGraphFile(fileName, 0);
1859
/* ************************ */
1861
void hostFcTrafficDistrib(HostTraffic *theHost, short dataSent) {
1862
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1863
float p[MAX_NUM_PROTOS];
1864
char *lbl[] = { "", "", "", "", "", "", "", "", "",
1865
"", "", "", "", "", "", "", "", "", "" };
1866
int i, num=0, explodePieces[MAX_NUM_PROTOS];
1868
TrafficCounter traffic, totalFcTraffic, diffTraffic;
1869
char *lblstouse[] = { "SCSI", "FICON", "ELS", "NS", "IP/FC", "Others"};
1870
Counter protoTrafficSent[] = {
1871
theHost->fcFcpBytesSent.value,
1872
theHost->fcFiconBytesSent.value,
1873
theHost->fcElsBytesSent.value,
1874
theHost->fcDnsBytesSent.value,
1875
theHost->fcIpfcBytesSent.value,
1876
theHost->otherFcBytesSent.value,
1879
Counter protoTrafficRcvd[] = {
1880
theHost->fcFcpBytesRcvd.value,
1881
theHost->fcFiconBytesRcvd.value,
1882
theHost->fcElsBytesRcvd.value,
1883
theHost->fcDnsBytesRcvd.value,
1884
theHost->fcIpfcBytesRcvd.value,
1885
theHost->otherFcBytesRcvd.value,
1889
totalFcTraffic.value = 0;
1890
diffTraffic.value = 0;
1893
totalFcTraffic.value = theHost->fcBytesSent.value;
1895
totalFcTraffic.value = theHost->fcBytesRcvd.value;
1897
if(totalFcTraffic.value > 0) {
1898
for (i = 0; i < 6; i++) {
1900
traffic.value = protoTrafficSent[i];
1902
traffic.value = protoTrafficRcvd[i];
1904
if(traffic.value > 0) {
1905
p[num] = (float)((100*traffic.value)/totalFcTraffic.value);
1906
diffTraffic.value += traffic.value;
1909
explodePieces[num]=10;
1911
explodePieces[num]=explodePieces[num-1];
1913
explodePieces[num]+=9;
1914
else if (p[num]>10.0)
1915
explodePieces[num]=10;
1917
lbl[num++] = lblstouse[i];
1925
if(myGlobals.newSock < 0)
1931
fd = fdopen(abs(myGlobals.newSock), "ab");
1933
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1935
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
1938
if(num == 1) p[0] = 100;
1940
if(num == 1) p[0] = 100; /* just to be safe */
1942
fd, /* open file pointer */
1943
num, /* number of slices */
1944
lbl, /* slice labels */
1945
p); /* data array */
1950
sendGraphFile(fileName, 0);
1953
/* ********************************** */
1955
void fcPktSizeDistribPie(void) {
1956
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
1958
char *lbl[] = { "", "", "", "", "", "", "", "", "", ""};
1963
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo36.value > 0) {
1964
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo36.value)/
1965
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1966
lbl[num++] = "<= 36";
1969
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo48.value > 0) {
1970
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo48.value)/
1971
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1972
lbl[num++] = "<= 48";
1975
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo52.value > 0) {
1976
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo52.value)/
1977
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1978
lbl[num++] = "<= 52";
1981
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo68.value > 0) {
1982
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo68.value)/
1983
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1984
lbl[num++] = "<= 68";
1987
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo104.value > 0) {
1988
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo104.value)/
1989
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1990
lbl[num++] = "<= 104";
1993
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo548.value > 0) {
1994
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo548.value)/
1995
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
1996
lbl[num++] = "<= 548";
1999
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo1060.value > 0) {
2000
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo1060.value)/
2001
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
2002
lbl[num++] = "<= 1060";
2005
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo2136.value > 0) {
2006
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.upTo2136.value)/
2007
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
2008
lbl[num++] = "<= 2136";
2011
if(myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.above2136.value > 0) {
2012
p[num] = (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdFcPktStats.above2136.value)/
2013
(float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value;
2014
lbl[num++] = "> 2136";
2020
if(myGlobals.newSock < 0)
2026
fd = fdopen(abs(myGlobals.newSock), "ab");
2028
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2030
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2033
if(num == 1) p[0] = 100; /* just to be safe */
2035
fd, /* open file pointer */
2036
num, /* number of slices */
2037
lbl, /* slice labels */
2038
p); /* data array */
2043
sendGraphFile(fileName, 0);
2046
/* ******************************** */
2048
void drawGlobalFcProtoDistribution(void) {
2049
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
2056
p[myGlobals.numIpProtosToMonitor] = 0;
2058
if(myGlobals.device[myGlobals.actualReportDeviceId].fcFcpBytes.value) {
2059
p[idx] = (float)myGlobals.device[myGlobals.actualReportDeviceId].fcFcpBytes.value;
2060
lbl[idx++] = "SCSI";
2063
if (myGlobals.device[myGlobals.actualReportDeviceId].fcFiconBytes.value) {
2064
p[idx] = (float)myGlobals.device[myGlobals.actualReportDeviceId].fcFiconBytes.value;
2065
lbl[idx++] = "FICON";
2068
if (myGlobals.device[myGlobals.actualReportDeviceId].fcElsBytes.value) {
2069
p[idx] = (float)myGlobals.device[myGlobals.actualReportDeviceId].fcElsBytes.value;
2073
if (myGlobals.device[myGlobals.actualReportDeviceId].fcIpfcBytes.value) {
2074
p[idx] = (float)myGlobals.device[myGlobals.actualReportDeviceId].fcIpfcBytes.value;
2075
lbl[idx++] = "IP/FC";
2078
if (myGlobals.device[myGlobals.actualReportDeviceId].fcDnsBytes.value) {
2079
p[idx] = (float)myGlobals.device[myGlobals.actualReportDeviceId].fcDnsBytes.value;
2083
if (myGlobals.device[myGlobals.actualReportDeviceId].fcSwilsBytes.value) {
2084
p[idx] = (float)myGlobals.device[myGlobals.actualReportDeviceId].fcSwilsBytes.value;
2085
lbl[idx++] = "SWILS";
2088
if (myGlobals.device[myGlobals.actualReportDeviceId].otherFcBytes.value) {
2089
p[idx] = (float)myGlobals.device[myGlobals.actualReportDeviceId].otherFcBytes.value;
2090
lbl[idx++] = "Others";
2096
if(myGlobals.newSock < 0)
2102
fd = fdopen(abs(myGlobals.newSock), "ab");
2104
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2106
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2109
drawBar(600, 250, /* width/height */
2110
fd, /* open file pointer */
2111
idx, /* number of slices */
2112
lbl, /* slice labels */
2113
p); /* data array */
2118
sendGraphFile(fileName, 0);
2121
void drawLunStatsBytesDistribution (HostTraffic *el) {
2122
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
2123
int lun, numEntries, idx=0;
2124
float p[MAX_LUNS_GRAPHED+1];
2125
char *lbl[MAX_LUNS_GRAPHED+1];
2126
char label[MAX_LUNS_GRAPHED+1][10];
2127
LunStatsSortedEntry sortedLunTbl[MAX_LUNS_SUPPORTED];
2128
LunStatsSortedEntry *entry;
2131
ScsiLunTrafficInfo *lunStats;
2133
p[MAX_LUNS_GRAPHED] = 0;
2136
memset(sortedLunTbl, 0, sizeof (sortedLunTbl));
2138
for (lun=0, numEntries=0; lun < MAX_LUNS_SUPPORTED; lun++) {
2139
if ((lunStats = el->activeLuns[lun]) != NULL) {
2140
sortedLunTbl[numEntries].lun = lun;
2141
sortedLunTbl[numEntries++].stats = el->activeLuns[lun];
2145
myGlobals.columnSort = 4; /* This is based on total I/O */
2146
qsort (sortedLunTbl, numEntries, sizeof (LunStatsSortedEntry), cmpLunFctn);
2149
for (lun = numEntries-1; ((idx < MAX_LUNS_GRAPHED) && (lun >= 0));
2151
entry = &sortedLunTbl[lun];
2152
p[idx] = (float) (entry->stats->bytesSent.value +
2153
entry->stats->bytesRcvd.value);
2155
sprintf (label[idx],"%hd", entry->lun);
2156
lbl[idx] = label[idx];
2164
if(myGlobals.newSock < 0)
2170
fd = fdopen(abs(myGlobals.newSock), "ab");
2172
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2174
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2177
drawBar (600, 250, /* width/height */
2178
fd, /* open file pointer */
2179
idx, /* number of slices */
2180
lbl, /* slice labels */
2181
p); /* data array */
2186
sendGraphFile(fileName, 0);
2189
void drawLunStatsPktsDistribution (HostTraffic *el) {
2190
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
2191
int lun, numEntries, idx=0;
2192
float p[MAX_LUNS_GRAPHED+1];
2193
char *lbl[MAX_LUNS_GRAPHED+1];
2194
char label[MAX_LUNS_GRAPHED+1][10];
2197
ScsiLunTrafficInfo *lunStats;
2198
LunStatsSortedEntry sortedLunTbl[MAX_LUNS_SUPPORTED];
2199
LunStatsSortedEntry *entry;
2201
p[MAX_LUNS_GRAPHED] = 0;
2204
memset(sortedLunTbl, 0, sizeof (sortedLunTbl));
2206
for (lun=0, numEntries=0; lun < MAX_LUNS_SUPPORTED; lun++) {
2207
if ((lunStats = el->activeLuns[lun]) != NULL) {
2208
sortedLunTbl[numEntries].lun = lun;
2209
sortedLunTbl[numEntries++].stats = el->activeLuns[lun];
2213
printf ("drawLunStatsPktsDistribution: #entries = %d\n", numEntries);
2214
myGlobals.columnSort = 5; /* This is based on total frames */
2215
qsort (sortedLunTbl, numEntries, sizeof (LunStatsSortedEntry), cmpLunFctn);
2217
for (lun = numEntries-1; ((idx < MAX_LUNS_GRAPHED) && (lun >= 0));
2219
entry = &sortedLunTbl[lun];
2220
p[idx] = (float) (entry->stats->pktRcvd +
2221
entry->stats->pktSent);
2223
sprintf (label[idx],"%hd", entry->lun);
2224
lbl[idx] = label[idx];
2232
traceEvent (CONST_TRACE_ALWAYSDISPLAY, "drawLunStatsPktsDistribution: idx = %d\n", idx);
2233
if(myGlobals.newSock < 0)
2239
fd = fdopen(abs(myGlobals.newSock), "ab");
2241
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2243
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2246
drawBar (600, 250, /* width/height */
2247
fd, /* open file pointer */
2248
idx, /* number of slices */
2249
lbl, /* slice labels */
2250
p); /* data array */
2255
sendGraphFile(fileName, 0);
2258
void drawVsanStatsBytesDistribution (int deviceId) {
2259
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
2260
int numVsans, idx=0, i, j;
2261
float p[MAX_VSANS_GRAPHED+1];
2262
char *lbl[MAX_VSANS_GRAPHED+1];
2263
char label[MAX_VSANS_GRAPHED+1][10];
2266
FcFabricElementHash **theHash;
2267
FcFabricElementHash *tmpTable[MAX_ELEMENT_HASH];
2269
if ((theHash = myGlobals.device[deviceId].vsanHash) == NULL) {
2273
p[MAX_VSANS_GRAPHED] = 0;
2276
memset (tmpTable, sizeof (FcFabricElementHash *)*MAX_ELEMENT_HASH, 0);
2277
for (i=0; i<MAX_ELEMENT_HASH; i++) {
2278
if((theHash[i] != NULL) && (theHash[i]->vsanId < MAX_HASHDUMP_ENTRY) &&
2279
(theHash[i]->vsanId < MAX_USER_VSAN)) {
2280
if (theHash[i]->totBytes.value)
2281
tmpTable[numVsans++] = theHash[i];
2290
myGlobals.columnSort = 3;
2291
qsort (tmpTable, numVsans, sizeof (FcFabricElementHash **), cmpVsanFctn);
2294
for (i = numVsans-1, j = 0; i >= 0; i--, j++) {
2295
if (tmpTable[i] != NULL) {
2296
p[idx] = tmpTable[i]->totBytes.value;
2297
if (tmpTable[i]->vsanId) {
2298
sprintf (label[idx], "%hd", tmpTable[i]->vsanId);
2301
sprintf (label[idx], "N/A");
2303
lbl[idx] = label[idx++];
2306
if (j >= MAX_VSANS_GRAPHED)
2314
if(myGlobals.newSock < 0)
2320
fd = fdopen(abs(myGlobals.newSock), "ab");
2322
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2324
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2327
drawBar (600, 250, /* width/height */
2328
fd, /* open file pointer */
2329
idx, /* number of slices */
2330
lbl, /* slice labels */
2331
p); /* data array */
2336
sendGraphFile(fileName, 0);
2339
void drawVsanStatsPktsDistribution (int deviceId) {
2340
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
2341
int numVsans, idx=0, i, j;
2342
float p[MAX_VSANS_GRAPHED+1];
2343
char *lbl[MAX_VSANS_GRAPHED+1];
2344
char label[MAX_VSANS_GRAPHED+1][10];
2347
FcFabricElementHash **theHash;
2348
FcFabricElementHash *tmpTable[MAX_ELEMENT_HASH];
2350
if ((theHash = myGlobals.device[deviceId].vsanHash) == NULL) {
2354
p[MAX_VSANS_GRAPHED] = 0;
2357
memset (tmpTable, sizeof (FcFabricElementHash *)*MAX_ELEMENT_HASH, 0);
2358
for (i=0; i<MAX_ELEMENT_HASH; i++) {
2359
if((theHash[i] != NULL) && (theHash[i]->vsanId < MAX_HASHDUMP_ENTRY) &&
2360
(theHash[i]->vsanId < MAX_USER_VSAN)) {
2361
if (theHash[i]->totPkts.value)
2362
tmpTable[numVsans++] = theHash[i];
2371
myGlobals.columnSort = 4;
2372
qsort (tmpTable, numVsans, sizeof (FcFabricElementHash **), cmpVsanFctn);
2375
for (i = numVsans-1, j = 0; i >= 0; i--, j++) {
2376
if (tmpTable[i] != NULL) {
2377
p[idx] = tmpTable[i]->totPkts.value;
2378
if (tmpTable[i]->vsanId) {
2379
sprintf (label[idx], "%d", tmpTable[i]->vsanId);
2382
sprintf (label[idx], "N/A");
2384
lbl[idx] = label[idx++];
2387
if (j >= MAX_VSANS_GRAPHED)
2394
if(myGlobals.newSock < 0)
2400
fd = fdopen(abs(myGlobals.newSock), "ab");
2402
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2404
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2407
drawBar (600, 250, /* width/height */
2408
fd, /* open file pointer */
2409
idx, /* number of slices */
2410
lbl, /* slice labels */
2411
p); /* data array */
2416
sendGraphFile(fileName, 0);
2419
void drawVsanSwilsProtoDistribution(u_short vsanId) {
2420
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
2422
FcFabricElementHash *hash;
2428
p[myGlobals.numIpProtosToMonitor] = 0;
2430
hash = getFcFabricElementHash (vsanId, myGlobals.actualReportDeviceId);
2432
p[0] = (float)hash->dmBytes.value;
2434
p[myGlobals.numIpProtosToMonitor] += p[0];
2438
p[1] = (float)hash->fspfBytes.value;
2440
p[myGlobals.numIpProtosToMonitor] += p[1];
2441
lbl[idx++] = "FSPF";
2444
p[2] = (float)hash->nsBytes.value;
2446
p[myGlobals.numIpProtosToMonitor] += p[2];
2450
p[3] = (float)hash->zsBytes.value;
2452
p[myGlobals.numIpProtosToMonitor] += p[3];
2456
p[4] = (float)hash->rscnBytes.value;
2458
p[myGlobals.numIpProtosToMonitor] += p[4];
2459
lbl[idx++] = "SW_RSCN";
2462
p[5] = (float)hash->fcsBytes.value;
2464
p[myGlobals.numIpProtosToMonitor] += p[5];
2468
p[6] = (float)hash->otherCtlBytes.value;
2470
p[myGlobals.numIpProtosToMonitor] += p[6];
2471
lbl[idx++] = "Others";
2477
if(myGlobals.newSock < 0)
2483
fd = fdopen(abs(myGlobals.newSock), "ab");
2485
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2487
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2490
drawPie (600, 250, /* width/height */
2491
fd, /* open file pointer */
2492
idx, /* number of slices */
2493
lbl, /* slice labels */
2494
p); /* data array */
2499
sendGraphFile(fileName, 0);
2502
void drawVsanDomainTrafficDistribution(u_short vsanId, u_char dataSent) {
2503
char fileName[NAME_MAX] = "/tmp/graph-XXXXXX";
2504
int i, idx=0, numEntries = 0;
2505
FcFabricElementHash *hash;
2506
float p[MAX_VSANS_GRAPHED+1];
2507
char *lbl[MAX_VSANS_GRAPHED+1], labels[MAX_VSANS_GRAPHED+1][8];
2511
SortedFcDomainStatsEntry *fcDomainStats;
2513
p[MAX_FC_DOMAINS+1] = 0;
2515
hash = getFcFabricElementHash (vsanId, myGlobals.actualReportDeviceId);
2522
fcDomainStats = (SortedFcDomainStatsEntry *)malloc (MAX_FC_DOMAINS*sizeof (SortedFcDomainStatsEntry));
2523
if (fcDomainStats == NULL) {
2524
traceEvent (CONST_TRACE_WARNING, "Unable to allocate memory for SortedFcDomainStatsEntry\n");
2528
memset (fcDomainStats, 0, MAX_FC_DOMAINS*sizeof (SortedFcDomainStatsEntry));
2530
for (i = 1; i < MAX_FC_DOMAINS; i++) {
2532
if (hash->domainStats[i].sentBytes.value) {
2533
fcDomainStats[numEntries].domainId = i;
2534
fcDomainStats[numEntries++].stats = &hash->domainStats[i];
2538
if (hash->domainStats[i].rcvdBytes.value) {
2539
fcDomainStats[numEntries].domainId = i;
2540
fcDomainStats[numEntries++].stats = &hash->domainStats[i];
2545
if (numEntries == 0) {
2550
myGlobals.columnSort = dataSent;
2551
qsort (fcDomainStats, numEntries, sizeof (SortedFcDomainStatsEntry), cmpFcDomainFctn);
2553
for (i = numEntries-1; (idx < MAX_VSANS_GRAPHED) && (i >= 0); i--) {
2555
total = fcDomainStats[i].stats->sentBytes.value;
2558
total = fcDomainStats[i].stats->rcvdBytes.value;
2561
p[idx] = (float)total;
2562
sprintf (labels[idx], "%x", fcDomainStats[i].domainId);
2563
lbl[idx] = labels[idx];
2570
if(myGlobals.newSock < 0)
2576
fd = fdopen(abs(myGlobals.newSock), "ab");
2578
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2580
fd = getNewRandomFile(fileName, NAME_MAX); /* leave it inside the mutex */
2583
drawBar(600, 250, /* width/height */
2584
fd, /* open file pointer */
2585
idx, /* number of slices */
2586
lbl, /* slice labels */
2587
p); /* data array */
2592
sendGraphFile(fileName, 0);
2596
#endif /* EMBEDDED */