3 * ===================================
4 * HARP | Host ATM Research Platform
5 * ===================================
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.
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.
21 * Copyright 1994-1998 Network Computing Services, Inc.
23 * Copies of this Software may be made, however, the above copyright
24 * notice must be reproduced on all copies.
26 * @(#) $FreeBSD: src/usr.sbin/atm/scspd/scsp_var.h,v 1.3 1999/08/28 01:15:34 peter Exp $
31 * Server Cache Synchronization Protocol (SCSP) Support
32 * ----------------------------------------------------
34 * SCSP message formats
38 #ifndef _SCSP_SCSP_VAR_H
39 #define _SCSP_SCSP_VAR_H
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
56 * Operational constants
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"
66 * HELLO finite state machine states
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
76 * HELLO finite state machine events
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
87 * Cache Alignment finite state machine states
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
99 * Cache Alignment finite state machine events
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
116 * Client Interface finite state machine states
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
126 * Client Interface finite state machine events
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
142 * Server connection states (not part of any FSM)
144 #define SCSP_SS_NULL 0
145 #define SCSP_SS_CFG 1
146 #define SCSP_SS_ACTIVE 2
152 * key pointer to an Scsp_ckey structure
154 #define SCSP_HASH(key) scsp_hash((key))
158 * Add a cache summary entry to a client's cache summary
160 * cpp pointer to a server control block
161 * key pointer to an Scsp_cse structure
163 #define SCSP_ADD(cpp, key) \
166 c = &(cpp)->ss_cache[SCSP_HASH(&(key)->sc_key)]; \
167 LINK2TAIL((key), Scsp_cse, *c, sc_next); \
172 * Delete a cache summary entry from a client's cache summary
174 * cpp pointer to a server control block
175 * s pointer to an Scsp_cse structure
177 #define SCSP_DELETE(cpp, s) \
180 c = &(cpp)->ss_cache[SCSP_HASH(&(s)->sc_key)]; \
181 UNLINK((s), Scsp_cse, *c, sc_next); \
186 * Search a client's cache summary for a given key
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
192 #define SCSP_LOOKUP(cpp, key, s) \
194 for ((s) = (cpp)->ss_cache[SCSP_HASH(key)]; \
196 (s) = (s)->sc_next) { \
197 if (scsp_cmp_key((key), &(s)->sc_key) == 0) \
204 * SCSP pending connection control block
206 * The pending connection block is used to keep track of server
207 * connections which are open but haven't been identified yet.
209 struct scsp_pending {
210 struct scsp_pending *sp_next;
213 typedef struct scsp_pending Scsp_pending;
217 * SCSP Server instance control block
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 */
237 struct scsp_dcs *ss_dcs; /* Ptr to list of DCSs */
238 struct scsp_cse *ss_cache[SCSP_HASHSZ]; /* Client's cache */
240 typedef struct scsp_server Scsp_server;
244 * SCSP client cache summary entry control block
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 */
252 typedef struct scsp_cse Scsp_cse;
256 * CSU Request retransmission control block
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 */
264 typedef struct scsp_csu_rexmt Scsp_csu_rexmt;
268 * SCSP DCS control block
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 */
302 typedef struct scsp_dcs Scsp_dcs;
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 */
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;
333 * Executable functions
336 extern int scsp_cafsm __P((Scsp_dcs *, int, void *));
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 *));
358 /* scsp_config_lex.c */
359 extern int yylex __P((void));
361 /* scsp_config_parse.y */
363 extern void parse_error __P((const char *, ...));
365 extern void parse_error __P((char *, va_alist));
369 extern int scsp_hfsm __P((Scsp_dcs *, int, Scsp_msg *));
372 extern int scsp_cfsm __P((Scsp_dcs *, int, Scsp_msg *,
376 extern void scsp_free_msg __P((Scsp_msg *));
377 extern Scsp_msg *scsp_parse_msg __P((char *, int));
381 extern void scsp_log __P((const int, const char *, ...));
382 extern void scsp_trace __P((const char *, ...));
384 extern void scsp_log __P((int, char *, va_alist));
385 extern void scsp_trace __P((const char *, va_alist));
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 *));
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 *));
400 extern int scsp_format_msg __P((Scsp_dcs *, Scsp_msg *, char **));
401 extern int scsp_send_msg __P((Scsp_dcs *, Scsp_msg *));
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(());
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 *));
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 *,
449 extern int scsp_propagate_csa __P(( Scsp_dcs *,
451 extern void scsp_update_cache __P(( Scsp_dcs *,
453 extern void scsp_reconfigure __P(());
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 *));
465 #endif /* _SCSP_SCSP_VAR_H */