File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / mpd / src / fsm.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 08:44:29 2013 UTC (11 years ago) by misho
Branches: mpd, MAIN
CVS tags: v5_8p7, v5_8p1_cross, v5_8p1, v5_8, v5_7p0, v5_7, v5_6, HEAD
5.7

    1: 
    2: /*
    3:  * fsm.h
    4:  *
    5:  * Written by Toshiharu OHNO <tony-o@iij.ad.jp>
    6:  * Copyright (c) 1993, Internet Initiative Japan, Inc. All rights reserved.
    7:  * See ``COPYRIGHT.iij''
    8:  * 
    9:  * Rewritten by Archie Cobbs <archie@freebsd.org>
   10:  * Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
   11:  * See ``COPYRIGHT.whistle''
   12:  */
   13: 
   14: #ifndef _FSM_H_
   15: #define _FSM_H_
   16: 
   17: #include <netinet/in.h>
   18: #include "mbuf.h"
   19: #include "timer.h"
   20: #include <netgraph/ng_ppp.h>
   21: 
   22: /*
   23:  * DEFINITIONS
   24:  */
   25: 
   26:     /* States: don't change these! */
   27:     enum fsm_state {
   28: 	ST_INITIAL = 0,
   29: 	ST_STARTING,
   30: 	ST_CLOSED,
   31: 	ST_STOPPED,
   32: 	ST_CLOSING,
   33: 	ST_STOPPING,
   34: 	ST_REQSENT,
   35: 	ST_ACKRCVD,
   36: 	ST_ACKSENT,
   37: 	ST_OPENED
   38:     };
   39: 
   40:   #define OPEN_STATE(s)		((s) > ST_CLOSING || ((s) & 1))
   41: 
   42:   #define MODE_REQ	0
   43:   #define MODE_NAK	1
   44:   #define MODE_REJ	2
   45:   #define MODE_NOP	3
   46: 
   47:   /* Codes */
   48:   #define CODE_VENDOR		0
   49:   #define CODE_CONFIGREQ	1
   50:   #define CODE_CONFIGACK	2
   51:   #define CODE_CONFIGNAK	3
   52:   #define CODE_CONFIGREJ	4
   53:   #define CODE_TERMREQ		5
   54:   #define CODE_TERMACK		6
   55:   #define CODE_CODEREJ		7
   56:   #define CODE_PROTOREJ		8
   57:   #define CODE_ECHOREQ		9
   58:   #define CODE_ECHOREP		10
   59:   #define CODE_DISCREQ		11
   60:   #define CODE_IDENT		12
   61:   #define CODE_TIMEREM		13
   62:   #define CODE_RESETREQ		14
   63:   #define CODE_RESETACK		15
   64: 
   65:   /* All the various ways that the FSM can fail */
   66:   /* XXX This should be extended to contain more descriptive information
   67:      XXX about the cause of the failure, like what the rejected protocol
   68:      XXX or option was, etc. */
   69:   enum fsmfail {
   70:     FAIL_NEGOT_FAILURE,		/* option negotiation failed */
   71:     FAIL_RECD_BADMAGIC,		/* rec'd bad magic number */
   72:     FAIL_RECD_CODEREJ,		/* rec'd fatal code reject */
   73:     FAIL_RECD_PROTREJ,		/* rec'd fatal protocol reject */
   74:     FAIL_WAS_PROTREJ,		/* protocol was rejected */
   75:     FAIL_ECHO_TIMEOUT,		/* peer not responding to echo requests */
   76:     FAIL_CANT_ENCRYPT		/* failed to negotiate required encryption */
   77:   };
   78: 
   79:   /* FSM descriptor */
   80:   struct fsm;
   81:   typedef struct fsm			*Fsm;
   82:   struct fsmoption;
   83:   typedef struct fsmoption		*FsmOption;
   84:   struct fsmoptinfo;
   85:   typedef const struct fsmoptinfo	*FsmOptInfo;
   86: 
   87:   struct fsmconf {
   88:     short	maxconfig;	/* "Max-Configure" initial value */
   89:     short	maxterminate;	/* "Max-Terminate" initial value */
   90:     short	maxfailure;	/* "Max-Failure" initial value */
   91:     short	echo_int;	/* LCP echo interval (zero disables) */
   92:     short	echo_max;	/* LCP max quiet timeout */
   93:     u_char	check_magic;	/* Validate any magic numbers seen */
   94:     u_char	passive;	/* Passive option (see rfc 1661) */
   95:   };
   96:   typedef struct fsmconf	*FsmConf;
   97: 
   98:   struct fsmtype {
   99:     const char		*name;		/* Name of protocol */
  100:     uint16_t		proto;		/* Protocol number */
  101:     uint16_t		known_codes;	/* Accepted FSM codes */
  102:     u_char		link_layer;	/* Link level FSM */
  103:     int			log, log2;	/* Log levels for FSM events */
  104: 
  105:     void		(*NewState)(Fsm f, enum fsm_state old, enum fsm_state new);
  106:     void		(*LayerUp)(Fsm f);
  107:     void		(*LayerDown)(Fsm f);
  108:     void		(*LayerStart)(Fsm f);
  109:     void		(*LayerFinish)(Fsm f);
  110:     u_char *		(*BuildConfigReq)(Fsm f, u_char *cp);
  111:     void		(*DecodeConfig)(Fsm f, FsmOption a, int num, int mode);
  112:     void		(*Configure)(Fsm f);
  113:     void		(*UnConfigure)(Fsm f);
  114:     void		(*SendTerminateReq)(Fsm f);
  115:     void		(*SendTerminateAck)(Fsm f);
  116:     int			(*RecvCodeRej)(Fsm f, int code, Mbuf bp);
  117:     int			(*RecvProtoRej)(Fsm f, int proto, Mbuf bp);
  118:     void		(*Failure)(Fsm f, enum fsmfail reason);
  119:     void		(*RecvResetReq)(Fsm f, int id, Mbuf bp);
  120:     void		(*RecvResetAck)(Fsm f, int id, Mbuf bp);
  121:     void		(*RecvIdent)(Fsm f, Mbuf bp);
  122:     void		(*RecvDiscReq)(Fsm f, Mbuf bp);
  123:     void		(*RecvTimeRemain)(Fsm f, Mbuf bp);
  124:     void		(*RecvVendor)(Fsm f, Mbuf bp);
  125:   };
  126:   typedef const struct fsmtype	*FsmType;
  127: 
  128:   struct fsm {
  129:     FsmType		type;		/* FSM constant stuff */
  130:     void		*arg;		/* Context (Link or Bund) */
  131:     int			log;		/* Current log level */
  132:     int			log2;		/* Current log2 level */
  133:     struct fsmconf	conf;		/* FSM parameters */
  134:     enum fsm_state	state;		/* State of the machine */
  135:     u_char		reqid;		/* Next request id */
  136:     u_char		rejid;		/* Next reject id */
  137:     u_char		echoid;		/* Next echo request id */
  138:     short		restart;	/* Restart counter value */
  139:     short		failure;	/* How many failures left */
  140:     short		config;		/* How many configs left */
  141:     short		quietCount;	/* How long peer has been silent */
  142:     struct pppTimer	timer;		/* Restart Timer */
  143:     struct pppTimer	echoTimer;	/* Keep-alive timer */
  144:     struct ng_ppp_link_stat
  145: 			idleStats;	/* Stats for echo timeout */
  146:   };
  147: 
  148:   /* Packet header */
  149:   struct fsmheader {
  150:     u_char	code;		/* Request code */
  151:     u_char	id;		/* Identification */
  152:     u_short	length;		/* Length of packet */
  153:   };
  154:   typedef struct fsmheader	*FsmHeader;
  155: 
  156:   /* One config option */
  157:   struct fsmoption {
  158:     u_char	type;
  159:     u_char	len;
  160:     u_char	*data;
  161:   };
  162: 
  163:   /* Fsm option descriptor */
  164:   struct fsmoptinfo {
  165:     const char	*name;
  166:     u_char	type;
  167:     u_char	minLen;
  168:     u_char	maxLen;
  169:     u_char	supported;
  170:   };
  171: 
  172: /*
  173:  * VARIABLES
  174:  */
  175: 
  176:   extern u_int		gAckSize, gNakSize, gRejSize;
  177: 
  178: /*
  179:  * FUNCTIONS
  180:  */
  181: 
  182:   extern void		FsmInit(Fsm f, FsmType t, void *arg);
  183:   extern void		FsmInst(Fsm fp, Fsm fpt, void *arg);
  184:   extern void		FsmOpen(Fsm f);
  185:   extern void		FsmClose(Fsm f);
  186:   extern void		FsmUp(Fsm f);
  187:   extern void		FsmDown(Fsm f);
  188:   extern void		FsmInput(Fsm f, Mbuf bp);
  189:   extern void		FsmOutput(Fsm, u_int, u_int, u_char *, int);
  190:   extern void		FsmOutputMbuf(Fsm, u_int, u_int, Mbuf);
  191:   extern void		FsmSendEchoReq(Fsm fp, Mbuf payload);
  192:   extern void		FsmSendIdent(Fsm fp, const char *ident);
  193:   extern void		FsmSendTimeRemaining(Fsm fp, u_int seconds);
  194:   extern u_char		*FsmConfValue(u_char *cp, int ty,
  195: 				int len, const void *data);
  196:   extern void		FsmFailure(Fsm fp, enum fsmfail reason);
  197:   extern const char	*FsmFailureStr(enum fsmfail reason);
  198: 
  199:   extern void		FsmAck(Fsm fp, const struct fsmoption *opt);
  200:   extern void		FsmNak(Fsm fp, const struct fsmoption *opt);
  201:   extern void		FsmRej(Fsm fp, const struct fsmoption *opt);
  202: 
  203:   extern FsmOptInfo	FsmFindOptInfo(FsmOptInfo list, u_char type);
  204:   extern const char	*FsmStateName(enum fsm_state state);
  205:   extern const char	*FsmCodeName(int code);
  206: 
  207: #define Pref(fp)	 ( (fp)->type->link_layer ? ((Link)((fp)->arg))->name : ((Bund)((fp)->arg))->name )
  208: #define Fsm(fp)		 ( (fp)->type->name )
  209: 
  210: #endif	/* _FSM_H_ */
  211: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>