addressing: introduce identifiers for unresolved addresses

Add a new type of address for NTP sources that don't have a resolved
address yet. This will allow the sources to be displayed, modified and
deleted by chronyc.

Update utility functions to support the new addresses.
This commit is contained in:
Miroslav Lichvar 2020-02-18 10:35:41 +01:00
parent f7f3667bcb
commit 84902d0e00
3 changed files with 48 additions and 0 deletions

View file

@ -30,16 +30,19 @@
#include "sysincl.h" #include "sysincl.h"
/* This type is used to represent an IPv4 address or IPv6 address. /* 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. */ All parts are in HOST order, NOT network order. */
#define IPADDR_UNSPEC 0 #define IPADDR_UNSPEC 0
#define IPADDR_INET4 1 #define IPADDR_INET4 1
#define IPADDR_INET6 2 #define IPADDR_INET6 2
#define IPADDR_ID 3
typedef struct { typedef struct {
union { union {
uint32_t in4; uint32_t in4;
uint8_t in6[16]; uint8_t in6[16];
uint32_t id;
} addr; } addr;
uint16_t family; uint16_t family;
uint16_t _pad; uint16_t _pad;

43
util.c
View file

@ -311,6 +311,9 @@ UTI_IPToString(IPAddr *addr)
(unsigned int)(ip6[2 * a] << 8 | ip6[2 * a + 1])); (unsigned int)(ip6[2 * a] << 8 | ip6[2 * a + 1]));
#endif #endif
break; break;
case IPADDR_ID:
snprintf(result, BUFFER_LENGTH, "ID#%010"PRIu32, addr->addr.id);
break;
default: default:
snprintf(result, BUFFER_LENGTH, "[UNKNOWN]"); 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 uint32_t
UTI_IPToRefid(IPAddr *ip) UTI_IPToRefid(IPAddr *ip)
{ {
@ -399,6 +430,10 @@ UTI_IPToHash(IPAddr *ip)
addr = ip->addr.in6; addr = ip->addr.in6;
len = sizeof (ip->addr.in6); len = sizeof (ip->addr.in6);
break; break;
case IPADDR_ID:
addr = (unsigned char *)&ip->addr.id;
len = sizeof (ip->addr.id);
break;
default: default:
return 0; return 0;
} }
@ -431,6 +466,9 @@ UTI_IPHostToNetwork(IPAddr *src, IPAddr *dest)
case IPADDR_INET6: case IPADDR_INET6:
memcpy(dest->addr.in6, src->addr.in6, sizeof (dest->addr.in6)); memcpy(dest->addr.in6, src->addr.in6, sizeof (dest->addr.in6));
break; break;
case IPADDR_ID:
dest->addr.id = htonl(src->addr.id);
break;
default: default:
dest->family = htons(IPADDR_UNSPEC); dest->family = htons(IPADDR_UNSPEC);
} }
@ -451,6 +489,9 @@ UTI_IPNetworkToHost(IPAddr *src, IPAddr *dest)
case IPADDR_INET6: case IPADDR_INET6:
memcpy(dest->addr.in6, src->addr.in6, sizeof (dest->addr.in6)); memcpy(dest->addr.in6, src->addr.in6, sizeof (dest->addr.in6));
break; break;
case IPADDR_ID:
dest->addr.id = ntohl(src->addr.id);
break;
default: default:
dest->family = IPADDR_UNSPEC; 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]; d = a->addr.in6[i] - b->addr.in6[i];
} }
return d; return d;
case IPADDR_ID:
return a->addr.id - b->addr.id;
} }
return 0; return 0;
} }

2
util.h
View file

@ -104,6 +104,8 @@ extern char *UTI_RefidToString(uint32_t ref_id);
extern char *UTI_IPToString(IPAddr *ip); extern char *UTI_IPToString(IPAddr *ip);
extern int UTI_StringToIP(const char *addr, 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_IPToRefid(IPAddr *ip);
extern uint32_t UTI_IPToHash(IPAddr *ip); extern uint32_t UTI_IPToHash(IPAddr *ip);
extern void UTI_IPHostToNetwork(IPAddr *src, IPAddr *dest); extern void UTI_IPHostToNetwork(IPAddr *src, IPAddr *dest);