ntp: merge broadcast code with ntp_core
This commit is contained in:
parent
e0059bcc6b
commit
a78bf0c34e
8 changed files with 61 additions and 217 deletions
159
broadcast.c
159
broadcast.c
|
@ -1,159 +0,0 @@
|
||||||
/*
|
|
||||||
chronyd/chronyc - Programs for keeping computer clocks accurate.
|
|
||||||
|
|
||||||
**********************************************************************
|
|
||||||
* Copyright (C) Richard P. Curnow 1997-2002
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
|
|
||||||
=======================================================================
|
|
||||||
|
|
||||||
Deal with broadcast server functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "sysincl.h"
|
|
||||||
#include "memory.h"
|
|
||||||
|
|
||||||
#include "addressing.h"
|
|
||||||
#include "broadcast.h"
|
|
||||||
#include "sched.h"
|
|
||||||
#include "ntp.h"
|
|
||||||
#include "local.h"
|
|
||||||
#include "reference.h"
|
|
||||||
#include "util.h"
|
|
||||||
#include "ntp_io.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
NTP_Remote_Address addr;
|
|
||||||
NTP_Local_Address local_addr;
|
|
||||||
int interval;
|
|
||||||
} Destination;
|
|
||||||
static Destination *destinations = 0;
|
|
||||||
static int n_destinations = 0;
|
|
||||||
static int max_destinations = 0;
|
|
||||||
|
|
||||||
void
|
|
||||||
BRD_Initialise(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ================================================== */
|
|
||||||
|
|
||||||
void
|
|
||||||
BRD_Finalise(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ================================================== */
|
|
||||||
/* This is a cut-down version of what transmit_packet in ntp_core.c does */
|
|
||||||
|
|
||||||
static void
|
|
||||||
timeout_handler(void *arbitrary)
|
|
||||||
{
|
|
||||||
Destination *d = (Destination *) arbitrary;
|
|
||||||
NTP_Packet message;
|
|
||||||
/* Parameters read from reference module */
|
|
||||||
int leap;
|
|
||||||
int are_we_synchronised, our_stratum;
|
|
||||||
NTP_Leap leap_status;
|
|
||||||
uint32_t our_ref_id, ts_fuzz;
|
|
||||||
struct timeval our_ref_time;
|
|
||||||
double our_root_delay, our_root_dispersion;
|
|
||||||
struct timeval local_transmit;
|
|
||||||
|
|
||||||
LCL_ReadCookedTime(&local_transmit, NULL);
|
|
||||||
REF_GetReferenceParams(&local_transmit,
|
|
||||||
&are_we_synchronised, &leap_status,
|
|
||||||
&our_stratum,
|
|
||||||
&our_ref_id, &our_ref_time,
|
|
||||||
&our_root_delay, &our_root_dispersion);
|
|
||||||
|
|
||||||
|
|
||||||
if (are_we_synchronised) {
|
|
||||||
leap = (int) leap_status;
|
|
||||||
} else {
|
|
||||||
leap = LEAP_Unsynchronised;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (our_stratum >= NTP_MAX_STRATUM)
|
|
||||||
our_stratum = 0;
|
|
||||||
|
|
||||||
message.lvm = NTP_LVM(leap, NTP_VERSION, MODE_BROADCAST);
|
|
||||||
message.stratum = our_stratum;
|
|
||||||
message.poll = 6; /* FIXME: what should this be? */
|
|
||||||
message.precision = LCL_GetSysPrecisionAsLog();
|
|
||||||
|
|
||||||
/* If we're sending a client mode packet and we aren't synchronized yet,
|
|
||||||
we might have to set up artificial values for some of these parameters */
|
|
||||||
message.root_delay = UTI_DoubleToInt32(our_root_delay);
|
|
||||||
message.root_dispersion = UTI_DoubleToInt32(our_root_dispersion);
|
|
||||||
|
|
||||||
message.reference_id = htonl((NTP_int32) our_ref_id);
|
|
||||||
|
|
||||||
/* Now fill in timestamps */
|
|
||||||
UTI_TimevalToInt64(&our_ref_time, &message.reference_ts, 0);
|
|
||||||
message.originate_ts.hi = 0UL;
|
|
||||||
message.originate_ts.lo = 0UL;
|
|
||||||
message.receive_ts.hi = 0UL;
|
|
||||||
message.receive_ts.lo = 0UL;
|
|
||||||
|
|
||||||
ts_fuzz = UTI_GetNTPTsFuzz(message.precision);
|
|
||||||
LCL_ReadCookedTime(&local_transmit, NULL);
|
|
||||||
UTI_TimevalToInt64(&local_transmit, &message.transmit_ts, ts_fuzz);
|
|
||||||
NIO_SendPacket(&message, &d->addr, &d->local_addr, NTP_NORMAL_PACKET_LENGTH);
|
|
||||||
|
|
||||||
/* Requeue timeout. Don't care if interval drifts gradually, so just do it
|
|
||||||
* at the end. */
|
|
||||||
SCH_AddTimeoutInClass((double) d->interval, 1.0, 0.02,
|
|
||||||
SCH_NtpBroadcastClass,
|
|
||||||
timeout_handler, (void *) d);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ================================================== */
|
|
||||||
|
|
||||||
void
|
|
||||||
BRD_AddDestination(IPAddr *addr, unsigned short port, int interval)
|
|
||||||
{
|
|
||||||
if (max_destinations == n_destinations) {
|
|
||||||
/* Expand array */
|
|
||||||
max_destinations += 8;
|
|
||||||
if (destinations) {
|
|
||||||
destinations = ReallocArray(Destination, max_destinations, destinations);
|
|
||||||
} else {
|
|
||||||
destinations = MallocArray(Destination, max_destinations);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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,
|
|
||||||
SCH_NtpBroadcastClass,
|
|
||||||
timeout_handler, (void *)(destinations + n_destinations));
|
|
||||||
|
|
||||||
++n_destinations;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
37
broadcast.h
37
broadcast.h
|
@ -1,37 +0,0 @@
|
||||||
/*
|
|
||||||
chronyd/chronyc - Programs for keeping computer clocks accurate.
|
|
||||||
|
|
||||||
**********************************************************************
|
|
||||||
* Copyright (C) Richard P. Curnow 1997-2002
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
|
|
||||||
=======================================================================
|
|
||||||
|
|
||||||
Deal with broadcast server functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GOT_BROADCAST_H
|
|
||||||
#define GOT_BROADCAST_H
|
|
||||||
|
|
||||||
#include "addressing.h"
|
|
||||||
|
|
||||||
extern void BRD_Initialise(void);
|
|
||||||
extern void BRD_Finalise(void);
|
|
||||||
extern void BRD_AddDestination(IPAddr *addr, unsigned short port, int interval);
|
|
||||||
|
|
||||||
#endif /* GOT_BROADCAST_H */
|
|
||||||
|
|
6
conf.c
6
conf.c
|
@ -40,7 +40,6 @@
|
||||||
#include "nameserv.h"
|
#include "nameserv.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "cmdparse.h"
|
#include "cmdparse.h"
|
||||||
#include "broadcast.h"
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
@ -1240,9 +1239,8 @@ CNF_AddBroadcasts(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<n_broadcasts; i++) {
|
for (i=0; i<n_broadcasts; i++) {
|
||||||
BRD_AddDestination(&broadcasts[i].addr,
|
NCR_AddBroadcastDestination(&broadcasts[i].addr, broadcasts[i].port,
|
||||||
broadcasts[i].port,
|
broadcasts[i].interval);
|
||||||
broadcasts[i].interval);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
configure
vendored
2
configure
vendored
|
@ -437,7 +437,7 @@ fi
|
||||||
|
|
||||||
if [ $feat_ntp = "1" ]; then
|
if [ $feat_ntp = "1" ]; then
|
||||||
add_def FEAT_NTP
|
add_def FEAT_NTP
|
||||||
EXTRA_OBJECTS="$EXTRA_OBJECTS broadcast.o ntp_core.o ntp_io.o ntp_sources.o"
|
EXTRA_OBJECTS="$EXTRA_OBJECTS ntp_core.o ntp_io.o ntp_sources.o"
|
||||||
else
|
else
|
||||||
feat_asyncdns=0
|
feat_asyncdns=0
|
||||||
fi
|
fi
|
||||||
|
|
3
main.c
3
main.c
|
@ -48,7 +48,6 @@
|
||||||
#include "rtc.h"
|
#include "rtc.h"
|
||||||
#include "refclock.h"
|
#include "refclock.h"
|
||||||
#include "clientlog.h"
|
#include "clientlog.h"
|
||||||
#include "broadcast.h"
|
|
||||||
#include "nameserv.h"
|
#include "nameserv.h"
|
||||||
#include "tempcomp.h"
|
#include "tempcomp.h"
|
||||||
|
|
||||||
|
@ -94,7 +93,6 @@ MAI_CleanupAndExit(void)
|
||||||
CLG_Finalise();
|
CLG_Finalise();
|
||||||
NSR_Finalise();
|
NSR_Finalise();
|
||||||
NCR_Finalise();
|
NCR_Finalise();
|
||||||
BRD_Finalise();
|
|
||||||
SST_Finalise();
|
SST_Finalise();
|
||||||
KEY_Finalise();
|
KEY_Finalise();
|
||||||
RCL_Finalise();
|
RCL_Finalise();
|
||||||
|
@ -492,7 +490,6 @@ int main
|
||||||
|
|
||||||
REF_Initialise();
|
REF_Initialise();
|
||||||
SST_Initialise();
|
SST_Initialise();
|
||||||
BRD_Initialise();
|
|
||||||
NCR_Initialise();
|
NCR_Initialise();
|
||||||
NSR_Initialise();
|
NSR_Initialise();
|
||||||
CLG_Initialise();
|
CLG_Initialise();
|
||||||
|
|
56
ntp_core.c
56
ntp_core.c
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include "sysincl.h"
|
#include "sysincl.h"
|
||||||
|
|
||||||
|
#include "array.h"
|
||||||
#include "ntp_core.h"
|
#include "ntp_core.h"
|
||||||
#include "ntp_io.h"
|
#include "ntp_io.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
@ -166,6 +167,15 @@ struct NCR_Instance_Record {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
NTP_Remote_Address addr;
|
||||||
|
NTP_Local_Address local_addr;
|
||||||
|
int interval;
|
||||||
|
} BroadcastDestination;
|
||||||
|
|
||||||
|
/* Array of BroadcastDestination */
|
||||||
|
static ARR_Instance broadcasts;
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
/* Initial delay period before first packet is transmitted (in seconds) */
|
/* Initial delay period before first packet is transmitted (in seconds) */
|
||||||
#define INITIAL_DELAY 0.2
|
#define INITIAL_DELAY 0.2
|
||||||
|
@ -301,6 +311,7 @@ NCR_Initialise(void)
|
||||||
: -1;
|
: -1;
|
||||||
|
|
||||||
access_auth_table = ADF_CreateTable();
|
access_auth_table = ADF_CreateTable();
|
||||||
|
broadcasts = ARR_CreateInstance(sizeof (BroadcastDestination));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
@ -308,8 +319,8 @@ NCR_Initialise(void)
|
||||||
void
|
void
|
||||||
NCR_Finalise(void)
|
NCR_Finalise(void)
|
||||||
{
|
{
|
||||||
|
ARR_DestroyInstance(broadcasts);
|
||||||
ADF_DestroyTable(access_auth_table);
|
ADF_DestroyTable(access_auth_table);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
@ -1847,3 +1858,46 @@ int NCR_IsSyncPeer(NCR_Instance inst)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
|
static void
|
||||||
|
broadcast_timeout(void *arg)
|
||||||
|
{
|
||||||
|
BroadcastDestination *destination;
|
||||||
|
NTP_int64 orig_ts;
|
||||||
|
struct timeval recv_ts;
|
||||||
|
|
||||||
|
destination = ARR_GetElement(broadcasts, (long)arg);
|
||||||
|
|
||||||
|
orig_ts.hi = 0;
|
||||||
|
orig_ts.lo = 0;
|
||||||
|
recv_ts.tv_sec = 0;
|
||||||
|
recv_ts.tv_usec = 0;
|
||||||
|
|
||||||
|
transmit_packet(MODE_BROADCAST, 6 /* FIXME: should this be log2(interval)? */,
|
||||||
|
NTP_VERSION, 0, 0, &orig_ts, &recv_ts, NULL, NULL,
|
||||||
|
&destination->addr, &destination->local_addr);
|
||||||
|
|
||||||
|
/* Requeue timeout. We don't care if interval drifts gradually. */
|
||||||
|
SCH_AddTimeoutInClass(destination->interval, SAMPLING_SEPARATION, SAMPLING_RANDOMNESS,
|
||||||
|
SCH_NtpBroadcastClass, broadcast_timeout, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
|
void
|
||||||
|
NCR_AddBroadcastDestination(IPAddr *addr, unsigned short port, int interval)
|
||||||
|
{
|
||||||
|
BroadcastDestination *destination;
|
||||||
|
|
||||||
|
destination = (BroadcastDestination *)ARR_GetNewElement(broadcasts);
|
||||||
|
|
||||||
|
destination->addr.ip_addr = *addr;
|
||||||
|
destination->addr.port = port;
|
||||||
|
destination->local_addr.ip_addr.family = IPADDR_UNSPEC;
|
||||||
|
destination->local_addr.sock_fd = NIO_GetServerSocket(&destination->addr);
|
||||||
|
destination->interval = interval;
|
||||||
|
|
||||||
|
SCH_AddTimeoutInClass(destination->interval, SAMPLING_SEPARATION, SAMPLING_RANDOMNESS,
|
||||||
|
SCH_NtpBroadcastClass, broadcast_timeout,
|
||||||
|
(void *)(long)(ARR_GetSize(broadcasts) - 1));
|
||||||
|
}
|
||||||
|
|
|
@ -104,4 +104,6 @@ extern NTP_Remote_Address *NCR_GetRemoteAddress(NCR_Instance instance);
|
||||||
|
|
||||||
extern int NCR_IsSyncPeer(NCR_Instance instance);
|
extern int NCR_IsSyncPeer(NCR_Instance instance);
|
||||||
|
|
||||||
|
extern void NCR_AddBroadcastDestination(IPAddr *addr, unsigned short port, int interval);
|
||||||
|
|
||||||
#endif /* GOT_NTP_CORE_H */
|
#endif /* GOT_NTP_CORE_H */
|
||||||
|
|
13
stubs.c
13
stubs.c
|
@ -27,7 +27,6 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "broadcast.h"
|
|
||||||
#include "clientlog.h"
|
#include "clientlog.h"
|
||||||
#include "cmdmon.h"
|
#include "cmdmon.h"
|
||||||
#include "keys.h"
|
#include "keys.h"
|
||||||
|
@ -89,17 +88,7 @@ MNL_Finalise(void)
|
||||||
#ifndef FEAT_NTP
|
#ifndef FEAT_NTP
|
||||||
|
|
||||||
void
|
void
|
||||||
BRD_Initialise(void)
|
NCR_AddBroadcastDestination(IPAddr *addr, unsigned short port, int interval)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BRD_Finalise(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BRD_AddDestination(IPAddr *addr, unsigned short port, int interval)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue