57
58
static HostTraffic* __getFirstHost(u_int actualDeviceId, u_int beginIdx, char *file, int line) {
60
/* accessMutex(&myGlobals.hostsHashMutex, "__getFirstHost"); */
61
accessMutex(&myGlobals.hostsHashLockMutex, "__getFirstHost");
62
63
for(idx=beginIdx; idx<myGlobals.device[actualDeviceId].actualHashSize; idx++) {
63
64
HostTraffic *el = myGlobals.device[actualDeviceId].hash_hostTraffic[idx];
66
if(el->magic != CONST_MAGIC_NUMBER) {
67
traceEvent(CONST_TRACE_ERROR,
68
"Bad magic number [expected=%d/real=%d][deviceId=%d] getFirstHost()[%s/%d]",
69
CONST_MAGIC_NUMBER, el->magic, actualDeviceId, file, line);
70
/* releaseMutex(&myGlobals.hostsHashMutex); */
67
if(broadcastHost(el) || (el == myGlobals.otherHostEntry)) {
70
if(el->magic != CONST_MAGIC_NUMBER) {
71
traceEvent(CONST_TRACE_ERROR,
72
"Bad magic number [expected=%d/real=%d][deviceId=%d] getFirstHost()[%s/%d]",
73
CONST_MAGIC_NUMBER, el->magic, actualDeviceId, file, line);
74
releaseMutex(&myGlobals.hostsHashLockMutex);
78
if(!is_host_ready_to_purge(actualDeviceId, el, time(NULL))) {
79
/* Do not return hosts that will soon be purged off memory */
80
releaseMutex(&myGlobals.hostsHashLockMutex);
74
/* releaseMutex(&myGlobals.hostsHashMutex); */
79
/* releaseMutex(&myGlobals.hostsHashMutex); */
89
releaseMutex(&myGlobals.hostsHashLockMutex);
83
93
/* ************************************ */
85
95
HostTraffic* _getFirstHost(u_int actualDeviceId, char *file, int line) {
86
return(__getFirstHost(actualDeviceId, FIRST_HOSTS_ENTRY, file, line));
96
return(__getFirstHost(actualDeviceId, 0 /* FIRST_HOSTS_ENTRY */, file, line));
89
99
/* ************************************ */
91
101
HostTraffic* _getNextHost(u_int actualDeviceId, HostTraffic *host, char *file, int line) {
92
if(host == NULL) return(NULL);
94
/* accessMutex(&myGlobals.hostsHashMutex, "getNextHost"); */
96
if(host->next != NULL) {
103
time_t now = time(NULL);
105
accessMutex(&myGlobals.hostsHashLockMutex, "getNextHost");
107
if((host == NULL) || (host->magic != CONST_MAGIC_NUMBER)) {
108
releaseMutex(&myGlobals.hostsHashLockMutex);
112
nextIdx = host->hostTrafficBucket+1;
114
while(host->next != NULL) {
97
115
if(host->next->magic != CONST_MAGIC_NUMBER) {
98
116
traceEvent(CONST_TRACE_ERROR, "Bad magic number (expected=%d/real=%d) getNextHost()[%s/%d]",
99
117
CONST_MAGIC_NUMBER, host->next->magic, file, line);
100
/* releaseMutex(&myGlobals.hostsHashMutex); */
118
releaseMutex(&myGlobals.hostsHashLockMutex);
104
/* releaseMutex(&myGlobals.hostsHashMutex); */
107
u_int nextIdx = host->hostTrafficBucket+1;
109
/* releaseMutex(&myGlobals.hostsHashMutex); */
110
if(nextIdx < myGlobals.device[actualDeviceId].actualHashSize)
111
return(__getFirstHost(actualDeviceId, nextIdx, file, line));
122
if(!is_host_ready_to_purge(actualDeviceId, host->next, now)) {
123
releaseMutex(&myGlobals.hostsHashLockMutex);
129
/* No host has been found: move to next bucket */
130
releaseMutex(&myGlobals.hostsHashLockMutex);
131
if(nextIdx < myGlobals.device[actualDeviceId].actualHashSize)
132
return(__getFirstHost(actualDeviceId, nextIdx, file, line));
117
137
/* ************************************ */
972
1071
if((addresses == NULL) || (addresses[0] == '\0'))
975
traceEvent(CONST_TRACE_NOISY,
976
"Processing %s parameter '%s'",
977
flagWhat == CONST_HANDLEADDRESSLISTS_MAIN ? "-m | --local-subnets" :
978
flagWhat == CONST_HANDLEADDRESSLISTS_RRD ? "RRD" :
979
flagWhat == CONST_HANDLEADDRESSLISTS_NETFLOW ? "Netflow white/black list" :
980
flagWhat == CONST_HANDLEADDRESSLISTS_CLUSTERS ? "cluster" : "unknown",
1074
if(0) traceEvent(CONST_TRACE_NOISY,
1075
"Processing %s parameter '%s'",
1076
flagWhat == CONST_HANDLEADDRESSLISTS_MAIN ? "-m | --local-subnets" :
1077
flagWhat == CONST_HANDLEADDRESSLISTS_RRD ? "RRD" :
1078
flagWhat == CONST_HANDLEADDRESSLISTS_NETFLOW ? "Netflow white/black list" :
1079
flagWhat == CONST_HANDLEADDRESSLISTS_CLUSTERS ? "cluster" :
1080
flagWhat == CONST_HANDLEADDRESSLISTS_COMMUNITY ? "community" : "unknown",
983
1083
memset(localAddresses, 0, localAddressesLen);
985
1085
address = strtok_r(addresses, ",", &strtokState);
987
1087
while(address != NULL) {
1088
u_int32_t network, networkMask, broadcast;
1089
int bits, a, b, c, d;
988
1090
char *mask = strchr(address, '/');
990
1092
if(mask == NULL) {
991
if (flagWhat == CONST_HANDLEADDRESSLISTS_MAIN)
992
traceEvent(CONST_TRACE_WARNING, "-m: Empty mask '%s' - ignoring entry", address);
994
u_int32_t network, networkMask, broadcast;
995
int bits, a, b, c, d;
999
bits = dotted2bits (mask);
1001
if(sscanf(address, "%d.%d.%d.%d", &a, &b, &c, &d) != 4) {
1002
traceEvent(CONST_TRACE_WARNING, "%s: Bad format '%s' - ignoring entry",
1003
flagWhat == CONST_HANDLEADDRESSLISTS_MAIN ? "-m" :
1004
flagWhat == CONST_HANDLEADDRESSLISTS_RRD ? "RRD" :
1005
flagWhat == CONST_HANDLEADDRESSLISTS_NETFLOW ? "Netflow" :
1006
flagWhat == CONST_HANDLEADDRESSLISTS_CLUSTERS ? "cluster" : "unknown",
1008
address = strtok_r(NULL, ",", &strtokState);
1012
if(bits == CONST_INVALIDNETMASK) {
1013
/* malformed netmask specification */
1014
traceEvent(CONST_TRACE_WARNING, "%s: Net mask '%s' not valid - ignoring entry",
1015
flagWhat == CONST_HANDLEADDRESSLISTS_MAIN ? "-m | --local-subnets" :
1016
flagWhat == CONST_HANDLEADDRESSLISTS_RRD ? "RRD" :
1017
flagWhat == CONST_HANDLEADDRESSLISTS_NETFLOW ? "Netflow white/black list" :
1018
flagWhat == CONST_HANDLEADDRESSLISTS_CLUSTERS ? "cluster" : "unknown",
1020
address = strtok_r(NULL, ",", &strtokState);
1024
network = ((a & 0xff) << 24) + ((b & 0xff) << 16) + ((c & 0xff) << 8) + (d & 0xff);
1025
/* Special case the /32 mask - yeah, we could probably do it with some fancy
1026
u long long stuff, but this is simpler...
1027
Burton Strauss <Burton@ntopsupport.com> Jun2002
1030
networkMask = 0xffffffff;
1032
networkMask = 0xffffffff >> bits;
1033
networkMask = ~networkMask;
1037
traceEvent(CONST_TRACE_INFO, "DEBUG: Nw=%08X - Mask: %08X [%08X]",
1038
network, networkMask, (network & networkMask));
1041
if((networkMask >= 0xFFFFFF00) /* Courtesy of Roy-Magne Mo <romo@interpost.no> */
1042
&& ((network & networkMask) != network)) {
1043
/* malformed network specification */
1044
traceEvent(CONST_TRACE_WARNING, "%s: %d.%d.%d.%d/%d is not a valid network - correcting mask",
1045
flagWhat == CONST_HANDLEADDRESSLISTS_MAIN ? "-m | --local-subnets" :
1046
flagWhat == CONST_HANDLEADDRESSLISTS_RRD ? "RRD" :
1047
flagWhat == CONST_HANDLEADDRESSLISTS_NETFLOW ? "Netflow white/black list" :
1048
flagWhat == CONST_HANDLEADDRESSLISTS_CLUSTERS ? "cluster" : "unknown",
1051
/* correcting network numbers as specified in the netmask */
1052
network &= networkMask;
1097
bits = dotted2bits(mask);
1100
if(sscanf(address, "%d.%d.%d.%d", &a, &b, &c, &d) != 4) {
1101
traceEvent(CONST_TRACE_WARNING, "%s: Bad format '%s' - ignoring entry",
1102
flagWhat == CONST_HANDLEADDRESSLISTS_MAIN ? "-m" :
1103
flagWhat == CONST_HANDLEADDRESSLISTS_RRD ? "RRD" :
1104
flagWhat == CONST_HANDLEADDRESSLISTS_NETFLOW ? "Netflow" :
1105
flagWhat == CONST_HANDLEADDRESSLISTS_CLUSTERS ? "cluster" :
1106
flagWhat == CONST_HANDLEADDRESSLISTS_COMMUNITY ? "community" : "unknown",
1108
address = strtok_r(NULL, ",", &strtokState);
1112
if(bits == CONST_INVALIDNETMASK) {
1113
/* malformed netmask specification */
1114
traceEvent(CONST_TRACE_WARNING, "%s: Net mask '%s' not valid - ignoring entry",
1115
flagWhat == CONST_HANDLEADDRESSLISTS_MAIN ? "-m | --local-subnets" :
1116
flagWhat == CONST_HANDLEADDRESSLISTS_RRD ? "RRD" :
1117
flagWhat == CONST_HANDLEADDRESSLISTS_NETFLOW ? "Netflow white/black list" :
1118
flagWhat == CONST_HANDLEADDRESSLISTS_CLUSTERS ? "cluster" :
1119
flagWhat == CONST_HANDLEADDRESSLISTS_COMMUNITY ? "community" : "unknown",
1121
address = strtok_r(NULL, ",", &strtokState);
1125
network = ((a & 0xff) << 24) + ((b & 0xff) << 16) + ((c & 0xff) << 8) + (d & 0xff);
1126
/* Special case the /32 mask - yeah, we could probably do it with some fancy
1127
u long long stuff, but this is simpler...
1128
Burton Strauss <Burton@ntopsupport.com> Jun2002
1131
networkMask = 0xffffffff;
1133
networkMask = 0xffffffff >> bits;
1134
networkMask = ~networkMask;
1138
traceEvent(CONST_TRACE_INFO, "DEBUG: Nw=%08X - Mask: %08X [%08X]",
1139
network, networkMask, (network & networkMask));
1142
if((networkMask >= 0xFFFFFF00) /* Courtesy of Roy-Magne Mo <romo@interpost.no> */
1143
&& ((network & networkMask) != network)) {
1144
/* malformed network specification */
1145
traceEvent(CONST_TRACE_WARNING, "%s: %d.%d.%d.%d/%d is not a valid network - correcting mask",
1146
flagWhat == CONST_HANDLEADDRESSLISTS_MAIN ? "-m | --local-subnets" :
1147
flagWhat == CONST_HANDLEADDRESSLISTS_RRD ? "RRD" :
1148
flagWhat == CONST_HANDLEADDRESSLISTS_NETFLOW ? "Netflow white/black list" :
1149
flagWhat == CONST_HANDLEADDRESSLISTS_CLUSTERS ? "cluster" :
1150
flagWhat == CONST_HANDLEADDRESSLISTS_COMMUNITY ? "community" : "unknown",
1153
/* correcting network numbers as specified in the netmask */
1154
network &= networkMask;
1156
a = (int) ((network >> 24) & 0xff);
1157
b = (int) ((network >> 16) & 0xff);
1158
c = (int) ((network >> 8) & 0xff);
1159
d = (int) ((network >> 0) & 0xff);
1161
traceEvent(CONST_TRACE_NOISY, "Assuming %d.%d.%d.%d/%d [0x%08x/0x%08x]",
1162
a, b, c, d, bits, network, networkMask);
1165
traceEvent(CONST_TRACE_INFO, "DEBUG: %d.%d.%d.%d/%d [0x%08x/0x%08x]",
1166
a, b, c, d, bits, network, networkMask);
1169
broadcast = network | (~networkMask);
1172
a = (int) ((broadcast >> 24) & 0xff);
1173
b = (int) ((broadcast >> 16) & 0xff);
1174
c = (int) ((broadcast >> 8) & 0xff);
1175
d = (int) ((broadcast >> 0) & 0xff);
1177
traceEvent(CONST_TRACE_INFO, "DEBUG: Broadcast: [net=0x%08x] [broadcast=%d.%d.%d.%d]",
1178
network, a, b, c, d);
1181
if((*numNetworks) < MAX_NUM_NETWORKS) {
1183
/* If this is the real list, we check against the actual network addresses
1184
* and warn the user of superfluous entries - for the other lists, rrd and netflow
1185
* the local address is valid, it's NOT assumed.
1187
if (flagWhat == CONST_HANDLEADDRESSLISTS_MAIN) {
1188
for(i=0; i<myGlobals.numDevices; i++) {
1189
if((network == myGlobals.device[i].network.s_addr) &&
1190
(myGlobals.device[i].netmask.s_addr == networkMask)) {
1191
a = (int) ((network >> 24) & 0xff);
1192
b = (int) ((network >> 16) & 0xff);
1193
c = (int) ((network >> 8) & 0xff);
1194
d = (int) ((network >> 0) & 0xff);
1196
traceEvent(CONST_TRACE_INFO,
1197
"-m: Discarded unnecessary parameter %d.%d.%d.%d/%d - this is the local network",
1205
theNetworks[(*numNetworks)][CONST_NETWORK_ENTRY] = network;
1206
theNetworks[(*numNetworks)][CONST_NETMASK_ENTRY] = networkMask;
1207
theNetworks[(*numNetworks)][CONST_NETMASK_V6_ENTRY] = bits;
1208
theNetworks[(*numNetworks)][CONST_BROADCAST_ENTRY] = broadcast;
1054
1210
a = (int) ((network >> 24) & 0xff);
1055
1211
b = (int) ((network >> 16) & 0xff);
1056
1212
c = (int) ((network >> 8) & 0xff);
1057
1213
d = (int) ((network >> 0) & 0xff);
1059
traceEvent(CONST_TRACE_NOISY, "Assuming %d.%d.%d.%d/%d [0x%08x/0x%08x]",
1060
a, b, c, d, bits, network, networkMask);
1063
traceEvent(CONST_TRACE_INFO, "DEBUG: %d.%d.%d.%d/%d [0x%08x/0x%08x]",
1064
a, b, c, d, bits, network, networkMask);
1067
broadcast = network | (~networkMask);
1070
a = (int) ((broadcast >> 24) & 0xff);
1071
b = (int) ((broadcast >> 16) & 0xff);
1072
c = (int) ((broadcast >> 8) & 0xff);
1073
d = (int) ((broadcast >> 0) & 0xff);
1075
traceEvent(CONST_TRACE_INFO, "DEBUG: Broadcast: [net=0x%08x] [broadcast=%d.%d.%d.%d]",
1076
network, a, b, c, d);
1079
if((*numNetworks) < MAX_NUM_NETWORKS) {
1081
/* If this is the real list, we check against the actual network addresses
1082
* and warn the user of superfluous entries - for the other lists, rrd and netflow
1083
* the local address is valid, it's NOT assumed.
1085
if (flagWhat == CONST_HANDLEADDRESSLISTS_MAIN) {
1086
for(i=0; i<myGlobals.numDevices; i++) {
1087
if((network == myGlobals.device[i].network.s_addr) &&
1088
(myGlobals.device[i].netmask.s_addr == networkMask)) {
1089
a = (int) ((network >> 24) & 0xff);
1090
b = (int) ((network >> 16) & 0xff);
1091
c = (int) ((network >> 8) & 0xff);
1092
d = (int) ((network >> 0) & 0xff);
1094
traceEvent(CONST_TRACE_INFO,
1095
"-m: Discarded unnecessary parameter %d.%d.%d.%d/%d - this is the local network",
1103
theNetworks[(*numNetworks)][CONST_NETWORK_ENTRY] = network;
1104
theNetworks[(*numNetworks)][CONST_NETMASK_ENTRY] = networkMask;
1105
theNetworks[(*numNetworks)][CONST_BROADCAST_ENTRY] = broadcast;
1107
a = (int) ((network >> 24) & 0xff);
1108
b = (int) ((network >> 16) & 0xff);
1109
c = (int) ((network >> 8) & 0xff);
1110
d = (int) ((network >> 0) & 0xff);
1112
laBufferUsed = safe_snprintf(__FILE__, __LINE__, &localAddresses[laBufferPosition],
1115
(*numNetworks) == 0 ? "" : ", ",
1118
if(laBufferUsed > 0) {
1119
laBufferPosition += laBufferUsed;
1120
localAddressesLen -= laBufferUsed;
1127
a = (int) ((network >> 24) & 0xff);
1128
b = (int) ((network >> 16) & 0xff);
1129
c = (int) ((network >> 8) & 0xff);
1130
d = (int) ((network >> 0) & 0xff);
1132
traceEvent(CONST_TRACE_ERROR, "%s: %d.%d.%d.%d/%d - Too many networks (limit %d) - discarded",
1133
flagWhat == CONST_HANDLEADDRESSLISTS_MAIN ? "-m" :
1134
flagWhat == CONST_HANDLEADDRESSLISTS_RRD ? "RRD" :
1135
flagWhat == CONST_HANDLEADDRESSLISTS_NETFLOW ? "Netflow" :
1136
flagWhat == CONST_HANDLEADDRESSLISTS_CLUSTERS ? "cluster" : "unknown",
1215
laBufferUsed = safe_snprintf(__FILE__, __LINE__,
1216
&localAddresses[laBufferPosition],
1219
(*numNetworks) == 0 ? "" : ", ",
1222
if(laBufferUsed > 0) {
1223
laBufferPosition += laBufferUsed;
1224
localAddressesLen -= laBufferUsed;
1231
a = (int) ((network >> 24) & 0xff);
1232
b = (int) ((network >> 16) & 0xff);
1233
c = (int) ((network >> 8) & 0xff);
1234
d = (int) ((network >> 0) & 0xff);
1236
traceEvent(CONST_TRACE_ERROR,
1237
"%s: %d.%d.%d.%d/%d - Too many networks (limit %d) - discarded",
1238
flagWhat == CONST_HANDLEADDRESSLISTS_MAIN ? "-m" :
1239
flagWhat == CONST_HANDLEADDRESSLISTS_RRD ? "RRD" :
1240
flagWhat == CONST_HANDLEADDRESSLISTS_NETFLOW ? "Netflow" :
1241
flagWhat == CONST_HANDLEADDRESSLISTS_CLUSTERS ? "cluster" :
1242
flagWhat == CONST_HANDLEADDRESSLISTS_COMMUNITY ? "community" : "unknown",
1142
1247
address = strtok_r(NULL, ",", &strtokState);
1347
1483
/*************************************/
1349
unsigned short deviceLocalAddress(HostAddr *addr, u_int deviceId) {
1350
switch(addr->hostFamily) {
1352
return (in_deviceLocalAddress(&addr->Ip4Address, deviceId));
1355
return (in6_deviceLocalAddress(&addr->Ip6Address, deviceId));
1361
/* ********************************* */
1363
unsigned short isPseudoLocalAddress(HostAddr *addr, u_int deviceId) {
1364
switch(addr->hostFamily) {
1366
return (in_isPseudoLocalAddress(&addr->Ip4Address, deviceId));
1369
return (in6_isPseudoLocalAddress(&addr->Ip6Address, deviceId));
1375
/* ********************************* */
1377
unsigned short isPseudoBroadcastAddress(HostAddr *addr) {
1378
switch(addr->hostFamily) {
1380
return (in_isPseudoBroadcastAddress(&addr->Ip4Address));
1485
unsigned short deviceLocalAddress(HostAddr *addr, u_int deviceId,
1486
u_int32_t *the_local_network,
1487
u_int32_t *the_local_network_mask) {
1488
switch(addr->hostFamily) {
1490
return (in_deviceLocalAddress(&addr->Ip4Address, deviceId, the_local_network, the_local_network_mask));
1493
return (in6_deviceLocalAddress(&addr->Ip6Address, deviceId, NULL, NULL));
1499
/* ********************************* */
1501
unsigned short isPseudoLocalAddress(HostAddr *addr, u_int deviceId,
1502
u_int32_t *the_local_network,
1503
u_int32_t *the_local_network_mask) {
1505
if(the_local_network && the_local_network_mask)
1506
(*the_local_network) = 0, (*the_local_network_mask) = 0;
1508
switch(addr->hostFamily) {
1510
return (in_isPseudoLocalAddress(&addr->Ip4Address, deviceId, the_local_network, the_local_network_mask));
1513
return (in6_isPseudoLocalAddress(&addr->Ip6Address, deviceId, NULL, NULL));
1519
/* ********************************* */
1521
unsigned short isPseudoBroadcastAddress(HostAddr *addr,
1522
u_int32_t *the_local_network,
1523
u_int32_t *the_local_network_mask) {
1524
switch(addr->hostFamily) {
1526
return (in_isPseudoBroadcastAddress(&addr->Ip4Address, the_local_network, the_local_network_mask));