fsm.h revision 6735
1219820Sjeff/*
2219820Sjeff *	    Written by Toshiharu OHNO (tony-o@iij.ad.jp)
3219820Sjeff *
4219820Sjeff *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
5219820Sjeff *
6219820Sjeff * Redistribution and use in source and binary forms are permitted
7219820Sjeff * provided that the above copyright notice and this paragraph are
8219820Sjeff * duplicated in all such forms and that any documentation,
9219820Sjeff * advertising materials, and other materials related to such
10219820Sjeff * distribution and use acknowledge that the software was developed
11219820Sjeff * by the Internet Initiative Japan.  The name of the
12219820Sjeff * IIJ may not be used to endorse or promote products derived
13219820Sjeff * from this software without specific prior written permission.
14219820Sjeff * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
15219820Sjeff * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
16219820Sjeff * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17219820Sjeff *
18219820Sjeff * $Id:$
19219820Sjeff *
20219820Sjeff *	TODO:
21219820Sjeff */
22219820Sjeff
23219820Sjeff#ifndef _FSM_H_
24219820Sjeff#define	_FSM_H_
25219820Sjeff
26219820Sjeff#include "defs.h"
27219820Sjeff#include <netinet/in.h>
28219820Sjeff#include "timeout.h"
29219820Sjeff#include "cdefs.h"
30219820Sjeff
31219820Sjeff/*
32219820Sjeff *  State of machine
33219820Sjeff */
34219820Sjeff#define	ST_INITIAL	0
35219820Sjeff#define	ST_STARTING	1
36219820Sjeff#define	ST_CLOSED	2
37219820Sjeff#define	ST_STOPPED	3
38219820Sjeff#define	ST_CLOSING	4
39219820Sjeff#define	ST_STOPPING	5
40219820Sjeff#define	ST_REQSENT	6
41219820Sjeff#define	ST_ACKRCVD	7
42219820Sjeff#define	ST_ACKSENT	8
43219820Sjeff#define	ST_OPENED	9
44219820Sjeff
45219820Sjeff#define	ST_MAX		10
46219820Sjeff#define	ST_UNDEF	-1
47219820Sjeff
48219820Sjeff#define	MODE_REQ	0
49219820Sjeff#define	MODE_NAK	1
50219820Sjeff#define	MODE_REJ	2
51219820Sjeff#define	MODE_NOP	3
52219820Sjeff
53219820Sjeff#define	OPEN_ACTIVE	0
54219820Sjeff#define	OPEN_PASSIVE	1
55219820Sjeff
56219820Sjeffstruct fsm {
57219820Sjeff  char	  *name;		/* Name of protocol */
58219820Sjeff  u_short proto;		/* Protocol number */
59219820Sjeff  u_short max_code;
60219820Sjeff  int	  open_mode;
61219820Sjeff  int	  state;		/* State of the machine */
62219820Sjeff  int	  reqid;		/* Next request id */
63219820Sjeff  int	  restart;		/* Restart counter value */
64219820Sjeff  int	  maxconfig;
65219820Sjeff
66219820Sjeff  int     reqcode;		/* Request code sent */
67219820Sjeff  struct pppTimer FsmTimer;	/* Restart Timer */
68219820Sjeff
69219820Sjeff  void	  (*LayerUp) __P((struct fsm *));
70219820Sjeff  void	  (*LayerDown) __P((struct fsm *));
71219820Sjeff  void	  (*LayerStart) __P((struct fsm *));
72219820Sjeff  void	  (*LayerFinish) __P((struct fsm *));
73219820Sjeff  void	  (*InitRestartCounter) __P((struct fsm *));
74219820Sjeff  void	  (*SendConfigReq) __P((struct fsm *));
75219820Sjeff  void	  (*SendTerminateReq) __P((struct fsm *));
76219820Sjeff  void	  (*SendTerminateAck) __P((struct fsm *));
77219820Sjeff  void	  (*DecodeConfig) __P((u_char *, int, int));
78219820Sjeff};
79219820Sjeff
80219820Sjeffstruct fsmheader {
81219820Sjeff  u_char  code;		/* Request code */
82219820Sjeff  u_char  id;		/* Identification */
83219820Sjeff  u_short length;	/* Length of packet */
84219820Sjeff};
85219820Sjeff
86219820Sjeff#define	CODE_CONFIGREQ	1
87219820Sjeff#define	CODE_CONFIGACK	2
88219820Sjeff#define	CODE_CONFIGNAK	3
89219820Sjeff#define	CODE_CONFIGREJ	4
90219820Sjeff#define	CODE_TERMREQ	5
91219820Sjeff#define	CODE_TERMACK	6
92219820Sjeff#define	CODE_CODEREJ	7
93219820Sjeff#define	CODE_PROTOREJ	8
94219820Sjeff#define	CODE_ECHOREQ	9		/* Used in LCP */
95219820Sjeff#define	CODE_ECHOREP	10		/* Used in LCP */
96219820Sjeff#define	CODE_DISCREQ	11
97219820Sjeff#define	CODE_IDENT	12		/* Used in LCP Extension */
98219820Sjeff#define	CODE_TIMEREM	13		/* Used in LCP Extension */
99219820Sjeff#define	CODE_RESETREQ	14		/* Used in CCP */
100219820Sjeff#define	CODE_RESETACK	15		/* Used in CCP */
101219820Sjeff
102219820Sjeffstruct fsmcodedesc {
103219820Sjeff  void (*action) __P((struct fsm *, struct fsmheader *, struct mbuf *));
104219820Sjeff  char *name;
105219820Sjeff};
106219820Sjeff
107219820Sjeffstruct fsmconfig {
108219820Sjeff  u_char type;
109219820Sjeff  u_char length;
110219820Sjeff};
111219820Sjeff
112219820Sjeffu_char AckBuff[200];
113219820Sjeffu_char NakBuff[200];
114219820Sjeffu_char RejBuff[100];
115219820Sjeffu_char ReqBuff[200];
116219820Sjeff
117219820Sjeffu_char *ackp, *nakp, *rejp;
118219820Sjeff
119219820Sjeffextern char *StateNames[];
120219820Sjeffextern void FsmInit __P((struct fsm *));
121219820Sjeffextern void NewState __P((struct fsm *, int));
122219820Sjeffextern void FsmOutput __P((struct fsm *, u_int, u_int, u_char *, int));
123219820Sjeffextern void FsmOpen __P((struct fsm *));
124219820Sjeffextern void FsmUp __P((struct fsm *));
125219820Sjeffextern void FsmDown __P((struct fsm *));
126219820Sjeffextern void FsmInput __P((struct fsm *, struct mbuf *));
127219820Sjeff
128219820Sjeffextern void FsmRecvConfigReq __P((struct fsm *, struct fsmheader *, struct mbuf *));
129219820Sjeffextern void FsmRecvConfigAck __P((struct fsm *, struct fsmheader *, struct mbuf *));
130219820Sjeffextern void FsmRecvConfigNak __P((struct fsm *, struct fsmheader *, struct mbuf *));
131219820Sjeffextern void FsmRecvTermReq __P((struct fsm *, struct fsmheader *, struct mbuf *));
132219820Sjeffextern void FsmRecvTermAck __P((struct fsm *, struct fsmheader *, struct mbuf *));
133219820Sjeffextern void FsmClose __P((struct fsm *fp));
134219820Sjeff
135219820Sjeffextern struct fsm LcpFsm, IpcpFsm, CcpFsm;
136219820Sjeff
137219820Sjeff#endif	/* _FSM_H_ */
138219820Sjeff