ntp_peer.c revision 330106
1/* 2 * ntp_peer.c - management of data maintained for peer associations 3 */ 4#ifdef HAVE_CONFIG_H 5#include <config.h> 6#endif 7 8#include <stdio.h> 9#include <sys/types.h> 10 11#include "ntpd.h" 12#include "ntp_lists.h" 13#include "ntp_stdlib.h" 14#include "ntp_control.h" 15#include <ntp_random.h> 16 17/* 18 * Table of valid association combinations 19 * --------------------------------------- 20 * 21 * packet->mode 22 * peer->mode | UNSPEC ACTIVE PASSIVE CLIENT SERVER BCAST 23 * ---------- | --------------------------------------------- 24 * NO_PEER | e 1 0 1 1 1 25 * ACTIVE | e 1 1 0 0 0 26 * PASSIVE | e 1 e 0 0 0 27 * CLIENT | e 0 0 0 1 0 28 * SERVER | e 0 0 0 0 0 29 * BCAST | e 0 0 0 0 0 30 * BCLIENT | e 0 0 0 e 1 31 * 32 * One point to note here: a packet in BCAST mode can potentially match 33 * a peer in CLIENT mode, but we that is a special case and we check for 34 * that early in the decision process. This avoids having to keep track 35 * of what kind of associations are possible etc... We actually 36 * circumvent that problem by requiring that the first b(m)roadcast 37 * received after the change back to BCLIENT mode sets the clock. 38 */ 39#define AM_MODES 7 /* number of rows and columns */ 40#define NO_PEER 0 /* action when no peer is found */ 41 42int AM[AM_MODES][AM_MODES] = { 43/* packet->mode */ 44/* peer { UNSPEC, ACTIVE, PASSIVE, CLIENT, SERVER, BCAST } */ 45/* mode */ 46/*NONE*/{ AM_ERR, AM_NEWPASS, AM_NOMATCH, AM_FXMIT, AM_MANYCAST, AM_NEWBCL}, 47 48/*A*/ { AM_ERR, AM_PROCPKT, AM_PROCPKT, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH}, 49 50/*P*/ { AM_ERR, AM_PROCPKT, AM_ERR, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH}, 51 52/*C*/ { AM_ERR, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_PROCPKT, AM_NOMATCH}, 53 54/*S*/ { AM_ERR, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH}, 55 56/*BCST*/{ AM_ERR, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH}, 57 58/*BCL*/ { AM_ERR, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_PROCPKT}, 59}; 60 61#define MATCH_ASSOC(x, y) AM[(x)][(y)] 62 63/* 64 * These routines manage the allocation of memory to peer structures 65 * and the maintenance of three data structures involving all peers: 66 * 67 * - peer_list is a single list with all peers, suitable for scanning 68 * operations over all peers. 69 * - peer_adr_hash is an array of lists indexed by hashed peer address. 70 * - peer_aid_hash is an array of lists indexed by hashed associd. 71 * 72 * They also maintain a free list of peer structures, peer_free. 73 * 74 * The three main entry points are findpeer(), which looks for matching 75 * peer structures in the peer list, newpeer(), which allocates a new 76 * peer structure and adds it to the list, and unpeer(), which 77 * demobilizes the association and deallocates the structure. 78 */ 79/* 80 * Peer hash tables 81 */ 82struct peer *peer_hash[NTP_HASH_SIZE]; /* peer hash table */ 83int peer_hash_count[NTP_HASH_SIZE]; /* peers in each bucket */ 84struct peer *assoc_hash[NTP_HASH_SIZE]; /* association ID hash table */ 85int assoc_hash_count[NTP_HASH_SIZE];/* peers in each bucket */ 86struct peer *peer_list; /* peer structures list */ 87static struct peer *peer_free; /* peer structures free list */ 88int peer_free_count; /* count of free structures */ 89 90/* 91 * Association ID. We initialize this value randomly, then assign a new 92 * value every time an association is mobilized. 93 */ 94static associd_t current_association_ID; /* association ID */ 95static associd_t initial_association_ID; /* association ID */ 96 97/* 98 * Memory allocation watermarks. 99 */ 100#define INIT_PEER_ALLOC 8 /* static preallocation */ 101#define INC_PEER_ALLOC 4 /* add N more when empty */ 102 103/* 104 * Miscellaneous statistic counters which may be queried. 105 */ 106u_long peer_timereset; /* time stat counters zeroed */ 107u_long findpeer_calls; /* calls to findpeer */ 108u_long assocpeer_calls; /* calls to findpeerbyassoc */ 109u_long peer_allocations; /* allocations from free list */ 110u_long peer_demobilizations; /* structs freed to free list */ 111int total_peer_structs; /* peer structs */ 112int peer_associations; /* mobilized associations */ 113int peer_preempt; /* preemptable associations */ 114static struct peer init_peer_alloc[INIT_PEER_ALLOC]; /* init alloc */ 115 116static struct peer * findexistingpeer_name(const char *, u_short, 117 struct peer *, int); 118static struct peer * findexistingpeer_addr(sockaddr_u *, 119 struct peer *, int, 120 u_char, int *); 121static void free_peer(struct peer *, int); 122static void getmorepeermem(void); 123static int score(struct peer *); 124 125 126/* 127 * init_peer - initialize peer data structures and counters 128 * 129 * N.B. We use the random number routine in here. It had better be 130 * initialized prior to getting here. 131 */ 132void 133init_peer(void) 134{ 135 int i; 136 137 /* 138 * Initialize peer free list from static allocation. 139 */ 140 for (i = COUNTOF(init_peer_alloc) - 1; i >= 0; i--) 141 LINK_SLIST(peer_free, &init_peer_alloc[i], p_link); 142 total_peer_structs = COUNTOF(init_peer_alloc); 143 peer_free_count = COUNTOF(init_peer_alloc); 144 145 /* 146 * Initialize our first association ID 147 */ 148 do 149 current_association_ID = ntp_random() & ASSOCID_MAX; 150 while (!current_association_ID); 151 initial_association_ID = current_association_ID; 152} 153 154 155/* 156 * getmorepeermem - add more peer structures to the free list 157 */ 158static void 159getmorepeermem(void) 160{ 161 int i; 162 struct peer *peers; 163 164 peers = eallocarray(INC_PEER_ALLOC, sizeof(*peers)); 165 166 for (i = INC_PEER_ALLOC - 1; i >= 0; i--) 167 LINK_SLIST(peer_free, &peers[i], p_link); 168 169 total_peer_structs += INC_PEER_ALLOC; 170 peer_free_count += INC_PEER_ALLOC; 171} 172 173 174static struct peer * 175findexistingpeer_name( 176 const char * hostname, 177 u_short hname_fam, 178 struct peer * start_peer, 179 int mode 180 ) 181{ 182 struct peer *p; 183 184 if (NULL == start_peer) 185 p = peer_list; 186 else 187 p = start_peer->p_link; 188 for (; p != NULL; p = p->p_link) 189 if (p->hostname != NULL 190 && (-1 == mode || p->hmode == mode) 191 && (AF_UNSPEC == hname_fam 192 || AF_UNSPEC == AF(&p->srcadr) 193 || hname_fam == AF(&p->srcadr)) 194 && !strcasecmp(p->hostname, hostname)) 195 break; 196 return p; 197} 198 199 200static 201struct peer * 202findexistingpeer_addr( 203 sockaddr_u * addr, 204 struct peer * start_peer, 205 int mode, 206 u_char cast_flags, 207 int * ip_count 208 ) 209{ 210 struct peer *peer; 211 212 DPRINTF(2, ("findexistingpeer_addr(%s, %s, %d, 0x%x, %p)\n", 213 sptoa(addr), 214 (start_peer) 215 ? sptoa(&start_peer->srcadr) 216 : "NULL", 217 mode, (u_int)cast_flags, ip_count)); 218 219 /* 220 * start_peer is included so we can locate instances of the 221 * same peer through different interfaces in the hash table. 222 * Without MDF_BCLNT, a match requires the same mode and remote 223 * address. MDF_BCLNT associations start out as MODE_CLIENT 224 * if broadcastdelay is not specified, and switch to 225 * MODE_BCLIENT after estimating the one-way delay. Duplicate 226 * associations are expanded in definition to match any other 227 * MDF_BCLNT with the same srcadr (remote, unicast address). 228 */ 229 if (NULL == start_peer) 230 peer = peer_hash[NTP_HASH_ADDR(addr)]; 231 else 232 peer = start_peer->adr_link; 233 234 while (peer != NULL) { 235 DPRINTF(3, ("%s %s %d %d 0x%x 0x%x ", sptoa(addr), 236 sptoa(&peer->srcadr), mode, peer->hmode, 237 (u_int)cast_flags, (u_int)peer->cast_flags)); 238 if (ip_count) { 239 if (SOCK_EQ(addr, &peer->srcadr)) { 240 (*ip_count)++; 241 } 242 } 243 if ((-1 == mode || peer->hmode == mode || 244 ((MDF_BCLNT & peer->cast_flags) && 245 (MDF_BCLNT & cast_flags))) && 246 ADDR_PORT_EQ(addr, &peer->srcadr)) { 247 DPRINTF(3, ("found.\n")); 248 break; 249 } 250 DPRINTF(3, ("\n")); 251 peer = peer->adr_link; 252 } 253 254 return peer; 255} 256 257 258/* 259 * findexistingpeer - search by address and return a pointer to a peer. 260 */ 261struct peer * 262findexistingpeer( 263 sockaddr_u * addr, 264 const char * hostname, 265 struct peer * start_peer, 266 int mode, 267 u_char cast_flags, 268 int * ip_count 269 ) 270{ 271 if (hostname != NULL) 272 return findexistingpeer_name(hostname, AF(addr), 273 start_peer, mode); 274 else 275 return findexistingpeer_addr(addr, start_peer, mode, 276 cast_flags, ip_count); 277} 278 279 280/* 281 * findpeer - find and return a peer match for a received datagram in 282 * the peer_hash table. 283 * 284 * [Bug 3072] To faciliate a faster reorganisation after routing changes 285 * the original code re-assigned the peer address to be the destination 286 * of the received packet and initiated another round on a mismatch. 287 * Unfortunately this leaves us wide open for a DoS attack where the 288 * attacker directs a packet with forged destination address to us -- 289 * this results in a wrong interface assignment, actually creating a DoS 290 * situation. 291 * 292 * This condition would persist until the next update of the interface 293 * list, but a continued attack would put us out of business again soon 294 * enough. Authentication alone does not help here, since it does not 295 * protect the UDP layer and leaves us open for a replay attack. 296 * 297 * So we do not update the adresses and wait until the next interface 298 * list update does the right thing for us. 299 */ 300struct peer * 301findpeer( 302 struct recvbuf *rbufp, 303 int pkt_mode, 304 int * action 305 ) 306{ 307 struct peer * p; 308 sockaddr_u * srcadr; 309 u_int hash; 310 struct pkt * pkt; 311 l_fp pkt_org; 312 313 findpeer_calls++; 314 srcadr = &rbufp->recv_srcadr; 315 hash = NTP_HASH_ADDR(srcadr); 316 for (p = peer_hash[hash]; p != NULL; p = p->adr_link) { 317 318 /* [Bug 3072] ensure interface of peer matches */ 319 /* [Bug 3356] ... if NOT a broadcast peer! */ 320 if (p->hmode != MODE_BCLIENT && p->dstadr != rbufp->dstadr) 321 continue; 322 323 /* ensure peer source address matches */ 324 if ( ! ADDR_PORT_EQ(srcadr, &p->srcadr)) 325 continue; 326 327 /* If the association matching rules determine that this 328 * is not a valid combination, then look for the next 329 * valid peer association. 330 */ 331 *action = MATCH_ASSOC(p->hmode, pkt_mode); 332 333 /* A response to our manycastclient solicitation might 334 * be misassociated with an ephemeral peer already spun 335 * for the server. If the packet's org timestamp 336 * doesn't match the peer's, check if it matches the 337 * ACST prototype peer's. If so it is a redundant 338 * solicitation response, return AM_ERR to discard it. 339 * [Bug 1762] 340 */ 341 if (MODE_SERVER == pkt_mode && AM_PROCPKT == *action) { 342 pkt = &rbufp->recv_pkt; 343 NTOHL_FP(&pkt->org, &pkt_org); 344 if (!L_ISEQU(&p->aorg, &pkt_org) && 345 findmanycastpeer(rbufp)) 346 *action = AM_ERR; 347 } 348 349 /* if an error was returned, exit back right here. */ 350 if (*action == AM_ERR) 351 return NULL; 352 353 /* if a match is found, we stop our search. */ 354 if (*action != AM_NOMATCH) 355 break; 356 } 357 358 /* If no matching association is found... */ 359 if (NULL == p) 360 *action = MATCH_ASSOC(NO_PEER, pkt_mode); 361 362 return p; 363} 364 365/* 366 * findpeerbyassoc - find and return a peer using his association ID 367 */ 368struct peer * 369findpeerbyassoc( 370 associd_t assoc 371 ) 372{ 373 struct peer *p; 374 u_int hash; 375 376 assocpeer_calls++; 377 hash = assoc & NTP_HASH_MASK; 378 for (p = assoc_hash[hash]; p != NULL; p = p->aid_link) 379 if (assoc == p->associd) 380 break; 381 return p; 382} 383 384 385/* 386 * clear_all - flush all time values for all associations 387 */ 388void 389clear_all(void) 390{ 391 struct peer *p; 392 393 /* 394 * This routine is called when the clock is stepped, and so all 395 * previously saved time values are untrusted. 396 */ 397 for (p = peer_list; p != NULL; p = p->p_link) 398 if (!(MDF_TXONLY_MASK & p->cast_flags)) 399 peer_clear(p, "STEP"); 400 401 DPRINTF(1, ("clear_all: at %lu\n", current_time)); 402} 403 404 405/* 406 * score_all() - determine if an association can be demobilized 407 */ 408int 409score_all( 410 struct peer *peer /* peer structure pointer */ 411 ) 412{ 413 struct peer *speer; 414 int temp, tamp; 415 int x; 416 417 /* 418 * This routine finds the minimum score for all preemptible 419 * associations and returns > 0 if the association can be 420 * demobilized. 421 */ 422 tamp = score(peer); 423 temp = 100; 424 for (speer = peer_list; speer != NULL; speer = speer->p_link) 425 if (speer->flags & FLAG_PREEMPT) { 426 x = score(speer); 427 if (x < temp) 428 temp = x; 429 } 430 DPRINTF(1, ("score_all: at %lu score %d min %d\n", 431 current_time, tamp, temp)); 432 433 if (tamp != temp) 434 temp = 0; 435 436 return temp; 437} 438 439 440/* 441 * score() - calculate preemption score 442 */ 443static int 444score( 445 struct peer *peer /* peer structure pointer */ 446 ) 447{ 448 int temp; 449 450 /* 451 * This routine calculates the premption score from the peer 452 * error bits and status. Increasing values are more cherished. 453 */ 454 temp = 0; 455 if (!(peer->flash & TEST10)) 456 temp++; /* 1 good synch and stratum */ 457 if (!(peer->flash & TEST13)) 458 temp++; /* 2 reachable */ 459 if (!(peer->flash & TEST12)) 460 temp++; /* 3 no loop */ 461 if (!(peer->flash & TEST11)) 462 temp++; /* 4 good distance */ 463 if (peer->status >= CTL_PST_SEL_SELCAND) 464 temp++; /* 5 in the hunt */ 465 if (peer->status != CTL_PST_SEL_EXCESS) 466 temp++; /* 6 not spare tire */ 467 return (temp); /* selection status */ 468} 469 470 471/* 472 * free_peer - internal routine to free memory referred to by a struct 473 * peer and return it to the peer free list. If unlink is 474 * nonzero, unlink from the various lists. 475 */ 476static void 477free_peer( 478 struct peer * p, 479 int unlink_peer 480 ) 481{ 482 struct peer * unlinked; 483 int hash; 484 485 if (unlink_peer) { 486 hash = NTP_HASH_ADDR(&p->srcadr); 487 peer_hash_count[hash]--; 488 489 UNLINK_SLIST(unlinked, peer_hash[hash], p, adr_link, 490 struct peer); 491 if (NULL == unlinked) { 492 peer_hash_count[hash]++; 493 msyslog(LOG_ERR, "peer %s not in address table!", 494 stoa(&p->srcadr)); 495 } 496 497 /* 498 * Remove him from the association hash as well. 499 */ 500 hash = p->associd & NTP_HASH_MASK; 501 assoc_hash_count[hash]--; 502 503 UNLINK_SLIST(unlinked, assoc_hash[hash], p, aid_link, 504 struct peer); 505 if (NULL == unlinked) { 506 assoc_hash_count[hash]++; 507 msyslog(LOG_ERR, 508 "peer %s not in association ID table!", 509 stoa(&p->srcadr)); 510 } 511 512 /* Remove him from the overall list. */ 513 UNLINK_SLIST(unlinked, peer_list, p, p_link, 514 struct peer); 515 if (NULL == unlinked) 516 msyslog(LOG_ERR, "%s not in peer list!", 517 stoa(&p->srcadr)); 518 } 519 520 if (p->hostname != NULL) 521 free(p->hostname); 522 523 if (p->ident != NULL) 524 free(p->ident); 525 526 if (p->addrs != NULL) 527 free(p->addrs); /* from copy_addrinfo_list() */ 528 529 /* Add his corporeal form to peer free list */ 530 ZERO(*p); 531 LINK_SLIST(peer_free, p, p_link); 532 peer_free_count++; 533} 534 535 536/* 537 * unpeer - remove peer structure from hash table and free structure 538 */ 539void 540unpeer( 541 struct peer *peer 542 ) 543{ 544 mprintf_event(PEVNT_DEMOBIL, peer, "assoc %u", peer->associd); 545 restrict_source(&peer->srcadr, 1, 0); 546 set_peerdstadr(peer, NULL); 547 peer_demobilizations++; 548 peer_associations--; 549 if (FLAG_PREEMPT & peer->flags) 550 peer_preempt--; 551#ifdef REFCLOCK 552 /* 553 * If this peer is actually a clock, shut it down first 554 */ 555 if (FLAG_REFCLOCK & peer->flags) 556 refclock_unpeer(peer); 557#endif 558 559 free_peer(peer, TRUE); 560} 561 562 563/* 564 * peer_config - configure a new association 565 */ 566struct peer * 567peer_config( 568 sockaddr_u * srcadr, 569 const char * hostname, 570 endpt * dstadr, 571 int ippeerlimit, 572 u_char hmode, 573 u_char version, 574 u_char minpoll, 575 u_char maxpoll, 576 u_int flags, 577 u_int32 ttl, 578 keyid_t key, 579 const char * ident /* autokey group */ 580 ) 581{ 582 u_char cast_flags; 583 584 /* 585 * We do a dirty little jig to figure the cast flags. This is 586 * probably not the best place to do this, at least until the 587 * configure code is rebuilt. Note only one flag can be set. 588 */ 589 switch (hmode) { 590 case MODE_BROADCAST: 591 if (IS_MCAST(srcadr)) 592 cast_flags = MDF_MCAST; 593 else 594 cast_flags = MDF_BCAST; 595 break; 596 597 case MODE_CLIENT: 598 if (hostname != NULL && SOCK_UNSPEC(srcadr)) 599 cast_flags = MDF_POOL; 600 else if (IS_MCAST(srcadr)) 601 cast_flags = MDF_ACAST; 602 else 603 cast_flags = MDF_UCAST; 604 break; 605 606 default: 607 cast_flags = MDF_UCAST; 608 } 609 610 /* 611 * Mobilize the association and initialize its variables. If 612 * emulating ntpdate, force iburst. For pool and manycastclient 613 * strip FLAG_PREEMPT as the prototype associations are not 614 * themselves preemptible, though the resulting associations 615 * are. 616 */ 617 flags |= FLAG_CONFIG; 618 if (mode_ntpdate) 619 flags |= FLAG_IBURST; 620 if ((MDF_ACAST | MDF_POOL) & cast_flags) 621 flags &= ~FLAG_PREEMPT; 622 return newpeer(srcadr, hostname, dstadr, ippeerlimit, hmode, version, 623 minpoll, maxpoll, flags, cast_flags, ttl, key, ident); 624} 625 626/* 627 * setup peer dstadr field keeping it in sync with the interface 628 * structures 629 */ 630void 631set_peerdstadr( 632 struct peer * p, 633 endpt * dstadr 634 ) 635{ 636 struct peer * unlinked; 637 638 DEBUG_INSIST(p != NULL); 639 640 if (p == NULL) 641 return; 642 643 /* check for impossible or identical assignment */ 644 if (p->dstadr == dstadr) 645 return; 646 647 /* 648 * Don't accept updates to a separate multicast receive-only 649 * endpt while a BCLNT peer is running its unicast protocol. 650 */ 651 if (dstadr != NULL && (FLAG_BC_VOL & p->flags) && 652 (INT_MCASTIF & dstadr->flags) && MODE_CLIENT == p->hmode) { 653 return; 654 } 655 656 /* unlink from list if we have an address prior to assignment */ 657 if (p->dstadr != NULL) { 658 p->dstadr->peercnt--; 659 UNLINK_SLIST(unlinked, p->dstadr->peers, p, ilink, 660 struct peer); 661 msyslog(LOG_INFO, "%s local addr %s -> %s", 662 stoa(&p->srcadr), latoa(p->dstadr), 663 latoa(dstadr)); 664 } 665 666 p->dstadr = dstadr; 667 668 /* link to list if we have an address after assignment */ 669 if (p->dstadr != NULL) { 670 LINK_SLIST(dstadr->peers, p, ilink); 671 dstadr->peercnt++; 672 } 673} 674 675/* 676 * attempt to re-rebind interface if necessary 677 */ 678static void 679peer_refresh_interface( 680 struct peer *p 681 ) 682{ 683 endpt * niface; 684 endpt * piface; 685 686 niface = select_peerinterface(p, &p->srcadr, NULL); 687 688 DPRINTF(4, ( 689 "peer_refresh_interface: %s->%s mode %d vers %d poll %d %d flags 0x%x 0x%x ttl %u key %08x: new interface: ", 690 p->dstadr == NULL ? "<null>" : 691 stoa(&p->dstadr->sin), stoa(&p->srcadr), p->hmode, 692 p->version, p->minpoll, p->maxpoll, p->flags, p->cast_flags, 693 p->ttl, p->keyid)); 694 if (niface != NULL) { 695 DPRINTF(4, ( 696 "fd=%d, bfd=%d, name=%.16s, flags=0x%x, ifindex=%u, sin=%s", 697 niface->fd, niface->bfd, niface->name, 698 niface->flags, niface->ifindex, 699 stoa(&niface->sin))); 700 if (niface->flags & INT_BROADCAST) 701 DPRINTF(4, (", bcast=%s", 702 stoa(&niface->bcast))); 703 DPRINTF(4, (", mask=%s\n", stoa(&niface->mask))); 704 } else { 705 DPRINTF(4, ("<NONE>\n")); 706 } 707 708 piface = p->dstadr; 709 set_peerdstadr(p, niface); 710 if (p->dstadr != NULL) { 711 /* 712 * clear crypto if we change the local address 713 */ 714 if (p->dstadr != piface && !(MDF_ACAST & p->cast_flags) 715 && MODE_BROADCAST != p->pmode) 716 peer_clear(p, "XFAC"); 717 718 /* 719 * Broadcast needs the socket enabled for broadcast 720 */ 721 if (MDF_BCAST & p->cast_flags) 722 enable_broadcast(p->dstadr, &p->srcadr); 723 724 /* 725 * Multicast needs the socket interface enabled for 726 * multicast 727 */ 728 if (MDF_MCAST & p->cast_flags) 729 enable_multicast_if(p->dstadr, &p->srcadr); 730 } 731} 732 733 734/* 735 * refresh_all_peerinterfaces - see that all interface bindings are up 736 * to date 737 */ 738void 739refresh_all_peerinterfaces(void) 740{ 741 struct peer *p; 742 743 /* 744 * this is called when the interface list has changed 745 * give all peers a chance to find a better interface 746 * but only if either they don't have an address already 747 * or if the one they have hasn't worked for a while. 748 */ 749 for (p = peer_list; p != NULL; p = p->p_link) { 750 if (!(p->dstadr && (p->reach & 0x3))) // Bug 2849 XOR 2043 751 peer_refresh_interface(p); 752 } 753} 754 755 756/* 757 * newpeer - initialize a new peer association 758 */ 759struct peer * 760newpeer( 761 sockaddr_u * srcadr, 762 const char * hostname, 763 endpt * dstadr, 764 int ippeerlimit, 765 u_char hmode, 766 u_char version, 767 u_char minpoll, 768 u_char maxpoll, 769 u_int flags, 770 u_char cast_flags, 771 u_int32 ttl, 772 keyid_t key, 773 const char * ident 774 ) 775{ 776 struct peer * peer; 777 u_int hash; 778 int ip_count = 0; 779 780 781 DEBUG_REQUIRE(srcadr); 782 783#ifdef AUTOKEY 784 /* 785 * If Autokey is requested but not configured, complain loudly. 786 */ 787 if (!crypto_flags) { 788 if (key > NTP_MAXKEY) { 789 return (NULL); 790 791 } else if (flags & FLAG_SKEY) { 792 msyslog(LOG_ERR, "Autokey not configured"); 793 return (NULL); 794 } 795 } 796#endif /* AUTOKEY */ 797 798 /* 799 * For now only pool associations have a hostname. 800 */ 801 INSIST(NULL == hostname || (MDF_POOL & cast_flags)); 802 803 /* 804 * First search from the beginning for an association with given 805 * remote address and mode. If an interface is given, search 806 * from there to find the association which matches that 807 * destination. If the given interface is "any", track down the 808 * actual interface, because that's what gets put into the peer 809 * structure. 810 */ 811 if (dstadr != NULL) { 812 peer = findexistingpeer(srcadr, hostname, NULL, hmode, 813 cast_flags, &ip_count); 814 while (peer != NULL) { 815 if ( peer->dstadr == dstadr 816 || ( (MDF_BCLNT & cast_flags) 817 && (MDF_BCLNT & peer->cast_flags))) 818 break; 819 820 if (dstadr == ANY_INTERFACE_CHOOSE(srcadr) && 821 peer->dstadr == findinterface(srcadr)) 822 break; 823 824 peer = findexistingpeer(srcadr, hostname, peer, 825 hmode, cast_flags, &ip_count); 826 } 827 } else { 828 /* no endpt address given */ 829 peer = findexistingpeer(srcadr, hostname, NULL, hmode, 830 cast_flags, &ip_count); 831 } 832 833 /* 834 * If a peer is found, this would be a duplicate and we don't 835 * allow that. This avoids duplicate ephemeral (broadcast/ 836 * multicast) and preemptible (manycast and pool) client 837 * associations. 838 */ 839 if (peer != NULL) { 840 DPRINTF(2, ("newpeer(%s) found existing association\n", 841 (hostname) 842 ? hostname 843 : stoa(srcadr))); 844 return NULL; 845 } 846 847DPRINTF(1, ("newpeer(%s) found no existing and %d other associations\n", 848 (hostname) 849 ? hostname 850 : stoa(srcadr), 851 ip_count)); 852 853 /* Check ippeerlimit wrt ip_count */ 854 if (ippeerlimit > -1) { 855 if (ip_count + 1 > ippeerlimit) { 856 DPRINTF(2, ("newpeer(%s) denied - ippeerlimit %d\n", 857 (hostname) 858 ? hostname 859 : stoa(srcadr), 860 ippeerlimit)); 861 return NULL; 862 } 863 } else { 864 DPRINTF(1, ("newpeer(%s) - ippeerlimit %d ignored\n", 865 (hostname) 866 ? hostname 867 : stoa(srcadr), 868 ippeerlimit)); 869 } 870 871 /* 872 * Allocate a new peer structure. Some dirt here, since some of 873 * the initialization requires knowlege of our system state. 874 */ 875 if (peer_free_count == 0) 876 getmorepeermem(); 877 UNLINK_HEAD_SLIST(peer, peer_free, p_link); 878 INSIST(peer != NULL); 879 peer_free_count--; 880 peer_associations++; 881 if (FLAG_PREEMPT & flags) 882 peer_preempt++; 883 884 /* 885 * Assign an association ID and increment the system variable. 886 */ 887 peer->associd = current_association_ID; 888 if (++current_association_ID == 0) 889 ++current_association_ID; 890 891 peer->srcadr = *srcadr; 892 if (hostname != NULL) 893 peer->hostname = estrdup(hostname); 894 peer->hmode = hmode; 895 peer->version = version; 896 peer->flags = flags; 897 peer->cast_flags = cast_flags; 898 set_peerdstadr(peer, 899 select_peerinterface(peer, srcadr, dstadr)); 900 901 /* 902 * It is an error to set minpoll less than NTP_MINPOLL or to 903 * set maxpoll greater than NTP_MAXPOLL. However, minpoll is 904 * clamped not greater than NTP_MAXPOLL and maxpoll is clamped 905 * not less than NTP_MINPOLL without complaint. Finally, 906 * minpoll is clamped not greater than maxpoll. 907 */ 908 if (minpoll == 0) 909 peer->minpoll = NTP_MINDPOLL; 910 else 911 peer->minpoll = min(minpoll, NTP_MAXPOLL); 912 if (maxpoll == 0) 913 peer->maxpoll = NTP_MAXDPOLL; 914 else 915 peer->maxpoll = max(maxpoll, NTP_MINPOLL); 916 if (peer->minpoll > peer->maxpoll) 917 peer->minpoll = peer->maxpoll; 918 919 if (peer->dstadr != NULL) 920 DPRINTF(3, ("newpeer(%s): using fd %d and our addr %s\n", 921 stoa(srcadr), peer->dstadr->fd, 922 stoa(&peer->dstadr->sin))); 923 else 924 DPRINTF(3, ("newpeer(%s): local interface currently not bound\n", 925 stoa(srcadr))); 926 927 /* 928 * Broadcast needs the socket enabled for broadcast 929 */ 930 if ((MDF_BCAST & cast_flags) && peer->dstadr != NULL) 931 enable_broadcast(peer->dstadr, srcadr); 932 933 /* 934 * Multicast needs the socket interface enabled for multicast 935 */ 936 if ((MDF_MCAST & cast_flags) && peer->dstadr != NULL) 937 enable_multicast_if(peer->dstadr, srcadr); 938 939#ifdef AUTOKEY 940 if (key > NTP_MAXKEY) 941 peer->flags |= FLAG_SKEY; 942#endif /* AUTOKEY */ 943 peer->ttl = ttl; 944 peer->keyid = key; 945 if (ident != NULL) 946 peer->ident = estrdup(ident); 947 peer->precision = sys_precision; 948 peer->hpoll = peer->minpoll; 949 if (cast_flags & MDF_ACAST) 950 peer_clear(peer, "ACST"); 951 else if (cast_flags & MDF_POOL) 952 peer_clear(peer, "POOL"); 953 else if (cast_flags & MDF_MCAST) 954 peer_clear(peer, "MCST"); 955 else if (cast_flags & MDF_BCAST) 956 peer_clear(peer, "BCST"); 957 else 958 peer_clear(peer, "INIT"); 959 if (mode_ntpdate) 960 peer_ntpdate++; 961 962 /* 963 * Note time on statistics timers. 964 */ 965 peer->timereset = current_time; 966 peer->timereachable = current_time; 967 peer->timereceived = current_time; 968 969 if (ISREFCLOCKADR(&peer->srcadr)) { 970#ifdef REFCLOCK 971 /* 972 * We let the reference clock support do clock 973 * dependent initialization. This includes setting 974 * the peer timer, since the clock may have requirements 975 * for this. 976 */ 977 if (maxpoll == 0) 978 peer->maxpoll = peer->minpoll; 979 if (!refclock_newpeer(peer)) { 980 /* 981 * Dump it, something screwed up 982 */ 983 set_peerdstadr(peer, NULL); 984 free_peer(peer, 0); 985 return NULL; 986 } 987#else /* REFCLOCK */ 988 msyslog(LOG_ERR, "refclock %s isn't supported. ntpd was compiled without refclock support.", 989 stoa(&peer->srcadr)); 990 set_peerdstadr(peer, NULL); 991 free_peer(peer, 0); 992 return NULL; 993#endif /* REFCLOCK */ 994 } 995 996 /* 997 * Put the new peer in the hash tables. 998 */ 999 hash = NTP_HASH_ADDR(&peer->srcadr); 1000 LINK_SLIST(peer_hash[hash], peer, adr_link); 1001 peer_hash_count[hash]++; 1002 hash = peer->associd & NTP_HASH_MASK; 1003 LINK_SLIST(assoc_hash[hash], peer, aid_link); 1004 assoc_hash_count[hash]++; 1005 LINK_SLIST(peer_list, peer, p_link); 1006 1007 restrict_source(&peer->srcadr, 0, 0); 1008 mprintf_event(PEVNT_MOBIL, peer, "assoc %d", peer->associd); 1009 DPRINTF(1, ("newpeer: %s->%s mode %u vers %u poll %u %u flags 0x%x 0x%x ttl %u key %08x\n", 1010 latoa(peer->dstadr), stoa(&peer->srcadr), peer->hmode, 1011 peer->version, peer->minpoll, peer->maxpoll, peer->flags, 1012 peer->cast_flags, peer->ttl, peer->keyid)); 1013 return peer; 1014} 1015 1016 1017/* 1018 * peer_clr_stats - clear peer module statistics counters 1019 */ 1020void 1021peer_clr_stats(void) 1022{ 1023 findpeer_calls = 0; 1024 assocpeer_calls = 0; 1025 peer_allocations = 0; 1026 peer_demobilizations = 0; 1027 peer_timereset = current_time; 1028} 1029 1030 1031/* 1032 * peer_reset - reset statistics counters 1033 */ 1034void 1035peer_reset( 1036 struct peer *peer 1037 ) 1038{ 1039 if (peer == NULL) 1040 return; 1041 1042 peer->timereset = current_time; 1043 peer->sent = 0; 1044 peer->received = 0; 1045 peer->processed = 0; 1046 peer->badauth = 0; 1047 peer->bogusorg = 0; 1048 peer->oldpkt = 0; 1049 peer->seldisptoolarge = 0; 1050 peer->selbroken = 0; 1051} 1052 1053 1054/* 1055 * peer_all_reset - reset all peer statistics counters 1056 */ 1057void 1058peer_all_reset(void) 1059{ 1060 struct peer *peer; 1061 1062 for (peer = peer_list; peer != NULL; peer = peer->p_link) 1063 peer_reset(peer); 1064} 1065 1066 1067/* 1068 * findmanycastpeer - find and return a manycastclient or pool 1069 * association matching a received response. 1070 */ 1071struct peer * 1072findmanycastpeer( 1073 struct recvbuf *rbufp /* receive buffer pointer */ 1074 ) 1075{ 1076 struct peer *peer; 1077 struct pkt *pkt; 1078 l_fp p_org; 1079 1080 /* 1081 * This routine is called upon arrival of a server-mode response 1082 * to a manycastclient multicast solicitation, or to a pool 1083 * server unicast solicitation. Search the peer list for a 1084 * manycastclient association where the last transmit timestamp 1085 * matches the response packet's originate timestamp. There can 1086 * be multiple manycastclient associations, or multiple pool 1087 * solicitation assocations, so this assumes the transmit 1088 * timestamps are unique for such. 1089 */ 1090 pkt = &rbufp->recv_pkt; 1091 for (peer = peer_list; peer != NULL; peer = peer->p_link) 1092 if (MDF_SOLICIT_MASK & peer->cast_flags) { 1093 NTOHL_FP(&pkt->org, &p_org); 1094 if (L_ISEQU(&p_org, &peer->aorg)) 1095 break; 1096 } 1097 1098 return peer; 1099} 1100 1101/* peer_cleanup - clean peer list prior to shutdown */ 1102void peer_cleanup(void) 1103{ 1104 struct peer *peer; 1105 associd_t assoc; 1106 1107 for (assoc = initial_association_ID; assoc != current_association_ID; assoc++) { 1108 if (assoc != 0U) { 1109 peer = findpeerbyassoc(assoc); 1110 if (peer != NULL) 1111 unpeer(peer); 1112 } 1113 } 1114 peer = findpeerbyassoc(current_association_ID); 1115 if (peer != NULL) 1116 unpeer(peer); 1117} 1118