1 /*        $NetBSD: ntpsim.h,v 1.5 2020/05/25 20:47:20 christos Exp $  */
2 
3 /* ntpsim.h
4  *
5  * The header file for the ntp discrete event simulator.
6  *
7  * Written By:      Sachin Kamboj
8  *                  University of Delaware
9  *                  Newark, DE 19711
10  * Copyright (c) 2006
11  */
12 
13 #ifndef NTPSIM_H
14 #define NTPSIM_H
15 
16 #include <stdio.h>
17 #include <math.h>
18 #ifdef HAVE_SYS_SOCKET_H
19 #include <sys/socket.h>
20 #endif
21 #include <arpa/inet.h>
22 #include "ntp_syslog.h"
23 #include "ntp_fp.h"
24 #include "ntp.h"
25 #include "ntp_select.h"
26 #include "ntp_malloc.h"
27 #include "ntp_refclock.h"
28 #include "recvbuff.h"
29 #include "ntp_io.h"
30 #include "ntp_stdlib.h"
31 #include "ntp_prio_q.h"
32 
33 /* CONSTANTS */
34 
35 #ifdef PI
36 # undef PI
37 #endif
38 #define PI 3.1415926535         /* The world's most famous constant */
39 #define SIM_TIME 86400                  /* end simulation time */
40 #define NET_DLY .001            /* network delay */
41 #define PROC_DLY .001                   /* processing delay */
42 #define BEEP_DLY 3600           /* beep interval (s) */
43 
44 
45 /* Discrete Event Queue
46  * --------------------
47  * The NTP simulator is a discrete event simulator.
48  *
49  * Central to this simulator is an event queue which is a priority queue
50  * in which the "priority" is given by the time of arrival of the event.
51  *
52  * A discrete set of events can happen and are stored in the queue to arrive
53  * at a particular time.
54  */
55 
56 /* Possible Discrete Events */
57 
58 typedef enum {
59     BEEP,          /* Event to record simulator stats */
60     CLOCK,         /* Event to advance the clock to the specified time */
61     TIMER,         /* Event that designates a timer interrupt. */
62     PACKET         /* Event that designates arrival of a packet */
63 } funcTkn;
64 
65 
66 /* Event information */
67 
68 typedef struct {
69     double time;       /* Time at which event occurred */
70     funcTkn function;  /* Type of event that occured */
71     union {
72         struct pkt evnt_pkt;
73         struct recvbuf evnt_buf;
74     } buffer;          /* Other data associated with the event */
75 #define ntp_pkt buffer.evnt_pkt
76 #define rcv_buf buffer.evnt_buf
77 } Event;
78 
79 
80 /* Server Script Information */
81 typedef struct script_info_tag script_info;
82 struct script_info_tag {
83           script_info *       link;
84           double              duration;
85           double              freq_offset;
86           double              wander;
87           double              jitter;
88           double              prop_delay;
89           double              proc_delay;
90 };
91 
92 typedef DECL_FIFO_ANCHOR(script_info) script_info_fifo;
93 
94 
95 /* Server Structures */
96 
97 typedef struct server_info_tag server_info;
98 struct server_info_tag {
99           server_info *                 link;
100           double                        server_time;
101           sockaddr_u *                  addr;
102           script_info_fifo *  script;
103           script_info *                 curr_script;
104 };
105 
106 typedef DECL_FIFO_ANCHOR(server_info) server_info_fifo;
107 
108 
109 /* Simulation control information */
110 
111 typedef struct Sim_Info {
112     double sim_time;      /* Time in the simulation */
113     double end_time;      /* Time at which simulation needs to be ended */
114     double beep_delay;    /* Delay between simulation "beeps" at which
115                              simulation  stats are recorded. */
116     int num_of_servers;   /* Number of servers in the simulation */
117     server_info *servers; /* Pointer to array of servers */
118 } sim_info;
119 
120 
121 /* Local Clock (Client) Variables */
122 
123 typedef struct Local_Clock_Info {
124     double local_time;                  /* Client disciplined time */
125     double adj;                         /* Remaining time correction */
126     double slew;              /* Correction Slew Rate */
127     double last_read_time;    /* Last time the clock was read */
128 } local_clock_info;
129 
130 extern local_clock_info simclock; /* Local Clock Variables */
131 extern sim_info simulation;     /* Simulation Control Variables */
132 
133 /* Function Prototypes */
134 
135 int        ntpsim                       (int argc, char *argv[]);
136 Event    *event                         (double t, funcTkn f);
137 void     sim_event_timer      (Event *e);
138 int      simulate_server      (sockaddr_u *serv_addr, endpt *inter,
139                                          struct pkt *rpkt);
140 void     sim_update_clocks    (Event *e);
141 void     sim_event_recv_packet          (Event *e);
142 void     sim_event_beep                 (Event *e);
143 void     abortsim             (char *errmsg);
144 double     gauss                        (double, double);
145 double     poisson            (double, double);
146 void     create_server_associations(void);
147 
148 #endif    /* NTPSIM_H */
149