From 9a657cd4a325b370efc9df269576497c532abfa1 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Mon, 24 Mar 2014 16:47:58 +0100 Subject: [PATCH] ntp: store socket in NTP instance This is preparation for separate client sockets. --- addressing.h | 1 + broadcast.c | 2 ++ ntp_core.c | 4 +++- ntp_io.c | 33 ++++++++++++++++++++++++++++----- ntp_io.h | 6 ++++++ 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/addressing.h b/addressing.h index 8e301e1..863aca9 100644 --- a/addressing.h +++ b/addressing.h @@ -51,6 +51,7 @@ typedef struct { typedef struct { IPAddr ip_addr; + int sock_fd; } NTP_Local_Address; #endif /* GOT_ADDRESSING_H */ diff --git a/broadcast.c b/broadcast.c index 4b33d8d..e499621 100644 --- a/broadcast.c +++ b/broadcast.c @@ -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, diff --git a/ntp_core.c b/ntp_core.c index f1f237f..c963ab9 100644 --- a/ntp_core.c +++ b/ntp_core.c @@ -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: diff --git a/ntp_io.c b/ntp_io.c index f277985..359f76a 100644 --- 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 diff --git a/ntp_io.h b/ntp_io.h index 41e2956..2c4d862 100644 --- 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);