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 $
27 * @(#) $DragonFly: src/usr.sbin/atm/scspd/scsp_var.h,v 1.3 2003/11/03 19:31:35 eirikn Exp $
32 * Server Cache Synchronization Protocol (SCSP) Support
33 * ----------------------------------------------------
35 * SCSP message formats
39 #ifndef _SCSP_SCSP_VAR_H
40 #define _SCSP_SCSP_VAR_H
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
57 * Operational constants
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"
67 * HELLO finite state machine states
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
77 * HELLO finite state machine events
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
88 * Cache Alignment finite state machine states
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
100 * Cache Alignment finite state machine events
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
117 * Client Interface finite state machine states
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
127 * Client Interface finite state machine events
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
143 * Server connection states (not part of any FSM)
145 #define SCSP_SS_NULL 0
146 #define SCSP_SS_CFG 1
147 #define SCSP_SS_ACTIVE 2
153 * key pointer to an Scsp_ckey structure
155 #define SCSP_HASH(key) scsp_hash((key))
159 * Add a cache summary entry to a client's cache summary
161 * cpp pointer to a server control block
162 * key pointer to an Scsp_cse structure
164 #define SCSP_ADD(cpp, key) \
167 c = &(cpp)->ss_cache[SCSP_HASH(&(key)->sc_key)]; \
168 LINK2TAIL((key), Scsp_cse, *c, sc_next); \
173 * Delete a cache summary entry from a client's cache summary
175 * cpp pointer to a server control block
176 * s pointer to an Scsp_cse structure
178 #define SCSP_DELETE(cpp, s) \
181 c = &(cpp)->ss_cache[SCSP_HASH(&(s)->sc_key)]; \
182 UNLINK((s), Scsp_cse, *c, sc_next); \
187 * Search a client's cache summary for a given key
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
193 #define SCSP_LOOKUP(cpp, key, s) \
195 for ((s) = (cpp)->ss_cache[SCSP_HASH(key)]; \
197 (s) = (s)->sc_next) { \
198 if (scsp_cmp_key((key), &(s)->sc_key) == 0) \
205 * SCSP pending connection control block
207 * The pending connection block is used to keep track of server
208 * connections which are open but haven't been identified yet.
210 struct scsp_pending
{
211 struct scsp_pending
*sp_next
;
214 typedef struct scsp_pending Scsp_pending
;
218 * SCSP Server instance control block
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 */
238 struct scsp_dcs
*ss_dcs
; /* Ptr to list of DCSs */
239 struct scsp_cse
*ss_cache
[SCSP_HASHSZ
]; /* Client's cache */
241 typedef struct scsp_server Scsp_server
;
245 * SCSP client cache summary entry control block
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 */
253 typedef struct scsp_cse Scsp_cse
;
257 * CSU Request retransmission control block
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 */
265 typedef struct scsp_csu_rexmt Scsp_csu_rexmt
;
269 * SCSP DCS control block
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 */
303 typedef struct scsp_dcs Scsp_dcs
;
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 */
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
;
334 * Executable functions
337 extern int scsp_cafsm(Scsp_dcs
*, int, void *);
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 *);
359 /* scsp_config_lex.c */
360 extern int yylex(void);
362 /* scsp_config_parse.y */
364 extern void parse_error(const char *, ...);
366 extern void parse_error(char *, va_alist
);
370 extern int scsp_hfsm(Scsp_dcs
*, int, Scsp_msg
*);
373 extern int scsp_cfsm(Scsp_dcs
*, int, Scsp_msg
*,
377 extern void scsp_free_msg(Scsp_msg
*);
378 extern Scsp_msg
*scsp_parse_msg(char *, int);
382 extern void scsp_log(const int, const char *, ...);
383 extern void scsp_trace(const char *, ...);
385 extern void scsp_log(int, char *, va_alist
);
386 extern void scsp_trace(const char *, va_alist
);
388 extern void scsp_open_trace();
389 extern void scsp_trace_msg(Scsp_dcs
*, Scsp_msg
*, int);
390 extern void scsp_mem_err(char *);
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
*);
401 extern int scsp_format_msg(Scsp_dcs
*, Scsp_msg
*, char **);
402 extern int scsp_send_msg(Scsp_dcs
*, Scsp_msg
*);
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();
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
*);
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
*,
450 extern int scsp_propagate_csa( Scsp_dcs
*,
452 extern void scsp_update_cache( Scsp_dcs
*,
454 extern void scsp_reconfigure();
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
*);
466 #endif /* _SCSP_SCSP_VAR_H */