Remove __P macros from src/usr.bin and src/usr.sbin.
[dragonfly.git] / usr.sbin / atm / scspd / scsp_var.h
1 /*
2  *
3  * ===================================
4  * HARP  |  Host ATM Research Platform
5  * ===================================
6  *
7  *
8  * This Host ATM Research Platform ("HARP") file (the "Software") is
9  * made available by Network Computing Services, Inc. ("NetworkCS")
10  * "AS IS".  NetworkCS does not provide maintenance, improvements or
11  * support of any kind.
12  *
13  * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
14  * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
15  * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
16  * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
17  * In no event shall NetworkCS be responsible for any damages, including
18  * but not limited to consequential damages, arising from or relating to
19  * any use of the Software or related support.
20  *
21  * Copyright 1994-1998 Network Computing Services, Inc.
22  *
23  * Copies of this Software may be made, however, the above copyright
24  * notice must be reproduced on all copies.
25  *
26  *      @(#) $FreeBSD: src/usr.sbin/atm/scspd/scsp_var.h,v 1.3 1999/08/28 01:15:34 peter Exp $
27  *      @(#) $DragonFly: src/usr.sbin/atm/scspd/scsp_var.h,v 1.3 2003/11/03 19:31:35 eirikn Exp $
28  *
29  */
30
31 /*
32  * Server Cache Synchronization Protocol (SCSP) Support
33  * ----------------------------------------------------
34  *
35  * SCSP message formats
36  *
37  */
38
39 #ifndef _SCSP_SCSP_VAR_H
40 #define _SCSP_SCSP_VAR_H
41
42
43 /*
44  * Protocol constants
45  */
46 #define SCSP_Open_Interval      30
47 #define SCSP_HELLO_Interval     3
48 #define SCSP_HELLO_DF           3
49 #define SCSP_CAReXmitInterval   3
50 #define SCSP_CSUSReXmitInterval 3
51 #define SCSP_CSA_HOP_CNT        3
52 #define SCSP_CSUReXmitInterval  2
53 #define SCSP_CSUReXmitMax       5
54
55
56 /*
57  * Operational constants
58  */
59 #define SCSPD_CONFIG    "/etc/scspd.conf"
60 #define SCSPD_DIR       "/tmp"
61 #define SCSPD_DUMP      "/tmp/scspd.dump"
62 #define SCSP_HASHSZ     19
63 #define SCSPD_SOCK_NAME "SCSPD"
64
65
66 /*
67  * HELLO finite state machine states
68  */
69 #define SCSP_HFSM_DOWN          0
70 #define SCSP_HFSM_WAITING       1
71 #define SCSP_HFSM_UNI_DIR       2
72 #define SCSP_HFSM_BI_DIR        3
73 #define SCSP_HFSM_STATE_CNT     SCSP_HFSM_BI_DIR + 1
74
75
76 /*
77  * HELLO finite state machine events
78  */
79 #define SCSP_HFSM_VC_ESTAB      0
80 #define SCSP_HFSM_VC_CLOSED     1
81 #define SCSP_HFSM_HELLO_T       2
82 #define SCSP_HFSM_RCV_T         3
83 #define SCSP_HFSM_RCVD          4
84 #define SCSP_HFSM_EVENT_CNT     SCSP_HFSM_RCVD + 1
85
86
87 /*
88  * Cache Alignment finite state machine states
89  */
90 #define SCSP_CAFSM_DOWN         0
91 #define SCSP_CAFSM_NEG          1
92 #define SCSP_CAFSM_MASTER       2
93 #define SCSP_CAFSM_SLAVE        3
94 #define SCSP_CAFSM_UPDATE       4
95 #define SCSP_CAFSM_ALIGNED      5
96 #define SCSP_CAFSM_STATE_CNT    SCSP_CAFSM_ALIGNED + 1
97
98
99 /*
100  * Cache Alignment finite state machine events
101  */
102 #define SCSP_CAFSM_HELLO_UP     0
103 #define SCSP_CAFSM_HELLO_DOWN   1
104 #define SCSP_CAFSM_CA_MSG       2
105 #define SCSP_CAFSM_CSUS_MSG     3
106 #define SCSP_CAFSM_CSU_REQ      4
107 #define SCSP_CAFSM_CSU_REPLY    5
108 #define SCSP_CAFSM_CA_T         6
109 #define SCSP_CAFSM_CSUS_T       7
110 #define SCSP_CAFSM_CSU_T        8
111 #define SCSP_CAFSM_CACHE_UPD    9
112 #define SCSP_CAFSM_CACHE_RSP    10
113 #define SCSP_CAFSM_EVENT_CNT    SCSP_CAFSM_CACHE_RSP + 1
114
115
116 /*
117  * Client Interface finite state machine states
118  */
119 #define SCSP_CIFSM_NULL         0
120 #define SCSP_CIFSM_SUM          1
121 #define SCSP_CIFSM_UPD          2
122 #define SCSP_CIFSM_ALIGN        3
123 #define SCSP_CIFSM_STATE_CNT            SCSP_CIFSM_ALIGN + 1
124
125
126 /*
127  * Client Interface finite state machine events
128  */
129 #define SCSP_CIFSM_CA_DOWN      0
130 #define SCSP_CIFSM_CA_SUMM      1
131 #define SCSP_CIFSM_CA_UPD       2
132 #define SCSP_CIFSM_CA_ALIGN     3
133 #define SCSP_CIFSM_SOL_RSP      4
134 #define SCSP_CIFSM_UPD_REQ      5
135 #define SCSP_CIFSM_UPD_RSP      6
136 #define SCSP_CIFSM_CSU_REQ      7
137 #define SCSP_CIFSM_CSU_REPLY    8
138 #define SCSP_CIFSM_CSU_SOL      9
139 #define SCSP_CIFSM_EVENT_CNT    SCSP_CIFSM_CSU_SOL + 1
140
141
142 /*
143  * Server connection states (not part of any FSM)
144  */
145 #define SCSP_SS_NULL    0
146 #define SCSP_SS_CFG     1
147 #define SCSP_SS_ACTIVE  2
148
149
150 /*
151  * Hash a cache key
152  *
153  *      key     pointer to an Scsp_ckey structure
154  */
155 #define SCSP_HASH(key)  scsp_hash((key))
156
157
158 /*
159  * Add a cache summary entry to a client's cache summary
160  *
161  *      cpp     pointer to a server control block
162  *      key     pointer to an Scsp_cse structure
163  */
164 #define SCSP_ADD(cpp, key)                                      \
165 {                                                               \
166         Scsp_cse        **c;                                    \
167         c = &(cpp)->ss_cache[SCSP_HASH(&(key)->sc_key)];        \
168         LINK2TAIL((key), Scsp_cse, *c, sc_next);                \
169 }
170
171
172 /*
173  * Delete a cache summary entry from a client's cache summary
174  *
175  *      cpp     pointer to a server control block
176  *      s       pointer to an Scsp_cse structure
177  */
178 #define SCSP_DELETE(cpp, s)                             \
179 {                                                       \
180         Scsp_cse        **c;                            \
181         c = &(cpp)->ss_cache[SCSP_HASH(&(s)->sc_key)];  \
182         UNLINK((s), Scsp_cse, *c, sc_next);             \
183 }
184
185
186 /*
187  * Search a client's cache summary for a given key
188  *
189  *      cpp     pointer to a server control block
190  *      key     pointer to an Scsp_ckey structure to find
191  *      s       Scsp_cse structure pointer to be set
192  */
193 #define SCSP_LOOKUP(cpp, key, s)                                \
194 {                                                               \
195         for ((s) = (cpp)->ss_cache[SCSP_HASH(key)];             \
196                         (s);                                    \
197                         (s) = (s)->sc_next) {                   \
198                 if (scsp_cmp_key((key), &(s)->sc_key) == 0)     \
199                         break;                                  \
200         }                                                       \
201 }
202
203
204 /*
205  * SCSP pending connection control block
206  *
207  * The pending connection block is used to keep track of server
208  * connections which are open but haven't been identified yet.
209  */
210 struct scsp_pending {
211         struct scsp_pending     *sp_next;
212         int                     sp_sock;
213 };
214 typedef struct scsp_pending     Scsp_pending;
215
216
217 /*
218  * SCSP Server instance control block
219  */
220 struct scsp_server {
221         struct scsp_server      *ss_next;       /* Server chain */
222         char            *ss_name;               /* Server name */
223         char            ss_intf[IFNAMSIZ];      /* Interface */
224         Atm_media       ss_media;       /* Physical comm medium */
225         char            ss_state;       /* Server connection state */
226         u_long          ss_pid;         /* Protocol ID */
227         int             ss_id_len;      /* ID length */
228         int             ss_ckey_len;    /* Cache key length */
229         u_long          ss_sgid;        /* Server group ID */
230         u_long          ss_fid;         /* Family ID */
231         int             ss_sock;        /* Socket to client */
232         int             ss_dcs_lsock;   /* DCS listen socket */
233         Scsp_id         ss_lsid;        /* Local Server ID */
234         Atm_addr        ss_addr;        /* Local ATM addr */
235         Atm_addr        ss_subaddr;     /* Local ATM subaddr */
236         int             ss_mtu;         /* Interface MTU */
237         int             ss_mark;
238         struct scsp_dcs *ss_dcs;        /* Ptr to list of DCSs */
239         struct scsp_cse *ss_cache[SCSP_HASHSZ]; /* Client's cache */
240 };
241 typedef struct scsp_server      Scsp_server;
242
243
244 /*
245  * SCSP client cache summary entry control block
246  */
247 struct scsp_cse {
248         struct scsp_cse *sc_next;       /* Next on chain */
249         long            sc_seq;         /* CSA sequence no */
250         Scsp_ckey       sc_key;         /* Cache key */
251         Scsp_id         sc_oid;         /* Origin ID */
252 };
253 typedef struct scsp_cse Scsp_cse;
254
255
256 /*
257  * CSU Request retransmission control block
258  */
259 struct scsp_csu_rexmt {
260         struct scsp_csu_rexmt   *sr_next;       /* Next rexmit block */
261         struct scsp_dcs         *sr_dcs;        /* DCS block */
262         Scsp_csa                *sr_csa;        /* CSAs for rexmit */
263         Harp_timer              sr_t;           /* Rexmit timer */
264 };
265 typedef struct scsp_csu_rexmt   Scsp_csu_rexmt;
266
267
268 /*
269  * SCSP DCS control block
270  */
271 struct scsp_dcs {
272         struct scsp_dcs *sd_next;       /* DCS chain */
273         Scsp_server     *sd_server;     /* Local server */
274         Scsp_id         sd_dcsid;       /* DCS ID */
275         Atm_addr        sd_addr;        /* DCS ATM address */
276         Atm_addr        sd_subaddr;     /* DCS ATM subaddress */
277         int             sd_sock;        /* Socket to DCS */
278         Harp_timer      sd_open_t;      /* Open VCC retry timer */
279         int             sd_hello_state; /* Hello FSM state */
280         int             sd_hello_int;   /* Hello interval */
281         int             sd_hello_df;    /* Hello dead factor */
282         int             sd_hello_rcvd;  /* Hello msg received */
283         Harp_timer      sd_hello_h_t;   /* Hello timer */
284         Harp_timer      sd_hello_rcv_t; /* Hello receive timer */
285         int             sd_ca_state;    /* CA FSM state */
286         long            sd_ca_seq;      /* CA sequence number */
287         int             sd_ca_rexmt_int;        /* CA rexmit interval */
288         Scsp_msg        *sd_ca_rexmt_msg;       /* Saved CA msg */
289         Scsp_cse        *sd_ca_csas;            /* CSAS still to send */
290         Harp_timer      sd_ca_rexmt_t;          /* CA rexmit timer */
291         int             sd_csus_rexmt_int;      /* CSUS rexmit int */
292         Scsp_csa        *sd_crl;                /* Cache req list */
293         Scsp_msg        *sd_csus_rexmt_msg;     /* Saved CSUS msg */
294         Harp_timer      sd_csus_rexmt_t;        /* CSUS rexmit timer */
295         int             sd_hops;                /* CSA hop count */
296         Scsp_csa        *sd_csu_ack_pend;       /* CSUs to be ACKed */
297         Scsp_csa        *sd_csu_ack;            /* CSUs ACKed */
298         int             sd_csu_rexmt_int;       /* CSU Req rxmt time */
299         int             sd_csu_rexmt_max;       /* CSU Req rxmt limit */
300         Scsp_csu_rexmt  *sd_csu_rexmt;          /* CSU Req rxmt queue */
301         int             sd_client_state;        /* Client I/F state */
302 };
303 typedef struct scsp_dcs Scsp_dcs;
304
305 /*
306  * Trace options
307  */
308 #define SCSP_TRACE_HFSM         1       /* Trace the Hello FSM */
309 #define SCSP_TRACE_CAFSM        2       /* Trace the CA FSM */
310 #define SCSP_TRACE_CFSM         4       /* Trace the server I/F FSM */
311 #define SCSP_TRACE_HELLO_MSG    8       /* Trace Hello protocol msgs */
312 #define SCSP_TRACE_CA_MSG       16      /* Trace CA protocol msgs */
313 #define SCSP_TRACE_IF_MSG       32      /* Trace server I/F msgs */
314
315
316 /*
317  * Global variables
318  */
319 extern char             *prog;
320 extern FILE             *cfg_file;
321 extern int              parse_line;
322 extern char             *scsp_config_file;
323 extern FILE             *scsp_log_file;
324 extern int              scsp_log_syslog;
325 extern Scsp_server      *scsp_server_head;
326 extern Scsp_pending     *scsp_pending_head;
327 extern int              scsp_max_socket;
328 extern int              scsp_debug_mode;
329 extern int              scsp_trace_mode;
330 extern FILE             *scsp_trace_file;
331
332
333 /*
334  * Executable functions
335  */
336 /* scsp_cafsm.c */
337 extern int      scsp_cafsm(Scsp_dcs *, int, void *);
338
339 /* scsp_config.c */
340 extern int      scsp_config(char *);
341 extern int      start_dcs(void);
342 extern int      finish_dcs(void);
343 extern int      set_dcs_addr(char *, char *);
344 extern int      set_dcs_ca_rexmit(int);
345 extern int      set_dcs_csus_rexmit(int);
346 extern int      set_dcs_csu_rexmit(int);
347 extern int      set_dcs_csu_rexmit_max(int);
348 extern int      set_dcs_hello_df(int);
349 extern int      set_dcs_hello_int(int);
350 extern int      set_dcs_hops(int);
351 extern int      set_dcs_id(char *);
352 extern int      set_intf(char *);
353 extern int      set_protocol(int);
354 extern int      set_server_group(int);
355 extern int      start_server(char *);
356 extern int      finish_server(void);
357 extern int      set_log_file(char *);
358
359 /* scsp_config_lex.c */
360 extern int      yylex(void);
361
362 /* scsp_config_parse.y */
363 #if __STDC__
364 extern void     parse_error(const char *, ...);
365 #else
366 extern void     parse_error(char *, va_alist);
367 #endif
368
369 /* scsp_hfsm.c */
370 extern int      scsp_hfsm(Scsp_dcs *, int, Scsp_msg *);
371
372 /* scsp_if.c */
373 extern int      scsp_cfsm(Scsp_dcs *, int, Scsp_msg *,
374                         Scsp_if_msg *);
375
376 /* scsp_input.c */
377 extern void     scsp_free_msg(Scsp_msg *);
378 extern Scsp_msg *scsp_parse_msg(char *, int);
379
380 /* scsp_log.c */
381 #if __STDC__
382 extern void     scsp_log(const int, const char *, ...);
383 extern void     scsp_trace(const char *, ...);
384 #else
385 extern void     scsp_log(int, char *, va_alist);
386 extern void     scsp_trace(const char *, va_alist);
387 #endif
388 extern void     scsp_open_trace();
389 extern void     scsp_trace_msg(Scsp_dcs *, Scsp_msg *, int);
390 extern void     scsp_mem_err(char *);
391
392 /* scsp_msg.c */
393 extern void     scsp_csus_ack(Scsp_dcs *, Scsp_msg *);
394 extern int      scsp_send_ca(Scsp_dcs *);
395 extern int      scsp_send_csus(Scsp_dcs *);
396 extern int      scsp_send_csu_req(Scsp_dcs *, Scsp_csa *);
397 extern int      scsp_send_csu_reply(Scsp_dcs *, Scsp_csa *);
398 extern int      scsp_send_hello(Scsp_dcs *);
399
400 /* scsp_output.c */
401 extern int      scsp_format_msg(Scsp_dcs *, Scsp_msg *, char **);
402 extern int      scsp_send_msg(Scsp_dcs *, Scsp_msg *);
403
404 /* scsp_print.c */
405 extern char     *format_hfsm_state(int);
406 extern char     *format_hfsm_event(int);
407 extern char     *format_cafsm_state(int);
408 extern char     *format_cafsm_event(int);
409 extern char     *format_cifsm_state(int);
410 extern char     *format_cifsm_event(int);
411 extern void     print_scsp_cse(FILE *, Scsp_cse *);
412 extern void     print_scsp_msg(FILE *, Scsp_msg *);
413 extern void     print_scsp_if_msg(FILE *, Scsp_if_msg *);
414 extern void     print_scsp_pending(FILE *, Scsp_pending *);
415 extern void     print_scsp_server(FILE *, Scsp_server *);
416 extern void     print_scsp_dcs(FILE *, Scsp_dcs *);
417 extern void     print_scsp_dump();
418
419 /* scsp_socket.c */
420 extern Scsp_dcs *       scsp_find_dcs(int);
421 extern Scsp_server *    scsp_find_server(int);
422 extern int              scsp_dcs_connect(Scsp_dcs *);
423 extern int              scsp_dcs_listen(Scsp_server *);
424 extern Scsp_dcs *       scsp_dcs_accept(Scsp_server *);
425 extern int              scsp_dcs_read(Scsp_dcs *);
426 extern int              scsp_server_listen();
427 extern int              scsp_server_accept(int);
428 extern Scsp_if_msg *    scsp_if_sock_read(int);
429 extern int              scsp_if_sock_write(int, Scsp_if_msg *);
430 extern int              scsp_server_read(Scsp_server *);
431 extern int              scsp_send_cache_ind(Scsp_server *);
432 extern int              scsp_pending_read(Scsp_pending *);
433
434 /* scsp_subr.c */
435 extern int              scsp_hash(Scsp_ckey *);
436 extern int              scsp_cmp_id(Scsp_id *, Scsp_id *);
437 extern int              scsp_cmp_key(Scsp_ckey *, Scsp_ckey *);
438 extern int              scsp_is_atmarp_server(char *);
439 extern Scsp_cse *       scsp_dup_cse(Scsp_cse *);
440 extern Scsp_csa *       scsp_dup_csa(Scsp_csa *);
441 extern Scsp_csa *       scsp_cse2csas(Scsp_cse *);
442 extern void             scsp_dcs_cleanup(Scsp_dcs *);
443 extern void             scsp_dcs_delete(Scsp_dcs *);
444 extern void             scsp_server_shutdown(Scsp_server *);
445 extern void             scsp_server_delete(Scsp_server *);
446 extern int              scsp_get_server_info(Scsp_server *);
447 extern void             scsp_process_ca(Scsp_dcs *, Scsp_ca *);
448 extern void             scsp_process_cache_rsp(Scsp_server *,
449                                 Scsp_if_msg *);
450 extern int              scsp_propagate_csa( Scsp_dcs *,
451                                 Scsp_csa *);
452 extern void             scsp_update_cache( Scsp_dcs *,
453                                 Scsp_csa *);
454 extern void             scsp_reconfigure();
455
456 /* scsp_timer.c */
457 extern void     scsp_open_timeout(Harp_timer *);
458 extern void     scsp_hello_timeout(Harp_timer *);
459 extern void     scsp_hello_rcv_timeout(Harp_timer *);
460 extern void     scsp_ca_retran_timeout(Harp_timer *);
461 extern void     scsp_csus_retran_timeout(Harp_timer *);
462 extern void     scsp_csu_req_retran_timeout(Harp_timer *);
463
464
465
466 #endif  /* _SCSP_SCSP_VAR_H */