struct timeval *now, /* timestamp at time of receipt */
double now_err,
NCR_Instance inst, /* the instance record for this peer/server */
+ int sock_fd, /* the receiving socket */
int length /* the length of the received packet */
)
{
int version;
int auth_len;
+ /* Make sure the packet was received by the sending socket */
+ if (sock_fd != inst->local_addr.sock_fd) {
+ DEBUG_LOG(LOGF_NtpCore,
+ "Packet received by wrong socket %d (expected %d)",
+ sock_fd, inst->local_addr.sock_fd);
+ return;
+ }
+
/* Ignore packets from offline sources */
if (inst->opmode == MD_OFFLINE) {
return;
/* This routine is called when a new packet arrives off the network,
and it relates to a source we have an ongoing protocol exchange with */
-extern void NCR_ProcessKnown(NTP_Packet *message, struct timeval *now, double now_err, NCR_Instance data, int length);
+extern void NCR_ProcessKnown(NTP_Packet *message, struct timeval *now, double now_err, NCR_Instance data, int sock_fd, int length);
/* This routine is called when a new packet arrives off the network,
and we do not recognize its source */
find_slot(remote_addr, &slot, &found);
if (found == 2) { /* Must match IP address AND port number */
- NCR_ProcessKnown(message, now, now_err, records[slot].data, length);
+ NCR_ProcessKnown(message, now, now_err, records[slot].data,
+ local_addr->sock_fd, length);
} else {
NCR_ProcessUnknown(message, now, now_err, remote_addr, local_addr, length);
}