]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
ippeerlimt: hook in ip_count support
authorHarlan Stenn <stenn@ntp.org>
Wed, 17 Jan 2018 04:06:43 +0000 (20:06 -0800)
committerHarlan Stenn <stenn@ntp.org>
Wed, 17 Jan 2018 04:06:43 +0000 (20:06 -0800)
bk: 5a5ecbd3TlxNJ-4bhpgNPrNnk0qyRA

include/ntpd.h
ntpd/ntp_config.c
ntpd/ntp_peer.c
ntpd/ntp_proto.c
ntpd/ntp_refclock.c
ntpd/ntp_request.c

index b059658686e1beefae94841d31c20e26158449b3..0de7f04e9dcfbc33d2c9ca572b64a989534f8468 100644 (file)
@@ -168,7 +168,7 @@ extern      void    mon_clearinterface(endpt *interface);
 /* ntp_peer.c */
 extern void    init_peer       (void);
 extern struct peer *findexistingpeer(sockaddr_u *, const char *,
-                                     struct peer *, int, u_char);
+                                     struct peer *, int, u_char, int *);
 extern struct peer *findpeer   (struct recvbuf *, int, int *);
 extern struct peer *findpeerbyassoc(associd_t);
 extern  void   set_peerdstadr  (struct peer *, endpt *);
index 477c40c37f572e12ad4da352e462b088d8d28731..eae51909fbd4665af8e70b5be6aa4e0cfcc97d36 100644 (file)
@@ -4210,7 +4210,7 @@ config_unpeers(
                if (rc > 0) {
                        DPRINTF(1, ("unpeer: searching for %s\n",
                                    stoa(&peeraddr)));
-                       p = findexistingpeer(&peeraddr, NULL, NULL, -1, 0);
+                       p = findexistingpeer(&peeraddr, NULL, NULL, -1, 0, NULL);
                        if (p != NULL) {
                                msyslog(LOG_NOTICE, "unpeered %s",
                                        stoa(&peeraddr));
@@ -4290,7 +4290,7 @@ unpeer_name_resolved(
                memcpy(&peeraddr, res->ai_addr, res->ai_addrlen);
                DPRINTF(1, ("unpeer: searching for peer %s\n",
                            stoa(&peeraddr)));
-               peer = findexistingpeer(&peeraddr, NULL, NULL, -1, 0);
+               peer = findexistingpeer(&peeraddr, NULL, NULL, -1, 0, NULL);
                if (peer != NULL) {
                        af = AF(&peeraddr);
                        fam_spec = (AF_INET6 == af)
index a296ea7dd32fcf15aae020169e206f536c27f73d..ed7bd904e7cb16580bbf378d8a6982f3dc515ba1 100644 (file)
@@ -117,7 +117,7 @@ static struct peer *        findexistingpeer_name(const char *, u_short,
                                              struct peer *, int);
 static struct peer *   findexistingpeer_addr(sockaddr_u *,
                                              struct peer *, int,
-                                             u_char);
+                                             u_char, int *);
 static void            free_peer(struct peer *, int);
 static void            getmorepeermem(void);
 static int             score(struct peer *);
@@ -203,17 +203,18 @@ findexistingpeer_addr(
        sockaddr_u *    addr,
        struct peer *   start_peer,
        int             mode,
-       u_char          cast_flags
+       u_char          cast_flags,
+       int *           ip_count
        )
 {
        struct peer *peer;
 
-       DPRINTF(2, ("findexistingpeer_addr(%s, %s, %d, 0x%x)\n",
+       DPRINTF(2, ("findexistingpeer_addr(%s, %s, %d, 0x%x, %p)\n",
                sptoa(addr),
                (start_peer)
                    ? sptoa(&start_peer->srcadr)
                    : "NULL",
-               mode, (u_int)cast_flags));
+               mode, (u_int)cast_flags, ip_count));
 
        /*
         * start_peer is included so we can locate instances of the
@@ -234,6 +235,11 @@ findexistingpeer_addr(
                DPRINTF(3, ("%s %s %d %d 0x%x 0x%x ", sptoa(addr),
                        sptoa(&peer->srcadr), mode, peer->hmode,
                        (u_int)cast_flags, (u_int)peer->cast_flags));
+               if (ip_count) {
+                       if (SOCK_EQ(addr, &peer->srcadr)) {
+                               (*ip_count)++;
+                       }
+               }
                if ((-1 == mode || peer->hmode == mode ||
                     ((MDF_BCLNT & peer->cast_flags) &&
                      (MDF_BCLNT & cast_flags))) &&
@@ -258,7 +264,8 @@ findexistingpeer(
        const char *    hostname,
        struct peer *   start_peer,
        int             mode,
-       u_char          cast_flags
+       u_char          cast_flags,
+       int *           ip_count
        )
 {
        if (hostname != NULL)
@@ -266,7 +273,7 @@ findexistingpeer(
                                             start_peer, mode);
        else
                return findexistingpeer_addr(addr, start_peer, mode,
-                                            cast_flags);
+                                            cast_flags, ip_count);
 }
 
 
@@ -766,6 +773,8 @@ newpeer(
 {
        struct peer *   peer;
        u_int           hash;
+       int             ip_count = 0;
+
 
        DEBUG_REQUIRE(srcadr);
 
@@ -799,11 +808,11 @@ newpeer(
         */
        if (dstadr != NULL) {
                peer = findexistingpeer(srcadr, hostname, NULL, hmode,
-                                       cast_flags);
+                                       cast_flags, &ip_count);
                while (peer != NULL) {
-                       if (peer->dstadr == dstadr ||
-                           ((MDF_BCLNT & cast_flags) &&
-                            (MDF_BCLNT & peer->cast_flags)))
+                       if (   peer->dstadr == dstadr
+                           || (   (MDF_BCLNT & cast_flags)
+                               && (MDF_BCLNT & peer->cast_flags)))
                                break;
 
                        if (dstadr == ANY_INTERFACE_CHOOSE(srcadr) &&
@@ -811,12 +820,12 @@ newpeer(
                                break;
 
                        peer = findexistingpeer(srcadr, hostname, peer,
-                                               hmode, cast_flags);
+                                               hmode, cast_flags, &ip_count);
                }
        } else {
                /* no endpt address given */
                peer = findexistingpeer(srcadr, hostname, NULL, hmode,
-                                       cast_flags);
+                                       cast_flags, &ip_count);
        }
 
        /*
@@ -833,6 +842,12 @@ newpeer(
                return NULL;
        }
 
+DPRINTF(1, ("newpeer(%s) found no existing and %d other associations\n",
+               (hostname)
+                   ? hostname
+                   : stoa(srcadr),
+               ip_count));
+
        /*
         * Allocate a new peer structure. Some dirt here, since some of
         * the initialization requires knowlege of our system state.
index ab2f936e2914bc6de8b7bffc39099f951d73081a..b6685caa10d2afebb188d4535ce14eb9faffef0e 100644 (file)
@@ -631,15 +631,15 @@ receive(
        }
        restrict_mask = restrictions(&rbufp->recv_srcadr);
        pkt = &rbufp->recv_pkt;
-       DPRINTF(2, ("receive: at %ld %s<-%s flags %x restrict %03x org %#010x.%08x xmt %#010x.%08x\n",
-                   current_time, stoa(&rbufp->dstadr->sin),
-                   stoa(&rbufp->recv_srcadr), rbufp->dstadr->flags,
-                   restrict_mask, ntohl(pkt->org.l_ui), ntohl(pkt->org.l_uf),
-                   ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf)));
        hisversion = PKT_VERSION(pkt->li_vn_mode);
        hisleap = PKT_LEAP(pkt->li_vn_mode);
        hismode = (int)PKT_MODE(pkt->li_vn_mode);
        hisstratum = PKT_TO_STRATUM(pkt->stratum);
+       DPRINTF(2, ("receive: at %ld %s<-%s mode %d flags %x restrict %03x org %#010x.%08x xmt %#010x.%08x\n",
+                   current_time, stoa(&rbufp->dstadr->sin),
+                   stoa(&rbufp->recv_srcadr), hismode, rbufp->dstadr->flags,
+                   restrict_mask, ntohl(pkt->org.l_ui), ntohl(pkt->org.l_uf),
+                   ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf)));
 
        /* See basic mode and broadcast checks, below */
        INSIST(0 != hisstratum);
@@ -4394,7 +4394,7 @@ pool_xmit(
                /* copy_addrinfo_list ai_addr points to a sockaddr_u */
                rmtadr = (sockaddr_u *)(void *)pool->ai->ai_addr;
                pool->ai = pool->ai->ai_next;
-               p = findexistingpeer(rmtadr, NULL, NULL, MODE_CLIENT, 0);
+               p = findexistingpeer(rmtadr, NULL, NULL, MODE_CLIENT, 0, NULL);
        } while (p != NULL && pool->ai != NULL);
        if (p != NULL)
                return; /* out of addresses, re-query DNS next poll */
index 94b35d43d6e879cb9f503df6035c32e581eb788a..a0dbd4ca83b6ce59ab39c184ee495b9405a66327 100644 (file)
@@ -1044,7 +1044,7 @@ refclock_control(
        clktype = (u_char)REFCLOCKTYPE(srcadr);
        unit = REFCLOCKUNIT(srcadr);
 
-       peer = findexistingpeer(srcadr, NULL, NULL, -1, 0);
+       peer = findexistingpeer(srcadr, NULL, NULL, -1, 0, NULL);
 
        if (NULL == peer)
                return;
@@ -1155,7 +1155,7 @@ refclock_buginfo(
        clktype = (u_char) REFCLOCKTYPE(srcadr);
        unit = REFCLOCKUNIT(srcadr);
 
-       peer = findexistingpeer(srcadr, NULL, NULL, -1, 0);
+       peer = findexistingpeer(srcadr, NULL, NULL, -1, 0, NULL);
 
        if (NULL == peer || NULL == peer->procptr)
                return;
index 894c4d02188ec56b4eaae297cf2c7cae8ed8969c..1636fdc35d065edc79d18a6341d269158aa7a204 100644 (file)
@@ -838,7 +838,7 @@ peer_info (
 #endif
                datap += item_sz;
 
-               pp = findexistingpeer(&addr, NULL, NULL, -1, 0);
+               pp = findexistingpeer(&addr, NULL, NULL, -1, 0, NULL);
                if (NULL == pp)
                        continue;
                if (IS_IPV6(srcadr)) {
@@ -982,7 +982,7 @@ peer_stats (
 
                datap += item_sz;
 
-               pp = findexistingpeer(&addr, NULL, NULL, -1, 0);
+               pp = findexistingpeer(&addr, NULL, NULL, -1, 0, NULL);
                if (NULL == pp)
                        continue;
 
@@ -1452,7 +1452,7 @@ do_unconf(
                        p = NULL;
                        do {
                                p = findexistingpeer(
-                                       &peeraddr, NULL, p, -1, 0);
+                                       &peeraddr, NULL, p, -1, 0, NULL);
                        } while (p && !(FLAG_CONFIG & p->flags));
                        
                        if (!loops && !p) {
@@ -1979,7 +1979,7 @@ reset_peer(
 #ifdef ISC_PLATFORM_HAVESALEN
                peeraddr.sa.sa_len = SOCKLEN(&peeraddr);
 #endif
-               p = findexistingpeer(&peeraddr, NULL, NULL, -1, 0);
+               p = findexistingpeer(&peeraddr, NULL, NULL, -1, 0, NULL);
                if (NULL == p)
                        bad++;
                datap += item_sz;
@@ -2012,10 +2012,10 @@ reset_peer(
 #ifdef ISC_PLATFORM_HAVESALEN
                peeraddr.sa.sa_len = SOCKLEN(&peeraddr);
 #endif
-               p = findexistingpeer(&peeraddr, NULL, NULL, -1, 0);
+               p = findexistingpeer(&peeraddr, NULL, NULL, -1, 0, NULL);
                while (p != NULL) {
                        peer_reset(p);
-                       p = findexistingpeer(&peeraddr, NULL, p, -1, 0);
+                       p = findexistingpeer(&peeraddr, NULL, p, -1, 0, NULL);
                }
                datap += item_sz;
        }
@@ -2496,7 +2496,7 @@ get_clock_info(
        while (items-- > 0 && ic) {
                NSRCADR(&addr) = *clkaddr++;
                if (!ISREFCLOCKADR(&addr) || NULL ==
-                   findexistingpeer(&addr, NULL, NULL, -1, 0)) {
+                   findexistingpeer(&addr, NULL, NULL, -1, 0, NULL)) {
                        req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
                        return;
                }
@@ -2560,7 +2560,7 @@ set_clock_fudge(
 #endif
                SET_PORT(&addr, NTP_PORT);
                if (!ISREFCLOCKADR(&addr) || NULL ==
-                   findexistingpeer(&addr, NULL, NULL, -1, 0)) {
+                   findexistingpeer(&addr, NULL, NULL, -1, 0, NULL)) {
                        req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
                        return;
                }
@@ -2635,7 +2635,7 @@ get_clkbug_info(
        while (items-- > 0 && ic) {
                NSRCADR(&addr) = *clkaddr++;
                if (!ISREFCLOCKADR(&addr) || NULL ==
-                   findexistingpeer(&addr, NULL, NULL, -1, 0)) {
+                   findexistingpeer(&addr, NULL, NULL, -1, 0, NULL)) {
                        req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
                        return;
                }