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