int16_t AddressTree::addAddress(char *_net) { patricia_node_t *node; char *net; /*树中最大的地址个数为CONST_MAX_NUM_NETWORKS(255)*/ if(numAddresses >= CONST_MAX_NUM_NETWORKS) { ntop->getTrace()->traceEvent(TRACE_ERROR, "Too many networks defined: ignored %s", _net); return -1; } /*创建并复制一份_net*/ if((net = strdup(_net)) == NULL) { ntop->getTrace()->traceEvent(TRACE_WARNING, "Not enough memory"); return -1; } /*将net中的ip地址和掩码赋值到ptree中*/ node = ptree_add_rule(ptree, net); free(net); if(node) { node->user_data = numAddresses; addressString[numAddresses++] = strdup(_net); return node->user_data; } return -1; }
void Ntop::loadLocalInterfaceAddress() { #ifndef WIN32 struct ifaddrs *local_addresses, *ifa; /* buf must be big enough for an IPv6 address(e.g. 3ffe:2fa0:1010:ca22:020a:95ff:fe8a:1cf8) */ char buf[128], buf2[128]; if(getifaddrs(&local_addresses) != 0) { ntop->getTrace()->traceEvent(TRACE_ERROR, "Unable to read interface addresses"); return; } for(ifa = local_addresses; ifa != NULL; ifa = ifa->ifa_next) { if((ifa->ifa_addr == NULL) || ((ifa->ifa_flags & IFF_UP) == 0)) continue; if(ifa->ifa_addr->sa_family == AF_INET) { struct sockaddr_in* s4 =(struct sockaddr_in *)(ifa->ifa_addr); if(inet_ntop(ifa->ifa_addr->sa_family,(void *)&(s4->sin_addr), buf, sizeof(buf)) != NULL) { int l = strlen(buf); snprintf(&buf[l], sizeof(buf)-l, "%s", "/32"); ntop->getTrace()->traceEvent(TRACE_INFO, "Adding %s as IPv4 interface address", buf); strcpy(buf2, buf); ptree_add_rule(local_interface_addresses, buf); address->addLocalNetwork(buf2); } } else if(ifa->ifa_addr->sa_family == AF_INET6) { struct sockaddr_in6 *s6 =(struct sockaddr_in6 *)(ifa->ifa_addr); if(inet_ntop(ifa->ifa_addr->sa_family,(void *)&(s6->sin6_addr), buf, sizeof(buf)) != NULL) { int l = strlen(buf); snprintf(&buf[l], sizeof(buf)-l, "%s", "/128"); ntop->getTrace()->traceEvent(TRACE_INFO, "Adding %s as IPv6 interface address", buf); strcpy(buf2, buf); ptree_add_rule(local_interface_addresses, buf); address->addLocalNetwork(buf2); } } } freeifaddrs(local_addresses); #endif }
/* Format: 131.114.21.0/24,10.0.0.0/255.0.0.0 */ void AddressResolution::setLocalNetworks(char *rule) { char *net = strtok(rule, ","); while(net != NULL) { ptree_add_rule(ptree, net); net = strtok(NULL, ","); } }