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