1 /* $NetBSD: fsm.h,v 1.5 2021/01/09 16:39:28 christos Exp $ */ 2 3 /* 4 * fsm.h - {Link, IP} Control Protocol Finite State Machine definitions. 5 * 6 * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in 17 * the documentation and/or other materials provided with the 18 * distribution. 19 * 20 * 3. The name "Carnegie Mellon University" must not be used to 21 * endorse or promote products derived from this software without 22 * prior written permission. For permission or any legal 23 * details, please contact 24 * Office of Technology Transfer 25 * Carnegie Mellon University 26 * 5000 Forbes Avenue 27 * Pittsburgh, PA 15213-3890 28 * (412) 268-4387, fax: (412) 268-7395 29 * tech-transfer@andrew.cmu.edu 30 * 31 * 4. Redistributions of any form whatsoever must retain the following 32 * acknowledgment: 33 * "This product includes software developed by Computing Services 34 * at Carnegie Mellon University (http://www.cmu.edu/computing/)." 35 * 36 * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO 37 * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 38 * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE 39 * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 40 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 41 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 42 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 43 * 44 * Id: fsm.h,v 1.10 2004/11/13 02:28:15 paulus Exp 45 */ 46 47 /* 48 * Packet header = Code, id, length. 49 */ 50 #define HEADERLEN 4 51 52 53 /* 54 * CP (LCP, IPCP, etc.) codes. 55 */ 56 #define CONFREQ 1 /* Configuration Request */ 57 #define CONFACK 2 /* Configuration Ack */ 58 #define CONFNAK 3 /* Configuration Nak */ 59 #define CONFREJ 4 /* Configuration Reject */ 60 #define TERMREQ 5 /* Termination Request */ 61 #define TERMACK 6 /* Termination Ack */ 62 #define CODEREJ 7 /* Code Reject */ 63 64 65 /* 66 * Each FSM is described by an fsm structure and fsm callbacks. 67 */ 68 typedef struct fsm { 69 int unit; /* Interface unit number */ 70 int protocol; /* Data Link Layer Protocol field value */ 71 int state; /* State */ 72 int flags; /* Contains option bits */ 73 u_char id; /* Current id */ 74 u_char reqid; /* Current request id */ 75 u_char seen_ack; /* Have received valid Ack/Nak/Rej to Req */ 76 int timeouttime; /* Timeout time in milliseconds */ 77 int maxconfreqtransmits; /* Maximum Configure-Request transmissions */ 78 int retransmits; /* Number of retransmissions left */ 79 int maxtermtransmits; /* Maximum Terminate-Request transmissions */ 80 int nakloops; /* Number of nak loops since last ack */ 81 int rnakloops; /* Number of naks received */ 82 int maxnakloops; /* Maximum number of nak loops tolerated */ 83 struct fsm_callbacks *callbacks; /* Callback routines */ 84 char *term_reason; /* Reason for closing protocol */ 85 int term_reason_len; /* Length of term_reason */ 86 } fsm; 87 88 89 typedef struct fsm_callbacks { 90 void (*resetci)(fsm *); /* Reset our Configuration Information */ 91 int (*cilen)(fsm *); /* Length of our Configuration Information */ 92 void (*addci) /* Add our Configuration Information */ 93 (fsm *, u_char *, int *); 94 int (*ackci) /* ACK our Configuration Information */ 95 (fsm *, u_char *, int); 96 int (*nakci) /* NAK our Configuration Information */ 97 (fsm *, u_char *, int, int); 98 int (*rejci) /* Reject our Configuration Information */ 99 (fsm *, u_char *, int); 100 int (*reqci) /* Request peer's Configuration Information */ 101 (fsm *, u_char *, int *, int); 102 void (*up)(fsm *); /* Called when fsm reaches OPENED state */ 103 void (*down)(fsm *); /* Called when fsm leaves OPENED state */ 104 void (*starting)(fsm *); /* Called when we want the lower layer */ 105 void (*finished)(fsm *); /* Called when we don't want the lower layer */ 106 void (*protreject)(int); /* Called when Protocol-Reject received */ 107 void (*retransmit)(fsm *); /* Retransmission is necessary */ 108 int (*extcode) /* Called when unknown code received */ 109 (fsm *, int, int, u_char *, int); 110 char *proto_name; /* String name for protocol (for messages) */ 111 } fsm_callbacks; 112 113 114 /* 115 * Link states. 116 */ 117 #define INITIAL 0 /* Down, hasn't been opened */ 118 #define STARTING 1 /* Down, been opened */ 119 #define CLOSED 2 /* Up, hasn't been opened */ 120 #define STOPPED 3 /* Open, waiting for down event */ 121 #define CLOSING 4 /* Terminating the connection, not open */ 122 #define STOPPING 5 /* Terminating, but open */ 123 #define REQSENT 6 /* We've sent a Config Request */ 124 #define ACKRCVD 7 /* We've received a Config Ack */ 125 #define ACKSENT 8 /* We've sent a Config Ack */ 126 #define OPENED 9 /* Connection available */ 127 128 129 /* 130 * Flags - indicate options controlling FSM operation 131 */ 132 #define OPT_PASSIVE 1 /* Don't die if we don't get a response */ 133 #define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */ 134 #define OPT_SILENT 4 /* Wait for peer to speak first */ 135 136 137 /* 138 * Timeouts. 139 */ 140 #define DEFTIMEOUT 3 /* Timeout time in seconds */ 141 #define DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ 142 #define DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ 143 #define DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ 144 145 146 /* 147 * Prototypes 148 */ 149 void fsm_init (fsm *); 150 void fsm_lowerup (fsm *); 151 void fsm_lowerdown (fsm *); 152 void fsm_open (fsm *); 153 void fsm_close (fsm *, char *); 154 void fsm_input (fsm *, u_char *, int); 155 void fsm_protreject (fsm *); 156 void fsm_sdata (fsm *, int, int, u_char *, int); 157 158 159 /* 160 * Variables 161 */ 162 extern int peer_mru[]; /* currently negotiated peer MRU (per unit) */ 163