1290001Sglebius#ifndef NETWORKING_H
2290001Sglebius#define NETWORKING_H
3290001Sglebius
4290001Sglebius#include <arpa/inet.h>
5290001Sglebius#include <netinet/in.h>
6290001Sglebius
7290001Sglebius#include <strings.h>
8290001Sglebius#include <errno.h>
9290001Sglebius#include <config.h>
10290001Sglebius#include <netdb.h>
11290001Sglebius#include <unistd.h>
12290001Sglebius#include <sys/types.h>
13290001Sglebius#include <sys/socket.h>
14290001Sglebius
15290001Sglebius#include <ntp_rfc2553.h>
16290001Sglebius#include <ntp_stdlib.h>
17290001Sglebius#include <ntp_machine.h>
18290001Sglebius#include <ntp_unixtime.h>
19290001Sglebius#include <ntp_fp.h>
20290001Sglebius#include <ntp.h>
21290001Sglebius
22290001Sglebius#include "crypto.h"
23290001Sglebius#include "log.h"
24290001Sglebius#include "sntp-opts.h"
25290001Sglebius#include "utilities.h"
26290001Sglebius
27290001Sglebius/* FIXME To be replaced by the constants in ntp.h */
28290001Sglebius#define SERVER_UNUSEABLE -1 /* Skip server */
29290001Sglebius#define PACKET_UNUSEABLE -2 /* Discard packet and try to get a useable packet again if not tried too often */
30290001Sglebius#define SERVER_AUTH_FAIL -3 /* Authentication failed, act upon settings */
31290001Sglebius#define KOD_DEMOBILIZE -4   /* KOD packet with code DENY or RSTR, stop all communication and save KOD information */
32290001Sglebius#define KOD_RATE -5	    /* KOD packet with code RATE, reduce poll intervall */
33290001Sglebius#define BROADCAST_FAILED -6
34290001Sglebius
35290001Sglebius/* prototypes */
36290001Sglebiusint sendpkt(SOCKET rsock, sockaddr_u *dest, struct pkt *pkt, int len);
37290001Sglebiusint recvdata(SOCKET rsock, sockaddr_u *sender, void *rdata,
38290001Sglebius	     int rdata_len);
39290001Sglebiusint recvpkt(SOCKET rsock, struct pkt *rpkt, unsigned int rsize,
40290001Sglebius	    struct pkt *spkt);
41290001Sglebiusint process_pkt(struct pkt *rpkt, sockaddr_u *sas, int pkt_len,
42290001Sglebius		int mode, struct pkt *spkt, const char *func_name);
43290001Sglebius
44290001Sglebius/* Shortened peer structure. Not absolutely necessary yet */
45290001Sglebiusstruct speer {
46290001Sglebius	struct speer *next;
47290001Sglebius	sockaddr_u srcadr;
48290001Sglebius	u_char version;
49290001Sglebius	u_char hmode;
50290001Sglebius	u_char hpoll;
51290001Sglebius	u_char minpoll;
52290001Sglebius	u_char maxpoll;
53290001Sglebius	u_int flags;
54290001Sglebius	u_char num_events;
55290001Sglebius	u_char ttl;
56290001Sglebius	u_char leap;
57290001Sglebius	u_char pmode;
58290001Sglebius	u_char stratum;
59290001Sglebius	u_char ppoll;
60290001Sglebius	u_char precision;	/* should be s_char */
61290001Sglebius	u_int32 refid;
62290001Sglebius	l_fp reftime;
63290001Sglebius	keyid_t keyid;
64290001Sglebius
65290001Sglebius#ifdef AUTOKEY
66290001Sglebius#define clear_to_zero opcode
67290001Sglebius	u_int32	opcode;		/* last request opcode */
68290001Sglebius	associd_t assoc;	/* peer association ID */
69290001Sglebius	u_int32	crypto;		/* peer status word */
70290001Sglebius	EVP_PKEY *pkey;		/* public key */
71290001Sglebius	const EVP_MD *digest;	/* message digest algorithm */
72290001Sglebius	char	*subject;	/* certificate subject name */
73290001Sglebius	char	*issuer;	/* certificate issuer name */
74290001Sglebius	struct cert_info *xinfo; /* issuer certificate */
75290001Sglebius	keyid_t	pkeyid;		/* previous key ID */
76290001Sglebius	keyid_t	hcookie;	/* host cookie */
77290001Sglebius	keyid_t	pcookie;	/* peer cookie */
78290001Sglebius	const struct pkey_info *ident_pkey; /* identity key */
79290001Sglebius	BIGNUM	*iffval;	/* identity challenge (IFF, GQ, MV) */
80290001Sglebius	const BIGNUM *grpkey;	/* identity challenge key (GQ) */
81290001Sglebius	struct value cookval;	/* receive cookie values */
82290001Sglebius	struct value recval;	/* receive autokey values */
83290001Sglebius	struct exten *cmmd;	/* extension pointer */
84290001Sglebius	u_long	refresh;	/* next refresh epoch */
85290001Sglebius
86290001Sglebius	/*
87290001Sglebius	 * Variables used by authenticated server
88290001Sglebius	 */
89290001Sglebius	keyid_t	*keylist;	/* session key ID list */
90290001Sglebius	int	keynumber;	/* current key number */
91290001Sglebius	struct value encrypt;	/* send encrypt values */
92290001Sglebius	struct value sndval;	/* send autokey values */
93290001Sglebius#else	/* !AUTOKEY follows */
94290001Sglebius#define clear_to_zero status
95290001Sglebius#endif	/* !AUTOKEY */
96290001Sglebius
97290001Sglebius	l_fp	rec;		/* receive time stamp */
98290001Sglebius	l_fp	xmt;		/* transmit time stamp */
99290001Sglebius	l_fp	dst;		/* destination timestamp */
100290001Sglebius	l_fp	aorg;		/* origin timestamp */
101290001Sglebius	l_fp	borg;		/* alternate origin timestamp */
102290001Sglebius	double	offset;		/* peer clock offset */
103290001Sglebius	double	delay;		/* peer roundtrip delay */
104290001Sglebius};
105290001Sglebius
106290001Sglebius
107290001Sglebius
108290001Sglebius
109290001Sglebius
110290001Sglebius#endif
111