18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * fsm.h - {Link, IP} Control Protocol Finite State Machine definitions. 38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. 58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Redistribution and use in source and binary forms, with or without 78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * modification, are permitted provided that the following conditions 88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * are met: 98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * notice, this list of conditions and the following disclaimer. 128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * notice, this list of conditions and the following disclaimer in 158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the documentation and/or other materials provided with the 168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * distribution. 178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3. The name "Carnegie Mellon University" must not be used to 198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * endorse or promote products derived from this software without 208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * prior written permission. For permission or any legal 218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * details, please contact 228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Office of Technology Transfer 238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Carnegie Mellon University 248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 5000 Forbes Avenue 258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Pittsburgh, PA 15213-3890 268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * (412) 268-4387, fax: (412) 268-7395 278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * tech-transfer@andrew.cmu.edu 288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 4. Redistributions of any form whatsoever must retain the following 308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * acknowledgment: 318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * "This product includes software developed by Computing Services 328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * at Carnegie Mellon University (http://www.cmu.edu/computing/)." 338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO 358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE 378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * $Id: fsm.h,v 1.10 2004/11/13 02:28:15 paulus Exp $ 438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Packet header = Code, id, length. 478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define HEADERLEN 4 498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * CP (LCP, IPCP, etc.) codes. 538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CONFREQ 1 /* Configuration Request */ 558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CONFACK 2 /* Configuration Ack */ 568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CONFNAK 3 /* Configuration Nak */ 578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CONFREJ 4 /* Configuration Reject */ 588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TERMREQ 5 /* Termination Request */ 598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TERMACK 6 /* Termination Ack */ 608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CODEREJ 7 /* Code Reject */ 618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Each FSM is described by an fsm structure and fsm callbacks. 658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef struct fsm { 678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int unit; /* Interface unit number */ 688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int protocol; /* Data Link Layer Protocol field value */ 698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int state; /* State */ 708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int flags; /* Contains option bits */ 718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char id; /* Current id */ 728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char reqid; /* Current request id */ 738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char seen_ack; /* Have received valid Ack/Nak/Rej to Req */ 748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int timeouttime; /* Timeout time in milliseconds */ 758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int maxconfreqtransmits; /* Maximum Configure-Request transmissions */ 768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int retransmits; /* Number of retransmissions left */ 778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int maxtermtransmits; /* Maximum Terminate-Request transmissions */ 788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int nakloops; /* Number of nak loops since last ack */ 798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int rnakloops; /* Number of naks received */ 808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int maxnakloops; /* Maximum number of nak loops tolerated */ 818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct fsm_callbacks *callbacks; /* Callback routines */ 828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *term_reason; /* Reason for closing protocol */ 838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int term_reason_len; /* Length of term_reason */ 848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} fsm; 858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef struct fsm_callbacks { 888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*resetci) /* Reset our Configuration Information */ 898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *)); 908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int (*cilen) /* Length of our Configuration Information */ 918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *)); 928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*addci) /* Add our Configuration Information */ 938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *, u_char *, int *)); 948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int (*ackci) /* ACK our Configuration Information */ 958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *, u_char *, int)); 968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int (*nakci) /* NAK our Configuration Information */ 978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *, u_char *, int, int)); 988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int (*rejci) /* Reject our Configuration Information */ 998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *, u_char *, int)); 1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int (*reqci) /* Request peer's Configuration Information */ 1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *, u_char *, int *, int)); 1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*up) /* Called when fsm reaches OPENED state */ 1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *)); 1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*down) /* Called when fsm leaves OPENED state */ 1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *)); 1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*starting) /* Called when we want the lower layer */ 1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *)); 1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*finished) /* Called when we don't want the lower layer */ 1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *)); 1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*protreject) /* Called when Protocol-Reject received */ 1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((int)); 1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*retransmit) /* Retransmission is necessary */ 1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *)); 1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int (*extcode) /* Called when unknown code received */ 1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project __P((fsm *, int, int, u_char *, int)); 1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *proto_name; /* String name for protocol (for messages) */ 1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} fsm_callbacks; 1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Link states. 1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define INITIAL 0 /* Down, hasn't been opened */ 1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STARTING 1 /* Down, been opened */ 1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CLOSED 2 /* Up, hasn't been opened */ 1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STOPPED 3 /* Open, waiting for down event */ 1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CLOSING 4 /* Terminating the connection, not open */ 1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STOPPING 5 /* Terminating, but open */ 1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define REQSENT 6 /* We've sent a Config Request */ 1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ACKRCVD 7 /* We've received a Config Ack */ 1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ACKSENT 8 /* We've sent a Config Ack */ 1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define OPENED 9 /* Connection available */ 1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Flags - indicate options controlling FSM operation 1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define OPT_PASSIVE 1 /* Don't die if we don't get a response */ 1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */ 1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define OPT_SILENT 4 /* Wait for peer to speak first */ 1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Timeouts. 1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DEFTIMEOUT 3 /* Timeout time in seconds */ 1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ 1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ 1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ 1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Prototypes 1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid fsm_init __P((fsm *)); 1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid fsm_lowerup __P((fsm *)); 1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid fsm_lowerdown __P((fsm *)); 1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid fsm_open __P((fsm *)); 1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid fsm_close __P((fsm *, char *)); 1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid fsm_input __P((fsm *, u_char *, int)); 1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid fsm_protreject __P((fsm *)); 1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid fsm_sdata __P((fsm *, int, int, u_char *, int)); 1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Variables 1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern int peer_mru[]; /* currently negotiated peer MRU (per unit) */ 169