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