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