]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/ntp/include/ntp_control.h
Fix multiple denial of service in ntpd.
[FreeBSD/FreeBSD.git] / contrib / ntp / include / ntp_control.h
1 #ifndef NTP_CONTROL_H
2 #define NTP_CONTROL_H
3 /*
4  * ntp_control.h - definitions related to NTP mode 6 control messages
5  */
6
7 #include "ntp_types.h"
8
9 typedef union ctl_pkt_u_tag {
10         u_char data[480 + MAX_MAC_LEN]; /* data + auth */
11         u_int32 u32[(480 + MAX_MAC_LEN) / sizeof(u_int32)];
12 } ctl_pkt_u;
13
14 struct ntp_control {
15         u_char li_vn_mode;              /* leap, version, mode */
16         u_char r_m_e_op;                /* response, more, error, opcode */
17         u_short sequence;               /* sequence number of request */
18         u_short status;                 /* status word for association */
19         associd_t associd;              /* association ID */
20         u_short offset;                 /* offset of this batch of data */
21         u_short count;                  /* count of data in this packet */
22         ctl_pkt_u u;
23 };
24
25 /*
26  * Length of the control header, in octets
27  */
28 #define CTL_HEADER_LEN          (offsetof(struct ntp_control, u))
29 #define CTL_MAX_DATA_LEN        468
30
31
32 /*
33  * Limits and things
34  */
35 #define CTL_MAXTRAPS    3               /* maximum number of traps we allow */
36 #define CTL_TRAPTIME    (60*60)         /* time out traps in 1 hour */
37 #define CTL_MAXAUTHSIZE 64              /* maximum size of an authen'ed req */
38
39 /*
40  * Decoding for the r_m_e_op field
41  */
42 #define CTL_RESPONSE    0x80
43 #define CTL_ERROR       0x40
44 #define CTL_MORE        0x20
45 #define CTL_OP_MASK     0x1f
46
47 #define CTL_ISRESPONSE(r_m_e_op) ((CTL_RESPONSE & (r_m_e_op)) != 0)
48 #define CTL_ISMORE(r_m_e_op)     ((CTL_MORE     & (r_m_e_op)) != 0)
49 #define CTL_ISERROR(r_m_e_op)    ((CTL_ERROR    & (r_m_e_op)) != 0)
50 #define CTL_OP(r_m_e_op)         (CTL_OP_MASK   & (r_m_e_op))
51
52 /*
53  * Opcodes
54  */
55 #define CTL_OP_UNSPEC           0       /* unspeciffied */
56 #define CTL_OP_READSTAT         1       /* read status */
57 #define CTL_OP_READVAR          2       /* read variables */
58 #define CTL_OP_WRITEVAR         3       /* write variables */
59 #define CTL_OP_READCLOCK        4       /* read clock variables */
60 #define CTL_OP_WRITECLOCK       5       /* write clock variables */
61 #define CTL_OP_SETTRAP          6       /* set trap address */
62 #define CTL_OP_ASYNCMSG         7       /* asynchronous message */
63 #define CTL_OP_CONFIGURE        8       /* runtime configuration */
64 #define CTL_OP_SAVECONFIG       9       /* save config to file */
65 #define CTL_OP_READ_MRU         10      /* retrieve MRU (mrulist) */
66 #define CTL_OP_READ_ORDLIST_A   11      /* ordered list req. auth. */
67 #define CTL_OP_REQ_NONCE        12      /* request a client nonce */
68 #define CTL_OP_UNSETTRAP        31      /* unset trap */
69
70 /*
71  * {En,De}coding of the system status word
72  */
73 #define CTL_SST_TS_UNSPEC       0       /* unspec */
74 #define CTL_SST_TS_ATOM         1       /* pps */
75 #define CTL_SST_TS_LF           2       /* lf radio */
76 #define CTL_SST_TS_HF           3       /* hf radio */
77 #define CTL_SST_TS_UHF          4       /* uhf radio */
78 #define CTL_SST_TS_LOCAL        5       /* local */
79 #define CTL_SST_TS_NTP          6       /* ntp */
80 #define CTL_SST_TS_UDPTIME      7       /* other */
81 #define CTL_SST_TS_WRSTWTCH     8       /* wristwatch */
82 #define CTL_SST_TS_TELEPHONE    9       /* telephone */
83
84 #define CTL_SYS_MAXEVENTS       15
85
86 #define CTL_SYS_STATUS(li, source, nevnt, evnt) \
87                 (((((unsigned short)(li))<< 14)&0xc000) | \
88                 (((source)<<8)&0x3f00) | \
89                 (((nevnt)<<4)&0x00f0) | \
90                 ((evnt)&0x000f))
91
92 #define CTL_SYS_LI(status)      (((status)>>14) & 0x3)
93 #define CTL_SYS_SOURCE(status)  (((status)>>8) & 0x3f)
94 #define CTL_SYS_NEVNT(status)   (((status)>>4) & 0xf)
95 #define CTL_SYS_EVENT(status)   ((status) & 0xf)
96
97 /*
98  * {En,De}coding of the peer status word
99  */
100 #define CTL_PST_CONFIG          0x80
101 #define CTL_PST_AUTHENABLE      0x40
102 #define CTL_PST_AUTHENTIC       0x20
103 #define CTL_PST_REACH           0x10
104 #define CTL_PST_BCAST           0x08
105
106 #define CTL_PST_SEL_REJECT      0       /*   reject */
107 #define CTL_PST_SEL_SANE        1       /* x falsetick */
108 #define CTL_PST_SEL_CORRECT     2       /* . excess */
109 #define CTL_PST_SEL_SELCAND     3       /* - outlier */
110 #define CTL_PST_SEL_SYNCCAND    4       /* + candidate */
111 #define CTL_PST_SEL_EXCESS      5       /* # backup */
112 #define CTL_PST_SEL_SYSPEER     6       /* * sys.peer */
113 #define CTL_PST_SEL_PPS         7       /* o pps.peer */
114
115 #define CTL_PEER_MAXEVENTS      15
116
117 #define CTL_PEER_STATUS(status, nevnt, evnt) \
118                 ((((status)<<8) & 0xff00) | \
119                 (((nevnt)<<4) & 0x00f0) | \
120                 ((evnt) & 0x000f))
121
122 #define CTL_PEER_STATVAL(status)(((status)>>8) & 0xff)
123 #define CTL_PEER_NEVNT(status)  (((status)>>4) & 0xf)
124 #define CTL_PEER_EVENT(status)  ((status) & 0xf)
125
126 /*
127  * {En,De}coding of the clock status word
128  */
129 #define CTL_CLK_OKAY            0
130 #define CTL_CLK_NOREPLY         1
131 #define CTL_CLK_BADFORMAT       2
132 #define CTL_CLK_FAULT           3
133 #define CTL_CLK_PROPAGATION     4
134 #define CTL_CLK_BADDATE         5
135 #define CTL_CLK_BADTIME         6
136
137 #define CTL_CLK_STATUS(status, event) \
138                 ((((status)<<8) & 0xff00) | \
139                 ((event) & 0x00ff))
140
141 /*
142  * Error code responses returned when the E bit is set.
143  */
144 #define CERR_UNSPEC     0
145 #define CERR_PERMISSION 1
146 #define CERR_BADFMT     2
147 #define CERR_BADOP      3
148 #define CERR_BADASSOC   4
149 #define CERR_UNKNOWNVAR 5
150 #define CERR_BADVALUE   6
151 #define CERR_RESTRICT   7
152
153 #define CERR_NORESOURCE CERR_PERMISSION /* wish there was a different code */
154
155
156 /*
157  * Definition of the structure used internally to hold trap information.
158  * ntp_request.c wants to see this.
159  */
160 struct ctl_trap {
161         sockaddr_u tr_addr;             /* address of trap recipient */
162         struct interface *tr_localaddr; /* interface to send this through */
163         u_long tr_settime;              /* time trap was set */
164         u_long tr_count;                /* async messages sent to this guy */
165         u_long tr_origtime;             /* time trap was originally set */
166         u_long tr_resets;               /* count of resets for this trap */
167         u_short tr_sequence;            /* trap sequence id */
168         u_char tr_flags;                /* trap flags */
169         u_char tr_version;              /* version number of trapper */
170 };
171 extern struct ctl_trap ctl_traps[CTL_MAXTRAPS];
172
173 /*
174  * Flag bits
175  */
176 #define TRAP_INUSE      0x1             /* this trap is active */
177 #define TRAP_NONPRIO    0x2             /* this trap is non-priority */
178 #define TRAP_CONFIGURED 0x4             /* this trap was configured */
179
180 /*
181  * Types of things we may deal with
182  * shared between ntpq and library
183  */
184 #define TYPE_SYS        1
185 #define TYPE_PEER       2
186 #define TYPE_CLOCK      3
187
188 /*
189  * IFSTATS_FIELDS is the number of fields ntpd supplies for each ifstats
190  * row.  Similarly RESLIST_FIELDS for reslist.
191  */
192 #define IFSTATS_FIELDS  12
193 #define RESLIST_FIELDS  4
194
195 #endif /* NTP_CONTROL_H */
196