Exemple #1
0
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;
}
Exemple #2
0
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
}
Exemple #3
0
/* 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, ",");
  }
}