xref: /freebsd/usr.sbin/ppp/fsm.h (revision 1ae349f52c53416e04f1d038a8210f1a9fa7db2c)
11ae349f5Scvs2svn /*
21ae349f5Scvs2svn  *	    Written by Toshiharu OHNO (tony-o@iij.ad.jp)
31ae349f5Scvs2svn  *
41ae349f5Scvs2svn  *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
51ae349f5Scvs2svn  *
61ae349f5Scvs2svn  * Redistribution and use in source and binary forms are permitted
71ae349f5Scvs2svn  * provided that the above copyright notice and this paragraph are
81ae349f5Scvs2svn  * duplicated in all such forms and that any documentation,
91ae349f5Scvs2svn  * advertising materials, and other materials related to such
101ae349f5Scvs2svn  * distribution and use acknowledge that the software was developed
111ae349f5Scvs2svn  * by the Internet Initiative Japan.  The name of the
121ae349f5Scvs2svn  * IIJ may not be used to endorse or promote products derived
131ae349f5Scvs2svn  * from this software without specific prior written permission.
141ae349f5Scvs2svn  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
151ae349f5Scvs2svn  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
161ae349f5Scvs2svn  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
171ae349f5Scvs2svn  *
181ae349f5Scvs2svn  * $Id: fsm.h,v 1.15 1998/01/20 22:47:37 brian Exp $
191ae349f5Scvs2svn  *
201ae349f5Scvs2svn  *	TODO:
211ae349f5Scvs2svn  */
221ae349f5Scvs2svn 
231ae349f5Scvs2svn /*
241ae349f5Scvs2svn  *  State of machine
251ae349f5Scvs2svn  */
261ae349f5Scvs2svn #define	ST_INITIAL	0
271ae349f5Scvs2svn #define	ST_STARTING	1
281ae349f5Scvs2svn #define	ST_CLOSED	2
291ae349f5Scvs2svn #define	ST_STOPPED	3
301ae349f5Scvs2svn #define	ST_CLOSING	4
311ae349f5Scvs2svn #define	ST_STOPPING	5
321ae349f5Scvs2svn #define	ST_REQSENT	6
331ae349f5Scvs2svn #define	ST_ACKRCVD	7
341ae349f5Scvs2svn #define	ST_ACKSENT	8
351ae349f5Scvs2svn #define	ST_OPENED	9
361ae349f5Scvs2svn 
371ae349f5Scvs2svn #define	ST_MAX		10
381ae349f5Scvs2svn #define	ST_UNDEF	-1
391ae349f5Scvs2svn 
401ae349f5Scvs2svn #define	MODE_REQ	0
411ae349f5Scvs2svn #define	MODE_NAK	1
421ae349f5Scvs2svn #define	MODE_REJ	2
431ae349f5Scvs2svn #define	MODE_NOP	3
441ae349f5Scvs2svn #define	MODE_ACK	4	/* pseudo mode for ccp negotiations */
451ae349f5Scvs2svn 
461ae349f5Scvs2svn #define	OPEN_PASSIVE	-1
471ae349f5Scvs2svn 
481ae349f5Scvs2svn struct fsm {
491ae349f5Scvs2svn   const char *name;		/* Name of protocol */
501ae349f5Scvs2svn   u_short proto;		/* Protocol number */
511ae349f5Scvs2svn   u_short max_code;
521ae349f5Scvs2svn   int open_mode;
531ae349f5Scvs2svn   int state;			/* State of the machine */
541ae349f5Scvs2svn   u_char reqid;			/* Next request id */
551ae349f5Scvs2svn   int restart;			/* Restart counter value */
561ae349f5Scvs2svn   int maxconfig;
571ae349f5Scvs2svn 
581ae349f5Scvs2svn   struct pppTimer FsmTimer;	/* Restart Timer */
591ae349f5Scvs2svn   struct pppTimer OpenTimer;	/* Delay before opening */
601ae349f5Scvs2svn 
611ae349f5Scvs2svn   /*
621ae349f5Scvs2svn    * This timer times the ST_STOPPED state out after the given value
631ae349f5Scvs2svn    * (specified via "set stopped ...").  Although this isn't specified in the
641ae349f5Scvs2svn    * rfc, the rfc *does* say that "the application may use higher level
651ae349f5Scvs2svn    * timers to avoid deadlock". The StoppedTimer takes effect when the other
661ae349f5Scvs2svn    * side ABENDs rather than going into ST_ACKSENT (and sending the ACK),
671ae349f5Scvs2svn    * causing ppp to time out and drop into ST_STOPPED.  At this point,
681ae349f5Scvs2svn    * nothing will change this state :-(
691ae349f5Scvs2svn    */
701ae349f5Scvs2svn   struct pppTimer StoppedTimer;
711ae349f5Scvs2svn   int LogLevel;
721ae349f5Scvs2svn 
731ae349f5Scvs2svn   void (*LayerUp) (struct fsm *);
741ae349f5Scvs2svn   void (*LayerDown) (struct fsm *);
751ae349f5Scvs2svn   void (*LayerStart) (struct fsm *);
761ae349f5Scvs2svn   void (*LayerFinish) (struct fsm *);
771ae349f5Scvs2svn   void (*InitRestartCounter) (struct fsm *);
781ae349f5Scvs2svn   void (*SendConfigReq) (struct fsm *);
791ae349f5Scvs2svn   void (*SendTerminateReq) (struct fsm *);
801ae349f5Scvs2svn   void (*SendTerminateAck) (struct fsm *);
811ae349f5Scvs2svn   void (*DecodeConfig) (u_char *, int, int);
821ae349f5Scvs2svn };
831ae349f5Scvs2svn 
841ae349f5Scvs2svn struct fsmheader {
851ae349f5Scvs2svn   u_char code;			/* Request code */
861ae349f5Scvs2svn   u_char id;			/* Identification */
871ae349f5Scvs2svn   u_short length;		/* Length of packet */
881ae349f5Scvs2svn };
891ae349f5Scvs2svn 
901ae349f5Scvs2svn #define	CODE_CONFIGREQ	1
911ae349f5Scvs2svn #define	CODE_CONFIGACK	2
921ae349f5Scvs2svn #define	CODE_CONFIGNAK	3
931ae349f5Scvs2svn #define	CODE_CONFIGREJ	4
941ae349f5Scvs2svn #define	CODE_TERMREQ	5
951ae349f5Scvs2svn #define	CODE_TERMACK	6
961ae349f5Scvs2svn #define	CODE_CODEREJ	7
971ae349f5Scvs2svn #define	CODE_PROTOREJ	8
981ae349f5Scvs2svn #define	CODE_ECHOREQ	9	/* Used in LCP */
991ae349f5Scvs2svn #define	CODE_ECHOREP	10	/* Used in LCP */
1001ae349f5Scvs2svn #define	CODE_DISCREQ	11
1011ae349f5Scvs2svn #define	CODE_IDENT	12	/* Used in LCP Extension */
1021ae349f5Scvs2svn #define	CODE_TIMEREM	13	/* Used in LCP Extension */
1031ae349f5Scvs2svn #define	CODE_RESETREQ	14	/* Used in CCP */
1041ae349f5Scvs2svn #define	CODE_RESETACK	15	/* Used in CCP */
1051ae349f5Scvs2svn 
1061ae349f5Scvs2svn struct fsmcodedesc {
1071ae349f5Scvs2svn   void (*action) (struct fsm *, struct fsmheader *, struct mbuf *);
1081ae349f5Scvs2svn   const char *name;
1091ae349f5Scvs2svn };
1101ae349f5Scvs2svn 
1111ae349f5Scvs2svn struct fsmconfig {
1121ae349f5Scvs2svn   u_char type;
1131ae349f5Scvs2svn   u_char length;
1141ae349f5Scvs2svn };
1151ae349f5Scvs2svn 
1161ae349f5Scvs2svn extern u_char AckBuff[200];
1171ae349f5Scvs2svn extern u_char NakBuff[200];
1181ae349f5Scvs2svn extern u_char RejBuff[100];
1191ae349f5Scvs2svn extern u_char ReqBuff[200];
1201ae349f5Scvs2svn extern u_char *ackp;
1211ae349f5Scvs2svn extern u_char *nakp;
1221ae349f5Scvs2svn extern u_char *rejp;
1231ae349f5Scvs2svn 
1241ae349f5Scvs2svn extern char const *StateNames[];
1251ae349f5Scvs2svn 
1261ae349f5Scvs2svn extern void FsmInit(struct fsm *);
1271ae349f5Scvs2svn extern void FsmOutput(struct fsm *, u_int, u_int, u_char *, int);
1281ae349f5Scvs2svn extern void FsmOpen(struct fsm *);
1291ae349f5Scvs2svn extern void FsmUp(struct fsm *);
1301ae349f5Scvs2svn extern void FsmDown(struct fsm *);
1311ae349f5Scvs2svn extern void FsmInput(struct fsm *, struct mbuf *);
1321ae349f5Scvs2svn extern void FsmClose(struct fsm *);
133