if (prefix == 0)
return 1;
+ // For IPv4-mapped addresses the prefix has to be 96 or lager
+ if (IN6_IS_ADDR_V4MAPPED(address) && prefix <= 96)
+ return 1;
+
return 0;
}
if (prefix) {
// Parse the address
r = parse_address(ctx, address_string, &start_address);
+
+ // Map the prefix to IPv6 if needed
+ if (IN6_IS_ADDR_V4MAPPED(&start_address))
+ prefix += 96;
}
}
if (!string)
return NULL;
+ unsigned int prefix = network->prefix;
+
int family = loc_network_address_family(network);
switch (family) {
case AF_INET6:
case AF_INET:
r = format_ipv4_address(network, string, length);
+ prefix -= 96;
break;
default:
}
// Append prefix
- sprintf(string + strlen(string), "/%u", network->prefix);
+ sprintf(string + strlen(string), "/%u", prefix);
return string;
}