*/
peer_crypto_clear(peer);
- /*
- * when the interface changes we drop back
- * to polling intervals as being used at
- * association initialization
- */
- peer_reset_pollinterval(peer);
-
if (peer->dstadr != NULL)
{
ISC_LIST_APPEND(peer->dstadr->peers, peer, ilink);
}
}
-void
-peer_reset_pollinterval(struct peer *peer)
-{
- if (peer)
- {
- int last_hpoll = peer->hpoll;
-
- if (peer->flags & FLAG_REFCLOCK) /* refclocks are exempt from forced poll_update() */
- return;
-
- DPRINTF(1, ("resetting poll interval for peer %s\n", stoa(&peer->srcadr)));
-
- poll_update(peer, peer->minpoll);
-
- if (peer->hpoll != last_hpoll)
- {
- msyslog(LOG_INFO, "peer %s poll interval re-set", stoa(&peer->srcadr));
- }
- }
- else
- {
- int n;
- struct peer * cpeer;
- struct peer * next_peer;
-
- for (n = 0; n < NTP_HASH_SIZE; n++) {
- for (cpeer = peer_hash[n]; cpeer != 0; cpeer = next_peer) {
- next_peer = cpeer->next;
- peer_reset_pollinterval(cpeer);
- }
- }
- }
-}
-
/*
* find an interface suitable for the src address
static void get_ctl_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
static void get_if_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
static void do_if_reload P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
-static void do_reset_pollinterval P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
#ifdef KERNEL_PLL
static void get_kernel_info P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
#endif /* KERNEL_PLL */
#endif
{ REQ_IF_STATS, AUTH, 0, 0, get_if_stats },
{ REQ_IF_RELOAD, AUTH, 0, 0, do_if_reload },
- { REQ_POLLRESET, AUTH, v4sizeof(struct conf_unpeer),
- sizeof(struct conf_unpeer), do_reset_pollinterval },
{ NO_REQUEST, NOAUTH, 0, 0, 0 }
};
flush_pkt();
}
-/*
- * do_reset_pollinterval
- */
-static void
-do_reset_pollinterval(
- struct sockaddr_storage *srcadr,
- struct interface *inter,
- struct req_pkt *inpkt
- )
-{
- register struct conf_unpeer *cp;
- struct conf_unpeer temp_cp;
- register int items;
- register struct peer *peer;
- struct sockaddr_storage peeraddr;
- int bad, found;
-
- /*
- * This is a bit unstructured, but I like to be careful.
- * We check to see that every peer exists and is actually
- * configured. If so, we reset the poll interval. If not, we return
- * an error.
- */
- items = INFO_NITEMS(inpkt->err_nitems);
- cp = (struct conf_unpeer *)inpkt->data;
-
- bad = 0;
- while (items-- > 0 && !bad) {
- 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;
- } else {
- peeraddr.ss_family = AF_INET;
- GET_INADDR(peeraddr) = temp_cp.peeraddr;
- }
- NSRCPORT(&peeraddr) = htons(NTP_PORT);
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- peeraddr.ss_len = SOCKLEN(&peeraddr);
-#endif
- found = 0;
- peer = (struct peer *)0;
- printf("searching for %s\n", stoa(&peeraddr));
- while (!found) {
- peer = findexistingpeer(&peeraddr, peer, -1);
- if (peer == (struct peer *)0)
- break;
- if (peer->flags & FLAG_CONFIG)
- found = 1;
- }
- if (!found)
- bad = 1;
- cp = (struct conf_unpeer *)
- ((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize));
- }
-
- if (bad) {
- req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
- return;
- }
-
- /*
- * Now do it in earnest.
- */
-
- items = INFO_NITEMS(inpkt->err_nitems);
- if (items)
- {
- cp = (struct conf_unpeer *)inpkt->data;
- while (items-- > 0) {
- 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;
- } else {
- peeraddr.ss_family = AF_INET;
- GET_INADDR(peeraddr) = temp_cp.peeraddr;
- }
- NSRCPORT(&peeraddr) = htons(NTP_PORT);
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
- peeraddr.ss_len = SOCKLEN(&peeraddr);
-#endif
-
- peer = findexistingpeer(&peeraddr, 0, -1);
- while (peer) {
- if (peer->flags & FLAG_CONFIG)
- peer_reset_pollinterval(peer);
- peer = findexistingpeer(&peeraddr, peer, -1);
- }
-
- cp = (struct conf_unpeer *)
- ((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize));
- }
- } else {
- /* do it for all peers */
- peer_reset_pollinterval(NULL);
- }
-
- req_ack(srcadr, inter, inpkt, INFO_OKAY);
-}
static void kerninfo P((struct parse *, FILE *));
static void get_if_stats P((struct parse *, FILE *));
static void do_if_reload P((struct parse *, FILE *));
-static void do_reset_pollinterval P((struct parse *, FILE *));
/*
* Commands we understand. Ntpdc imports this.
{ "ifreload", do_if_reload, { NO, NO, NO, NO },
{ "", "", "", "" },
"reload interface configuration" },
- { "pollreset", do_reset_pollinterval, { OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD },
- { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" },
- "reset poll interval for given peers - all if no peers given" },
-
{ 0, 0, { NO, NO, NO, NO },
{ "", "", "", "" }, "" }
};
sizeof(struct info_if_stats));
iflist(fp, ifs, items, itemsize, res);
}
-
-/*
- * do_reset_pollinterval - re-set poll interval to start value
- */
-static void
-do_reset_pollinterval(
- struct parse *pcmd,
- FILE *fp
- )
-{
- /* 8 is the maximum number of peers which will fit in a packet */
- struct conf_unpeer *pl, plist[min(MAXARGS, 8)];
- int qitems;
- int items;
- int itemsize;
- char *dummy;
- int res;
- int sendsize;
-
-again:
- if (impl_ver == IMPL_XNTPD)
- sendsize = sizeof(struct conf_unpeer);
- else
- 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 (impl_ver == IMPL_XNTPD)
- pl->v6_flag = 0;
- } else {
- if (impl_ver == IMPL_XNTPD_OLD) {
- fprintf(stderr,
- "***Server doesn't understand IPv6 addresses\n");
- return;
- }
- pl->peeraddr6 =
- GET_INADDR6(pcmd->argval[qitems].netnum);
- pl->v6_flag = 1;
- }
- pl = (struct conf_unpeer *)((char *)pl + sendsize);
- }
-
- res = doquery(impl_ver, REQ_POLLRESET, 1, qitems,
- sendsize, (char *)plist, &items,
- &itemsize, &dummy, 0, sizeof(struct conf_unpeer));
-
- if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) {
- impl_ver = IMPL_XNTPD_OLD;
- goto again;
- }
-
- if (res == 0)
- (void) fprintf(fp, "done!\n");
-}