1258945Sroberto#ifndef NETWORKING_H
2258945Sroberto#define NETWORKING_H
3258945Sroberto
4258945Sroberto#include <arpa/inet.h>
5258945Sroberto#include <netinet/in.h>
6258945Sroberto
7258945Sroberto#include <strings.h>
8258945Sroberto#include <errno.h>
9258945Sroberto#include <config.h>
10258945Sroberto#include <netdb.h>
11258945Sroberto#include <unistd.h>
12258945Sroberto#include <sys/types.h>
13258945Sroberto#include <sys/socket.h>
14258945Sroberto
15258945Sroberto#include <ntp_rfc2553.h>
16258945Sroberto#include <ntp_stdlib.h>
17258945Sroberto#include <ntp_machine.h>
18258945Sroberto#include <ntp_unixtime.h>
19258945Sroberto#include <ntp_fp.h>
20258945Sroberto#include <ntp.h>
21258945Sroberto
22258945Sroberto#include "crypto.h"
23258945Sroberto#include "log.h"
24258945Sroberto#include "sntp-opts.h"
25258945Sroberto#include "utilities.h"
26258945Sroberto
27258945Sroberto/* FIXME To be replaced by the constants in ntp.h */
28258945Sroberto#define SERVER_UNUSEABLE -1 /* Skip server */
29258945Sroberto#define PACKET_UNUSEABLE -2 /* Discard packet and try to get a useable packet again if not tried too often */
30258945Sroberto#define SERVER_AUTH_FAIL -3 /* Authentication failed, act upon settings */
31258945Sroberto#define KOD_DEMOBILIZE -4   /* KOD packet with code DENY or RSTR, stop all communication and save KOD information */
32258945Sroberto#define KOD_RATE -5	    /* KOD packet with code RATE, reduce poll intervall */
33258945Sroberto#define BROADCAST_FAILED -6
34258945Sroberto
35280849Scy/* prototypes */
36280849Scyint sendpkt(SOCKET rsock, sockaddr_u *dest, struct pkt *pkt, int len);
37280849Scyint recvdata(SOCKET rsock, sockaddr_u *sender, void *rdata,
38280849Scy	     int rdata_len);
39280849Scyint recvpkt(SOCKET rsock, struct pkt *rpkt, unsigned int rsize,
40280849Scy	    struct pkt *spkt);
41280849Scyint process_pkt(struct pkt *rpkt, sockaddr_u *sas, int pkt_len,
42280849Scy		int mode, struct pkt *spkt, const char *func_name);
43258945Sroberto
44258945Sroberto/* Shortened peer structure. Not absolutely necessary yet */
45258945Srobertostruct speer {
46258945Sroberto	struct speer *next;
47258945Sroberto	sockaddr_u srcadr;
48258945Sroberto	u_char version;
49258945Sroberto	u_char hmode;
50258945Sroberto	u_char hpoll;
51258945Sroberto	u_char minpoll;
52258945Sroberto	u_char maxpoll;
53258945Sroberto	u_int flags;
54258945Sroberto	u_char num_events;
55258945Sroberto	u_char ttl;
56258945Sroberto	u_char leap;
57258945Sroberto	u_char pmode;
58258945Sroberto	u_char stratum;
59258945Sroberto	u_char ppoll;
60258945Sroberto	u_char precision;	/* should be s_char */
61258945Sroberto	u_int32 refid;
62258945Sroberto	l_fp reftime;
63258945Sroberto	keyid_t keyid;
64258945Sroberto
65258945Sroberto#ifdef AUTOKEY
66258945Sroberto#define clear_to_zero opcode
67258945Sroberto	u_int32	opcode;		/* last request opcode */
68258945Sroberto	associd_t assoc;	/* peer association ID */
69258945Sroberto	u_int32	crypto;		/* peer status word */
70258945Sroberto	EVP_PKEY *pkey;		/* public key */
71258945Sroberto	const EVP_MD *digest;	/* message digest algorithm */
72258945Sroberto	char	*subject;	/* certificate subject name */
73258945Sroberto	char	*issuer;	/* certificate issuer name */
74258945Sroberto	struct cert_info *xinfo; /* issuer certificate */
75258945Sroberto	keyid_t	pkeyid;		/* previous key ID */
76258945Sroberto	keyid_t	hcookie;	/* host cookie */
77258945Sroberto	keyid_t	pcookie;	/* peer cookie */
78258945Sroberto	const struct pkey_info *ident_pkey; /* identity key */
79258945Sroberto	BIGNUM	*iffval;	/* identity challenge (IFF, GQ, MV) */
80258945Sroberto	const BIGNUM *grpkey;	/* identity challenge key (GQ) */
81258945Sroberto	struct value cookval;	/* receive cookie values */
82258945Sroberto	struct value recval;	/* receive autokey values */
83258945Sroberto	struct exten *cmmd;	/* extension pointer */
84258945Sroberto	u_long	refresh;	/* next refresh epoch */
85258945Sroberto
86258945Sroberto	/*
87258945Sroberto	 * Variables used by authenticated server
88258945Sroberto	 */
89258945Sroberto	keyid_t	*keylist;	/* session key ID list */
90258945Sroberto	int	keynumber;	/* current key number */
91258945Sroberto	struct value encrypt;	/* send encrypt values */
92258945Sroberto	struct value sndval;	/* send autokey values */
93258945Sroberto#else	/* !AUTOKEY follows */
94258945Sroberto#define clear_to_zero status
95258945Sroberto#endif	/* !AUTOKEY */
96258945Sroberto
97258945Sroberto	l_fp	rec;		/* receive time stamp */
98258945Sroberto	l_fp	xmt;		/* transmit time stamp */
99258945Sroberto	l_fp	dst;		/* destination timestamp */
100258945Sroberto	l_fp	aorg;		/* origin timestamp */
101258945Sroberto	l_fp	borg;		/* alternate origin timestamp */
102258945Sroberto	double	offset;		/* peer clock offset */
103258945Sroberto	double	delay;		/* peer roundtrip delay */
104258945Sroberto};
105258945Sroberto
106258945Sroberto
107258945Sroberto
108258945Sroberto
109258945Sroberto
110258945Sroberto#endif
111