1/*- 2 * Copyright (c) 1985, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)globals.h 8.1 (Berkeley) 6/6/93 30 * $FreeBSD: releng/10.3/usr.sbin/timed/timed/globals.h 228720 2011-12-19 20:33:53Z dim $ 31 */ 32 33#include <sys/param.h> 34#include <sys/time.h> 35#include <sys/socket.h> 36 37#include <netinet/in.h> 38#include <arpa/inet.h> 39 40#include <err.h> 41#include <errno.h> 42#include <limits.h> 43#include <netdb.h> 44#include <stdint.h> 45#include <stdio.h> 46#include <stdlib.h> 47#include <string.h> 48#include <syslog.h> 49#include <unistd.h> 50 51#include <protocols/timed.h> 52#define SECHR (60*60) 53#define SECDAY (24*SECHR) 54 55/* Best expected round trip for a measurement. 56 * This is essentially the number of milliseconds per CPU tick (CLK_TCK?). 57 * All delays shorter than this are usually reported as 0. 58 */ 59#define MIN_ROUND ((1000-1)/CLK_TCK) 60 61 62#define SAMPLEINTVL 240 /* synch() freq for master in sec */ 63#define MAXADJ 20 /* max adjtime() correction in sec */ 64 65#define MAX_TRIM 3000000 /* max drift in nsec/sec, 0.3% */ 66#define BIG_ADJ (MAX_TRIM/1000*SAMPLEINTVL*2) /* max good adj */ 67 68#define MINTOUT 360 /* election delays, 6-15 minutes */ 69#define MAXTOUT 900 70 71#define BAD_STATUS (-1) 72#define GOOD 1 73#define UNREACHABLE 2 74#define NONSTDTIME 3 75#define HOSTDOWN 0x7fffffff 76 77#define OFF 0 78#define ON 1 79 80#define MAX_HOPCNT 10 /* max value for tsp_hpcnt */ 81 82#define LOSTHOST 3 /* forget after this many failures */ 83 84#define VALID_RANGE (MAXADJ*1000) /* good times in milliseconds */ 85#define GOOD_RANGE (MIN_ROUND*2) 86#define VGOOD_RANGE (MIN_ROUND-1) 87 88 89/* 90 * Global and per-network states. 91 */ 92#define NOMASTER 0 /* no good master */ 93#define SLAVE 1 94#define MASTER 2 95#define IGNORE 4 96#define ALL (SLAVE|MASTER|IGNORE) 97#define SUBMASTER (SLAVE|MASTER) 98 99#define NHOSTS 1013 /* max of hosts controlled by timed 100 * This must be a prime number. 101 */ 102struct hosttbl { 103 struct hosttbl *h_bak; /* hash chain */ 104 struct hosttbl *h_fwd; 105 struct hosttbl *l_bak; /* "sequential" list */ 106 struct hosttbl *l_fwd; 107 struct netinfo *ntp; 108 struct sockaddr_in addr; 109 char name[MAXHOSTNAMELEN]; 110 u_char head; /* 1=head of hash chain */ 111 u_char good; /* 0=trusted host, for averaging */ 112 u_char noanswer; /* count of failures to answer */ 113 u_char need_set; /* need a SETTIME */ 114 u_short seq; 115 long delta; 116}; 117 118/* closed hash table with internal chaining */ 119extern struct hosttbl hosttbl[NHOSTS+1]; 120#define self hosttbl[0] 121#define hostname (self.name) 122 123 124struct netinfo { 125 struct netinfo *next; 126 struct in_addr net; 127 u_int32_t mask; 128 struct in_addr my_addr; 129 struct sockaddr_in dest_addr; /* broadcast addr or point-point */ 130 long status; 131 struct timeval slvwait; /* delay before sending our time */ 132 int quit_count; /* recent QUITs */ 133}; 134 135#include "extern.h" 136 137#define tvtomsround(tv) ((tv).tv_sec*1000 + ((tv).tv_usec + 500)/1000) 138 139extern struct netinfo *nettab; 140extern int status; 141extern int trace; 142extern int sock; 143extern struct sockaddr_in from; 144extern struct timeval from_when; /* when the last msg arrived */ 145extern u_short sequence; /* TSP message sequence number */ 146extern struct netinfo *fromnet, *slavenet; 147extern FILE *fd; 148extern long delay1, delay2; 149extern int nslavenets; /* nets were I could be a slave */ 150extern int nmasternets; /* nets were I could be a master */ 151extern int nignorednets; /* ignored nets */ 152extern int nnets; /* nets I am connected to */ 153 154 155#define trace_msg(msg) {if (trace) fprintf(fd, msg);} 156 157#define trace_sendto_err(addr) { \ 158 int st_errno = errno; \ 159 syslog(LOG_ERR, "%s %d: sendto %s: %m", \ 160 __FILE__, __LINE__, inet_ntoa(addr)); \ 161 if (trace) \ 162 fprintf(fd, "%s %d: sendto %s: %d", __FILE__, __LINE__, \ 163 inet_ntoa(addr), st_errno); \ 164} 165 166 167# define max(a,b) (a<b ? b : a) 168# define min(a,b) (a>b ? b : a) 169# define abs(x) (x>=0 ? x : -(x)) 170