NetServices Stack source

Dependents:   HelloWorld ServoInterfaceBoardExample1 4180_Lab4

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers fsm.h Source File

fsm.h

00001 /*****************************************************************************
00002 * fsm.h - Network Control Protocol Finite State Machine header file.
00003 *
00004 * Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
00005 * Copyright (c) 1997 Global Election Systems Inc.
00006 *
00007 * The authors hereby grant permission to use, copy, modify, distribute,
00008 * and license this software and its documentation for any purpose, provided
00009 * that existing copyright notices are retained in all copies and that this
00010 * notice and the following disclaimer are included verbatim in any 
00011 * distributions. No written agreement, license, or royalty fee is required
00012 * for any of the authorized uses.
00013 *
00014 * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
00015 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00016 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
00017 * IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00018 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00019 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00020 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00021 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00022 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00023 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00024 *
00025 ******************************************************************************
00026 * REVISION HISTORY
00027 *
00028 * 03-01-01 Marc Boucher <marc@mbsi.ca>
00029 *   Ported to lwIP.
00030 * 97-11-05 Guy Lancaster <glanca@gesn.com>, Global Election Systems Inc.
00031 *   Original based on BSD code.
00032 *****************************************************************************/
00033 /*
00034  * fsm.h - {Link, IP} Control Protocol Finite State Machine definitions.
00035  *
00036  * Copyright (c) 1989 Carnegie Mellon University.
00037  * All rights reserved.
00038  *
00039  * Redistribution and use in source and binary forms are permitted
00040  * provided that the above copyright notice and this paragraph are
00041  * duplicated in all such forms and that any documentation,
00042  * advertising materials, and other materials related to such
00043  * distribution and use acknowledge that the software was developed
00044  * by Carnegie Mellon University.  The name of the
00045  * University may not be used to endorse or promote products derived
00046  * from this software without specific prior written permission.
00047  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
00048  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
00049  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00050  *
00051  * $Id: fsm.h,v 1.5 2009/12/31 17:08:08 goldsimon Exp $
00052  */
00053 
00054 #ifndef FSM_H
00055 #define FSM_H
00056 
00057 /*
00058  * LCP Packet header = Code, id, length.
00059  */
00060 #define HEADERLEN (sizeof (u_char) + sizeof (u_char) + sizeof (u_short))
00061 
00062 
00063 /*
00064  *  CP (LCP, IPCP, etc.) codes.
00065  */
00066 #define CONFREQ     1 /* Configuration Request */
00067 #define CONFACK     2 /* Configuration Ack */
00068 #define CONFNAK     3 /* Configuration Nak */
00069 #define CONFREJ     4 /* Configuration Reject */
00070 #define TERMREQ     5 /* Termination Request */
00071 #define TERMACK     6 /* Termination Ack */
00072 #define CODEREJ     7 /* Code Reject */
00073 
00074 
00075 /*
00076  * Each FSM is described by an fsm structure and fsm callbacks.
00077  */
00078 typedef struct fsm {
00079   int unit;                        /* Interface unit number */
00080   u_short protocol;                /* Data Link Layer Protocol field value */
00081   int state;                       /* State */
00082   int flags;                       /* Contains option bits */
00083   u_char id;                       /* Current id */
00084   u_char reqid;                    /* Current request id */
00085   u_char seen_ack;                 /* Have received valid Ack/Nak/Rej to Req */
00086   int timeouttime;                 /* Timeout time in milliseconds */
00087   int maxconfreqtransmits;         /* Maximum Configure-Request transmissions */
00088   int retransmits;                 /* Number of retransmissions left */
00089   int maxtermtransmits;            /* Maximum Terminate-Request transmissions */
00090   int nakloops;                    /* Number of nak loops since last ack */
00091   int maxnakloops;                 /* Maximum number of nak loops tolerated */
00092   struct fsm_callbacks* callbacks; /* Callback routines */
00093   char* term_reason;               /* Reason for closing protocol */
00094   int term_reason_len;             /* Length of term_reason */
00095 } fsm;
00096 
00097 
00098 typedef struct fsm_callbacks {
00099   void (*resetci)(fsm*);                            /* Reset our Configuration Information */
00100   int  (*cilen)(fsm*);                              /* Length of our Configuration Information */
00101   void (*addci)(fsm*, u_char*, int*);               /* Add our Configuration Information */
00102   int  (*ackci)(fsm*, u_char*, int);                /* ACK our Configuration Information */
00103   int  (*nakci)(fsm*, u_char*, int);                /* NAK our Configuration Information */
00104   int  (*rejci)(fsm*, u_char*, int);                /* Reject our Configuration Information */
00105   int  (*reqci)(fsm*, u_char*, int*, int);          /* Request peer's Configuration Information */
00106   void (*up)(fsm*);                                 /* Called when fsm reaches LS_OPENED state */
00107   void (*down)(fsm*);                               /* Called when fsm leaves LS_OPENED state */
00108   void (*starting)(fsm*);                           /* Called when we want the lower layer */
00109   void (*finished)(fsm*);                           /* Called when we don't want the lower layer */
00110   void (*protreject)(int);                          /* Called when Protocol-Reject received */
00111   void (*retransmit)(fsm*);                         /* Retransmission is necessary */
00112   int  (*extcode)(fsm*, int, u_char, u_char*, int); /* Called when unknown code received */
00113   char *proto_name;                                 /* String name for protocol (for messages) */
00114 } fsm_callbacks;
00115 
00116 
00117 /*
00118  * Link states.
00119  */
00120 #define LS_INITIAL  0 /* Down, hasn't been opened */
00121 #define LS_STARTING 1 /* Down, been opened */
00122 #define LS_CLOSED   2 /* Up, hasn't been opened */
00123 #define LS_STOPPED  3 /* Open, waiting for down event */
00124 #define LS_CLOSING  4 /* Terminating the connection, not open */
00125 #define LS_STOPPING 5 /* Terminating, but open */
00126 #define LS_REQSENT  6 /* We've sent a Config Request */
00127 #define LS_ACKRCVD  7 /* We've received a Config Ack */
00128 #define LS_ACKSENT  8 /* We've sent a Config Ack */
00129 #define LS_OPENED   9 /* Connection available */
00130 
00131 /*
00132  * Flags - indicate options controlling FSM operation
00133  */
00134 #define OPT_PASSIVE 1 /* Don't die if we don't get a response */
00135 #define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */
00136 #define OPT_SILENT  4 /* Wait for peer to speak first */
00137 
00138 
00139 /*
00140  * Prototypes
00141  */
00142 void fsm_init (fsm*);
00143 void fsm_lowerup (fsm*);
00144 void fsm_lowerdown (fsm*);
00145 void fsm_open (fsm*);
00146 void fsm_close (fsm*, char*);
00147 void fsm_input (fsm*, u_char*, int);
00148 void fsm_protreject (fsm*);
00149 void fsm_sdata (fsm*, u_char, u_char, u_char*, int);
00150 
00151 
00152 /*
00153  * Variables
00154  */
00155 extern int peer_mru[]; /* currently negotiated peer MRU (per unit) */
00156 
00157 #endif /* FSM_H */