Lines Matching full:peer

2  * ntp_peer.c - management of data maintained for peer associations
22 * peer->mode | UNSPEC ACTIVE PASSIVE CLIENT SERVER BCAST
33 * a peer in CLIENT mode, but we that is a special case and we check for
40 #define NO_PEER 0 /* action when no peer is found */
44 /* peer { UNSPEC, ACTIVE, PASSIVE, CLIENT, SERVER, BCAST } */
64 * These routines manage the allocation of memory to peer structures
69 * - peer_adr_hash is an array of lists indexed by hashed peer address.
72 * They also maintain a free list of peer structures, peer_free.
75 * peer structures in the peer list, newpeer(), which allocates a new
76 * peer structure and adds it to the list, and unpeer(), which
80 * Peer hash tables
82 struct peer *peer_hash[NTP_HASH_SIZE]; /* peer hash table */
84 struct peer *assoc_hash[NTP_HASH_SIZE]; /* association ID hash table */
86 struct peer *peer_list; /* peer structures list */
87 static struct peer *peer_free; /* peer structures free list */
111 int total_peer_structs; /* peer structs */
114 static struct peer init_peer_alloc[INIT_PEER_ALLOC]; /* init alloc */
116 static struct peer * findexistingpeer_name(const char *, u_short,
117 struct peer *, int);
118 static struct peer * findexistingpeer_addr(sockaddr_u *,
119 struct peer *, int,
121 static void free_peer(struct peer *, int);
123 static int score(struct peer *);
127 * init_peer - initialize peer data structures and counters
138 * Initialize peer free list from static allocation. in init_peer()
156 * getmorepeermem - add more peer structures to the free list
162 struct peer *peers; in getmorepeermem()
174 static struct peer *
178 struct peer * start_peer, in findexistingpeer_name()
182 struct peer *p; in findexistingpeer_name()
201 struct peer *
204 struct peer * start_peer, in findexistingpeer_addr()
210 struct peer *peer; in findexistingpeer_addr() local
221 * same peer through different interfaces in the hash table. in findexistingpeer_addr()
230 peer = peer_hash[NTP_HASH_ADDR(addr)]; in findexistingpeer_addr()
232 peer = start_peer->adr_link; in findexistingpeer_addr()
234 while (peer != NULL) { in findexistingpeer_addr()
236 sptoa(&peer->srcadr), mode, peer->hmode, in findexistingpeer_addr()
237 (u_int)cast_flags, (u_int)peer->cast_flags)); in findexistingpeer_addr()
239 if (SOCK_EQ(addr, &peer->srcadr)) { in findexistingpeer_addr()
243 if ((-1 == mode || peer->hmode == mode || in findexistingpeer_addr()
244 ((MDF_BCLNT & peer->cast_flags) && in findexistingpeer_addr()
246 ADDR_PORT_EQ(addr, &peer->srcadr)) { in findexistingpeer_addr()
251 peer = peer->adr_link; in findexistingpeer_addr()
254 return peer; in findexistingpeer_addr()
261 struct peer *
265 struct peer * start_peer, in findexistingpeer()
281 * findpeer - find and return a peer match for a received datagram in
285 * the original code re-assigned the peer address to be the destination
300 struct peer *
307 struct peer * p; in findpeer()
318 /* [Bug 3072] ensure interface of peer matches */ in findpeer()
319 /* [Bug 3356] ... if NOT a broadcast peer! */ in findpeer()
323 /* ensure peer source address matches */ in findpeer()
329 * valid peer association. in findpeer()
334 * be misassociated with an ephemeral peer already spun in findpeer()
336 * doesn't match the peer's, check if it matches the in findpeer()
337 * ACST prototype peer's. If so it is a redundant in findpeer()
368 * findpeerbyassoc - find and return a peer using his association ID
370 struct peer *
375 struct peer *p; in findpeerbyassoc()
393 struct peer *p; in clear_all()
412 struct peer *peer /* peer structure pointer */ in score_all() argument
415 struct peer *speer; in score_all()
424 tamp = score(peer); in score_all()
447 struct peer *peer /* peer structure pointer */ in score() argument
453 * This routine calculates the premption score from the peer in score()
457 if (!(peer->flash & TEST10)) in score()
459 if (!(peer->flash & TEST13)) in score()
461 if (!(peer->flash & TEST12)) in score()
463 if (!(peer->flash & TEST11)) in score()
465 if (peer->status >= CTL_PST_SEL_SELCAND) in score()
467 if (peer->status != CTL_PST_SEL_EXCESS) in score()
475 * peer and return it to the peer free list. If unlink is
480 struct peer * p, in free_peer()
484 struct peer * unlinked; in free_peer()
492 struct peer); in free_peer()
495 msyslog(LOG_ERR, "peer %s not in address table!", in free_peer()
506 struct peer); in free_peer()
510 "peer %s not in association ID table!", in free_peer()
516 struct peer); in free_peer()
518 msyslog(LOG_ERR, "%s not in peer list!", in free_peer()
531 /* Add his corporeal form to peer free list */ in free_peer()
539 * unpeer - remove peer structure from hash table and free structure
543 struct peer *peer in unpeer() argument
546 mprintf_event(PEVNT_DEMOBIL, peer, "assoc %u", peer->associd); in unpeer()
547 restrict_source(&peer->srcadr, TRUE, 0); in unpeer()
548 peer->flags |= FLAG_DISABLED; in unpeer()
549 set_peerdstadr(peer, NULL); in unpeer()
552 if (FLAG_PREEMPT & peer->flags) in unpeer()
556 * If this peer is actually a clock, shut it down first in unpeer()
558 if (FLAG_REFCLOCK & peer->flags) in unpeer()
559 refclock_unpeer(peer); in unpeer()
562 free_peer(peer, TRUE); in unpeer()
569 struct peer *
630 * setup peer dstadr field keeping it in sync with the interface
635 struct peer * p, in set_peerdstadr()
639 struct peer * unlinked; in set_peerdstadr()
652 * peer address. in set_peerdstadr()
660 * Do not set the local address for a link-local IPv6 peer in set_peerdstadr()
670 * endpt while a BCLNT peer is running its unicast protocol. in set_peerdstadr()
681 struct peer); in set_peerdstadr()
704 struct peer *p in peer_refresh_interface()
765 struct peer *p; in refresh_all_peerinterfaces()
774 * Change local address only if the peer doesn't in refresh_all_peerinterfaces()
787 * newpeer - initialize a new peer association
789 struct peer *
806 struct peer * peer; in newpeer() local
839 * actual interface, because that's what gets put into the peer in newpeer()
843 peer = findexistingpeer(srcadr, hostname, NULL, hmode, in newpeer()
845 while (peer != NULL) { in newpeer()
846 if ( peer->dstadr == dstadr in newpeer()
848 && (MDF_BCLNT & peer->cast_flags))) in newpeer()
852 peer->dstadr == findinterface(srcadr)) in newpeer()
855 peer = findexistingpeer(srcadr, hostname, peer, in newpeer()
860 peer = findexistingpeer(srcadr, hostname, NULL, hmode, in newpeer()
871 if (NULL == peer) { in newpeer()
872 for (peer = peer_list; in newpeer()
873 peer != NULL; in newpeer()
874 peer = peer->p_link) { in newpeer()
875 if ( SOCK_EQ(srcadr, &peer->srcadr) in newpeer()
877 && !SOCK_UNSPEC(&peer->srcadr)) { in newpeer()
878 /* leave peer non-NULL */ in newpeer()
885 * If a peer is found, this would be a duplicate and we don't in newpeer()
890 if (peer != NULL) { in newpeer()
926 * Allocate a new peer structure. Some dirt here, since some of in newpeer()
931 UNLINK_HEAD_SLIST(peer, peer_free, p_link); in newpeer()
932 INSIST(peer != NULL); in newpeer()
946 peer->associd = current_association_ID; in newpeer()
948 peer->srcadr = *srcadr; in newpeer()
950 peer->hostname = estrdup(hostname); in newpeer()
952 peer->hmode = hmode; in newpeer()
953 peer->version = version; in newpeer()
954 peer->flags = flags; in newpeer()
955 peer->cast_flags = cast_flags; in newpeer()
956 set_peerdstadr(peer, in newpeer()
957 select_peerinterface(peer, srcadr, dstadr)); in newpeer()
962 peer->maxpoll = (0 == maxpoll) in newpeer()
965 peer->minpoll = (0 == minpoll) in newpeer()
973 peer->maxpoll = CLAMP(peer->maxpoll, NTP_MINPOLL, NTP_MAXPOLL); in newpeer()
974 peer->minpoll = CLAMP(peer->minpoll, NTP_MINPOLL, peer->maxpoll); in newpeer()
976 if (peer->dstadr != NULL) { in newpeer()
978 stoa(srcadr), peer->dstadr->fd, in newpeer()
979 stoa(&peer->dstadr->sin))); in newpeer()
987 if ((MDF_BCAST & cast_flags) && peer->dstadr != NULL) { in newpeer()
988 enable_broadcast(peer->dstadr, srcadr); in newpeer()
993 if ((MDF_MCAST & cast_flags) && peer->dstadr != NULL) { in newpeer()
994 enable_multicast_if(peer->dstadr, srcadr); in newpeer()
998 peer->flags |= FLAG_SKEY; in newpeer()
1000 peer->ttl = ttl; in newpeer()
1001 peer->keyid = key; in newpeer()
1003 peer->ident = estrdup(ident); in newpeer()
1005 peer->precision = sys_precision; in newpeer()
1006 peer->hpoll = peer->minpoll; in newpeer()
1008 peer_clear(peer, "ACST"); in newpeer()
1010 peer_clear(peer, "POOL"); in newpeer()
1012 peer_clear(peer, "MCST"); in newpeer()
1014 peer_clear(peer, "BCST"); in newpeer()
1016 peer_clear(peer, "INIT"); in newpeer()
1024 peer->timereset = current_time; in newpeer()
1025 peer->timereachable = current_time; in newpeer()
1026 peer->timereceived = current_time; in newpeer()
1028 if (ISREFCLOCKADR(&peer->srcadr)) { in newpeer()
1033 * the peer timer, since the clock may have requirements in newpeer()
1036 if (!refclock_newpeer(peer)) { in newpeer()
1040 set_peerdstadr(peer, NULL); in newpeer()
1041 free_peer(peer, 0); in newpeer()
1046 stoa(&peer->srcadr)); in newpeer()
1047 set_peerdstadr(peer, NULL); in newpeer()
1048 free_peer(peer, 0); in newpeer()
1054 * Put the new peer in the hash tables. in newpeer()
1056 hash = NTP_HASH_ADDR(&peer->srcadr); in newpeer()
1057 LINK_SLIST(peer_hash[hash], peer, adr_link); in newpeer()
1059 hash = peer->associd & NTP_HASH_MASK; in newpeer()
1060 LINK_SLIST(assoc_hash[hash], peer, aid_link); in newpeer()
1062 LINK_SLIST(peer_list, peer, p_link); in newpeer()
1064 restrict_source(&peer->srcadr, FALSE, 0); in newpeer()
1065 mprintf_event(PEVNT_MOBIL, peer, "assoc %d", peer->associd); in newpeer()
1067 latoa(peer->dstadr), stoa(&peer->srcadr), peer->hmode, in newpeer()
1068 peer->version, peer->minpoll, peer->maxpoll, peer->flags, in newpeer()
1069 peer->cast_flags, peer->ttl, peer->keyid)); in newpeer()
1070 return peer; in newpeer()
1075 * peer_clr_stats - clear peer module statistics counters
1093 struct peer *peer in peer_reset() argument
1096 if (peer == NULL) in peer_reset()
1099 peer->timereset = current_time; in peer_reset()
1100 peer->sent = 0; in peer_reset()
1101 peer->received = 0; in peer_reset()
1102 peer->processed = 0; in peer_reset()
1103 peer->badauth = 0; in peer_reset()
1104 peer->bogusorg = 0; in peer_reset()
1105 peer->oldpkt = 0; in peer_reset()
1106 peer->seldisptoolarge = 0; in peer_reset()
1107 peer->selbroken = 0; in peer_reset()
1112 * peer_all_reset - reset all peer statistics counters
1117 struct peer *peer; in peer_all_reset() local
1119 for (peer = peer_list; peer != NULL; peer = peer->p_link) in peer_all_reset()
1120 peer_reset(peer); in peer_all_reset()
1128 struct peer *
1133 struct peer *peer; in findmanycastpeer() local
1140 * server unicast solicitation. Search the peer list for a in findmanycastpeer()
1148 for (peer = peer_list; peer != NULL; peer = peer->p_link) in findmanycastpeer()
1149 if (MDF_SOLICIT_MASK & peer->cast_flags) { in findmanycastpeer()
1151 if (L_ISEQU(&p_org, &peer->aorg)) { in findmanycastpeer()
1156 return peer; in findmanycastpeer()
1159 /* peer_cleanup - clean peer list prior to shutdown */
1162 struct peer *peer; in peer_cleanup() local
1163 struct peer *nextpeer; in peer_cleanup()
1165 for (peer = peer_list; peer != NULL; peer = nextpeer) { in peer_cleanup()
1166 nextpeer = peer->p_link; in peer_cleanup()
1167 unpeer(peer); in peer_cleanup()