]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
ntp: store socket in NTP instance
authorMiroslav Lichvar <mlichvar@redhat.com>
Mon, 24 Mar 2014 15:47:58 +0000 (16:47 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Tue, 25 Mar 2014 14:22:59 +0000 (15:22 +0100)
This is preparation for separate client sockets.

addressing.h
broadcast.c
ntp_core.c
ntp_io.c
ntp_io.h

index 8e301e1b97c91d7f65af3cb78ff2158e079b78ff..863aca9d2cba66c0a29794b0aac22e168abf3259 100644 (file)
@@ -51,6 +51,7 @@ typedef struct {
 
 typedef struct {
   IPAddr ip_addr;
+  int sock_fd;
 } NTP_Local_Address;
 
 #endif /* GOT_ADDRESSING_H */
index 4b33d8dc95698e0879aa0eeb253beb257f5adec0..e4996210bae0e7a515a53dd4cca067f1c3bb0b68 100644 (file)
@@ -144,6 +144,8 @@ BRD_AddDestination(IPAddr *addr, unsigned short port, int interval)
   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,
index f1f237f819791b6209b2cd9f890b0bee2ac805d0..c963ab942fbe8a2b073a090875e1206ee66f4a63 100644 (file)
@@ -64,7 +64,7 @@ typedef enum {
 
 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
@@ -287,9 +287,11 @@ NCR_GetInstance(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourcePar
 
   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:
index f27798532c7874770a6723a97c9c734b4dc09a37..359f76a9eca6c254863c0f02c85daa20e988c6a0 100644 (file)
--- a/ntp_io.c
+++ b/ntp_io.c
@@ -285,6 +285,28 @@ NIO_Finalise(void)
 
 /* ================================================== */
 
+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;
+  }
+}
 
 /* ================================================== */
 
@@ -351,6 +373,7 @@ read_from_socket(void *anything)
     }
 
     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
@@ -410,7 +433,6 @@ send_packet(void *packet, int packetlen, NTP_Remote_Address *remote_addr, NTP_Lo
   struct iovec iov;
   char cmsgbuf[256];
   int cmsglen;
-  int sock_fd;
   socklen_t addrlen;
 
   assert(initialised);
@@ -422,7 +444,6 @@ send_packet(void *packet, int packetlen, NTP_Remote_Address *remote_addr, NTP_Lo
       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:
@@ -432,15 +453,17 @@ send_packet(void *packet, int packetlen, NTP_Remote_Address *remote_addr, NTP_Lo
       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;
@@ -500,7 +523,7 @@ send_packet(void *packet, int packetlen, NTP_Remote_Address *remote_addr, NTP_Lo
   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
index 41e29560f453cc25eb26b3fdf7ef621ef55b0af5..2c4d862b29aa5dd013a194be14b075c474104318 100644 (file)
--- a/ntp_io.h
+++ b/ntp_io.h
@@ -37,6 +37,12 @@ extern void NIO_Initialise(int family);
 /* 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);