4
* Copyright (C) 2004 Fusco Francesco <fuscof@cli.di.unipi.it>
5
* Giuseppe Giardina <giardina@cli.di.unipi.it>
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* General Public License for more details.
17
* You should have received a copy of the GNU General Public
18
* License along with this program; see the file COPYING. If not,
19
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20
* Boston, MA 02111-1307, USA.
26
* Fusco Francesco <fuscof@cli.di.unipi.it>
27
* Giuseppe Giardina <giardina@cli.di.unipi.it>
32
* This plugin provides snmp support to ntop.
33
* Now you can use it to monitor HostTraffic struct for all the host.
34
* Look at NTOP-MIB too see how you can query traffic for a particular host.
36
* snmpPlugin is under developement so it cannnot work perfectly as you hope for
37
* a ntop plugin. That means that it si not a good idea to use snmpPlugin in production
43
* This plugin works only with threads
47
#include "globals-report.h"
52
#define AGENT_NAME "ntopSnmp"
53
#define AGENT_ISSUBAGENT 0 /* 0 main agent, 1 sub agentx */
54
#define AGENT_PORT 161 /* TODO: how to set a different port? */
57
#include <net-snmp/net-snmp-config.h>
58
#include <net-snmp/net-snmp-includes.h>
59
#include <net-snmp/agent/net-snmp-agent-includes.h>
63
// #ifndef NTOP_COLUMNS_H
64
#define NTOP_COLUMNS_H
67
* column number definitions for table ntopTable
69
#define COLUMN_NTOPSERIALTYPE 1
70
#define COLUMN_NTOPACTUALDEVICE 2
71
#define COLUMN_NTOPVANID 3
72
#define COLUMN_NTOPSERIAL 4
73
#define COLUMN_HOSTRESOLVEDNAME 5
74
#define COLUMN_FINGERPRINT 6
75
#define COLUMN_PKTSENT 7
76
#define COLUMN_PKTRCVD 8
77
#define COLUMN_PKTSENTSESSION 9
78
#define COLUMN_PKTRCVDSESSION 10
79
#define COLUMN_PKTDUPLICATEDACKSENT 11
80
#define COLUMN_PKTDUPLICATEDACKRCVD 12
81
#define COLUMN_PKTBROADCASTSENT 13
82
#define COLUMN_BYTESBROADCASTSENT 14
83
#define COLUMN_PKTMULTICASTSENT 15
84
#define COLUMN_BYTESMULTICASTSENT 16
85
#define COLUMN_PKTMULTICASTRCVD 17
86
#define COLUMN_BYTESMULTICASTRCVD 18
87
#define COLUMN_BYTESSENT 19
88
#define COLUMN_BYTESSENTLOC 20
89
#define COLUMN_BYTESSENTREM 21
90
#define COLUMN_BYTESSENTSESSION 22
91
#define COLUMN_BYTESRCVD 23
92
#define COLUMN_BYTESRCVDLOC 24
93
#define COLUMN_BYTESRCVDFROMREM 25
94
#define COLUMN_BYTESRCVDSESSION 26
95
#define COLUMN_NUMHOSTSESSIONS 27
96
#define COLUMN_IPBYTESSENT 28
97
#define COLUMN_IPBYTESRCVD 29
98
#define COLUMN_IPV6SENT 30
99
#define COLUMN_IPV6RCVD 31
100
#define COLUMN_TCPSENTLOC 32
101
#define COLUMN_TCPSENTREM 33
102
#define COLUMN_UDPSENTLOC 34
103
#define COLUMN_UDPSENTREM 35
104
#define COLUMN_ICMPSENT 36
105
#define COLUMN_ICMP6SENT 37
106
#define COLUMN_TCPRCVDLOC 38
107
#define COLUMN_TCPRCVDFROMREM 39
108
#define COLUMN_UDPRCVDLOC 40
109
#define COLUMN_UDPRCVDFROMREM 41
110
#define COLUMN_ICMPRCVD 42
111
#define COLUMN_ICMP6RCVD 43
112
#define COLUMN_TCPFRAGMENTSSENT 44
113
#define COLUMN_TCPFRAGMENTSRCVD 45
114
#define COLUMN_UDPFRAGMENTSSENT 46
115
#define COLUMN_UDPFRAGMENTSRCVD 47
116
#define COLUMN_ICMPFRAGMENTSSENT 48
117
#define COLUMN_ICMPFRAGMENTSRCVD 49
118
#define COLUMN_ICMP6FRAGMENTSSENT 50
119
#define COLUMN_ICMP6FRAGMENTSRCVD 51
120
#define COLUMN_TOTCONTACTEDSENTPEERS 52
121
#define COLUMN_TOTCONTACTEDRCVDPEERS 53
122
#define COLUMN_CONTACTEDSENTPEERS 54
123
#define COLUMN_CONTACTEDRCVDPEERS 55
124
#define COLUMN_CONTACTEDROUTERS 56
126
// #ifndef NTOP_ENUMS_H
130
* enums for column ntopSerialType (uguali a
132
#define NTOPSERIALTYPE_UNKNOWN 0
133
#define NTOPSERIALTYPE_ETHSERIAL 1
134
#define NTOPSERIALTYPE_IPV4SERIAL 2
135
#define NTOPSERIALTYPE_IPV6SERIAL 3
136
#define NTOPSERIALTYPE_FCSERIAL 4
137
#define INITIALNUMBEROFHOST 256
138
/***********************************************************/
140
// #endif /* NTOP_H */
148
static pthread_t snmpThreadId;
149
static PthreadMutex snmpMutex;
151
static int actual_deviceId = 0, pluginActive = 0, everInitialized = 0;
152
static HostTraffic *my_el;
153
static oid ntopTable_oid[] = { 1, 3, 6, 1, 4, 1, 30000, 1 };
154
static u_char snmpDebug = 0;
155
static int maxNumberOfHost;
156
static int numberOfHost;
157
static HostTraffic** arrayOfHost;
162
static void simplehandlePluginHostCreationDeletion (HostTraffic * el,
164
u_char hostCreation);
165
static void initData ();
166
static void addHost (HostTraffic * el);
167
static void removeHost (HostTraffic * el);
168
static HostTraffic **getNextHostByOid (oid * reqoid);
169
static HostTraffic *getFirstHostByOid ();
170
static oid* create_oid(HostTraffic* el);
171
static int compare_oid(oid* el1, oid* el2);
172
static int compare_hostTraffic(const void* host1,const void* host2);
173
static int compare_oidWithHost(const void* requestoid,const void* host1);
174
static oid* createAnswer(int column,HostTraffic* el);
176
/***************************************************************/
179
* Utils function to code/decode oid etc etc
181
static int getHostSerialFromIndex (netsnmp_table_request_info *
182
table_info, HostSerial * serial);
184
static void processRequest (netsnmp_table_request_info * table_info,
185
netsnmp_variable_list * var,
186
HostTraffic * traffic);
187
static int getCounter64(Counter c, struct counter64 *c64);
189
static oid* encodeEth(HostTraffic* el);
190
static oid* encodeIpv4(HostTraffic* el);
191
static oid* encodeIpv6(HostTraffic* el);
192
static oid* encodeFc(HostTraffic* el);
193
#endif /* HAVE_SNMP */
196
static int initSnmpFunct (void);
197
static void termSnmpFunct (u_char);
198
static void handleSnmpHTTPrequest (char *url);
203
static void start_agent (void);
204
static void *snmpAgentLoop (void *notUsed _UNUSED_);
205
static void init_ntop_snmp (void);
206
static void initialize_table_ntopTable (void);
207
static void simplehandlePluginHostCreationDeletion(HostTraffic * el,
209
u_char hostCreation);
211
static PluginInfo snmpPluginInfo[] = {
213
VERSION, /* current ntop version */
215
"This plugin is used to monitor host traffic using the SNMP protocol.",
216
"0.1a", /* version */
217
"<a href=mailto:fuscof@cli.di.unipi.it>F.Fusco</a><br><a href=mailto:giardina@cli.di.unipi.it>G.Giardina</a>",
219
0, /* Not active by default */
221
1, /* Inactive setup */
222
initSnmpFunct, /* InitFunc */
223
termSnmpFunct, /* TermFunc */
224
NULL, /* PluginFunc */
225
handleSnmpHTTPrequest,
226
simplehandlePluginHostCreationDeletion, /* host creation/deletion handle */
227
NULL, /* no capture */
228
NULL, /* no status */
229
NULL /* no extra pages */
236
#ifdef MAKE_STATIC_PLUGIN
238
snmpPluginEntryFctn (void)
242
PluginEntryFctn (void)
245
traceEvent (CONST_TRACE_ALWAYSDISPLAY,
246
"SNMP: Welcome to %s. (C) 2004 by F.Fusco and G.Giardina",
247
snmpPluginInfo->pluginName);
248
return (snmpPluginInfo);
253
static Netsnmp_Node_Handler ntopTable_handler;
256
****************************** */
261
if(!everInitialized) {
267
traceEvent (CONST_TRACE_ALWAYSDISPLAY, "SnmpPlugin: initializing agent ");
268
createThread (&snmpThreadId, snmpAgentLoop, NULL);
269
createMutex(&snmpMutex);
274
**************************************** */
276
termSnmpFunct (u_char termNtop /* 0=term plugin, 1=term ntop */)
278
traceEvent (CONST_TRACE_ALWAYSDISPLAY,
279
"SnmpPlugin: terminating snmp (snmp_shutdown) ");
281
killThread(&snmpThreadId);
282
deleteMutex(&snmpMutex);
284
traceEvent (CONST_TRACE_INFO,
285
"SnmpPlugin: Thanks for using ntop snmpPlugin");
286
traceEvent (CONST_TRACE_ALWAYSDISPLAY, "SnmpPlugin: Done");
290
snmp_shutdown(AGENT_NAME);
295
**************************************** */
297
handleSnmpHTTPrequest (char *_url)
299
sendHTTPHeader (FLAG_HTTP_TYPE_HTML, 0, 1);
300
printHTMLheader ("snmpPlugin", NULL, 0);
301
printFlagedWarning ("Work in progress. Read plugins/README.SNMP");
306
* When host is added to ntop hash it store a pointer of that host in the data strucuture.
308
static void simplehandlePluginHostCreationDeletion (HostTraffic * el, u_short deviceId,
309
u_char hostCreation){
310
if (hostCreation == 1){
311
switch (el->hostSerial.serialType){
314
traceEvent (CONST_TRACE_ALWAYSDISPLAY,
315
"Added host %s [deviceID = %d, vlanid = %d(%d)]",
316
el->ethAddressString, deviceId,
317
el->hostSerial.value.ethSerial.vlanId, el->vlanId);
322
traceEvent (CONST_TRACE_ALWAYSDISPLAY,
323
"Added host %s [deviceID = %d, vlanid = %d(%d)]",
324
el->hostNumIpAddress, deviceId,
325
el->hostSerial.value.ipSerial.vlanId, el->vlanId);
331
accessMutex(&snmpMutex,"add host");
333
releaseMutex(&snmpMutex);
335
accessMutex(&snmpMutex,"remove host");
337
if(snmpDebug) traceEvent(CONST_TRACE_ALWAYSDISPLAY,"Removed Host");
338
releaseMutex(&snmpMutex);
345
snmp_enable_stderrlog ();
347
/* If we're an AgentX subagent... */
348
if (AGENT_ISSUBAGENT)
350
/* ...make us an AgentX client. */
351
netsnmp_ds_set_boolean (NETSNMP_DS_APPLICATION_ID,
352
NETSNMP_DS_AGENT_ROLE, 1);
354
init_agent (AGENT_NAME);
358
/* `yourappname' will be used to read yourappname.conf files. */
359
init_snmp (AGENT_NAME);
361
/* If we're going to be a SNMP master agent... */
362
if (!AGENT_ISSUBAGENT)
363
init_master_agent (); /* Listen on default port (161). */
368
snmpAgentLoop (void *notUsed _UNUSED_)
372
agent_check_and_process (1); /* 0 == don't block */
373
if(snmpDebug) traceEvent (CONST_TRACE_ALWAYSDISPLAY, "snmpAgentLoop()");
380
getHostSerialFromIndex (netsnmp_table_request_info * table_info,
383
int octet_data_length;
387
netsnmp_variable_list *tmp;
388
uint32_t mod_value[4];
389
char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY];
392
char display_buffer[20];
395
if (table_info->indexes == NULL)
398
tmp = table_info->indexes;
401
serial_type = *(tmp->val.integer);
402
tmp = tmp->next_variable;
405
actual_device = *(tmp->val.integer);
406
tmp = tmp->next_variable;
408
//get ntopVanid (vlan e vsan)
409
vanid = *(tmp->val.integer);
410
tmp = tmp->next_variable;
412
// take Serial and check lenght
413
octet_data_length = tmp->val_len;
415
// Ok, I've read all the necessary to build my HostSerial
416
serial->serialType = serial_type;
419
traceEvent (CONST_TRACE_ALWAYSDISPLAY,
420
"Processing request [serial =%d, device = %d, valore = ",
421
serial_type, actual_device);
427
if(snmpDebug) traceEvent (CONST_TRACE_ALWAYSDISPLAY, "No serial_type specified");
432
if (octet_data_length != LEN_ETHERNET_ADDRESS)
435
memcpy (serial->value.ethSerial.ethAddress, tmp->val.string,octet_data_length);
436
serial->value.ethSerial.vlanId = vanid;
438
ethAddr = etheraddr_string (serial->value.ethSerial.ethAddress, etherbuf);
439
if(snmpDebug) traceEvent (CONST_TRACE_ALWAYSDISPLAY, "The value is %s \n", ethAddr);
444
if (octet_data_length != 4)
446
serial->value.ipSerial.ipAddress.hostFamily = AF_INET;
447
serial->value.ipSerial.vlanId = vanid;
449
addrput (AF_INET, &(serial->value.ipSerial.ipAddress), tmp->val.string);
451
traceEvent (CONST_TRACE_ALWAYSDISPLAY, "The value is %s \n",
452
inet_ntop (AF_INET,&(serial->value.ipSerial.ipAddress.Ip4Address), display_buffer, 20));
453
mod_value[0] = htonl (serial->value.ipSerial.ipAddress.Ip4Address.s_addr);
454
addrput (AF_INET, &(serial->value.ipSerial.ipAddress), &mod_value);
459
if (octet_data_length != 16)
461
serial->value.ipSerial.ipAddress.hostFamily = AF_INET6;
462
serial->value.ipSerial.vlanId = vanid;
464
addrput (AF_INET6, &(serial->value.ipSerial.ipAddress), tmp->val.string);
466
traceEvent (CONST_TRACE_ALWAYSDISPLAY, "The value is %s \n",
467
inet_ntop (AF_INET6,&(serial->value.ipSerial.ipAddress.Ip6Address), display_buffer, 20));
469
mod_value[i] = htonl (serial->value.ipSerial.ipAddress.Ip6Address.s6_addr[i]);
471
addrput (AF_INET, &(serial->value.ipSerial.ipAddress), &mod_value);
486
static int compare_oidWithHost(const void* reqoid, const void* analyzingHost){
488
oid* requestoid = *((oid**)reqoid);
489
oid* analyzingOid = create_oid(*(HostTraffic**)analyzingHost);
492
if (requestoid[0] == 1)
494
else if(requestoid[0] == 2)
496
else if(requestoid[0] == 3)
500
for(i = 0;i<limit; i++){
501
// traceEvent(CONST_TRACE_ALWAYSDISPLAY,"%d,%d",requestoid[i],analyzingOid[i]);
502
if(requestoid[i] < analyzingOid [i]){
506
else if(requestoid[i] > analyzingOid[i]){
515
static int compare_oid(oid* analize1, oid* analize2){
520
if (analize1[0] == 1)
522
else if(analize1[0] == 2)
524
else if(analize1[0] == 3)
529
for(i = 0;i<limit; i++){
530
// traceEvent(CONST_TRACE_ALWAYSDISPLAY,"%d,%d",analize1[i],eanalize2[i]);
531
if(analize1[i] < analize2[i])
533
else if(analize1[i] > analize2[i])
538
static int compare_hostTraffic(const void* analizeHost1, const void* analizeHost2){
541
oid * first= create_oid(*(HostTraffic**)analizeHost1);
542
oid* second = create_oid(*(HostTraffic**)analizeHost2);
543
i = compare_oid(first,second);
548
static oid* create_oid(HostTraffic* el){
555
// traceEvent(CONST_TRACE_ALWAYSDISPLAY,"Dentro create_oid");
557
if(snmpDebug) traceEvent(CONST_TRACE_ALWAYSDISPLAY,"You give me a null pointer");
561
if (el->hostSerial.serialType == 1){
563
vlan = el->hostSerial.value.ethSerial.vlanId;
564
}else if(el->hostSerial.serialType == 2){
566
vlan = el->hostSerial.value.ipSerial.vlanId;
567
}else if(el->hostSerial.serialType == 3){
569
vlan = el->hostSerial.value.ipSerial.vlanId;
572
vlan = el->hostSerial.value.fcSerial.vsanId;
574
ptr=tmpoid=malloc((numberOfOid+3)*sizeof(oid));
575
tmpoid[0]=el->hostSerial.serialType;
576
tmpoid[1]=actual_deviceId;
579
// traceEvent(CONST_TRACE_ALWAYSDISPLAY,"Ho allocato la memoria");
581
traceEvent(CONST_TRACE_ALWAYSDISPLAY,"failed malloc");
584
switch (el->hostSerial.serialType){
589
tmp = encodeIpv4(el);
592
tmp = encodeIpv6(el);
600
// traceEvent(CONST_TRACE_ALWAYSDISPLAY,"ho ricevuto oid");
601
memcpy(ptr,tmp,numberOfOid*sizeof(oid));
603
/* for(i=0;i<numberOfOid+3;i++)
604
traceEvent(CONST_TRACE_ALWAYSDISPLAY,"tmpoid[%d]=%d",i,tmpoid[i]);*/
609
static void addHost(HostTraffic* el){
611
HostTraffic** tmp = arrayOfHost;
614
if(numberOfHost == maxNumberOfHost){
615
maxNumberOfHost +=INITIALNUMBEROFHOST;
616
tmp = malloc(maxNumberOfHost*sizeof(void*));
617
memcpy(tmp,arrayOfHost,numberOfHost*sizeof(void*));
621
while(i<numberOfHost && compare_hostTraffic(&el,tmp)>=0){
626
if(i != numberOfHost)
627
memmove(tmp+1,tmp,(arrayOfHost+numberOfHost-tmp)*sizeof(HostTraffic*));
634
for(i=0;i<numberOfHost;i++)
635
traceEvent(CONST_TRACE_ALWAYSDISPLAY,"Host=%s",arrayOfHost[i]->hostNumIpAddress);
640
static void removeHost(HostTraffic* el){
644
tmp = (HostTraffic**)bsearch(&el,arrayOfHost,numberOfHost,sizeof(HostTraffic*),compare_hostTraffic);
649
traceEvent(CONST_TRACE_ALWAYSDISPLAY,"Removing=%s",((HostTraffic*)ptr)->hostNumIpAddress);
650
traceEvent(CONST_TRACE_ALWAYSDISPLAY,"Moving %d elements",(arrayOfHost+numberOfHost-1-tmp));
652
memmove(tmp,tmp+1,(arrayOfHost+numberOfHost-1-tmp)*sizeof(HostTraffic*));
659
static void resetData(){
665
static void initData(){
667
maxNumberOfHost = INITIALNUMBEROFHOST;
668
arrayOfHost = malloc(maxNumberOfHost*sizeof(HostTraffic*));
671
static oid* encodeIpv4(HostTraffic* el){
672
oid* tmpoid = malloc(sizeof(oid)*5);
675
u_int32_t addr = htonl(el->hostSerial.value.ipSerial.ipAddress.Ip4Address.s_addr);
676
buf = (u_int8_t*) &addr;
683
static oid* encodeIpv6(HostTraffic* el){
684
oid* tmpoid = malloc(sizeof(oid)*17);
689
buf[i] = el->hostSerial.value.ipSerial.ipAddress.Ip6Address.s6_addr[i];
692
ptr = (u_int8_t*) &buf[i];
694
tmpoid[(4*i)+1+j]=ptr[j];
699
static oid* encodeEth(HostTraffic* el){
700
oid* tmpoid = malloc(sizeof(oid)*7);
703
buf = (u_int8_t*) &(el->hostSerial.value.ethSerial.ethAddress);
710
static oid* encodeFc(HostTraffic* el){
711
oid* tmpoid = malloc(sizeof(oid)*4);
714
tmpoid[1] = el->hostSerial.value.fcSerial.fcAddress.domain;
715
tmpoid[2] = el->hostSerial.value.fcSerial.fcAddress.area;
716
tmpoid[3] = el->hostSerial.value.fcSerial.fcAddress.port;
721
static oid* createAnswer(int column,HostTraffic* el){
726
tmp = create_oid(el);
727
/* traceEvent (CONST_TRACE_ALWAYSDISPLAY, "Ho creato l'oid");*/
734
else numberOfOid = 7;
737
traceEvent (CONST_TRACE_ALWAYSDISPLAY,
738
"SerialType %d, malloc for %d oid",
739
tmp[0], numberOfOid+OID_LENGTH(ntopTable_oid)+2);
741
resoid = malloc((numberOfOid+OID_LENGTH(ntopTable_oid)+2)*sizeof(oid));
742
for(i = 0;i<OID_LENGTH(ntopTable_oid);i++)
743
resoid[i]=ntopTable_oid[i];
745
resoid[OID_LENGTH(ntopTable_oid)]=1;//is ntopEntry
746
resoid[OID_LENGTH(ntopTable_oid)+1]=column;
748
for(i = 10,j=0;i<numberOfOid+OID_LENGTH(ntopTable_oid)+2;i++,j++){
752
for(i = 0;i<numberOfOid+OID_LENGTH(ntopTable_oid)+2;i++)
753
traceEvent(CONST_TRACE_ALWAYSDISPLAY,"resoid[%d]=%d",i,resoid[i]);
759
/**************************************************************/
766
/*****************************************************************/
767
static HostTraffic **
768
getNextHostByOid (oid * reqoid)
770
return (HostTraffic**) bsearch(&reqoid,arrayOfHost,numberOfHost,sizeof(HostTraffic*),compare_oidWithHost);
773
/*********************************************************************/
774
static int getCounter64(Counter c, struct counter64 *c64){
780
/***************************************************************************************/
782
processRequest (netsnmp_table_request_info * table_info,
783
netsnmp_variable_list * var, HostTraffic * traffic)
785
struct counter64 result;
790
if (table_info != NULL && traffic != NULL)
792
switch (table_info->colnum)
794
case COLUMN_NTOPSERIALTYPE:
795
intresult = traffic->hostSerial.serialType;
796
snmp_set_var_typed_value (var, ASN_INTEGER,
797
(u_char *) & (intresult), sizeof (intresult));
800
case COLUMN_NTOPACTUALDEVICE:
801
snmp_set_var_typed_value (var, ASN_INTEGER,
802
(u_char *) & (actual_deviceId),
803
sizeof (actual_deviceId));
807
case COLUMN_NTOPVANID:
808
switch(traffic->hostSerial.serialType){
810
intresult = traffic->hostSerial.value.ethSerial.vlanId;
813
intresult = traffic->hostSerial.value.ipSerial.vlanId;
816
intresult = traffic->hostSerial.value.ipSerial.vlanId;
819
intresult = traffic->hostSerial.value.fcSerial.vsanId;
823
snmp_set_var_typed_value(var, ASN_INTEGER,
824
(u_char *) &intresult
825
, sizeof(intresult));
828
case COLUMN_NTOPSERIAL:
829
/*TODO: ip addr are printed in host byte order, please correct*/
830
switch (traffic->hostSerial.serialType)
833
cp = traffic->hostSerial.value.ethSerial.ethAddress;
837
cp = (char *)&traffic->hostSerial.value.ipSerial.ipAddress.Ip4Address.s_addr;
841
cp =(char *)&traffic->hostSerial.value.ipSerial.ipAddress.Ip6Address.s6_addr;
846
size = LEN_FC_ADDRESS_DISPLAY;
850
snmp_set_var_typed_value (var, ASN_OCTET_STR, (u_char *) cp, size);
854
case COLUMN_HOSTRESOLVEDNAME:
855
snmp_set_var_typed_value(var, ASN_OCTET_STR,
856
(u_char *) traffic->hostResolvedName
857
,MAX_LEN_SYM_HOST_NAME
861
case COLUMN_FINGERPRINT:
862
snmp_set_var_typed_value(var, ASN_OCTET_STR,
863
(u_char *)(traffic->fingerprint == NULL ? "" : traffic->fingerprint),
864
(traffic->fingerprint == NULL ? 0 : strlen(traffic->fingerprint)));
868
getCounter64(traffic->pktSent.value,&result);
869
snmp_set_var_typed_value(var, ASN_COUNTER64,
876
getCounter64(traffic->pktRcvd.value,&result);
877
snmp_set_var_typed_value(var, ASN_COUNTER64,
883
case COLUMN_PKTSENTSESSION:
884
getCounter64(traffic->pktSentSession.value,&result);
885
snmp_set_var_typed_value(var, ASN_COUNTER64,
891
case COLUMN_PKTRCVDSESSION:
892
getCounter64(traffic->pktRcvdSession.value,&result);
893
snmp_set_var_typed_value(var, ASN_COUNTER64,
899
case COLUMN_PKTDUPLICATEDACKSENT:
900
getCounter64(traffic->pktDuplicatedAckSent.value,&result);
901
snmp_set_var_typed_value(var, ASN_COUNTER64,
907
case COLUMN_PKTDUPLICATEDACKRCVD:
908
getCounter64(traffic->pktDuplicatedAckRcvd.value,&result);
909
snmp_set_var_typed_value(var, ASN_COUNTER64,
915
case COLUMN_PKTBROADCASTSENT:
916
getCounter64(traffic->pktBroadcastSent.value,&result);
917
snmp_set_var_typed_value(var, ASN_COUNTER64,
923
case COLUMN_BYTESBROADCASTSENT:
924
getCounter64(traffic->bytesBroadcastSent.value,&result);
925
snmp_set_var_typed_value(var, ASN_COUNTER64,
931
case COLUMN_PKTMULTICASTSENT:
932
getCounter64(traffic->pktMulticastSent.value,&result);
933
snmp_set_var_typed_value(var, ASN_COUNTER64,
939
case COLUMN_BYTESMULTICASTSENT:
940
getCounter64(traffic->bytesMulticastSent.value,&result);
941
snmp_set_var_typed_value(var, ASN_COUNTER64,
947
case COLUMN_PKTMULTICASTRCVD:
948
getCounter64(traffic->pktMulticastRcvd.value,&result);
949
snmp_set_var_typed_value(var, ASN_COUNTER64,
955
case COLUMN_BYTESMULTICASTRCVD:
956
getCounter64(traffic->bytesMulticastRcvd.value,&result);
957
snmp_set_var_typed_value(var, ASN_COUNTER64,
963
case COLUMN_BYTESSENT:
964
getCounter64(traffic->bytesSent.value,&result);
965
snmp_set_var_typed_value(var, ASN_COUNTER64,
971
case COLUMN_BYTESSENTLOC:
972
getCounter64(traffic->bytesSentLoc.value,&result);
973
snmp_set_var_typed_value(var, ASN_COUNTER64,
979
case COLUMN_BYTESSENTREM:
980
getCounter64(traffic->bytesSentRem.value,&result);
981
snmp_set_var_typed_value(var, ASN_COUNTER64,
987
case COLUMN_BYTESSENTSESSION:
988
getCounter64(traffic->bytesSentSession.value,&result);
989
snmp_set_var_typed_value(var, ASN_COUNTER64,
995
case COLUMN_BYTESRCVD:
996
getCounter64(traffic->bytesRcvd.value,&result);
997
snmp_set_var_typed_value(var, ASN_COUNTER64,
1003
case COLUMN_BYTESRCVDLOC:
1004
getCounter64(traffic->bytesRcvdLoc.value,&result);
1005
snmp_set_var_typed_value(var, ASN_COUNTER64,
1011
case COLUMN_BYTESRCVDFROMREM:
1012
getCounter64(traffic->bytesRcvdFromRem.value,&result);
1013
snmp_set_var_typed_value(var, ASN_COUNTER64,
1019
case COLUMN_BYTESRCVDSESSION:
1020
getCounter64(traffic->bytesRcvdSession.value,&result);
1021
snmp_set_var_typed_value(var, ASN_COUNTER64,
1027
case COLUMN_NUMHOSTSESSIONS:
1028
getCounter64(traffic->numHostSessions,&result);
1029
snmp_set_var_typed_value(var, ASN_COUNTER64,
1035
case COLUMN_IPBYTESSENT:
1036
getCounter64(traffic->ipBytesSent.value,&result);
1037
snmp_set_var_typed_value(var, ASN_COUNTER64,
1043
case COLUMN_IPBYTESRCVD:
1044
getCounter64(traffic->ipBytesRcvd.value,&result);
1045
snmp_set_var_typed_value(var, ASN_COUNTER64,
1051
case COLUMN_IPV6SENT:
1052
getCounter64(traffic->ipv6Sent.value,&result);
1053
snmp_set_var_typed_value(var, ASN_COUNTER64,
1059
case COLUMN_IPV6RCVD:
1060
getCounter64(traffic->ipv6Rcvd.value,&result);
1061
snmp_set_var_typed_value(var, ASN_COUNTER64,
1067
case COLUMN_TCPSENTLOC:
1068
getCounter64(traffic->tcpSentLoc.value,&result);
1069
snmp_set_var_typed_value(var, ASN_COUNTER64,
1075
case COLUMN_TCPSENTREM:
1076
getCounter64(traffic->tcpSentRem.value,&result);
1077
snmp_set_var_typed_value(var, ASN_COUNTER64,
1083
case COLUMN_UDPSENTLOC:
1084
getCounter64(traffic->udpSentLoc.value,&result);
1085
snmp_set_var_typed_value(var, ASN_COUNTER64,
1091
case COLUMN_UDPSENTREM:
1092
getCounter64(traffic->udpSentRem.value,&result);
1093
snmp_set_var_typed_value(var, ASN_COUNTER64,
1099
case COLUMN_ICMPSENT:
1100
getCounter64(traffic->icmpSent.value,&result);
1101
snmp_set_var_typed_value(var, ASN_COUNTER64,
1107
case COLUMN_ICMP6SENT:
1108
getCounter64(traffic->icmp6Sent.value,&result);
1109
snmp_set_var_typed_value(var, ASN_COUNTER64,
1115
case COLUMN_TCPRCVDLOC:
1116
getCounter64(traffic->tcpRcvdLoc.value,&result);
1117
snmp_set_var_typed_value(var, ASN_COUNTER64,
1123
case COLUMN_TCPRCVDFROMREM:
1124
getCounter64(traffic->tcpRcvdFromRem.value,&result);
1125
snmp_set_var_typed_value(var, ASN_COUNTER64,
1131
case COLUMN_UDPRCVDLOC:
1132
getCounter64(traffic->udpRcvdLoc.value,&result);
1133
snmp_set_var_typed_value(var, ASN_COUNTER64,
1139
case COLUMN_UDPRCVDFROMREM:
1140
getCounter64(traffic->udpRcvdFromRem.value,&result);
1141
snmp_set_var_typed_value(var, ASN_COUNTER64,
1147
case COLUMN_ICMPRCVD:
1148
getCounter64(traffic->icmpRcvd.value,&result);
1149
snmp_set_var_typed_value(var, ASN_COUNTER64,
1155
case COLUMN_ICMP6RCVD:
1156
getCounter64(traffic->icmp6Rcvd.value,&result);
1157
snmp_set_var_typed_value(var, ASN_COUNTER64,
1163
case COLUMN_TCPFRAGMENTSSENT:
1164
getCounter64(traffic->tcpFragmentsSent.value,&result);
1165
snmp_set_var_typed_value(var, ASN_COUNTER64,
1171
case COLUMN_TCPFRAGMENTSRCVD:
1172
getCounter64(traffic->tcpFragmentsRcvd.value,&result);
1173
snmp_set_var_typed_value(var, ASN_COUNTER64,
1179
case COLUMN_UDPFRAGMENTSSENT:
1180
getCounter64(traffic->udpFragmentsSent.value,&result);
1181
snmp_set_var_typed_value(var, ASN_COUNTER64,
1187
case COLUMN_UDPFRAGMENTSRCVD:
1188
getCounter64(traffic->udpFragmentsRcvd.value,&result);
1189
snmp_set_var_typed_value(var, ASN_COUNTER64,
1195
case COLUMN_ICMPFRAGMENTSSENT:
1196
getCounter64( traffic->icmpFragmentsSent.value,&result);
1197
snmp_set_var_typed_value(var, ASN_COUNTER64,
1203
case COLUMN_ICMPFRAGMENTSRCVD:
1204
getCounter64(traffic->icmpFragmentsRcvd.value,&result);
1205
snmp_set_var_typed_value(var, ASN_COUNTER64,
1211
case COLUMN_ICMP6FRAGMENTSSENT:
1212
getCounter64(traffic->icmp6FragmentsSent.value,&result);
1213
snmp_set_var_typed_value(var, ASN_COUNTER64,
1219
case COLUMN_ICMP6FRAGMENTSRCVD:
1220
getCounter64(traffic->icmp6FragmentsRcvd.value,&result);
1221
snmp_set_var_typed_value(var, ASN_COUNTER64,
1227
case COLUMN_TOTCONTACTEDSENTPEERS:
1228
getCounter64(traffic->totContactedSentPeers,&result);
1229
snmp_set_var_typed_value(var, ASN_COUNTER64,
1235
case COLUMN_TOTCONTACTEDRCVDPEERS:
1236
getCounter64(traffic->totContactedRcvdPeers,&result);
1237
snmp_set_var_typed_value(var, ASN_COUNTER64,
1243
case COLUMN_CONTACTEDSENTPEERS:
1244
getCounter64(traffic->contactedSentPeers.value.value,&result);
1245
snmp_set_var_typed_value(var, ASN_COUNTER64,
1251
case COLUMN_CONTACTEDRCVDPEERS:
1252
getCounter64(traffic->contactedRcvdPeers.value.value,&result);
1253
snmp_set_var_typed_value(var, ASN_COUNTER64,
1259
case COLUMN_CONTACTEDROUTERS:
1260
getCounter64(traffic->contactedRouters.value.value,&result);
1261
snmp_set_var_typed_value(var, ASN_COUNTER64,
1269
"problem encountered in ntopTable_handler: unknown column\n");
1274
/* *********************************************************************** */
1276
static void initialize_table_ntopTable (void)
1278
// static oid ntopTable_oid[] = { 1, 3, 6, 1, 4, 1, 30000, 1 };
1279
netsnmp_table_registration_info *table_info;
1280
netsnmp_handler_registration *my_handler;
1284
/** create the table registration information structures */
1285
table_info = SNMP_MALLOC_TYPEDEF (netsnmp_table_registration_info);
1288
/* Read only table */
1289
my_handler = netsnmp_create_handler_registration ("ntopTable",
1296
if (!my_handler || !table_info)
1298
snmp_log (LOG_ERR, "malloc failed in initialize_table_ntopTable");
1302
/* Setting up the table's definition */
1303
netsnmp_table_helper_add_indexes (table_info,
1304
ASN_INTEGER, /* index: ntopSerialType */
1305
ASN_INTEGER, /* index: ntopActualDevice */
1306
ASN_INTEGER, /* index: ntopVanId */
1307
ASN_OCTET_STR, /* index: ntopSerial */
1310
/** Define the minimum and maximum accessible columns.*/
1311
table_info->min_column = 1;
1312
table_info->max_column = 56;
1314
netsnmp_register_table (my_handler, table_info);
1318
/** Initializes the ntop module */
1319
static void init_ntop_snmp (void)
1321
/** here we initialize all the tables we're planning on supporting */
1322
initialize_table_ntopTable ();
1326
/** handles requests for the ntopTable table, if anything else needs to be done */
1328
ntopTable_handler (netsnmp_mib_handler * handler,
1329
netsnmp_handler_registration * reginfo,
1330
netsnmp_agent_request_info * reqinfo,
1331
netsnmp_request_info * requests)
1334
netsnmp_request_info *request;
1335
netsnmp_table_request_info *table_info;
1336
netsnmp_variable_list *var;
1339
HostTraffic *traffic = NULL;
1340
HostTraffic** resultOfResearch = NULL;
1345
for (request = requests; request; request = request->next)
1347
var = request->requestvb;
1349
if (request->processed != 0)
1352
/** extracts the information about the table from the request
1354
* -table_info->indexes
1355
* -table_info->column
1357
table_info = netsnmp_extract_table_info (request);
1359
if (table_info == NULL){
1363
switch (reqinfo->mode){
1366
if (getHostSerialFromIndex (table_info, &serial) > 0){
1367
traffic = findHostBySerial (serial, actual_deviceId);
1369
if (traffic == NULL){
1370
netsnmp_set_request_error (reqinfo, request, SNMP_NOSUCHOBJECT);
1371
return SNMP_NOSUCHOBJECT;
1373
processRequest (table_info, var, traffic);
1378
if(snmpDebug) traceEvent(CONST_TRACE_ALWAYSDISPLAY,"There are %d host ",numberOfHost);
1379
if(numberOfHost == 0){
1380
netsnmp_set_request_error (reqinfo, request, SNMP_NOSUCHOBJECT);
1381
return SNMP_NOSUCHOBJECT;
1384
req_length = sizeof(ntopTable_oid)/sizeof(oid);
1385
// No index specified
1387
accessMutex(&snmpMutex,"Reading");
1388
if (var->name_length <= req_length + 2){
1389
if(snmpDebug) traceEvent (CONST_TRACE_ALWAYSDISPLAY, "No Index specified, I take the first");
1390
traffic = getFirstHostByOid ();
1391
if(snmpDebug) traceEvent (CONST_TRACE_ALWAYSDISPLAY, "first element taken");
1392
if (traffic == NULL){
1393
netsnmp_set_request_error (reqinfo, request,
1395
releaseMutex(&snmpMutex);
1396
return SNMP_NOSUCHOBJECT;
1400
if(snmpDebug) traceEvent (CONST_TRACE_ALWAYSDISPLAY, "Index specified, I must find the next");
1401
resultOfResearch = getNextHostByOid((var->name)+OID_LENGTH(ntopTable_oid)+2);
1402
if(resultOfResearch == NULL){
1403
netsnmp_set_request_error (reqinfo, request,
1405
releaseMutex(&snmpMutex);
1406
return SNMP_NOSUCHOBJECT;
1408
if(resultOfResearch==(arrayOfHost+numberOfHost-1) && table_info->colnum == table_info->reg_info->max_column ){
1409
if(snmpDebug) traceEvent(CONST_TRACE_ALWAYSDISPLAY,"You have request the last element of the last column");
1410
netsnmp_set_request_error (reqinfo, request,
1413
releaseMutex(&snmpMutex);
1414
return SNMP_NOSUCHOBJECT;
1416
if(resultOfResearch==(arrayOfHost+numberOfHost-1)){
1417
if(snmpDebug) traceEvent(CONST_TRACE_ALWAYSDISPLAY,"You have request last element");
1418
traffic = getFirstHostByOid();
1419
table_info->colnum++;
1421
traffic = *(resultOfResearch+1);
1424
releaseMutex(&snmpMutex);
1426
traceEvent (CONST_TRACE_ALWAYSDISPLAY,
1427
"Found host %s [deviceID = %d, vlanid = %d(%d)]",
1428
traffic->hostNumIpAddress, 0,
1429
traffic->hostSerial.value.ipSerial.vlanId, traffic->vlanId);
1431
resoid = createAnswer(table_info->colnum,traffic);
1433
if(traffic->hostSerial.serialType == 1)
1435
else if(traffic->hostSerial.serialType == 2)
1437
else if(traffic->hostSerial.serialType == 3)
1442
snmp_set_var_objid(var,resoid,numberOfOid+OID_LENGTH(ntopTable_oid)+2);
1443
processRequest (table_info, var, traffic);
1449
"problem encountered in ntopTable_handler: unsupported mode\n");
1452
return SNMP_ERR_NOERROR;
1455
#else /* !HAVE_SNMP */
1456
static int initSnmpFunct (void) { return(0); }
1457
static void termSnmpFunct (u_char termNtop /* 0=term plugin, 1=term ntop */) { ;}
1459
static void handleSnmpHTTPrequest (char *_url) {
1460
sendHTTPHeader (FLAG_HTTP_TYPE_HTML, 0, 1);
1461
printHTMLheader ("snmpPlugin", NULL, 0);
1462
printFlagedWarning ("SNMP support disabled or not available");
1463
printHTMLtrailer ();
1466
static void simplehandlePluginHostCreationDeletion(HostTraffic *el,
1468
u_char hostCreation) {