summaryrefslogtreecommitdiffhomepage
path: root/networking
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2016-03-04 07:06:53 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2016-03-04 07:06:53 +0100
commitf37f28199f508f5fee44753d320f044a91e76e39 (patch)
treee2e06a1faa1617dda7d14ed3b43a2ab826dc7a9f /networking
parent4c48a6474701d8b396a14213ebcc979a49187faf (diff)
ntpd: do not use a peer more than once (say, if two peers resolve to the same IP)
function old new delta add_peers 98 166 +68 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking')
-rw-r--r--networking/ntpd.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/networking/ntpd.c b/networking/ntpd.c
index 4695c3366..517806e75 100644
--- a/networking/ntpd.c
+++ b/networking/ntpd.c
@@ -727,7 +727,7 @@ reset_peer_stats(peer_t *p, double offset)
/* Used to set p->filter_datapoint[i].d_dispersion = MAXDISP
* and clear reachable bits, but this proved to be too agressive:
- * after step (tested with suspinding laptop for ~30 secs),
+ * after step (tested with suspending laptop for ~30 secs),
* this caused all previous data to be considered invalid,
* making us needing to collect full ~8 datapoins per peer
* after step in order to start trusting them.
@@ -766,11 +766,26 @@ reset_peer_stats(peer_t *p, double offset)
static void
add_peers(const char *s)
{
+ llist_t *item;
peer_t *p;
p = xzalloc(sizeof(*p));
p->p_lsa = xhost2sockaddr(s, 123);
p->p_dotted = xmalloc_sockaddr2dotted_noport(&p->p_lsa->u.sa);
+
+ /* Names like N.<country2chars>.pool.ntp.org are randomly resolved
+ * to a pool of machines. Sometimes different N's resolve to the same IP.
+ * It is not useful to have two peers with same IP. We skip duplicates.
+ */
+ for (item = G.ntp_peers; item != NULL; item = item->link) {
+ peer_t *pp = (peer_t *) item->data;
+ if (strcmp(p->p_dotted, pp->p_dotted) == 0) {
+ bb_error_msg("duplicate peer %s (%s)", s, p->p_dotted);
+ free(p);
+ return;
+ }
+ }
+
p->p_fd = -1;
p->p_xmt_msg.m_status = MODE_CLIENT | (NTP_VERSION << 3);
p->next_action_time = G.cur_time; /* = set_next(p, 0); */