]> git.ipfire.org Git - thirdparty/chrony.git/blob - candm.h
cmdmon: specify name instead of address in add request
[thirdparty/chrony.git] / candm.h
1 /*
2 chronyd/chronyc - Programs for keeping computer clocks accurate.
3
4 **********************************************************************
5 * Copyright (C) Richard P. Curnow 1997-2003
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 *
20 **********************************************************************
21
22 =======================================================================
23
24 Definitions for the network protocol used for command and monitoring
25 of the timeserver.
26
27 */
28
29 #ifndef GOT_CANDM_H
30 #define GOT_CANDM_H
31
32 #include "sysincl.h"
33 #include "addressing.h"
34
35 /* This is the default port to use for CANDM, if no alternative is
36 defined */
37 #define DEFAULT_CANDM_PORT 323
38
39 /* Request codes */
40 #define REQ_NULL 0
41 #define REQ_ONLINE 1
42 #define REQ_OFFLINE 2
43 #define REQ_BURST 3
44 #define REQ_MODIFY_MINPOLL 4
45 #define REQ_MODIFY_MAXPOLL 5
46 #define REQ_DUMP 6
47 #define REQ_MODIFY_MAXDELAY 7
48 #define REQ_MODIFY_MAXDELAYRATIO 8
49 #define REQ_MODIFY_MAXUPDATESKEW 9
50 #define REQ_LOGON 10
51 #define REQ_SETTIME 11
52 #define REQ_LOCAL 12
53 #define REQ_MANUAL 13
54 #define REQ_N_SOURCES 14
55 #define REQ_SOURCE_DATA 15
56 #define REQ_REKEY 16
57 #define REQ_ALLOW 17
58 #define REQ_ALLOWALL 18
59 #define REQ_DENY 19
60 #define REQ_DENYALL 20
61 #define REQ_CMDALLOW 21
62 #define REQ_CMDALLOWALL 22
63 #define REQ_CMDDENY 23
64 #define REQ_CMDDENYALL 24
65 #define REQ_ACCHECK 25
66 #define REQ_CMDACCHECK 26
67 #define REQ_ADD_SERVER 27
68 #define REQ_ADD_PEER 28
69 #define REQ_DEL_SOURCE 29
70 #define REQ_WRITERTC 30
71 #define REQ_DFREQ 31
72 #define REQ_DOFFSET 32
73 #define REQ_TRACKING 33
74 #define REQ_SOURCESTATS 34
75 #define REQ_RTCREPORT 35
76 #define REQ_TRIMRTC 36
77 #define REQ_CYCLELOGS 37
78 #define REQ_SUBNETS_ACCESSED 38
79 #define REQ_CLIENT_ACCESSES 39
80 #define REQ_CLIENT_ACCESSES_BY_INDEX 40
81 #define REQ_MANUAL_LIST 41
82 #define REQ_MANUAL_DELETE 42
83 #define REQ_MAKESTEP 43
84 #define REQ_ACTIVITY 44
85 #define REQ_MODIFY_MINSTRATUM 45
86 #define REQ_MODIFY_POLLTARGET 46
87 #define REQ_MODIFY_MAXDELAYDEVRATIO 47
88 #define REQ_RESELECT 48
89 #define REQ_RESELECTDISTANCE 49
90 #define REQ_MODIFY_MAKESTEP 50
91 #define REQ_SMOOTHING 51
92 #define REQ_SMOOTHTIME 52
93 #define REQ_REFRESH 53
94 #define REQ_SERVER_STATS 54
95 #define REQ_CLIENT_ACCESSES_BY_INDEX2 55
96 #define REQ_LOCAL2 56
97 #define REQ_NTP_DATA 57
98 #define REQ_ADD_SERVER2 58
99 #define REQ_ADD_PEER2 59
100 #define REQ_ADD_SERVER3 60
101 #define REQ_ADD_PEER3 61
102 #define REQ_SHUTDOWN 62
103 #define REQ_ONOFFLINE 63
104 #define REQ_ADD_SOURCE 64
105 #define N_REQUEST_TYPES 65
106
107 /* Structure used to exchange timespecs independent of time_t size */
108 typedef struct {
109 uint32_t tv_sec_high;
110 uint32_t tv_sec_low;
111 uint32_t tv_nsec;
112 } Timespec;
113
114 /* This is used in tv_sec_high for 32-bit timestamps */
115 #define TV_NOHIGHSEC 0x7fffffff
116
117 /* 32-bit floating-point format consisting of 7-bit signed exponent
118 and 25-bit signed coefficient without hidden bit.
119 The result is calculated as: 2^(exp - 25) * coef */
120 typedef struct {
121 int32_t f;
122 } Float;
123
124 /* The EOR (end of record) fields are used by the offsetof operator in
125 pktlength.c, to get the number of bytes that ought to be
126 transmitted for each packet type. */
127
128 typedef struct {
129 int32_t EOR;
130 } REQ_Null;
131
132 typedef struct {
133 IPAddr mask;
134 IPAddr address;
135 int32_t EOR;
136 } REQ_Online;
137
138 typedef struct {
139 IPAddr mask;
140 IPAddr address;
141 int32_t EOR;
142 } REQ_Offline;
143
144 typedef struct {
145 IPAddr mask;
146 IPAddr address;
147 int32_t n_good_samples;
148 int32_t n_total_samples;
149 int32_t EOR;
150 } REQ_Burst;
151
152 typedef struct {
153 IPAddr address;
154 int32_t new_minpoll;
155 int32_t EOR;
156 } REQ_Modify_Minpoll;
157
158 typedef struct {
159 IPAddr address;
160 int32_t new_maxpoll;
161 int32_t EOR;
162 } REQ_Modify_Maxpoll;
163
164 typedef struct {
165 int32_t pad;
166 int32_t EOR;
167 } REQ_Dump;
168
169 typedef struct {
170 IPAddr address;
171 Float new_max_delay;
172 int32_t EOR;
173 } REQ_Modify_Maxdelay;
174
175 typedef struct {
176 IPAddr address;
177 Float new_max_delay_ratio;
178 int32_t EOR;
179 } REQ_Modify_Maxdelayratio;
180
181 typedef struct {
182 IPAddr address;
183 Float new_max_delay_dev_ratio;
184 int32_t EOR;
185 } REQ_Modify_Maxdelaydevratio;
186
187 typedef struct {
188 IPAddr address;
189 int32_t new_min_stratum;
190 int32_t EOR;
191 } REQ_Modify_Minstratum;
192
193 typedef struct {
194 IPAddr address;
195 int32_t new_poll_target;
196 int32_t EOR;
197 } REQ_Modify_Polltarget;
198
199 typedef struct {
200 Float new_max_update_skew;
201 int32_t EOR;
202 } REQ_Modify_Maxupdateskew;
203
204 typedef struct {
205 int32_t limit;
206 Float threshold;
207 int32_t EOR;
208 } REQ_Modify_Makestep;
209
210 typedef struct {
211 Timespec ts;
212 int32_t EOR;
213 } REQ_Logon;
214
215 typedef struct {
216 Timespec ts;
217 int32_t EOR;
218 } REQ_Settime;
219
220 typedef struct {
221 int32_t on_off;
222 int32_t stratum;
223 Float distance;
224 int32_t orphan;
225 int32_t EOR;
226 } REQ_Local;
227
228 typedef struct {
229 int32_t option;
230 int32_t EOR;
231 } REQ_Manual;
232
233 typedef struct {
234 int32_t index;
235 int32_t EOR;
236 } REQ_Source_Data;
237
238 typedef struct {
239 IPAddr ip;
240 int32_t subnet_bits;
241 int32_t EOR;
242 } REQ_Allow_Deny;
243
244 typedef struct {
245 IPAddr ip;
246 int32_t EOR;
247 } REQ_Ac_Check;
248
249 /* Source types in NTP source requests */
250 #define REQ_ADDSRC_SERVER 1
251 #define REQ_ADDSRC_PEER 2
252
253 /* Flags used in NTP source requests */
254 #define REQ_ADDSRC_ONLINE 0x1
255 #define REQ_ADDSRC_AUTOOFFLINE 0x2
256 #define REQ_ADDSRC_IBURST 0x4
257 #define REQ_ADDSRC_PREFER 0x8
258 #define REQ_ADDSRC_NOSELECT 0x10
259 #define REQ_ADDSRC_TRUST 0x20
260 #define REQ_ADDSRC_REQUIRE 0x40
261 #define REQ_ADDSRC_INTERLEAVED 0x80
262 #define REQ_ADDSRC_BURST 0x100
263
264 typedef struct {
265 uint32_t type;
266 int8_t name[256];
267 uint32_t port;
268 int32_t minpoll;
269 int32_t maxpoll;
270 int32_t presend_minpoll;
271 uint32_t min_stratum;
272 uint32_t poll_target;
273 uint32_t version;
274 uint32_t max_sources;
275 int32_t min_samples;
276 int32_t max_samples;
277 uint32_t authkey;
278 Float max_delay;
279 Float max_delay_ratio;
280 Float max_delay_dev_ratio;
281 Float min_delay;
282 Float asymmetry;
283 Float offset;
284 uint32_t flags;
285 int32_t filter_length;
286 uint32_t reserved[3];
287 int32_t EOR;
288 } REQ_NTP_Source;
289
290 typedef struct {
291 IPAddr ip_addr;
292 int32_t EOR;
293 } REQ_Del_Source;
294
295 typedef struct {
296 Float dfreq;
297 int32_t EOR;
298 } REQ_Dfreq;
299
300 typedef struct {
301 int32_t sec;
302 int32_t usec;
303 int32_t EOR;
304 } REQ_Doffset;
305
306 typedef struct {
307 uint32_t index;
308 int32_t EOR;
309 } REQ_Sourcestats;
310
311 /* This is based on the response size rather than the
312 request size */
313 #define MAX_CLIENT_ACCESSES 8
314
315 typedef struct {
316 uint32_t first_index;
317 uint32_t n_clients;
318 int32_t EOR;
319 } REQ_ClientAccessesByIndex;
320
321 typedef struct {
322 int32_t index;
323 int32_t EOR;
324 } REQ_ManualDelete;
325
326 typedef struct {
327 Float distance;
328 int32_t EOR;
329 } REQ_ReselectDistance;
330
331 #define REQ_SMOOTHTIME_RESET 0
332 #define REQ_SMOOTHTIME_ACTIVATE 1
333
334 typedef struct {
335 int32_t option;
336 int32_t EOR;
337 } REQ_SmoothTime;
338
339 typedef struct {
340 IPAddr ip_addr;
341 int32_t EOR;
342 } REQ_NTPData;
343
344 /* ================================================== */
345
346 #define PKT_TYPE_CMD_REQUEST 1
347 #define PKT_TYPE_CMD_REPLY 2
348
349 /* This version number needs to be incremented whenever the packet
350 size and/or the format of any of the existing messages is changed.
351 Other changes, e.g. new command types, should be handled cleanly by
352 client.c and cmdmon.c anyway, so the version can stay the same.
353
354 Version 1 : original version with fixed size packets
355
356 Version 2 : both command and reply packet sizes made capable of
357 being variable length.
358
359 Version 3 : NTP_Source message lengthened (auto_offline)
360
361 Version 4 : IPv6 addressing added, 64-bit time values, sourcestats
362 and tracking reports extended, added flags to NTP source request,
363 trimmed source report, replaced fixed-point format with floating-point
364 and used also instead of integer microseconds, new commands: modify stratum,
365 modify polltarget, modify maxdelaydevratio, reselect, reselectdistance
366
367 Version 5 : auth data moved to the end of the packet to allow hashes with
368 different sizes, extended sources, tracking and activity reports, dropped
369 subnets accessed and client accesses
370
371 Version 6 : added padding to requests to prevent amplification attack,
372 changed maximum number of samples in manual list to 16, new commands: modify
373 makestep, smoothing, smoothtime
374
375 Support for authentication was removed later in version 6 of the protocol
376 and commands that required authentication are allowed only locally over Unix
377 domain socket.
378
379 Version 6 (no authentication) : changed format of client accesses by index
380 (using new request/reply types) and manual timestamp, added new fields and
381 flags to NTP source request and report, made length of manual list constant,
382 added new commands: ntpdata, refresh, serverstats, shutdown
383 */
384
385 #define PROTO_VERSION_NUMBER 6
386
387 /* The oldest protocol versions that are compatible enough with the current
388 version to report a version mismatch for the server and the client */
389 #define PROTO_VERSION_MISMATCH_COMPAT_SERVER 5
390 #define PROTO_VERSION_MISMATCH_COMPAT_CLIENT 4
391
392 /* The first protocol version using padding in requests */
393 #define PROTO_VERSION_PADDING 6
394
395 /* The maximum length of padding in request packet, currently
396 defined by MANUAL_LIST */
397 #define MAX_PADDING_LENGTH 396
398
399 /* ================================================== */
400
401 typedef struct {
402 uint8_t version; /* Protocol version */
403 uint8_t pkt_type; /* What sort of packet this is */
404 uint8_t res1;
405 uint8_t res2;
406 uint16_t command; /* Which command is being issued */
407 uint16_t attempt; /* How many resends the client has done
408 (count up from zero for same sequence
409 number) */
410 uint32_t sequence; /* Client's sequence number */
411 uint32_t pad1;
412 uint32_t pad2;
413
414 union {
415 REQ_Null null;
416 REQ_Online online;
417 REQ_Offline offline;
418 REQ_Burst burst;
419 REQ_Modify_Minpoll modify_minpoll;
420 REQ_Modify_Maxpoll modify_maxpoll;
421 REQ_Dump dump;
422 REQ_Modify_Maxdelay modify_maxdelay;
423 REQ_Modify_Maxdelayratio modify_maxdelayratio;
424 REQ_Modify_Maxdelaydevratio modify_maxdelaydevratio;
425 REQ_Modify_Minstratum modify_minstratum;
426 REQ_Modify_Polltarget modify_polltarget;
427 REQ_Modify_Maxupdateskew modify_maxupdateskew;
428 REQ_Modify_Makestep modify_makestep;
429 REQ_Logon logon;
430 REQ_Settime settime;
431 REQ_Local local;
432 REQ_Manual manual;
433 REQ_Source_Data source_data;
434 REQ_Allow_Deny allow_deny;
435 REQ_Ac_Check ac_check;
436 REQ_NTP_Source ntp_source;
437 REQ_Del_Source del_source;
438 REQ_Dfreq dfreq;
439 REQ_Doffset doffset;
440 REQ_Sourcestats sourcestats;
441 REQ_ClientAccessesByIndex client_accesses_by_index;
442 REQ_ManualDelete manual_delete;
443 REQ_ReselectDistance reselect_distance;
444 REQ_SmoothTime smoothtime;
445 REQ_NTPData ntp_data;
446 } data; /* Command specific parameters */
447
448 /* Padding used to prevent traffic amplification. It only defines the
449 maximum size of the packet, there is no hole after the data field. */
450 uint8_t padding[MAX_PADDING_LENGTH];
451
452 } CMD_Request;
453
454 /* ================================================== */
455 /* Authority codes for command types */
456
457 #define PERMIT_OPEN 0
458 #define PERMIT_LOCAL 1
459 #define PERMIT_AUTH 2
460
461 /* ================================================== */
462
463 /* Reply codes */
464 #define RPY_NULL 1
465 #define RPY_N_SOURCES 2
466 #define RPY_SOURCE_DATA 3
467 #define RPY_MANUAL_TIMESTAMP 4
468 #define RPY_TRACKING 5
469 #define RPY_SOURCESTATS 6
470 #define RPY_RTC 7
471 #define RPY_SUBNETS_ACCESSED 8
472 #define RPY_CLIENT_ACCESSES 9
473 #define RPY_CLIENT_ACCESSES_BY_INDEX 10
474 #define RPY_MANUAL_LIST 11
475 #define RPY_ACTIVITY 12
476 #define RPY_SMOOTHING 13
477 #define RPY_SERVER_STATS 14
478 #define RPY_CLIENT_ACCESSES_BY_INDEX2 15
479 #define RPY_NTP_DATA 16
480 #define RPY_MANUAL_TIMESTAMP2 17
481 #define RPY_MANUAL_LIST2 18
482 #define N_REPLY_TYPES 19
483
484 /* Status codes */
485 #define STT_SUCCESS 0
486 #define STT_FAILED 1
487 #define STT_UNAUTH 2
488 #define STT_INVALID 3
489 #define STT_NOSUCHSOURCE 4
490 #define STT_INVALIDTS 5
491 #define STT_NOTENABLED 6
492 #define STT_BADSUBNET 7
493 #define STT_ACCESSALLOWED 8
494 #define STT_ACCESSDENIED 9
495 /* Deprecated */
496 #define STT_NOHOSTACCESS 10
497 #define STT_SOURCEALREADYKNOWN 11
498 #define STT_TOOMANYSOURCES 12
499 #define STT_NORTC 13
500 #define STT_BADRTCFILE 14
501 #define STT_INACTIVE 15
502 #define STT_BADSAMPLE 16
503 #define STT_INVALIDAF 17
504 #define STT_BADPKTVERSION 18
505 #define STT_BADPKTLENGTH 19
506 #define STT_INVALIDNAME 21
507
508 typedef struct {
509 int32_t EOR;
510 } RPY_Null;
511
512 typedef struct {
513 uint32_t n_sources;
514 int32_t EOR;
515 } RPY_N_Sources;
516
517 #define RPY_SD_MD_CLIENT 0
518 #define RPY_SD_MD_PEER 1
519 #define RPY_SD_MD_REF 2
520
521 #define RPY_SD_ST_SYNC 0
522 #define RPY_SD_ST_UNREACH 1
523 #define RPY_SD_ST_FALSETICKER 2
524 #define RPY_SD_ST_JITTERY 3
525 #define RPY_SD_ST_CANDIDATE 4
526 #define RPY_SD_ST_OUTLIER 5
527
528 #define RPY_SD_FLAG_NOSELECT 0x1
529 #define RPY_SD_FLAG_PREFER 0x2
530 #define RPY_SD_FLAG_TRUST 0x4
531 #define RPY_SD_FLAG_REQUIRE 0x8
532
533 typedef struct {
534 IPAddr ip_addr;
535 int16_t poll;
536 uint16_t stratum;
537 uint16_t state;
538 uint16_t mode;
539 uint16_t flags;
540 uint16_t reachability;
541 uint32_t since_sample;
542 Float orig_latest_meas;
543 Float latest_meas;
544 Float latest_meas_err;
545 int32_t EOR;
546 } RPY_Source_Data;
547
548 typedef struct {
549 uint32_t ref_id;
550 IPAddr ip_addr;
551 uint16_t stratum;
552 uint16_t leap_status;
553 Timespec ref_time;
554 Float current_correction;
555 Float last_offset;
556 Float rms_offset;
557 Float freq_ppm;
558 Float resid_freq_ppm;
559 Float skew_ppm;
560 Float root_delay;
561 Float root_dispersion;
562 Float last_update_interval;
563 int32_t EOR;
564 } RPY_Tracking;
565
566 typedef struct {
567 uint32_t ref_id;
568 IPAddr ip_addr;
569 uint32_t n_samples;
570 uint32_t n_runs;
571 uint32_t span_seconds;
572 Float sd;
573 Float resid_freq_ppm;
574 Float skew_ppm;
575 Float est_offset;
576 Float est_offset_err;
577 int32_t EOR;
578 } RPY_Sourcestats;
579
580 typedef struct {
581 Timespec ref_time;
582 uint16_t n_samples;
583 uint16_t n_runs;
584 uint32_t span_seconds;
585 Float rtc_seconds_fast;
586 Float rtc_gain_rate_ppm;
587 int32_t EOR;
588 } RPY_Rtc;
589
590 typedef struct {
591 Float offset;
592 Float dfreq_ppm;
593 Float new_afreq_ppm;
594 int32_t EOR;
595 } RPY_ManualTimestamp;
596
597 typedef struct {
598 IPAddr ip;
599 uint32_t ntp_hits;
600 uint32_t cmd_hits;
601 uint32_t ntp_drops;
602 uint32_t cmd_drops;
603 int8_t ntp_interval;
604 int8_t cmd_interval;
605 int8_t ntp_timeout_interval;
606 int8_t pad;
607 uint32_t last_ntp_hit_ago;
608 uint32_t last_cmd_hit_ago;
609 } RPY_ClientAccesses_Client;
610
611 typedef struct {
612 uint32_t n_indices; /* how many indices there are in the server's table */
613 uint32_t next_index; /* the index 1 beyond those processed on this call */
614 uint32_t n_clients; /* the number of valid entries in the following array */
615 RPY_ClientAccesses_Client clients[MAX_CLIENT_ACCESSES];
616 int32_t EOR;
617 } RPY_ClientAccessesByIndex;
618
619 typedef struct {
620 uint32_t ntp_hits;
621 uint32_t cmd_hits;
622 uint32_t ntp_drops;
623 uint32_t cmd_drops;
624 uint32_t log_drops;
625 int32_t EOR;
626 } RPY_ServerStats;
627
628 #define MAX_MANUAL_LIST_SAMPLES 16
629
630 typedef struct {
631 Timespec when;
632 Float slewed_offset;
633 Float orig_offset;
634 Float residual;
635 } RPY_ManualListSample;
636
637 typedef struct {
638 uint32_t n_samples;
639 RPY_ManualListSample samples[MAX_MANUAL_LIST_SAMPLES];
640 int32_t EOR;
641 } RPY_ManualList;
642
643 typedef struct {
644 int32_t online;
645 int32_t offline;
646 int32_t burst_online;
647 int32_t burst_offline;
648 int32_t unresolved;
649 int32_t EOR;
650 } RPY_Activity;
651
652 #define RPY_SMT_FLAG_ACTIVE 0x1
653 #define RPY_SMT_FLAG_LEAPONLY 0x2
654
655 typedef struct {
656 uint32_t flags;
657 Float offset;
658 Float freq_ppm;
659 Float wander_ppm;
660 Float last_update_ago;
661 Float remaining_time;
662 int32_t EOR;
663 } RPY_Smoothing;
664
665 #define RPY_NTP_FLAGS_TESTS 0x3ff
666 #define RPY_NTP_FLAG_INTERLEAVED 0x4000
667 #define RPY_NTP_FLAG_AUTHENTICATED 0x8000
668
669 typedef struct {
670 IPAddr remote_addr;
671 IPAddr local_addr;
672 uint16_t remote_port;
673 uint8_t leap;
674 uint8_t version;
675 uint8_t mode;
676 uint8_t stratum;
677 int8_t poll;
678 int8_t precision;
679 Float root_delay;
680 Float root_dispersion;
681 uint32_t ref_id;
682 Timespec ref_time;
683 Float offset;
684 Float peer_delay;
685 Float peer_dispersion;
686 Float response_time;
687 Float jitter_asymmetry;
688 uint16_t flags;
689 uint8_t tx_tss_char;
690 uint8_t rx_tss_char;
691 uint32_t total_tx_count;
692 uint32_t total_rx_count;
693 uint32_t total_valid_count;
694 uint32_t reserved[4];
695 int32_t EOR;
696 } RPY_NTPData;
697
698 typedef struct {
699 uint8_t version;
700 uint8_t pkt_type;
701 uint8_t res1;
702 uint8_t res2;
703 uint16_t command; /* Which command is being replied to */
704 uint16_t reply; /* Which format of reply this is */
705 uint16_t status; /* Status of command processing */
706 uint16_t pad1; /* Padding for compatibility and 4 byte alignment */
707 uint16_t pad2;
708 uint16_t pad3;
709 uint32_t sequence; /* Echo of client's sequence number */
710 uint32_t pad4;
711 uint32_t pad5;
712
713 union {
714 RPY_Null null;
715 RPY_N_Sources n_sources;
716 RPY_Source_Data source_data;
717 RPY_ManualTimestamp manual_timestamp;
718 RPY_Tracking tracking;
719 RPY_Sourcestats sourcestats;
720 RPY_Rtc rtc;
721 RPY_ClientAccessesByIndex client_accesses_by_index;
722 RPY_ServerStats server_stats;
723 RPY_ManualList manual_list;
724 RPY_Activity activity;
725 RPY_Smoothing smoothing;
726 RPY_NTPData ntp_data;
727 } data; /* Reply specific parameters */
728
729 } CMD_Reply;
730
731 /* ================================================== */
732
733 #endif /* GOT_CANDM_H */