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:
parent
f7f3667bcb
commit
84902d0e00
3 changed files with 48 additions and 0 deletions
|
@ -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
43
util.c
|
@ -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
2
util.h
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue