---
+* [Bug 1458] Can not compile NTP on FreeBSD 4.7.
* [Bug 1510] Add modes 20/21 for driver 8 to support RAWDCF @ 75 baud.
* [Bug 1618] Unreachable code in jjy_start(). (backport from ntp-dev)
* [Bug 1719] ntp-keygen -V crash. (backport)
* [Bug 1754] --version output should be more verbose.
* [Bug 1758] setsockopt IPV6_MULTICAST_IF with wrong ifindex.
* [Bug 1760] ntpd Windows interpolation cannot be disabled.
+* [Bug 1762] manycastclient solicitation responses interfere.
* Upgrade to libopts 34.0.9 from AutoGen 5.11.6pre5.
* Suppress ntp-keygen OpenSSL version display for --help, --version,
display both build and runtime OpenSSL versions when they differ.
struct peer *ass_next; /* link pointer in associd hash */
struct peer *ilink; /* list of peers for interface */
sockaddr_u srcadr; /* address of remote host */
- struct interface *dstadr; /* local address (interface) */
+ endpt * dstadr; /* local address */
associd_t associd; /* association ID */
u_char version; /* version number */
u_char hmode; /* local association mode */
/* ntp_peer.c */
extern void init_peer (void);
extern struct peer *findexistingpeer (sockaddr_u *, struct peer *, int);
-extern struct peer *findpeer (sockaddr_u *, struct interface *, int, int *);
+extern struct peer *findpeer (struct recvbuf *, int, int *);
extern struct peer *findpeerbyassoc (u_int);
extern void set_peerdstadr (struct peer *peer, struct interface *interface);
extern struct peer *newpeer (sockaddr_u *, struct interface *, int, int, int, int, u_int, u_char, int, keyid_t);
#else
int recv_srcadr_len; /* filled in on completion */
#endif
- struct interface *dstadr; /* interface datagram arrived thru */
+ endpt * dstadr; /* address pkt arrived on */
SOCKET fd; /* fd on which it was received */
int msg_flags; /* Flags received about the packet */
l_fp recv_time; /* time of arrival */
*/
struct peer *
findpeer(
- sockaddr_u * srcadr,
- endpt * dstadr,
+ struct recvbuf *rbufp,
int pkt_mode,
int * action
)
{
- struct peer *p;
- u_int hash;
+ struct peer * p;
+ sockaddr_u * srcadr;
+ u_int hash;
+ struct pkt * pkt;
+ l_fp pkt_org;
findpeer_calls++;
+ srcadr = &rbufp->recv_srcadr;
hash = NTP_HASH_ADDR(srcadr);
for (p = peer_hash[hash]; p != NULL; p = p->next) {
if (SOCK_EQ(srcadr, &p->srcadr) &&
*/
*action = MATCH_ASSOC(p->hmode, pkt_mode);
+ /*
+ * A response to our manycastclient solicitation
+ * might be misassociated with an ephemeral peer
+ * already spun for the server. If the packet's
+ * org timestamp doesn't match the peer's, check
+ * if it matches the ACST prototype peer's. If
+ * so it is a redundant solicitation response,
+ * return AM_ERR to discard it. [Bug 1762]
+ */
+ if (MODE_SERVER == pkt_mode &&
+ AM_PROCPKT == *action) {
+ pkt = &rbufp->recv_pkt;
+ NTOHL_FP(&pkt->org, &pkt_org);
+ if (!L_ISEQU(&p->aorg, &pkt_org) &&
+ findmanycastpeer(rbufp))
+ *action = AM_ERR;
+ }
+
/*
* if an error was returned, exit back right
* here.
*/
if (NULL == p) {
*action = MATCH_ASSOC(NO_PEER, pkt_mode);
- } else if (p->dstadr != dstadr) {
- set_peerdstadr(p, dstadr);
+ } else if (p->dstadr != rbufp->dstadr) {
+ set_peerdstadr(p, rbufp->dstadr);
DPRINTF(1, ("changed %s local address to match response",
stoa(&p->srcadr)));
}
u_int assoc
)
{
- register struct peer *peer;
+ struct peer *p;
u_int hash;
assocpeer_calls++;
hash = assoc & NTP_HASH_MASK;
- for (peer = assoc_hash[hash]; peer != 0; peer =
- peer->ass_next) {
- if (assoc == peer->associd)
- return (peer);
+ for (p = assoc_hash[hash]; p != NULL; p = p->ass_next) {
+ if (assoc == p->associd)
+ return p;
}
- return (NULL);
+ return NULL;
}
)
{
if (peer == NULL)
- return;
+ return;
peer->timereset = current_time;
peer->sent = 0;
* multicaster, the broadcast address is null, so we use the
* unicast address anyway. Don't ask.
*/
- peer = findpeer(&rbufp->recv_srcadr, rbufp->dstadr, hismode,
- &retcode);
+ peer = findpeer(rbufp, hismode, &retcode);
dstadr_sin = &rbufp->dstadr->sin;
NTOHL_FP(&pkt->org, &p_org);
NTOHL_FP(&pkt->rec, &p_rec);