38
37
* circumvent that problem by requiring that the first b(m)roadcast
39
38
* received after the change back to BCLIENT mode sets the clock.
40
#define AM_MODES 7 /* number of rows and columns */
41
#define NO_PEER 0 /* action when no peer is found */
42
43
int AM[AM_MODES][AM_MODES] = {
43
44
/* { UNSPEC, ACTIVE, PASSIVE, CLIENT, SERVER, BCAST } */
45
/*NONE*/{ AM_ERR, AM_NEWPASS, AM_ERR, AM_FXMIT, AM_MANYCAST, AM_NEWBCL},
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},
55
56
/*BCST*/{ AM_ERR, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH},
57
/*CNTL*/{ AM_ERR, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH},
59
/*PRIV*/{ AM_ERR, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH},
61
/*BCL*/ { AM_ERR, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_ERR, AM_PROCPKT},
58
/*BCL*/ { AM_ERR, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_NOMATCH, AM_PROCPKT},
64
61
#define MATCH_ASSOC(x,y) AM[(x)][(y)]
527
* setup peer dstadr field keeping it in sync with the interface structures
530
set_peerdstadr(struct peer *peer, struct interface *interface)
532
if (peer->dstadr != interface) {
533
if (interface != NULL &&
534
(peer->cast_flags & MDF_BCLNT) &&
535
(interface->flags & INT_MCASTIF) &&
538
* don't accept updates to a true multicast reception
539
* interface while a BCLNT peer is running it's
545
if (peer->dstadr != NULL)
547
peer->dstadr->peercnt--;
548
ISC_LIST_UNLINK_TYPE(peer->dstadr->peers, peer, ilink, struct peer);
551
DPRINTF(4, ("set_peerdstadr(%s): change interface from %s to %s\n",
553
(peer->dstadr != NULL) ? stoa(&peer->dstadr->sin) : "<null>",
554
(interface != NULL) ? stoa(&interface->sin) : "<null>"));
556
peer->dstadr = interface;
558
if (peer->dstadr != NULL)
560
ISC_LIST_APPEND(peer->dstadr->peers, peer, ilink);
561
peer->dstadr->peercnt++;
567
* attempt to re-rebind interface if necessary
570
peer_refresh_interface(struct peer *peer)
572
struct interface *niface, *piface;
574
niface = select_peerinterface(peer, &peer->srcadr, NULL, peer->cast_flags);
580
"peer_refresh_interface: %s->%s mode %d vers %d poll %d %d flags 0x%x 0x%x ttl %d key %08x: new interface: ",
581
peer->dstadr == NULL ? "<null>" : stoa(&peer->dstadr->sin),
583
peer->hmode, peer->version, peer->minpoll,
584
peer->maxpoll, peer->flags, peer->cast_flags,
585
peer->ttl, peer->keyid);
588
printf("fd=%d, bfd=%d, name=%.16s, flags=0x%x, scope=%d, ",
594
/* Leave these as three printf calls. */
596
stoa((&niface->sin)));
597
if (niface->flags & INT_BROADCAST)
598
printf(", bcast=%s,",
599
stoa((&niface->bcast)));
600
printf(", mask=%s\n",
601
stoa((&niface->mask)));
610
piface = peer->dstadr;
612
set_peerdstadr(peer, niface);
616
* clear crypto if we change the local address
618
if (peer->dstadr != piface && !(peer->cast_flags & MDF_BCLNT)) {
619
peer_crypto_clear(peer);
623
* Broadcast needs the socket enabled for broadcast
625
if (peer->cast_flags & MDF_BCAST) {
626
enable_broadcast(peer->dstadr, &peer->srcadr);
630
* Multicast needs the socket interface enabled for multicast
632
if (peer->cast_flags & MDF_MCAST) {
633
enable_multicast_if(peer->dstadr, &peer->srcadr);
639
* refresh_all_peerinterfaces - see that all interface bindings are up to date
642
refresh_all_peerinterfaces(void)
644
struct peer *peer, *next_peer;
648
* this is called when the interface list has changed
649
* give all peers a chance to find a better interface
651
for (n = 0; n < NTP_HASH_SIZE; n++) {
652
for (peer = peer_hash[n]; peer != 0; peer = next_peer) {
653
next_peer = peer->next;
654
peer_refresh_interface(peer);
661
* find an interface suitable for the src address
663
static struct interface *
664
select_peerinterface(struct peer *peer, struct sockaddr_storage *srcadr, struct interface *dstadr, u_char cast_flags)
666
struct interface *interface;
669
* Initialize the peer structure and dance the interface jig.
670
* Reference clocks step the loopback waltz, the others
671
* squaredance around the interface list looking for a buddy. If
672
* the dance peters out, there is always the wildcard interface.
673
* This might happen in some systems and would preclude proper
674
* operation with public key cryptography.
676
if (ISREFCLOCKADR(srcadr))
677
interface = loopback_interface;
679
if (cast_flags & (MDF_BCLNT | MDF_ACAST | MDF_MCAST | MDF_BCAST)) {
680
interface = findbcastinter(srcadr);
683
if (interface != NULL)
684
printf("Found *-cast interface address %s, for address %s\n",
685
stoa(&(interface)->sin), stoa(srcadr));
687
printf("No *-cast local address found for address %s\n",
692
* If it was a multicast packet, findbcastinter() may not
693
* find it, so try a little harder.
695
if (interface == ANY_INTERFACE_CHOOSE(srcadr))
696
interface = findinterface(srcadr);
698
else if (dstadr != NULL && dstadr != ANY_INTERFACE_CHOOSE(srcadr))
701
interface = findinterface(srcadr);
704
* we do not bind to the wildcard interfaces for output
705
* as our (network) source address would be undefined and
706
* crypto will not work without knowing the own transmit address
708
if (interface != NULL && interface->flags & INT_WILDCARD)
530
715
* newpeer - initialize a new peer association
568
755
if (++current_association_ID == 0)
569
756
++current_association_ID;
758
DPRINTF(3, ("newpeer: cast flags: 0x%x for address: %s\n",
759
cast_flags, stoa(srcadr)));
761
ISC_LINK_INIT(peer, ilink); /* set up interface link chain */
763
dstadr = select_peerinterface(peer, srcadr, dstadr, cast_flags);
572
* Initialize the peer structure and dance the interface jig.
573
* Reference clocks step the loopback waltz, the others
574
* squaredance around the interface list looking for a buddy. If
575
* the dance peters out, there is always the wildcard interface.
576
* This might happen in some systems and would preclude proper
577
* operation with public key cryptography.
766
* If we can't find an interface to use we return a NULL
767
* unless the DYNAMIC flag is set - then we expect the dynamic
768
* interface detection code to bind us some day to an interface
579
if (ISREFCLOCKADR(srcadr))
580
peer->dstadr = loopback_interface;
581
else if (cast_flags & (MDF_BCLNT | MDF_ACAST | MDF_MCAST | MDF_BCAST)) {
582
peer->dstadr = findbcastinter(srcadr);
584
* If it was a multicast packet, findbcastinter() may not
585
* find it, so try a little harder.
587
if (peer->dstadr == ANY_INTERFACE_CHOOSE(srcadr))
588
peer->dstadr = findinterface(srcadr);
589
} else if (dstadr != NULL && dstadr != ANY_INTERFACE_CHOOSE(srcadr))
590
peer->dstadr = dstadr;
592
peer->dstadr = findinterface(srcadr);
770
if (dstadr == NULL && !(flags & FLAG_DYNAMIC))
772
msyslog(LOG_ERR, "Cannot find existing interface for address %s", stoa(srcadr));
774
peer->next = peer_free;
593
782
peer->srcadr = *srcadr;
594
783
peer->hmode = (u_char)hmode;
595
784
peer->version = (u_char)version;
596
785
peer->minpoll = (u_char)max(NTP_MINPOLL, minpoll);
597
786
peer->maxpoll = (u_char)min(NTP_MAXPOLL, maxpoll);
598
787
peer->flags = flags;
789
set_peerdstadr(peer, dstadr);
794
printf("newpeer: using fd %d and our addr %s\n",
795
peer->dstadr->fd, stoa(&peer->dstadr->sin));
797
printf("newpeer: local interface currently not bound\n");
802
* Broadcast needs the socket enabled for broadcast
804
if (cast_flags & MDF_BCAST && peer->dstadr) {
805
enable_broadcast(peer->dstadr, srcadr);
808
* Multicast needs the socket interface enabled for multicast
810
if (cast_flags & MDF_MCAST && peer->dstadr) {
811
enable_multicast_if(peer->dstadr, srcadr);
600
814
peer->flags |= FLAG_AUTHENABLE;
601
815
if (key > NTP_MAXKEY)
652
871
peer->ass_next = assoc_hash[i];
653
872
assoc_hash[i] = peer;
654
873
assoc_hash_count[i]++;
656
876
if (peer->flags & FLAG_SKEY) {
657
877
sprintf(statstr, "newpeer %d", peer->associd);
658
878
record_crypto_stats(&peer->srcadr, statstr);
661
printf("peer: %s\n", statstr);
879
DPRINTF(1, ("peer: %s\n", statstr));
664
881
#endif /* OPENSSL */
668
"newpeer: %s->%s mode %d vers %d poll %d %d flags 0x%x 0x%x ttl %d key %08x\n",
669
peer->dstadr == NULL ? "null" : stoa(&peer->dstadr->sin),
883
DPRINTF(1, ("newpeer: %s->%s mode %d vers %d poll %d %d flags 0x%x 0x%x ttl %d key %08x\n",
884
peer->dstadr == NULL ? "<null>" : stoa(&peer->dstadr->sin),
670
885
stoa(&peer->srcadr),
671
886
peer->hmode, peer->version, peer->minpoll,
672
887
peer->maxpoll, peer->flags, peer->cast_flags,
673
peer->ttl, peer->keyid);
888
peer->ttl, peer->keyid));