static int iprange_net6_collision(const void *p, const void *q) { const struct iprange_net6 *a = p, *b = q; g_warning("iprange_sync(): %s/%u overlaps with %s/%u", ipv6_to_string(a->ip), a->bits, ipv6_to_string2(b->ip), b->bits); return CMP(b->bits, a->bits); /* Reversed comparison */ }
static int iprange_net6_collision(const void *p, const void *q) { const struct iprange_net6 *a = p, *b = q; g_warning("iprange_sync(): %s/%u overlaps with %s/%u", ipv6_to_string(a->ip), a->bits, ipv6_to_string2(b->ip), b->bits); return a->bits < b->bits ? 1 : -1; }
/** * Parse an IPv6 Geo IP line and record the range in the database. */ static void gip_parse_ipv6(const char *line, int linenum) { const char *end; uint16 code; int error; uint8 ip[16]; unsigned bits; /* * Each line looks like: * * 2a03:be00::/32 nl * * The leading part up to the space is the IPv6 network in CIDR format. * The trailing word is the 2-letter ISO country code. */ if (!parse_ipv6_addr(line, ip, &end)) { g_warning("%s, line %d: bad IPv6 network address \"%s\"", gip_source[GIP_IPV6].file, linenum, line); return; } if ('/' != *end) { g_warning("%s, line %d: missing network separator in \"%s\"", gip_source[GIP_IPV6].file, linenum, line); return; } bits = parse_uint(end + 1, &end, 10, &error); if (error) { g_warning("%s, line %d: cannot parse network bit amount in \"%s\"", gip_source[GIP_IPV6].file, linenum, line); return; } if (bits > 128) { g_warning("%s, line %d: invalid bit amount %u in \"%s\"", gip_source[GIP_IPV6].file, linenum, bits, line); return; } if (!is_ascii_space(*end)) { g_warning("%s, line %d: missing spaces after network in \"%s\"", gip_source[GIP_IPV6].file, linenum, line); return; } while (is_ascii_space(*end)) end++; if ('\0' == *end) { g_warning("%s, line %d: missing country code in \"%s\"", gip_source[GIP_IPV6].file, linenum, line); return; } code = iso3166_encode_cc(end); if (ISO3166_INVALID == code) { g_warning("%s, line %d: bad country code in \"%s\"", gip_source[GIP_IPV6].file, linenum, line); return; } error = iprange_add_cidr6(geo_db, ip, bits, (code + 1) << 1); if (IPR_ERR_OK != error) { g_warning("%s, line %d: cannot insert %s/%u: %s", gip_source[GIP_IPV6].file, linenum, ipv6_to_string(ip), bits, iprange_strerror(error)); } }