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