1 /* $OpenBSD: fsm.h,v 1.5 2002/07/01 19:31:37 deraadt 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 45 /* 46 * Packet header = Code, id, length. 47 */ 48 #define HEADERLEN (sizeof (u_char) + sizeof (u_char) + sizeof (u_short)) 49 50 51 /* 52 * CP (LCP, IPCP, etc.) codes. 53 */ 54 #define CONFREQ 1 /* Configuration Request */ 55 #define CONFACK 2 /* Configuration Ack */ 56 #define CONFNAK 3 /* Configuration Nak */ 57 #define CONFREJ 4 /* Configuration Reject */ 58 #define TERMREQ 5 /* Termination Request */ 59 #define TERMACK 6 /* Termination Ack */ 60 #define CODEREJ 7 /* Code Reject */ 61 62 63 /* 64 * Each FSM is described by an fsm structure and fsm callbacks. 65 */ 66 typedef struct fsm { 67 int unit; /* Interface unit number */ 68 int protocol; /* Data Link Layer Protocol field value */ 69 int state; /* State */ 70 int flags; /* Contains option bits */ 71 u_char id; /* Current id */ 72 u_char reqid; /* Current request id */ 73 u_char seen_ack; /* Have received valid Ack/Nak/Rej to Req */ 74 int timeouttime; /* Timeout time in milliseconds */ 75 int maxconfreqtransmits; /* Maximum Configure-Request transmissions */ 76 int retransmits; /* Number of retransmissions left */ 77 int maxtermtransmits; /* Maximum Terminate-Request transmissions */ 78 int nakloops; /* Number of nak loops since last ack */ 79 int maxnakloops; /* Maximum number of nak loops tolerated */ 80 struct fsm_callbacks *callbacks; /* Callback routines */ 81 char *term_reason; /* Reason for closing protocol */ 82 int term_reason_len; /* Length of term_reason */ 83 } fsm; 84 85 86 typedef struct fsm_callbacks { 87 void (*resetci) /* Reset our Configuration Information */ 88 (fsm *); 89 int (*cilen) /* Length of our Configuration Information */ 90 (fsm *); 91 void (*addci) /* Add our Configuration Information */ 92 (fsm *, u_char *, int *); 93 int (*ackci) /* ACK our Configuration Information */ 94 (fsm *, u_char *, int); 95 int (*nakci) /* NAK our Configuration Information */ 96 (fsm *, u_char *, int); 97 int (*rejci) /* Reject our Configuration Information */ 98 (fsm *, u_char *, int); 99 int (*reqci) /* Request peer's Configuration Information */ 100 (fsm *, u_char *, int *, int); 101 void (*up) /* Called when fsm reaches OPENED state */ 102 (fsm *); 103 void (*down) /* Called when fsm leaves OPENED state */ 104 (fsm *); 105 void (*starting) /* Called when we want the lower layer */ 106 (fsm *); 107 void (*finished) /* Called when we don't want the lower layer */ 108 (fsm *); 109 void (*protreject) /* Called when Protocol-Reject received */ 110 (int); 111 void (*retransmit) /* Retransmission is necessary */ 112 (fsm *); 113 int (*extcode) /* Called when unknown code received */ 114 (fsm *, int, int, u_char *, int); 115 char *proto_name; /* String name for protocol (for messages) */ 116 } fsm_callbacks; 117 118 119 /* 120 * Link states. 121 */ 122 #define INITIAL 0 /* Down, hasn't been opened */ 123 #define STARTING 1 /* Down, been opened */ 124 #define CLOSED 2 /* Up, hasn't been opened */ 125 #define STOPPED 3 /* Open, waiting for down event */ 126 #define CLOSING 4 /* Terminating the connection, not open */ 127 #define STOPPING 5 /* Terminating, but open */ 128 #define REQSENT 6 /* We've sent a Config Request */ 129 #define ACKRCVD 7 /* We've received a Config Ack */ 130 #define ACKSENT 8 /* We've sent a Config Ack */ 131 #define OPENED 9 /* Connection available */ 132 133 134 /* 135 * Flags - indicate options controlling FSM operation 136 */ 137 #define OPT_PASSIVE 1 /* Don't die if we don't get a response */ 138 #define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */ 139 #define OPT_SILENT 4 /* Wait for peer to speak first */ 140 141 142 /* 143 * Timeouts. 144 */ 145 #define DEFTIMEOUT 3 /* Timeout time in seconds */ 146 #define DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ 147 #define DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ 148 #define DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ 149 150 151 /* 152 * Prototypes 153 */ 154 void fsm_init(fsm *); 155 void fsm_lowerup(fsm *); 156 void fsm_lowerdown(fsm *); 157 void fsm_open(fsm *); 158 void fsm_close(fsm *, char *); 159 void fsm_input(fsm *, u_char *, int); 160 void fsm_protreject(fsm *); 161 void fsm_sdata(fsm *, int, int, u_char *, int); 162 163 164 /* 165 * Variables 166 */ 167 extern int peer_mru[]; /* currently negotiated peer MRU (per unit) */ 168