From: Danny Mayer Date: Fri, 8 Oct 2004 02:40:57 +0000 (-0400) Subject: Modification to have broadcast servers enable the socket for broadcast X-Git-Tag: NTP_4_2_3~110^2^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=234eda02029a7bbcd393ffd6ae7ae022bd123337;p=thirdparty%2Fntp.git Modification to have broadcast servers enable the socket for broadcast bk: 4165fe39bPdXmAD8_PGqI9lNVpy8wA --- diff --git a/include/ntpd.h b/include/ntpd.h index 616161b640..a4d3bc5e50 100644 --- a/include/ntpd.h +++ b/include/ntpd.h @@ -11,8 +11,8 @@ #include "recvbuff.h" #ifdef SYS_WINNT -#define exit service_exit -extern void service_exit (int); +#define exit ntservice_exit +extern void ntservice_exit (int); /* declare the service threads */ void service_main (DWORD, LPTSTR *); void service_ctrl (DWORD); @@ -73,6 +73,7 @@ extern void ntp_intres P((void)); /* ntp_io.c */ extern struct interface *findinterface P((struct sockaddr_storage *)); extern struct interface *findbcastinter P((struct sockaddr_storage *)); +extern void enable_broadcast P((struct interface *, struct sockaddr_storage *)); extern void init_io P((void)); extern void input_handler P((l_fp *)); @@ -178,7 +179,6 @@ extern int refclock_newpeer P((struct peer *)); extern void refclock_unpeer P((struct peer *)); extern void refclock_receive P((struct peer *)); extern void refclock_transmit P((struct peer *)); -extern void refclock_timeout P((struct peer *)); extern void init_refclock P((void)); #endif /* REFCLOCK */ @@ -312,6 +312,7 @@ extern int forground_process; /* run the process in the forground */ extern u_char sys_poll; /* system poll interval (log2 s) */ extern int state; /* clock discipline state */ extern int tc_counter; /* poll-adjust counter */ +extern u_long last_time; /* time of last clock update (s) */ extern double last_offset; /* last clock offset (s) */ extern double allan_xpt; /* Allan intercept (s) */ extern double clock_jitter; /* clock jitter (s) */ @@ -350,7 +351,6 @@ extern u_char sys_stratum; /* stratum of system */ extern s_char sys_precision; /* local clock precision */ extern double sys_rootdelay; /* distance to current sync source */ extern double sys_rootdispersion; /* dispersion of system clock */ -extern u_long sys_clocktime; /* last system clock update */ extern u_int32 sys_refid; /* reference source for local clock */ extern l_fp sys_reftime; /* time we were last updated */ extern struct peer *sys_peer; /* our current peer */ diff --git a/ntpd/ntp_io.c b/ntpd/ntp_io.c index a43e89ad0e..19b2232666 100644 --- a/ntpd/ntp_io.c +++ b/ntpd/ntp_io.c @@ -615,6 +615,18 @@ set_reuseaddr(int flag) { } } +/* + * This is just a wrapper around an internal function so we can + * make other changes as necessary later on + */ +void +enable_broadcast(struct interface *iface, struct sockaddr_storage *baddr) +{ +#ifdef SO_BROADCAST + socket_broadcast_enable(iface, baddr); +#endif +} + #ifdef OPEN_BCAST_SOCKET /* * Enable a broadcast address to a given socket @@ -636,6 +648,12 @@ socket_broadcast_enable(struct interface *iface, int ind, struct sockaddr_storag netsyslog(LOG_ERR, "setsockopt(SO_BROADCAST) enable failure on address %s: %m", stoa(maddr)); } +#ifdef DEBUG + else if (debug > 1) { + printf("Broadcast enabled on socket %d for address %s\n", + iface->fd, stoa(maddr)); + } +#endif } iface->flags |= INT_BCASTOPEN; modify_addr_in_list(maddr, iface->flags); diff --git a/ntpd/ntp_peer.c b/ntpd/ntp_peer.c index d9ad7040dd..164b5b8f82 100644 --- a/ntpd/ntp_peer.c +++ b/ntpd/ntp_peer.c @@ -590,6 +590,14 @@ newpeer( peer->dstadr = dstadr; else peer->dstadr = findinterface(srcadr); + + /* + * Broadcast needs the socket enabled for broadcast + */ + if (cast_flags & (MDF_BCLNT | MDF_BCAST)) { + enable_broadcast(peer->dstadr, srcadr); + } + peer->srcadr = *srcadr; peer->hmode = (u_char)hmode; peer->version = (u_char)version;