Home | History | Annotate | Download | only in pppd
      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