+* Use a union for structs sockaddr, sockaddr_storage, sockaddr_in, and
+ sockaddr_in6 to remove casts and enable type checking. Collapse
+ some previously separate IPv4/IPv6 paths into a single codepath.
* [Bug 1041] xmt -> aorg timestamp cleanup from Dave Mills,
reported by Dave Hart.
* [Bug 1193] Compile error: conflicting types for emalloc.
-* [Bug 1196] VC6 winsock2.h does not define SO_EXLUSIVEADDRUSE.
+* [Bug 1196] VC6 winsock2.h does not define SO_EXCLUSIVEADDRUSE.
* Leap/expire cleanup from Dave Mills.
(4.2.5p178) 2009/05/21 Released by Harlan Stenn <stenn@ntp.org>
* Provide erealloc() and estrdup(), a la emalloc().
int sync_data_suc = 0;
for(c=0; c<resc && !sync_data_suc; c++) {
getnameinfo(resh[c]->ai_addr, resh[c]->ai_addrlen, adr_buf,
- INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+ sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
int kodc;
char *hostname = addrinfo_to_str(resh[c]);
/* FIXME! Modus broadcast + adr. check -> bdr. pkt */
set_li_vn_mode(x_pkt, LEAP_NOTINSYNC, 4, 3);
- create_socket(&sock, (struct sockaddr_storage *)host->ai_addr);
+ create_socket(&sock, (sockaddr_u *)host->ai_addr);
- sendpkt(sock, (struct sockaddr_storage *)host->ai_addr, x_pkt, LEN_PKT_NOMAC);
+ sendpkt(sock, (sockaddr_u *)host->ai_addr, x_pkt, LEN_PKT_NOMAC);
rpktl = recvpkt(sock, r_pkt, x_pkt);
close_socket(sock);
if(ENABLED_OPT(NORMALVERBOSE)) {
getnameinfo(host->ai_addr, host->ai_addrlen, adr_buf,
- INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+ sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
printf("sntp on_wire: Received %i bytes from %s\n", rpktl, adr_buf);
}
}
char logmsg[32 + INET6_ADDRSTRLEN];
- getnameinfo(host->ai_addr, host->ai_addrlen, adr_buf, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+ getnameinfo(host->ai_addr, host->ai_addrlen, adr_buf, sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
snprintf(logmsg, 32 + INET6_ADDRSTRLEN, "Received no useable packet from %s!", adr_buf);
for(dres=*tres[a]; dres; dres=dres->ai_next) {
entryc++;
#ifdef DEBUG
- getnameinfo(dres->ai_addr, dres->ai_addrlen, adr_buf, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+ getnameinfo(dres->ai_addr, dres->ai_addrlen, adr_buf, sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
STDLINE
printf("Resolv No.: %i Result of getaddrinfo for %s:\n", entryc, hosts[a]);
printf("socktype: %i ", dres->ai_socktype);
#ifdef DEBUG
for(a=0; a<entryc; a++)
- getnameinfo(result[a]->ai_addr, result[a]->ai_addrlen, adr_buf, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+ getnameinfo(result[a]->ai_addr, result[a]->ai_addrlen, adr_buf, sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
printf("%x: IP %s\n", (unsigned int) result[a], adr_buf);
#endif
void
create_socket (
SOCKET *rsock,
- struct sockaddr_storage *dest
+ sockaddr_u *dest
)
{
- *rsock = socket(dest->ss_family, SOCK_DGRAM, 0);
+ *rsock = socket(AF(dest), SOCK_DGRAM, 0);
- if(*rsock == -1)
- if(ENABLED_OPT(NORMALVERBOSE))
- printf("Failed to create UDP socket with family %i\n", dest->ss_family);
-
-}
-
-/* If there's nothing more to do here we might need this function
- * Originally I thought about doing some broad-/multicast related
- * cleaning up here.
- */
-void
-close_socket (
- SOCKET rsock
- )
-{
- close(rsock);
+ if (-1 == *rsock && ENABLED_OPT(NORMALVERBOSE))
+ printf("Failed to create UDP socket with family %d\n", AF(dest));
}
/* Send a packet */
void
sendpkt (
SOCKET rsock,
- struct sockaddr_storage *dest,
+ sockaddr_u *dest,
struct pkt *pkt,
int len
)
#endif
if(ENABLED_OPT(NORMALVERBOSE)) {
- getnameinfo((struct sockaddr *) dest, SOCKLEN(dest), adr_buf, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+ getnameinfo(&dest->sa, SOCKLEN(dest), adr_buf, sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
printf("sntp sendpkt: Sending packet to %s... ", adr_buf);
}
- int cc = sendto(rsock, (char *)pkt, len, 0, (struct sockaddr *)dest, SOCKLEN(dest));
+ int cc = sendto(rsock, (char *)pkt, len, 0, &dest->sa, SOCKLEN(dest));
if (cc == SOCKET_ERROR) {
#ifdef DEBUG
int
recvdata (
SOCKET rsock,
- struct sockaddr_storage *sender,
+ sockaddr_u *sender,
char *rdata,
int rdata_length
)
{
- GETSOCKNAME_SOCKLEN_TYPE slen = SOCKLEN(&rsock);
+ GETSOCKNAME_SOCKLEN_TYPE slen;
+ int recvc;
+ int saved_errno;
#ifdef DEBUG
printf("sntp recvdata: Trying to receive data from...\n");
#endif
-
- int recvc = recvfrom(rsock, rdata, rdata_length, 0,
- (struct sockaddr *) sender, &slen);
-#ifdef DEBUG
- printf("sntp recvdata: recvfrom returned...\n");
-#endif
-
+ slen = sizeof(sender->sas);
+ recvc = recvfrom(rsock, rdata, rdata_length, 0,
+ &sender->sa, &slen);
#ifdef DEBUG
-
- if(recvc > 0) {
- getnameinfo((struct sockaddr *)sender, SOCKLEN(sender), adr_buf, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
-
- printf("Received %i bytes from %s:\n", recvc, adr_buf);
+ if (recvc > 0) {
+ printf("Received %d bytes from %s:\n", recvc, stoa(sender));
pkt_output((struct pkt *) rdata, recvc, stdout);
}
else {
- printf("Failure, recvc: %i\n", recvc);
+ saved_errno = errno;
+ printf("recvfrom error %d (%s)\n", errno, strerror(errno));
+ errno = saved_errno;
}
#endif
SOCKET rsock,
char *rdata,
int rdata_len,
- struct sockaddr_storage *sas,
- struct sockaddr_storage *ras
+ sockaddr_u *sas,
+ sockaddr_u *ras
)
{
struct timeval timeout_tv;
setsockopt(rsock, SOL_SOCKET, SO_REUSEADDR, &btrue, sizeof(btrue));
- if(sas->ss_family == AF_INET) {
+ if (IS_IPV4(sas)) {
struct ip_mreq mdevadr;
- if(bind(rsock, (struct sockaddr *) sas, SOCKLEN(sas)) < 0) {}
+ if (bind(rsock, &sas->sa, SOCKLEN(sas)) < 0) {
+ if (ENABLED_OPT(NORMALVERBOSE))
+ printf("sntp recv_bcst_data: Couldn't bind() address.\n");
+ }
if(setsockopt(rsock, IPPROTO_IP, IP_MULTICAST_LOOP, &btrue, sizeof(btrue)) < 0) {
return BROADCAST_FAILED;
}
- buf = ss_to_str(sas);
-
- mdevadr.imr_multiaddr.s_addr = inet_addr(buf);
+ mdevadr.imr_multiaddr.s_addr = NSRCADR(sas);
mdevadr.imr_interface.s_addr = htonl(INADDR_ANY);
- if(mdevadr.imr_multiaddr.s_addr == -1) {
- if(ENABLED_OPT(NORMALVERBOSE)) {
- printf("sntp recv_bcst_data: %s is not a broad-/multicast address, aborting...\n", buf);
+ if (mdevadr.imr_multiaddr.s_addr == -1) {
+ if (ENABLED_OPT(NORMALVERBOSE)) {
+ printf("sntp recv_bcst_data: %s is not a broad-/multicast address, aborting...\n",
+ stoa(sas));
}
return BROADCAST_FAILED;
}
- free(buf);
-
if (setsockopt(rsock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mdevadr, sizeof(mdevadr)) < 0) {
- if(ENABLED_OPT(NORMALVERBOSE)) {
+ if (ENABLED_OPT(NORMALVERBOSE)) {
buf = ss_to_str(sas);
printf("sntp recv_bcst_data: Couldn't add IP membership for %s\n", buf);
}
}
}
- else if(sas->ss_family == AF_INET6) {
+ else if (IS_IPV6(sas)) {
struct ipv6_mreq mdevadr;
- if(bind(rsock, (struct sockaddr *) sas, sizeof(sas)) < 0) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (bind(rsock, &sas->sa, SOCKLEN(sas)) < 0) {
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recv_bcst_data: Couldn't bind() address.\n");
}
if(setsockopt(rsock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &btrue, sizeof (btrue)) < 0) {
/* some error message regarding setting up multicast loop */
return BROADCAST_FAILED;
- }
+ }
- mdevadr.ipv6mr_multiaddr = *((struct in6_addr *) sas);
+ mdevadr.ipv6mr_multiaddr = SOCK_ADDR6(sas);
/* FIXME hat value for ipv6mr_interface? Use utilities for sock to char op*/
/* mdevadr.ipv6mr_interface = in6addr_any; */
- if(!IN6_IS_ADDR_MULTICAST((struct in6_addr *) &mdevadr.ipv6mr_multiaddr)) {
+ if(!IN6_IS_ADDR_MULTICAST(&mdevadr.ipv6mr_multiaddr)) {
if(ENABLED_OPT(NORMALVERBOSE)) {
buf = ss_to_str(sas);
return BROADCAST_FAILED;
break;
-/* default: */
- GETSOCKNAME_SOCKLEN_TYPE ss_len = SOCKLEN(ras);
+ default:
+ {
+ GETSOCKNAME_SOCKLEN_TYPE ss_len = sizeof(ras->sas);
- recv_bytes = recvfrom(rsock, rdata, rdata_len, 0, (struct sockaddr *) ras, (GETSOCKNAME_SOCKLEN_TYPE *) &ss_len);
+ recv_bytes = recvfrom(rsock, rdata, rdata_len, 0, &ras->sa, &ss_len);
+ }
}
- if(recv_bytes == -1) {
+ if (recv_bytes == -1) {
if(ENABLED_OPT(NORMALVERBOSE))
printf("sntp recv_bcst_data: Failed to receive from broad-/multicast\n");
return BROADCAST_FAILED;
}
- if(sas->ss_family == AF_INET)
+ if (IS_IPV4(sas))
setsockopt(rsock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &btrue, sizeof(btrue));
- else if(sas->ss_family == AF_INET6)
+ else if (IS_IPV6(sas))
setsockopt(rsock, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &btrue, sizeof(btrue));
return recv_bytes;
recv_bcst_pkt (
SOCKET rsock,
struct pkt *rpkt,
- struct sockaddr_storage *sas
+ sockaddr_u *sas
)
{
- struct sockaddr_storage sender;
+ sockaddr_u sender;
register int a;
int is_authentic, has_mac = 0, orig_pkt_len;
- char *rdata = (char *) malloc(sizeof(char) * 256);
+ char *rdata = malloc(sizeof(char) * 256);
int pkt_len = recv_bcst_data(rsock, rdata, 256, sas, &sender);
- if(pkt_len < 0)
+ if (pkt_len < 0)
return BROADCAST_FAILED;
/* No MAC, no authentication */
- if(pkt_len == LEN_PKT_NOMAC)
+ if (LEN_PKT_NOMAC == pkt_len)
has_mac = 0;
/* If there's more than just the NTP packet it should be a MAC */
/* Packet too big */
if(pkt_len > LEN_PKT_NOMAC + MAX_MAC_LEN) {
if(ENABLED_OPT(NORMALVERBOSE))
- printf("sntp recv_bcst_pkt: Received packet is too big (%i bytes), trying again to get a useable packet\n",
+ printf("sntp recv_bcst_pkt: Received packet is too big (%i bytes), trying again to get a useFable packet\n",
pkt_len);
return PACKET_UNUSEABLE;
pkt_len = min(pkt_len, sizeof(struct pkt));
/* Let's copy the received data to the packet structure */
- for(a=0; a<pkt_len; a++)
- if(a < orig_pkt_len)
+ for (a = 0; a < pkt_len; a++)
+ if (a < orig_pkt_len)
((char *)rpkt)[a] = rdata[a];
else
((char *)rpkt)[a] = 0;
free(rdata);
/* MAC could be useable for us */
- if(has_mac) {
+ if (has_mac) {
/* Two more things that the MAC must conform to */
- if(has_mac > MAX_MAC_LEN || has_mac % 4 != 0) {
+ if (has_mac > MAX_MAC_LEN || has_mac % 4 != 0) {
is_authentic = 0; /* Or should we discard this packet? */
}
else {
- if(has_mac == MAX_MAC_LEN) {
+ if (MAX_MAC_LEN == has_mac) {
struct key *pkt_key = NULL;
/* Look for the key used by the server in the specified keyfile
get_key(rpkt->mac[0], &pkt_key);
/* Seems like we've got a key with matching keyid */
- if(pkt_key != NULL) {
+ if (pkt_key != NULL) {
/* Generate a md5sum of the packet with the key from our keyfile
* and compare those md5sums */
- if(!auth_md5((char *) rpkt, has_mac, pkt_key)) {
- if(ENABLED_OPT(AUTHENTICATION)) {
+ if (!auth_md5((char *) rpkt, has_mac, pkt_key)) {
+ if (ENABLED_OPT(AUTHENTICATION)) {
/* We want a authenticated packet */
- if(ENABLED_OPT(NORMALVERBOSE)) {
+ if (ENABLED_OPT(NORMALVERBOSE)) {
char *hostname = ss_to_str(sas);
printf("sntp recv_bcst_pkt: Broadcast packet received from %s is not authentic. Will discard this packet.\n",
hostname);
else {
/* We don't know if the user wanted authentication so let's
* use it anyways */
- if(ENABLED_OPT(NORMALVERBOSE)) {
+ if (ENABLED_OPT(NORMALVERBOSE)) {
char *hostname = ss_to_str(sas);
printf("sntp recv_bcst_pkt: Broadcast packet received from %s is not authentic. Authentication not enforced.\n",
hostname);
}
else {
/* Yay! Things worked out! */
- if(ENABLED_OPT(NORMALVERBOSE)) {
+ if (ENABLED_OPT(NORMALVERBOSE)) {
char *hostname = ss_to_str(sas);
printf("sntp recv_bcst_pkt: Broadcast packet received from %s successfully authenticated using key id %i.\n",
hostname, rpkt->mac[0]);
}
/* Check for server's ntp version */
- if(PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION ||
+ if (PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION ||
PKT_VERSION(rpkt->li_vn_mode) > NTP_VERSION) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recv_bcst_pkt: Packet shows wrong version (%i)\n",
PKT_VERSION(rpkt->li_vn_mode));
}
/* We want a server to sync with */
- if(PKT_MODE(rpkt->li_vn_mode) != MODE_BROADCAST
+ if (PKT_MODE(rpkt->li_vn_mode) != MODE_BROADCAST
&& PKT_MODE(rpkt->li_vn_mode) != MODE_PASSIVE) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recv_bcst_pkt: mode %d stratum %i\n",
PKT_MODE(rpkt->li_vn_mode), rpkt->stratum);
return SERVER_UNUSEABLE;
}
- if(rpkt->stratum == STRATUM_PKT_UNSPEC) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (STRATUM_PKT_UNSPEC == rpkt->stratum) {
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recv_bcst_pkt: Stratum unspecified, going to check for KOD (stratum: %i)\n", rpkt->stratum);
char *ref_char = (char *) &rpkt->refid;
/* If it's a KOD packet we'll just use the KOD information */
- if(ref_char[0] != 'X') {
- if(strncmp(ref_char, "DENY", 4))
+ if (ref_char[0] != 'X') {
+ if (strncmp(ref_char, "DENY", 4))
return KOD_DEMOBILIZE;
- if(strncmp(ref_char, "RSTR", 4))
+ if (strncmp(ref_char, "RSTR", 4))
return KOD_DEMOBILIZE;
- if(strncmp(ref_char, "RATE", 4))
+ if (strncmp(ref_char, "RATE", 4))
return KOD_RATE;
/* There are other interesting kiss codes which might be interesting for authentication */
}
/* If the server is not synced it's not really useable for us */
- if(PKT_LEAP(rpkt->li_vn_mode) == LEAP_NOTINSYNC) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (LEAP_NOTINSYNC == PKT_LEAP(rpkt->li_vn_mode)) {
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("recv_bcst_pkt: Server not in sync, skipping this server\n");
return SERVER_UNUSEABLE;
struct pkt *spkt
)
{
- struct sockaddr_storage sender;
- char *rdata, done;
+ sockaddr_u sender;
+ char *rdata /* , done */;
register int a;
int has_mac, is_authentic, orig_pkt_len;
/* Much space, just to be sure */
- rdata = (char *) malloc(sizeof(char) * 256);
+ rdata = malloc(sizeof(char) * 256);
int pkt_len = recvdata(rsock, &sender, rdata, 256);
- if(!done) {
+#if 0 /* done uninitialized */
+ if (!done) {
/* Do something about it, first check for a maximum length of ntp packets,
* probably that's something we can avoid
*/
}
+#endif
/* Some checks to see if that packet is intended for us */
/* No MAC, no authentication */
- if(pkt_len == LEN_PKT_NOMAC)
+ if (LEN_PKT_NOMAC == pkt_len)
has_mac = 0;
/* If there's more than just the NTP packet it should be a MAC */
- else if(pkt_len > LEN_PKT_NOMAC)
+ else if (pkt_len > LEN_PKT_NOMAC)
has_mac = pkt_len - LEN_PKT_NOMAC;
else {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recvpkt: Funny packet length: %i. Discarding package.\n", pkt_len);
return PACKET_UNUSEABLE;
}
/* Packet too big */
- if(pkt_len > LEN_PKT_MAC) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (pkt_len > LEN_PKT_MAC) {
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recvpkt: Received packet is too big (%i bytes), trying again to get a useable packet\n",
pkt_len);
orig_pkt_len = pkt_len;
pkt_len = min(pkt_len, sizeof(struct pkt));
- for(a=0; a<pkt_len; a++)
+ for (a = 0; a < pkt_len; a++)
/* FIXME! */
- if(a < orig_pkt_len)
+ if (a < orig_pkt_len)
((char *) rpkt)[a] = rdata[a];
else
((char *) rpkt)[a] = 0;
/* MAC could be useable for us */
- if(has_mac) {
+ if (has_mac) {
/* Two more things that the MAC must conform to */
if(has_mac > MAX_MAC_LEN || has_mac % 4 != 0) {
is_authentic = 0; /* Or should we discard this packet? */
}
- else {
- if(has_mac == MAX_MAC_LEN) {
+ else {
+ if (MAX_MAC_LEN == has_mac) {
struct key *pkt_key = NULL;
/*
get_key(rpkt->mac[0], &pkt_key);
/* Seems like we've got a key with matching keyid */
- if(pkt_key != NULL) {
+ if (pkt_key != NULL) {
/*
* Generate a md5sum of the packet with the key from our keyfile
* and compare those md5sums
*/
- if(!auth_md5((char *) rpkt, has_mac, pkt_key)) {
- if(ENABLED_OPT(AUTHENTICATION)) {
+ if (!auth_md5((char *) rpkt, has_mac, pkt_key)) {
+ if (ENABLED_OPT(AUTHENTICATION)) {
/* We want a authenticated packet */
- if(ENABLED_OPT(NORMALVERBOSE)) {
+ if (ENABLED_OPT(NORMALVERBOSE)) {
char *hostname = ss_to_str(&sender);
printf("sntp recvpkt: Broadcast packet received from %s is not authentic. Will discard this packet.\n",
hostname);
* We don't know if the user wanted authentication so let's
* use it anyways
*/
- if(ENABLED_OPT(NORMALVERBOSE)) {
+ if (ENABLED_OPT(NORMALVERBOSE)) {
char *hostname = ss_to_str(&sender);
printf("sntp recvpkt: Broadcast packet received from %s is not authentic. Authentication not enforced.\n",
hostname);
}
else {
/* Yay! Things worked out! */
- if(ENABLED_OPT(NORMALVERBOSE)) {
+ if (ENABLED_OPT(NORMALVERBOSE)) {
char *hostname = ss_to_str(&sender);
printf("sntp recvpkt: Broadcast packet received from %s successfully authenticated using key id %i.\n",
hostname, rpkt->mac[0]);
}
/* Check for server's ntp version */
- if(PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION ||
- PKT_VERSION(rpkt->li_vn_mode) > NTP_VERSION) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION ||
+ PKT_VERSION(rpkt->li_vn_mode) > NTP_VERSION) {
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recvpkt: Packet got wrong version (%i)\n", PKT_VERSION(rpkt->li_vn_mode));
return SERVER_UNUSEABLE;
}
/* We want a server to sync with */
- if(PKT_MODE(rpkt->li_vn_mode) != MODE_SERVER
- && PKT_MODE(rpkt->li_vn_mode) != MODE_PASSIVE) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (PKT_MODE(rpkt->li_vn_mode) != MODE_SERVER &&
+ PKT_MODE(rpkt->li_vn_mode) != MODE_PASSIVE) {
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recvpkt: mode %d stratum %i\n",
PKT_MODE(rpkt->li_vn_mode), rpkt->stratum);
}
/* Stratum is unspecified (0) check what's going on */
- if(rpkt->stratum == STRATUM_PKT_UNSPEC) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (STRATUM_PKT_UNSPEC == rpkt->stratum) {
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recvpkt: Stratum unspecified, going to check for KOD (stratum: %i)\n", rpkt->stratum);
char *ref_char = (char *) &rpkt->refid;
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recvpkt: Packet refid: %c%c%c%c\n", ref_char[0], ref_char[1], ref_char[2], ref_char[3]);
/* If it's a KOD packet we'll just use the KOD information */
- if(ref_char[0] != 'X') {
- if(!strncmp(ref_char, "DENY", 4))
+ if (ref_char[0] != 'X') {
+ if (!strncmp(ref_char, "DENY", 4))
return KOD_DEMOBILIZE;
- if(!strncmp(ref_char, "RSTR", 4))
+ if (!strncmp(ref_char, "RSTR", 4))
return KOD_DEMOBILIZE;
- if(!strncmp(ref_char, "RATE", 4))
+ if (!strncmp(ref_char, "RATE", 4))
return KOD_RATE;
/* There are other interesting kiss codes which might be interesting for authentication */
}
/* If the server is not synced it's not really useable for us */
- if(PKT_LEAP(rpkt->li_vn_mode) == LEAP_NOTINSYNC) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (LEAP_NOTINSYNC == PKT_LEAP(rpkt->li_vn_mode)) {
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recvpkt: Server not in sync, skipping this server\n");
return SERVER_UNUSEABLE;
#endif
if (!L_ISEQU(&rpkt->org, &spkt->xmt)) {
- if(ENABLED_OPT(NORMALVERBOSE))
+ if (ENABLED_OPT(NORMALVERBOSE))
printf("sntp recvpkt: pkt.org and peer.xmt differ\n");
return PACKET_UNUSEABLE;
sockfd = socket(dst->ai_family, SOCK_DGRAM, 0);
- if (sockfd == -1) {
+ if (-1 == sockfd) {
#ifdef DEBUG
printf("is_reachable: Couldn't create socket\n");
#endif
return 0;
}
- if(connect(sockfd, dst->ai_addr, SOCKLEN(dst->ai_addr))) {
+ if (connect(sockfd, dst->ai_addr, SOCKLEN((sockaddr_u *)dst->ai_addr))) {
closesocket(sockfd);
return 0;
}
int resolve_hosts (char **hosts, int hostc, struct addrinfo **res, int pref_family);
-void create_socket (SOCKET *rsock, struct sockaddr_storage *dest);
+void create_socket (SOCKET *rsock, sockaddr_u *dest);
-void close_socket (SOCKET rsock);
+void sendpkt (SOCKET rsock, sockaddr_u *dest, struct pkt *pkt, int len);
-void sendpkt (SOCKET rsock, struct sockaddr_storage *dest, struct pkt *pkt, int len);
-
-int recvdata (SOCKET rsock, struct sockaddr_storage *sender, char *rdata, int rdata_len);
+int recvdata (SOCKET rsock, sockaddr_u *sender, char *rdata, int rdata_len);
int recvpkt (SOCKET rsock, struct pkt *rpkt, struct pkt *spkt);
-int recv_bcst_data (SOCKET rsock, char *rdata, int rdata_len, struct sockaddr_storage *sas, struct sockaddr_storage *ras);
+int recv_bcst_data (SOCKET rsock, char *rdata, int rdata_len, sockaddr_u *sas, sockaddr_u *ras);
-int recv_bcst_pkt (SOCKET rsock, struct pkt *rpkt, struct sockaddr_storage *sas);
+int recv_bcst_pkt (SOCKET rsock, struct pkt *rpkt, sockaddr_u *sas);
/* Shortened peer structure. Not absolutely necessary yet */
struct speer {
struct speer *next;
- struct sockaddr_storage srcadr;
+ sockaddr_u srcadr;
u_char version;
u_char hmode;
u_char hpoll;
return buf;
}
-/* Convert a struct sockaddr_storage to a string containing the address in
+/* Convert a sockaddr_u to a string containing the address in
* style of inet_ntoa
+ * Why not switch callers to use stoa from libntp? No free() needed
+ * in that case.
*/
char *
ss_to_str (
- struct sockaddr_storage *saddr
+ sockaddr_u *saddr
)
{
char *buf = (char *) malloc(sizeof(char) * INET6_ADDRSTRLEN);
- getnameinfo((struct sockaddr *) saddr, SOCKLEN(saddr), buf,
+ getnameinfo(&saddr->sa, SOCKLEN(saddr), buf,
INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
void l_fp_output_dec (l_fp *ts, FILE *output);
char *addrinfo_to_str (struct addrinfo *addr);
-char *ss_to_str (struct sockaddr_storage *saddr);
+char *ss_to_str (sockaddr_u *saddr);
char *tv_to_str (struct timeval *tv);
#endif
#include "ntp_refclock.h"
#if defined(HAVE_SIGNALED_IO)
-extern void block_sigio (void);
-extern void unblock_sigio (void);
-extern int init_clock_sig (struct refclockio *);
-extern void init_socket_sig (int);
-extern void set_signal (void);
-RETSIGTYPE sigio_handler (int);
+extern void block_sigio (void);
+extern void unblock_sigio (void);
+extern int init_clock_sig (struct refclockio *);
+extern void init_socket_sig (int);
+extern void set_signal (void);
+RETSIGTYPE sigio_handler (int);
-# define BLOCKIO() ((void) block_sigio())
-# define UNBLOCKIO() ((void) unblock_sigio())
+# define BLOCKIO() block_sigio()
+# define UNBLOCKIO() unblock_sigio()
#else
#define EVENT_TIMEOUT 0 /* one second, that is */
+
/*
* The interface structure is used to hold the addresses and socket
* numbers of each of the interfaces we are using.
struct interface {
SOCKET fd; /* socket this is opened on */
SOCKET bfd; /* socket for receiving broadcasts */
- struct sockaddr_storage sin; /* interface address */
- struct sockaddr_storage bcast; /* broadcast address */
- struct sockaddr_storage mask; /* interface mask */
+ sockaddr_u sin; /* interface address */
+ sockaddr_u bcast; /* broadcast address */
+ sockaddr_u mask; /* interface mask */
char name[32]; /* name of interface */
- short family; /* Address family */
+ u_short family; /* Address family */
+ u_short phase; /* phase in update cycle */
int flags; /* interface flags */
int last_ttl; /* last TTL specified */
u_int32 addr_refid; /* IPv4 addr or IPv6 hash */
int num_mcast; /* No. of IP addresses in multicast socket */
- u_long starttime; /* current_time as of creation of interface structure */
+ u_long starttime; /* current_time as of creation of interface structure */
volatile long received; /* number of incoming packets */
long sent; /* number of outgoing packets */
long notsent; /* number of send failures */
u_int scopeid; /* Scope used for Multicasting */
u_int ifindex; /* interface index */
- u_int ifnum; /* sequential interface instance count */
- u_char phase; /* phase in update cycle */
- isc_boolean_t ignore_packets; /* Specify whether the packet should be ignored */
- ISC_LIST(struct peer) peers; /* list of peers for the interface */
- u_int peercnt; /* number of peers referencinf this interface - informational only */
- ISC_LINK(struct interface) link; /* interface list */
+ u_int ifnum; /* sequential interface instance count */
+ isc_boolean_t ignore_packets; /* listen-read-drop this? */
+ ISC_LIST(struct peer) peers; /* list of peers for the interface */
+ u_int peercnt; /* peers referencing this interface */
+ ISC_LINK(struct interface) link;/* interface list */
};
/*
struct peer {
struct peer *next; /* pointer to next association */
struct peer *ass_next; /* link pointer in associd hash */
- struct sockaddr_storage srcadr; /* address of remote host */
- struct interface *dstadr; /* pointer to address on local host */
- ISC_LINK(struct peer) ilink; /* interface link list */
+ sockaddr_u srcadr; /* address of remote host */
+ struct interface *dstadr; /* local address (interface) */
+ ISC_LINK(struct peer) ilink; /* peers using this interface */
associd_t associd; /* association ID */
u_char version; /* version number */
u_char hmode; /* local association mode */
#define REFCLK_NEOCLOCK4X 44 /* NeoClock4X DCF77 or TDF receiver */
#define REFCLK_MAX 44 /* NeoClock4X DCF77 or TDF receiver */
- /*
- * Macro for sockaddr_storage structures operations
- */
-#ifdef ISC_PLATFORM_HAVESCOPEID
-#define SOCKSCOPE(sock1, sock2) (((struct sockaddr_in6 *)sock1)->sin6_scope_id == ((struct sockaddr_in6 *)sock2)->sin6_scope_id)
-#else
-#define SOCKSCOPE(sock1, sock2) 1
-#endif
-
-#define SOCKCMP(sock1, sock2) \
- (((struct sockaddr_storage *)sock1)->ss_family \
- == ((struct sockaddr_storage *)sock2)->ss_family \
- ? (((struct sockaddr_storage *)sock1)->ss_family == AF_INET \
- ? (memcmp(&((struct sockaddr_in *)sock1)->sin_addr, \
- &((struct sockaddr_in *)sock2)->sin_addr, \
- sizeof(struct in_addr)) == 0) \
- : (memcmp(&((struct sockaddr_in6 *)sock1)->sin6_addr, \
- &((struct sockaddr_in6 *)sock2)->sin6_addr, \
- sizeof(struct in6_addr)) == 0) \
- && SOCKSCOPE(sock1, sock2)) \
- : 0)
-
-#define SOCKNUL(sock1) \
- (((struct sockaddr_storage *)sock1)->ss_family == AF_INET ? \
- (((struct sockaddr_in *)sock1)->sin_addr.s_addr == 0) : \
- (IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)sock1)->sin6_addr)))
-
-#define SOCKLEN(sock) \
- (((struct sockaddr_storage *)sock)->ss_family == AF_INET ? \
- (sizeof(struct sockaddr_in)) : (sizeof(struct sockaddr_in6)))
-
-#define ANYSOCK(sock) \
- memset(((struct sockaddr_storage *)sock), 0, \
- sizeof(struct sockaddr_storage))
-
-#define ANY_INTERFACE_CHOOSE(sock) \
- (((struct sockaddr_storage *)sock)->ss_family == AF_INET ? \
- any_interface : any6_interface)
-
-/*
- * We tell reference clocks from real peers by giving the reference
- * clocks an address of the form 127.127.t.u, where t is the type and
- * u is the unit number. We define some of this here since we will need
- * some sanity checks to make sure this address isn't interpretted as
- * that of a normal peer.
- */
-#define REFCLOCK_ADDR 0x7f7f0000 /* 127.127.0.0 */
-#define REFCLOCK_MASK 0xffff0000 /* 255.255.0.0 */
-
-#define ISREFCLOCKADR(srcadr) ((SRCADR(srcadr) & REFCLOCK_MASK) \
- == REFCLOCK_ADDR)
-
-/*
- * Macro for checking for invalid addresses. This is really, really
- * gross, but is needed so no one configures a host on net 127 now that
- * we're encouraging it the the configuration file.
- */
-#define LOOPBACKADR 0x7f000001
-#define LOOPNETMASK 0xff000000
-
-#define ISBADADR(srcadr) (((SRCADR(srcadr) & LOOPNETMASK) \
- == (LOOPBACKADR & LOOPNETMASK)) \
- && (SRCADR(srcadr) != LOOPBACKADR))
-
-/*
- * Utilities for manipulating addresses and port numbers
- */
-#define NSRCADR(src) (((struct sockaddr_in *)src)->sin_addr.s_addr) /* address in net byte order */
-#define NSRCPORT(src) (((struct sockaddr_in *)src)->sin_port) /* port in net byte order */
-#define SRCADR(src) (ntohl(NSRCADR((src)))) /* address in host byte order */
-#define SRCPORT(src) (ntohs(NSRCPORT((src)))) /* host port */
-
-#define CAST_V4(src) ((struct sockaddr_in *)&(src))
-#define CAST_V6(src) ((struct sockaddr_in6 *)&(src))
-#define GET_INADDR(src) (CAST_V4(src)->sin_addr.s_addr)
-#define GET_INADDR6(src) (CAST_V6(src)->sin6_addr)
-
-#define SET_HOSTMASK(addr, family) \
- do { \
- memset((char *)(addr), 0, sizeof(struct sockaddr_storage)); \
- (addr)->ss_family = (family); \
- if ((family) == AF_INET) \
- GET_INADDR(*(addr)) = 0xffffffff; \
- else \
- memset(&GET_INADDR6(*(addr)), 0xff, \
- sizeof(struct in6_addr)); \
- } while(0)
/*
* NTP packet format. The mac field is optional. It isn't really
int count; /* total packet count */
u_long firsttime; /* first time found */
u_long lasttime; /* last time found */
- struct sockaddr_storage rmtadr; /* address of remote host */
+ sockaddr_u rmtadr; /* address of remote host */
struct interface *interface; /* interface on which this arrived */
u_short rmtport; /* remote port last came from */
u_char mode; /* packet mode */
* ntp_request.c wants to see this.
*/
struct ctl_trap {
- struct sockaddr_storage tr_addr;/* address of trap recipient */
+ sockaddr_u tr_addr; /* address of trap recipient */
struct interface *tr_localaddr; /* interface to send this through */
u_long tr_settime; /* time trap was set */
u_long tr_count; /* async messages sent to this guy */
extern struct tm * ntp2unix_tm (u_long ntp, int local);
-#define lfptoa(_fpv, _ndec) mfptoa((_fpv)->l_ui, (_fpv)->l_uf, (_ndec))
-#define lfptoms(_fpv, _ndec) mfptoms((_fpv)->l_ui, (_fpv)->l_uf, (_ndec))
-
-#define stoa(_sin) socktoa((_sin))
-#define stohost(_sin) socktohost((_sin))
-
-#define ntoa(_sin) stoa(_sin)
-#define ntohost(_sin) stohost(_sin)
-
-#define ufptoa(_fpv, _ndec) dofptoa((_fpv), 0, (_ndec), 0)
-#define ufptoms(_fpv, _ndec) dofptoa((_fpv), 0, (_ndec), 1)
-#define ulfptoa(_fpv, _ndec) dolfptoa((_fpv)->l_ui, (_fpv)->l_uf, 0, (_ndec), 0)
-#define ulfptoms(_fpv, _ndec) dolfptoa((_fpv)->l_ui, (_fpv)->l_uf, 0, (_ndec), 1)
-#define umfptoa(_fpi, _fpf, _ndec) dolfptoa((_fpi), (_fpf), 0, (_ndec), 0)
+#define lfptoa(fpv, ndec) mfptoa((fpv)->l_ui, (fpv)->l_uf, (ndec))
+#define lfptoms(fpv, ndec) mfptoms((fpv)->l_ui, (fpv)->l_uf, (ndec))
+
+#define stoa(addr) socktoa(addr)
+#define ntoa(addr) stoa(addr)
+#define stohost(addr) socktohost(addr)
+
+#define ufptoa(fpv, ndec) dofptoa((fpv), 0, (ndec), 0)
+#define ufptoms(fpv, ndec) dofptoa((fpv), 0, (ndec), 1)
+#define ulfptoa(fpv, ndec) dolfptoa((fpv)->l_ui, (fpv)->l_uf, 0, (ndec), 0)
+#define ulfptoms(fpv, ndec) dolfptoa((fpv)->l_ui, (fpv)->l_uf, 0, (ndec), 1)
+#define umfptoa(fpi, fpf, ndec) dolfptoa((fpi), (fpf), 0, (ndec), 0)
#endif /* NTP_FP_H */
/*
* Define malloc and friends.
*/
-#ifndef _ntp_malloc_h
-#define _ntp_malloc_h
+#ifndef NTP_MALLOC_H
+#define NTP_MALLOC_H
#ifdef HAVE_CONFIG_H
# include <config.h>
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
-#else /* HAVE_STDLIB_H */
+#else
# ifdef HAVE_MALLOC_H
# include <malloc.h>
# endif
-#endif /* HAVE_STDLIB_H */
+#endif
-#endif /* _ntp_malloc_h */
+#endif /* NTP_MALLOC_H */
#include "ntp_rfc2553.h"
+typedef union {
+ struct sockaddr sa;
+ struct sockaddr_storage sas;
+ struct sockaddr_in sa4;
+ struct sockaddr_in6 sa6;
+} sockaddr_u;
+
+/*
+ * Utilities for manipulating sockaddr_u v4/v6 unions
+ */
+#define SOCK_ADDR4(psau) ((psau)->sa4.sin_addr)
+#define SOCK_ADDR6(psau) ((psau)->sa6.sin6_addr)
+
+#define PSOCK_ADDR4(psau) (&SOCK_ADDR4(psau))
+#define PSOCK_ADDR6(psau) (&SOCK_ADDR6(psau))
+
+#define AF(psau) ((psau)->sas.ss_family)
+
+#define IS_IPV4(psau) (AF_INET == AF(psau))
+#define IS_IPV6(psau) (AF_INET6 == AF(psau))
+
+/* sockaddr_u v4 address in network byte order */
+#define NSRCADR(psau) (SOCK_ADDR4(psau).s_addr)
+
+/* sockaddr_u v4 address in host byte order */
+#define SRCADR(psau) (ntohl(NSRCADR(psau)))
+
+/* sockaddr_u v6 address in network byte order */
+#define NSRCADR6(psau) (SOCK_ADDR6(psau).s6_addr)
+
+/* assign sockaddr_u v4 address from host byte order */
+#define SET_ADDR4(psau, addr4) (NSRCADR(psau) = htonl(addr4))
+
+/* assign sockaddr_u v4 address from network byte order */
+#define SET_ADDR4N(psau, addr4n) (NSRCADR(psau) = (addr4n));
+
+/* assign sockaddr_u v6 address from network byte order */
+#define SET_ADDR6N(psau, s6_addr) \
+ (SOCK_ADDR6(psau) = (s6_addr))
+
+/* sockaddr_u v4/v6 port in network byte order */
+#define NSRCPORT(psau) ((psau)->sa4.sin_port)
+
+/* sockaddr_u v4/v6 port in host byte order */
+#define SRCPORT(psau) (ntohs(NSRCPORT(psau)))
+
+/* assign sockaddr_u v4/v6 port from host byte order */
+#define SET_PORT(psau, port) (NSRCPORT(psau) = htons(port))
+
+/* sockaddr_u v6 scope */
+#define SCOPE_VAR(psau) ((psau)->sa6.sin6_scope_id)
+
+#ifdef ISC_PLATFORM_HAVESCOPEID
+/* v4/v6 scope (always zero for v4) */
+# define SCOPE(psau) (IS_IPV4(psau) \
+ ? 0 \
+ : SCOPE_VAR(psau))
+
+/* are two v6 sockaddr_u scopes equal? */
+# define SCOPE_EQ(psau1, psau2) \
+ (SCOPE_VAR(psau1) == SCOPE_VAR(psau2))
+
+/* assign scope if supported */
+# define SET_SCOPE(psau, s) \
+ do \
+ if (IS_IPV6(psau)) \
+ SCOPE_VAR(psau) = (s); \
+ while (0)
+#else /* ISC_PLATFORM_HAVESCOPEID not defined */
+# define SCOPE(psau) (0)
+# define SCOPE_EQ(psau1, psau2) (1)
+# define SET_SCOPE(psau, s) do { } while (0)
+#endif /* ISC_PLATFORM_HAVESCOPEID */
+
+/* v4/v6 is multicast address */
+#define IS_MCAST(psau) \
+ (IS_IPV4(psau) \
+ ? IN_CLASSD(SRCADR(psau)) \
+ : IN6_IS_ADDR_MULTICAST(PSOCK_ADDR6(psau)))
+
+#define SIZEOF_SOCKADDR(fam) \
+ ((AF_INET == (fam)) \
+ ? sizeof(struct sockaddr_in) \
+ : sizeof(struct sockaddr_in6))
+
+#define SOCKLEN(psau) \
+ (IS_IPV4(psau) \
+ ? sizeof((psau)->sa4) \
+ : sizeof((psau)->sa6))
+
+#define ZERO_SOCK(psau) \
+ memset(&(psau)->sas, 0, sizeof((psau)->sas))
+
+/* blast a byte value across sockaddr_u v6 address */
+#define MEMSET_ADDR6(psau, v) \
+ memset((void *)(psau)->sa6.sin6_addr.s6_addr, (v), \
+ sizeof((psau)->sa6.sin6_addr.s6_addr))
+
+#define SET_ONESMASK(psau) \
+ do { \
+ if (IS_IPV6(psau)) \
+ MEMSET_ADDR6((psau), 0xff); \
+ else \
+ NSRCADR(psau) = 0xffffffff; \
+ } while(0)
+
+/* zero sockaddr_u, fill in family and all-ones (host) mask */
+#define SET_HOSTMASK(psau, family) \
+ do { \
+ ZERO_SOCK(psau); \
+ AF(psau) = (family); \
+ SET_ONESMASK(psau); \
+ } while (0)
+
+/* compare a in6_addr with socket address */
+#if !defined(SYS_WINNT) || !defined(in_addr6)
+#define S_ADDR6_EQ(psau, my_in6_addr) \
+ (!memcmp(&(psau)->sa6.sin6_addr, \
+ (my_in6_addr), \
+ sizeof((psau)->sa6.sin6_addr)))
+#else
+#define S_ADDR6_EQ(psau, my_in6_addr) \
+ IN6_ADDR_EQUAL(&(psau)->sa6.sin6_addr, \
+ (my_in6_addr))
+#endif
+
+/* are two sockaddr_u's addresses equal? */
+#define SOCK_EQ(psau1, psau2) \
+ ((AF(psau1) != AF(psau2)) \
+ ? 0 \
+ : IS_IPV4(psau1) \
+ ? (NSRCADR(psau1) == NSRCADR(psau2)) \
+ : (S_ADDR6_EQ((psau1), PSOCK_ADDR6(psau2)) \
+ && SCOPE_EQ((psau1), (psau2))))
+
+/* is sockaddr_u address unspecified? */
+#define SOCK_UNSPEC(psau) \
+ (IS_IPV4(psau) \
+ ? !NSRCADR(psau) \
+ : IN6_IS_ADDR_UNSPECIFIED(PSOCK_ADDR6(psau)))
+
+/* just how unspecified do you mean? (scope 0/unspec too) */
+#define SOCK_UNSPEC_S(psau) \
+ (SOCK_UNSPEC(psau) && !SCOPE(psau))
+
+/* choose a default net interface (struct interface) for v4 or v6 */
+#define ANY_INTERFACE_BYFAM(family) \
+ ((AF_INET == family) \
+ ? any_interface \
+ : any6_interface)
+
+/* choose a default interface for addresses' protocol (addr family) */
+#define ANY_INTERFACE_CHOOSE(psau) \
+ ANY_INTERFACE_BYFAM(AF(psau))
+
+
+/*
+ * We tell reference clocks from real peers by giving the reference
+ * clocks an address of the form 127.127.t.u, where t is the type and
+ * u is the unit number. We define some of this here since we will need
+ * some sanity checks to make sure this address isn't interpretted as
+ * that of a normal peer.
+ */
+#define REFCLOCK_ADDR 0x7f7f0000 /* 127.127.0.0 */
+#define REFCLOCK_MASK 0xffff0000 /* 255.255.0.0 */
+
+#ifdef REFCLOCK
+#define ISREFCLOCKADR(srcadr) \
+ (IS_IPV4(srcadr) && \
+ (SRCADR(srcadr) & REFCLOCK_MASK) == REFCLOCK_ADDR)
+#else
+#define ISREFCLOCKADR(srcadr) (0)
+#endif
+
+/*
+ * Macro for checking for invalid addresses. This is really, really
+ * gross, but is needed so no one configures a host on net 127 now that
+ * we're encouraging it the the configuration file.
+ */
+#define LOOPBACKADR 0x7f000001
+#define LOOPNETMASK 0xff000000
+
+#define ISBADADR(srcadr) \
+ (IS_IPV4(srcadr) \
+ && ((SRCADR(srcadr) & LOOPNETMASK) \
+ == (LOOPBACKADR & LOOPNETMASK)) \
+ && SRCADR(srcadr) != LOOPBACKADR)
+
+
#endif /* NTP_NET_H */
extern void io_closeclock (struct refclockio *);
#ifdef REFCLOCK
-extern void refclock_buginfo (struct sockaddr_storage *,
+extern void refclock_buginfo (sockaddr_u *,
struct refclockbug *);
-extern void refclock_control (struct sockaddr_storage *,
+extern void refclock_control (sockaddr_u *,
struct refclockstat *,
struct refclockstat *);
extern int refclock_open (char *, u_int, u_int);
* ntp_request.h - definitions for the ntpd remote query facility
*/
-#ifndef _NTP_REQUEST_H
-#define _NTP_REQUEST_H
+#ifndef NTP_REQUEST_H
+#define NTP_REQUEST_H
#include "ntp_types.h"
#include "recvbuff.h"
struct info_monitor_1 {
u_int32 lasttime; /* last packet from this host */
u_int32 firsttime; /* first time we received a packet */
- u_int32 lastdrop; /* last time we rejected a packet due to client limitation policy */
+ u_int32 restr; /* restrict bits (was named lastdrop) */
u_int32 count; /* count of packets received */
u_int32 addr; /* host address V4 style */
u_int32 daddr; /* destination host address */
struct info_monitor {
u_int32 lasttime; /* last packet from this host */
u_int32 firsttime; /* first time we received a packet */
- u_int32 lastdrop; /* last time we rejected a packet due to client limitation policy */
+ u_int32 restr; /* restrict bits (was named lastdrop) */
u_int32 count; /* count of packets received */
u_int32 addr; /* host address */
u_short port; /* port number of last reception */
};
/*
- * Structure used for returning monitor data (old format
+ * Structure used for returning monitor data (old format)
*/
struct old_info_monitor {
u_int32 lasttime; /* last packet from this host */
#include "ntp_types.h"
#include "ntp_string.h"
+#include "ntp_net.h"
#include "l_stdlib.h"
/*
extern int auth_moremem (void);
extern int ymd2yd (int, int, int);
+/* a_md5encrypt.c */
extern int MD5authdecrypt (u_char *, u_int32 *, int, int);
extern int MD5authencrypt (u_char *, u_int32 *, int);
extern void MD5auth_setkey (keyid_t, const u_char *, const int);
-extern u_int32 addr2refid (struct sockaddr_storage *);
+extern u_int32 addr2refid (sockaddr_u *);
+
extern int atoint (const char *, long *);
extern int atouint (const char *, u_long *);
extern const char * sysstatstr (int);
extern const char * peerstatstr (int);
extern const char * clockstatstr (int);
-extern struct sockaddr_storage* netof (struct sockaddr_storage*);
+extern sockaddr_u * netof (sockaddr_u *);
extern char * numtoa (u_int32);
extern char * numtohost (u_int32);
-extern char * socktoa (struct sockaddr_storage *);
-extern char * socktohost (struct sockaddr_storage *);
+extern char * socktoa (sockaddr_u *);
+extern char * socktohost (sockaddr_u *);
extern int octtoint (const char *, u_long *);
extern u_long ranp2 (int);
-extern char * refnumtoa (struct sockaddr_storage *);
+extern char * refnumtoa (sockaddr_u *);
extern int tsftomsu (u_long, int);
extern char * uinttoa (u_long);
-extern int decodenetnum (const char *, struct sockaddr_storage *);
+extern int decodenetnum (const char *, sockaddr_u *);
extern const char * FindConfig (const char *);
extern char * ntp_optarg; /* global argument pointer */
extern int ntp_optind; /* global argv index */
+/* lib_strbuf.c */
+extern int ipv4_works;
+extern int ipv6_works;
+
/* machines.c */
extern const char *set_tod_using;
extern void getconfig (int, char **);
extern void ctl_clr_stats (void);
-extern int ctlclrtrap (struct sockaddr_storage *, struct interface *, int);
+extern int ctlclrtrap (sockaddr_u *, struct interface *, int);
extern u_short ctlpeerstatus (struct peer *);
-extern int ctlsettrap (struct sockaddr_storage *, struct interface *, int, int);
+extern int ctlsettrap (sockaddr_u *, struct interface *, int, int);
extern u_short ctlsysstatus (void);
extern void init_control (void);
extern void init_logging (char const *, int);
extern void set_sys_var (const char *, u_long, u_short);
/* ntp_intres.c */
-extern void ntp_res_name (struct sockaddr_storage, u_short);
+extern void ntp_res_name (sockaddr_u, u_short);
extern void ntp_res_recv (void);
extern void ntp_intres (void);
#ifdef SYS_WINNT
/* ntp_io.c */
typedef struct interface_info {
- struct interface *interface;
- u_char action;
+ struct interface * interface;
+ u_char action;
} interface_info_t;
-typedef void (*interface_receiver_t)(void *, interface_info_t *);
+typedef void (*interface_receiver_t) (void *, interface_info_t *);
-extern volatile int disable_dynamic_updates;
+extern int disable_dynamic_updates;
-extern void interface_enumerate (interface_receiver_t, void *);
-extern struct interface *findinterface (struct sockaddr_storage *);
-extern struct interface *findbcastinter (struct sockaddr_storage *);
-extern void enable_broadcast (struct interface *, struct sockaddr_storage *);
-extern void enable_multicast_if (struct interface *, struct sockaddr_storage *);
-extern void interface_dump (struct interface *);
+extern void interface_enumerate (interface_receiver_t, void *);
+extern struct interface *findinterface (sockaddr_u *);
+extern struct interface *findbcastinter(sockaddr_u *);
+extern void enable_broadcast (struct interface *, sockaddr_u *);
+extern void enable_multicast_if (struct interface *, sockaddr_u *);
+extern void interface_update (interface_receiver_t, void *);
-extern void interface_update (interface_receiver_t, void *);
extern void init_io (void);
extern void input_handler (l_fp *);
extern void io_clr_stats (void);
extern void io_setbclient (void);
-extern void io_unsetbclient (void);
-extern void io_multicast_add (struct sockaddr_storage);
-extern void io_multicast_del (struct sockaddr_storage);
-extern void kill_asyncio (int);
-extern void sendpkt (struct sockaddr_storage *, struct interface *, int, struct pkt *, int);
+extern void io_unsetbclient (void);
+extern void io_multicast_add(sockaddr_u *);
+extern void io_multicast_del(sockaddr_u *);
+extern void kill_asyncio (int);
+extern void sendpkt (sockaddr_u *, struct interface *, int, struct pkt *, int);
#ifdef DEBUG
-extern void collect_timing (struct recvbuf *, const char *, int, l_fp *);
+extern void collect_timing (struct recvbuf *, const char *, int, l_fp *);
#endif
#ifdef HAVE_SIGNALED_IO
-extern void wait_for_signal (void);
-extern void unblock_io_and_alarm (void);
-extern void block_io_and_alarm (void);
-#define UNBLOCK_IO_AND_ALARM() unblock_io_and_alarm()
-#define BLOCK_IO_AND_ALARM() block_io_and_alarm()
+extern void wait_for_signal (void);
+extern void unblock_io_and_alarm (void);
+extern void block_io_and_alarm (void);
+#define UNBLOCK_IO_AND_ALARM() unblock_io_and_alarm()
+#define BLOCK_IO_AND_ALARM() block_io_and_alarm()
#else
#define UNBLOCK_IO_AND_ALARM()
#define BLOCK_IO_AND_ALARM()
/* ntp_peer.c */
extern void init_peer (void);
-extern struct peer *findexistingpeer (struct sockaddr_storage *, struct peer *, int);
-extern struct peer *findpeer (struct sockaddr_storage *, struct interface *, int, int *);
+extern struct peer *findexistingpeer (sockaddr_u *, struct peer *, int);
+extern struct peer *findpeer (sockaddr_u *, struct interface *, int, int *);
extern struct peer *findpeerbyassoc (u_int);
extern void set_peerdstadr (struct peer *peer, struct interface *interface);
-extern struct peer *newpeer (struct sockaddr_storage *, struct interface *, int, int, int, int, u_int, u_char, int, keyid_t);
+extern struct peer *newpeer (sockaddr_u *, struct interface *, int, int, int, int, u_int, u_char, int, keyid_t);
extern void peer_all_reset (void);
extern void peer_clr_stats (void);
-extern struct peer *peer_config (struct sockaddr_storage *, struct interface *, int, int, int, int, u_int, int, keyid_t, u_char *);
+extern struct peer *peer_config (sockaddr_u *, struct interface *, int, int, int, int, u_int, int, keyid_t, u_char *);
extern void peer_reset (struct peer *);
extern void refresh_all_peerinterfaces (void);
extern void unpeer (struct peer *);
extern int crypto_xmit (struct peer *, struct pkt *,
struct recvbuf *, int,
struct exten *, keyid_t);
-extern keyid_t session_key (struct sockaddr_storage *,
- struct sockaddr_storage *, keyid_t,
+extern keyid_t session_key (sockaddr_u *, sockaddr_u *, keyid_t,
keyid_t, u_long);
extern int make_keylist (struct peer *, struct interface *);
extern void key_expire (struct peer *);
extern void clear (struct peer *);
extern void clock_filter (struct peer *, double, double, double);
extern void init_proto (void);
-extern void proto_config (int, u_long, double, struct sockaddr_storage*);
+extern void proto_config (int, u_long, double, sockaddr_u *);
extern void proto_clr_stats (void);
#ifdef REFCLOCK
/* ntp_restrict.c */
extern void init_restrict (void);
-extern int restrictions (struct sockaddr_storage *);
-extern void hack_restrict (int, struct sockaddr_storage *, struct sockaddr_storage *, int, int);
+extern int restrictions (sockaddr_u *);
+extern void hack_restrict (int, sockaddr_u *, sockaddr_u *, int, int);
/* ntp_timer.c */
extern void init_timer (void);
extern void init_util (void);
extern void write_stats (void);
extern void stats_config (int, const char *);
-extern void record_peer_stats (struct sockaddr_storage *, int, double, double, double, double);
+extern void record_peer_stats (sockaddr_u *, int, double, double, double, double);
extern void record_proto_stats (char *);
extern void record_loop_stats (double, double, double, double, int);
-extern void record_clock_stats (struct sockaddr_storage *, const char *);
-extern void record_raw_stats (struct sockaddr_storage *, struct sockaddr_storage *, l_fp *, l_fp *, l_fp *, l_fp *);
+extern void record_clock_stats (sockaddr_u *, const char *);
+extern void record_raw_stats (sockaddr_u *, sockaddr_u *, l_fp *, l_fp *, l_fp *, l_fp *);
extern u_long leap_month(u_long);
-extern void record_crypto_stats (struct sockaddr_storage *, const char *);
+extern void record_crypto_stats (sockaddr_u *, const char *);
#ifdef DEBUG
extern void record_timing_stats (const char *);
#endif
-extern int sock_hash (struct sockaddr_storage *);
+extern int sock_hash (sockaddr_u *);
extern char * fstostr(time_t); /* NTP timescale seconds */
extern double old_drift;
extern int drift_file_sw;
typedef struct {
double server_time; /* Server time */
- struct sockaddr_storage *addr; /* Server Address */
+ sockaddr_u *addr; /* Server Address */
queue *script; /* Server Script */
script_info *curr_script; /* Current Script */
} server_info;
int ntpsim (int argc, char *argv[]);
Event *event (double t, funcTkn f);
void sim_event_timer (Event *e);
-int simulate_server (struct sockaddr_storage *serv_addr,
+int simulate_server (sockaddr_u *serv_addr,
struct interface *inter,
struct pkt *rpkt);
void sim_update_clocks (Event *e);
struct recvbuf {
ISC_LINK(recvbuf_t) link;
union {
- struct sockaddr_storage X_recv_srcadr;
+ sockaddr_u X_recv_srcadr;
caddr_t X_recv_srcclock;
struct peer *X_recv_peer;
} X_from_where;
#define recv_srcadr X_from_where.X_recv_srcadr
#define recv_srcclock X_from_where.X_recv_srcclock
#define recv_peer X_from_where.X_recv_peer
-#if defined HAVE_IO_COMPLETION_PORT
- WSABUF wsabuff;
+#ifndef HAVE_IO_COMPLETION_PORT
+ sockaddr_u srcadr; /* where packet came from */
#else
- struct sockaddr_storage srcadr; /* where packet came from */
+ int recv_srcadr_len; /* filled in on completion */
#endif
- int src_addr_len; /* source address length */
struct interface *dstadr; /* interface datagram arrived thru */
SOCKET fd; /* fd on which it was received */
int msg_flags; /* Flags received about the packet */
struct pkt X_recv_pkt;
u_char X_recv_buffer[RX_BUFF_SIZE];
} recv_space;
- int used;
#define recv_pkt recv_space.X_recv_pkt
#define recv_buffer recv_space.X_recv_buffer
+ int used; /* reference count */
};
extern void init_recvbuff (int);
* it and use the bottom 4 bytes.
*/
u_int32
-addr2refid(struct sockaddr_storage *addr)
+addr2refid(sockaddr_u *addr)
{
MD5_CTX md5;
u_char digest[16];
u_int32 addr_refid;
- if (addr->ss_family == AF_INET)
- return (GET_INADDR(*addr));
+ if (IS_IPV4(addr))
+ return (NSRCADR(addr));
MD5Init(&md5);
- MD5Update(&md5, (u_char *)&GET_INADDR6(*addr),
+ MD5Update(&md5, (u_char *)PSOCK_ADDR6(addr),
sizeof(struct in6_addr));
MD5Final(digest, &md5);
memcpy(&addr_refid, digest, 4);
"MSF_ARCRON" },
{ REFCLK_SHM, "Clock attached thru shared Memory (28)",
"SHM" },
- { REFCLK_PALISADE, "Trimble Navigation Palisade GPS (29)",
- "GPS_PALISADE" },
+ { REFCLK_PALISADE, "Trimble Navigation Palisade GPS (29)",
+ "GPS_PALISADE" },
{ REFCLK_ONCORE, "Motorola UT Oncore GPS (30)",
"GPS_ONCORE" },
{ REFCLK_GPS_JUPITER, "Rockwell Jupiter GPS (31)",
"CHRONOLOG" },
{ REFCLK_DUMBCLOCK, "Dumb generic hh:mm:ss local clock (33)",
"DUMBCLOCK" },
- { REFCLK_ULINK, "Ultralink M320 WWVB receiver (34)",
+ { REFCLK_ULINK, "Ultralink M320 WWVB receiver (34)",
"ULINK_M320"},
{ REFCLK_PCF, "Conrad parallel port radio clock (35)",
"PCF"},
for (clk = clktypes; clk->code != -1; clk++) {
if (num == clk->code)
- return (clk->abbrev);
+ return (clk->abbrev);
}
return (NULL);
}
int
decodenetnum(
const char *num,
- struct sockaddr_storage *netnum
+ sockaddr_u *netnum
)
{
struct addrinfo hints, *ai = NULL;
err = getaddrinfo(num, NULL, &hints, &ai);
if (err != 0)
return 0;
- memcpy(netnum, (struct sockaddr_storage *)ai->ai_addr, ai->ai_addrlen);
+ memcpy(netnum, ai->ai_addr, ai->ai_addrlen);
freeaddrinfo(ai);
return 1;
}
/*
* lib_strbuf - library string storage
*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <isc/net.h>
#include "ntp_stdlib.h"
#include "lib_strbuf.h"
*/
char lib_stringbuf[LIB_NUMBUFS][LIB_BUFLENGTH];
int lib_nextbuf;
+int ipv4_works;
+int ipv6_works;
int lib_inited = 0;
/*
init_lib(void)
{
lib_nextbuf = 0;
+ ipv4_works = isc_net_probeipv4();
+ ipv6_works = isc_net_probeipv6();
lib_inited = 1;
}
extern char lib_stringbuf[LIB_NUMBUFS][LIB_BUFLENGTH];
extern int lib_nextbuf;
+extern int ipv4_works;
+extern int ipv6_works;
extern int lib_inited;
* (zero out host part)
*/
#include <stdio.h>
+#include <syslog.h>
#include "ntp_fp.h"
+#include "ntp_net.h"
#include "ntp_stdlib.h"
#include "ntp.h"
-#define NUM_NETOF_BUFS 10
-static struct sockaddr_storage ssbuf[NUM_NETOF_BUFS];
-static int next_ssbuf = 0;
-
-struct sockaddr_storage*
+sockaddr_u *
netof(
- struct sockaddr_storage* hostaddr
+ sockaddr_u *hostaddr
)
{
- register u_int32 netnum;
- struct sockaddr_storage *netaddr;
+ static sockaddr_u netofbuf[8];
+ static int next_netofbuf;
+ u_int32 netnum;
+ sockaddr_u * netaddr;
+
+ netaddr = &netofbuf[next_netofbuf];
+ next_netofbuf = (next_netofbuf + 1) % COUNTOF(netofbuf);
- netaddr = &ssbuf[next_ssbuf++];
- if (next_ssbuf == NUM_NETOF_BUFS)
- next_ssbuf = 0;
- memcpy(netaddr, hostaddr, sizeof(struct sockaddr_storage));
+ memcpy(netaddr, hostaddr, sizeof(*netaddr));
- if(netaddr->ss_family == AF_INET) {
- netnum = ((struct sockaddr_in*)netaddr)->sin_addr.s_addr;
+ if (IS_IPV4(netaddr)) {
+ netnum = SRCADR(netaddr);
/*
* We live in a modern CIDR world where the basement nets, which
* used to be class A, are now probably associated with each
* host address. So, for class-A nets, all bits are significant.
*/
- if(IN_CLASSC(netnum))
- netnum &= IN_CLASSC_NET;
+ if (IN_CLASSC(netnum))
+ netnum &= IN_CLASSC_NET;
else if (IN_CLASSB(netnum))
- netnum &= IN_CLASSB_NET;
- ((struct sockaddr_in*)netaddr)->sin_addr.s_addr = netnum;
- }
- else if(netaddr->ss_family == AF_INET6) {
- /* Here we put 0 at the local link address so we get net address */
- memset(&((struct sockaddr_in6*)netaddr)->sin6_addr.s6_addr[8], 0, 8*sizeof(u_char));
- }
-
- return netaddr;
+ netnum &= IN_CLASSB_NET;
+
+ SET_ADDR4(netaddr, netnum);
+
+ } else if (IS_IPV6(netaddr))
+ /* assume the typical /64 subnet size */
+ memset(&NSRCADR6(netaddr)[8], 0, 8);
+#ifdef DEBUG
+ else {
+ msyslog(LOG_ERR, "netof unknown AF %d", AF(netaddr));
+ exit(1);
+ }
+#endif
+
+ return netaddr;
}
netnum = ntohl(num);
LIB_GETBUF(buf);
- (void) sprintf(buf, "%lu.%lu.%lu.%lu", ((u_long)netnum >> 24) & 0xff,
- ((u_long)netnum >> 16) & 0xff, ((u_long)netnum >> 8) & 0xff,
- (u_long)netnum & 0xff);
+ snprintf(buf, LIB_BUFLENGTH, "%lu.%lu.%lu.%lu",
+ ((u_long)netnum >> 24) & 0xff,
+ ((u_long)netnum >> 16) & 0xff,
+ ((u_long)netnum >> 8) & 0xff,
+ (u_long)netnum & 0xff);
return buf;
}
return lowater_adds;
}
-static void
+static inline void
initialise_buffer(recvbuf_t *buff)
{
- memset((char *) buff, 0, sizeof(recvbuf_t));
-
-#if defined SYS_WINNT
- buff->wsabuff.len = RX_BUFF_SIZE;
- buff->wsabuff.buf = (char *) buff->recv_buffer;
-#endif
+ memset(buff, 0, sizeof(*buff));
}
static void
char *
refnumtoa(
- struct sockaddr_storage* num
+ sockaddr_u *num
)
{
register u_int32 netnum;
LIB_GETBUF(buf);
- if(num->ss_family == AF_INET) {
- netnum = ntohl(((struct sockaddr_in*)num)->sin_addr.s_addr);
+ if (IS_IPV4(num)) {
+ netnum = SRCADR(num);
rclock = clockname((int)((u_long)netnum >> 8) & 0xff);
if (rclock != NULL)
- (void)sprintf(buf, "%s(%lu)", rclock, (u_long)netnum & 0xff);
+ snprintf(buf, LIB_BUFLENGTH, "%s(%lu)",
+ rclock, (u_long)netnum & 0xff);
else
- (void)sprintf(buf, "REFCLK(%lu,%lu)",
- ((u_long)netnum >> 8) & 0xff, (u_long)netnum & 0xff);
+ snprintf(buf, LIB_BUFLENGTH, "REFCLK(%lu,%lu)",
+ ((u_long)netnum >> 8) & 0xff,
+ (u_long)netnum & 0xff);
+
+ } else
+ strncpy(buf,
+ "refclock address type not implemented, use IPv4 refclock address.",
+ LIB_BUFLENGTH);
- }
- else {
- (void)sprintf(buf, "refclock address type not implemented yet, use IPv4 refclock address.");
- }
return buf;
}
* socktoa - return a numeric host name from a sockaddr_storage structure
*/
+#ifdef HAVE_CONFIG_H
#include <config.h>
+#endif
#include <sys/types.h>
#include <sys/socket.h>
char *
socktoa(
- struct sockaddr_storage* sock
+ sockaddr_u *sock
)
{
register char *buffer;
LIB_GETBUF(buffer);
if (sock == NULL)
- strcpy(buffer, "null");
- else
- {
-
- switch(sock->ss_family) {
+ strncpy(buffer, "(null)", LIB_BUFLENGTH);
+ else {
+ switch(AF(sock)) {
- default:
case AF_INET :
- inet_ntop(AF_INET, &GET_INADDR(*sock), buffer,
+ inet_ntop(AF_INET, PSOCK_ADDR4(sock), buffer,
LIB_BUFLENGTH);
break;
case AF_INET6 :
- inet_ntop(AF_INET6, &GET_INADDR6(*sock), buffer,
+ inet_ntop(AF_INET6, PSOCK_ADDR6(sock), buffer,
LIB_BUFLENGTH);
-#if 0
+
default:
- strcpy(buffer, "unknown");
-#endif
+ strncpy(buffer, "(socktoa unknown family)",
+ LIB_BUFLENGTH);
}
}
- return buffer;
+ return buffer;
}
char *
socktohost(
- struct sockaddr_storage* sock
+ sockaddr_u *sock
)
{
register char *buffer;
LIB_GETBUF(buffer);
- if (getnameinfo((struct sockaddr *)sock, SOCKLEN(sock), buffer,
- LIB_BUFLENGTH /* NI_MAXHOST*/, NULL, 0, 0))
+ if (getnameinfo(&sock->sa, SOCKLEN(sock), buffer,
+ LIB_BUFLENGTH, NULL, 0, 0))
return stoa(sock);
- return buffer;
+ return buffer;
}
#endif
struct REMOTE_CONFIG_INFO remote_config; /* Remote configuration buffer and
- pointer info */
+ pointer info */
int input_from_file = 1; /* A boolean flag, which when set, indicates that
- the input is to be taken from the configuration
- file, instead of the remote-configuration buffer
- */
-/* int newline_is_special = 1; */ /* A boolean flag, which when set, implies that
- newlines are special characters that need to
- be returned as tokens */
+ the input is to be taken from the configuration
+ file, instead of the remote-configuration buffer
+ */
int old_config_style = 1; /* A boolean flag, which when set,
- * indicates that the old configuration
- * format with a newline at the end of
- * every command is being used
- */
+ * indicates that the old configuration
+ * format with a newline at the end of
+ * every command is being used
+ */
int cryptosw; /* crypto command called */
extern int sys_maxclock;
double *create_dval(double val);
void destroy_restrict_node(struct restrict_node *my_node);
#if !defined(SIM)
-static struct sockaddr_storage *get_next_address(struct address_node *addr);
+static sockaddr_u *get_next_address(struct address_node *addr);
#endif
static void config_other_modes(void);
static void config_trap(void);
static void config_fudge(void);
static void config_vars(void);
-static int is_sane_resolved_address(struct sockaddr_storage peeraddr, int hmode);
+static int is_sane_resolved_address(sockaddr_u *peeraddr, int hmode);
static int get_correct_host_mode(int hmode);
static void config_peers(void);
static void config_unpeers(void);
static unsigned long get_pfxmatch(char **s,struct masks *m);
static unsigned long get_match(char *s,struct masks *m);
static unsigned long get_logmask(char *s);
-static int getnetnum(const char *num,struct sockaddr_storage *addr,int complain,enum gnn_type a_type);
-static int get_multiple_netnums(const char *num, struct sockaddr_storage *addr, struct addrinfo **res, int complain, enum gnn_type a_type);
-static void save_resolve(char *name,int mode,int version,int minpoll,int maxpoll,u_int flags,int ttl,keyid_t keyid,u_char *keystr);
+static int getnetnum(const char *num,sockaddr_u *addr, int complain,
+ enum gnn_type a_type);
+static int get_multiple_netnums(const char *num, sockaddr_u *addr,
+ struct addrinfo **res, int complain,
+ enum gnn_type a_type);
+static void save_resolve(char *name, int mode, int version,
+ int minpoll, int maxpoll, u_int flags,int ttl,
+ keyid_t keyid,u_char *keystr);
static void abort_resolve(void);
static void do_resolve_internal(void);
#define ADDR_LENGTH 16 + 1
-static struct sockaddr_storage *
+static sockaddr_u *
get_next_address(
struct address_node *addr
)
const char addr_prefix[] = "192.168.0.";
static int curr_addr_no = 1;
char addr_string[ADDR_LENGTH];
- struct sockaddr_storage *final_addr;
+ sockaddr_u *final_addr;
struct addrinfo *ptr;
int retval;
config_other_modes(void)
{
- struct sockaddr_storage addr_sock;
+ sockaddr_u addr_sock;
struct address_node *addr_node;
if (my_config.broadcastclient) {
- proto_config(PROTO_BROADCLIENT, my_config.broadcastclient, 0., NULL);
+ proto_config(PROTO_BROADCLIENT,
+ my_config.broadcastclient, 0., NULL);
my_config.broadcastclient = 0;
}
/* Configure the many-cast servers */
if (!empty(my_config.manycastserver)) {
while (!empty(my_config.manycastserver)) {
- addr_node = (struct address_node *)
- dequeue(my_config.manycastserver);
+ addr_node = dequeue(my_config.manycastserver);
- memset((char *)&addr_sock, 0, sizeof(addr_sock));
- addr_sock.ss_family = (u_short)addr_node->type;
+ ZERO_SOCK(&addr_sock);
+ AF(&addr_sock) = (u_short)addr_node->type;
- if (getnetnum(addr_node->address, &addr_sock, 1, t_UNK) == 1)
- proto_config(PROTO_MULTICAST_ADD, 0, 0., &addr_sock);
+ if (getnetnum(addr_node->address, &addr_sock,
+ 1, t_UNK) == 1)
+ proto_config(PROTO_MULTICAST_ADD, 0,
+ 0., &addr_sock);
destroy_address_node(addr_node);
}
/* Configure the multicast clients */
if (!empty(my_config.multicastclient)) {
while (!empty(my_config.multicastclient)) {
- addr_node = (struct address_node *)
- dequeue(my_config.multicastclient);
+ addr_node = dequeue(my_config.multicastclient);
- memset((char *)&addr_sock, 0, sizeof(addr_sock));
- addr_sock.ss_family = (u_short)addr_node->type;
-
- if (getnetnum(addr_node->address, &addr_sock, 1, t_UNK) == 1)
- proto_config(PROTO_MULTICAST_ADD, 0, 0., &addr_sock);
+ ZERO_SOCK(&addr_sock);
+ AF(&addr_sock) = (u_short)addr_node->type;
+ if (getnetnum(addr_node->address, &addr_sock,
+ 1, t_UNK) == 1)
+ proto_config(PROTO_MULTICAST_ADD, 0,
+ 0., &addr_sock);
destroy_address_node(addr_node);
}
{
struct attr_val * my_opt;
struct restrict_node * my_node;
- struct sockaddr_storage addr_sock;
- struct sockaddr_storage addr_mask;
+ sockaddr_u addr_sock;
+ sockaddr_u addr_mask;
int flags;
int mflags;
int restrict_default;
while (!empty(my_config.restrict_opts)) {
my_node = dequeue(my_config.restrict_opts);
- memset(&addr_sock, 0, sizeof addr_sock);
+ ZERO_SOCK(&addr_sock);
if (NULL == my_node->addr) {
/*
* -4 / -6 qualifier, add to both lists
*/
restrict_default = 1;
- ANYSOCK(&addr_mask);
+ ZERO_SOCK(&addr_mask);
} else {
restrict_default = 0;
/* Resolve the specified address */
- addr_sock.ss_family = (u_short)my_node->addr->type;
+ AF(&addr_sock) = (u_short)my_node->addr->type;
if (getnetnum(my_node->addr->address,
&addr_sock, 1, t_UNK) != 1) {
continue;
}
- SET_HOSTMASK(&addr_mask, addr_sock.ss_family);
+ SET_HOSTMASK(&addr_mask, AF(&addr_sock));
/* Resolve the mask */
if (my_node->mask) {
- memset((char *)&addr_mask, 0, sizeof(addr_mask));
- addr_mask.ss_family = (u_short)my_node->mask->type;
+ ZERO_SOCK(&addr_mask);
+ AF(&addr_mask) = (u_short)my_node->mask->type;
if (getnetnum(my_node->mask->address, &addr_mask, 1, t_MSK) != 1) {
msyslog(LOG_ERR,
/* Set the flags */
if (restrict_default) {
- addr_sock.ss_family = AF_INET;
+ AF(&addr_sock) = AF_INET;
hack_restrict(RESTRICT_FLAGS, &addr_sock, &addr_mask,
mflags, flags);
- addr_sock.ss_family = AF_INET6;
+ AF(&addr_sock) = AF_INET6;
}
hack_restrict(RESTRICT_FLAGS, &addr_sock, &addr_mask,
struct addr_opts_node *curr_trap;
struct attr_val *curr_opt;
- struct sockaddr_storage addr_sock;
- struct sockaddr_storage peeraddr;
+ sockaddr_u addr_sock;
+ sockaddr_u peeraddr;
struct address_node *addr_node;
struct interface *localaddr;
u_short port_no;
int err_flag;
/* silence warning about addr_sock potentially uninitialized */
- addr_sock.ss_family = AF_UNSPEC;
+ AF(&addr_sock) = AF_UNSPEC;
port_no = 0;
localaddr = NULL;
addr_node = curr_opt->value.p;
/* Resolve the interface address */
- memset(&addr_sock, 0, sizeof(addr_sock));
- addr_sock.ss_family = (u_short)addr_node->type;
+ ZERO_SOCK(&addr_sock);
+ AF(&addr_sock) = (u_short)addr_node->type;
if (getnetnum(addr_node->address,
&addr_sock, 1, t_UNK) != 1) {
* and port number
*/
if (!err_flag) {
- memset((char *)&peeraddr, 0, sizeof(peeraddr));
+ ZERO_SOCK(&peeraddr);
if (1 != getnetnum(curr_trap->addr->address,
&peeraddr, 1, t_UNK)) {
err_flag = 1;
}
/* port is at same location for v4 and v6 */
- ((struct sockaddr_in6*)&peeraddr)->sin6_port =
- htons(port_no ? port_no : TRAPPORT);
+ SET_PORT(&peeraddr, port_no ? port_no : TRAPPORT);
if (NULL == localaddr) {
- peeraddr.ss_family = default_ai_family;
+ AF(&peeraddr) = default_ai_family;
localaddr = ANY_INTERFACE_CHOOSE(&peeraddr);
}
else
- peeraddr.ss_family = addr_sock.ss_family;
+ AF(&peeraddr) = AF(&addr_sock);
if (!ctlsettrap(&peeraddr, localaddr, 0,
NTP_VERSION))
{
struct addr_opts_node *curr_fudge;
struct attr_val *curr_opt;
- struct sockaddr_storage addr_sock;
+ sockaddr_u addr_sock;
struct address_node *addr_node;
struct refclockstat clock_stat;
int err_flag;
* ensure that it is sane
*/
addr_node = curr_fudge->addr;
- memset((char *)&addr_sock, 0, sizeof(addr_sock));
+ ZERO_SOCK(&addr_sock);
if (getnetnum(addr_node->address, &addr_sock, 1, t_REF) != 1)
err_flag = 1;
}
/* Parse all the options to the fudge command */
- memset((void *)&clock_stat, 0, sizeof clock_stat);
+ memset(&clock_stat, 0, sizeof(clock_stat));
while (!empty(curr_fudge->options)) {
curr_opt = (struct attr_val *) dequeue(curr_fudge->options);
*/
static int
is_sane_resolved_address(
- struct sockaddr_storage peeraddr,
- int hmode
+ sockaddr_u * peeraddr,
+ int hmode
)
{
- if (
-#ifdef REFCLOCK
- !ISREFCLOCKADR(&peeraddr) &&
-#endif
- ISBADADR(&peeraddr)) {
+ if (!ISREFCLOCKADR(peeraddr) && ISBADADR(peeraddr)) {
msyslog(LOG_ERR,
"attempt to configure invalid address %s",
- stoa(&peeraddr));
+ stoa(peeraddr));
return 0;
}
/*
* address for server/peer!
* and unicast address for manycastclient!
*/
- /* Check for IPv4 */
- if (peeraddr.ss_family == AF_INET) {
- if (((hmode == T_Server) || (hmode == T_Peer) || (hmode == T_Pool)) &&
-#ifdef REFCLOCK
- !ISREFCLOCKADR(&peeraddr) &&
-#endif
- IN_CLASSD(ntohl(((struct sockaddr_in*)&peeraddr)->sin_addr.s_addr))) {
- msyslog(LOG_ERR,
- "attempt to configure invalid address %s",
- stoa(&peeraddr));
- return 0;
- }
- if ((hmode == T_Manycastclient) &&
- !IN_CLASSD(ntohl(((struct sockaddr_in*)&peeraddr)->sin_addr.s_addr))) {
- msyslog(LOG_ERR,
- "attempt to configure invalid address %s",
- stoa(&peeraddr));
- return 0;
- }
-
+ if ((T_Server == hmode || T_Peer == hmode || T_Pool == hmode)
+ && IS_MCAST(peeraddr)) {
+ msyslog(LOG_ERR,
+ "attempt to configure invalid address %s",
+ stoa(peeraddr));
+ return 0;
}
- /* Check for IPv6 */
- else if(peeraddr.ss_family == AF_INET6) {
- if (((hmode == T_Server) || (hmode == T_Peer) || (hmode == T_Pool)) &&
-#ifdef REFCLOCK
- !ISREFCLOCKADR(&peeraddr) &&
-#endif
- IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)&peeraddr)->sin6_addr)) {
- msyslog(LOG_ERR,
- "attempt to configure in valid address %s",
- stoa(&peeraddr));
- return 0;
- }
- if ((hmode == T_Manycastclient) &&
- !IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)&peeraddr)->sin6_addr)) {
- msyslog(LOG_ERR,
- "attempt to configure in valid address %s",
- stoa(&peeraddr));
- return 0;
- }
+ if (T_Manycastclient == hmode && !IS_MCAST(peeraddr)) {
+ msyslog(LOG_ERR,
+ "attempt to configure invalid address %s",
+ stoa(peeraddr));
+ return 0;
}
- if (peeraddr.ss_family == AF_INET6 &&
- isc_net_probeipv6() != ISC_R_SUCCESS)
+ if (IS_IPV6(peeraddr) && !ipv6_works)
return 0;
/* Ok, all tests succeeded, now we can return 1 */
config_peers(void)
{
struct addrinfo *res, *res_bak;
- struct sockaddr_storage peeraddr;
+ sockaddr_u peeraddr;
struct peer_node *curr_peer;
int hmode;
int status;
hmode = get_correct_host_mode(curr_peer->host_mode);
/* Attempt to resolve the address */
- memset((char *)&peeraddr, 0, sizeof(peeraddr));
- peeraddr.ss_family = (u_short)curr_peer->addr->type;
+ ZERO_SOCK(&peeraddr);
+ AF(&peeraddr) = (u_short)curr_peer->addr->type;
status = get_multiple_netnums(curr_peer->addr->address, &peeraddr, &res, 0, t_UNK);
++i;
memcpy(&peeraddr, res->ai_addr,
res->ai_addrlen);
- if (is_sane_resolved_address(peeraddr,
- curr_peer->host_mode))
+ if (is_sane_resolved_address(
+ &peeraddr,
+ curr_peer->host_mode))
+
peer_config(&peeraddr,
- ANY_INTERFACE_CHOOSE(&peeraddr),
+ ANY_INTERFACE_CHOOSE(&peeraddr),
hmode,
curr_peer->peerversion,
curr_peer->minpoll,
config_unpeers(void)
{
struct addrinfo *res, *res_bak;
- struct sockaddr_storage peeraddr;
+ sockaddr_u peeraddr;
struct unpeer_node *curr_unpeer;
struct peer *peer;
int status;
curr_unpeer = (struct unpeer_node *) dequeue(my_config.unpeers);
/* Attempt to resolve the address */
- memset((char *)&peeraddr, 0, sizeof(peeraddr));
- peeraddr.ss_family = (u_short)curr_unpeer->addr->type;
+ ZERO_SOCK(&peeraddr);
+ AF(&peeraddr) = (u_short)curr_unpeer->addr->type;
status = get_multiple_netnums(curr_unpeer->addr->address, &peeraddr, &res, 0, t_UNK);
static int
getnetnum(
const char *num,
- struct sockaddr_storage *addr,
+ sockaddr_u *addr,
int complain,
enum gnn_type a_type
)
static int
get_multiple_netnums(
const char *num,
- struct sockaddr_storage *addr,
+ sockaddr_u *addr,
struct addrinfo **res,
int complain,
enum gnn_type a_type
int retval;
/* Get host address. Looking for UDP datagram connection */
- memset(&hints, 0, sizeof (hints));
- if (addr->ss_family == AF_INET || addr->ss_family == AF_INET6)
- hints.ai_family = addr->ss_family;
+ memset(&hints, 0, sizeof(hints));
+ if (IS_IPV4(addr) || IS_IPV6(addr))
+ hints.ai_family = AF(addr);
else
hints.ai_family = AF_UNSPEC;
/*
* If we don't have an IPv6 stack, just look up IPv4 addresses
*/
- if (isc_net_probeipv6() != ISC_R_SUCCESS)
+ if (!ipv6_works)
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
retval = getaddrinfo(num, "ntp", &hints, &ptr);
- if (retval ||
- (ptr->ai_family == AF_INET6
- && isc_net_probeipv6() != ISC_R_SUCCESS)) {
-
+ if (retval || (AF_INET6 == ptr->ai_family && !ipv6_works)) {
if (complain)
msyslog(LOG_ERR,
"getaddrinfo: \"%s\" invalid host "
static void ctl_putint (const char *, long);
static void ctl_putts (const char *, l_fp *);
static void ctl_putadr (const char *, u_int32,
- struct sockaddr_storage*);
+ sockaddr_u *);
static void ctl_putid (const char *, char *);
static void ctl_putarray (const char *, double *, int);
static void ctl_putsys (int);
static void set_trap (struct recvbuf *, int);
static void unset_trap (struct recvbuf *, int);
static void configure (struct recvbuf *, int);
-static struct ctl_trap *ctlfindtrap (struct sockaddr_storage *,
+static struct ctl_trap *ctlfindtrap (sockaddr_u *,
struct interface *);
static struct ctl_proc control_codes[] = {
static u_char * dataend;
static int datalinelen;
static int datanotbinflag;
-static struct sockaddr_storage *rmt_addr;
+static sockaddr_u *rmt_addr;
static struct interface *lcl_inter;
static u_char res_authenticate;
ctl_putadr(
const char *tag,
u_int32 addr32,
- struct sockaddr_storage* addr
+ sockaddr_u *addr
)
{
register char *cp;
cq = stoa(addr);
while (*cq != '\0')
*cp++ = *cq++;
- ctl_putdata(buffer, (unsigned)( cp - buffer ), 0);
+ ctl_putdata(buffer, (unsigned)(cp - buffer), 0);
}
/*
*/
int
ctlsettrap(
- struct sockaddr_storage *raddr,
+ sockaddr_u *raddr,
struct interface *linter,
int traptype,
int version
*/
int
ctlclrtrap(
- struct sockaddr_storage *raddr,
+ sockaddr_u *raddr,
struct interface *linter,
int traptype
)
*/
static struct ctl_trap *
ctlfindtrap(
- struct sockaddr_storage *raddr,
+ sockaddr_u *raddr,
struct interface *linter
)
{
for (tp = ctl_trap; tp < &ctl_trap[CTL_MAXTRAPS]; tp++) {
if ((tp->tr_flags & TRAP_INUSE)
&& (NSRCPORT(raddr) == NSRCPORT(&tp->tr_addr))
- && SOCKCMP(raddr, &tp->tr_addr)
+ && SOCK_EQ(raddr, &tp->tr_addr)
&& (linter == tp->tr_localaddr) )
return (tp);
}
static struct cert_info *cert_install (struct exten *, struct peer *);
static int cert_hike (struct peer *, struct cert_info *);
static void cert_free (struct cert_info *);
-static struct pkey_info *crypto_key (char *, char *, struct
- sockaddr_storage *);
+static struct pkey_info *crypto_key (char *, char *, sockaddr_u *);
static void bighash (BIGNUM *, BIGNUM *);
static struct cert_info *crypto_cert (char *);
*/
keyid_t
session_key(
- struct sockaddr_storage *srcadr, /* source address */
- struct sockaddr_storage *dstadr, /* destination address */
+ sockaddr_u *srcadr, /* source address */
+ sockaddr_u *dstadr, /* destination address */
keyid_t keyno, /* key ID */
keyid_t private, /* private value */
u_long lifetime /* key lifetime */
* greater than zero, install the key and call it trusted.
*/
hdlen = 0;
- switch(srcadr->ss_family) {
+ switch(AF(srcadr)) {
case AF_INET:
- header[0] =
- ((struct sockaddr_in *)srcadr)->sin_addr.s_addr;
- header[1] =
- ((struct sockaddr_in *)dstadr)->sin_addr.s_addr;
+ header[0] = NSRCADR(srcadr);
+ header[1] = NSRCADR(dstadr);
header[2] = htonl(keyno);
header[3] = htonl(private);
hdlen = 4 * sizeof(u_int32);
break;
case AF_INET6:
- memcpy(&header[0], &GET_INADDR6(*srcadr),
+ memcpy(&header[0], PSOCK_ADDR6(srcadr),
sizeof(struct in6_addr));
- memcpy(&header[4], &GET_INADDR6(*dstadr),
+ memcpy(&header[4], PSOCK_ADDR6(dstadr),
sizeof(struct in6_addr));
header[8] = htonl(keyno);
header[9] = htonl(private);
MD5auth_setkey(keyno, dgst, len);
authtrust(keyno, lifetime);
}
-#ifdef DEBUG
- if (debug > 1)
- printf(
- "session_key: %s > %s %08x %08x hash %08x life %lu\n",
+ DPRINTF(2, ("session_key: %s > %s %08x %08x hash %08x life %lu\n",
stoa(srcadr), stoa(dstadr), keyno,
- private, keyid, lifetime);
-#endif
+ private, keyid, lifetime));
+
return (keyid);
}
{
struct exten *fp; /* extension pointers */
struct cert_info *cp, *xp, *yp; /* cert info/value pointer */
- struct sockaddr_storage *srcadr_sin; /* source address */
+ sockaddr_u *srcadr_sin; /* source address */
u_int32 *pkt; /* packet pointer */
u_int opcode; /* extension field opcode */
char certname[MAXHOSTNAME + 1]; /* subject name buffer */
X509_free(cert);
return (NULL);
}
- ret->subject = emalloc(strlen(ptr) + 1);
- strcpy(ret->subject, ptr + 3);
+ ret->subject = estrdup(ptr + 3);
/*
* Extract remaining objects. Note that the NTP serial number is
X509_free(cert);
return (NULL);
}
- ret->issuer = emalloc(strlen(ptr) + 1);
- strcpy(ret->issuer, ptr + 3);
+ ret->issuer = estrdup(ptr + 3);
ret->first = asn2ntp(X509_get_notBefore(cert));
ret->last = asn2ntp(X509_get_notAfter(cert));
crypto_key(
char *cp, /* file name */
char *passwd1, /* password */
- struct sockaddr_storage *addr /* IP address */
+ sockaddr_u *addr /* IP address */
)
{
FILE *str; /* file handle */
*/
struct conf_entry {
struct conf_entry *ce_next;
- char *ce_name; /* name we are trying to resolve */
- struct conf_peer ce_config; /* configuration info for peer */
- struct sockaddr_storage peer_store; /* address info for both fams */
+ char *ce_name; /* name to resolve */
+ struct conf_peer ce_config; /* config info for peer */
+ sockaddr_u peer_store; /* address info for both fams */
};
#define ce_peeraddr ce_config.peeraddr
#define ce_peeraddr6 ce_config.peeraddr6
#ifdef ISC_PLATFORM_HAVEIPV6
ce->ce_peeraddr6 = in6addr_any;
#endif
- ANYSOCK(&ce->peer_store);
+ ZERO_SOCK(&ce->peer_store);
ce->ce_hmode = (u_char)mode;
ce->ce_version = (u_char)version;
ce->ce_minpoll = (u_char)minpoll;
checkparent(); /* make sure our guy is still running */
- if (entry->ce_name != NULL && !SOCKNUL(&entry->peer_store)) {
+ if (entry->ce_name != NULL && !SOCK_UNSPEC(&entry->peer_store)) {
/* HMS: Squawk? */
msyslog(LOG_ERR, "findhostaddr: both ce_name and ce_peeraddr are defined...");
return 1;
}
- if (entry->ce_name == NULL && SOCKNUL(&entry->peer_store)) {
+ if (entry->ce_name == NULL && SOCK_UNSPEC(&entry->peer_store)) {
msyslog(LOG_ERR, "findhostaddr: both ce_name and ce_peeraddr are undefined!");
return 0;
}
error = getaddrinfo(entry->ce_name, NULL, &hints, &addr);
if (error == 0) {
- entry->peer_store = *((struct sockaddr_storage*)(addr->ai_addr));
- if (entry->peer_store.ss_family == AF_INET) {
+ entry->peer_store = *((sockaddr_u *)(addr->ai_addr));
+ if (IS_IPV4(&entry->peer_store)) {
entry->ce_peeraddr =
- GET_INADDR(entry->peer_store);
+ NSRCADR(&entry->peer_store);
entry->ce_config.v6_flag = 0;
} else {
entry->ce_peeraddr6 =
- GET_INADDR6(entry->peer_store);
+ SOCK_ADDR6(&entry->peer_store);
entry->ce_config.v6_flag = 1;
}
}
"doconfigure: <%s> has peeraddr %s",
ce->ce_name, stoa(&ce->peer_store));
#endif
- if (dores && SOCKNUL(&(ce->peer_store))) {
+ if (dores && SOCK_UNSPEC(&ce->peer_store)) {
if (!findhostaddr(ce)) {
#ifndef IGNORE_DNS_ERRORS
msyslog(LOG_ERR,
}
}
- if (!SOCKNUL(&ce->peer_store)) {
+ if (!SOCK_UNSPEC(&ce->peer_store)) {
if (request(&ce->ce_config)) {
ceremove = ce;
ce = ceremove->ce_next;
# include <config.h>
#endif
+#include <stdio.h>
+#include <signal.h>
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+#ifdef HAVE_SYS_SOCKIO_H /* UXPV: SIOC* #defines (Frank Vance <fvance@waii.com>) */
+# include <sys/sockio.h>
+#endif
+#ifdef HAVE_SYS_UIO_H
+# include <sys/uio.h>
+#endif
+#ifdef HAS_ROUTING_SOCKET
+# include <net/route.h>
+# ifdef HAVE_RTNETLINK
+# include <linux/rtnetlink.h>
+# endif
+#endif
+
#include "ntp_machine.h"
#include "ntpd.h"
#include "ntp_io.h"
#include "ntpsim.h"
#endif
-#include <stdio.h>
-#include <signal.h>
-#ifdef HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif /* HAVE_SYS_PARAM_H */
-#ifdef HAVE_SYS_IOCTL_H
-# include <sys/ioctl.h>
-#endif
-#ifdef HAVE_SYS_SOCKIO_H /* UXPV: SIOC* #defines (Frank Vance <fvance@waii.com>) */
-# include <sys/sockio.h>
-#endif
-#ifdef HAVE_SYS_UIO_H
-# include <sys/uio.h>
-#endif
/*
* setsockopt does not always have the same arg declaration
#if defined(SYS_WINNT)
#include <transmitbuff.h>
#include <isc/win32os.h>
-/*
- * Define this macro to control the behavior of connection
- * resets on UDP sockets. See Microsoft KnowledgeBase Article Q263823
- * for details.
- * NOTE: This requires that Windows 2000 systems install Service Pack 2
- * or later.
- */
-#ifndef SIO_UDP_CONNRESET
-#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
-#endif
-
/*
* Windows C runtime ioctl() can't deal properly with sockets,
* map to ioctlsocket for this source file.
volatile u_long packets_dropped; /* total number of packets dropped on reception */
volatile u_long packets_ignored; /* packets received on wild card interface */
volatile u_long packets_received; /* total number of packets received */
-u_long packets_sent; /* total number of packets sent */
-u_long packets_notsent; /* total number of packets which couldn't be sent */
+ u_long packets_sent; /* total number of packets sent */
+ u_long packets_notsent; /* total number of packets which couldn't be sent */
volatile u_long handler_calls; /* number of calls to interrupt handler */
volatile u_long handler_pkts; /* number of pkts received by handler */
struct interface *any6_interface; /* default ipv6 interface */
struct interface *loopback_interface; /* loopback ipv4 interface */
-isc_boolean_t broadcast_client_enabled = ISC_FALSE; /* is broadcast client enabled */
+isc_boolean_t broadcast_client_enabled; /* is broadcast client enabled */
int ninterfaces; /* Total number of interfaces */
-volatile int disable_dynamic_updates; /* when set to != 0 dynamic updates won't happen */
+int disable_dynamic_updates; /* scan interfaces once only */
#ifdef REFCLOCK
/*
# endif
#endif
-/*
- * Define what the possible "soft" errors can be. These are non-fatal returns
- * of various network related functions, like recv() and so on.
- *
- * For some reason, BSDI (and perhaps others) will sometimes return <0
- * from recv() but will have errno==0. This is broken, but we have to
- * work around it here.
- */
-#define SOFT_ERROR(e) ((e) == EAGAIN || \
- (e) == EWOULDBLOCK || \
- (e) == EINTR || \
- (e) == 0)
-
/*
* File descriptor masks etc. for call to select
* Not needed for I/O Completion Ports
/*
* bit alternating value to detect verified interfaces during an update cycle
*/
-static u_char sys_interphase = 0;
+static u_short sys_interphase = 0;
-static struct interface *new_interface (struct interface *);
-static void add_interface (struct interface *);
-static int update_interfaces (u_short, interface_receiver_t, void *);
-static void remove_interface (struct interface *);
-static struct interface *create_interface (u_short, struct interface *);
+static struct interface *new_interface (struct interface *);
+static void add_interface (struct interface *);
+static int update_interfaces(u_short, interface_receiver_t, void *);
+static void remove_interface(struct interface *);
+static struct interface *create_interface(u_short, struct interface *);
-static int move_fd (SOCKET);
+static int move_fd (SOCKET);
/*
* Multicast functions
*/
-static isc_boolean_t addr_ismulticast (struct sockaddr_storage *);
+static isc_boolean_t addr_ismulticast (sockaddr_u *);
/*
* Not all platforms support multicast
*/
#ifdef MCAST
-static isc_boolean_t socket_multicast_enable (struct interface *, int, struct sockaddr_storage *);
-static isc_boolean_t socket_multicast_disable (struct interface *, struct sockaddr_storage *);
+static isc_boolean_t socket_multicast_enable (struct interface *, int, sockaddr_u *);
+static isc_boolean_t socket_multicast_disable(struct interface *, sockaddr_u *);
#endif
#ifdef DEBUG
+static void interface_dump (struct interface *);
+static void sockaddr_dump (sockaddr_u *psau);
static void print_interface (struct interface *, char *, char *);
-#define DPRINT_INTERFACE(_LVL_, _ARGS_) do { if (debug >= (_LVL_)) { print_interface _ARGS_; } } while (0)
+#define DPRINT_INTERFACE(level, args) do { if (debug >= (level)) { print_interface args; } } while (0)
#else
-#define DPRINT_INTERFACE(_LVL_, _ARGS_) do {} while (0)
+#define DPRINT_INTERFACE(level, args) do {} while (0)
#endif
typedef struct vsock vsock_t;
enum desc_type { FD_TYPE_SOCKET, FD_TYPE_FILE };
struct vsock {
- SOCKET fd;
- enum desc_type type;
- ISC_LINK(vsock_t) link;
+ SOCKET fd;
+ enum desc_type type;
+ ISC_LINK(vsock_t) link;
};
#if !defined(HAVE_IO_COMPLETION_PORT) && defined(HAS_ROUTING_SOCKET)
* like e. g. routing sockets
*/
struct asyncio_reader {
- SOCKET fd; /* fd to be read */
- void *data; /* possibly local data */
+ SOCKET fd; /* fd to be read */
+ void *data; /* possibly local data */
void (*receiver)(struct asyncio_reader *); /* input handler */
- ISC_LINK(struct asyncio_reader) link; /* the list this is being kept in */
+ ISC_LINK(struct asyncio_reader) link; /* the list this is being kept in */
};
ISC_LIST(struct asyncio_reader) asyncio_reader_list;
static void init_async_notifications (void);
static int create_sockets (u_short);
-static SOCKET open_socket (struct sockaddr_storage *, int, int, struct interface *);
+static SOCKET open_socket (sockaddr_u *, int, int, struct interface *);
static char * fdbits (int, fd_set *);
static void set_reuseaddr (int);
-static isc_boolean_t socket_broadcast_enable (struct interface *, SOCKET, struct sockaddr_storage *);
-static isc_boolean_t socket_broadcast_disable (struct interface *, struct sockaddr_storage *);
+static isc_boolean_t socket_broadcast_enable (struct interface *, SOCKET, sockaddr_u *);
+static isc_boolean_t socket_broadcast_disable (struct interface *, sockaddr_u *);
ISC_LIST(vsock_t) fd_list;
typedef struct remaddr remaddr_t;
struct remaddr {
- struct sockaddr_storage addr;
- struct interface *interface;
- ISC_LINK(remaddr_t) link;
+ sockaddr_u addr;
+ struct interface * interface;
+ ISC_LINK(remaddr_t) link;
};
ISC_LIST(remaddr_t) remoteaddr_list;
static void add_fd_to_list (SOCKET, enum desc_type);
static void close_and_delete_fd_from_list (SOCKET);
-static void add_addr_to_list (struct sockaddr_storage *, struct interface *);
-static void delete_addr_from_list (struct sockaddr_storage *);
+static void add_addr_to_list (sockaddr_u *, struct interface *);
+static void delete_addr_from_list (sockaddr_u *);
static void delete_interface_from_list (struct interface *);
-static struct interface *find_addr_in_list (struct sockaddr_storage *);
-static struct interface *find_samenet_addr_in_list (struct sockaddr_storage *);
-static struct interface *find_flagged_addr_in_list (struct sockaddr_storage *, int);
+static struct interface *find_addr_in_list (sockaddr_u *);
+static struct interface *find_samenet_addr_in_list (sockaddr_u *);
+static struct interface *find_flagged_addr_in_list (sockaddr_u *, int);
static void create_wildcards (u_short);
static isc_boolean_t address_okay (isc_interface_t *);
static void convert_isc_if (isc_interface_t *, struct interface *, u_short);
-static struct interface *getinterface (struct sockaddr_storage *, int);
-static struct interface *getsamenetinterface (struct sockaddr_storage *, int);
-static struct interface *findlocalinterface (struct sockaddr_storage *, int, int);
-static struct interface *findlocalcastinterface (struct sockaddr_storage *, int);
+static struct interface *getinterface (sockaddr_u *, int);
+static struct interface *getsamenetinterface (sockaddr_u *, int);
+static struct interface *findlocalinterface (sockaddr_u *, int, int);
+static struct interface *findlocalcastinterface (sockaddr_u *);
/*
* Routines to read the ntp packets
*/
void
connection_reset_fix(
- SOCKET fd,
- struct sockaddr_storage *addr
+ SOCKET fd,
+ sockaddr_u * addr
)
{
- DWORD dwBytesReturned = 0;
+ DWORD dw;
BOOL bNewBehavior = FALSE;
DWORD status;
if (isc_win32os_majorversion() >= 5) {
status = WSAIoctl(fd, SIO_UDP_CONNRESET, &bNewBehavior,
sizeof(bNewBehavior), NULL, 0,
- &dwBytesReturned, NULL, NULL);
+ &dw, NULL, NULL);
if (SOCKET_ERROR == status)
- netsyslog(LOG_ERR, "connection_reset_fix() "
- "failed for address %s: %m",
- stoa(addr));
+ msyslog(LOG_ERR,
+ "connection_reset_fix() failed for address %s: %m",
+ stoa(addr));
}
}
#endif
/*
* on Unix systems the stdio library typically
* makes use of file descriptors in the lower
- * integer range. stdio usually will make use
- * of the file descriptor in the range of
+ * integer range. stdio usually will make use
+ * of the file descriptors in the range of
* [0..FOPEN_MAX)
- * in order to keep this range clean for socket
+ * in order to keep this range clean, for socket
* file descriptors we attempt to move them above
- * FOPEM_MAX. This is not as easy as it sounds as
+ * FOPEN_MAX. This is not as easy as it sounds as
* FOPEN_MAX changes from implementation to implementation
* and may exceed to current file decriptor limits.
* We are using following strategy:
* allocation is possible or 0 is reached - at this
* point the algrithm will be disabled
*/
-static int move_fd(SOCKET fd)
+static int
+move_fd(
+ SOCKET fd
+ )
{
#if !defined(SYS_WINNT) && defined(F_DUPFD)
#ifndef FD_CHUNK
socket_boundary = max(0, min(getdtablesize() - FD_CHUNK,
min(FOPEN_MAX, FD_PREFERRED_SOCKBOUNDARY)));
#ifdef DEBUG
- msyslog(LOG_DEBUG, "ntp_io: estimated max descriptors: %d, initial socket boundary: %d",
+ msyslog(LOG_DEBUG,
+ "ntp_io: estimated max descriptors: %d, initial socket boundary: %d",
getdtablesize(), socket_boundary);
#endif
}
if (newfd != -1) {
/* success: drop the old one - return the new one */
- (void)close(fd);
- return (newfd);
+ close(fd);
+ return newfd;
}
} else {
/* outside reserved range: no work - return the original one */
- return (fd);
+ return fd;
}
socket_boundary = max(0, socket_boundary - FD_CHUNK);
#ifdef DEBUG
- msyslog(LOG_DEBUG, "ntp_io: selecting new socket boundary: %d",
+ msyslog(LOG_DEBUG,
+ "ntp_io: selecting new socket boundary: %d",
socket_boundary);
#endif
} while (socket_boundary > 0);
#endif /* !defined(SYS_WINNT) && defined(F_DUPFD) */
- return (fd);
+ return fd;
}
#ifdef DEBUG_TIMING
void
collect_timing(struct recvbuf *rb, const char *tag, int count, l_fp *dts)
{
- char buf[2048];
+ char buf[256];
snprintf(buf, sizeof(buf), "%s %d %s %s",
- (rb != NULL) ?
- ((rb->dstadr) ? stoa(&rb->recv_srcadr) : "-REFCLOCK-") : "-",
+ (rb != NULL)
+ ? ((rb->dstadr != NULL)
+ ? stoa(&rb->recv_srcadr)
+ : "-REFCLOCK-")
+ : "-",
count, lfptoa(dts, 9), tag);
record_timing_stats(buf);
}
#endif
-
+
/*
* About dynamic interfaces, sockets, reception and more...
*
if (!Win32InitSockets())
{
- netsyslog(LOG_ERR, "No useable winsock.dll: %m");
+ msyslog(LOG_ERR, "No useable winsock.dll: %m");
exit(1);
}
+#if 0 /* transmitbuff code unused */
init_transmitbuff();
+#endif
#endif /* SYS_WINNT */
/*
ISC_LIST_INIT(asyncio_reader_list);
#endif
- ISC_LIST_INIT(remoteaddr_list);
+ ISC_LIST_INIT(remoteaddr_list);
ISC_LIST_INIT(inter_list);
* Create the sockets
*/
BLOCKIO();
- (void) create_sockets(htons(NTP_PORT));
+ create_sockets(NTP_PORT);
UNBLOCKIO();
init_async_notifications();
void
interface_dump(struct interface *itf)
{
- u_char* cp;
- int i;
- /* Limit the size of the sockaddr_storage hex dump */
- int maxsize = min(32, sizeof(struct sockaddr_storage));
-
printf("Dumping interface: %p\n", itf);
printf("fd = %d\n", itf->fd);
printf("bfd = %d\n", itf->bfd);
- printf("sin = %s,\n", stoa(&(itf->sin)));
- cp = (u_char*) &(itf->sin);
- for(i = 0; i < maxsize; i++)
- {
- printf("%02x", *cp++);
- if((i+1)%4 == 0)
- printf(" ");
- }
- printf("\n");
- printf("bcast = %s,\n", stoa(&(itf->bcast)));
- cp = (u_char*) &(itf->bcast);
- for(i = 0; i < maxsize; i++)
- {
- printf("%02x", *cp++);
- if((i+1)%4 == 0)
- printf(" ");
- }
- printf("\n");
- printf("mask = %s,\n", stoa(&(itf->mask)));
- cp = (u_char*) &(itf->mask);
- for(i = 0; i < maxsize; i++)
- {
- printf("%02x", *cp++);
- if((i+1)%4 == 0)
- printf(" ");
- }
- printf("\n");
+ printf("sin = %s,\n", stoa(&itf->sin));
+ sockaddr_dump(&itf->sin);
+ printf("bcast = %s,\n", stoa(&itf->bcast));
+ sockaddr_dump(&itf->bcast);
+ printf("mask = %s,\n", stoa(&itf->mask));
+ sockaddr_dump(&itf->mask);
printf("name = %s\n", itf->name);
printf("flags = 0x%08x\n", itf->flags);
printf("last_ttl = %d\n", itf->last_ttl);
printf("phase = %u\n", itf->phase);
}
+/*
+ * sockaddr_dump - hex dump the start of a sockaddr_u
+ */
+static void
+sockaddr_dump(sockaddr_u *psau)
+{
+ /* Limit the size of the sockaddr_storage hex dump */
+ const int maxsize = min(32, sizeof(psau->sas));
+ u_char * cp;
+ int i;
+
+ cp = (u_char *)&psau->sas;
+
+ for(i = 0; i < maxsize; i++)
+ {
+ printf("%02x", *cp++);
+ if (!((i + 1) % 4))
+ printf(" ");
+ }
+ printf("\n");
+}
+
/*
* print_interface - helper to output debug information
*/
static void
print_interface(struct interface *iface, char *pfx, char *sfx)
{
- printf("%sinterface #%d: fd=%d, bfd=%d, name=%s, flags=0x%x, scope=%d, ifindex=%d",
+ printf("%sinterface #%d: fd=%d, bfd=%d, name=%s, flags=0x%x, scope=%d, ifindex=%d, sin=%s",
pfx,
iface->ifnum,
iface->fd,
iface->name,
iface->flags,
iface->scopeid,
- iface->ifindex);
- /* Leave these as three printf calls (stoa() static buffer). */
- printf(", sin=%s",
- stoa((&iface->sin)));
- if (iface->flags & INT_BROADCAST)
- printf(", bcast=%s,",
- stoa((&iface->bcast)));
- if (iface->family == AF_INET)
- printf(", mask=%s",
- stoa((&iface->mask)));
- printf(", %s:%s", iface->ignore_packets == ISC_FALSE ? "Enabled" : "Disabled", sfx);
+ iface->ifindex,
+ stoa(&iface->sin));
+ if (AF_INET == iface->family) {
+ if (iface->flags & INT_BROADCAST)
+ printf(", bcast=%s", stoa(&iface->bcast));
+ printf(", mask=%s", stoa(&iface->mask));
+ }
+ printf(", %s:%s",
+ (iface->ignore_packets)
+ ? "Disabled"
+ : "Enabled",
+ sfx);
if (debug > 4) /* in-depth debugging only */
interface_dump(iface);
}
-
#endif
#if !defined(HAVE_IO_COMPLETION_PORT) && defined(HAS_ROUTING_SOCKET)
* create an asyncio_reader structure
*/
static struct asyncio_reader *
-new_asyncio_reader()
+new_asyncio_reader(void)
{
struct asyncio_reader *reader;
- reader = (struct asyncio_reader *)emalloc(sizeof(struct asyncio_reader));
+ reader = emalloc(sizeof(*reader));
- memset((char *)reader, 0, sizeof(*reader));
+ memset(reader, 0, sizeof(*reader));
ISC_LINK_INIT(reader, link);
reader->fd = INVALID_SOCKET;
return reader;
* delete a reader
*/
static void
-delete_asyncio_reader(struct asyncio_reader *reader)
+delete_asyncio_reader(
+ struct asyncio_reader *reader
+ )
{
free(reader);
}
* add asynchio_reader
*/
static void
-add_asyncio_reader(struct asyncio_reader *reader, enum desc_type type)
+add_asyncio_reader(
+ struct asyncio_reader * reader,
+ enum desc_type type)
{
ISC_LIST_APPEND(asyncio_reader_list, reader, link);
add_fd_to_list(reader->fd, type);
* remove asynchio_reader
*/
static void
-remove_asyncio_reader(struct asyncio_reader *reader)
+remove_asyncio_reader(
+ struct asyncio_reader *reader
+ )
{
- ISC_LIST_UNLINK_TYPE(asyncio_reader_list, reader, link, struct asyncio_reader);
+ ISC_LIST_UNLINK_TYPE(asyncio_reader_list, reader, link,
+ struct asyncio_reader);
if (reader->fd != INVALID_SOCKET)
close_and_delete_fd_from_list(reader->fd);
* see the bind9/getaddresses.c for details
*/
isc_boolean_t
-is_ip_address( const char *host, isc_netaddr_t *addr)
+is_ip_address(
+ const char * host,
+ isc_netaddr_t * addr
+ )
{
struct in_addr in4;
struct in6_addr in6;
-/*
- * PDM Implement later
- REQUIRE(host != NULL);
- REQUIRE(addrs != NULL);
-*/
+ NTP_REQUIRE(host != NULL);
+ NTP_REQUIRE(addr != NULL);
+
/*
* Try IPv4, then IPv6. In order to handle the extended format
* for IPv6 scoped addresses (address%scope_ID), we'll use a local
* Specific interface code
*/
void
-add_specific_interface (const char *if_name)
+add_specific_interface(
+ const char *if_name
+ )
{
- specific_interface_t *iface;
- isc_netaddr_t *addr;
- addr = emalloc(sizeof(isc_netaddr_t));
+ specific_interface_t *siface;
+ isc_netaddr_t *naddr;
+
+ naddr = emalloc(sizeof(*naddr));
- if (is_ip_address(if_name, addr) == ISC_TRUE) {
- add_limit_address(addr);
+ if (is_ip_address(if_name, naddr)) {
+ add_limit_address(naddr);
} else {
- free(addr);
- iface = (specific_interface_t *)emalloc(sizeof(specific_interface_t));
- iface->name = if_name;
- ISC_LINK_INIT(iface, link);
- ISC_LIST_APPEND(specific_interface_list, iface, link);
+ free(naddr);
+ siface = emalloc(sizeof(*siface));
+ siface->name = if_name;
+ ISC_LINK_INIT(siface, link);
+ ISC_LIST_APPEND(specific_interface_list, siface, link);
}
interface_optioncount++;
}
+
void
-init_specific_interface (void)
+init_specific_interface(void)
{
ISC_LIST_INIT(specific_interface_list);
init_limit_address();
* Limit address code
*/
void
-add_limit_address (const isc_netaddr_t *addr)
+add_limit_address(
+ const isc_netaddr_t *addr
+ )
{
limit_address_t *iaddr;
- iaddr = (limit_address_t *)emalloc(sizeof(limit_address_t));
+ iaddr = emalloc(sizeof(*iaddr));
iaddr->addr = addr;
ISC_LIST_APPEND(limit_address_list, iaddr, link);
}
void
-init_limit_address (void)
+init_limit_address(void)
{
ISC_LIST_INIT(limit_address_list);
}
* interface list enumerator - visitor pattern
*/
void
-interface_enumerate(interface_receiver_t receiver, void *data)
+interface_enumerate(
+ interface_receiver_t receiver,
+ void * data
+ )
{
interface_info_t ifi;
- struct interface *interf;
+ struct interface *interf;
ifi.action = IFS_EXISTS;
interf != NULL;
interf = ISC_LIST_NEXT(interf, link)) {
ifi.interface = interf;
- receiver(data, &ifi);
+ (*receiver)(data, &ifi);
}
}
* do standard initialization of interface structure
*/
static void
-init_interface(struct interface *interface)
+init_interface(
+ struct interface *iface
+ )
{
- memset((char *)interface, 0, sizeof(struct interface));
- ISC_LINK_INIT(interface, link);
- ISC_LIST_INIT(interface->peers);
- interface->fd = INVALID_SOCKET;
- interface->bfd = INVALID_SOCKET;
- interface->num_mcast = 0;
- interface->received = 0;
- interface->sent = 0;
- interface->notsent = 0;
- interface->peercnt = 0;
- interface->phase = sys_interphase;
+ memset(iface, 0, sizeof(*iface));
+ ISC_LINK_INIT(iface, link);
+ ISC_LIST_INIT(iface->peers);
+ iface->fd = INVALID_SOCKET;
+ iface->bfd = INVALID_SOCKET;
+ iface->phase = sys_interphase;
}
+
/*
* create new interface structure initialize from
* template structure or via standard initialization
* function
*/
static struct interface *
-new_interface(struct interface *interface)
+new_interface(
+ struct interface *interface
+ )
{
- static u_int sys_ifnum = 0;
+ static u_int sys_ifnum = 0;
+ struct interface * iface;
- struct interface *iface = (struct interface *)emalloc(sizeof(struct interface));
+ iface = emalloc(sizeof(*iface));
- if (interface != NULL)
- {
- memcpy((char*)iface, (char*)interface, sizeof(*interface));
- }
- else
- {
+ if (NULL == interface)
init_interface(iface);
- }
+ else /* use the template */
+ memcpy(iface, interface, sizeof(*iface));
- iface->ifnum = sys_ifnum++; /* count every new instance of an interface in the system */
+ /* count every new instance of an interface in the system */
+ iface->ifnum = sys_ifnum++;
iface->starttime = current_time;
return iface;
}
+
/*
* return interface storage into free memory pool
*/
-static void
-delete_interface(struct interface *interface)
+static inline void
+delete_interface(
+ struct interface *interface
+ )
{
free(interface);
}
+
/*
* link interface into list of known interfaces
*/
static void
-add_interface(struct interface *interface)
+add_interface(
+ struct interface *interface
+ )
{
+#ifdef DEBUG
static struct interface *listhead = NULL;
/*
listhead, inter_list.head);
exit(1);
}
+#endif
/*
* Calculate the address hash
*/
ninterfaces++;
}
+
/*
* remove interface from known interface list and clean up
* associated resources
*/
static void
-remove_interface(struct interface *interface)
+remove_interface(
+ struct interface *iface
+ )
{
- struct sockaddr_storage resmask;
+ sockaddr_u resmask;
- ISC_LIST_UNLINK_TYPE(inter_list, interface, link, struct interface);
+ ISC_LIST_UNLINK_TYPE(inter_list, iface, link,
+ struct interface);
- delete_interface_from_list(interface);
+ delete_interface_from_list(iface);
- if (interface->fd != INVALID_SOCKET)
- {
- msyslog(LOG_INFO, "Deleting interface #%d %s, %s#%d, interface stats: received=%ld, sent=%ld, dropped=%ld, active_time=%ld secs",
- interface->ifnum,
- interface->name,
- stoa((&interface->sin)),
- NTP_PORT, /* XXX should extract port from sin structure */
- interface->received,
- interface->sent,
- interface->notsent,
- current_time - interface->starttime);
-
- close_and_delete_fd_from_list(interface->fd);
+ if (iface->fd != INVALID_SOCKET) {
+ msyslog(LOG_INFO,
+ "Deleting interface #%d %s, %s#%d, interface stats: received=%ld, sent=%ld, dropped=%ld, active_time=%ld secs",
+ iface->ifnum,
+ iface->name,
+ stoa(&iface->sin),
+ SRCPORT(&iface->sin),
+ iface->received,
+ iface->sent,
+ iface->notsent,
+ current_time - iface->starttime);
+
+ close_and_delete_fd_from_list(iface->fd);
}
-
- if (interface->bfd != INVALID_SOCKET)
- {
- msyslog(LOG_INFO, "Deleting interface #%d %s, broadcast address %s#%d",
- interface->ifnum,
- interface->name,
- stoa((&interface->bcast)),
- (u_short) NTP_PORT); /* XXX extract port from sin structure */
- close_and_delete_fd_from_list(interface->bfd);
+
+ if (iface->bfd != INVALID_SOCKET) {
+ msyslog(LOG_INFO,
+ "Deleting broadcast address %s#%d from interface #%d %s",
+ stoa(&iface->bcast),
+ SRCPORT(&iface->bcast),
+ iface->ifnum,
+ iface->name);
+
+ close_and_delete_fd_from_list(iface->bfd);
}
ninterfaces--;
- ntp_monclearinterface(interface);
+ ntp_monclearinterface(iface);
/* remove restrict interface entry */
-
- /*
- * Blacklist bound interface address
- */
- SET_HOSTMASK(&resmask, interface->sin.ss_family);
- hack_restrict(RESTRICT_REMOVEIF, &interface->sin, &resmask,
- RESM_NTPONLY|RESM_INTERFACE, RES_IGNORE);
+ SET_HOSTMASK(&resmask, AF(&iface->sin));
+ hack_restrict(RESTRICT_REMOVEIF, &iface->sin, &resmask,
+ RESM_NTPONLY | RESM_INTERFACE, RES_IGNORE);
}
+
static void
-list_if_listening(struct interface *interface, u_short port)
+list_if_listening(
+ struct interface * interface
+ )
{
msyslog(LOG_INFO, "Listening on interface #%d %s, %s#%d %s",
interface->ifnum,
interface->name,
- stoa((&interface->sin)),
- ntohs( (u_short) port),
- (interface->ignore_packets == ISC_FALSE) ?
- "Enabled": "Disabled");
+ stoa(&interface->sin),
+ SRCPORT(&interface->sin),
+ (interface->ignore_packets)
+ ? "Disabled"
+ : "Enabled");
}
+
static void
-create_wildcards(u_short port) {
- isc_boolean_t okipv4 = ISC_TRUE;
+create_wildcards(
+ u_short port
+ )
+{
+ struct interface * interface;
+
/*
* create pseudo-interface with wildcard IPv4 address
*/
-#ifdef IPV6_V6ONLY
- if(isc_net_probeipv4() != ISC_R_SUCCESS)
- okipv4 = ISC_FALSE;
-#endif
+ if (ipv4_works) {
+ interface = new_interface(NULL);
- if(okipv4 == ISC_TRUE) {
- struct interface *interface = new_interface(NULL);
+ strncpy(interface->name, "wildcard", COUNTOF(interface->name));
+ interface->family =
+ AF(&interface->sin) =
+ AF(&interface->mask) = AF_INET;
+ SET_ADDR4(&interface->sin, INADDR_ANY);
+ SET_PORT(&interface->sin, port);
+ SET_ONESMASK(&interface->mask);
- interface->family = AF_INET;
- interface->sin.ss_family = AF_INET;
- ((struct sockaddr_in*)&interface->sin)->sin_addr.s_addr = htonl(INADDR_ANY);
- ((struct sockaddr_in*)&interface->sin)->sin_port = port;
- (void) strncpy(interface->name, "wildcard", sizeof(interface->name));
- interface->mask.ss_family = AF_INET;
- ((struct sockaddr_in*)&interface->mask)->sin_addr.s_addr = htonl(~(u_int32)0);
interface->flags = INT_BROADCAST | INT_UP | INT_WILDCARD;
interface->ignore_packets = ISC_TRUE;
#if defined(MCAST)
/*
- * enable possible multicast reception on the broadcast socket
+ * enable multicast reception on the broadcast socket
*/
- interface->bcast.ss_family = AF_INET;
- ((struct sockaddr_in*)&interface->bcast)->sin_port = port;
- ((struct sockaddr_in*)&interface->bcast)->sin_addr.s_addr = htonl(INADDR_ANY);
+ AF(&interface->bcast) = AF_INET;
+ SET_ADDR4(&interface->bcast, INADDR_ANY);
+ SET_PORT(&interface->bcast, port);
#endif /* MCAST */
interface->fd = open_socket(&interface->sin,
0, 1, interface);
add_addr_to_list(&interface->sin, interface);
add_interface(interface);
- list_if_listening(interface, port);
+ list_if_listening(interface);
} else {
- msyslog(LOG_ERR, "unable to bind to wildcard socket address %s - another process may be running - EXITING",
- stoa((&interface->sin)));
+ msyslog(LOG_ERR,
+ "unable to bind to wildcard address %s - another process may be running - EXITING",
+ stoa(&interface->sin));
exit(1);
}
- DPRINT_INTERFACE(2, (interface, "created ", "\n"));
+ DPRINT_INTERFACE(2, (interface, "created ", "\n"));
}
#ifdef INCLUDE_IPV6_SUPPORT
/*
* create pseudo-interface with wildcard IPv6 address
*/
- if (isc_net_probeipv6() == ISC_R_SUCCESS) {
- struct interface *interface = new_interface(NULL);
-
- interface->family = AF_INET6;
- interface->sin.ss_family = AF_INET6;
- ((struct sockaddr_in6*)&interface->sin)->sin6_addr = in6addr_any;
- ((struct sockaddr_in6*)&interface->sin)->sin6_port = port;
-# ifdef ISC_PLATFORM_HAVESCOPEID
- ((struct sockaddr_in6*)&interface->sin)->sin6_scope_id = 0;
-# endif
- (void) strncpy(interface->name, "wildcard", sizeof(interface->name));
- interface->mask.ss_family = AF_INET6;
- memset(&((struct sockaddr_in6*)&interface->mask)->sin6_addr.s6_addr, 0xff, sizeof(struct in6_addr));
+ if (ipv6_works) {
+ interface = new_interface(NULL);
+
+ strncpy(interface->name, "wildcard", COUNTOF(interface->name));
+ interface->family =
+ AF(&interface->sin) =
+ AF(&interface->mask) = AF_INET6;
+ SET_ADDR6N(&interface->sin, in6addr_any);
+ SET_PORT(&interface->sin, port);
+ SET_SCOPE(&interface->sin, 0);
+ SET_ONESMASK(&interface->mask);
+
interface->flags = INT_UP | INT_WILDCARD;
interface->ignore_packets = ISC_TRUE;
any6_interface = interface;
add_addr_to_list(&interface->sin, interface);
add_interface(interface);
- list_if_listening(interface, port);
+ list_if_listening(interface);
} else {
- msyslog(LOG_ERR, "unable to bind to wildcard socket address %s - another process may be running - EXITING",
- stoa((&interface->sin)));
+ msyslog(LOG_ERR,
+ "unable to bind to wildcard address %s - another process may be running - EXITING",
+ stoa(&interface->sin));
exit(1);
}
- DPRINT_INTERFACE(2, (interface, "created ", "\n"));
+ DPRINT_INTERFACE(2, (interface, "created ", "\n"));
}
#endif
}
+
static isc_boolean_t
-address_okay(isc_interface_t *isc_if) {
+address_okay(
+ isc_interface_t *isc_if
+ )
+{
+ const limit_address_t *laddr;
+ specific_interface_t *iface;
+
DPRINTF(4, ("address_okay: listen Virtual: %d, IF name: %s\n",
listen_to_virtual_ips, isc_if->name));
/*
* Always allow the loopback
*/
- if((isc_if->flags & INTERFACE_F_LOOPBACK) != 0) {
+ if (INTERFACE_F_LOOPBACK & isc_if->flags) {
DPRINTF(4, ("address_okay: loopback - OK\n"));
return (ISC_TRUE);
}
/*
- * Check if the IP address matches one given to -I, which if given
- * limits interfaces/addresses to be used to those listed with -I.
+ * Check if the IP address matches one given to -I, which limits
+ * interfaces/addresses to be used to only those listed with -I.
*/
- {
- const limit_address_t *laddr;
- for (laddr = ISC_LIST_HEAD(limit_address_list); laddr != NULL; laddr = ISC_LIST_NEXT(laddr, link))
- if (isc_netaddr_equal(&(isc_if->address), laddr->addr)) {
- DPRINTF(4, ("address_okay: specific interface address matched - OK\n"));
- return (ISC_TRUE);
- }
- }
+ for (laddr = ISC_LIST_HEAD(limit_address_list);
+ NULL != laddr;
+ laddr = ISC_LIST_NEXT(laddr, link))
+ if (isc_netaddr_equal(&isc_if->address, laddr->addr)) {
+ DPRINTF(4, ("address_okay: specific interface address matched - OK\n"));
+ return (ISC_TRUE);
+ }
/*
* Check if the interface name was specified with an -I option.
*/
- {
- specific_interface_t *iface;
- for (iface = ISC_LIST_HEAD(specific_interface_list); iface != NULL; iface = ISC_LIST_NEXT(iface, link))
- if (strcasecmp(isc_if->name, iface->name) == 0) {
- DPRINTF(4, ("address_okay: specific interface name matched - OK\n"));
- return (ISC_TRUE);
- }
- }
+ for (iface = ISC_LIST_HEAD(specific_interface_list);
+ NULL != iface;
+ iface = ISC_LIST_NEXT(iface, link))
+ if (!strcasecmp(isc_if->name, iface->name)) {
+ DPRINTF(4, ("address_okay: specific interface name matched - OK\n"));
+ return (ISC_TRUE);
+ }
/*
* Check if we are excluding virtual IPs/aliases, and if so, is
* this interface such?
*/
- if (listen_to_virtual_ips == 0 &&
- (strchr(isc_if->name, (int)':') != NULL)) {
- DPRINTF(4, ("address_okay: virtual ip/alias - FAIL\n"));
+ if (!listen_to_virtual_ips
+ && strchr(isc_if->name, ':') != NULL) {
+ DPRINTF(4, ("address_okay: virtual ip/alias - NO\n"));
return (ISC_FALSE);
}
/*
* If any -I options were given, only listed interfaces and
* addresses are used.
*/
- if (interface_optioncount > 0) {
- DPRINTF(4, ("address_okay: FAIL\n"));
+ if (interface_optioncount) {
+ DPRINTF(4, ("address_okay: not given with -I, NO\n"));
return (ISC_FALSE);
}
DPRINTF(4, ("address_okay: OK\n"));
return (ISC_TRUE);
}
+
static void
-convert_isc_if(isc_interface_t *isc_if, struct interface *itf, u_short port) {
+convert_isc_if(
+ isc_interface_t *isc_if,
+ struct interface *itf,
+ u_short port
+ )
+{
+ strncpy(itf->name, isc_if->name, sizeof(itf->name));
+ itf->ifindex = isc_if->ifindex;
+ itf->family =
+ AF(&itf->sin) =
+ AF(&itf->mask) =
+ AF(&itf->bcast) = (u_short)isc_if->af;
+ SET_PORT(&itf->sin, port);
+ SET_PORT(&itf->mask, port);
+ SET_PORT(&itf->bcast, port);
itf->scopeid = 0;
- itf->family = (short) isc_if->af;
- strcpy(itf->name, isc_if->name);
- if(isc_if->af == AF_INET) {
- itf->sin.ss_family = (u_short) isc_if->af;
- memcpy(&(((struct sockaddr_in*)&itf->sin)->sin_addr),
- &(isc_if->address.type.in),
- sizeof(struct in_addr));
- ((struct sockaddr_in*)&itf->sin)->sin_port = port;
+ if (IS_IPV4(&itf->sin)) {
+ NSRCADR(&itf->sin) = isc_if->address.type.in.s_addr;
+ NSRCADR(&itf->mask) = isc_if->netmask.type.in.s_addr;
if((isc_if->flags & INTERFACE_F_BROADCAST) != 0) {
itf->flags |= INT_BROADCAST;
- itf->bcast.ss_family = itf->sin.ss_family;
- memcpy(&(((struct sockaddr_in*)&itf->bcast)->sin_addr),
- &(isc_if->broadcast.type.in),
- sizeof(struct in_addr));
- ((struct sockaddr_in*)&itf->bcast)->sin_port = port;
+ NSRCADR(&itf->bcast) =
+ isc_if->broadcast.type.in.s_addr;
}
-
- itf->mask.ss_family = itf->sin.ss_family;
- memcpy(&(((struct sockaddr_in*)&itf->mask)->sin_addr),
- &(isc_if->netmask.type.in),
- sizeof(struct in_addr));
- ((struct sockaddr_in*)&itf->mask)->sin_port = port;
}
#ifdef INCLUDE_IPV6_SUPPORT
- else if (isc_if->af == AF_INET6) {
- itf->sin.ss_family = (u_short) isc_if->af;
- memcpy(&(((struct sockaddr_in6 *)&itf->sin)->sin6_addr),
- &(isc_if->address.type.in6),
- sizeof(((struct sockaddr_in6 *)&itf->sin)->sin6_addr));
- ((struct sockaddr_in6 *)&itf->sin)->sin6_port = port;
-
-#ifdef ISC_PLATFORM_HAVESCOPEID
- ((struct sockaddr_in6 *)&itf->sin)->sin6_scope_id = isc_netaddr_getzone(&isc_if->address);
- itf->scopeid = isc_netaddr_getzone(&isc_if->address);
-#endif
- itf->mask.ss_family = itf->sin.ss_family;
- memcpy(&(((struct sockaddr_in6 *)&itf->mask)->sin6_addr),
- &(isc_if->netmask.type.in6),
- sizeof(struct in6_addr));
- ((struct sockaddr_in6 *)&itf->mask)->sin6_port = port;
- /* Copy the interface index */
- itf->ifindex = isc_if->ifindex;
+ else if (IS_IPV6(&itf->sin)) {
+ SET_ADDR6N(&itf->sin, isc_if->address.type.in6);
+ SET_ADDR6N(&itf->mask, isc_if->netmask.type.in6);
+
+ SET_SCOPE(&itf->sin,
+ isc_netaddr_getzone(&isc_if->address));
+ itf->scopeid = SCOPE(&itf->sin);
}
#endif /* INCLUDE_IPV6_SUPPORT */
/* Process the rest of the flags */
- if((isc_if->flags & INTERFACE_F_UP) != 0)
- itf->flags |= INT_UP;
- if((isc_if->flags & INTERFACE_F_LOOPBACK) != 0)
- itf->flags |= INT_LOOPBACK;
- if((isc_if->flags & INTERFACE_F_POINTTOPOINT) != 0)
- itf->flags |= INT_PPP;
- if((isc_if->flags & INTERFACE_F_MULTICAST) != 0)
- itf->flags |= INT_MULTICAST;
-
+ itf->flags =
+ (INTERFACE_F_UP & isc_if->flags)
+ ? INT_UP : 0
+ | (INTERFACE_F_LOOPBACK & isc_if->flags)
+ ? INT_LOOPBACK : 0
+ | (INTERFACE_F_POINTTOPOINT & isc_if->flags)
+ ? INT_PPP : 0
+ | (INTERFACE_F_MULTICAST & isc_if->flags)
+ ? INT_MULTICAST : 0
+ ;
}
+
/*
* refresh_interface
*
* the socket.
*/
static int
-refresh_interface(struct interface * interface)
+refresh_interface(
+ struct interface * interface
+ )
{
#ifdef OS_MISSES_SPECIFIC_ROUTE_UPDATES
- if (interface->fd != INVALID_SOCKET)
- {
+ if (interface->fd != INVALID_SOCKET) {
close_and_delete_fd_from_list(interface->fd);
interface->fd = open_socket(&interface->sin,
0, 0, interface);
* next time around
*/
interface->last_ttl = 0;
- return interface->fd != INVALID_SOCKET;
- }
- else
- {
+ return (interface->fd != INVALID_SOCKET);
+ } else
return 0; /* invalid sockets are not refreshable */
- }
#else /* !OS_MISSES_SPECIFIC_ROUTE_UPDATES */
- return interface->fd != INVALID_SOCKET;
+ return (interface->fd != INVALID_SOCKET);
#endif /* !OS_MISSES_SPECIFIC_ROUTE_UPDATES */
}
* interface_update - externally callable update function
*/
void
-interface_update(interface_receiver_t receiver, void *data)
+interface_update(
+ interface_receiver_t receiver,
+ void * data)
{
- if (!disable_dynamic_updates) {
- int new_interface_found;
+ int new_interface_found;
- BLOCKIO();
- new_interface_found = update_interfaces(htons(NTP_PORT), receiver, data);
- UNBLOCKIO();
+ if (disable_dynamic_updates)
+ return;
+
+ BLOCKIO();
+ new_interface_found = update_interfaces(NTP_PORT, receiver, data);
+ UNBLOCKIO();
+
+ if (!new_interface_found)
+ return;
- if (new_interface_found) {
#ifdef DEBUG
- msyslog(LOG_DEBUG, "new interface(s) found: waking up resolver");
+ msyslog(LOG_DEBUG, "new interface(s) found: waking up resolver");
#endif
#ifdef SYS_WINNT
- /* wake up the resolver thread */
- if (ResolverEventHandle != NULL)
- SetEvent(ResolverEventHandle);
+ /* wake up the resolver thread */
+ if (ResolverEventHandle != NULL)
+ SetEvent(ResolverEventHandle);
#else
- /* write any single byte to the pipe to wake up the resolver process */
- write( resolver_pipe_fd[1], &new_interface_found, 1 );
+ /* write any single byte to the pipe to wake up the resolver process */
+ write( resolver_pipe_fd[1], &new_interface_found, 1 );
#endif
- }
- }
}
-/*
- * find out if a given interface structure contains
- * a wildcard address
- */
+
static int
-is_wildcard_addr(struct sockaddr_storage *sas)
+is_wildcard_addr(
+ sockaddr_u *psau
+ )
{
- if (sas->ss_family == AF_INET &&
- ((struct sockaddr_in*)sas)->sin_addr.s_addr == htonl(INADDR_ANY))
+ if (IS_IPV4(psau) && !NSRCADR(psau))
return 1;
#ifdef INCLUDE_IPV6_SUPPORT
- if (sas->ss_family == AF_INET6 &&
- memcmp(&((struct sockaddr_in6*)sas)->sin6_addr, &in6addr_any,
- sizeof(in6addr_any) == 0))
+ if (IS_IPV6(psau) && S_ADDR6_EQ(psau, &in6addr_any))
return 1;
#endif
return 0;
}
+
#ifdef OS_NEEDS_REUSEADDR_FOR_IFADDRBIND
/*
* enable/disable re-use of wildcard address socket
*/
static void
-set_wildcard_reuse(int family, int on)
+set_wildcard_reuse(
+ u_short family,
+ int on
+ )
{
- int onvalue = 1;
- int offvalue = 0;
- int *onoff;
+ struct interface *any;
SOCKET fd = INVALID_SOCKET;
- onoff = on ? &onvalue : &offvalue;
-
- switch (family) {
- case AF_INET:
- if (any_interface) {
- fd = any_interface->fd;
- }
- break;
-
-#ifdef INCLUDE_IPV6_SUPPORT
- case AF_INET6:
- if (any6_interface) {
- fd = any6_interface->fd;
- }
- break;
-#endif /* !INCLUDE_IPV6_SUPPORT */
- }
+ any = ANY_INTERFACE_BYFAM(family);
+ if (any != NULL)
+ fd = any->fd;
if (fd != INVALID_SOCKET) {
- if (setsockopt(fd, SOL_SOCKET,
- SO_REUSEADDR, (char *)onoff,
- sizeof(*onoff))) {
- netsyslog(LOG_ERR, "set_wildcard_reuse: setsockopt(SO_REUSEADDR, %s) failed: %m", *onoff ? "on" : "off");
- }
- DPRINTF(4, ("set SO_REUSEADDR to %s on %s\n", *onoff ? "ON" : "OFF",
- stoa((family == AF_INET) ?
- &any_interface->sin : &any6_interface->sin)));
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
+ (char *)&on, sizeof(on)))
+ msyslog(LOG_ERR,
+ "set_wildcard_reuse: setsockopt(SO_REUSEADDR, %s) failed: %m",
+ on ? "on" : "off");
+
+ DPRINTF(4, ("set SO_REUSEADDR to %s on %s\n",
+ on ? "on" : "off",
+ stoa(any)));
}
}
#endif /* OS_NEEDS_REUSEADDR_FOR_IFADDRBIND */
* Phase 1:
* forall currently existing interfaces
* if address is known:
- * drop socket - rebind again
+ * drop socket - rebind again
*
* if address is NOT known:
- * attempt to create a new interface entry
+ * attempt to create a new interface entry
*
* Phase 2:
* forall currently known non MCAST and WILDCARD interfaces
* if interface does not match configuration phase (not seen in phase 1):
- * remove interface from known interface list
- * forall peers associated with this interface
- * disconnect peer from this interface
+ * remove interface from known interface list
+ * forall peers associated with this interface
+ * disconnect peer from this interface
*
* Phase 3:
* attempt to re-assign interfaces to peers
static int
update_interfaces(
- u_short port,
- interface_receiver_t receiver,
- void *data
+ u_short port,
+ interface_receiver_t receiver,
+ void * data
)
{
- interface_info_t ifi;
- isc_mem_t *mctx = NULL;
- isc_interfaceiter_t *iter = NULL;
- isc_boolean_t scan_ipv4 = ISC_FALSE;
- isc_boolean_t scan_ipv6 = ISC_FALSE;
- isc_result_t result;
- int new_interface_found = 0;
-
- DPRINTF(3, ("update_interfaces(%d)\n", ntohs( (u_short) port)));
-
-#ifdef INCLUDE_IPV6_SUPPORT
- if (isc_net_probeipv6() == ISC_R_SUCCESS)
- scan_ipv6 = ISC_TRUE;
-#if defined(DEBUG)
- else
- if (debug)
- netsyslog(LOG_ERR, "no IPv6 interfaces found");
-#endif
-#endif
+ interface_info_t ifi;
+ isc_interfaceiter_t * iter;
+ isc_result_t result;
+ isc_interface_t isc_if;
+ int new_interface_found;
+ unsigned int family;
+ struct interface interface;
+ struct interface * iface;
+ struct interface * next;
+ struct peer * peer;
+
+ DPRINTF(3, ("update_interfaces(%d)\n", port));
- if (isc_net_probeipv4() == ISC_R_SUCCESS)
- scan_ipv4 = ISC_TRUE;
-#ifdef DEBUG
- else
- if(debug)
- netsyslog(LOG_ERR, "no IPv4 interfaces found");
-#endif
/*
* phase one - scan interfaces
* - create those that are not found
* - update those that are found
*/
- result = isc_interfaceiter_create(mctx, &iter);
+ new_interface_found = 0;
+ iter = NULL;
+ result = isc_interfaceiter_create(NULL, &iter);
if (result != ISC_R_SUCCESS)
return 0;
- sys_interphase ^= 0x1; /* toggle system phase for finding untouched (to be deleted) interfaces */
+ /*
+ * Toggle system interface scan phase to find untouched
+ * interfaces to be deleted.
+ */
+ sys_interphase ^= 0x1;
for (result = isc_interfaceiter_first(iter);
- result == ISC_R_SUCCESS;
- result = isc_interfaceiter_next(iter))
- {
- isc_interface_t isc_if;
- unsigned int family;
- struct interface interface;
- struct interface *iface;
-
+ ISC_R_SUCCESS == result;
+ result = isc_interfaceiter_next(iter)) {
+
result = isc_interfaceiter_current(iter, &isc_if);
if (result != ISC_R_SUCCESS)
/* See if we have a valid family to use */
family = isc_if.address.family;
- if (family != AF_INET && family != AF_INET6)
+ if (AF_INET != family && AF_INET6 != family)
continue;
- if (scan_ipv4 == ISC_FALSE && family == AF_INET)
+ if (AF_INET == family && !ipv4_works)
continue;
- if (scan_ipv6 == ISC_FALSE && family == AF_INET6)
+ if (AF_INET6 == family && !ipv6_works)
continue;
- /*
- * create prototype
- */
+ /* create prototype */
init_interface(&interface);
convert_isc_if(&isc_if, &interface, port);
* and potentially causing problems with more than one
* process fiddling with the clock
*/
- if (address_okay(&isc_if) == ISC_TRUE) {
+ if (address_okay(&isc_if))
interface.ignore_packets = ISC_FALSE;
- }
else {
#ifndef NO_LISTEN_READ_DROP
interface.ignore_packets = ISC_TRUE;
DPRINT_INTERFACE(4, (&interface, "examining ", "\n"));
- if (!(interface.flags & INT_UP)) { /* interfaces must be UP to be usable */
- DPRINTF(4, ("skipping interface %s (%s) - DOWN\n", interface.name, stoa(&interface.sin)));
+ /* interfaces must be UP to be usable */
+ if (!(interface.flags & INT_UP)) {
+ DPRINTF(4, ("skipping interface %s (%s) - DOWN\n",
+ interface.name, stoa(&interface.sin)));
continue;
}
continue;
/*
- * map to local *address* in order
- * to map all duplicate interfaces to an interface structure
- * with the appropriate socket (our name space is
- * (ip-address) - NOT (interface name, ip-address))
+ * map to local *address* in order to map all duplicate
+ * interfaces to an interface structure with the
+ * appropriate socket. Our name space is (ip-address),
+ * NOT (interface name, ip-address).
*/
iface = getinterface(&interface.sin, INT_WILDCARD);
- if (iface && refresh_interface(iface))
- {
+ if (iface != NULL && refresh_interface(iface)) {
/*
- * found existing and up to date interface - mark present
+ * found existing and up to date interface -
+ * mark present.
*/
- if (iface->phase != sys_interphase)
- {
- /*
- * on a new round we reset the name so the interface name
- * shows up again if this address is not shared any more
- * same reasoning goes for the enable flag
- */
- strcpy(iface->name, interface.name);
- iface->ignore_packets = interface.ignore_packets;
- } else {
+ if (iface->phase != sys_interphase) {
/*
- * name collision - rename interface name to "*multiple*"
+ * On a new round we reset the name so
+ * the interface name shows up again if
+ * this address is no longer shared.
+ * The same reasoning goes for the
+ * ignore_packets flag.
*/
- strcpy(iface->name, "*multiple*");
- }
-
- DPRINT_INTERFACE(4, (iface, "updating ", " present\n"));
-
- if (iface->ignore_packets != interface.ignore_packets)
- {
+ strncpy(iface->name, interface.name,
+ sizeof(iface->name));
+ iface->ignore_packets =
+ interface.ignore_packets;
+ } else
+ /* name collision - rename interface */
+ strncpy(iface->name, "*multiple*",
+ sizeof(iface->name));
+
+ DPRINT_INTERFACE(4, (iface, "updating ",
+ " present\n"));
+
+ if (iface->ignore_packets !=
+ interface.ignore_packets) {
/*
- * We have conflicting configurations for the interface address.
- * This is caused by using -I <interfacename> for an interface
- * that shares it address with other interfaces. We cannot disambiguate
- * incoming pakets being delivered to this socket without extra
- * syscalls/features. These are not (commonly) available.
- * Note is is a more unusual configuration where several interfaces
- * share an address but filtering via interface name is attempted.
- * We resolve the configuration conflict by disabling the reception
- * of pakets. This leads to a basically non-functional service on the
- * interface address where the conflict occurs.
+ * We have conflicting configurations
+ * for the interface address. This is
+ * caused by using -I <interfacename>
+ * for an interface that shares its
+ * address with other interfaces. We
+ * can not disambiguate incoming
+ * packets delivered to this socket
+ * without extra syscalls/features.
+ * These are not (commonly) available.
+ * Note this is a more unusual
+ * configuration where several
+ * interfaces share an address but
+ * filtering via interface name is
+ * attempted. We resolve the
+ * configuration conflict by disabling
+ * the processing of received packets.
+ * This leads to no service on the
+ * interface address where the conflict
+ * occurs.
*/
- msyslog(LOG_ERR, "WARNING: conflicting enable configuration for interfaces %s and %s for address %s - unsupported configuration - address DISABLED",
- interface.name, iface->name, stoa(&interface.sin));
+ msyslog(LOG_ERR,
+ "WARNING: conflicting enable configuration for interfaces %s and %s for address %s - unsupported configuration - address DISABLED",
+ interface.name, iface->name,
+ stoa(&interface.sin));
iface->ignore_packets = ISC_TRUE;
}
ifi.action = IFS_EXISTS;
ifi.interface = iface;
- if (receiver)
- receiver(data, &ifi);
- }
- else
- {
+ if (receiver != NULL)
+ (*receiver)(data, &ifi);
+ } else {
/*
- * this is new or refreshing failed - add to our interface list
- * if refreshing failed we will delete the interface structure in
- * phase 2 as the interface was not marked current. We can bind to
- * the address as the refresh code already closed the offending socket
+ * This is new or refreshing failed - add to
+ * our interface list. If refreshing failed we
+ * will delete the interface structure in phase
+ * 2 as the interface was not marked current.
+ * We can bind to the address as the refresh
+ * code already closed the offending socket
*/
-
iface = create_interface(port, &interface);
- if (iface)
- {
+ if (iface != NULL) {
ifi.action = IFS_CREATED;
ifi.interface = iface;
- if (receiver)
- receiver(data, &ifi);
+ if (receiver != NULL)
+ (*receiver)(data, &ifi);
new_interface_found = 1;
- DPRINT_INTERFACE(3, (iface, "updating ", " new - created\n"));
- }
- else
- {
- DPRINT_INTERFACE(3, (&interface, "updating ", " new - creation FAILED"));
+ DPRINT_INTERFACE(3,
+ (iface, "updating ",
+ " new - created\n"));
+ } else {
+ DPRINT_INTERFACE(3,
+ (&interface, "updating ",
+ " new - creation FAILED"));
- msyslog(LOG_INFO, "failed to initialize interface for address %s", stoa(&interface.sin));
+ msyslog(LOG_INFO,
+ "failed to init interface for address %s",
+ stoa(&interface.sin));
continue;
}
}
isc_interfaceiter_destroy(&iter);
/*
- * phase 2 - delete gone interfaces - reassigning peers to other interfaces
+ * phase 2 - delete gone interfaces - reassigning peers to
+ * other interfaces
*/
- {
- struct interface *interf = ISC_LIST_HEAD(inter_list);
+ iface = ISC_LIST_HEAD(inter_list);
+
+ while (iface != NULL) {
+ next = ISC_LIST_NEXT(iface, link);
+
+ if (!(iface->flags & (INT_WILDCARD | INT_MCASTIF))) {
+ /*
+ * if phase does not match sys_phase this
+ * interface was not enumerated during the last
+ * interface scan - so it is gone and will be
+ * deleted here unless it is solely an MCAST or
+ * WILDCARD interface.
+ */
+ if (iface->phase != sys_interphase) {
+ DPRINT_INTERFACE(3,
+ (iface, "updating ",
+ "GONE - deleting\n"));
+ remove_interface(iface);
+
+ ifi.action = IFS_DELETED;
+ ifi.interface = iface;
+ if (receiver != NULL)
+ (*receiver)(data, &ifi);
- while (interf != NULL)
- {
- struct interface *next = ISC_LIST_NEXT(interf, link);
-
- if (!(interf->flags & (INT_WILDCARD|INT_MCASTIF))) {
/*
- * if phase does not match sys_phase this interface was not
- * enumerated during interface scan - so it is gone and
- * will be deleted here unless it is solely an MCAST/WILDCARD interface
+ * disconnect peers from deleted
+ * interface
*/
- if (interf->phase != sys_interphase) {
- struct peer *peer;
- DPRINT_INTERFACE(3, (interf, "updating ", "GONE - deleting\n"));
- remove_interface(interf);
-
- ifi.action = IFS_DELETED;
- ifi.interface = interf;
- if (receiver)
- receiver(data, &ifi);
-
- peer = ISC_LIST_HEAD(interf->peers);
- /*
- * disconnect peer from deleted interface
- */
- while (peer != NULL) {
- struct peer *npeer = ISC_LIST_NEXT(peer, ilink);
-
- /*
- * this one just lost it's interface
- */
- set_peerdstadr(peer, NULL);
-
- peer = npeer;
- }
+ for (peer = ISC_LIST_HEAD(iface->peers);
+ peer != NULL;
+ peer = ISC_LIST_HEAD(iface->peers))
+ set_peerdstadr(peer, NULL);
- /*
- * update globals in case we lose
- * a loopback interface
- */
- if (interf == loopback_interface)
- loopback_interface = NULL;
+ /*
+ * update globals in case we lose
+ * a loopback interface
+ */
+ if (iface == loopback_interface)
+ loopback_interface = NULL;
- delete_interface(interf);
- }
+ delete_interface(iface);
}
- interf = next;
}
+ iface = next;
}
/*
FD_ZERO(&activefds);
#endif
- DPRINTF(2, ("create_sockets(%d)\n", ntohs( (u_short) port)));
+ DPRINTF(2, ("create_sockets(%d)\n", port));
create_wildcards(port);
*/
static struct interface *
create_interface(
- u_short port,
- struct interface *iface
- )
+ u_short port,
+ struct interface * protot
+ )
{
- struct sockaddr_storage resmask;
- struct interface *interface;
+ sockaddr_u resmask;
+ struct interface *iface;
- DPRINTF(2, ("create_interface(%s#%d)\n", stoa(&iface->sin), ntohs( (u_short) port)));
+ DPRINTF(2, ("create_interface(%s#%d)\n", stoa(&protot->sin),
+ port));
/* build an interface */
- interface = new_interface(iface);
+ iface = new_interface(protot);
/*
* create socket
*/
- interface->fd = open_socket(&interface->sin,
- 0, 0, interface);
+ iface->fd = open_socket(&iface->sin, 0, 0, iface);
- if (interface->fd != INVALID_SOCKET)
- list_if_listening(interface, port);
+ if (iface->fd != INVALID_SOCKET)
+ list_if_listening(iface);
- if ((interface->flags & INT_BROADCAST) &&
- interface->bfd != INVALID_SOCKET)
- msyslog(LOG_INFO, "Listening on broadcast address %s#%d",
- stoa((&interface->bcast)),
- ntohs( (u_short) port));
+ if ((INT_BROADCAST & iface->flags)
+ && iface->bfd != INVALID_SOCKET)
+ msyslog(LOG_INFO, "Listening on broadcast address %s#%d",
+ stoa((&iface->bcast)), port);
- if (interface->fd == INVALID_SOCKET &&
- interface->bfd == INVALID_SOCKET) {
+ if (INVALID_SOCKET == iface->fd
+ && INVALID_SOCKET == iface->bfd) {
msyslog(LOG_ERR, "unable to create socket on %s (%d) for %s#%d",
- interface->name,
- interface->ifnum,
- stoa((&interface->sin)),
- ntohs( (u_short) port));
- delete_interface(interface);
+ iface->name,
+ iface->ifnum,
+ stoa((&iface->sin)),
+ port);
+ delete_interface(iface);
return NULL;
}
- /*
- * Blacklist bound interface address
+ /*
+ * Blacklist our own addresses, no use talking to ourself
*/
-
- SET_HOSTMASK(&resmask, interface->sin.ss_family);
- hack_restrict(RESTRICT_FLAGS, &interface->sin, &resmask,
- RESM_NTPONLY|RESM_INTERFACE, RES_IGNORE);
+ SET_HOSTMASK(&resmask, AF(&iface->sin));
+ hack_restrict(RESTRICT_FLAGS, &iface->sin, &resmask,
+ RESM_NTPONLY | RESM_INTERFACE, RES_IGNORE);
/*
* set globals with the first found
* loopback interface of the appropriate class
*/
- if ((loopback_interface == NULL) &&
- (interface->family == AF_INET) &&
- ((interface->flags & INT_LOOPBACK) != 0))
- {
- loopback_interface = interface;
- }
+ if (NULL == loopback_interface && AF_INET == iface->family
+ && (INT_LOOPBACK & iface->flags))
+ loopback_interface = iface;
/*
* put into our interface list
*/
- add_addr_to_list(&interface->sin, interface);
- add_interface(interface);
+ add_addr_to_list(&iface->sin, iface);
+ add_interface(iface);
- DPRINT_INTERFACE(2, (interface, "created ", "\n"));
- return interface;
+ DPRINT_INTERFACE(2, (iface, "created ", "\n"));
+ return iface;
}
#ifdef SO_EXCLUSIVEADDRUSE
static void
-set_excladdruse(int fd)
+set_excladdruse(
+ SOCKET fd
+ )
{
int one = 1;
int failed;
(char *)&one, sizeof(one));
if (failed)
- netsyslog(LOG_ERR,
- "setsockopt(%d, SO_EXCLUSIVEADDRUSE, on): %m", fd);
+ msyslog(LOG_ERR,
+ "setsockopt(%d, SO_EXCLUSIVEADDRUSE, on): %m",
+ (int)fd);
}
#endif /* SO_EXCLUSIVEADDRUSE */
* fd's also?
*/
static void
-set_reuseaddr(int flag) {
+set_reuseaddr(
+ int flag
+ )
+{
struct interface *interf;
#ifndef SO_EXCLUSIVEADDRUSE
* if interf->fd is INVALID_SOCKET, we might have a adapter
* configured but not present
*/
- DPRINTF(4, ("setting SO_REUSEADDR on %.16s@%s to %s\n", interf->name, stoa(&interf->sin), flag ? "on" : "off"));
+ DPRINTF(4, ("setting SO_REUSEADDR on %.16s@%s to %s\n",
+ interf->name, stoa(&interf->sin),
+ flag ? "on" : "off"));
if (interf->fd != INVALID_SOCKET) {
if (setsockopt(interf->fd, SOL_SOCKET,
SO_REUSEADDR, (char *)&flag,
sizeof(flag))) {
- netsyslog(LOG_ERR, "set_reuseaddr: setsockopt(SO_REUSEADDR, %s) failed: %m", flag ? "on" : "off");
+ msyslog(LOG_ERR, "set_reuseaddr: setsockopt(SO_REUSEADDR, %s) failed: %m", flag ? "on" : "off");
}
}
}
* make other changes as necessary later on
*/
void
-enable_broadcast(struct interface *iface, struct sockaddr_storage *baddr)
+enable_broadcast(
+ struct interface * iface,
+ sockaddr_u * baddr
+ )
{
-#ifdef SO_BROADCAST
+#ifdef OPEN_BCAST_SOCKET
socket_broadcast_enable(iface, iface->fd, baddr);
#endif
}
* broadcasting. It is not this function's job to select the socket
*/
static isc_boolean_t
-socket_broadcast_enable(struct interface *iface, SOCKET fd, struct sockaddr_storage *maddr)
+socket_broadcast_enable(
+ struct interface * iface,
+ SOCKET fd,
+ sockaddr_u * baddr
+ )
{
#ifdef SO_BROADCAST
int on = 1;
- if (maddr->ss_family == AF_INET)
- {
+ if (IS_IPV4(baddr)) {
/* if this interface can support broadcast, set SO_BROADCAST */
if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST,
(char *)&on, sizeof(on)))
- {
- netsyslog(LOG_ERR, "setsockopt(SO_BROADCAST) enable failure on address %s: %m",
- stoa(maddr));
- }
-#ifdef DEBUG
- else if (debug > 1) {
- printf("Broadcast enabled on socket %d for address %s\n",
- fd, stoa(maddr));
- }
-#endif
+ msyslog(LOG_ERR,
+ "setsockopt(SO_BROADCAST) enable failure on address %s: %m",
+ stoa(baddr));
+ else
+ DPRINTF(2, ("Broadcast enabled on socket %d for address %s\n",
+ fd, stoa(baddr)));
}
iface->flags |= INT_BCASTOPEN;
broadcast_client_enabled = ISC_TRUE;
* broadcasting. It is not this function's job to select the socket
*/
static isc_boolean_t
-socket_broadcast_disable(struct interface *iface, struct sockaddr_storage *maddr)
+socket_broadcast_disable(
+ struct interface * iface,
+ sockaddr_u * baddr
+ )
{
#ifdef SO_BROADCAST
int off = 0; /* This seems to be OK as an int */
- if (maddr->ss_family == AF_INET)
- {
- if (setsockopt(iface->fd, SOL_SOCKET, SO_BROADCAST,
- (char *)&off, sizeof(off)))
- {
- netsyslog(LOG_ERR, "setsockopt(SO_BROADCAST) disable failure on address %s: %m",
- stoa(maddr));
- }
- }
+ if (IS_IPV4(baddr) && setsockopt(iface->fd, SOL_SOCKET,
+ SO_BROADCAST, (char *)&off, sizeof(off)))
+ msyslog(LOG_ERR,
+ "setsockopt(SO_BROADCAST) disable failure on address %s: %m",
+ stoa(baddr));
+
iface->flags &= ~INT_BCASTOPEN;
broadcast_client_enabled = ISC_FALSE;
return ISC_TRUE;
* Check to see if the address is a multicast address
*/
static isc_boolean_t
-addr_ismulticast(struct sockaddr_storage *maddr)
+addr_ismulticast(
+ sockaddr_u *maddr
+ )
{
- switch (maddr->ss_family)
- {
- case AF_INET :
- if (!IN_CLASSD(ntohl(((struct sockaddr_in*)maddr)->sin_addr.s_addr))) {
- DPRINTF(4, ("multicast address %s not class D\n", stoa(maddr)));
- return (ISC_FALSE);
- }
- else
- {
- return (ISC_TRUE);
- }
-
- case AF_INET6 :
-#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
- if (!IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)maddr)->sin6_addr)) {
- DPRINTF(4, ("address %s not IPv6 multicast address\n", stoa(maddr)));
- return (ISC_FALSE);
- }
- else
- {
- return (ISC_TRUE);
- }
+ isc_boolean_t result;
-/*
- * If we don't have IPV6 support any IPV6 address is not multicast
- */
-#else
- return (ISC_FALSE);
-#endif
+#ifndef INCLUDE_IPV6_MULTICAST_SUPPORT
/*
- * Never valid
+ * If we don't have IPV6 support any IPV6 addr is not multicast
*/
- default:
- return (ISC_FALSE);
- }
+ if (IS_IPV6(maddr))
+ result = ISC_FALSE;
+ else
+#endif
+ result = IS_MCAST(maddr);
+
+ if (!result)
+ DPRINTF(4, ("address %s is not multicast\n",
+ stoa(maddr)));
+
+ return result;
}
/*
* send the multicast packet.
*/
void
-enable_multicast_if(struct interface *iface, struct sockaddr_storage *maddr)
+enable_multicast_if(
+ struct interface * iface,
+ sockaddr_u * maddr
+ )
{
#ifdef MCAST
- /*u_char*/ TYPEOF_IP_MULTICAST_LOOP off = 0;
+ TYPEOF_IP_MULTICAST_LOOP off = 0;
+
+ NTP_REQUIRE(AF(maddr) == AF(&iface->sin));
+
+ switch (AF(&iface->sin)) {
- switch (maddr->ss_family)
- {
case AF_INET:
if (setsockopt(iface->fd, IPPROTO_IP, IP_MULTICAST_IF,
- (char *)&(((struct sockaddr_in*)&iface->sin)->sin_addr.s_addr),
- sizeof(struct in_addr)) == -1) {
- netsyslog(LOG_ERR,
- "setsockopt IP_MULTICAST_IF failure: %m on socket %d, addr %s for multicast address %s",
- iface->fd, stoa(&iface->sin), stoa(maddr));
+ (char *)NSRCADR(&iface->sin),
+ sizeof(NSRCADR(&iface->sin)))) {
+
+ msyslog(LOG_ERR,
+ "setsockopt IP_MULTICAST_IF failed: %m on socket %d, addr %s for multicast address %s",
+ iface->fd, stoa(&iface->sin),
+ stoa(maddr));
return;
}
#ifdef IP_MULTICAST_LOOP
/*
- * Don't send back to itself, but allow it to fail to set it
+ * Don't send back to itself, but allow failure to set
*/
- if (setsockopt(iface->fd, IPPROTO_IP, IP_MULTICAST_LOOP,
- SETSOCKOPT_ARG_CAST &off, sizeof(off)) == -1) {
- netsyslog(LOG_ERR,
- "setsockopt IP_MULTICAST_LOOP failure: %m on socket %d, addr %s for multicast address %s",
- iface->fd, stoa(&iface->sin), stoa(maddr));
+ if (setsockopt(iface->fd, IPPROTO_IP,
+ IP_MULTICAST_LOOP,
+ SETSOCKOPT_ARG_CAST &off,
+ sizeof(off))) {
+
+ msyslog(LOG_ERR,
+ "setsockopt IP_MULTICAST_LOOP failed: %m on socket %d, addr %s for multicast address %s",
+ iface->fd, stoa(&iface->sin),
+ stoa(maddr));
}
#endif
- DPRINTF(4, ("Added IPv4 multicast interface on socket %d, addr %s for multicast address %s\n",
+ DPRINTF(4, ("Added IPv4 multicast interface on socket %d, addr %s for multicast address %s\n",
iface->fd, stoa(&iface->sin),
stoa(maddr)));
break;
case AF_INET6:
#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
- if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
- (char *) &iface->scopeid, sizeof(iface->scopeid)) == -1) {
- netsyslog(LOG_ERR,
- "setsockopt IPV6_MULTICAST_IF failure: %m on socket %d, addr %s, scope %d for multicast address %s",
- iface->fd, stoa(&iface->sin), iface->scopeid,
- stoa(maddr));
+ if (setsockopt(iface->fd, IPPROTO_IPV6,
+ IPV6_MULTICAST_IF,
+ (char *)&iface->scopeid,
+ sizeof(iface->scopeid))) {
+
+ msyslog(LOG_ERR,
+ "setsockopt IPV6_MULTICAST_IF failed: %m on socket %d, addr %s, scope %d for multicast address %s",
+ iface->fd, stoa(&iface->sin),
+ iface->scopeid, stoa(maddr));
return;
}
#ifdef IPV6_MULTICAST_LOOP
/*
- * Don't send back to itself, but allow it to fail to set it
+ * Don't send back to itself, but allow failure to set
*/
- if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
- (char *) &off, sizeof(off)) == -1) {
- netsyslog(LOG_ERR,
- "setsockopt IP_MULTICAST_LOOP failure: %m on socket %d, addr %s for multicast address %s",
- iface->fd, stoa(&iface->sin), stoa(maddr));
+ if (setsockopt(iface->fd, IPPROTO_IPV6,
+ IPV6_MULTICAST_LOOP,
+ (char *) &off, sizeof(off))) {
+
+ msyslog(LOG_ERR,
+ "setsockopt IP_MULTICAST_LOOP failed: %m on socket %d, addr %s for multicast address %s",
+ iface->fd, stoa(&iface->sin),
+ stoa(maddr));
}
#endif
DPRINTF(4, ("Added IPv6 multicast interface on socket %d, addr %s, scope %d for multicast address %s\n",
- iface->fd, stoa(&iface->sin), iface->scopeid,
- stoa(maddr)));
+ iface->fd, stoa(&iface->sin),
+ iface->scopeid, stoa(maddr)));
break;
#else
return;
* The socket is in the inter_list all we need to do is enable
* multicasting. It is not this function's job to select the socket
*/
+#ifdef MCAST
static isc_boolean_t
-socket_multicast_enable(struct interface *iface, int lscope, struct sockaddr_storage *maddr)
+socket_multicast_enable(
+ struct interface * iface,
+ int lscope,
+ sockaddr_u * maddr
+ )
{
+ struct ip_mreq mreq;
#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
- struct ipv6_mreq mreq6;
- struct in6_addr iaddr6;
-#endif /* INCLUDE_IPV6_MULTICAST_SUPPORT */
-
- struct ip_mreq mreq;
+ struct ipv6_mreq mreq6;
+#endif
- if (find_addr_in_list(maddr)) {
- DPRINTF(4, ("socket_multicast_enable(%s): already enabled\n", stoa(maddr)));
+ if (find_addr_in_list(maddr) != NULL) {
+ DPRINTF(4, ("socket_multicast_enable(%s): already enabled\n",
+ stoa(maddr)));
return ISC_TRUE;
}
- switch (maddr->ss_family)
- {
+ switch (AF(maddr)) {
+
case AF_INET:
- memset((char *)&mreq, 0, sizeof(mreq));
- mreq.imr_multiaddr = (((struct sockaddr_in*)maddr)->sin_addr);
+ memset(&mreq, 0, sizeof(mreq));
+ mreq.imr_multiaddr = SOCK_ADDR4(maddr);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
- if (setsockopt(iface->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
- (char *)&mreq, sizeof(mreq)) == -1) {
- netsyslog(LOG_ERR,
- "setsockopt IP_ADD_MEMBERSHIP failure: %m on socket %d, addr %s for %x / %x (%s)",
- iface->fd, stoa(&iface->sin),
- mreq.imr_multiaddr.s_addr,
- mreq.imr_interface.s_addr, stoa(maddr));
+ if (setsockopt(iface->fd,
+ IPPROTO_IP,
+ IP_ADD_MEMBERSHIP,
+ (char *)&mreq,
+ sizeof(mreq))) {
+ msyslog(LOG_ERR,
+ "setsockopt IP_ADD_MEMBERSHIP failed: %m on socket %d, addr %s for %x / %x (%s)",
+ iface->fd, stoa(&iface->sin),
+ mreq.imr_multiaddr.s_addr,
+ mreq.imr_interface.s_addr,
+ stoa(maddr));
return ISC_FALSE;
}
DPRINTF(4, ("Added IPv4 multicast membership on socket %d, addr %s for %x / %x (%s)\n",
case AF_INET6:
#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
/*
- * Enable reception of multicast packets
- * If the address is link-local we can get the interface index
- * from the scope id. Don't do this for other types of multicast
- * addresses. For now let the kernel figure it out.
+ * Enable reception of multicast packets.
+ * If the address is link-local we can get the
+ * interface index from the scope id. Don't do this
+ * for other types of multicast addresses. For now let
+ * the kernel figure it out.
*/
- memset((char *)&mreq6, 0, sizeof(mreq6));
- iaddr6 = ((struct sockaddr_in6*)maddr)->sin6_addr;
- mreq6.ipv6mr_multiaddr = iaddr6;
+ memset(&mreq6, 0, sizeof(mreq6));
+ mreq6.ipv6mr_multiaddr = SOCK_ADDR6(maddr);
mreq6.ipv6mr_interface = lscope;
- if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_JOIN_GROUP,
- (char *)&mreq6, sizeof(mreq6)) == -1) {
- netsyslog(LOG_ERR,
- "setsockopt IPV6_JOIN_GROUP failure: %m on socket %d, addr %s for interface %d(%s)",
- iface->fd, stoa(&iface->sin),
- mreq6.ipv6mr_interface, stoa(maddr));
+ if (setsockopt(iface->fd, IPPROTO_IPV6,
+ IPV6_JOIN_GROUP, (char *)&mreq6,
+ sizeof(mreq6))) {
+ msyslog(LOG_ERR,
+ "setsockopt IPV6_JOIN_GROUP failed: %m on socket %d, addr %s for interface %d (%s)",
+ iface->fd, stoa(&iface->sin),
+ mreq6.ipv6mr_interface, stoa(maddr));
return ISC_FALSE;
}
DPRINTF(4, ("Added IPv6 multicast group on socket %d, addr %s for interface %d(%s)\n",
iface->fd, stoa(&iface->sin),
mreq6.ipv6mr_interface, stoa(maddr)));
- break;
#else
return ISC_FALSE;
#endif /* INCLUDE_IPV6_MULTICAST_SUPPORT */
* multicasting. It is not this function's job to select the socket
*/
static isc_boolean_t
-socket_multicast_disable(struct interface *iface, struct sockaddr_storage *maddr)
+socket_multicast_disable(
+ struct interface * iface,
+ sockaddr_u * maddr
+ )
{
#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
struct ipv6_mreq mreq6;
- struct in6_addr iaddr6;
-#endif /* INCLUDE_IPV6_MULTICAST_SUPPORT */
-
+#endif
struct ip_mreq mreq;
- memset((char *)&mreq, 0, sizeof(mreq));
+
+ memset(&mreq, 0, sizeof(mreq));
if (find_addr_in_list(maddr) == NULL) {
- DPRINTF(4, ("socket_multicast_disable(%s): not enabled\n", stoa(maddr)));
+ DPRINTF(4, ("socket_multicast_disable(%s): not found\n",
+ stoa(maddr)));
return ISC_TRUE;
}
- switch (maddr->ss_family)
- {
+ switch (AF(maddr)) {
+
case AF_INET:
- mreq.imr_multiaddr = (((struct sockaddr_in*)&maddr)->sin_addr);
- mreq.imr_interface.s_addr = ((struct sockaddr_in*)&iface->sin)->sin_addr.s_addr;
- if (setsockopt(iface->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP,
- (char *)&mreq, sizeof(mreq)) == -1) {
- netsyslog(LOG_ERR,
- "setsockopt IP_DROP_MEMBERSHIP failure: %m on socket %d, addr %s for %x / %x (%s)",
- iface->fd, stoa(&iface->sin),
- mreq.imr_multiaddr.s_addr,
- mreq.imr_interface.s_addr, stoa(maddr));
+ mreq.imr_multiaddr = SOCK_ADDR4(maddr);
+ mreq.imr_interface = SOCK_ADDR4(&iface->sin);
+ if (setsockopt(iface->fd, IPPROTO_IP,
+ IP_DROP_MEMBERSHIP, (char *)&mreq,
+ sizeof(mreq))) {
+
+ msyslog(LOG_ERR,
+ "setsockopt IP_DROP_MEMBERSHIP failed: %m on socket %d, addr %s for %x / %x (%s)",
+ iface->fd, stoa(&iface->sin),
+ SRCADR(maddr), SRCADR(&iface->sin),
+ stoa(maddr));
return ISC_FALSE;
}
break;
#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
/*
* Disable reception of multicast packets
- * If the address is link-local we can get the interface index
- * from the scope id. Don't do this for other types of multicast
- * addresses. For now let the kernel figure it out.
+ * If the address is link-local we can get the
+ * interface index from the scope id. Don't do this
+ * for other types of multicast addresses. For now let
+ * the kernel figure it out.
*/
- iaddr6 = ((struct sockaddr_in6*)&maddr)->sin6_addr;
- mreq6.ipv6mr_multiaddr = iaddr6;
+ mreq6.ipv6mr_multiaddr = SOCK_ADDR6(maddr);
mreq6.ipv6mr_interface = iface->scopeid;
- if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_LEAVE_GROUP,
- (char *)&mreq6, sizeof(mreq6)) == -1) {
- netsyslog(LOG_ERR,
- "setsockopt IPV6_LEAVE_GROUP failure: %m on socket %d, addr %s for %d(%s)",
- iface->fd, stoa(&iface->sin),
- mreq6.ipv6mr_interface, stoa(maddr));
+ if (setsockopt(iface->fd, IPPROTO_IPV6,
+ IPV6_LEAVE_GROUP, (char *)&mreq6,
+ sizeof(mreq6))) {
+
+ msyslog(LOG_ERR,
+ "setsockopt IPV6_LEAVE_GROUP failure: %m on socket %d, addr %s for %d (%s)",
+ iface->fd, stoa(&iface->sin),
+ iface->scopeid, stoa(maddr));
return ISC_FALSE;
}
break;
#else
return ISC_FALSE;
#endif /* INCLUDE_IPV6_MULTICAST_SUPPORT */
-
}
+
iface->num_mcast--;
- if (iface->num_mcast <= 0) {
- iface->num_mcast = 0;
+ if (!iface->num_mcast)
iface->flags &= ~INT_MCASTOPEN;
- }
+
return ISC_TRUE;
}
+#endif /* MCAST */
/*
* io_setbclient - open the broadcast client sockets
io_setbclient(void)
{
#ifdef OPEN_BCAST_SOCKET
- struct interface *interf;
- int nif = 0;
- isc_boolean_t jstatus;
- SOCKET fd;
+ struct interface * interf;
+ int nif;
+ isc_boolean_t jstatus;
+ SOCKET fd;
+ nif = 0;
set_reuseaddr(1);
for (interf = ISC_LIST_HEAD(inter_list);
interf != NULL;
interf = ISC_LIST_NEXT(interf, link)) {
- if (interf->flags & INT_WILDCARD)
- continue;
+
+ if (interf->flags & (INT_WILDCARD | INT_LOOPBACK))
+ continue;
/* use only allowed addresses */
- if (interf->ignore_packets == ISC_TRUE)
- continue;
- /* Only IPv4 addresses are valid for broadcast */
- if (interf->sin.ss_family != AF_INET)
+ if (interf->ignore_packets)
continue;
- /* Is this a broadcast address? */
+
+ /* Need a broadcast-capable interface */
if (!(interf->flags & INT_BROADCAST))
continue;
- /* Skip the loopback addresses */
- if (interf->flags & INT_LOOPBACK)
- continue;
+ /* Only IPv4 addresses are valid for broadcast */
+ NTP_REQUIRE(IS_IPV4(&interf->sin));
/* Do we already have the broadcast address open? */
if (interf->flags & INT_BCASTOPEN) {
- /* account for already open interfaces to aviod misleading warning below */
+ /*
+ * account for already open interfaces to avoid
+ * misleading warning below
+ */
nif++;
continue;
}
* Try to open the broadcast address
*/
interf->family = AF_INET;
- interf->bfd = open_socket(&interf->bcast,
- INT_BROADCAST, 0, interf);
+ interf->bfd = open_socket(&interf->bcast, 1, 0, interf);
- /*
- * If we succeeded then we use it otherwise
- * enable the underlying address
+ /*
+ * If we succeeded then we use it otherwise enable
+ * broadcast on the interface address
*/
- if (interf->bfd == INVALID_SOCKET) {
- fd = interf->fd;
- jstatus = socket_broadcast_enable(interf, fd, &interf->sin);
- }
- else {
+ if (interf->bfd != INVALID_SOCKET) {
fd = interf->bfd;
jstatus = ISC_TRUE;
+ } else {
+ fd = interf->fd;
+ jstatus = socket_broadcast_enable(interf, fd,
+ &interf->sin);
}
/* Enable Broadcast on socket */
- if (jstatus == ISC_TRUE)
- {
+ if (jstatus) {
nif++;
- netsyslog(LOG_INFO,"io_setbclient: Opened broadcast client on interface #%d %s, socket: %d",
- interf->ifnum, interf->name, fd);
+ msyslog(LOG_INFO,
+ "io_setbclient: Opened broadcast client on interface #%d %s",
+ interf->ifnum, interf->name);
interf->addr_refid = addr2refid(&interf->sin);
}
}
set_reuseaddr(0);
-#ifdef DEBUG
- if (debug)
- if (nif > 0)
- printf("io_setbclient: Opened broadcast clients\n");
-#endif
- if (nif == 0)
- netsyslog(LOG_ERR, "Unable to listen for broadcasts, no broadcast interfaces available");
+ if (nif > 0)
+ DPRINTF(1, ("io_setbclient: Opened broadcast clients\n"));
+ else if (!nif)
+ msyslog(LOG_ERR,
+ "Unable to listen for broadcasts, no broadcast interfaces available");
#else
- netsyslog(LOG_ERR, "io_setbclient: Broadcast Client disabled by build");
-#endif
+ msyslog(LOG_ERR,
+ "io_setbclient: Broadcast Client disabled by build");
+#endif /* OPEN_BCAST_SOCKET */
}
/*
void
io_unsetbclient(void)
{
- struct interface *interf;
- isc_boolean_t lstatus;
+ struct interface *interf;
for (interf = ISC_LIST_HEAD(inter_list);
- interf != NULL;
+ NULL != interf;
interf = ISC_LIST_NEXT(interf, link))
{
- if (interf->flags & INT_WILDCARD)
- continue;
+ if (interf->flags & INT_WILDCARD)
+ continue;
if (!(interf->flags & INT_BCASTOPEN))
- continue;
- lstatus = socket_broadcast_disable(interf, &interf->sin);
+ continue;
+
+ socket_broadcast_disable(interf, &interf->sin);
}
}
*/
void
io_multicast_add(
- struct sockaddr_storage addr
+ sockaddr_u *addr
)
{
#ifdef MCAST
/*
* Check to see if this is a multicast address
*/
- if (addr_ismulticast(&addr) == ISC_FALSE)
+ if (!addr_ismulticast(addr))
return;
/* If we already have it we can just return */
- if (find_flagged_addr_in_list(&addr, INT_MCASTOPEN|INT_MCASTIF) != NULL)
- {
- netsyslog(LOG_INFO, "Duplicate request found for multicast address %s",
- stoa(&addr));
+ if (NULL != find_flagged_addr_in_list(addr, INT_MCASTOPEN)) {
+ msyslog(LOG_INFO,
+ "Duplicate request found for multicast address %s",
+ stoa(addr));
return;
}
/*
* Open a new socket for the multicast address
*/
- interface->sin.ss_family = addr.ss_family;
- interface->family = addr.ss_family;
+ interface->family =
+ AF(&interface->sin) =
+ AF(&interface->mask) = AF(addr);
+ SET_PORT(&interface->sin, NTP_PORT);
+ SET_ONESMASK(&interface->mask);
+
+ switch(AF(addr)) {
- switch(addr.ss_family) {
case AF_INET:
- memcpy(&(((struct sockaddr_in *)&interface->sin)->sin_addr),
- &(((struct sockaddr_in*)&addr)->sin_addr),
- sizeof(struct in_addr));
- ((struct sockaddr_in*)&interface->sin)->sin_port = htons(NTP_PORT);
- memset(&((struct sockaddr_in*)&interface->mask)->sin_addr.s_addr, 0xff, sizeof(struct in_addr));
+ NSRCADR(&interface->sin) = NSRCADR(addr);
break;
+
case AF_INET6:
#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
- memcpy(&(((struct sockaddr_in6 *)&interface->sin)->sin6_addr),
- &((struct sockaddr_in6*)&addr)->sin6_addr,
- sizeof(struct in6_addr));
- ((struct sockaddr_in6*)&interface->sin)->sin6_port = htons(NTP_PORT);
-#ifdef ISC_PLATFORM_HAVESCOPEID
- ((struct sockaddr_in6*)&interface->sin)->sin6_scope_id = ((struct sockaddr_in6*)&addr)->sin6_scope_id;
+ SET_ADDR6N(&interface->sin, SOCK_ADDR6(addr));
+ lscope = SCOPE(addr);
+ SET_SCOPE(&interface->sin, lscope);
#endif
- memset(&((struct sockaddr_in6*)&interface->mask)->sin6_addr.s6_addr, 0xff, sizeof(struct in6_addr));
-#endif
- iface = findlocalcastinterface(&addr, INT_MULTICAST);
- if (iface) {
-# ifdef ISC_PLATFORM_HAVESCOPEID
- lscope = ((struct sockaddr_in6*)&iface->sin)->sin6_scope_id;
-# endif
- DPRINTF(4, ("Found interface #%d %s, scope: %d for address %s\n", iface->ifnum, iface->name, lscope, stoa(&addr)));
- }
- break;
+ iface = findlocalcastinterface(addr);
+ if (iface != NULL)
+ DPRINTF(4, ("Found interface #%d %s, scope %d for address %s\n",
+ iface->ifnum, iface->name, lscope,
+ stoa(addr)));
}
set_reuseaddr(1);
interface->bfd = INVALID_SOCKET;
- interface->fd = open_socket(&interface->sin,
- INT_MULTICAST, 0, interface);
+ interface->fd = open_socket(&interface->sin, INT_MULTICAST, 0,
+ interface);
- if (interface->fd != INVALID_SOCKET)
- {
+ if (interface->fd != INVALID_SOCKET) {
interface->bfd = INVALID_SOCKET;
interface->ignore_packets = ISC_FALSE;
interface->flags |= INT_MCASTIF;
- (void) strncpy(interface->name, "multicast",
+ strncpy(interface->name, "multicast",
sizeof(interface->name));
- ((struct sockaddr_in*)&interface->mask)->sin_addr.s_addr =
- htonl(~(u_int32)0);
DPRINT_INTERFACE(2, (interface, "multicast add ", "\n"));
- /* socket_multicast_enable() will add this address to the addresslist */
+ /*
+ * socket_multicast_enable() will add this address to
+ * the addresslist
+ */
add_interface(interface);
- list_if_listening(interface, htons(NTP_PORT));
- }
- else
- {
- delete_interface(interface); /* re-use existing interface */
- interface = NULL;
- if (addr.ss_family == AF_INET)
+ list_if_listening(interface);
+ } else {
+ /* bind failed, re-use wildcard interface */
+ delete_interface(interface);
+
+ if (IS_IPV4(addr))
interface = wildipv4;
- else if (addr.ss_family == AF_INET6)
+ else if (IS_IPV6(addr))
interface = wildipv6;
+ else
+ interface = NULL;
if (interface != NULL) {
/* HACK ! -- stuff in an address */
- interface->bcast = addr;
- netsyslog(LOG_ERR,
- "...multicast address %s using wildcard interface #%d %s",
- stoa(&addr), interface->ifnum, interface->name);
+ /* because we don't bind addr? DH */
+ interface->bcast = *addr;
+ msyslog(LOG_ERR,
+ "multicast address %s using wildcard interface #%d %s",
+ stoa(addr), interface->ifnum,
+ interface->name);
} else {
- netsyslog(LOG_ERR,
- "No multicast socket available to use for address %s",
- stoa(&addr));
+ msyslog(LOG_ERR,
+ "No multicast socket available to use for address %s",
+ stoa(addr));
return;
}
}
/*
* For the case where we can't use a separate socket
*/
- interface = findlocalcastinterface(&addr, INT_MULTICAST);
+ interface = findlocalcastinterface(addr);
/*
* If we don't have a valid socket, just return
*/
- if (!interface)
- {
- netsyslog(LOG_ERR,
- "Cannot add multicast address %s: Cannot find slot",
- stoa(&addr));
+ if (NULL == interface) {
+ msyslog(LOG_ERR,
+ "Can not add multicast address %s: no multicast interface found",
+ stoa(addr));
return;
}
#endif
- {
- isc_boolean_t jstatus;
- jstatus = socket_multicast_enable(interface, lscope, &addr);
-
- if (jstatus == ISC_TRUE)
- netsyslog(LOG_INFO, "Added Multicast Listener %s on interface #%d %s\n", stoa(&addr), interface->ifnum, interface->name);
- else
- netsyslog(LOG_ERR, "Failed to add Multicast Listener %s\n", stoa(&addr));
- }
+ if (socket_multicast_enable(interface, lscope, addr))
+ msyslog(LOG_INFO,
+ "Added Multicast Listener %s on interface #%d %s",
+ stoa(addr), interface->ifnum, interface->name);
+ else
+ msyslog(LOG_ERR, "Failed to add Multicast Listener %s",
+ stoa(addr));
#else /* MCAST */
- netsyslog(LOG_ERR,
- "Cannot add multicast address %s: no Multicast support",
- stoa(&addr));
+ msyslog(LOG_ERR,
+ "Can not add multicast address %s: no multicast support",
+ stoa(addr));
#endif /* MCAST */
return;
}
+
/*
* io_multicast_del() - delete multicast group address
*/
void
io_multicast_del(
- struct sockaddr_storage addr
+ sockaddr_u * addr
)
{
#ifdef MCAST
- struct interface *interface;
- isc_boolean_t lstatus;
+ struct interface *iface;
/*
* Check to see if this is a multicast address
*/
- if (addr_ismulticast(&addr) == ISC_FALSE)
- {
- netsyslog(LOG_ERR,
- "invalid multicast address %s", stoa(&addr));
+ if (!addr_ismulticast(addr)) {
+ msyslog(LOG_ERR, "invalid multicast address %s",
+ stoa(addr));
return;
}
- switch (addr.ss_family)
- {
- case AF_INET :
- /*
- * Disable reception of multicast packets
- */
- interface = find_flagged_addr_in_list(&addr, INT_MCASTOPEN);
- while ( interface != NULL) {
- lstatus = socket_multicast_disable(interface, &addr);
- interface = find_flagged_addr_in_list(&addr, INT_MCASTOPEN);
- }
- break;
-
-#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
- case AF_INET6 :
- /*
- * Disable reception of multicast packets
- */
- for (interface = ISC_LIST_HEAD(inter_list);
- interface != NULL;
- interface = ISC_LIST_NEXT(interface, link))
- {
- if (interface->flags & INT_WILDCARD)
- continue;
-
- /* Be sure it's the correct family */
- if (interface->sin.ss_family != AF_INET6)
- continue;
- if (!(interface->flags & INT_MCASTOPEN))
- continue;
- if (!(interface->fd < 0))
- continue;
- if (!SOCKCMP(&addr, &interface->sin))
- continue;
- lstatus = socket_multicast_disable(interface, &addr);
- }
- break;
-#endif /* INCLUDE_IPV6_MULTICAST_SUPPORT */
-
- }/* switch */
+ /*
+ * Disable reception of multicast packets
+ */
+ while ((iface = find_flagged_addr_in_list(addr, INT_MCASTOPEN))
+ != NULL)
+ socket_multicast_disable(iface, addr);
- delete_addr_from_list(&addr);
+ delete_addr_from_list(addr);
#else /* not MCAST */
- netsyslog(LOG_ERR, "this function requires multicast kernel");
+ msyslog(LOG_ERR,
+ "Can not delete multicast address %s: no multicast support",
+ stoa(addr));
#endif /* not MCAST */
}
+
/*
* init_nonblocking_io() - set up descriptor to be non blocking
*/
-static void init_nonblocking_io(SOCKET fd)
+static void init_nonblocking_io(
+ SOCKET fd
+ )
{
/*
* set non-blocking,
#endif
#if defined(O_NONBLOCK) /* POSIX */
- if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
- {
- netsyslog(LOG_ERR, "fcntl(O_NONBLOCK) fails on fd #%d: %m",
- fd);
+ if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
+ msyslog(LOG_ERR,
+ "fcntl(O_NONBLOCK) fails on fd #%d: %m", fd);
exit(1);
- /*NOTREACHED*/
}
#elif defined(FNDELAY)
- if (fcntl(fd, F_SETFL, FNDELAY) < 0)
- {
- netsyslog(LOG_ERR, "fcntl(FNDELAY) fails on fd #%d: %m",
+ if (fcntl(fd, F_SETFL, FNDELAY) < 0) {
+ msyslog(LOG_ERR, "fcntl(FNDELAY) fails on fd #%d: %m",
fd);
exit(1);
- /*NOTREACHED*/
}
#elif defined(O_NDELAY) /* generally the same as FNDELAY */
- if (fcntl(fd, F_SETFL, O_NDELAY) < 0)
- {
- netsyslog(LOG_ERR, "fcntl(O_NDELAY) fails on fd #%d: %m",
+ if (fcntl(fd, F_SETFL, O_NDELAY) < 0) {
+ msyslog(LOG_ERR, "fcntl(O_NDELAY) fails on fd #%d: %m",
fd);
exit(1);
- /*NOTREACHED*/
}
#elif defined(FIONBIO)
{
int on = 1;
- if (ioctl(fd,FIONBIO,&on) < 0)
- {
- netsyslog(LOG_ERR, "ioctl(FIONBIO) fails on fd #%d: %m",
+
+ if (ioctl(fd, FIONBIO, &on) < 0) {
+ msyslog(LOG_ERR,
+ "ioctl(FIONBIO) fails on fd #%d: %m",
fd);
exit(1);
- /*NOTREACHED*/
}
}
#elif defined(FIOSNBIO)
- if (ioctl(fd,FIOSNBIO,&on) < 0)
- {
- netsyslog(LOG_ERR, "ioctl(FIOSNBIO) fails on fd #%d: %m",
- fd);
+ if (ioctl(fd, FIOSNBIO, &on) < 0) {
+ msyslog(LOG_ERR,
+ "ioctl(FIOSNBIO) fails on fd #%d: %m", fd);
exit(1);
- /*NOTREACHED*/
}
#else
# include "Bletch: Need non-blocking I/O!"
static SOCKET
open_socket(
- struct sockaddr_storage *addr,
- int flags,
- int turn_off_reuse,
- struct interface *interf
+ sockaddr_u * addr,
+ int bcast,
+ int turn_off_reuse,
+ struct interface * interf
)
{
- int errval;
- SOCKET fd;
+ SOCKET fd;
+ int errval;
+ char scopetext[16];
/*
* int is OK for REUSEADR per
* http://www.kohala.com/start/mcast.api.txt
*/
- int on = 1;
- int off = 0;
+ int on = 1;
+ int off = 0;
- if ((addr->ss_family == AF_INET6) && (isc_net_probeipv6() != ISC_R_SUCCESS))
- return (INVALID_SOCKET);
+ if (IS_IPV6(addr) && !ipv6_works)
+ return INVALID_SOCKET;
/* create a datagram (UDP) socket */
- fd = socket(addr->ss_family, SOCK_DGRAM, 0);
+ fd = socket(AF(addr), SOCK_DGRAM, 0);
if (INVALID_SOCKET == fd) {
#ifndef SYS_WINNT
errval = errno;
#else
errval = WSAGetLastError();
#endif
- netsyslog(LOG_ERR,
- "socket(AF_INET%s, SOCK_DGRAM, 0) failed on address %s: %m",
- (addr->ss_family == AF_INET6) ? "6" : "",
- stoa(addr));
+ msyslog(LOG_ERR,
+ "socket(AF_INET%s, SOCK_DGRAM, 0) failed on address %s: %m",
+ IS_IPV6(addr) ? "6" : "", stoa(addr));
if (errval == EPROTONOSUPPORT ||
errval == EAFNOSUPPORT ||
errval == EPFNOSUPPORT)
return (INVALID_SOCKET);
- msyslog(LOG_ERR, "unexpected error code %d (not PROTONOSUPPORT|AFNOSUPPORT|FPNOSUPPORT) - exiting", errval);
+
+ errno = errval;
+ msyslog(LOG_ERR,
+ "unexpected socket() error %m code %d (not EPROTONOSUPPORT nor EAFNOSUPPORT nor EPFNOSUPPORT) - exiting",
+ errno);
exit(1);
- /*NOTREACHED*/
}
#ifdef SYS_WINNT
if (isc_win32os_versioncheck(5, 1, 0, 0) < 0) /* before 5.1 */
#endif
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
- (char *)(turn_off_reuse
- ? &off
- : &on),
+ (char *)((turn_off_reuse)
+ ? &off
+ : &on),
sizeof(on))) {
- netsyslog(LOG_ERR, "setsockopt SO_REUSEADDR %s"
- " fails for address %s: %m",
- turn_off_reuse
- ? "off"
- : "on",
- stoa(addr));
+ msyslog(LOG_ERR,
+ "setsockopt SO_REUSEADDR %s fails for address %s: %m",
+ (turn_off_reuse)
+ ? "off"
+ : "on",
+ stoa(addr));
closesocket(fd);
return INVALID_SOCKET;
}
/*
* IPv4 specific options go here
*/
- if (addr->ss_family == AF_INET) {
+ if (IS_IPV4(addr)) {
#if defined(HAVE_IPTOS_SUPPORT)
- if (setsockopt(fd, IPPROTO_IP, IP_TOS, (char *) &qos,
- sizeof(qos)) < 0) {
- netsyslog(LOG_ERR,
- "setsockopt IP_TOS (%02x) fails on address %s: %m",
- qos, stoa(addr));
- }
+ if (setsockopt(fd, IPPROTO_IP, IP_TOS, (char *)&qos,
+ sizeof(qos)))
+ msyslog(LOG_ERR,
+ "setsockopt IP_TOS (%02x) fails on address %s: %m",
+ qos, stoa(addr));
#endif /* HAVE_IPTOS_SUPPORT */
- if ((flags & INT_BROADCAST))
+ if (bcast)
socket_broadcast_enable(interf, fd, addr);
}
/*
* IPv6 specific options go here
*/
- if (addr->ss_family == AF_INET6) {
+ if (IS_IPV6(addr)) {
#if defined(IPV6_V6ONLY)
- if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
- (char*)&on, sizeof(on)))
- {
- netsyslog(LOG_ERR, "setsockopt IPV6_V6ONLY on fails on address %s: %m",
+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
+ (char*)&on, sizeof(on)))
+ msyslog(LOG_ERR,
+ "setsockopt IPV6_V6ONLY on fails for address %s: %m",
stoa(addr));
- }
#endif /* IPV6_V6ONLY */
#if defined(IPV6_BINDV6ONLY)
- if (setsockopt(fd, IPPROTO_IPV6, IPV6_BINDV6ONLY,
- (char*)&on, sizeof(on)))
- {
- netsyslog(LOG_ERR,
- "setsockopt IPV6_BINDV6ONLY on fails on address %s: %m",
- stoa(addr));
- }
+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_BINDV6ONLY,
+ (char*)&on, sizeof(on)))
+ msyslog(LOG_ERR,
+ "setsockopt IPV6_BINDV6ONLY on fails for address %s: %m",
+ stoa(addr));
#endif /* IPV6_BINDV6ONLY */
}
* addresses if a wildcard address already bound
* to the port and SO_REUSEADDR is not set
*/
- if (!is_wildcard_addr(addr)) {
- set_wildcard_reuse(addr->ss_family, 1);
- }
+ if (!is_wildcard_addr(addr))
+ set_wildcard_reuse(AF(addr), 1);
#endif
/*
* bind the local address.
*/
- errval = bind(fd, (struct sockaddr *)addr, SOCKLEN(addr));
+ errval = bind(fd, &addr->sa, SOCKLEN(addr));
#ifdef OS_NEEDS_REUSEADDR_FOR_IFADDRBIND
- /*
- * some OSes don't allow binding to more specific
- * addresses if a wildcard address already bound
- * to the port and REUSE_ADDR is not set
- */
- if (!is_wildcard_addr(addr)) {
- set_wildcard_reuse(addr->ss_family, 0);
- }
+ if (!is_wildcard_addr(addr))
+ set_wildcard_reuse(AF(addr), 0);
#endif
if (errval < 0) {
#ifdef DEBUG
|| debug > 1
#endif
- ) {
- if (addr->ss_family == AF_INET)
- netsyslog(LOG_ERR,
- "bind() fd %d, family AF_INET, port %d, addr %s, in_classd=%d flags=0x%x fails: %m",
- fd, (int)ntohs(((struct sockaddr_in*)addr)->sin_port),
- stoa(addr),
- IN_CLASSD(ntohl(((struct sockaddr_in*)addr)->sin_addr.s_addr)),
- flags);
-#ifdef INCLUDE_IPV6_SUPPORT
- else if (addr->ss_family == AF_INET6)
- netsyslog(LOG_ERR,
- "bind() fd %d, family AF_INET6, port %d, scope %d, addr %s, mcast=%d flags=0x%x fails: %m",
- fd, (int)ntohs(((struct sockaddr_in6*)addr)->sin6_port),
-# ifdef ISC_PLATFORM_HAVESCOPEID
- ((struct sockaddr_in6*)addr)->sin6_scope_id
-# else
- -1
-# endif
- , stoa(addr),
- IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)addr)->sin6_addr),
- flags);
-#endif
+ ) {
+ if (SCOPE(addr))
+ snprintf(scopetext, sizeof(scopetext),
+ "%%%d", SCOPE(addr));
+ else
+ scopetext[0] = 0;
+
+ msyslog(LOG_ERR,
+ "bind(%d) AF_INET%s %s%s#%d%s flags 0x%x failed: %m",
+ fd, IS_IPV6(addr) ? "6" : "",
+ stoa(addr), scopetext, SRCPORT(addr),
+ IS_MCAST(addr) ? " (multicast)" : "",
+ interf->flags);
}
closesocket(fd);
{
if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP,
(char*)&on, sizeof(on)))
- {
- netsyslog(LOG_DEBUG,
- "setsockopt SO_TIMESTAMP on fails on address %s: %m",
- stoa(addr));
- }
-#ifdef DEBUG
+ msyslog(LOG_DEBUG,
+ "setsockopt SO_TIMESTAMP on fails on address %s: %m",
+ stoa(addr));
else
- {
- DPRINTF(4, ("setsockopt SO_TIMESTAMP enabled on fd %d address %s\n", fd, stoa(addr)));
- }
-#endif
+ DPRINTF(4, ("setsockopt SO_TIMESTAMP enabled on fd %d address %s\n",
+ fd, stoa(addr)));
}
#endif
- DPRINTF(4, ("bind() fd %d, family %d, port %d, addr %s, flags=0x%x\n",
- fd,
- addr->ss_family,
- (int)ntohs(((struct sockaddr_in*)addr)->sin_port),
- stoa(addr),
- interf->flags));
+ DPRINTF(4, ("bind(%d) AF_INET%s, addr %s%%%d#%d, flags 0x%x\n",
+ fd, IS_IPV6(addr) ? "6" : "", stoa(addr),
+ SCOPE(addr), SRCPORT(addr), interf->flags));
init_nonblocking_io(fd);
/*
* Add the socket to the completion port
*/
- if (io_completion_port_add_socket(fd, interf))
- {
+ if (io_completion_port_add_socket(fd, interf)) {
msyslog(LOG_ERR, "unable to set up io completion port - EXITING");
exit(1);
}
*/
void
sendpkt(
- struct sockaddr_storage *dest,
+ sockaddr_u *dest,
struct interface *inter,
int ttl,
struct pkt *pkt,
int len
)
{
- int cc, slot;
-
- /*
- * Send error caches. Empty slots have port == 0
- * Set ERRORCACHESIZE to 0 to disable
- */
- struct cache {
- u_short port;
- struct in_addr addr;
- };
-
-#ifdef INCLUDE_IPV6_SUPPORT
- struct cache6 {
- u_short port;
- struct in6_addr addr;
- };
-#endif /* INCLUDE_IPV6_SUPPORT */
+ int cc;
+ if (NULL == inter) {
+ /*
+ * unbound peer - drop request and wait for better
+ * network conditions
+ */
+ DPRINTF(2, ("%ssendpkt(dst=%s, ttl=%d, len=%d): no interface - IGNORED\n",
+ (ttl > 0) ? "\tMCAST\t***** " : "",
+ stoa(dest), ttl, len));
+ return;
+ }
-#ifndef ERRORCACHESIZE
-#define ERRORCACHESIZE 8
-#endif
-#if ERRORCACHESIZE > 0
- static struct cache badaddrs[ERRORCACHESIZE];
-#ifdef INCLUDE_IPV6_SUPPORT
- static struct cache6 badaddrs6[ERRORCACHESIZE];
-#endif /* INCLUDE_IPV6_SUPPORT */
-#else
-#define badaddrs ((struct cache *)0) /* Only used in empty loops! */
-#ifdef INCLUDE_IPV6_SUPPORT
-#define badaddrs6 ((struct cache6 *)0) /* Only used in empty loops! */
-#endif /* INCLUDE_IPV6_SUPPORT */
-#endif
-#ifdef DEBUG
- if (debug > 1)
- {
- if (inter != NULL)
- {
- printf("%ssendpkt(fd=%d dst=%s, src=%s, ttl=%d, len=%d)\n",
- (ttl > 0) ? "\tMCAST\t***** " : "",
- inter->fd, stoa(dest),
- stoa(&inter->sin), ttl, len);
- }
- else
- {
- printf("%ssendpkt(dst=%s, ttl=%d, len=%d): no interface - IGNORED\n",
- (ttl > 0) ? "\tMCAST\t***** " : "",
- stoa(dest),
- ttl, len);
- }
- }
-#endif
+ DPRINTF(2, ("%ssendpkt(%d, dst=%s, src=%s, ttl=%d, len=%d)\n",
+ (ttl > 0) ? "\tMCAST\t***** " : "",
+ inter->fd, stoa(dest), stoa(&inter->sin),
+ ttl, len));
- if (inter == NULL) /* unbound peer - drop request and wait for better network conditions */
- return;
-
#ifdef MCAST
-
/*
* for the moment we use the bcast option to set multicast ttl
*/
if (ttl > 0 && ttl != inter->last_ttl) {
-
/*
* set the multicast ttl for outgoing packets
*/
- int rtc;
+ int rtc;
+ u_char cttl;
+ u_int uttl;
- switch (inter->sin.ss_family) {
+ switch (AF(&inter->sin)) {
case AF_INET :
- {
- u_char mttl = (u_char) ttl;
-
- rtc = setsockopt(inter->fd, IPPROTO_IP, IP_MULTICAST_TTL,
- (const void *) &mttl, sizeof(mttl));
+ cttl = (u_char)ttl;
+ rtc = setsockopt(inter->fd, IPPROTO_IP,
+ IP_MULTICAST_TTL,
+ (void *)&cttl, sizeof(cttl));
break;
- }
#ifdef INCLUDE_IPV6_SUPPORT
case AF_INET6 :
- {
- u_int ittl = (u_char) ttl;
-
- rtc = setsockopt(inter->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
- (const void *) &ittl, sizeof(ittl));
+ uttl = (u_int)ttl;
+ rtc = setsockopt(inter->fd, IPPROTO_IPV6,
+ IPV6_MULTICAST_HOPS,
+ (void *)&uttl, sizeof(uttl));
break;
- }
-
#endif /* INCLUDE_IPV6_SUPPORT */
+
default: /* just NOP if not supported */
+ DPRINTF(1, ("sendpkt unknown AF %d",
+ AF(&inter->sin)));
rtc = 0;
- break;
}
- if (rtc != 0) {
- netsyslog(LOG_ERR, "setsockopt IP_MULTICAST_TTL/IPV6_MULTICAST_HOPS fails on address %s: %m",
- stoa(&inter->sin));
- }
- else
+ if (!rtc)
inter->last_ttl = ttl;
+ else
+ msyslog(LOG_ERR,
+ "setsockopt IP_MULTICAST_TTL/IPV6_MULTICAST_HOPS fails on address %s: %m",
+ stoa(&inter->sin));
}
#endif /* MCAST */
- for (slot = ERRORCACHESIZE; --slot >= 0; )
- if(dest->ss_family == AF_INET) {
- if (badaddrs[slot].port == ((struct sockaddr_in*)dest)->sin_port &&
- badaddrs[slot].addr.s_addr == ((struct sockaddr_in*)dest)->sin_addr.s_addr)
- break;
- }
-#ifdef INCLUDE_IPV6_SUPPORT
- else if (dest->ss_family == AF_INET6) {
- if (badaddrs6[slot].port == ((struct sockaddr_in6*)dest)->sin6_port &&
- badaddrs6[slot].addr.s6_addr == ((struct sockaddr_in6*)dest)->sin6_addr.s6_addr)
- break;
- }
-#endif /* INCLUDE_IPV6_SUPPORT */
-
#if defined(HAVE_IO_COMPLETION_PORT)
- cc = io_completion_port_sendto(inter, pkt, len, dest);
- if (cc != ERROR_SUCCESS)
+ cc = io_completion_port_sendto(inter, pkt, len, dest);
+ if (cc != ERROR_SUCCESS) {
#else
#ifdef SIM
cc = simulate_server(dest, inter, pkt);
#else /* SIM */
- cc = sendto(inter->fd, (char *)pkt, (unsigned int)len, 0, (struct sockaddr *)dest,
- SOCKLEN(dest));
+ cc = sendto(inter->fd, (char *)pkt, (unsigned int)len, 0,
+ (struct sockaddr *)dest, SOCKLEN(dest));
#endif /* SIM */
- if (cc == -1)
+ if (cc == -1) {
#endif
- {
inter->notsent++;
packets_notsent++;
-
-#if defined(HAVE_IO_COMPLETION_PORT)
- if (cc != WSAEWOULDBLOCK && cc != WSAENOBUFS && slot < 0)
-#else
- if (errno != EWOULDBLOCK && errno != ENOBUFS && slot < 0)
-#endif
- {
- /*
- * Remember this, if there's an empty slot
- */
- switch (dest->ss_family) {
-
- case AF_INET :
-
- for (slot = ERRORCACHESIZE; --slot >= 0; )
- if (badaddrs[slot].port == 0)
- {
- badaddrs[slot].port = SRCPORT(dest);
- badaddrs[slot].addr = ((struct sockaddr_in*)dest)->sin_addr;
- break;
- }
- break;
-
-#ifdef INCLUDE_IPV6_SUPPORT
- case AF_INET6 :
-
- for (slot = ERRORCACHESIZE; --slot >= 0; )
- if (badaddrs6[slot].port == 0)
- {
- badaddrs6[slot].port = SRCPORT(dest);
- badaddrs6[slot].addr = ((struct sockaddr_in6*)dest)->sin6_addr;
- break;
- }
- break;
-#endif /* INCLUDE_IPV6_SUPPORT */
- default: /* don't care if not supported */
- break;
- }
-
- netsyslog(LOG_ERR, "sendto(%s) (fd=%d): %m",
- stoa(dest), inter->fd);
- }
- }
- else
- {
+ } else {
inter->sent++;
packets_sent++;
- /*
- * He's not bad any more
- */
- if (slot >= 0)
- {
- netsyslog(LOG_INFO, "Connection re-established to %s", stoa(dest));
- switch (dest->ss_family) {
- case AF_INET :
- badaddrs[slot].port = 0;
- break;
-#ifdef INCLUDE_IPV6_SUPPORT
- case AF_INET6 :
- badaddrs6[slot].port = 0;
- break;
-#endif /* INCLUDE_IPV6_SUPPORT */
- default: /* don't care if not supported */
- break;
- }
- }
}
}
+
#if !defined(HAVE_IO_COMPLETION_PORT)
/*
* fdbits - generate ascii representation of fd_set (FAU debug support)
static char buffer[256];
char * buf = buffer;
- count = (count < 256) ? count : 255;
+ count = min(count, 255);
- while (count >= 0)
- {
+ while (count >= 0) {
*buf++ = FD_ISSET(count, set) ? '#' : '-';
count--;
}
rb = get_free_recv_buffer();
- if (rb == NULL)
- {
+ if (NULL == rb) {
/*
* No buffer space available - just drop the packet
*/
}
i = (rp->datalen == 0
- || rp->datalen > sizeof(rb->recv_space))
- ? sizeof(rb->recv_space) : rp->datalen;
+ || rp->datalen > sizeof(rb->recv_space))
+ ? sizeof(rb->recv_space)
+ : rp->datalen;
buflen = read(fd, (char *)&rb->recv_space, (unsigned)i);
- if (buflen < 0)
- {
- if (errno != EINTR && errno != EAGAIN) {
- netsyslog(LOG_ERR, "clock read fd %d: %m", fd);
- }
+ if (buflen < 0) {
+ if (errno != EINTR && errno != EAGAIN)
+ msyslog(LOG_ERR, "clock read fd %d: %m", fd);
freerecvbuf(rb);
return (buflen);
}
rb->recv_time = ts;
rb->receiver = rp->clock_recv;
- if (rp->io_input)
- {
+ if (rp->io_input) {
/*
* have direct input routine for refclocks
*/
- if (rp->io_input(rb) == 0)
- {
+ if (rp->io_input(rb) == 0) {
/*
* data was consumed - nothing to pass up
* into block input machine
return (buflen);
}
+
#ifdef HAVE_TIMESTAMP
/*
* extract timestamps from control message buffer
*/
static l_fp
- fetch_timestamp(struct recvbuf *rb, struct msghdr *msghdr, l_fp ts)
+fetch_timestamp(
+ struct recvbuf * rb,
+ struct msghdr * msghdr,
+ l_fp ts
+ )
{
#ifdef USE_TIMESTAMP_CMSG
struct cmsghdr *cmsghdr;
{
case SCM_TIMESTAMP:
{
- struct timeval *tvp = (struct timeval *)CMSG_DATA(cmsghdr);
+ struct timeval *tvp;
double dtemp;
l_fp nts;
- DPRINTF(4, ("fetch_timestamp: system network time stamp: %ld.%06ld\n", tvp->tv_sec, tvp->tv_usec));
+
+ tvp = (struct timeval *)CMSG_DATA(cmsghdr);
+ DPRINTF(4, ("fetch_timestamp: system network time stamp: %ld.%06ld\n",
+ tvp->tv_sec, tvp->tv_usec));
nts.l_i = tvp->tv_sec + JAN_1970;
- dtemp = (tvp->tv_usec + (ntp_random() * 2. / FRAC)) /
- 1e6;
+ dtemp = (tvp->tv_usec
+ + (ntp_random() * 2. / FRAC)) / 1e6;
nts.l_uf = (u_int32)(dtemp * FRAC);
#ifdef DEBUG_TIMING
{
- l_fp dts = ts;
+ l_fp dts;
+
+ dts = ts;
L_SUB(&dts, &nts);
- collect_timing(rb, "input processing delay", 1, &dts);
- DPRINTF(4, ("fetch_timestamp: timestamp delta: %s (incl. prec fuzz)\n", lfptoa(&dts, 9)));
+ collect_timing(rb,
+ "input processing delay",
+ 1, &dts);
+ DPRINTF(4, ("fetch_timestamp: timestamp delta: %s (incl. prec fuzz)\n",
+ lfptoa(&dts, 9)));
}
#endif
ts = nts; /* network time stamp */
break;
}
default:
- DPRINTF(4, ("fetch_timestamp: skipping control message 0x%x\n", cmsghdr->cmsg_type));
- break;
+ DPRINTF(4, ("fetch_timestamp: skipping control message 0x%x\n",
+ cmsghdr->cmsg_type));
}
cmsghdr = CMSG_NXTHDR(msghdr, cmsghdr);
}
}
#endif
+
/*
* Routine to read the network NTP packets for a specific interface
* Return the number of bytes read. That way we know if we should
* read it again or go on to the next one if no bytes returned
*/
static inline int
-read_network_packet(SOCKET fd, struct interface *itf, l_fp ts)
+read_network_packet(
+ SOCKET fd,
+ struct interface * itf,
+ l_fp ts
+ )
{
GETSOCKNAME_SOCKLEN_TYPE fromlen;
int buflen;
- isc_boolean_t ignore_this;
register struct recvbuf *rb;
#ifdef HAVE_TIMESTAMP
struct msghdr msghdr;
struct iovec iovec;
- char control[TIMESTAMP_CTLMSGBUF_SIZE]; /* pick up control messages */
+ char control[TIMESTAMP_CTLMSGBUF_SIZE];
#endif
/*
*/
rb = get_free_recv_buffer();
- ignore_this = itf->ignore_packets;
- if (rb == NULL ||(ignore_this == ISC_TRUE)) {
+ if (NULL == rb || itf->ignore_packets) {
char buf[RX_BUFF_SIZE];
- struct sockaddr_storage from;
+ sockaddr_u from;
+
if (rb != NULL)
freerecvbuf(rb);
fromlen = sizeof(from);
buflen = recvfrom(fd, buf, sizeof(buf), 0,
- (struct sockaddr*)&from, &fromlen);
+ &from.sa, &fromlen);
DPRINTF(4, ("%s on (%lu) fd=%d from %s\n",
- (itf->ignore_packets == ISC_TRUE) ? "ignore" : "drop",
- free_recvbuffs(), fd,
- stoa(&from)));
- if (itf->ignore_packets == ISC_TRUE)
+ (itf->ignore_packets)
+ ? "ignore"
+ : "drop",
+ free_recvbuffs(), fd, stoa(&from)));
+ if (itf->ignore_packets)
packets_ignored++;
else
packets_dropped++;
return (buflen);
}
- fromlen = sizeof(struct sockaddr_storage);
+ fromlen = sizeof(&rb->recv_srcadr.sas);
#ifndef HAVE_TIMESTAMP
- rb->recv_length = recvfrom(fd,
- (char *)&rb->recv_space,
- sizeof(rb->recv_space), 0,
- (struct sockaddr *)&rb->recv_srcadr,
- &fromlen);
+ rb->recv_length = recvfrom(fd, (char *)&rb->recv_space,
+ sizeof(rb->recv_space), 0,
+ &rb->recv_srcadr.sa, &fromlen);
#else
iovec.iov_base = (void *)&rb->recv_space;
iovec.iov_len = sizeof(rb->recv_space);
- msghdr.msg_name = (void *)&rb->recv_srcadr;
- msghdr.msg_namelen = sizeof(rb->recv_srcadr);
+ msghdr.msg_name = &rb->recv_srcadr.sas;
+ msghdr.msg_namelen = fromlen;
msghdr.msg_iov = &iovec;
msghdr.msg_iovlen = 1;
msghdr.msg_control = (void *)&control;
buflen = rb->recv_length;
if (buflen == 0 || (buflen == -1 &&
- (errno==EWOULDBLOCK
+ (EWOULDBLOCK == errno
#ifdef EAGAIN
- || errno==EAGAIN
+ || EAGAIN == errno
#endif
- ))) {
+ ))) {
freerecvbuf(rb);
return (buflen);
- }
- else if (buflen < 0)
- {
- netsyslog(LOG_ERR, "recvfrom(%s) fd=%d: %m",
- stoa(&rb->recv_srcadr), fd);
- DPRINTF(5, ("read_network_packet: fd=%d dropped (bad recvfrom)\n", fd));
+ } else if (buflen < 0) {
+ msyslog(LOG_ERR, "recvfrom(%s) fd=%d: %m",
+ stoa(&rb->recv_srcadr), fd);
+ DPRINTF(5, ("read_network_packet: fd=%d dropped (bad recvfrom)\n",
+ fd));
freerecvbuf(rb);
return (buflen);
}
-#ifdef DEBUG
- if (debug > 2) {
- if(rb->recv_srcadr.ss_family == AF_INET)
- printf("read_network_packet: fd=%d length %d from %08lx %s\n",
- fd, buflen,
- (u_long)ntohl(((struct sockaddr_in*)&rb->recv_srcadr)->sin_addr.s_addr) &
- 0x00000000ffffffff,
- stoa(&rb->recv_srcadr));
- else
- printf("read_network_packet: fd=%d length %d from %s\n",
- fd, buflen,
- stoa(&rb->recv_srcadr));
- }
-#endif
+ DPRINTF(3, ("read_network_packet: fd=%d length %d from %s\n",
+ fd, buflen, stoa(&rb->recv_srcadr)));
/*
* Got one. Mark how and when it got here,
rb->dstadr = itf;
rb->fd = fd;
#ifdef HAVE_TIMESTAMP
- ts = fetch_timestamp(rb, &msghdr, ts); /* pick up a network time stamp if possible */
+ /* pick up a network time stamp if possible */
+ ts = fetch_timestamp(rb, &msghdr, ts);
#endif
rb->recv_time = ts;
rb->receiver = receive;
return (buflen);
}
+
/*
* input_handler - receive packets asynchronously
*/
l_fp *cts
)
{
-
int buflen;
int n;
int doing;
SOCKET fd;
struct timeval tvzero;
- l_fp ts; /* Timestamp at BOselect() gob */
+ l_fp ts; /* Timestamp at BOselect() gob */
#ifdef DEBUG_TIMING
- l_fp ts_e; /* Timestamp at EOselect() gob */
+ l_fp ts_e; /* Timestamp at EOselect() gob */
#endif
fd_set fds;
int select_count = 0;
/*
* If we have something to do, freeze a timestamp.
- * See below for the other cases (nothing (left) to do or error)
+ * See below for the other cases (nothing left to do or error)
*/
ts = *cts;
fds = activefds;
tvzero.tv_sec = tvzero.tv_usec = 0;
- n = select(maxactivefd+1, &fds, (fd_set *)0, (fd_set *)0, &tvzero);
+ n = select(maxactivefd + 1, &fds, (fd_set *)0, (fd_set *)0,
+ &tvzero);
/*
* If there are no packets waiting just return
*/
- if (n < 0)
- {
+ if (n < 0) {
int err = errno;
/*
* extended FAU debugging output
*/
if (err != EINTR)
- netsyslog(LOG_ERR,
- "select(%d, %s, 0L, 0L, &0.0) error: %m",
- maxactivefd+1,
- fdbits(maxactivefd, &activefds));
+ msyslog(LOG_ERR,
+ "select(%d, %s, 0L, 0L, &0.0) error: %m",
+ maxactivefd + 1,
+ fdbits(maxactivefd, &activefds));
if (err == EBADF) {
int j, b;
fds = activefds;
for (j = 0; j <= maxactivefd; j++)
- if ((FD_ISSET(j, &fds) && (read(j, &b, 0) == -1)))
- netsyslog(LOG_ERR, "Bad file descriptor %d", j);
+ if ((FD_ISSET(j, &fds)
+ && (read(j, &b, 0) == -1)))
+ msyslog(LOG_ERR,
+ "Bad file descriptor %d",
+ j);
}
return;
}
* Check out the reference clocks first, if any
*/
- if (refio != NULL)
- {
+ if (refio != NULL) {
register struct refclockio *rp;
- for (rp = refio; rp != NULL; rp = rp->next)
- {
+ for (rp = refio; rp != NULL; rp = rp->next) {
fd = rp->fd;
if (FD_ISSET(fd, &fds))
- {
do {
++select_count;
- buflen = read_refclock_packet(fd, rp, ts);
+ buflen = read_refclock_packet(
+ fd, rp, ts);
} while (buflen > 0);
-
- } /* End if (FD_ISSET(fd, &fds)) */
- } /* End for (rp = refio; rp != 0 && n > 0; rp = rp->next) */
- } /* End if (refio != 0) */
-
+ }
+ }
#endif /* REFCLOCK */
/*
*/
for (interface = ISC_LIST_TAIL(inter_list);
interface != NULL;
- interface = ISC_LIST_PREV(interface, link))
- {
- for (doing = 0; (doing < 2); doing++)
- {
- if (doing == 0)
- {
+ interface = ISC_LIST_PREV(interface, link)) {
+
+ for (doing = 0; (doing < 2); doing++) {
+ if (!doing)
fd = interface->fd;
- }
- else
- {
+ else {
if (!(interface->flags & INT_BCASTOPEN))
- break;
+ break;
fd = interface->bfd;
}
- if (fd < 0) continue;
+ if (fd < 0)
+ continue;
if (FD_ISSET(fd, &fds))
- {
do {
++select_count;
- buflen = read_network_packet(fd, interface, ts);
+ buflen = read_network_packet(
+ fd, interface,
+ ts);
} while (buflen > 0);
- }
- /* Check more interfaces */
+ /* Check more interfaces */
}
}
*/
asyncio_reader = ISC_LIST_TAIL(asyncio_reader_list);
- while (asyncio_reader != NULL)
- {
- struct asyncio_reader *next = ISC_LIST_PREV(asyncio_reader, link);
+ while (asyncio_reader != NULL) {
+ struct asyncio_reader *next;
+
+ next = ISC_LIST_PREV(asyncio_reader, link);
if (FD_ISSET(asyncio_reader->fd, &fds)) {
++select_count;
asyncio_reader->receiver(asyncio_reader);
* If nothing to do, just return.
* If an error occurred, complain and return.
*/
- if (select_count == 0) /* We really had nothing to do */
- {
+ if (select_count == 0) { /* We really had nothing to do */
#ifdef DEBUG
if (debug)
- netsyslog(LOG_DEBUG, "input_handler: select() returned 0");
+ msyslog(LOG_DEBUG, "input_handler: select() returned 0");
#endif
return;
}
- /* We've done our work */
+ /* We've done our work */
#ifdef DEBUG_TIMING
get_systime(&ts_e);
/*
L_SUB(&ts_e, &ts);
collect_timing(NULL, "input handler", 1, &ts_e);
if (debug > 3)
- netsyslog(LOG_INFO, "input_handler: Processed a gob of fd's in %s msec", lfptoms(&ts_e, 6));
+ msyslog(LOG_DEBUG,
+ "input_handler: Processed a gob of fd's in %s msec",
+ lfptoms(&ts_e, 6));
#endif
/* just bail. */
return;
}
-
#endif
/*
*/
struct interface *
findinterface(
- struct sockaddr_storage *addr
+ sockaddr_u *addr
)
{
- struct interface *interface;
+ struct interface *iface;
- interface = findlocalinterface(addr, INT_WILDCARD, 0);
+ iface = findlocalinterface(addr, INT_WILDCARD, 0);
- if (interface == NULL)
- {
+ if (NULL == iface) {
DPRINTF(4, ("Found no interface for address %s - returning wildcard\n",
stoa(addr)));
- return (ANY_INTERFACE_CHOOSE(addr));
- }
- else
- {
+ iface = ANY_INTERFACE_CHOOSE(addr);
+ } else
DPRINTF(4, ("Found interface #%d %s for address %s\n",
- interface->ifnum, interface->name, stoa(addr)));
+ iface->ifnum, iface->name, stoa(addr)));
- return (interface);
- }
+ return iface;
}
/*
*/
static struct interface *
findlocalinterface(
- struct sockaddr_storage *addr,
- int flags,
- int bcast
+ sockaddr_u * addr,
+ int flags,
+ int bcast
)
{
- SOCKET s;
- int rtn;
- struct sockaddr_storage saddr;
- GETSOCKNAME_SOCKLEN_TYPE saddrlen = SOCKLEN(addr);
- struct interface *iface;
- int on = 1;
+ GETSOCKNAME_SOCKLEN_TYPE sockaddrlen;
+ struct interface * iface;
+ sockaddr_u saddr;
+ SOCKET s;
+ int rtn;
+ int on;
DPRINTF(4, ("Finding interface for addr %s in list of addresses\n",
stoa(addr)));
-
- memset(&saddr, 0, sizeof(saddr));
- saddr.ss_family = addr->ss_family;
- if(addr->ss_family == AF_INET) {
- memcpy(&((struct sockaddr_in*)&saddr)->sin_addr, &((struct sockaddr_in*)addr)->sin_addr, sizeof(struct in_addr));
- ((struct sockaddr_in*)&saddr)->sin_port = htons(NTP_PORT);
- }
-#ifdef INCLUDE_IPV6_SUPPORT
- else if(addr->ss_family == AF_INET6) {
- memcpy(&((struct sockaddr_in6*)&saddr)->sin6_addr, &((struct sockaddr_in6*)addr)->sin6_addr, sizeof(struct in6_addr));
- ((struct sockaddr_in6*)&saddr)->sin6_port = htons(NTP_PORT);
-# ifdef ISC_PLATFORM_HAVESCOPEID
- ((struct sockaddr_in6*)&saddr)->sin6_scope_id = ((struct sockaddr_in6*)addr)->sin6_scope_id;
-# endif
- }
-#endif
- s = socket(addr->ss_family, SOCK_DGRAM, 0);
- if (s == INVALID_SOCKET)
+ s = socket(AF(addr), SOCK_DGRAM, 0);
+ if (INVALID_SOCKET == s)
return NULL;
/*
* If we are looking for broadcast interface we need to set this
* socket to allow broadcast
*/
- if (bcast)
+ if (bcast) {
+ on = 1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST,
(char *)&on, sizeof(on));
+ }
- rtn = connect(s, (struct sockaddr *)&saddr, SOCKLEN(&saddr));
- if (rtn == SOCKET_ERROR)
- {
+ rtn = connect(s, &addr->sa, SOCKLEN(addr));
+ if (SOCKET_ERROR == rtn) {
closesocket(s);
return NULL;
}
- rtn = getsockname(s, (struct sockaddr *)&saddr, &saddrlen);
+ sockaddrlen = sizeof(saddr);
+ rtn = getsockname(s, &saddr.sa, &sockaddrlen);
closesocket(s);
- if (rtn == SOCKET_ERROR)
+
+ if (SOCKET_ERROR == rtn)
return NULL;
- DPRINTF(4, ("findlocalinterface: kernel maps %s to %s\n", stoa(addr), stoa(&saddr)));
+ DPRINTF(4, ("findlocalinterface: kernel maps %s to %s\n",
+ stoa(addr), stoa(&saddr)));
iface = getinterface(&saddr, flags);
if (NULL == iface)
iface = getsamenetinterface(&saddr, flags);
- /* Don't return an interface which will ignore replies */
- if (NULL != iface && iface->ignore_packets)
+ /* Don't use an interface which will ignore replies */
+ if (iface != NULL && iface->ignore_packets)
iface = NULL;
return iface;
}
+
/*
* fetch an interface structure the matches the
- * address is has the given flags NOT set
+ * address and has the given flags NOT set
*/
static struct interface *
-getinterface(struct sockaddr_storage *addr, int flags)
+getinterface(
+ sockaddr_u * addr,
+ int flags
+ )
{
- struct interface *interface = find_addr_in_list(addr);
+ struct interface *iface;
+
+ iface = find_addr_in_list(addr);
- if (interface != NULL && interface->flags & flags)
- {
- return NULL;
- }
- else
- {
- return interface;
- }
+ if (iface != NULL && (iface->flags & flags))
+ iface = NULL;
+
+ return iface;
}
+
/*
* fetch an interface structure with a local address on the same subnet
* as addr which has the given flags NOT set
*/
static struct interface *
-getsamenetinterface(struct sockaddr_storage *addr, int flags)
+getsamenetinterface(
+ sockaddr_u * addr,
+ int flags
+ )
{
struct interface *iface;
iface = find_samenet_addr_in_list(addr);
- if (NULL != iface && iface->flags & flags)
+ if (iface != NULL && (iface->flags & flags))
iface = NULL;
return iface;
}
+
/*
- * findlocalcastinterface - find local *cast interface index corresponding to address
- * depending on the flags passed
+ * findlocalcastinterface - find local *cast interface for addr
*/
static struct interface *
findlocalcastinterface(
- struct sockaddr_storage *addr, int flags
+ sockaddr_u * addr
)
{
- struct interface *interface;
- struct interface *nif = NULL;
+ struct interface * iface;
+ struct interface * nif;
#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
- isc_boolean_t want_linklocal;
+ isc_boolean_t want_linklocal;
#endif
+ NTP_REQUIRE(addr_ismulticast(addr));
+
/*
* see how kernel maps the mcast address
*/
- nif = findlocalinterface(addr, 0, 0);
+ nif = findlocalinterface(addr, 0, 0);
if (nif) {
DPRINTF(2, ("findlocalcastinterface: kernel recommends interface #%d %s\n", nif->ifnum, nif->name));
}
#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
- want_linklocal = ISC_FALSE;
- if (addr_ismulticast(addr) && flags == INT_MULTICAST)
- {
- if (IN6_IS_ADDR_MC_LINKLOCAL(&((struct sockaddr_in6*)addr)->sin6_addr))
- {
- want_linklocal = ISC_TRUE;
- }
- else if (IN6_IS_ADDR_MC_SITELOCAL(&((struct sockaddr_in6*)addr)->sin6_addr))
- {
- want_linklocal = ISC_TRUE;
- }
- }
+ want_linklocal = (IN6_IS_ADDR_MC_LINKLOCAL(PSOCK_ADDR6(addr))
+ || IN6_IS_ADDR_MC_SITELOCAL(PSOCK_ADDR6(addr)));
#endif
- for (interface = ISC_LIST_HEAD(inter_list);
- interface != NULL;
- interface = ISC_LIST_NEXT(interface, link))
+ for (iface = ISC_LIST_HEAD(inter_list);
+ iface != NULL;
+ iface = ISC_LIST_NEXT(iface, link))
{
/* use only allowed addresses */
- if (interface->ignore_packets == ISC_TRUE)
+ if (iface->ignore_packets)
continue;
/* Skip the loopback and wildcard addresses */
- if (interface->flags & (INT_LOOPBACK|INT_WILDCARD))
+ if (iface->flags & (INT_LOOPBACK | INT_WILDCARD))
continue;
/* Skip if different family */
- if(interface->sin.ss_family != addr->ss_family)
+ if (AF(&iface->sin) != AF(addr))
continue;
- /* Is this it one of these based on flags? */
- if (!(interface->flags & flags))
+ /* Is it multicast capable? */
+ if (!(iface->flags & INT_MULTICAST))
continue;
- /* for IPv6 multicast check the address for linklocal */
#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
- if (flags == INT_MULTICAST && interface->sin.ss_family == AF_INET6 &&
- (IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6*)&interface->sin)->sin6_addr))
- && want_linklocal == ISC_TRUE)
- {
- nif = interface;
+ if (want_linklocal && IS_IPV6(&iface->sin) &&
+ IN6_IS_ADDR_LINKLOCAL(PSOCK_ADDR6(&iface->sin))) {
+ nif = iface;
break;
}
- /* If we want a linklocal address and this isn't it, skip */\
- if (want_linklocal == ISC_TRUE)
+ /* If we want a linklocal address, skip */
+ if (want_linklocal)
continue;
#endif
- /* Otherwise just look for the flag */
- if((interface->flags & flags))
- {
- nif = interface;
- break;
- }
- }
-#ifdef DEBUG
- if (debug > 2)
- {
- if (nif)
- printf("findlocalcastinterface: found interface #%d %s\n", nif->ifnum, nif->name);
- else
- printf("findlocalcastinterface: no interface found for %s flags 0x%x\n", stoa(addr), flags);
- }
-#endif
- return (nif);
+ nif = iface;
+ break;
+ } /* for loop over interfaces */
+
+ if (nif != NULL)
+ DPRINTF(3, ("findlocalcastinterface: found interface #%d %s\n",
+ nif->ifnum, nif->name));
+ else
+ DPRINTF(3, ("findlocalcastinterface: no interface found for %s\n",
+ stoa(addr)));
+ return nif;
}
+
/*
* findbcastinter - find broadcast interface corresponding to address
*/
struct interface *
findbcastinter(
- struct sockaddr_storage *addr
+ sockaddr_u *addr
)
{
#if !defined(MPE) && (defined(SIOCGIFCONF) || defined(SYS_WINNT))
- struct interface *interface;
+ struct interface *iface;
DPRINTF(4, ("Finding broadcast/multicast interface for addr %s in list of addresses\n",
stoa(addr)));
- interface = findlocalinterface(addr, INT_LOOPBACK | INT_WILDCARD, 1);
-
- if (interface != NULL)
- {
- DPRINTF(4, ("Easily found bcast-/mcast- interface index #%d %s\n", interface->ifnum, interface->name));
- return interface;
+ iface = findlocalinterface(addr, INT_LOOPBACK | INT_WILDCARD,
+ 1);
+ if (iface != NULL) {
+ DPRINTF(4, ("Easily found bcast-/mcast- interface index #%d %s\n",
+ iface->ifnum, iface->name));
+ return iface;
}
- /* plan B - try to find something reasonable in our lists in case kernel lookup doesn't help */
-
- for (interface = ISC_LIST_HEAD(inter_list);
- interface != NULL;
- interface = ISC_LIST_NEXT(interface, link))
+ /*
+ * plan B - try to find something reasonable in our lists in
+ * case kernel lookup doesn't help
+ */
+ for (iface = ISC_LIST_HEAD(inter_list);
+ iface != NULL;
+ iface = ISC_LIST_NEXT(iface, link))
{
- if (interface->flags & INT_WILDCARD)
- continue;
+ if (iface->flags & INT_WILDCARD)
+ continue;
/* Don't bother with ignored interfaces */
- if (interface->ignore_packets == ISC_TRUE)
+ if (iface->ignore_packets)
continue;
/*
* First look if this is the correct family
*/
- if(interface->sin.ss_family != addr->ss_family)
- continue;
+ if(AF(&iface->sin) != AF(addr))
+ continue;
/* Skip the loopback addresses */
- if (interface->flags & INT_LOOPBACK)
+ if (iface->flags & INT_LOOPBACK)
continue;
/*
- * If we are looking to match a multicast address grab it.
+ * If we are looking to match a multicast address and
+ * this interface is one...
*/
- if (addr_ismulticast(addr) == ISC_TRUE && interface->flags & INT_MULTICAST)
- {
+ if (addr_ismulticast(addr)
+ && (iface->flags & INT_MULTICAST)) {
#ifdef INCLUDE_IPV6_SUPPORT
- if(addr->ss_family == AF_INET6) {
- /* Only use link-local address for link-scope mcast */
- if(IN6_IS_ADDR_MC_LINKLOCAL(&((struct sockaddr_in6*)addr)->sin6_addr) &&
- !IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6*)&interface->sin)->sin6_addr)) {
- continue;
- }
- }
+ /*
+ * ...it is the winner unless we're looking for
+ * an interface to use for link-local multicast
+ * and its address is not link-local.
+ */
+ if (IS_IPV6(addr)
+ && IN6_IS_ADDR_MC_LINKLOCAL(PSOCK_ADDR6(addr))
+ && !IN6_IS_ADDR_LINKLOCAL(PSOCK_ADDR6(&iface->sin)))
+ continue;
#endif
break;
}
* address or the network portion of the IP address.
* Sloppy.
*/
- if(addr->ss_family == AF_INET) {
- if (SOCKCMP(&interface->bcast, addr)) {
+ if (IS_IPV4(addr)) {
+ if (SOCK_EQ(&iface->bcast, addr))
break;
- }
- if ((NSRCADR(&interface->sin) &
- NSRCADR(&interface->mask)) == (NSRCADR(addr) &
- NSRCADR(&interface->mask)))
+
+ if ((NSRCADR(&iface->sin) & NSRCADR(&iface->mask))
+ == (NSRCADR(addr) & NSRCADR(&iface->mask)))
break;
}
#ifdef INCLUDE_IPV6_SUPPORT
- else if(addr->ss_family == AF_INET6) {
- if (SOCKCMP(&interface->bcast, addr)) {
+ else if(IS_IPV6(addr)) {
+ if (SOCK_EQ(&iface->bcast, addr))
break;
- }
- if (SOCKCMP(netof(&interface->sin), netof(addr))) {
+
+ if (SOCK_EQ(netof(&iface->sin), netof(addr)))
break;
- }
}
#endif
}
#endif /* SIOCGIFCONF */
- if (interface == NULL) {
- DPRINTF(4, ("No bcast interface found for %s\n", stoa(addr)));
- return ANY_INTERFACE_CHOOSE(addr);
- } else {
- DPRINTF(4, ("Found bcast-/mcast- interface index #%d %s\n", interface->ifnum, interface->name));
- return interface;
- }
+ if (NULL == iface) {
+ DPRINTF(4, ("No bcast interface found for %s\n",
+ stoa(addr)));
+ iface = ANY_INTERFACE_CHOOSE(addr);
+ } else
+ DPRINTF(4, ("Found bcast-/mcast- interface index #%d %s\n",
+ iface->ifnum, iface->name));
+ return iface;
}
)
{
BLOCKIO();
+
/*
* Stuff the I/O structure in the list and mark the descriptor
- * in use. There is a harmless (I hope) race condition here.
+ * in use. There is a harmless (I hope) race condition here.
*/
rio->next = refio;
# ifdef HAVE_SIGNALED_IO
- if (init_clock_sig(rio))
- {
+ if (init_clock_sig(rio)) {
UNBLOCKIO();
return 0;
}
# elif defined(HAVE_IO_COMPLETION_PORT)
- if (io_completion_port_add_clock_io(rio))
- {
+ if (io_completion_port_add_clock_io(rio)) {
UNBLOCKIO();
return 0;
}
*/
refio = rio;
- /*
+ /*
* register fd
*/
add_fd_to_list(rio->fd, FD_TYPE_FILE);
struct refclockio *rio
)
{
+ register struct refclockio *rp;
+
BLOCKIO();
+
/*
* Remove structure from the list
*/
if (refio == rio)
- {
refio = rio->next;
- }
- else
- {
- register struct refclockio *rp;
-
+ else {
for (rp = refio; rp != NULL; rp = rp->next)
- if (rp->next == rio)
- {
- rp->next = rio->next;
- break;
- }
+ if (rp->next == rio) {
+ rp->next = rio->next;
+ break;
+ }
- if (rp == NULL) {
+ if (NULL == rp) {
UNBLOCKIO();
return;
}
*/
#ifndef HAVE_IO_COMPLETION_PORT
if (fd < 0 || fd >= FD_SETSIZE) {
- msyslog(LOG_ERR, "Too many sockets in use, FD_SETSIZE %d exceeded",
+ msyslog(LOG_ERR,
+ "Too many sockets in use, FD_SETSIZE %d exceeded",
FD_SETSIZE);
exit(1);
}
/*
* keep activefds in sync
*/
- if (fd > maxactivefd)
- maxactivefd = fd;
- FD_SET( (u_int)fd, &activefds);
+ maxactivefd = max(fd, maxactivefd);
+
+ FD_SET(fd, &activefds);
#endif
}
while(lsock != NULL) {
next = ISC_LIST_NEXT(lsock, link);
if(lsock->fd == fd) {
- ISC_LIST_DEQUEUE_TYPE(fd_list, lsock, link, vsock_t);
+ ISC_LIST_DEQUEUE_TYPE(fd_list, lsock, link,
+ vsock_t);
switch (lsock->type) {
case FD_TYPE_SOCKET:
-#ifdef SYS_WINNT
closesocket(lsock->fd);
break;
-#endif
+
case FD_TYPE_FILE:
- (void) close(lsock->fd);
+ close(lsock->fd);
break;
+
default:
- msyslog(LOG_ERR, "internal error - illegal descriptor type %d - EXITING", (int)lsock->type);
+ msyslog(LOG_ERR,
+ "internal error - illegal descriptor type %d - EXITING",
+ (int)lsock->type);
exit(1);
}
/*
* remove from activefds
*/
- FD_CLR( (u_int) fd, &activefds);
+ FD_CLR(fd, &activefds);
- if (fd == maxactivefd) {
- int i, newmax = 0;
- for (i = 0; i < maxactivefd; i++)
- if (FD_ISSET(i, &activefds))
- newmax = i;
- maxactivefd = newmax;
+ if (fd == maxactivefd && maxactivefd) {
+ int i;
+ NTP_INSIST(maxactivefd - 1 < FD_SETSIZE);
+ for (i = maxactivefd - 1; i >= 0; i--)
+ if (FD_ISSET(i, &activefds)) {
+ maxactivefd = i;
+ break;
+ }
+ NTP_INSIST(fd != maxactivefd);
}
#endif
break;
static void
add_addr_to_list(
- struct sockaddr_storage *addr,
+ sockaddr_u *addr,
struct interface *interface
)
{
DPRINTF(4, ("Added addr %s to list of addresses\n",
stoa(addr)));
#ifdef DEBUG
- } else {
- DPRINTF(4, ("WARNING: Attempt to add duplicate addr "
- "%s to address list\n",
+ } else
+ DPRINTF(4, ("WARNING: Attempt to add duplicate addr %s to address list\n",
stoa(addr)));
- }
#endif
}
+
static void
delete_addr_from_list(
- struct sockaddr_storage *addr
+ sockaddr_u *addr
)
{
- remaddr_t *next;
- remaddr_t *laddr = ISC_LIST_HEAD(remoteaddr_list);
-
- while(laddr != NULL) {
- next = ISC_LIST_NEXT(laddr, link);
- if(SOCKCMP(&laddr->addr, addr)) {
- ISC_LIST_DEQUEUE_TYPE(remoteaddr_list, laddr, link, remaddr_t);
+ remaddr_t *entry;
+
+ for (entry = ISC_LIST_HEAD(remoteaddr_list);
+ entry != NULL;
+ entry = ISC_LIST_NEXT(entry, link))
+ if (SOCK_EQ(&entry->addr, addr)) {
+ ISC_LIST_DEQUEUE_TYPE(remoteaddr_list, entry,
+ link, remaddr_t);
DPRINTF(4, ("Deleted addr %s from list of addresses\n",
stoa(addr)));
- free(laddr);
+ free(entry);
break;
}
- laddr = next;
- }
}
+
static void
delete_interface_from_list(
struct interface *iface
)
{
remaddr_t *next;
- remaddr_t *laddr = ISC_LIST_HEAD(remoteaddr_list);
+ remaddr_t *entry;
+
+ entry = ISC_LIST_HEAD(remoteaddr_list);
- while(laddr != NULL) {
- next = ISC_LIST_NEXT(laddr, link);
- if (laddr->interface == iface) {
- ISC_LIST_DEQUEUE_TYPE(remoteaddr_list, laddr, link, remaddr_t);
+ while (entry != NULL) {
+ next = ISC_LIST_NEXT(entry, link);
+ if (entry->interface == iface) {
+ ISC_LIST_DEQUEUE_TYPE(remoteaddr_list, entry,
+ link, remaddr_t);
DPRINTF(4, ("Deleted addr %s for interface #%d %s from list of addresses\n",
- stoa(&laddr->addr), iface->ifnum, iface->name));
- free(laddr);
+ stoa(&entry->addr), iface->ifnum,
+ iface->name));
+ free(entry);
}
- laddr = next;
+ entry = next;
}
}
+
static struct interface *
find_addr_in_list(
- struct sockaddr_storage *addr
+ sockaddr_u *addr
)
{
- remaddr_t *next;
- remaddr_t *laddr = ISC_LIST_HEAD(remoteaddr_list);
+ remaddr_t *entry;
+
DPRINTF(4, ("Searching for addr %s in list of addresses - ",
stoa(addr)));
- while(laddr != NULL) {
- next = ISC_LIST_NEXT(laddr, link);
-
- if(SOCKCMP(&laddr->addr, addr)) {
+ for (entry = ISC_LIST_HEAD(remoteaddr_list);
+ entry != NULL;
+ entry = ISC_LIST_NEXT(entry, link))
+ if(SOCK_EQ(&entry->addr, addr)) {
DPRINTF(4, ("FOUND\n"));
- return laddr->interface;
+ return entry->interface;
}
-
- laddr = next;
- }
DPRINTF(4, ("NOT FOUND\n"));
return NULL;
}
#endif /* INCLUDE_IPV6_SUPPORT */
+
static isc_boolean_t
same_network(
- struct sockaddr_storage *addr1,
- struct sockaddr_storage *mask,
- struct sockaddr_storage *addr2
+ sockaddr_u *a1,
+ sockaddr_u *mask,
+ sockaddr_u *a2
)
{
- if (addr1->ss_family != addr2->ss_family)
- return ISC_FALSE;
+ isc_boolean_t sn;
- if (AF_INET == addr1->ss_family) {
- return same_network_v4(
- (struct sockaddr_in *)addr1,
- (struct sockaddr_in *)mask,
- (struct sockaddr_in *)addr2);
- }
+ if (AF(a1) != AF(a2))
+ sn = ISC_FALSE;
+ else if (IS_IPV4(a1))
+ sn = same_network_v4(&a1->sa4, &mask->sa4, &a2->sa4);
#ifdef INCLUDE_IPV6_SUPPORT
- else if (AF_INET6 == addr1->ss_family) {
- return same_network_v6(
- (struct sockaddr_in6 *)addr1,
- (struct sockaddr_in6 *)mask,
- (struct sockaddr_in6 *)addr2);
- }
+ else if (IS_IPV6(a1))
+ sn = same_network_v6(&a1->sa6, &mask->sa6, &a2->sa6);
#endif
else
- return ISC_FALSE;
+ sn = ISC_FALSE;
+
+ return sn;
}
/*
*/
static struct interface *
find_samenet_addr_in_list(
- struct sockaddr_storage *addr
+ sockaddr_u *addr
)
{
- remaddr_t *next;
- remaddr_t *laddr;
+ remaddr_t *entry;
- DPRINTF(4, ("Searching for addr with same subnet as %s in "
- "list of addresses - ",
+ DPRINTF(4, ("Searching for addr with same subnet as %s in list of addresses - ",
stoa(addr)));
- for (laddr = ISC_LIST_HEAD(remoteaddr_list);
- NULL != laddr;
- laddr = next)
- {
- next = ISC_LIST_NEXT(laddr, link);
+ for (entry = ISC_LIST_HEAD(remoteaddr_list);
+ entry != NULL;
+ entry = ISC_LIST_NEXT(entry, link))
- if (same_network(&laddr->addr, &laddr->interface->mask,
+ if (same_network(&entry->addr, &entry->interface->mask,
addr)) {
DPRINTF(4, ("FOUND\n"));
- return laddr->interface;
+ return entry->interface;
}
- }
DPRINTF(4, ("NOT FOUND\n"));
return NULL;
}
+
/*
- * Find the given address with the associated flag in the list
+ * Find the given address with the all given flags set in the list
*/
static struct interface *
-find_flagged_addr_in_list(struct sockaddr_storage *addr, int flag) {
+find_flagged_addr_in_list(
+ sockaddr_u * addr,
+ int flags
+ )
+{
+ remaddr_t *entry;
+
+ DPRINTF(4, ("Finding addr %s with flags %d in list: ",
+ stoa(addr), flags));
- remaddr_t *next;
- remaddr_t *laddr = ISC_LIST_HEAD(remoteaddr_list);
- DPRINTF(4, ("Finding addr %s in list of addresses\n",
- stoa(addr)));
+ for (entry = ISC_LIST_HEAD(remoteaddr_list);
+ entry != NULL;
+ entry = ISC_LIST_NEXT(entry, link))
- while(laddr != NULL) {
- next = ISC_LIST_NEXT(laddr, link);
- if(SOCKCMP(&laddr->addr, addr) && (laddr->interface->flags & flag)) {
- return laddr->interface;
- break;
+ if (SOCK_EQ(&entry->addr, addr)
+ && (entry->interface->flags & flags) == flags) {
+
+ DPRINTF(4, ("FOUND\n"));
+ return entry->interface;
}
- else
- laddr = next;
- }
- return NULL; /* Not found */
+
+ DPRINTF(4, ("NOT FOUND\n"));
+ return NULL;
}
-#ifdef HAS_ROUTING_SOCKET
-#include <net/route.h>
-#ifdef HAVE_RTNETLINK
-#include <linux/rtnetlink.h>
-#endif
-
-#ifndef UPDATE_GRACE
-#define UPDATE_GRACE 2 /* wait UPDATE_GRACE seconds before scanning */
-#endif
+#ifdef HAS_ROUTING_SOCKET
+# ifndef UPDATE_GRACE
+# define UPDATE_GRACE 2 /* wait UPDATE_GRACE seconds before scanning */
+# endif
static void
process_routing_msgs(struct asyncio_reader *reader)
if (disable_dynamic_updates) {
/*
- * discard ourselves if we are not need any more
+ * discard ourselves if we are not needed any more
* usually happens when running unprivileged
*/
remove_asyncio_reader(reader);
cnt = read(reader->fd, buffer, sizeof(buffer));
if (cnt < 0) {
- msyslog(LOG_ERR, "i/o error on routing socket %m - disabling");
+ msyslog(LOG_ERR,
+ "i/o error on routing socket %m - disabling");
remove_asyncio_reader(reader);
delete_asyncio_reader(reader);
return;
* process routing message
*/
#ifdef HAVE_RTNETLINK
- for (nh = (struct nlmsghdr *)buffer; NLMSG_OK(nh, cnt); nh = NLMSG_NEXT(nh, cnt)) {
+ for (nh = (struct nlmsghdr *)buffer;
+ NLMSG_OK(nh, cnt);
+ nh = NLMSG_NEXT(nh, cnt)) {
msg_type = nh->nlmsg_type;
#else
- for (p = buffer; (p + sizeof(struct rt_msghdr)) <= (buffer + cnt); p += rtm->rtm_msglen) {
+ for (p = buffer;
+ (p + sizeof(struct rt_msghdr)) <= (buffer + cnt);
+ p += rtm->rtm_msglen) {
rtm = (struct rt_msghdr *)p;
if (rtm->rtm_version != RTM_VERSION) {
- msyslog(LOG_ERR, "version mismatch (got %d - expected %d) on routing socket - disabling", rtm->rtm_version, RTM_VERSION);
+ msyslog(LOG_ERR,
+ "version mismatch (got %d - expected %d) on routing socket - disabling",
+ rtm->rtm_version, RTM_VERSION);
remove_asyncio_reader(reader);
delete_asyncio_reader(reader);
case RTM_DELROUTE:
#endif
/*
- * we are keen on new and deleted addresses and if an interface goes up and down or routing changes
+ * we are keen on new and deleted addresses and
+ * if an interface goes up and down or routing
+ * changes
*/
- DPRINTF(3, ("routing message op = %d: scheduling interface update\n", msg_type));
+ DPRINTF(3, ("routing message op = %d: scheduling interface update\n",
+ msg_type));
timer_interfacetimeout(current_time + UPDATE_GRACE);
break;
#ifdef HAVE_RTNETLINK
/*
* the rest doesn't bother us.
*/
- DPRINTF(4, ("routing message op = %d: ignored\n", msg_type));
+ DPRINTF(4, ("routing message op = %d: ignored\n",
+ msg_type));
break;
}
}
#else
int fd = socket(PF_ROUTE, SOCK_RAW, 0);
#endif
-
- if (fd >= 0) {
- fd = move_fd(fd);
+ if (fd < 0) {
+ msyslog(LOG_ERR,
+ "unable to open routing socket (%m) - using polled interface update");
+ return;
+ }
+
+ fd = move_fd(fd);
#ifdef HAVE_RTNETLINK
- memset(&sa, 0, sizeof(sa));
- sa.nl_family = PF_NETLINK;
- sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |
- RTMGRP_IPV4_ROUTE | RTMGRP_IPV4_MROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_IPV6_MROUTE;
- if (bind(fd, (struct sockaddr*)&sa, sizeof(sa)) < 0) {
- msyslog(LOG_ERR, "bind failed on routing socket (%m) - using polled interface update");
- return;
- }
+ memset(&sa, 0, sizeof(sa));
+ sa.nl_family = PF_NETLINK;
+ sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR
+ | RTMGRP_IPV6_IFADDR | RTMGRP_IPV4_ROUTE
+ | RTMGRP_IPV4_MROUTE | RTMGRP_IPV6_ROUTE
+ | RTMGRP_IPV6_MROUTE;
+ if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
+ msyslog(LOG_ERR,
+ "bind failed on routing socket (%m) - using polled interface update");
+ return;
+ }
#endif
- init_nonblocking_io(fd);
+ init_nonblocking_io(fd);
#if defined(HAVE_SIGNALED_IO)
- init_socket_sig(fd);
+ init_socket_sig(fd);
#endif /* HAVE_SIGNALED_IO */
-
- reader = new_asyncio_reader();
+
+ reader = new_asyncio_reader();
- reader->fd = fd;
- reader->receiver = process_routing_msgs;
-
- add_asyncio_reader(reader, FD_TYPE_SOCKET);
- msyslog(LOG_INFO, "Listening on routing socket on fd #%d for interface updates", fd);
- } else {
- msyslog(LOG_ERR, "unable to open routing socket (%m) - using polled interface update");
- }
+ reader->fd = fd;
+ reader->receiver = process_routing_msgs;
+
+ add_asyncio_reader(reader, FD_TYPE_SOCKET);
+ msyslog(LOG_INFO,
+ "Listening on routing socket on fd #%d for interface updates",
+ fd);
}
#else
+/* HAS_ROUTING_SOCKET not defined */
static void
-init_async_notifications()
+init_async_notifications(void)
{
}
#endif
{
register struct pkt *pkt;
register struct mon_data *md;
- struct sockaddr_storage addr;
+ sockaddr_u addr;
register int hash;
register int mode;
int interval;
/*
* Match address only to conserve MRU size.
*/
- if (SOCKCMP(&md->rmtadr, &addr)) {
+ if (SOCK_EQ(&md->rmtadr, &addr)) {
interval = current_time - md->lasttime;
md->lasttime = current_time;
md->count++;
static struct peer init_peer_alloc[INIT_PEER_ALLOC]; /* init alloc */
static void getmorepeermem (void);
-static struct interface *select_peerinterface (struct peer *, struct sockaddr_storage *, struct interface *, u_char);
+static struct interface *select_peerinterface (struct peer *, sockaddr_u *, struct interface *, u_char);
static int score(struct peer *);
*/
struct peer *
findexistingpeer(
- struct sockaddr_storage *addr,
+ sockaddr_u *addr,
struct peer *start_peer,
int mode
)
else
peer = start_peer->next;
- while (NULL != peer) {
- if (SOCKCMP(addr, &peer->srcadr)
+ while (peer != NULL) {
+ if (SOCK_EQ(addr, &peer->srcadr)
&& NSRCPORT(addr) == NSRCPORT(&peer->srcadr)
&& (-1 == mode || peer->hmode == mode))
break;
*/
struct peer *
findpeer(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *dstadr,
int pkt_mode,
int *action
findpeer_calls++;
hash = NTP_HASH_ADDR(srcadr);
for (peer = peer_hash[hash]; peer != NULL; peer = peer->next) {
- if (SOCKCMP(srcadr, &peer->srcadr) &&
+ if (SOCK_EQ(srcadr, &peer->srcadr) &&
NSRCPORT(srcadr) == NSRCPORT(&peer->srcadr)) {
/*
*/
struct peer *
peer_config(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *dstadr,
int hmode,
int version,
*/
switch (hmode) {
case MODE_BROADCAST:
- if(srcadr->ss_family == AF_INET) {
- if (IN_CLASSD(ntohl(((struct sockaddr_in*)srcadr)->sin_addr.s_addr)))
- cast_flags = MDF_MCAST;
- else
- cast_flags = MDF_BCAST;
- break;
- } else {
- if (IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)srcadr)->sin6_addr))
- cast_flags = MDF_MCAST;
- else
- cast_flags = MDF_BCAST;
- break;
- }
+ if (IS_MCAST(srcadr))
+ cast_flags = MDF_MCAST;
+ else
+ cast_flags = MDF_BCAST;
+ break;
+
case MODE_CLIENT:
- if(srcadr->ss_family == AF_INET) {
- if (IN_CLASSD(ntohl(((struct sockaddr_in*)srcadr)->sin_addr.s_addr)))
- cast_flags = MDF_ACAST;
- else
- cast_flags = MDF_UCAST;
- break;
- } else {
- if (IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)srcadr)->sin6_addr))
- cast_flags = MDF_ACAST;
- else
- cast_flags = MDF_UCAST;
- break;
- }
+ if (IS_MCAST(srcadr))
+ cast_flags = MDF_ACAST;
+ else
+ cast_flags = MDF_UCAST;
+ break;
default:
cast_flags = MDF_UCAST;
peer->dstadr->peercnt--;
ISC_LIST_UNLINK_TYPE(peer->dstadr->peers, peer,
ilink, struct peer);
+ msyslog(LOG_INFO,
+ "%s interface %s -> %s",
+ stoa(&peer->srcadr),
+ stoa(&peer->dstadr->sin),
+ (interface != NULL)
+ ? stoa(&interface->sin)
+ : "(null)");
}
- msyslog(LOG_INFO,
- "set_peerdstadr(%s): change interface from %s to %s",
- stoa(&peer->srcadr), (peer->dstadr != NULL) ?
- stoa(&peer->dstadr->sin) : "<null>", (interface !=
- NULL) ? stoa(&interface->sin) : "<null>");
peer->dstadr = interface;
if (peer->dstadr != NULL) {
ISC_LIST_APPEND(peer->dstadr->peers, peer,
* attempt to re-rebind interface if necessary
*/
static void
-peer_refresh_interface(struct peer *peer)
+peer_refresh_interface(
+ struct peer *peer
+ )
{
struct interface *niface, *piface;
piface = peer->dstadr;
set_peerdstadr(peer, niface);
if (peer->dstadr) {
- /*
- * clear crypto if we change the local address
- */
- if (peer->dstadr != piface && !(peer->cast_flags &
+ /*
+ * clear crypto if we change the local address
+ */
+ if (peer->dstadr != piface && !(peer->cast_flags &
MDF_BCLNT))
peer_clear(peer, "XFAC");
* find an interface suitable for the src address
*/
static struct interface *
-select_peerinterface(struct peer *peer, struct sockaddr_storage *srcadr, struct interface *dstadr, u_char cast_flags)
+select_peerinterface(
+ struct peer * peer,
+ sockaddr_u * srcadr,
+ struct interface * dstadr,
+ u_char cast_flags
+ )
{
struct interface *interface;
*/
struct peer *
newpeer(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *dstadr,
int hmode,
int version,
int minpoll,
int maxpoll,
u_int flags,
- u_char cast_flags,
+ u_char cast_flags,
int ttl,
keyid_t key
)
}
#endif
+
/*
* Broadcast needs the socket enabled for broadcast
*/
- if (cast_flags & MDF_BCAST && peer->dstadr) {
+ if ((cast_flags & MDF_BCAST) && peer->dstadr)
enable_broadcast(peer->dstadr, srcadr);
- }
+
/*
* Multicast needs the socket interface enabled for multicast
*/
- if (cast_flags & MDF_MCAST && peer->dstadr) {
+ if ((cast_flags & MDF_MCAST) && peer->dstadr)
enable_multicast_if(peer->dstadr, srcadr);
- }
+
#ifdef OPENSSL
if (key > NTP_MAXKEY)
peer->flags |= FLAG_SKEY;
int flags = 0; /* flags with details about the authentication */
keyid_t skeyid = 0; /* key IDs */
u_int32 opcode = 0; /* extension field opcode */
- struct sockaddr_storage *dstadr_sin; /* active runway */
+ sockaddr_u *dstadr_sin; /* active runway */
struct peer *peer2; /* aux peer structure pointer */
l_fp p_org; /* origin timestamp */
l_fp p_rec; /* receive timestamp */
return; /* no wildcard */
}
pkeyid = 0;
- if (!SOCKNUL(&rbufp->dstadr->bcast))
+ if (!SOCK_UNSPEC(&rbufp->dstadr->bcast))
dstadr_sin =
&rbufp->dstadr->bcast;
} else if (peer == NULL) {
int xmode, /* receive mode */
keyid_t xkeyid, /* transmit key ID */
char *mask, /* kiss code */
- int flags /* Flags to indicate signing behaviour */
+ int flags /* Flags to indicate signing behaviour */
)
{
struct pkt xpkt; /* transmit packet structure */
int item,
u_long value,
double dvalue,
- struct sockaddr_storage* svalue
+ sockaddr_u *svalue
)
{
/*
* Figure out what he wants to change, then do it
*/
-#ifdef DEBUG
- if (debug > 1)
- printf("proto_config: code %d value %lu dvalue %lf\n",
- item, value, dvalue);
-#endif
+ DPRINTF(2, ("proto_config: code %d value %lu dvalue %lf\n",
+ item, value, dvalue));
+
switch (item) {
/*
* Miscellaneous commands
*/
case PROTO_MULTICAST_ADD: /* add group address */
- if (svalue)
- io_multicast_add(*svalue);
+ if (svalue != NULL)
+ io_multicast_add(svalue);
sys_bclient = 1;
break;
case PROTO_MULTICAST_DEL: /* delete group address */
- if (svalue)
- io_multicast_del(*svalue);
+ if (svalue != NULL)
+ io_multicast_del(svalue);
break;
default:
* Check for valid clock address. If already running, shut it
* down first.
*/
- if (peer->srcadr.ss_family != AF_INET) {
- msyslog(LOG_ERR,
- "refclock_newpeer: clock address %s invalid, address family not implemented for refclock",
- stoa(&peer->srcadr));
- return (0);
- }
if (!ISREFCLOCKADR(&peer->srcadr)) {
msyslog(LOG_ERR,
"refclock_newpeer: clock address %s invalid",
*/
void
refclock_control(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct refclockstat *in,
struct refclockstat *out
)
/*
* Check for valid address and running peer
*/
- if (srcadr->ss_family != AF_INET)
- return;
-
if (!ISREFCLOCKADR(srcadr))
return;
*/
void
refclock_buginfo(
- struct sockaddr_storage *srcadr, /* clock address */
+ sockaddr_u *srcadr, /* clock address */
struct refclockbug *bug /* output structure */
)
{
/*
* Check for valid address and peer structure
*/
- if (srcadr->ss_family != AF_INET)
- return;
-
if (!ISREFCLOCKADR(srcadr))
return;
short needs_auth; /* true when authentication needed */
short sizeofitem; /* size of request data item (older size)*/
short v6_sizeofitem; /* size of request data item (new size)*/
- void (*handler) (struct sockaddr_storage *, struct interface *,
+ void (*handler) (sockaddr_u *, struct interface *,
struct req_pkt *); /* routine to handle request */
};
{ NO_REQUEST, NOAUTH, 0, 0 }
};
-static void req_ack (struct sockaddr_storage *, struct interface *, struct req_pkt *, int);
-static char * prepare_pkt (struct sockaddr_storage *, struct interface *, struct req_pkt *, u_int);
+static void req_ack (sockaddr_u *, struct interface *, struct req_pkt *, int);
+static char * prepare_pkt (sockaddr_u *, struct interface *, struct req_pkt *, u_int);
static char * more_pkt (void);
static void flush_pkt (void);
-static void peer_list (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void peer_list_sum (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void peer_info (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void peer_stats (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void sys_info (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void sys_stats (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void mem_stats (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void io_stats (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void timer_stats (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void loop_info (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void do_conf (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void do_unconf (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void set_sys_flag (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void clr_sys_flag (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void setclr_flags (struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long);
-static void list_restrict (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void do_resaddflags (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void do_ressubflags (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void do_unrestrict (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void do_restrict (struct sockaddr_storage *, struct interface *, struct req_pkt *, int);
-static void mon_getlist_0 (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void mon_getlist_1 (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void reset_stats (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void reset_peer (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void do_key_reread (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void trust_key (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void untrust_key (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void do_trustkey (struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long);
-static void get_auth_info (struct sockaddr_storage *, struct interface *, struct req_pkt *);
+static void peer_list (sockaddr_u *, struct interface *, struct req_pkt *);
+static void peer_list_sum (sockaddr_u *, struct interface *, struct req_pkt *);
+static void peer_info (sockaddr_u *, struct interface *, struct req_pkt *);
+static void peer_stats (sockaddr_u *, struct interface *, struct req_pkt *);
+static void sys_info (sockaddr_u *, struct interface *, struct req_pkt *);
+static void sys_stats (sockaddr_u *, struct interface *, struct req_pkt *);
+static void mem_stats (sockaddr_u *, struct interface *, struct req_pkt *);
+static void io_stats (sockaddr_u *, struct interface *, struct req_pkt *);
+static void timer_stats (sockaddr_u *, struct interface *, struct req_pkt *);
+static void loop_info (sockaddr_u *, struct interface *, struct req_pkt *);
+static void do_conf (sockaddr_u *, struct interface *, struct req_pkt *);
+static void do_unconf (sockaddr_u *, struct interface *, struct req_pkt *);
+static void set_sys_flag (sockaddr_u *, struct interface *, struct req_pkt *);
+static void clr_sys_flag (sockaddr_u *, struct interface *, struct req_pkt *);
+static void setclr_flags (sockaddr_u *, struct interface *, struct req_pkt *, u_long);
+static void list_restrict (sockaddr_u *, struct interface *, struct req_pkt *);
+static void do_resaddflags (sockaddr_u *, struct interface *, struct req_pkt *);
+static void do_ressubflags (sockaddr_u *, struct interface *, struct req_pkt *);
+static void do_unrestrict (sockaddr_u *, struct interface *, struct req_pkt *);
+static void do_restrict (sockaddr_u *, struct interface *, struct req_pkt *, int);
+static void mon_getlist_0 (sockaddr_u *, struct interface *, struct req_pkt *);
+static void mon_getlist_1 (sockaddr_u *, struct interface *, struct req_pkt *);
+static void reset_stats (sockaddr_u *, struct interface *, struct req_pkt *);
+static void reset_peer (sockaddr_u *, struct interface *, struct req_pkt *);
+static void do_key_reread (sockaddr_u *, struct interface *, struct req_pkt *);
+static void trust_key (sockaddr_u *, struct interface *, struct req_pkt *);
+static void untrust_key (sockaddr_u *, struct interface *, struct req_pkt *);
+static void do_trustkey (sockaddr_u *, struct interface *, struct req_pkt *, u_long);
+static void get_auth_info (sockaddr_u *, struct interface *, struct req_pkt *);
static void reset_auth_stats (void);
-static void req_get_traps (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void req_set_trap (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void req_clr_trap (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void do_setclr_trap (struct sockaddr_storage *, struct interface *, struct req_pkt *, int);
-static void set_request_keyid (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void set_control_keyid (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void get_ctl_stats (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void get_if_stats (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void do_if_reload (struct sockaddr_storage *, struct interface *, struct req_pkt *);
+static void req_get_traps (sockaddr_u *, struct interface *, struct req_pkt *);
+static void req_set_trap (sockaddr_u *, struct interface *, struct req_pkt *);
+static void req_clr_trap (sockaddr_u *, struct interface *, struct req_pkt *);
+static void do_setclr_trap (sockaddr_u *, struct interface *, struct req_pkt *, int);
+static void set_request_keyid (sockaddr_u *, struct interface *, struct req_pkt *);
+static void set_control_keyid (sockaddr_u *, struct interface *, struct req_pkt *);
+static void get_ctl_stats (sockaddr_u *, struct interface *, struct req_pkt *);
+static void get_if_stats (sockaddr_u *, struct interface *, struct req_pkt *);
+static void do_if_reload (sockaddr_u *, struct interface *, struct req_pkt *);
#ifdef KERNEL_PLL
-static void get_kernel_info (struct sockaddr_storage *, struct interface *, struct req_pkt *);
+static void get_kernel_info (sockaddr_u *, struct interface *, struct req_pkt *);
#endif /* KERNEL_PLL */
#ifdef REFCLOCK
-static void get_clock_info (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void set_clock_fudge (struct sockaddr_storage *, struct interface *, struct req_pkt *);
+static void get_clock_info (sockaddr_u *, struct interface *, struct req_pkt *);
+static void set_clock_fudge (sockaddr_u *, struct interface *, struct req_pkt *);
#endif /* REFCLOCK */
#ifdef REFCLOCK
-static void get_clkbug_info (struct sockaddr_storage *, struct interface *, struct req_pkt *);
+static void get_clkbug_info (sockaddr_u *, struct interface *, struct req_pkt *);
#endif /* REFCLOCK */
/*
static int databytes;
static char exbuf[RESP_DATA_SIZE];
static int usingexbuf;
-static struct sockaddr_storage *toaddr;
+static sockaddr_u *toaddr;
static struct interface *frominter;
/*
*/
static void
req_ack(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt,
int errcode
*/
static char *
prepare_pkt(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *pkt,
u_int structsize
{
struct req_pkt *inpkt;
struct req_pkt_tail *tailinpkt;
- struct sockaddr_storage *srcadr;
+ sockaddr_u *srcadr;
struct interface *inter;
struct req_proc *proc;
int ec;
*/
static void
peer_list(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
for (i = 0; i < NTP_HASH_SIZE && ip != 0; i++) {
pp = peer_hash[i];
while (pp != 0 && ip != 0) {
- if (pp->srcadr.ss_family == AF_INET6) {
+ if (IS_IPV6(&pp->srcadr)) {
if (client_v6_capable) {
- ip->addr6 = GET_INADDR6(pp->srcadr);
+ ip->addr6 = SOCK_ADDR6(&pp->srcadr);
ip->v6_flag = 1;
skip = 0;
} else {
break;
}
} else {
- ip->addr = GET_INADDR(pp->srcadr);
+ ip->addr = NSRCADR(&pp->srcadr);
if (client_v6_capable)
ip->v6_flag = 0;
skip = 0;
*/
static void
peer_list_sum(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
* Be careful here not to return v6 peers when we
* want only v4.
*/
- if (pp->srcadr.ss_family == AF_INET6) {
+ if (IS_IPV6(&pp->srcadr)) {
if (client_v6_capable) {
- ips->srcadr6 = GET_INADDR6(pp->srcadr);
+ ips->srcadr6 = SOCK_ADDR6(&pp->srcadr);
ips->v6_flag = 1;
if (pp->dstadr)
- ips->dstadr6 = GET_INADDR6(pp->dstadr->sin);
+ ips->dstadr6 = SOCK_ADDR6(&pp->dstadr->sin);
else
memset(&ips->dstadr6, 0, sizeof(ips->dstadr6));
skip = 0;
break;
}
} else {
- ips->srcadr = GET_INADDR(pp->srcadr);
+ ips->srcadr = NSRCADR(&pp->srcadr);
if (client_v6_capable)
ips->v6_flag = 0;
-/* XXX PDM This code is buggy. Need to replace with a straightforward assignment */
- if (pp->dstadr)
- ips->dstadr = (pp->processed) ?
- pp->cast_flags == MDF_BCAST ?
- GET_INADDR(pp->dstadr->bcast):
- pp->cast_flags ?
- GET_INADDR(pp->dstadr->sin) ?
- GET_INADDR(pp->dstadr->sin):
- GET_INADDR(pp->dstadr->bcast):
- 1 : GET_INADDR(pp->dstadr->sin);
- else
- memset(&ips->dstadr, 0, sizeof(ips->dstadr));
+ if (pp->dstadr) {
+ if (!pp->processed)
+ ips->dstadr = NSRCADR(&pp->dstadr->sin);
+ else {
+ if (MDF_BCAST == pp->cast_flags)
+ ips->dstadr = NSRCADR(&pp->dstadr->bcast);
+ else if (pp->cast_flags) {
+ ips->dstadr = NSRCADR(&pp->dstadr->sin);
+ if (!ips->dstadr)
+ ips->dstadr = NSRCADR(&pp->dstadr->bcast);
+ }
+ }
+ } else
+ ips->dstadr = 0;
skip = 0;
}
*/
static void
peer_info (
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
register struct info_peer *ip;
register int items;
register int i, j;
- struct sockaddr_storage addr;
+ sockaddr_u addr;
extern struct peer *sys_peer;
l_fp ltmp;
- memset((char *)&addr, 0, sizeof addr);
items = INFO_NITEMS(inpkt->err_nitems);
ipl = (struct info_peer_list *) inpkt->data;
ip = (struct info_peer *)prepare_pkt(srcadr, inter, inpkt,
v6sizeof(struct info_peer));
while (items-- > 0 && ip != 0) {
- memset((char *)&addr, 0, sizeof(addr));
+ ZERO_SOCK(&addr);
NSRCPORT(&addr) = ipl->port;
- if (client_v6_capable && ipl->v6_flag != 0) {
- addr.ss_family = AF_INET6;
- GET_INADDR6(addr) = ipl->addr6;
+ if (client_v6_capable && ipl->v6_flag) {
+ AF(&addr) = AF_INET6;
+ SOCK_ADDR6(&addr) = ipl->addr6;
} else {
- addr.ss_family = AF_INET;
- GET_INADDR(addr) = ipl->addr;
+ AF(&addr) = AF_INET;
+ NSRCADR(&addr) = ipl->addr;
}
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- addr.ss_len = SOCKLEN(&addr);
+ addr.sas.ss_len = SOCKLEN(&addr);
#endif
ipl++;
if ((pp = findexistingpeer(&addr, (struct peer *)0, -1)) == 0)
- continue;
- if (pp->srcadr.ss_family == AF_INET6) {
+ continue;
+ if (IS_IPV6(srcadr)) {
if (pp->dstadr)
- ip->dstadr6 = pp->cast_flags == MDF_BCAST ?
- GET_INADDR6(pp->dstadr->bcast) :
- GET_INADDR6(pp->dstadr->sin);
+ ip->dstadr6 =
+ (MDF_BCAST == pp->cast_flags)
+ ? SOCK_ADDR6(&pp->dstadr->bcast)
+ : SOCK_ADDR6(&pp->dstadr->sin);
else
memset(&ip->dstadr6, 0, sizeof(ip->dstadr6));
- ip->srcadr6 = GET_INADDR6(pp->srcadr);
+ ip->srcadr6 = SOCK_ADDR6(&pp->srcadr);
ip->v6_flag = 1;
} else {
-/* XXX PDM This code is buggy. Need to replace with a straightforward assignment */
- if (pp->dstadr)
- ip->dstadr = (pp->processed) ?
- pp->cast_flags == MDF_BCAST ?
- GET_INADDR(pp->dstadr->bcast):
- pp->cast_flags ?
- GET_INADDR(pp->dstadr->sin) ?
- GET_INADDR(pp->dstadr->sin):
- GET_INADDR(pp->dstadr->bcast):
- 2 : GET_INADDR(pp->dstadr->sin);
- else
- memset(&ip->dstadr, 0, sizeof(ip->dstadr));
+ if (pp->dstadr) {
+ if (!pp->processed)
+ ip->dstadr = NSRCADR(&pp->dstadr->sin);
+ else {
+ if (MDF_BCAST == pp->cast_flags)
+ ip->dstadr = NSRCADR(&pp->dstadr->bcast);
+ else if (pp->cast_flags) {
+ ip->dstadr = NSRCADR(&pp->dstadr->sin);
+ if (!ip->dstadr)
+ ip->dstadr = NSRCADR(&pp->dstadr->bcast);
+ }
+ }
+ } else
+ ip->dstadr = 0;
- ip->srcadr = GET_INADDR(pp->srcadr);
+ ip->srcadr = NSRCADR(&pp->srcadr);
if (client_v6_capable)
ip->v6_flag = 0;
}
*/
static void
peer_stats (
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
register struct peer *pp;
register struct info_peer_stats *ip;
register int items;
- struct sockaddr_storage addr;
+ sockaddr_u addr;
extern struct peer *sys_peer;
#ifdef DEBUG
memset((char *)&addr, 0, sizeof(addr));
NSRCPORT(&addr) = ipl->port;
if (client_v6_capable && ipl->v6_flag) {
- addr.ss_family = AF_INET6;
- GET_INADDR6(addr) = ipl->addr6;
+ AF(&addr) = AF_INET6;
+ SOCK_ADDR6(&addr) = ipl->addr6;
} else {
- addr.ss_family = AF_INET;
- GET_INADDR(addr) = ipl->addr;
+ AF(&addr) = AF_INET;
+ NSRCADR(&addr) = ipl->addr;
}
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- addr.ss_len = SOCKLEN(&addr);
-#endif
-#ifdef DEBUG
- if (debug)
- printf("peer_stats: looking for %s, %d, %d\n", stoa(&addr),
- ipl->port, ((struct sockaddr_in6 *)&addr)->sin6_port);
+ addr.sas.ss_len = SOCKLEN(&addr);
#endif
+ DPRINTF(1, ("peer_stats: looking for %s, %d, %d\n",
+ stoa(&addr), ipl->port, NSRCPORT(&addr)));
+
ipl = (struct info_peer_list *)((char *)ipl +
INFO_ITEMSIZE(inpkt->mbz_itemsize));
- if ((pp = findexistingpeer(&addr, (struct peer *)0, -1)) == 0)
- continue;
-#ifdef DEBUG
- if (debug)
- printf("peer_stats: found %s\n", stoa(&addr));
-#endif
- if (pp->srcadr.ss_family == AF_INET) {
- if (pp->dstadr)
- ip->dstadr = (pp->processed) ?
- pp->cast_flags == MDF_BCAST ?
- GET_INADDR(pp->dstadr->bcast):
- pp->cast_flags ?
- GET_INADDR(pp->dstadr->sin) ?
- GET_INADDR(pp->dstadr->sin):
- GET_INADDR(pp->dstadr->bcast):
- 3 : 7;
- else
- memset(&ip->dstadr, 0, sizeof(ip->dstadr));
+ if ((pp = findexistingpeer(&addr, (struct peer *)0, -1)) == NULL)
+ continue;
+
+ DPRINTF(1, ("peer_stats: found %s\n", stoa(&addr)));
+
+ if (IS_IPV4(&pp->srcadr)) {
+ if (pp->dstadr) {
+ if (!pp->processed)
+ ip->dstadr = NSRCADR(&pp->dstadr->sin);
+ else {
+ if (MDF_BCAST == pp->cast_flags)
+ ip->dstadr = NSRCADR(&pp->dstadr->bcast);
+ else if (pp->cast_flags) {
+ ip->dstadr = NSRCADR(&pp->dstadr->sin);
+ if (!ip->dstadr)
+ ip->dstadr = NSRCADR(&pp->dstadr->bcast);
+ }
+ }
+ } else
+ ip->dstadr = 0;
- ip->srcadr = GET_INADDR(pp->srcadr);
+ ip->srcadr = NSRCADR(&pp->srcadr);
if (client_v6_capable)
ip->v6_flag = 0;
} else {
if (pp->dstadr)
- ip->dstadr6 = pp->cast_flags == MDF_BCAST ?
- GET_INADDR6(pp->dstadr->bcast):
- GET_INADDR6(pp->dstadr->sin);
+ ip->dstadr6 =
+ (MDF_BCAST == pp->cast_flags)
+ ? SOCK_ADDR6(&pp->dstadr->bcast)
+ : SOCK_ADDR6(&pp->dstadr->sin);
else
memset(&ip->dstadr6, 0, sizeof(ip->dstadr6));
-
- ip->srcadr6 = GET_INADDR6(pp->srcadr);
+
+ ip->srcadr6 = SOCK_ADDR6(&pp->srcadr);
ip->v6_flag = 1;
}
ip->srcport = NSRCPORT(&pp->srcadr);
*/
static void
sys_info(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
is = (struct info_sys *)prepare_pkt(srcadr, inter, inpkt,
v6sizeof(struct info_sys));
- if (sys_peer != 0) {
- if (sys_peer->srcadr.ss_family == AF_INET) {
- is->peer = GET_INADDR(sys_peer->srcadr);
+ if (sys_peer) {
+ if (IS_IPV4(&sys_peer->srcadr)) {
+ is->peer = NSRCADR(&sys_peer->srcadr);
if (client_v6_capable)
is->v6_flag = 0;
} else if (client_v6_capable) {
- is->peer6 = GET_INADDR6(sys_peer->srcadr);
+ is->peer6 = SOCK_ADDR6(&sys_peer->srcadr);
is->v6_flag = 1;
}
is->peer_mode = sys_peer->hmode;
*/
static void
sys_stats(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
mem_stats(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
io_stats(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
timer_stats(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
loop_info(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
do_conf(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
u_int fl;
struct conf_peer *cp;
struct conf_peer temp_cp;
- struct sockaddr_storage peeraddr;
- struct sockaddr_in tmp_clock;
+ sockaddr_u peeraddr;
/*
* Do a check of everything to see that it looks
while (items-- > 0) {
memset(&temp_cp, 0, sizeof(struct conf_peer));
memcpy(&temp_cp, (char *)cp, INFO_ITEMSIZE(inpkt->mbz_itemsize));
- memset((char *)&peeraddr, 0, sizeof(struct sockaddr_storage));
+ ZERO_SOCK(&peeraddr);
fl = 0;
if (temp_cp.flags & CONF_FLAG_PREFER)
fl |= FLAG_SKEY;
#endif /* OPENSSL */
if (client_v6_capable && temp_cp.v6_flag != 0) {
- peeraddr.ss_family = AF_INET6;
- GET_INADDR6(peeraddr) = temp_cp.peeraddr6;
+ AF(&peeraddr) = AF_INET6;
+ SOCK_ADDR6(&peeraddr) = temp_cp.peeraddr6;
} else {
- peeraddr.ss_family = AF_INET;
- GET_INADDR(peeraddr) = temp_cp.peeraddr;
+ AF(&peeraddr) = AF_INET;
+ NSRCADR(&peeraddr) = temp_cp.peeraddr;
/*
* Make sure the address is valid
*/
- tmp_clock = *CAST_V4(peeraddr);
- if (
-#ifdef REFCLOCK
- !ISREFCLOCKADR(&tmp_clock) &&
-#endif
- ISBADADR(&tmp_clock)) {
+ if (!ISREFCLOCKADR(&peeraddr) &&
+ ISBADADR(&peeraddr)) {
req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
return;
}
}
NSRCPORT(&peeraddr) = htons(NTP_PORT);
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- peeraddr.ss_len = SOCKLEN(&peeraddr);
+ peeraddr.sas.ss_len = SOCKLEN(&peeraddr);
#endif
/* XXX W2DO? minpoll/maxpoll arguments ??? */
*/
static void
dns_a(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
/*
* Make sure the address is valid
*/
- if (
-#ifdef REFCLOCK
- !ISREFCLOCKADR(&peeraddr) &&
-#endif
- ISBADADR(&peeraddr)) {
-#ifdef REFCLOCK
- msyslog(LOG_ERR, "dns_a: !ISREFCLOCK && ISBADADR");
-#else
- msyslog(LOG_ERR, "dns_a: ISBADADR");
-#endif
+ if (!ISREFCLOCKADR(&peeraddr) && ISBADADR(&peeraddr)) {
+ msyslog(LOG_ERR, "dns_a: !ISREFCLOCKADR && ISBADADR");
req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
return;
}
msyslog(LOG_INFO, "dns_a: <%s> for %s, AssocID %d, bogon %d",
dp->hostname,
- stoa((struct sockaddr_storage *)&peeraddr), associd,
+ stoa((sockaddr_u *)&peeraddr), associd,
bogon);
if (bogon) {
*/
static void
do_unconf(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
struct conf_unpeer temp_cp;
register int items;
register struct peer *peer;
- struct sockaddr_storage peeraddr;
+ sockaddr_u peeraddr;
int bad, found;
/*
bad = 0;
while (items-- > 0 && !bad) {
memset(&temp_cp, 0, sizeof(temp_cp));
- memset(&peeraddr, 0, sizeof(peeraddr));
+ ZERO_SOCK(&peeraddr);
memcpy(&temp_cp, cp, INFO_ITEMSIZE(inpkt->mbz_itemsize));
- if (client_v6_capable && temp_cp.v6_flag != 0) {
- peeraddr.ss_family = AF_INET6;
- GET_INADDR6(peeraddr) = temp_cp.peeraddr6;
+ if (client_v6_capable && temp_cp.v6_flag) {
+ AF(&peeraddr) = AF_INET6;
+ SOCK_ADDR6(&peeraddr) = temp_cp.peeraddr6;
} else {
- peeraddr.ss_family = AF_INET;
- GET_INADDR(peeraddr) = temp_cp.peeraddr;
+ AF(&peeraddr) = AF_INET;
+ NSRCADR(&peeraddr) = temp_cp.peeraddr;
}
- NSRCPORT(&peeraddr) = htons(NTP_PORT);
+ SET_PORT(&peeraddr, NTP_PORT);
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- peeraddr.ss_len = SOCKLEN(&peeraddr);
+ peeraddr.sas.ss_len = SOCKLEN(&peeraddr);
#endif
found = 0;
peer = NULL;
memset(&temp_cp, 0, sizeof(temp_cp));
memset(&peeraddr, 0, sizeof(peeraddr));
memcpy(&temp_cp, cp, INFO_ITEMSIZE(inpkt->mbz_itemsize));
- if (client_v6_capable && temp_cp.v6_flag != 0) {
- peeraddr.ss_family = AF_INET6;
- GET_INADDR6(peeraddr) = temp_cp.peeraddr6;
+ if (client_v6_capable && temp_cp.v6_flag) {
+ AF(&peeraddr) = AF_INET6;
+ SOCK_ADDR6(&peeraddr) = temp_cp.peeraddr6;
} else {
- peeraddr.ss_family = AF_INET;
- GET_INADDR(peeraddr) = temp_cp.peeraddr;
+ AF(&peeraddr) = AF_INET;
+ NSRCADR(&peeraddr) = temp_cp.peeraddr;
}
- NSRCPORT(&peeraddr) = htons(NTP_PORT);
+ SET_PORT(&peeraddr, NTP_PORT);
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- peeraddr.ss_len = SOCKLEN(&peeraddr);
+ peeraddr.sas.ss_len = SOCKLEN(&peeraddr);
#endif
found = 0;
peer = NULL;
*/
static void
set_sys_flag(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
clr_sys_flag(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
setclr_flags(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt,
u_long set
*/
static void
list_restrict(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
do_resaddflags(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
do_ressubflags(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
do_unrestrict(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
}
-
-
-
/*
* do_restrict - do the dirty stuff of dealing with restrictions
*/
static void
do_restrict(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt,
int op
{
register struct conf_restrict *cr;
register int items;
- struct sockaddr_storage matchaddr;
- struct sockaddr_storage matchmask;
+ sockaddr_u matchaddr;
+ sockaddr_u matchmask;
int bad;
/*
*/
items = INFO_NITEMS(inpkt->err_nitems);
cr = (struct conf_restrict *)inpkt->data;
- memset((char *)&matchaddr, 0, sizeof(struct sockaddr_storage));
- memset((char *)&matchmask, 0, sizeof(struct sockaddr_storage));
+ ZERO_SOCK(&matchaddr);
+ ZERO_SOCK(&matchmask);
while (items-- > 0) {
- if (client_v6_capable && cr->v6_flag != 0) {
- GET_INADDR6(matchaddr) = cr->addr6;
- GET_INADDR6(matchmask) = cr->mask6;
- matchaddr.ss_family = AF_INET6;
- matchmask.ss_family = AF_INET6;
+ if (client_v6_capable && cr->v6_flag) {
+ AF(&matchaddr) = AF_INET6;
+ AF(&matchmask) = AF_INET6;
+ SOCK_ADDR6(&matchaddr) = cr->addr6;
+ SOCK_ADDR6(&matchmask) = cr->mask6;
} else {
- GET_INADDR(matchaddr) = cr->addr;
- GET_INADDR(matchmask) = cr->mask;
- matchaddr.ss_family = AF_INET;
- matchmask.ss_family = AF_INET;
+ AF(&matchaddr) = AF_INET;
+ AF(&matchmask) = AF_INET;
+ NSRCADR(&matchaddr) = cr->addr;
+ NSRCADR(&matchmask) = cr->mask;
}
hack_restrict(op, &matchaddr, &matchmask, cr->mflags,
cr->flags);
*/
static void
mon_getlist_0(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
im->lasttime = htonl((u_int32)((current_time -
md->firsttime) / md->count));
im->firsttime = htonl((u_int32)(current_time - md->lasttime));
- im->lastdrop = htonl((u_int32)md->flags);
+ im->restr = htonl((u_int32)md->flags);
im->count = htonl((u_int32)(md->count));
- if (md->rmtadr.ss_family == AF_INET6) {
+ if (IS_IPV6(&md->rmtadr)) {
if (!client_v6_capable)
continue;
- im->addr6 = GET_INADDR6(md->rmtadr);
+ im->addr6 = SOCK_ADDR6(&md->rmtadr);
im->v6_flag = 1;
} else {
- im->addr = GET_INADDR(md->rmtadr);
+ im->addr = NSRCADR(&md->rmtadr);
if (client_v6_capable)
im->v6_flag = 0;
}
*/
static void
mon_getlist_1(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
im->lasttime = htonl((u_int32)((current_time -
md->firsttime) / md->count));
im->firsttime = htonl((u_int32)(current_time - md->lasttime));
- im->lastdrop = htonl((u_int32)md->flags);
+ im->restr = htonl((u_int32)md->flags);
im->count = htonl((u_int32)md->count);
- if (md->rmtadr.ss_family == AF_INET6) {
+ if (IS_IPV6(&md->rmtadr)) {
if (!client_v6_capable)
continue;
- im->addr6 = GET_INADDR6(md->rmtadr);
+ im->addr6 = SOCK_ADDR6(&md->rmtadr);
im->v6_flag = 1;
- im->daddr6 = GET_INADDR6(md->interface->sin);
+ im->daddr6 = SOCK_ADDR6(&md->interface->sin);
} else {
- im->addr = GET_INADDR(md->rmtadr);
+ im->addr = NSRCADR(&md->rmtadr);
if (client_v6_capable)
im->v6_flag = 0;
- im->daddr = (md->cast_flags == MDF_BCAST)
- ? GET_INADDR(md->interface->bcast)
- : (md->cast_flags
- ? (GET_INADDR(md->interface->sin)
- ? GET_INADDR(md->interface->sin)
- : GET_INADDR(md->interface->bcast))
- : 4);
+ if (MDF_BCAST == md->cast_flags)
+ im->daddr = NSRCADR(&md->interface->bcast);
+ else if (md->cast_flags) {
+ im->daddr = NSRCADR(&md->interface->sin);
+ if (!im->daddr)
+ im->daddr = NSRCADR(&md->interface->bcast);
+ } else
+ im->daddr = 4;
}
im->flags = htonl(md->cast_flags);
im->port = md->rmtport;
*/
static void
reset_stats(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
reset_peer(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
{
- register struct conf_unpeer *cp;
- register int items;
- register struct peer *peer;
- struct sockaddr_storage peeraddr;
+ struct conf_unpeer *cp;
+ int items;
+ struct peer *peer;
+ sockaddr_u peeraddr;
int bad;
/*
bad = 0;
while (items-- > 0 && !bad) {
- memset((char *)&peeraddr, 0, sizeof(peeraddr));
- if (client_v6_capable && cp->v6_flag != 0) {
- GET_INADDR6(peeraddr) = cp->peeraddr6;
- peeraddr.ss_family = AF_INET6;
+ ZERO_SOCK(&peeraddr);
+ if (client_v6_capable && cp->v6_flag) {
+ AF(&peeraddr) = AF_INET6;
+ SOCK_ADDR6(&peeraddr) = cp->peeraddr6;
} else {
- GET_INADDR(peeraddr) = cp->peeraddr;
- peeraddr.ss_family = AF_INET;
+ AF(&peeraddr) = AF_INET;
+ NSRCADR(&peeraddr) = cp->peeraddr;
}
- NSRCPORT(&peeraddr) = htons(NTP_PORT);
+
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- peeraddr.ss_len = SOCKLEN(&peeraddr);
+ peeraddr.sas.ss_len = SOCKLEN(&peeraddr);
#endif
- peer = findexistingpeer(&peeraddr, (struct peer *)0, -1);
- if (peer == (struct peer *)0)
- bad++;
+ peer = findexistingpeer(&peeraddr, NULL, -1);
+ if (NULL == peer)
+ bad++;
cp = (struct conf_unpeer *)((char *)cp +
INFO_ITEMSIZE(inpkt->mbz_itemsize));
}
items = INFO_NITEMS(inpkt->err_nitems);
cp = (struct conf_unpeer *)inpkt->data;
while (items-- > 0) {
- memset((char *)&peeraddr, 0, sizeof(peeraddr));
- if (client_v6_capable && cp->v6_flag != 0) {
- GET_INADDR6(peeraddr) = cp->peeraddr6;
- peeraddr.ss_family = AF_INET6;
+ ZERO_SOCK(&peeraddr);
+ if (client_v6_capable && cp->v6_flag) {
+ AF(&peeraddr) = AF_INET6;
+ SOCK_ADDR6(&peeraddr) = cp->peeraddr6;
} else {
- GET_INADDR(peeraddr) = cp->peeraddr;
- peeraddr.ss_family = AF_INET;
+ AF(&peeraddr) = AF_INET;
+ NSRCADR(&peeraddr) = cp->peeraddr;
}
+ SET_PORT(&peeraddr, 123);
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- peeraddr.ss_len = SOCKLEN(&peeraddr);
+ peeraddr.sas.ss_len = SOCKLEN(&peeraddr);
#endif
- peer = findexistingpeer(&peeraddr, (struct peer *)0, -1);
- while (peer != 0) {
+ peer = findexistingpeer(&peeraddr, NULL, -1);
+ while (peer != NULL) {
peer_reset(peer);
- peer = findexistingpeer(&peeraddr, (struct peer *)peer, -1);
+ peer = findexistingpeer(&peeraddr, peer, -1);
}
cp = (struct conf_unpeer *)((char *)cp +
INFO_ITEMSIZE(inpkt->mbz_itemsize));
*/
static void
do_key_reread(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
trust_key(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
untrust_key(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
do_trustkey(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt,
u_long trust
*/
static void
get_auth_info(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
req_get_traps(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
for (i = 0, tr = ctl_trap; i < CTL_MAXTRAPS; i++, tr++) {
if (tr->tr_flags & TRAP_INUSE) {
- if (tr->tr_addr.ss_family == AF_INET) {
+ if (IS_IPV4(&tr->tr_addr)) {
if (tr->tr_localaddr == any_interface)
it->local_address = 0;
else
it->local_address
- = GET_INADDR(tr->tr_localaddr->sin);
- it->trap_address = GET_INADDR(tr->tr_addr);
+ = NSRCADR(&tr->tr_localaddr->sin);
+ it->trap_address = NSRCADR(&tr->tr_addr);
if (client_v6_capable)
it->v6_flag = 0;
} else {
if (!client_v6_capable)
continue;
it->local_address6
- = GET_INADDR6(tr->tr_localaddr->sin);
- it->trap_address6 = GET_INADDR6(tr->tr_addr);
+ = SOCK_ADDR6(&tr->tr_localaddr->sin);
+ it->trap_address6 = SOCK_ADDR6(&tr->tr_addr);
it->v6_flag = 1;
}
it->trap_port = NSRCPORT(&tr->tr_addr);
*/
static void
req_set_trap(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
req_clr_trap(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
do_setclr_trap(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt,
int set
register struct conf_trap *ct;
register struct interface *linter;
int res;
- struct sockaddr_storage laddr;
+ sockaddr_u laddr;
/*
- * Prepare sockaddr_storage structure
+ * Prepare sockaddr
*/
- memset((char *)&laddr, 0, sizeof laddr);
- laddr.ss_family = srcadr->ss_family;
- NSRCPORT(&laddr) = ntohs(NTP_PORT);
+ ZERO_SOCK(&laddr);
+ AF(&laddr) = AF(srcadr);
+ SET_PORT(&laddr, NTP_PORT);
/*
* Restrict ourselves to one item only. This eliminates
if (ct->local_address == 0) {
linter = any_interface;
} else {
- if (laddr.ss_family == AF_INET)
- GET_INADDR(laddr) = ct->local_address;
+ if (IS_IPV4(&laddr))
+ NSRCADR(&laddr) = ct->local_address;
else
- GET_INADDR6(laddr) = ct->local_address6;
+ SOCK_ADDR6(&laddr) = ct->local_address6;
linter = findinterface(&laddr);
- if (linter == NULL) {
+ if (NULL == linter) {
req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
return;
}
}
- if (laddr.ss_family == AF_INET)
- GET_INADDR(laddr) = ct->trap_address;
+ if (IS_IPV4(&laddr))
+ NSRCADR(&laddr) = ct->trap_address;
else
- GET_INADDR6(laddr) = ct->trap_address6;
- if (ct->trap_port != 0)
- NSRCPORT(&laddr) = ct->trap_port;
+ SOCK_ADDR6(&laddr) = ct->trap_address6;
+ if (ct->trap_port)
+ NSRCPORT(&laddr) = ct->trap_port;
else
- NSRCPORT(&laddr) = htons(TRAPPORT);
+ SET_PORT(&laddr, TRAPPORT);
if (set) {
res = ctlsettrap(&laddr, linter, 0,
*/
static void
set_request_keyid(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
set_control_keyid(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
get_ctl_stats(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
get_kernel_info(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
static void
get_clock_info(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
register u_int32 *clkaddr;
register int items;
struct refclockstat clock_stat;
- struct sockaddr_storage addr;
- struct sockaddr_in tmp_clock;
+ sockaddr_u addr;
l_fp ltmp;
- memset((char *)&addr, 0, sizeof addr);
- addr.ss_family = AF_INET;
+ ZERO_SOCK(&addr);
+ AF(&addr) = AF_INET;
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- addr.ss_len = SOCKLEN(&addr);
+ addr.sas.ss_len = SOCKLEN(&addr);
#endif
- NSRCPORT(&addr) = htons(NTP_PORT);
+ SET_PORT(&addr, NTP_PORT);
items = INFO_NITEMS(inpkt->err_nitems);
clkaddr = (u_int32 *) inpkt->data;
sizeof(struct info_clock));
while (items-- > 0) {
- tmp_clock.sin_addr.s_addr = *clkaddr++;
- CAST_V4(addr)->sin_addr = tmp_clock.sin_addr;
- if (!ISREFCLOCKADR(&tmp_clock) ||
- findexistingpeer(&addr, (struct peer *)0, -1) == 0) {
+ NSRCADR(&addr) = *clkaddr++;
+ if (!ISREFCLOCKADR(&addr) ||
+ findexistingpeer(&addr, NULL, -1) == NULL) {
req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
return;
}
clock_stat.kv_list = (struct ctl_var *)0;
- refclock_control(&addr, (struct refclockstat *)0, &clock_stat);
+ refclock_control(&addr, NULL, &clock_stat);
- ic->clockadr = tmp_clock.sin_addr.s_addr;
+ ic->clockadr = NSRCADR(&addr);
ic->type = clock_stat.type;
ic->flags = clock_stat.flags;
ic->lastevent = clock_stat.lastevent;
*/
static void
set_clock_fudge(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
register struct conf_fudge *cf;
register int items;
struct refclockstat clock_stat;
- struct sockaddr_storage addr;
- struct sockaddr_in tmp_clock;
+ sockaddr_u addr;
l_fp ltmp;
- memset((char *)&addr, 0, sizeof addr);
+ ZERO_SOCK(&addr);
memset((char *)&clock_stat, 0, sizeof clock_stat);
- memset((char *)&tmp_clock, 0, sizeof tmp_clock);
items = INFO_NITEMS(inpkt->err_nitems);
cf = (struct conf_fudge *) inpkt->data;
while (items-- > 0) {
- tmp_clock.sin_addr.s_addr = cf->clockadr;
- *CAST_V4(addr) = tmp_clock;
- addr.ss_family = AF_INET;
+ AF(&addr) = AF_INET;
+ NSRCADR(&addr) = cf->clockadr;
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- addr.ss_len = SOCKLEN(&addr);
+ addr.sas.ss_len = SOCKLEN(&addr);
#endif
- NSRCPORT(&addr) = htons(NTP_PORT);
- if (!ISREFCLOCKADR(&tmp_clock) ||
- findexistingpeer(&addr, (struct peer *)0, -1) == 0) {
+ SET_PORT(&addr, NTP_PORT);
+ if (!ISREFCLOCKADR(&addr) ||
+ findexistingpeer(&addr, NULL, -1) == 0) {
req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
return;
}
*/
static void
get_clkbug_info(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
register u_int32 *clkaddr;
register int items;
struct refclockbug bug;
- struct sockaddr_storage addr;
- struct sockaddr_in tmp_clock;
+ sockaddr_u addr;
- memset((char *)&addr, 0, sizeof addr);
- addr.ss_family = AF_INET;
+ ZERO_SOCK(&addr);
+ AF(&addr) = AF_INET;
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- addr.ss_len = SOCKLEN(&addr);
+ addr.sas.ss_len = SOCKLEN(&addr);
#endif
- NSRCPORT(&addr) = htons(NTP_PORT);
+ SET_PORT(&addr, NTP_PORT);
items = INFO_NITEMS(inpkt->err_nitems);
clkaddr = (u_int32 *) inpkt->data;
sizeof(struct info_clkbug));
while (items-- > 0) {
- tmp_clock.sin_addr.s_addr = *clkaddr++;
- GET_INADDR(addr) = tmp_clock.sin_addr.s_addr;
- if (!ISREFCLOCKADR(&tmp_clock) ||
- findexistingpeer(&addr, (struct peer *)0, -1) == 0) {
+ NSRCADR(&addr) = *clkaddr++;
+ if (!ISREFCLOCKADR(&addr) ||
+ findexistingpeer(&addr, NULL, -1) == 0) {
req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
return;
}
return;
}
- ic->clockadr = tmp_clock.sin_addr.s_addr;
+ ic->clockadr = NSRCADR(&addr);
i = bug.nvalues;
if (i > NUMCBUGVALUES)
i = NUMCBUGVALUES;
struct info_if_stats *ifs = *ifsp;
struct interface *interface = interface_info->interface;
- memset((char*)ifs, 0, sizeof(*ifs));
+ memset(ifs, 0, sizeof(*ifs));
- if (interface->sin.ss_family == AF_INET6) {
+ if (IS_IPV6(&interface->sin)) {
if (!client_v6_capable) {
return;
}
ifs->v6_flag = 1;
- memcpy((char *)&ifs->unaddr.addr6, (char *)&CAST_V6(interface->sin)->sin6_addr, sizeof(struct in6_addr));
- memcpy((char *)&ifs->unbcast.addr6, (char *)&CAST_V6(interface->bcast)->sin6_addr, sizeof(struct in6_addr));
- memcpy((char *)&ifs->unmask.addr6, (char *)&CAST_V6(interface->mask)->sin6_addr, sizeof(struct in6_addr));
+ ifs->unaddr.addr6 = SOCK_ADDR6(&interface->sin);
+ ifs->unbcast.addr6 = SOCK_ADDR6(&interface->bcast);
+ ifs->unmask.addr6 = SOCK_ADDR6(&interface->mask);
} else {
ifs->v6_flag = 0;
- memcpy((char *)&ifs->unaddr.addr, (char *)&CAST_V4(interface->sin)->sin_addr, sizeof(struct in_addr));
- memcpy((char *)&ifs->unbcast.addr, (char *)&CAST_V4(interface->bcast)->sin_addr, sizeof(struct in_addr));
- memcpy((char *)&ifs->unmask.addr, (char *)&CAST_V4(interface->mask)->sin_addr, sizeof(struct in_addr));
+ ifs->unaddr.addr = SOCK_ADDR4(&interface->sin);
+ ifs->unbcast.addr = SOCK_ADDR4(&interface->bcast);
+ ifs->unmask.addr = SOCK_ADDR4(&interface->mask);
}
ifs->v6_flag = htonl(ifs->v6_flag);
- strcpy(ifs->name, interface->name);
+ strncpy(ifs->name, interface->name, sizeof(ifs->name));
ifs->family = htons(interface->family);
ifs->flags = htonl(interface->flags);
ifs->last_ttl = htonl(interface->last_ttl);
*/
static void
get_if_stats(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
static void
do_if_reload(
- struct sockaddr_storage *srcadr,
+ sockaddr_u *srcadr,
struct interface *inter,
struct req_pkt *inpkt
)
*/
int
restrictions(
- struct sockaddr_storage *srcadr
+ sockaddr_u *srcadr
)
{
struct restrictlist *rl;
res_calls++;
/* IPv4 source address */
- if (srcadr->ss_family == AF_INET) {
+ if (IS_IPV4(srcadr)) {
/*
* We need the host address in host order. Also need to
* know whether this is from the ntp port or not.
*/
hostaddr = SRCADR(srcadr);
- isntpport = (SRCPORT(srcadr) == NTP_PORT);
+ isntpport = (NTP_PORT == SRCPORT(srcadr));
/*
* Ignore any packets with a multicast source address
}
/* IPv6 source address */
- if (srcadr->ss_family == AF_INET6) {
+ if (IS_IPV6(srcadr)) {
/*
- * We need the host address in host order. Also need to
- * know whether this is from the ntp port or not.
+ * We need the host address in network order. Also need
+ * to know whether this is from the ntp port or not.
*/
- hostaddr6 = GET_INADDR6(*srcadr);
- isntpport = (ntohs((
- (struct sockaddr_in6 *)srcadr)->sin6_port) ==
- NTP_PORT);
+ hostaddr6 = SOCK_ADDR6(srcadr);
+ isntpport = (NTP_PORT == SRCPORT(srcadr));
/*
* Ignore any packets with a multicast source address
void
hack_restrict(
int op,
- struct sockaddr_storage *resaddr,
- struct sockaddr_storage *resmask,
+ sockaddr_u *resaddr,
+ sockaddr_u *resmask,
int mflags,
int flags
)
memset(&addr6, 0, sizeof(struct in6_addr));
memset(&mask6, 0, sizeof(struct in6_addr));
- if (resaddr->ss_family == AF_INET) {
-#ifdef DEBUG
- if (debug)
- printf("restrict: addr %08x mask %08x mflags %08x flags %08x\n",
- SRCADR(resaddr), SRCADR(resmask), mflags, flags);
-#endif
+ if (IS_IPV4(resaddr)) {
+
+ DPRINTF(1, ("restrict: addr %08x mask %08x mflags %08x flags %08x\n",
+ SRCADR(resaddr), SRCADR(resmask), mflags, flags));
/*
* Get address and mask in host byte order
}
}
- if (resaddr->ss_family == AF_INET6) {
- mask6 = GET_INADDR6(*resmask);
+ if (IS_IPV6(resaddr)) {
+ mask6 = SOCK_ADDR6(resmask);
SET_IPV6_ADDR_MASK(&addr6,
- &GET_INADDR6(*resaddr), &mask6);
+ PSOCK_ADDR6(resaddr), &mask6);
if (IN6_IS_ADDR_UNSPECIFIED(&addr6)) {
rlprev6 = NULL;
rl6 = restrictlist6;
/*
* Switch based on operation
*/
- if (resaddr->ss_family == AF_INET) {
+ if (IS_IPV4(resaddr)) {
switch (op) {
case RESTRICT_FLAGS:
default:
break;
}
- } else if (resaddr->ss_family == AF_INET6) {
+ } else if (IS_IPV6(resaddr)) {
switch (op) {
case RESTRICT_FLAGS:
next_peer = peer->next;
if (peer->action && peer->nextaction <=
current_time)
- peer->action(peer);
+ peer->action(peer);
/*
* Restrain the non-burst packet rate not more
crypto_update();
#endif /* OPENSSL */
}
- sys_stratum = sys_orphan;
+ sys_stratum = (u_char)sys_orphan;
if (sys_stratum > 1)
sys_refid = htonl(LOOPBACKADR);
else
*/
void
record_peer_stats(
- struct sockaddr_storage *addr,
+ sockaddr_u *addr,
int status,
double offset, /* offset */
double delay, /* delay */
*/
void
record_clock_stats(
- struct sockaddr_storage *addr,
+ sockaddr_u *addr,
const char *text /* timecode string */
)
{
*/
void
record_raw_stats(
- struct sockaddr_storage *srcadr,
- struct sockaddr_storage *dstadr,
+ sockaddr_u *srcadr,
+ sockaddr_u *dstadr,
l_fp *t1, /* originate timestamp */
l_fp *t2, /* receive timestamp */
l_fp *t3, /* transmit timestamp */
*/
void
record_crypto_stats(
- struct sockaddr_storage *addr,
+ sockaddr_u *addr,
const char *text /* text message */
)
{
/*
- * sock_hash - hash an sockaddr_storage structure
+ * sock_hash - hash a sockaddr_u structure
*/
int
sock_hash(
- struct sockaddr_storage *addr
+ sockaddr_u *addr
)
{
int hashVal;
* fields in sockaddr_in6 that might be filled in by recvfrom(),
* so just use the family, port and address.
*/
- ch = (char *)&addr->ss_family;
+ ch = (char *)&AF(addr);
hashVal = 37 * hashVal + (int)*ch;
- if (sizeof(addr->ss_family) > 1) {
+ if (sizeof(AF(addr)) > 1) {
ch++;
hashVal = 37 * hashVal + (int)*ch;
}
- switch(addr->ss_family) {
+ switch(AF(addr)) {
case AF_INET:
- ch = (char *)&((struct sockaddr_in *)addr)->sin_addr;
- len = sizeof(struct in_addr);
+ ch = (char *)&SOCK_ADDR4(addr);
+ len = sizeof(SOCK_ADDR4(addr));
break;
case AF_INET6:
- ch = (char *)&((struct sockaddr_in6 *)addr)->sin6_addr;
- len = sizeof(struct in6_addr);
+ ch = (char *)&SOCK_ADDR6(addr);
+ len = sizeof(SOCK_ADDR6(addr));
break;
}
# endif /* DEBUG */
setlogmask(LOG_UPTO(LOG_DEBUG)); /* @@@ was INFO */
# endif /* LOG_DAEMON */
-#endif /* !SYS_WINNT && !VMS */
+#endif /* !VMS */
if (log_version)
NLOG(NLOG_SYSINFO) /* 'if' clause for syslog */
/*
- * See if we should redirect the logfile
+ * Redirect logging to a file if requested with -l.
+ * The ntp.conf logfile directive does not use this code, see
+ * config_vars() in ntp_config.c.
*/
-
void
setup_logfile(
void
argv += optct;
}
- init_logging(progname, 1); /* Open the log file */
+ init_lib(); /* set ipv6_works flag early */
+ init_logging(progname, 1); /* Open the log file */
#ifdef HAVE_UMASK
{
#ifdef DEBUG
debug = DESC(DEBUG_LEVEL).optOccCt;
- if (debug)
- printf("%s\n", Version);
+ DPRINTF(1, ("%s\n", Version));
#endif
+ /* honor -l option to log to a file instead of syslog */
+ setup_logfile();
+
/*
* Enable the Multi-Media Timer for Windows?
*/
#ifdef SYS_WINNT
/*
- * Initialize the time structures and variables
+ * Start interpolation thread, must occur before first
+ * get_systime()
*/
init_winnt_time();
#endif
-
- setup_logfile();
-
/*
* Initialize random generator and public key pair
*/
#if !defined(F_CLOSEM)
u_long s;
int max_fd;
-#endif /* not F_CLOSEM */
-
+#endif /* !FCLOSEM */
+ if (syslog_file != NULL) {
+ fclose(syslog_file);
+ syslog_file = NULL;
+ }
#if defined(F_CLOSEM)
/*
* From 'Writing Reliable AIX Daemons,' SG24-4946-00,
(void) dup2(0, 2);
init_logging(progname, 0);
+ /* we lost our logfile (if any) daemonizing */
setup_logfile();
#ifdef SYS_DOMAINOS
# endif /* NODETACH */
#endif /* VMS */
- setup_logfile(); /* We lost any redirect when we daemonized */
-
#ifdef SCO5_CLOCK
/*
* SCO OpenServer's system clock offers much more precise timekeeping
init_restrict();
init_mon();
init_timer();
- init_lib();
init_request();
init_control();
init_peer();
*
* The source code for the ntp discrete event simulator.
*
- * Written By: Sachin Kamboj
- * University of Delaware
- * Newark, DE 19711
+ * Written By: Sachin Kamboj
+ * University of Delaware
+ * Newark, DE 19711
* Copyright (c) 2006
* (Some code shamelessly based on the original NTP discrete event simulator)
*/
/* Global Variable Definitions */
-sim_info simulation; /* Simulation Control Variables */
-local_clock_info simclock; /* Local Clock Variables */
-queue *event_queue; /* Event Queue */
-queue *recv_queue; /* Receive Queue */
-static double sys_residual = 0; /* adjustment residue (s) */
+sim_info simulation; /* Simulation Control Variables */
+local_clock_info simclock; /* Local Clock Variables */
+queue *event_queue; /* Event Queue */
+queue *recv_queue; /* Receive Queue */
+static double sys_residual = 0; /* adjustment residue (s) */
void (*event_ptr[]) (Event *) = {
sim_event_beep, sim_update_clocks, sim_event_timer, sim_event_recv_packet
-}; /* Function pointer to the events */
+}; /* Function pointer to the events */
/* Define a function to compare two events to determine which one occurs first
{
int i;
for (i = 0;i < simulation.num_of_servers;++i) {
- printf("%s\n", stoa(simulation.servers[i].addr));
- if (peer_config(simulation.servers[i].addr,
- ANY_INTERFACE_CHOOSE(simulation.servers[i].addr),
- MODE_CLIENT,
- NTP_VERSION,
- NTP_MINDPOLL,
- NTP_MAXDPOLL,
- 0, /* peerflags */
- 0, /* ttl */
- 0, /* peerkey */
- (u_char *)"*" /* peerkeystr */) == 0) {
- fprintf(stderr, "ERROR!! Could not create association for: %s",
- stoa(simulation.servers[i].addr));
- }
+ printf("%s\n", stoa(simulation.servers[i].addr));
+ if (peer_config(simulation.servers[i].addr,
+ ANY_INTERFACE_CHOOSE(simulation.servers[i].addr),
+ MODE_CLIENT,
+ NTP_VERSION,
+ NTP_MINDPOLL,
+ NTP_MAXDPOLL,
+ 0, /* peerflags */
+ 0, /* ttl */
+ 0, /* peerkey */
+ (u_char *)"*" /* peerkeystr */) == 0) {
+ fprintf(stderr, "ERROR!! Could not create association for: %s",
+ stoa(simulation.servers[i].addr));
+ }
}
}
{
Event *curr_event;
struct timeval seed;
-
+
/* Initialize the local Clock
*/
simclock.local_time = 0;
getconfig(argc, argv);
initializing = 0;
loop_config(LOOP_DRIFTCOMP, old_drift / 1e6);
-
+
/*
* Watch out here, we want the real time, not the silly stuff.
*/
gettimeofday(&seed, NULL);
ntp_srandom(seed.tv_usec);
-
+
/* Initialize the event queue */
event_queue = create_priority_queue((int(*)(void *, void*))
- determine_event_ordering);
+ determine_event_ordering);
/* Initialize the receive queue */
recv_queue = create_priority_queue((int(*)(void *, void*))
- determine_recv_buf_ordering);
+ determine_recv_buf_ordering);
/* Push a beep and a timer on the event queue */
enqueue(event_queue, event(0, BEEP));
*/
/* maxtime = simulation.sim_time + simulation.end_time;*/
while (simulation.sim_time <= simulation.end_time &&
- (!empty(event_queue))) {
- curr_event = dequeue(event_queue);
- /* Update all the clocks to the time on the event */
- sim_update_clocks(curr_event);
-
- /* Execute the function associated with the event */
- event_ptr[curr_event->function](curr_event);
- free_node(curr_event);
+ (!empty(event_queue))) {
+ curr_event = dequeue(event_queue);
+ /* Update all the clocks to the time on the event */
+ sim_update_clocks(curr_event);
+
+ /* Execute the function associated with the event */
+ event_ptr[curr_event->function](curr_event);
+ free_node(curr_event);
}
return (0);
}
Event *event(double t, funcTkn f)
{
Event *e;
-
- if ((e = (Event *)get_node(sizeof(Event))) == NULL)
- abortsim("get_node failed in event");
+
+ if ((e = get_node(sizeof(*e))) == NULL)
+ abortsim("get_node failed in event");
e->time = t;
e->function = f;
return (e);
void sim_event_timer(Event *e)
{
struct recvbuf *rbuf;
-
+
/* Call the NTP timer.
* This will be responsible for actually "sending the packets."
* Since this is a simulation, the packets sent over the network
* will be processed by the simulate_server routine below.
*/
timer();
-
+
/* Process received buffers */
while (!empty(recv_queue)) {
- rbuf = (struct recvbuf *)dequeue(recv_queue);
- (rbuf->receiver)(rbuf);
- free_node(rbuf);
+ rbuf = (struct recvbuf *)dequeue(recv_queue);
+ (rbuf->receiver)(rbuf);
+ free_node(rbuf);
}
-
+
/* Arm the next timer interrupt. */
enqueue(event_queue,
- event(simulation.sim_time + (1 << EVENT_TIMEOUT), TIMER));
+ event(simulation.sim_time + (1 << EVENT_TIMEOUT), TIMER));
}
* creates a reply packet and pushes the reply packet onto the event queue
*/
int simulate_server(
- struct sockaddr_storage *serv_addr, /* Address of the server */
- struct interface *inter, /* Interface on which the reply should
- be inserted */
- struct pkt *rpkt /* Packet sent to the server that
- needs to be processed. */
+ sockaddr_u *serv_addr, /* Address of the server */
+ struct interface *inter, /* Interface on which the reply should
+ be inserted */
+ struct pkt *rpkt /* Packet sent to the server that
+ needs to be processed. */
)
{
- struct pkt xpkt; /* Packet to be transmitted back
- to the client */
+ struct pkt xpkt; /* Packet to be transmitted back
+ to the client */
struct recvbuf rbuf; /* Buffer for the received packet */
- Event *e; /* Packet receive event */
+ Event *e; /* Packet receive event */
server_info *server; /* Pointer to the server being simulated */
script_info *curr_script; /* Current script being processed */
int i;
- double d1, d2, d3; /* Delays while the packet is enroute */
+ double d1, d2, d3; /* Delays while the packet is enroute */
double t1, t2, t3, t4; /* The four timestamps in the packet */
/* Search for the server with the desired address */
server = NULL;
for (i = 0; i < simulation.num_of_servers; ++i) {
- fprintf(stderr,"Checking address: %s\n", stoa(simulation.servers[i].addr));
- if (memcmp(simulation.servers[i].addr, serv_addr,
- sizeof(struct sockaddr_storage)) == 0) {
- server = &simulation.servers[i];
- break;
- }
+ fprintf(stderr,"Checking address: %s\n", stoa(simulation.servers[i].addr));
+ if (memcmp(simulation.servers[i].addr, serv_addr,
+ sizeof(*serv_addr)) == 0) {
+ server = &simulation.servers[i];
+ break;
+ }
}
-
+
fprintf(stderr, "Received packet for: %s\n", stoa(serv_addr));
if (server == NULL)
- abortsim("Server with specified address not found!!!");
+ abortsim("Server with specified address not found!!!");
/* Get the current script for the server */
curr_script = server->curr_script;
xpkt.precision = rpkt->precision;
xpkt.rootdelay = 0;
xpkt.rootdisp = 0;
-
+
/* TIMESTAMP CALCULATIONS
- t1 t4
- \ /
- d1 \ / d3
- \ /
- t2 ----------------- t3
- d2
+ t1 t4
+ \ /
+ d1 \ / d3
+ \ /
+ t2 ----------------- t3
+ d2
*/
/* Compute the delays */
d1 = poisson(curr_script->prop_delay, curr_script->jitter);
d2 = poisson(curr_script->proc_delay, 0);
d3 = poisson(curr_script->prop_delay, curr_script->jitter);
-
+
/* Note: In the transmitted packet:
* 1. t1 and t4 are times in the client according to the local clock.
* 2. t2 and t3 are server times according to the simulated server.
* Compute t1, t2, t3 and t4
* Note: This function is called at time t1.
*/
-
+
LFPTOD(&rpkt->xmt, t1);
t2 = server->server_time + d1;
t3 = server->server_time + d1 + d2;
t4 = t1 + d1 + d2 + d3;
-
+
/* Save the timestamps */
xpkt.org = rpkt->xmt;
DTOLFP(t2, &xpkt.rec);
rbuf.recv_length = LEN_PKT_NOMAC;
rbuf.recv_pkt = xpkt;
rbuf.used = 1;
-
- memcpy(&rbuf.srcadr, serv_addr, sizeof(struct sockaddr_storage));
- memcpy(&rbuf.recv_srcadr, serv_addr, sizeof(struct sockaddr_storage));
- if ((rbuf.dstadr = malloc(sizeof(struct interface))) == NULL)
- abortsim("malloc failed in simulate_server");
- memcpy(rbuf.dstadr, inter, sizeof(struct interface));
+
+ memcpy(&rbuf.srcadr, serv_addr, sizeof(rbuf.srcadr));
+ memcpy(&rbuf.recv_srcadr, serv_addr, sizeof(rbuf.recv_srcadr));
+ if ((rbuf.dstadr = malloc(sizeof(*rbuf.dstadr))) == NULL)
+ abortsim("malloc failed in simulate_server");
+ memcpy(rbuf.dstadr, inter, sizeof(*rbuf.dstadr));
/* rbuf.link = NULL; */
/* Create a packet event and insert it onto the event_queue at the
* If not, re-enqueue the script onto the server script queue
*/
if (curr_script->duration > simulation.sim_time &&
- !empty(server->script)) {
- printf("Hello\n");
- /*
- * For some reason freeing up the curr_script memory kills the
- * simulation. Further debugging is needed to determine why.
- * free_node(curr_script);
- */
- curr_script = dequeue(server->script);
+ !empty(server->script)) {
+ printf("Hello\n");
+ /*
+ * For some reason freeing up the curr_script memory kills the
+ * simulation. Further debugging is needed to determine why.
+ * free_node(curr_script);
+ */
+ curr_script = dequeue(server->script);
}
return (0);
double time_gap;
double adj;
int i;
-
+
/* Compute the time between the last update event and this update */
time_gap = e->time - simulation.sim_time;
-
+
/* Advance the client clock */
simclock.local_time = e->time + time_gap;
* integral of samples from a Gaussian distribution.
*/
for (i = 0;i < simulation.num_of_servers; ++i) {
- simulation.servers[i].curr_script->freq_offset +=
- gauss(0, time_gap * simulation.servers[i].curr_script->wander);
+ simulation.servers[i].curr_script->freq_offset +=
+ gauss(0, time_gap * simulation.servers[i].curr_script->wander);
- simulation.servers[i].server_time += time_gap *
- (1 + simulation.servers[i].curr_script->freq_offset);
+ simulation.servers[i].server_time += time_gap *
+ (1 + simulation.servers[i].curr_script->freq_offset);
}
-
-
+
+
/* Perform the adjtime() function. If the adjustment completed
* in the previous interval, amortize the entire amount; if not,
* carry the leftover to the next interval.
*/
-
+
adj = time_gap * simclock.slew;
if (adj < fabs(simclock.adj)) {
- if (simclock.adj < 0) {
- simclock.adj += adj;
- simclock.local_time -= adj;
- }
- else {
- simclock.adj -= adj;
- simclock.local_time += adj;
- }
+ if (simclock.adj < 0) {
+ simclock.adj += adj;
+ simclock.local_time -= adj;
+ }
+ else {
+ simclock.adj -= adj;
+ simclock.local_time += adj;
+ }
}
else {
- simclock.local_time += simclock.adj;
- simclock.adj = 0;
+ simclock.local_time += simclock.adj;
+ simclock.adj = 0;
}
}
void sim_event_recv_packet(Event *e)
{
struct recvbuf *rbuf;
-
+
/* Allocate a receive buffer and copy the packet to it */
- if ((rbuf = (struct recvbuf *) get_node(sizeof(struct recvbuf))) == NULL)
- abortsim("get_node failed in sim_event_recv_packet");
- memcpy(rbuf, &e->rcv_buf, sizeof(struct recvbuf));
-
+ if ((rbuf = get_node(sizeof(*rbuf))) == NULL)
+ abortsim("get_node failed in sim_event_recv_packet");
+ memcpy(rbuf, &e->rcv_buf, sizeof(*rbuf));
+
/* Store the local time in the received packet */
DTOLFP(simclock.local_time, &rbuf->recv_time);
-
+
/* Insert the packet received onto the receive queue */
enqueue(recv_queue, rbuf);
}
enqueue(event_queue, event(e->time + simulation.beep_delay, BEEP));
#if 0
if(simulation.beep_delay > 0) {
- if (first_time) {
- printf("\t%4c T %4c\t%4c T+ERR %3c\t%5cT+ERR+NTP\n",
- ' ', ' ', ' ', ' ',' ');
- printf("\t%s\t%s\t%s\n", dash, dash, dash);
- first_time = 0;
-
- printf("\t%16.6f\t%16.6f\t%16.6f\n",
- n->time, n->clk_time, n->ntp_time);
- return;
- }
- printf("\t%16.6f\t%16.6f\t%16.6f\n",
- simclock.local_time,
-
- n->time, n->clk_time, n->ntp_time);
+ if (first_time) {
+ printf("\t%4c T %4c\t%4c T+ERR %3c\t%5cT+ERR+NTP\n",
+ ' ', ' ', ' ', ' ',' ');
+ printf("\t%s\t%s\t%s\n", dash, dash, dash);
+ first_time = 0;
+
+ printf("\t%16.6f\t%16.6f\t%16.6f\n",
+ n->time, n->clk_time, n->ntp_time);
+ return;
+ }
+ printf("\t%16.6f\t%16.6f\t%16.6f\n",
+ simclock.local_time,
+ n->time, n->clk_time, n->ntp_time);
#endif
}
*/
dtemp = now + sys_residual;
if (dtemp < 0) {
- isneg = 1;
- dtemp = -dtemp;
+ isneg = 1;
+ dtemp = -dtemp;
}
adjtv.tv_sec = (long)dtemp;
dtemp -= adjtv.tv_sec;
* leftover.
*/
if (isneg) {
- adjtv.tv_sec = -adjtv.tv_sec;
- adjtv.tv_usec = -adjtv.tv_usec;
- sys_residual = -sys_residual;
+ adjtv.tv_sec = -adjtv.tv_sec;
+ adjtv.tv_usec = -adjtv.tv_usec;
+ sys_residual = -sys_residual;
}
simclock.adj = now;
/* ntp_node.adj = now; */
{
#ifdef DEBUG
if (debug)
- printf("step_systime: time %.6f adj %.6f\n",
- simclock.local_time, now);
+ printf("step_systime: time %.6f adj %.6f\n",
+ simclock.local_time, now);
#endif
simclock.local_time += now;
return (1);
if ((fd = socket(PF_INET,SOCK_STREAM,p->p_proto)) == -1)
return(0);
- if (connect(fd,(struct sockaddr *)&so_addr,SOCKLEN(&so_addr)) == -1) {
+ if (connect(fd,(struct sockaddr *)&so_addr, sizeof(so_addr)) == -1) {
close(fd);
return (0);
}
/*
* Initialize pointers and read the timecode and timestamp
*/
- peer = (struct peer *)rbufp->recv_srcclock;
+ peer = rbufp->recv_peer;
pp = peer->procptr;
up = (struct nmeaunit *)pp->unitptr;
static struct server *clock_select (void);
static int clock_adjust (void);
static void addserver (char *);
-static struct server *findserver (struct sockaddr_storage *);
+static struct server *findserver (sockaddr_u *);
void timer (void);
static void init_alarm (void);
#ifndef SYS_WINNT
static RETSIGTYPE alarming (int);
#endif /* SYS_WINNT */
static void init_io (void);
-static void sendpkt (struct sockaddr_storage *, struct pkt *, int);
+static void sendpkt (sockaddr_u *, struct pkt *, int);
void input_handler (void);
static int l_adj_systime (l_fp *);
struct pkt xpkt;
if (debug)
- printf("transmit(%s)\n", stoa(&(server->srcadr)));
+ printf("transmit(%s)\n", stoa(&server->srcadr));
if (server->filter_nextpt < server->xmtcnt) {
l_fp ts;
L_ADDUF(&server->xmt, sys_authdelay);
HTONL_FP(&server->xmt, &xpkt.xmt);
len = authencrypt(sys_authkey, (u_int32 *)&xpkt, LEN_PKT_NOMAC);
- sendpkt(&(server->srcadr), &xpkt, (int)(LEN_PKT_NOMAC + len));
+ sendpkt(&server->srcadr, &xpkt, (int)(LEN_PKT_NOMAC + len));
if (debug > 1)
printf("transmit auth to %s\n",
- stoa(&(server->srcadr)));
+ stoa(&server->srcadr));
} else {
get_systime(&(server->xmt));
HTONL_FP(&server->xmt, &xpkt.xmt);
- sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC);
+ sendpkt(&server->srcadr, &xpkt, LEN_PKT_NOMAC);
if (debug > 1)
- printf("transmit to %s\n", stoa(&(server->srcadr)));
+ printf("transmit to %s\n", stoa(&server->srcadr));
}
/*
* (non-blocking).
*/
static int
-is_reachable (struct sockaddr_storage *dst)
+is_reachable (sockaddr_u *dst)
{
SOCKET sockfd;
- sockfd = socket(dst->ss_family, SOCK_DGRAM, 0);
+ sockfd = socket(AF(dst), SOCK_DGRAM, 0);
if (sockfd == -1) {
return 0;
}
- if(connect(sockfd, (struct sockaddr *)dst, SOCKLEN(dst))) {
+ if (connect(sockfd, &dst->sa, SOCKLEN(dst))) {
closesocket(sockfd);
return 0;
}
}
#ifdef DEBUG
else if (debug) {
- fprintf(stderr, "host found : %s\n", stohost((struct sockaddr_storage*)addrResult->ai_addr));
+ fprintf(stderr, "host found : %s\n", stohost((sockaddr_u *)addrResult->ai_addr));
}
#endif
/* We must get all returned server in case the first one fails */
for (ptr = addrResult; ptr != NULL; ptr = ptr->ai_next) {
- if (is_reachable ((struct sockaddr_storage *)ptr->ai_addr)) {
- server = (struct server *)emalloc(sizeof(struct server));
- memset((char *)server, 0, sizeof(struct server));
+ if (is_reachable ((sockaddr_u *)ptr->ai_addr)) {
+ server = emalloc(sizeof(*server));
+ memset(server, 0, sizeof(*server));
- memset(&(server->srcadr), 0, sizeof(struct sockaddr_storage));
- memcpy(&(server->srcadr), ptr->ai_addr, ptr->ai_addrlen);
+ memcpy(&server->srcadr, ptr->ai_addr, ptr->ai_addrlen);
server->event_time = ++sys_numservers;
if (sys_servers == NULL)
sys_servers = server;
*/
static struct server *
findserver(
- struct sockaddr_storage *addr
+ sockaddr_u *addr
)
{
struct server *server;
struct server *mc_server;
- isc_sockaddr_t laddr;
- isc_sockaddr_t saddr;
-
- if(addr->ss_family == AF_INET) {
- isc_sockaddr_fromin( &laddr, &((struct sockaddr_in*)addr)->sin_addr, 0);
- }
- else {
- isc_sockaddr_fromin6(&laddr, &((struct sockaddr_in6*)addr)->sin6_addr, 0);
- }
-
mc_server = NULL;
- if (htons(((struct sockaddr_in*)addr)->sin_port) != NTP_PORT)
+ if (SRCPORT(addr) != NTP_PORT)
return 0;
for (server = sys_servers; server != NULL;
server = server->next_server) {
-
- if(server->srcadr.ss_family == AF_INET) {
- isc_sockaddr_fromin(&saddr, &((struct sockaddr_in*)&server->srcadr)->sin_addr, 0);
- }
- else {
- isc_sockaddr_fromin6(&saddr, &((struct sockaddr_in6*)&server->srcadr)->sin6_addr, 0);
- }
- if (isc_sockaddr_eqaddr(&laddr, &saddr) == ISC_TRUE)
+ if (SOCK_EQ(addr, &server->srcadr))
return server;
- if(addr->ss_family == server->srcadr.ss_family) {
- if (isc_sockaddr_ismulticast(&saddr) == ISC_TRUE)
+ if (AF(addr) == AF(&server->srcadr)) {
+ if (IS_MCAST(&server->srcadr))
mc_server = server;
}
}
complete_servers++;
}
- server = (struct server *)emalloc(sizeof(struct server));
- memset((char *)server, 0, sizeof(struct server));
+ server = emalloc(sizeof(*server));
+ memset(server, 0, sizeof(*server));
- memcpy(&server->srcadr, addr, sizeof(struct sockaddr_storage));
+ server->srcadr = *addr;
server->event_time = ++sys_numservers;
* bind the socket to the NTP port
*/
if (check_ntp_port_in_use) {
- if (bind(fd[nbsock], res->ai_addr, SOCKLEN(res->ai_addr)) < 0) {
+ if (bind(fd[nbsock], res->ai_addr,
+ SOCKLEN((sockaddr_u *)res->ai_addr)) < 0) {
#ifndef SYS_WINNT
if (errno == EADDRINUSE)
#else
*/
static void
sendpkt(
- struct sockaddr_storage *dest,
+ sockaddr_u *dest,
struct pkt *pkt,
int len
)
/* Find a local family compatible socket to send ntp packet to ntp server */
for(i = 0; (i < MAX_AF); i++) {
- if(dest->ss_family == fd_family[i]) {
+ if(AF(dest) == fd_family[i]) {
sock = fd[i];
break;
}
rb = get_free_recv_buffer();
- fromlen = sizeof(struct sockaddr_storage);
+ fromlen = sizeof(rb->recv_srcadr);
rb->recv_length = recvfrom(fdc, (char *)&rb->recv_pkt,
sizeof(rb->recv_pkt), 0,
(struct sockaddr *)&rb->recv_srcadr, &fromlen);
*/
struct server {
struct server *next_server; /* next server in build list */
- struct sockaddr_storage srcadr; /* address of remote host */
+ sockaddr_u srcadr; /* address of remote host */
u_char version; /* version to use */
u_char leap; /* leap indicator */
u_char stratum; /* stratum of remote server */
sizeof(struct info_monitor_1) = 72
offsetof(lasttime) = 0
offsetof(firsttime) = 4
-offsetof(lastdrop) = 8
+offsetof(restr) = 8
offsetof(count) = 12
offsetof(addr) = 16
offsetof(daddr) = 20
sizeof(struct info_monitor) = 48
offsetof(lasttime) = 0
offsetof(firsttime) = 4
-offsetof(lastdrop) = 8
+offsetof(restr) = 8
offsetof(count) = 12
offsetof(addr) = 16
offsetof(port) = 20
static void tokenize (const char *, char **, int *);
static int findcmd (char *, struct xcmd *, struct xcmd *, struct xcmd **);
static int getarg (char *, int, arg_v *);
-static int getnetnum (const char *, struct sockaddr_storage *, char *, int);
+static int getnetnum (const char *, sockaddr_u *, char *, int);
static void help (struct parse *, FILE *);
#ifdef QSORT_USES_VOID_P
static int helpsort (const void *, const void *);
}
if (ai->ai_canonname == NULL) {
- strncpy(temphost, stoa((struct sockaddr_storage *)ai->ai_addr),
+ strncpy(temphost, stoa((sockaddr_u *)ai->ai_addr),
LENHOSTNAME);
temphost[LENHOSTNAME-1] = '\0';
} else {
static int
getnetnum(
const char *hname,
- struct sockaddr_storage *num,
+ sockaddr_u *num,
char *fullhost,
int af
)
int sockaddr_len;
struct addrinfo hints, *ai = NULL;
- sockaddr_len = (af == AF_INET)
- ? sizeof(struct sockaddr_in)
- : sizeof(struct sockaddr_in6);
+ sockaddr_len = SIZEOF_SOCKADDR(af);
memset((char *)&hints, 0, sizeof(struct addrinfo));
hints.ai_flags = AI_CANONNAME;
#ifdef AI_ADDRCONFIG
/* decodenetnum only works with addresses */
if (decodenetnum(hname, num)) {
if (fullhost != 0) {
- getnameinfo((struct sockaddr *)num, sockaddr_len,
+ getnameinfo(&num->sa, sockaddr_len,
fullhost, sizeof(fullhost), NULL, 0,
NI_NUMERICHOST);
}
*/
char *
nntohost(
- struct sockaddr_storage *netnum
+ sockaddr_u *netnum
)
{
if (!showhostnames)
- return stoa(netnum);
+ return stoa(netnum);
- if ((netnum->ss_family == AF_INET) && ISREFCLOCKADR(netnum))
+ if (ISREFCLOCKADR(netnum))
return refnumtoa(netnum);
return socktohost(netnum);
}
char *string;
long ival;
u_long uval;
- struct sockaddr_storage netnum;
+ sockaddr_u netnum;
} arg_v;
/*
extern int s_port;
extern int doquery (int, int, int, int, int, char *, int *, int *, char **, int, int);
-extern char * nntohost (struct sockaddr_storage *);
+extern char * nntohost (sockaddr_u *);
/*
- * ntpdc_ops.c - subroutines which are called to perform operations by xntpdc
+ * ntpdc_ops.c - subroutines which are called to perform operations by
+ * ntpdc
*/
#ifdef HAVE_CONFIG_H
#include <stddef.h>
#include "ntpdc.h"
+#include "ntp_net.h"
#include "ntp_control.h"
#include "ntp_refclock.h"
#include "ntp_stdlib.h"
#include <arpa/inet.h>
/*
- * Declarations for command handlers in here
+ * utility functions
*/
static int checkitems (int, FILE *);
static int checkitemsize (int, int);
static int check1item (int, FILE *);
+
+/*
+ * Declarations for command handlers in here
+ */
static void peerlist (struct parse *, FILE *);
static void peers (struct parse *, FILE *);
static void doconfig (struct parse *pcmd, FILE *fp, int mode, int refc);
*/
#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0)
+/*
+ * SET_SS_LEN_IF_PRESENT - used by SET_ADDR, SET_ADDRS macros
+ */
+
+#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
+#define SET_SS_LEN_IF_PRESENT(psau) \
+ do { \
+ (psau)->sas.ss_len = SOCKLEN(psau); \
+ } while (0)
+#else
+#define SET_SS_LEN_IF_PRESENT(psau) do { } while (0)
+#endif
+
+/*
+ * SET_ADDR - setup address for v4/v6 as needed
+ */
+#define SET_ADDR(address, v6flag, v4addr, v6addr) \
+do { \
+ memset(&(address), 0, sizeof(address)); \
+ if (v6flag) { \
+ AF(&(address)) = AF_INET6; \
+ SOCK_ADDR6(&(address)) = (v6addr); \
+ } else { \
+ AF(&(address)) = AF_INET; \
+ NSRCADR(&(address)) = (v4addr); \
+ } \
+ SET_SS_LEN_IF_PRESENT(&(address)); \
+} while (0)
+
+
+/*
+ * SET_ADDRS - setup source and destination addresses for
+ * v4/v6 as needed
+ */
+#define SET_ADDRS(a1, a2, info, a1prefix, a2prefix) \
+do { \
+ memset(&(a1), 0, sizeof(a1)); \
+ memset(&(a2), 0, sizeof(a2)); \
+ if ((info)->v6_flag) { \
+ AF(&(a1)) = AF_INET6; \
+ AF(&(a2)) = AF_INET6; \
+ SOCK_ADDR6(&(a1)) = (info)->a1prefix##6; \
+ SOCK_ADDR6(&(a2)) = (info)->a2prefix##6; \
+ } else { \
+ AF(&(a1)) = AF_INET; \
+ AF(&(a2)) = AF_INET; \
+ NSRCADR(&(a1)) = (info)->a1prefix; \
+ NSRCADR(&(a2)) = (info)->a2prefix; \
+ } \
+ SET_SS_LEN_IF_PRESENT(&(a1)); \
+ SET_SS_LEN_IF_PRESENT(&(a2)); \
+} while (0)
+
+
+/*
+ * SET_ADDRS - setup source and destination addresses for
+ * v4/v6 as needed
+ */
+#if 0
+#define SET_ADDR_MASK(address, addrmask, info) \
+do { \
+ memset(&(address), 0, sizeof(address)); \
+ memset(&(mask), 0, sizeof(mask)); \
+ if ((info)->v6_flag) { \
+ AF(&(address)) = AF_INET6; \
+ AF(&(addrmask)) = AF_INET6; \
+ SOCK_ADDR6(&(address)) = (info)->addr6; \
+ SOCK_ADDR6(&(addrmask)) = (info)->mask6; \
+ } else { \
+ AF(&(address)) = AF_INET; \
+ AF(&(addrmask)) = AF_INET; \
+ NSRCADR(&(address)) = (info)->addr; \
+ NSRCADR(&(addrmask)) = (info)->mask; \
+ } \
+ SET_SS_LEN_IF_PRESENT(&(address)); \
+ SET_SS_LEN_IF_PRESENT(&(addrmask)); \
+} while (0)
+#endif
/*
* checkitems - utility to print a message if no items were returned
}
-
/*
* peerlist - get a short list of peers
*/
)
{
struct info_peer_list *plist;
- struct sockaddr_storage paddr;
+ sockaddr_u paddr;
int items;
int itemsize;
int res;
return;
while (items > 0) {
- memset((char *)&paddr, 0, sizeof(paddr));
- if (plist->v6_flag != 0) {
- GET_INADDR6(paddr) = plist->addr6;
- paddr.ss_family = AF_INET6;
- } else {
- GET_INADDR(paddr) = plist->addr;
- paddr.ss_family = AF_INET;
- }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- paddr.ss_len = SOCKLEN(&paddr);
-#endif
+ SET_ADDR(paddr, plist->v6_flag, plist->addr, plist->addr6);
if ((pcmd->nargs == 0) ||
((pcmd->argval->ival == 6) && (plist->v6_flag != 0)) ||
((pcmd->argval->ival == 4) && (plist->v6_flag == 0)))
)
{
struct info_peer_summary *plist;
- struct sockaddr_storage dstadr;
- struct sockaddr_storage srcadr;
+ sockaddr_u dstadr;
+ sockaddr_u srcadr;
int items;
int itemsize;
int ntp_poll;
NTOHL_FP(&(plist->offset), &tempts);
ntp_poll = 1<<max(min3(plist->ppoll, plist->hpoll, NTP_MAXPOLL),
NTP_MINPOLL);
- memset((char *)&dstadr, 0, sizeof(dstadr));
- memset((char *)&srcadr, 0, sizeof(srcadr));
- if (plist->v6_flag != 0) {
- GET_INADDR6(dstadr) = plist->dstadr6;
- GET_INADDR6(srcadr) = plist->srcadr6;
- srcadr.ss_family = AF_INET6;
- dstadr.ss_family = AF_INET6;
- } else {
- GET_INADDR(dstadr) = plist->dstadr;
- GET_INADDR(srcadr) = plist->srcadr;
- srcadr.ss_family = AF_INET;
- dstadr.ss_family = AF_INET;
- }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- srcadr.ss_len = SOCKLEN(&srcadr);
- dstadr.ss_len = SOCKLEN(&dstadr);
-#endif
+ SET_ADDRS(dstadr, srcadr, plist, dstadr, srcadr);
if ((pcmd->nargs == 0) ||
((pcmd->argval->ival == 6) && (plist->v6_flag != 0)) ||
((pcmd->argval->ival == 4) && (plist->v6_flag == 0)))
{
register int i;
l_fp tempts;
- struct sockaddr_storage srcadr, dstadr;
+ sockaddr_u srcadr, dstadr;
+
+ SET_ADDRS(dstadr, srcadr, pp, dstadr, srcadr);
- memset((char *)&srcadr, 0, sizeof(srcadr));
- memset((char *)&dstadr, 0, sizeof(dstadr));
- if (pp->v6_flag != 0) {
- srcadr.ss_family = AF_INET6;
- dstadr.ss_family = AF_INET6;
- GET_INADDR6(srcadr) = pp->srcadr6;
- GET_INADDR6(dstadr) = pp->dstadr6;
- } else {
- srcadr.ss_family = AF_INET;
- dstadr.ss_family = AF_INET;
- GET_INADDR(srcadr) = pp->srcadr;
- GET_INADDR(dstadr) = pp->dstadr;
- }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- srcadr.ss_len = SOCKLEN(&srcadr);
- dstadr.ss_len = SOCKLEN(&dstadr);
-#endif
(void) fprintf(fp, "remote %s, local %s\n",
stoa(&srcadr), stoa(&dstadr));
(void) fprintf(fp, "hmode %s, pmode %s, stratum %d, precision %d\n",
sendsize = v4sizeof(struct info_peer_list);
for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 4); qitems++) {
- if (pcmd->argval[qitems].netnum.ss_family == AF_INET) {
- pl->addr = GET_INADDR(pcmd->argval[qitems].netnum);
+ if (IS_IPV4(&pcmd->argval[qitems].netnum)) {
+ pl->addr = NSRCADR(&pcmd->argval[qitems].netnum);
if (impl_ver == IMPL_XNTPD)
pl->v6_flag = 0;
} else {
"***Server doesn't understand IPv6 addresses\n");
return;
}
- pl->addr6 = GET_INADDR6(pcmd->argval[qitems].netnum);
+ pl->addr6 = SOCK_ADDR6(&pcmd->argval[qitems].netnum);
pl->v6_flag = 1;
}
pl->port = (u_short)s_port;
struct info_peer_stats *pp;
/* 4 is the maximum number of peers which will fit in a packet */
struct info_peer_list *pl, plist[min(MAXARGS, 4)];
- struct sockaddr_storage src, dst;
+ sockaddr_u src, dst;
int qitems;
int items;
int itemsize;
memset((char *)plist, 0, sizeof(struct info_peer_list) * min(MAXARGS, 4));
for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 4); qitems++) {
- if (pcmd->argval[qitems].netnum.ss_family == AF_INET) {
- pl->addr = GET_INADDR(pcmd->argval[qitems].netnum);
+ if (IS_IPV4(&pcmd->argval[qitems].netnum)) {
+ pl->addr = NSRCADR(&pcmd->argval[qitems].netnum);
if (impl_ver == IMPL_XNTPD)
pl->v6_flag = 0;
} else {
"***Server doesn't understand IPv6 addresses\n");
return;
}
- pl->addr6 = GET_INADDR6(pcmd->argval[qitems].netnum);
+ pl->addr6 = SOCK_ADDR6(&pcmd->argval[qitems].netnum);
pl->v6_flag = 1;
}
pl->port = (u_short)s_port;
return;
while (items-- > 0) {
- memset((char *)&src, 0, sizeof(src));
- memset((char *)&dst, 0, sizeof(dst));
+ ZERO_SOCK(&dst);
+ ZERO_SOCK(&src);
if (pp->v6_flag != 0) {
- GET_INADDR6(src) = pp->srcadr6;
- GET_INADDR6(dst) = pp->dstadr6;
- src.ss_family = AF_INET6;
- dst.ss_family = AF_INET6;
+ AF(&dst) = AF_INET6;
+ AF(&src) = AF_INET6;
+ SOCK_ADDR6(&dst) = pp->dstadr6;
+ SOCK_ADDR6(&src) = pp->srcadr6;
} else {
- GET_INADDR(src) = pp->srcadr;
- GET_INADDR(dst) = pp->dstadr;
- src.ss_family = AF_INET;
- dst.ss_family = AF_INET;
+ AF(&dst) = AF_INET;
+ AF(&src) = AF_INET;
+ NSRCADR(&dst) = pp->dstadr;
+ NSRCADR(&src) = pp->srcadr;
}
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- src.ss_len = SOCKLEN(&src);
- dst.ss_len = SOCKLEN(&dst);
+ src.sas.ss_len = SOCKLEN(&src);
+ dst.sas.ss_len = SOCKLEN(&dst);
#endif
(void) fprintf(fp, "remote host: %s\n",
nntohost(&src));
)
{
struct info_sys *is;
- struct sockaddr_storage peeraddr;
+ sockaddr_u peeraddr;
int items;
int itemsize;
int res;
!checkitemsize(itemsize, v4sizeof(struct info_sys)))
return;
- memset((char *)&peeraddr, 0, sizeof(peeraddr));
- if (is->v6_flag != 0) {
- GET_INADDR6(peeraddr) = is->peer6;
- peeraddr.ss_family = AF_INET6;
- } else {
- GET_INADDR(peeraddr) = is->peer;
- peeraddr.ss_family = AF_INET;
- }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- peeraddr.ss_len = SOCKLEN(&peeraddr);
-#endif
+ SET_ADDR(peeraddr, is->v6_flag, is->peer, is->peer6);
+
(void) fprintf(fp, "system peer: %s\n", nntohost(&peeraddr));
(void) fprintf(fp, "system peer mode: %s\n", modetoa(is->peer_mode));
(void) fprintf(fp, "leap indicator: %c%c\n",
if (res)
return;
- memset((void *)&cpeer, 0, sizeof(cpeer));
+ memset(&cpeer, 0, sizeof(cpeer));
- if (pcmd->argval[0].netnum.ss_family == AF_INET) {
- cpeer.peeraddr = GET_INADDR(pcmd->argval[0].netnum);
+ if (IS_IPV4(&pcmd->argval[0].netnum)) {
+ cpeer.peeraddr = NSRCADR(&pcmd->argval[0].netnum);
if (impl_ver == IMPL_XNTPD)
cpeer.v6_flag = 0;
} else {
"***Server doesn't understand IPv6 addresses\n");
return;
}
- cpeer.peeraddr6 = GET_INADDR6(pcmd->argval[0].netnum);
+ cpeer.peeraddr6 = SOCK_ADDR6(&pcmd->argval[0].netnum);
cpeer.v6_flag = 1;
}
cpeer.hmode = (u_char) mode;
sendsize = v4sizeof(struct conf_unpeer);
for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 8); qitems++) {
- if (pcmd->argval[0].netnum.ss_family == AF_INET) {
- pl->peeraddr = GET_INADDR(pcmd->argval[qitems].netnum);
+ if (IS_IPV4(&pcmd->argval[0].netnum)) {
+ pl->peeraddr = NSRCADR(&pcmd->argval[qitems].netnum);
if (impl_ver == IMPL_XNTPD)
pl->v6_flag = 0;
} else {
return;
}
pl->peeraddr6 =
- GET_INADDR6(pcmd->argval[qitems].netnum);
+ SOCK_ADDR6(&pcmd->argval[qitems].netnum);
pl->v6_flag = 1;
}
pl = (struct conf_unpeer *)((char *)pl + sendsize);
)
{
struct info_restrict *rl;
- struct sockaddr_storage resaddr;
- struct sockaddr_storage maskaddr;
+ sockaddr_u resaddr;
+ sockaddr_u maskaddr;
int items;
int itemsize;
int res;
"=====================================================================\n");
while (items > 0) {
- memset((char *)&resaddr, 0, sizeof(resaddr));
- memset((char *)&maskaddr, 0, sizeof(maskaddr));
+ SET_ADDRS(resaddr, maskaddr, rl, addr, mask);
if (rl->v6_flag != 0) {
- GET_INADDR6(resaddr) = rl->addr6;
- GET_INADDR6(maskaddr) = rl->mask6;
- resaddr.ss_family = AF_INET6;
- maskaddr.ss_family = AF_INET6;
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- resaddr.ss_len = SOCKLEN(&resaddr);
-#endif
addr = nntohost(&resaddr);
} else {
- GET_INADDR(resaddr) = rl->addr;
- GET_INADDR(maskaddr) = rl->mask;
- resaddr.ss_family = AF_INET;
- maskaddr.ss_family = AF_INET;
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- resaddr.ss_len = SOCKLEN(&resaddr);
-#endif
if ((rl->mask == (u_int32)0xffffffff))
- addr = nntohost(&resaddr);
+ addr = nntohost(&resaddr);
else
addr = stoa(&resaddr);
}
else
sendsize = v4sizeof(struct conf_restrict);
- if (pcmd->argval[0].netnum.ss_family == AF_INET) {
- cres.addr = GET_INADDR(pcmd->argval[0].netnum);
- cres.mask = GET_INADDR(pcmd->argval[1].netnum);
+ if (IS_IPV4(&pcmd->argval[0].netnum)) {
+ cres.addr = NSRCADR(&pcmd->argval[0].netnum);
+ cres.mask = NSRCADR(&pcmd->argval[1].netnum);
if (impl_ver == IMPL_XNTPD)
cres.v6_flag = 0;
} else {
"***Server doesn't understand IPv6 addresses\n");
return;
}
- cres.addr6 = GET_INADDR6(pcmd->argval[0].netnum);
+ cres.addr6 = SOCK_ADDR6(&pcmd->argval[0].netnum);
cres.v6_flag = 1;
}
cres.flags = 0;
* Make sure mask for default address is zero. Otherwise,
* make sure mask bits are contiguous.
*/
- if (pcmd->argval[0].netnum.ss_family == AF_INET) {
+ if (IS_IPV4(&pcmd->argval[0].netnum)) {
if (cres.addr == 0) {
cres.mask = 0;
} else {
)
{
char *struct_star;
- struct sockaddr_storage addr;
- struct sockaddr_storage dstadr;
+ sockaddr_u addr;
+ sockaddr_u dstadr;
int items;
int itemsize;
int res;
struct info_monitor_1 *ml = (struct info_monitor_1 *) struct_star;
(void) fprintf(fp,
- "remote address port local address count m ver code avgint lstint\n");
+ "remote address port local address count m ver rstr avgint lstint\n");
(void) fprintf(fp,
"===============================================================================\n");
while (items > 0) {
- memset((char *)&addr, 0, sizeof(addr));
- memset((char *)&dstadr, 0, sizeof(dstadr));
- if (ml->v6_flag != 0) {
- GET_INADDR6(addr) = ml->addr6;
- addr.ss_family = AF_INET6;
- GET_INADDR6(dstadr) = ml->daddr6;
- dstadr.ss_family = AF_INET6;
- } else {
- GET_INADDR(addr) = ml->addr;
- addr.ss_family = AF_INET;
- GET_INADDR(dstadr) = ml->daddr;
- dstadr.ss_family = AF_INET;
- }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- addr.ss_len = SOCKLEN(&addr);
- dstadr.ss_len = SOCKLEN(&dstadr);
-#endif
+ SET_ADDRS(dstadr, addr, ml, daddr, addr);
if ((pcmd->nargs == 0) ||
((pcmd->argval->ival == 6) && (ml->v6_flag != 0)) ||
((pcmd->argval->ival == 4) && (ml->v6_flag == 0)))
(u_long)ntohl(ml->count),
ml->mode,
ml->version,
- (u_long)ntohl(ml->lastdrop),
+ (u_long)ntohl(ml->restr),
(u_long)ntohl(ml->lasttime),
(u_long)ntohl(ml->firsttime));
ml++;
struct info_monitor *ml = (struct info_monitor *) struct_star;
(void) fprintf(fp,
- " address port count mode ver code avgint lstint\n");
+ " address port count mode ver rstr avgint lstint\n");
(void) fprintf(fp,
"===============================================================================\n");
while (items > 0) {
- memset((char *)&dstadr, 0, sizeof(dstadr));
- if (ml->v6_flag != 0) {
- GET_INADDR6(dstadr) = ml->addr6;
- dstadr.ss_family = AF_INET6;
- } else {
- GET_INADDR(dstadr) = ml->addr;
- dstadr.ss_family = AF_INET;
- }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- dstadr.ss_len = SOCKLEN(&dstadr);
-#endif
+ SET_ADDR(dstadr, ml->v6_flag, ml->addr, ml->addr6);
if ((pcmd->nargs == 0) ||
((pcmd->argval->ival == 6) && (ml->v6_flag != 0)) ||
((pcmd->argval->ival == 4) && (ml->v6_flag == 0)))
(u_long)ntohl(ml->count),
ml->mode,
ml->version,
- (u_long)ntohl(ml->lastdrop),
+ (u_long)ntohl(ml->restr),
(u_long)ntohl(ml->lasttime),
(u_long)ntohl(ml->firsttime));
ml++;
(void) fprintf(fp,
"======================================================================\n");
while (items > 0) {
- memset((char *)&dstadr, 0, sizeof(dstadr));
- if (oml->v6_flag != 0) {
- GET_INADDR6(dstadr) = oml->addr6;
- dstadr.ss_family = AF_INET6;
- } else {
- GET_INADDR(dstadr) = oml->addr;
- dstadr.ss_family = AF_INET;
- }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- dstadr.ss_len = SOCKLEN(&dstadr);
-#endif
+ SET_ADDR(dstadr, oml->v6_flag, oml->addr, oml->addr6);
(void) fprintf(fp, "%-20.20s %5d %9ld %4d %3d %9lu %9lu\n",
nntohost(&dstadr),
ntohs(oml->port),
sendsize = v4sizeof(struct conf_unpeer);
for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 8); qitems++) {
- if (pcmd->argval[qitems].netnum.ss_family == AF_INET) {
- pl->peeraddr = GET_INADDR(pcmd->argval[qitems].netnum);
+ if (IS_IPV4(&pcmd->argval[qitems].netnum)) {
+ pl->peeraddr = NSRCADR(&pcmd->argval[qitems].netnum);
if (impl_ver == IMPL_XNTPD)
pl->v6_flag = 0;
} else {
return;
}
pl->peeraddr6 =
- GET_INADDR6(pcmd->argval[qitems].netnum);
+ SOCK_ADDR6(&pcmd->argval[qitems].netnum);
pl->v6_flag = 1;
}
pl = (struct conf_unpeer *)((char *)pl + sendsize);
{
int i;
struct info_trap *it;
- struct sockaddr_storage trap_addr, local_addr;
+ sockaddr_u trap_addr, local_addr;
int items;
int itemsize;
int res;
for (i = 0; i < items; i++ ) {
if (i != 0)
(void) fprintf(fp, "\n");
- memset((char *)&trap_addr, 0, sizeof(trap_addr));
- memset((char *)&local_addr, 0, sizeof(local_addr));
- if (it->v6_flag != 0) {
- GET_INADDR6(trap_addr) = it->trap_address6;
- GET_INADDR6(local_addr) = it->local_address6;
- trap_addr.ss_family = AF_INET6;
- local_addr.ss_family = AF_INET6;
- } else {
- GET_INADDR(trap_addr) = it->trap_address;
- GET_INADDR(local_addr) = it->local_address;
- trap_addr.ss_family = AF_INET;
- local_addr.ss_family = AF_INET;
- }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- trap_addr.ss_len = SOCKLEN(&trap_addr);
- local_addr.ss_len = SOCKLEN(&local_addr);
-#endif
+ SET_ADDRS(trap_addr, local_addr, it, trap_address, local_address);
(void) fprintf(fp, "address %s, port %d\n",
stoa(&trap_addr),
ntohs(it->trap_port));
else
sendsize = v4sizeof(struct conf_trap);
- if (pcmd->argval[0].netnum.ss_family == AF_INET) {
- ctrap.trap_address = GET_INADDR(pcmd->argval[0].netnum);
+ if (IS_IPV4(&pcmd->argval[0].netnum)) {
+ ctrap.trap_address = NSRCADR(&pcmd->argval[0].netnum);
if (impl_ver == IMPL_XNTPD)
ctrap.v6_flag = 0;
} else {
"***Server doesn't understand IPv6 addresses\n");
return;
}
- ctrap.trap_address6 = GET_INADDR6(pcmd->argval[0].netnum);
+ ctrap.trap_address6 = SOCK_ADDR6(&pcmd->argval[0].netnum);
ctrap.v6_flag = 1;
}
ctrap.local_address = 0;
ctrap.unused = 0;
if (pcmd->nargs > 1) {
- ctrap.trap_port
- = htons((u_short)(pcmd->argval[1].uval & 0xffff));
+ ctrap.trap_port = htons((u_short)pcmd->argval[1].uval);
if (pcmd->nargs > 2) {
- if (pcmd->argval[2].netnum.ss_family !=
- pcmd->argval[0].netnum.ss_family) {
+ if (AF(&pcmd->argval[2].netnum) !=
+ AF(&pcmd->argval[0].netnum)) {
fprintf(stderr,
"***Cannot mix IPv4 and IPv6 addresses\n");
return;
}
- if (pcmd->argval[2].netnum.ss_family == AF_INET)
- ctrap.local_address = GET_INADDR(pcmd->argval[2].netnum);
+ if (IS_IPV4(&pcmd->argval[2].netnum))
+ ctrap.local_address = NSRCADR(&pcmd->argval[2].netnum);
else
- ctrap.local_address6 = GET_INADDR6(pcmd->argval[2].netnum);
+ ctrap.local_address6 = SOCK_ADDR6(&pcmd->argval[2].netnum);
}
}
struct clktype *clk;
for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++)
- clist[qitems] = GET_INADDR(pcmd->argval[qitems].netnum);
+ clist[qitems] = NSRCADR(&pcmd->argval[qitems].netnum);
again:
res = doquery(impl_ver, REQ_GET_CLOCKINFO, 0, qitems,
err = 0;
memset((char *)&fudgedata, 0, sizeof fudgedata);
- fudgedata.clockadr = GET_INADDR(pcmd->argval[0].netnum);
+ fudgedata.clockadr = NSRCADR(&pcmd->argval[0].netnum);
if (STREQ(pcmd->argval[1].string, "time1")) {
fudgedata.which = htonl(FUDGE_TIME1);
l_fp ts;
for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++)
- clist[qitems] = GET_INADDR(pcmd->argval[qitems].netnum);
+ clist[qitems] = NSRCADR(&pcmd->argval[qitems].netnum);
again:
res = doquery(impl_ver, REQ_GET_CLKBUGINFO, 0, qitems,
)
{
static char *actions = "?.+-";
- struct sockaddr_storage saddr;
+ sockaddr_u saddr;
if (res != 0)
return;
fprintf(fp, IF_LIST_LINE);
while (items > 0) {
- if (ntohl(ifs->v6_flag)) {
- memcpy((char *)&GET_INADDR6(saddr), (char *)&ifs->unaddr.addr6, sizeof(ifs->unaddr.addr6));
- saddr.ss_family = AF_INET6;
- } else {
- memcpy((char *)&GET_INADDR(saddr), (char *)&ifs->unaddr.addr, sizeof(ifs->unaddr.addr));
- saddr.ss_family = AF_INET;
- }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- saddr.ss_len = SOCKLEN(&saddr);
-#endif
+ SET_ADDR(saddr, ntohl(ifs->v6_flag),
+ ifs->unaddr.addr.s_addr, ifs->unaddr.addr6);
fprintf(fp, IF_LIST_FMT,
ntohl(ifs->ifnum),
actions[(ifs->action >= 1 && ifs->action < 4) ? ifs->action : 0],
ntohl(ifs->peercnt),
ntohl(ifs->uptime));
- if (ntohl(ifs->v6_flag)) {
- memcpy((char *)&GET_INADDR6(saddr), (char *)&ifs->unmask.addr6, sizeof(ifs->unmask.addr6));
- saddr.ss_family = AF_INET6;
- } else {
- memcpy((char *)&GET_INADDR(saddr), (char *)&ifs->unmask.addr, sizeof(ifs->unmask.addr));
- saddr.ss_family = AF_INET;
- }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- saddr.ss_len = SOCKLEN(&saddr);
-#endif
+ SET_ADDR(saddr, ntohl(ifs->v6_flag),
+ ifs->unmask.addr.s_addr, ifs->unmask.addr6);
fprintf(fp, IF_LIST_AFMT_STR, stoa(&saddr), 'M');
if (!ntohl(ifs->v6_flag) && ntohl(ifs->flags) & (INT_BCASTOPEN)) {
- memcpy((char *)&GET_INADDR(saddr), (char *)&ifs->unbcast.addr, sizeof(ifs->unbcast.addr));
- saddr.ss_family = AF_INET;
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- saddr.ss_len = SOCKLEN(&saddr);
-#endif
+ SET_ADDR(saddr, ntohl(ifs->v6_flag),
+ ifs->unbcast.addr.s_addr, ifs->unbcast.addr6);
fprintf(fp, IF_LIST_AFMT_STR, stoa(&saddr), 'B');
}
*
****************************************************************************/
int ntpq_get_assoc_clocktype ( int assoc_number )
-{
+{
int type = 0;
int i, rc = 0;
- struct sockaddr_storage dum_store;
+ sockaddr_u dum_store;
char value[LENHOSTNAME];
char resultbuf[1024];
return -1;
} else {
if ( peervar_assoc != assoc_cache[assoc_number].assid ) {
-
+
i=ntpq_read_assoc_peervars(assoc_cache[assoc_number].assid, resultbuf, sizeof(resultbuf));
if ( i <= 0 ) {
return -1;
if ( rc ) {
if (decodenetnum(value, &dum_store)) {
- type = ntpq_decodeaddrtype(&dum_store);
+ type = ntpq_decodeaddrtype(&dum_store);
return type;
}
}
/* in libntpq_subs.c */
#ifndef _LIBNTPQSUBSC
extern int ntpq_dogetassoc(void);
-extern char ntpq_decodeaddrtype(struct sockaddr_storage *sock);
+extern char ntpq_decodeaddrtype(sockaddr_u *sock);
extern int ntpq_doquerylist(struct ntpq_varlist *, int , int , int , u_short *, int *, char **datap );
#endif
/* Function Prototypes */
int ntpq_dogetassoc(void);
-char ntpq_decodeaddrtype(struct sockaddr_storage *sock);
+char ntpq_decodeaddrtype(sockaddr_u *sock);
int ntpq_doquerylist(struct varlist *, int , int , int , u_short *, int *, char **datap );
}
}
-char ntpq_decodeaddrtype(struct sockaddr_storage *sock)
+char ntpq_decodeaddrtype(sockaddr_u *sock)
{
return decodeaddrtype(sock);
}
{ ":config", config, { NTP_STR, NO, NO, NO },
{ "<configuration command line>", "", "", "" },
"send a remote configuration command to ntpd" },
- { "config-from-file", config_from_file, { NTP_STR, NO, NO, NO },
- { "<configuration filename>", "", "", "" },
- "configure ntpd using the configuration filename" },
+ { "config-from-file", config_from_file, { NTP_STR, NO, NO, NO },
+ { "<configuration filename>", "", "", "" },
+ "configure ntpd using the configuration filename" },
{ 0, 0, { NO, NO, NO, NO },
{ "-4|-6", "", "", "" }, "" }
};
static char
decodeaddrtype(
- struct sockaddr_storage *sock
+ sockaddr_u *sock
)
{
char ch = '-';
u_int32 dummy;
- struct sockaddr_in6 *sin6;
- switch(sock->ss_family) {
+ switch(AF(sock)) {
case AF_INET:
- dummy = ((struct sockaddr_in *)sock)->sin_addr.s_addr;
- dummy = ntohl(dummy);
+ dummy = SRCADR(sock);
ch = (char)(((dummy&0xf0000000)==0xe0000000) ? 'm' :
((dummy&0x000000ff)==0x000000ff) ? 'b' :
((dummy&0xffffffff)==0x7f000001) ? 'l' :
'u');
break;
case AF_INET6:
- sin6 = (struct sockaddr_in6 *)sock;
- if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
+ if (IN6_IS_ADDR_MULTICAST(PSOCK_ADDR6(sock)))
ch = 'm';
else
ch = 'u';
int i;
int c;
- struct sockaddr_storage srcadr;
- struct sockaddr_storage dstadr;
+ sockaddr_u srcadr;
+ sockaddr_u dstadr;
u_long srcport = 0;
char *dstadr_refid = "0.0.0.0";
u_long stratum = 0;
memset((char *)havevar, 0, sizeof(havevar));
get_systime(&ts);
- memset((char *)&srcadr, 0, sizeof(struct sockaddr_storage));
- memset((char *)&dstadr, 0, sizeof(struct sockaddr_storage));
+ ZERO_SOCK(&srcadr);
+ ZERO_SOCK(&dstadr);
/* Initialize by zeroing out estimate variables */
memset((char *)&estoffset, 0, sizeof(l_fp));
memset((char *)&estdisp, 0, sizeof(l_fp));
while (nextvar(&datalen, &data, &name, &value)) {
- struct sockaddr_storage dum_store;
+ sockaddr_u dum_store;
i = findvar(name, peer_var, 1);
if (i == 0)
continue; /* don't know this one */
switch (i) {
case CP_SRCADR:
- if (decodenetnum(value, &srcadr))
+ if (decodenetnum(value, &srcadr)) {
havevar[HAVE_SRCADR] = 1;
+ }
break;
case CP_DSTADR:
- if (decodenetnum(value, &dum_store))
+ if (decodenetnum(value, &dum_store)) {
type = decodeaddrtype(&dum_store);
- if (pvl == opeervarlist) {
- if (decodenetnum(value, &dstadr)) {
+ if (pvl == opeervarlist) {
havevar[HAVE_DSTADR] = 1;
+ dstadr = dum_store;
dstadr_refid = stoa(&dstadr);
}
}
refid_string[i+1] = '\0';
dstadr_refid = refid_string;
} else if (decodenetnum(value, &dstadr)) {
- if (SOCKNUL(&dstadr))
+ if (SOCK_UNSPEC(&dstadr))
dstadr_refid = "0.0.0.0";
- else if ((dstadr.ss_family == AF_INET)
- && ISREFCLOCKADR(&dstadr))
- dstadr_refid =
+ else if (ISREFCLOCKADR(&dstadr))
+ dstadr_refid =
refnumtoa(&dstadr);
else
dstadr_refid =
c = flash2[CTL_PEER_STATVAL(rstatus) & 0x3];
if (numhosts > 1)
(void) fprintf(fp, "%-*s ", maxhostlen, currenthost);
- if (af == 0 || srcadr.ss_family == af){
+ if (af == 0 || AF(&srcadr) == af) {
strcpy(clock_name, nntohost(&srcadr));
(void) fprintf(fp,
{
register int i;
char fullname[LENHOSTNAME];
- struct sockaddr_storage netnum;
+ sockaddr_u netnum;
if (!dogetassoc(fp))
return;
{
register int i;
char fullname[LENHOSTNAME];
- struct sockaddr_storage netnum;
+ sockaddr_u netnum;
if (!dogetassoc(fp))
return;
if (ai->ai_canonname == NULL) {
strncpy(temphost,
- stoa((struct sockaddr_storage *)ai->ai_addr),
+ stoa((sockaddr_u *)ai->ai_addr),
LENHOSTNAME);
} else {
int
getnetnum(
const char *hname,
- struct sockaddr_storage *num,
+ sockaddr_u *num,
char *fullhost,
int af
)
int sockaddr_len;
struct addrinfo hints, *ai = NULL;
- sockaddr_len = (af == AF_INET)
- ? sizeof(struct sockaddr_in)
- : sizeof(struct sockaddr_in6);
- memset((char *)&hints, 0, sizeof(struct addrinfo));
+ sockaddr_len = SIZEOF_SOCKADDR(af);
+ memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_CANONNAME;
#ifdef AI_ADDRCONFIG
hints.ai_flags |= AI_ADDRCONFIG;
*/
char *
nntohost(
- struct sockaddr_storage *netnum
+ sockaddr_u *netnum
)
{
if (!showhostnames)
return stoa(netnum);
- else if ((netnum->ss_family == AF_INET) && ISREFCLOCKADR(netnum))
+ else if (ISREFCLOCKADR(netnum))
return refnumtoa(netnum);
else
return socktohost(netnum);
struct ctl_var *varlist;
l_fp lfp;
long ival;
- struct sockaddr_storage hval;
+ sockaddr_u hval;
u_long uval;
l_fp lfparr[8];
int narr;
case RF:
if (decodenetnum(value, &hval)) {
- if ((hval.ss_family == AF_INET) &&
- ISREFCLOCKADR(&hval))
+ if (ISREFCLOCKADR(&hval))
output(fp, name,
refnumtoa(&hval));
else
char *string;
long ival;
u_long uval;
- struct sockaddr_storage netnum;
+ sockaddr_u netnum;
} arg_v;
/*
};
extern void asciize (int, char *, FILE *);
-extern int getnetnum (const char *, struct sockaddr_storage *, char *, int);
+extern int getnetnum (const char *, sockaddr_u *, char *, int);
extern void sortassoc (void);
extern int doquery (int, int, int, int, char *, u_short *, int *, char **);
-extern char * nntohost (struct sockaddr_storage *);
+extern char * nntohost (sockaddr_u *);
extern int decodets (char *, l_fp *);
extern int decodeuint (char *, u_long *);
extern int nextvar (int *, char **, char **, char **);
/* config.h for Windows NT */
-#ifndef __CONFIG_H
-#define __CONFIG_H
+#ifndef CONFIG_H
+#define CONFIG_H
/*
* For newer compilers we may we want newer prototypes from Windows
};
/*
- * IPv6 requirements
+ * ntp_rfc2553.h has cruft under #ifdef SYS_WINNT which is
+ * appropriate for older Microsoft IPv6 definitions, such
+ * as in_addr6 being the struct type. We can differentiate
+ * the RFC2553-compliant newer headers because they have
+ * #define in_addr6 in6_addr
+ * for backward compatibility. With the newer headers,
+ * we define ISC_PLATFORM_HAVEIPV6 and disable the cruft.
*/
-/*
- * For VS.NET most of the IPv6 types and structures are defined.
- * This should depend on the contrents of the available headers,
- * not on the compiler version.
- */
-#if defined _MSC_VER && _MSC_VER > 1200
-#define HAVE_STRUCT_SOCKADDR_STORAGE
+#ifdef in_addr6
#define ISC_PLATFORM_HAVEIPV6
+#define INCLUDE_IPV6_SUPPORT
+#define INCLUDE_IPV6_MULTICAST_SUPPORT
+#define ISC_PLATFORM_HAVESCOPEID
+#define HAVE_STRUCT_SOCKADDR_STORAGE
#define ISC_PLATFORM_HAVEIN6PKTINFO
#define NO_OPTION_NAME_WARNINGS
-#endif
+#endif /* in_addr6 / RFC2553-compliant IPv6 headers */
#ifndef _W64
/* VC6 doesn't know about socklen_t, except if the SDK is installed */
#define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR))
#endif
+/*
+ * Define this macro to control the behavior of connection
+ * resets on UDP sockets. See Microsoft KnowledgeBase Article Q263823
+ * for details.
+ * Based on that article, it is surprising that a much newer winsock2.h
+ * does not define SIO_UDP_CONNRESET (the one that comes with VS 2008).
+ * NOTE: This requires that Windows 2000 systems install Service Pack 2
+ * or later.
+ */
+#ifndef SIO_UDP_CONNRESET
+#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
+#endif
+
#if defined _MSC_VER && _MSC_VER < 1400
/*
* Use 32-bit time definitions for versions prior to VS 2005
*/
#include <isc/stat.h>
-#endif /* __CONFIG_H */
+#endif /* CONFIG_H */
# if defined(HAVE_IO_COMPLETION_PORT)
-extern void init_io_completion_port (void);
-extern void uninit_io_completion_port (void);
+extern void init_io_completion_port(void);
+extern void uninit_io_completion_port(void);
-extern int io_completion_port_add_socket (SOCKET fd, struct interface *);
+extern int io_completion_port_add_socket(SOCKET fd, struct interface *);
struct refclockio; /* in ntp_refclock.h but inclusion here triggers problems */
-extern int io_completion_port_add_clock_io (struct refclockio *rio);
+extern int io_completion_port_add_clock_io(struct refclockio *rio);
-extern int io_completion_port_sendto (struct interface *, struct pkt *, int, struct sockaddr_storage*);
+extern int io_completion_port_sendto(struct interface *, struct pkt *, int, sockaddr_u *);
-extern HANDLE get_io_event (void);
+extern HANDLE get_io_event(void);
+extern HANDLE get_exit_event(void);
-extern HANDLE get_exit_event (void); /* Handle of the exit event */
-
-extern int GetReceivedBuffers (void);
+extern int GetReceivedBuffers(void);
# endif
-#if !defined __transmitbuff_h
-#define __transmitbuff_h
+#ifndef TRANSMITBUFF_H
+#define TRANSMITBUFF_H
#include "ntp.h"
-#if defined HAVE_IO_COMPLETION_PORT
-# include "ntp_iocompletionport.h"
-#endif
#include <isc/list.h>
/*
typedef struct transmitbuf {
ISC_LINK(transmitbuf_t) link;
- WSABUF wsabuf;
time_t ts; /* Time stamp for the request */
/*
*/
extern transmitbuf_t *get_free_transmit_buffer (void);
-#endif /* defined __transmitbuff_h */
+#endif /* TRANSMITBUFF_H */
#include <fcntl.h>
-#define NCCS 4
+#define NCCS 18 /* refclock_arc.c uses VTIME (17) */
#define VEOL 3
typedef unsigned char cc_t;
typedef unsigned int speed_t;
#define TCSANOW 0
#define TCSADRAIN 1
#define TCSAFLUSH 2
+#define VMIN 16
+#define VTIME 17
/* modem lines */
#define TIOCM_LE 0x001
RelativePath="..\..\..\include\ntp_malloc.h"
>
</File>
+ <File
+ RelativePath="..\..\..\include\ntp_net.h"
+ >
+ </File>
<File
RelativePath="..\..\..\include\ntp_proto.h"
>
+/*
+ * DEAD CODE ALERT -- for whatever reason all this wonderful stuff is
+ * unused. The initialization was the only code
+ * exercised as of May 2009 when that was nipped.
+ */
+
+
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
# define LOCK(lock) EnterCriticalSection(lock)
# define UNLOCK(lock) LeaveCriticalSection(lock)
-static void
+static inline void
initialise_buffer(transmitbuf *buff)
{
- memset((char *) buff, 0, sizeof(transmitbuf));
-
- buff->wsabuf.len = 0;
- buff->wsabuf.buf = (char *) &buff->pkt;
+ memset(buff, 0, sizeof(*buff));
}
static void
transmitbuf_t *buf;
int i;
- buf = (transmitbuf_t *) emalloc(nbufs*sizeof(transmitbuf_t));
+ buf = emalloc(nbufs * sizeof(*buf));
for (i = 0; i < nbufs; i++)
{
initialise_buffer(buf);
}
/* Initialize random file before OpenSSL checks */
- if(!init_randfile())
+ if (!init_randfile())
msyslog(LOG_ERR, "Unable to initialize .rnd file\n");
+#pragma warning(push)
+#pragma warning(disable: 4127) /* conditional expression is constant */
+
+ if (SIZEOF_TIME_T != sizeof(time_t)
+ || SIZEOF_INT != sizeof(int)
+ || SIZEOF_SIGNED_CHAR != sizeof(char)) {
+
+ DPRINTF(1, ("config.h SIZEOF_* macros wrong\n"));
+ exit(1);
+ }
+
+#pragma warning(pop)
+
/*
* Get privileges needed for fiddling with the clock
*/
#include <stddef.h>
#include <stdio.h>
#include <process.h>
+#include <syslog.h>
+
#include "ntp_stdlib.h"
-#include "syslog.h"
#include "ntp_machine.h"
#include "ntp_fp.h"
#include "ntp.h"
#include "ntp_iocompletionport.h"
#include "transmitbuff.h"
#include "ntp_request.h"
+#include "ntp_assert.h"
#include "clockstuff.h"
#include "ntp_io.h"
#include "clockstuff.h"
transmitbuf_t *
get_trans_buf()
{
- transmitbuf_t *tb = (transmitbuf_t *) emalloc(sizeof(transmitbuf_t));
- tb->wsabuf.len = 0;
- tb->wsabuf.buf = (char *) &tb->pkt;
+ transmitbuf_t *tb = emalloc(sizeof(*tb));
return (tb);
}
rc = ReadFile(
(HANDLE)buff->fd,
- buff->wsabuff.buf,
- buff->wsabuff.len,
- &buff->wsabuff.len,
- (LPOVERLAPPED) lpo);
+ buff->recv_buffer,
+ sizeof(buff->recv_buffer),
+ NULL,
+ (LPOVERLAPPED)lpo);
if (!rc && ERROR_IO_PENDING != GetLastError()) {
msyslog(LOG_ERR, "Can't read from Refclock: %m");
IoCompletionInfo *lpo;
recvbuf_t *buff;
- if (NULL == CreateIoCompletionPort((HANDLE)_get_osfhandle(rio->fd), hIoCompletionPort, (ULONG_PTR) rio, 0)) {
+ if (NULL == CreateIoCompletionPort(
+ (HANDLE)_get_osfhandle(rio->fd),
+ hIoCompletionPort,
+ (ULONG_PTR)rio,
+ 0)) {
msyslog(LOG_ERR, "Can't add COM port to i/o completion port: %m");
return 1;
}
- lpo = (IoCompletionInfo *) GetHeapAlloc("io_completion_port_add_clock_io");
- if (lpo == NULL)
- {
+ lpo = GetHeapAlloc("io_completion_port_add_clock_io");
+ if (NULL == lpo) {
msyslog(LOG_ERR, "Can't allocate heap for completion port: %m");
return 1;
}
* Queue a receiver on a socket. Returns 0 if no buffer can be queued
*
* Note: As per the winsock documentation, we use WSARecvFrom. Using
- * ReadFile() is less efficient.
+ * ReadFile() is less efficient.
*/
-static unsigned long QueueSocketRecv(SOCKET s, recvbuf_t *buff, IoCompletionInfo *lpo) {
-
- int AddrLen;
+static unsigned long
+QueueSocketRecv(
+ SOCKET s,
+ recvbuf_t *buff,
+ IoCompletionInfo *lpo
+ )
+{
+ WSABUF wsabuf;
+ DWORD Flags;
+ DWORD Result;
lpo->request_type = SOCK_RECV;
lpo->recv_buf = buff;
if (buff != NULL) {
- DWORD BytesReceived = 0;
- DWORD Flags = 0;
+ Flags = 0;
buff->fd = s;
- AddrLen = sizeof(struct sockaddr_in);
- buff->src_addr_len = sizeof(struct sockaddr);
-
- if (SOCKET_ERROR == WSARecvFrom(buff->fd, &buff->wsabuff, 1,
- &BytesReceived, &Flags,
- (struct sockaddr *) &buff->recv_srcadr, (LPINT) &buff->src_addr_len,
- (LPOVERLAPPED) lpo, NULL)) {
- DWORD Result = WSAGetLastError();
+ buff->recv_srcadr_len = sizeof(buff->recv_srcadr);
+ wsabuf.buf = (char *)buff->recv_buffer;
+ wsabuf.len = sizeof(buff->recv_buffer);
+
+ if (SOCKET_ERROR == WSARecvFrom(buff->fd, &wsabuf, 1,
+ NULL, &Flags,
+ &buff->recv_srcadr.sa,
+ &buff->recv_srcadr_len,
+ (LPOVERLAPPED)lpo, NULL)) {
+ Result = GetLastError();
switch (Result) {
case NO_ERROR :
case WSA_IO_PENDING :
break ;
case WSAENOTSOCK :
- netsyslog(LOG_ERR, "Can't read from socket, because it isn't a socket: %m");
+ msyslog(LOG_ERR, "Can't read from non-socket fd %d: %m", (int)buff->fd);
/* return the buffer */
freerecvbuf(buff);
return 0;
break;
case WSAEFAULT :
- netsyslog(LOG_ERR, "The buffers parameter is incorrect: %m");
+ msyslog(LOG_ERR, "The buffers parameter is incorrect: %m");
/* return the buffer */
freerecvbuf(buff);
return 0;
get_systime(&arrival_time);
- /* Convert the overlapped pointer back to a recvbuf pointer.
- */
-
- /*
- * Check returned structures
- */
- if (lpo == NULL)
- return (1); /* Nothing to do */
+ NTP_REQUIRE(NULL != lpo);
+ NTP_REQUIRE(NULL != lpo->recv_buf);
- buff = lpo->recv_buf;
/*
- * Make sure we have a buffer
+ * Convert the overlapped pointer back to a recvbuf pointer.
*/
- if (buff == NULL) {
- return (1);
- }
+ buff = lpo->recv_buf;
/*
* If the socket is closed we get an Operation Aborted error
return (1);
}
-
/*
* Get a new recv buffer for the replacement socket receive
*/
newbuff = get_free_recv_buffer_alloc();
QueueSocketRecv(inter->fd, newbuff, lpo);
-#ifdef DEBUG
- if(debug > 3 && get_packet_mode(buff) == MODE_BROADCAST)
- printf("****Accepting Broadcast packet on fd %d from %s\n", buff->fd, stoa(&buff->recv_srcadr));
-#endif
- ignore_this = inter->ignore_packets;
-#ifdef DEBUG
- if (debug > 3)
- printf(" Packet mode is %d\n", get_packet_mode(buff));
-#endif
+ DPRINTF(4, ("%sfd %d %s recv packet mode is %d\n",
+ (MODE_BROADCAST == get_packet_mode(buff))
+ ? " **** Broadcast "
+ : "",
+ (int)buff->fd, stoa(&buff->recv_srcadr),
+ get_packet_mode(buff)));
+
/*
* If we keep it add some info to the structure
*/
- if (Bytes > 0 && ignore_this == ISC_FALSE) {
+ if (Bytes && !inter->ignore_packets) {
memcpy(&buff->recv_time, &arrival_time, sizeof buff->recv_time);
buff->recv_length = (int) Bytes;
buff->receiver = receive;
buff->dstadr = inter;
-#ifdef DEBUG
- if (debug > 1)
- printf("Received %d bytes of fd %d in buffer %x from %s\n", Bytes, buff->fd, buff, stoa(&buff->recv_srcadr));
-#endif
+
+ DPRINTF(2, ("Received %d bytes fd %d in buffer %p from %s\n",
+ Bytes, (int)buff->fd, buff, stoa(&buff->recv_srcadr)));
+
packets_received++;
inter->received++;
add_full_recv_buffer(buff);
int n;
if (fd != INVALID_SOCKET) {
- if (NULL == CreateIoCompletionPort((HANDLE) fd, hIoCompletionPort,
- (DWORD) inter, 0)) {
+ if (NULL == CreateIoCompletionPort((HANDLE)fd,
+ hIoCompletionPort, (ULONG_PTR)inter, 0)) {
msyslog(LOG_ERR, "Can't add socket to i/o completion port: %m");
return 1;
}
struct interface *inter,
struct pkt *pkt,
int len,
- struct sockaddr_storage* dest)
+ sockaddr_u* dest)
{
- transmitbuf_t *buff = NULL;
+ WSABUF wsabuf;
+ transmitbuf_t *buff;
DWORD Result = ERROR_SUCCESS;
int errval;
int AddrLen;
IoCompletionInfo *lpo;
- DWORD BytesSent = 0;
- DWORD Flags = 0;
+ DWORD Flags;
lpo = (IoCompletionInfo *) GetHeapAlloc("io_completion_port_sendto");
}
-
memcpy(&buff->pkt, pkt, len);
- buff->wsabuf.buf = buff->pkt;
- buff->wsabuf.len = len;
+ wsabuf.buf = buff->pkt;
+ wsabuf.len = len;
- AddrLen = sizeof(struct sockaddr_in);
+ AddrLen = SOCKLEN(dest);
lpo->request_type = SOCK_SEND;
lpo->trans_buf = buff;
+ Flags = 0;
- Result = WSASendTo(inter->fd, &buff->wsabuf, 1, &BytesSent, Flags, (struct sockaddr *) dest, AddrLen, (LPOVERLAPPED) lpo, NULL);
+ Result = WSASendTo(inter->fd, &wsabuf, 1, NULL, Flags,
+ &dest->sa, AddrLen,
+ (LPOVERLAPPED)lpo, NULL);
if(Result == SOCKET_ERROR)
{
RelativePath="..\..\..\ntpd\ntp_scanner.c"
>
</File>
+ <File
+ RelativePath="..\..\..\ntpd\ntp_signd.c"
+ >
+ </File>
<File
RelativePath="..\..\..\ntpd\ntp_timer.c"
>
RelativePath="..\..\..\include\ntp_malloc.h"
>
</File>
+ <File
+ RelativePath="..\..\..\include\ntp_net.h"
+ >
+ </File>
<File
RelativePath="..\..\..\ntpd\ntp_parser.h"
>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
- ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
Name="Header Files"
Filter="h;hpp;hxx;hm;inl"
>
+ <File
+ RelativePath="..\include\config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\isc\net.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\include\ntp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\include\ntp_fp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\include\ntp_io.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\include\ntp_machine.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\include\ntp_net.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\include\ntp_select.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\include\ntp_stdlib.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\include\ntp_string.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\include\ntp_syslog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\include\ntp_unixtime.h"
+ >
+ </File>
<File
RelativePath="..\..\..\ntpdate\ntpdate.h"
>
</File>
+ <File
+ RelativePath="..\include\syslog.h"
+ >
+ </File>
</Filter>
<Filter
Name="Resource Files"