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 */ 66typedef 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 86typedef 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 */ 154void fsm_init(fsm *); 155void fsm_lowerup(fsm *); 156void fsm_lowerdown(fsm *); 157void fsm_open(fsm *); 158void fsm_close(fsm *, char *); 159void fsm_input(fsm *, u_char *, int); 160void fsm_protreject(fsm *); 161void fsm_sdata(fsm *, int, int, u_char *, int); 162 163 164/* 165 * Variables 166 */ 167extern int peer_mru[]; /* currently negotiated peer MRU (per unit) */ 168