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