#ifndef NTPSIM_H
#define NTPSIM_H
#include <stdio.h>
#include <math.h>
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#include <arpa/inet.h>
#include "ntp_syslog.h"
#include "ntp_fp.h"
#include "ntp.h"
#include "ntp_select.h"
#include "ntp_malloc.h"
#include "ntp_refclock.h"
#include "recvbuff.h"
#include "ntp_io.h"
#include "ntp_stdlib.h"
#include "ntp_prio_q.h"
#ifdef PI
# undef PI
#endif
#define PI 3.1415926535
#define SIM_TIME 86400
#define NET_DLY .001
#define PROC_DLY .001
#define BEEP_DLY 3600
typedef enum {
BEEP,
CLOCK,
TIMER,
PACKET
} funcTkn;
typedef struct {
double time;
funcTkn function;
union {
struct pkt evnt_pkt;
struct recvbuf evnt_buf;
} buffer;
#define ntp_pkt buffer.evnt_pkt
#define rcv_buf buffer.evnt_buf
} Event;
typedef struct script_info_tag script_info;
struct script_info_tag {
script_info * link;
double duration;
double freq_offset;
double wander;
double jitter;
double prop_delay;
double proc_delay;
};
typedef DECL_FIFO_ANCHOR(script_info) script_info_fifo;
typedef struct server_info_tag server_info;
struct server_info_tag {
server_info * link;
double server_time;
sockaddr_u * addr;
script_info_fifo * script;
script_info * curr_script;
};
typedef DECL_FIFO_ANCHOR(server_info) server_info_fifo;
typedef struct Sim_Info {
double sim_time;
double end_time;
double beep_delay;
int num_of_servers;
server_info *servers;
} sim_info;
typedef struct Local_Clock_Info {
double local_time;
double adj;
double slew;
double last_read_time;
} local_clock_info;
extern local_clock_info simclock;
extern sim_info simulation;
int ntpsim (int argc, char *argv[]);
Event *event (double t, funcTkn f);
void sim_event_timer (Event *e);
int simulate_server (sockaddr_u *serv_addr, endpt *inter,
struct pkt *rpkt);
void sim_update_clocks (Event *e);
void sim_event_recv_packet (Event *e);
void sim_event_beep (Event *e);
void abortsim (char *errmsg);
double gauss (double, double);
double poisson (double, double);
void create_server_associations(void);
#endif