diff --git a/addressing.h b/addressing.h index 9e88043..3e311fa 100644 --- a/addressing.h +++ b/addressing.h @@ -30,16 +30,19 @@ #include "sysincl.h" /* This type is used to represent an IPv4 address or IPv6 address. + Addresses which are not resolved yet can be represented with an ID. All parts are in HOST order, NOT network order. */ #define IPADDR_UNSPEC 0 #define IPADDR_INET4 1 #define IPADDR_INET6 2 +#define IPADDR_ID 3 typedef struct { union { uint32_t in4; uint8_t in6[16]; + uint32_t id; } addr; uint16_t family; uint16_t _pad; diff --git a/util.c b/util.c index 0758fb6..0e605ac 100644 --- a/util.c +++ b/util.c @@ -311,6 +311,9 @@ UTI_IPToString(IPAddr *addr) (unsigned int)(ip6[2 * a] << 8 | ip6[2 * a + 1])); #endif break; + case IPADDR_ID: + snprintf(result, BUFFER_LENGTH, "ID#%010"PRIu32, addr->addr.id); + break; default: snprintf(result, BUFFER_LENGTH, "[UNKNOWN]"); } @@ -357,6 +360,34 @@ UTI_StringToIP(const char *addr, IPAddr *ip) /* ================================================== */ +int +UTI_StringToIdIP(const char *addr, IPAddr *ip) +{ + if (sscanf(addr, "ID#%"SCNu32, &ip->addr.id) == 1) { + ip->family = IPADDR_ID; + ip->_pad = 0; + return 1; + } + + return 0; +} + +/* ================================================== */ + +int +UTI_IsIPReal(IPAddr *ip) +{ + switch (ip->family) { + case IPADDR_INET4: + case IPADDR_INET6: + return 1; + default: + return 0; + } +} + +/* ================================================== */ + uint32_t UTI_IPToRefid(IPAddr *ip) { @@ -399,6 +430,10 @@ UTI_IPToHash(IPAddr *ip) addr = ip->addr.in6; len = sizeof (ip->addr.in6); break; + case IPADDR_ID: + addr = (unsigned char *)&ip->addr.id; + len = sizeof (ip->addr.id); + break; default: return 0; } @@ -431,6 +466,9 @@ UTI_IPHostToNetwork(IPAddr *src, IPAddr *dest) case IPADDR_INET6: memcpy(dest->addr.in6, src->addr.in6, sizeof (dest->addr.in6)); break; + case IPADDR_ID: + dest->addr.id = htonl(src->addr.id); + break; default: dest->family = htons(IPADDR_UNSPEC); } @@ -451,6 +489,9 @@ UTI_IPNetworkToHost(IPAddr *src, IPAddr *dest) case IPADDR_INET6: memcpy(dest->addr.in6, src->addr.in6, sizeof (dest->addr.in6)); break; + case IPADDR_ID: + dest->addr.id = ntohl(src->addr.id); + break; default: dest->family = IPADDR_UNSPEC; } @@ -486,6 +527,8 @@ UTI_CompareIPs(IPAddr *a, IPAddr *b, IPAddr *mask) d = a->addr.in6[i] - b->addr.in6[i]; } return d; + case IPADDR_ID: + return a->addr.id - b->addr.id; } return 0; } diff --git a/util.h b/util.h index 39d6cd7..f0cc141 100644 --- a/util.h +++ b/util.h @@ -104,6 +104,8 @@ extern char *UTI_RefidToString(uint32_t ref_id); extern char *UTI_IPToString(IPAddr *ip); extern int UTI_StringToIP(const char *addr, IPAddr *ip); +extern int UTI_StringToIdIP(const char *addr, IPAddr *ip); +extern int UTI_IsIPReal(IPAddr *ip); extern uint32_t UTI_IPToRefid(IPAddr *ip); extern uint32_t UTI_IPToHash(IPAddr *ip); extern void UTI_IPHostToNetwork(IPAddr *src, IPAddr *dest);