This is preparation for separate client sockets.
typedef struct {
IPAddr ip_addr;
+ int sock_fd;
} NTP_Local_Address;
#endif /* GOT_ADDRESSING_H */
destinations[n_destinations].addr.ip_addr = *addr;
destinations[n_destinations].addr.port = port;
destinations[n_destinations].local_addr.ip_addr.family = IPADDR_UNSPEC;
+ destinations[n_destinations].local_addr.sock_fd =
+ NIO_GetServerSocket(&destinations[n_destinations].addr);
destinations[n_destinations].interval = interval;
SCH_AddTimeoutInClass((double) interval, 1.0, 0.0,
struct NCR_Instance_Record {
NTP_Remote_Address remote_addr; /* Needed for routing transmit packets */
- NTP_Local_Address local_addr; /* Local address used when sending packets */
+ NTP_Local_Address local_addr; /* Local address/socket used to send packets */
NTP_Mode mode; /* The source's NTP mode
(client/server or symmetric active peer) */
OperatingMode opmode; /* Whether we are sampling this source
switch (type) {
case NTP_SERVER:
+ result->local_addr.sock_fd = NIO_GetClientSocket(remote_addr);
result->mode = MODE_CLIENT;
break;
case NTP_PEER:
+ result->local_addr.sock_fd = NIO_GetServerSocket(remote_addr);
result->mode = MODE_ACTIVE;
break;
default:
/* ================================================== */
+int
+NIO_GetClientSocket(NTP_Remote_Address *remote_addr)
+{
+ return NIO_GetServerSocket(remote_addr);
+}
+
+/* ================================================== */
+
+int
+NIO_GetServerSocket(NTP_Remote_Address *remote_addr)
+{
+ switch (remote_addr->ip_addr.family) {
+ case IPADDR_INET4:
+ return sock_fd4;
+#ifdef HAVE_IPV6
+ case IPADDR_INET6:
+ return sock_fd6;
+#endif
+ default:
+ return INVALID_SOCK_FD;
+ }
+}
/* ================================================== */
}
local_addr.ip_addr.family = IPADDR_UNSPEC;
+ local_addr.sock_fd = sock_fd;
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
#ifdef IP_PKTINFO
struct iovec iov;
char cmsgbuf[256];
int cmsglen;
- int sock_fd;
socklen_t addrlen;
assert(initialised);
remote.in4.sin_family = AF_INET;
remote.in4.sin_port = htons(remote_addr->port);
remote.in4.sin_addr.s_addr = htonl(remote_addr->ip_addr.addr.in4);
- sock_fd = sock_fd4;
break;
#ifdef HAVE_IPV6
case IPADDR_INET6:
remote.in6.sin6_port = htons(remote_addr->port);
memcpy(&remote.in6.sin6_addr.s6_addr, &remote_addr->ip_addr.addr.in6,
sizeof (remote.in6.sin6_addr.s6_addr));
- sock_fd = sock_fd6;
break;
#endif
default:
return;
}
- if (sock_fd == INVALID_SOCK_FD)
+ if (local_addr->sock_fd == INVALID_SOCK_FD) {
+ DEBUG_LOG(LOGF_NtpIO, "No socket to send to %s:%d",
+ UTI_IPToString(&remote_addr->ip_addr), remote_addr->port);
return;
+ }
iov.iov_base = packet;
iov.iov_len = packetlen;
if (!cmsglen)
msg.msg_control = NULL;
- if (sendmsg(sock_fd, &msg, 0) < 0 &&
+ if (sendmsg(local_addr->sock_fd, &msg, 0) < 0 &&
#ifdef ENETUNREACH
errno != ENETUNREACH &&
#endif
/* Function to finalise the module */
extern void NIO_Finalise(void);
+/* Function to obtain a socket for sending client packets */
+extern int NIO_GetClientSocket(NTP_Remote_Address *remote_addr);
+
+/* Function to obtain a socket for sending server/peer packets */
+extern int NIO_GetServerSocket(NTP_Remote_Address *remote_addr);
+
/* Function to transmit a packet */
extern void NIO_SendNormalPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr, NTP_Local_Address *local_addr);