#define ST_INITIAL 0
#define ST_STARTING 1
#define ST_CLOSED 2
#define ST_STOPPED 3
#define ST_CLOSING 4
#define ST_STOPPING 5
#define ST_REQSENT 6
#define ST_ACKRCVD 7
#define ST_ACKSENT 8
#define ST_OPENED 9
#define ST_MAX 10
#define ST_UNDEF -1
#define MODE_REQ 0
#define MODE_NAK 1
#define MODE_REJ 2
#define MODE_NOP 3
#define MODE_ACK 4
#define OPEN_PASSIVE -1
#define FSM_REQ_TIMER 1
#define FSM_TRM_TIMER 2
#define FSM_OPTLEN 100
struct fsm;
struct fsm_retry {
u_int timeout;
u_int maxreq;
u_int maxtrm;
};
struct fsm_decode {
u_char ack[FSM_OPTLEN], *ackend;
u_char nak[FSM_OPTLEN], *nakend;
u_char rej[FSM_OPTLEN], *rejend;
};
struct fsm_callbacks {
int (*LayerUp)(struct fsm *);
void (*LayerDown)(struct fsm *);
void (*LayerStart)(struct fsm *);
void (*LayerFinish)(struct fsm *);
void (*InitRestartCounter)(struct fsm *, int);
void (*SendConfigReq)(struct fsm *);
void (*SentTerminateReq)(struct fsm *);
void (*SendTerminateAck)(struct fsm *, u_char);
void (*DecodeConfig)(struct fsm *, u_char *, u_char *, int,
struct fsm_decode *);
int (*RecvResetReq)(struct fsm *fp);
void (*RecvResetAck)(struct fsm *fp, u_char);
};
struct fsm_parent {
void (*LayerStart) (void *, struct fsm *);
void (*LayerUp) (void *, struct fsm *);
void (*LayerDown) (void *, struct fsm *);
void (*LayerFinish) (void *, struct fsm *);
void *object;
};
struct link;
struct bundle;
struct fsm {
const char *name;
u_short proto;
u_short min_code;
u_short max_code;
int open_mode;
unsigned state;
u_char reqid;
int restart;
struct {
int reqs;
int naks;
int rejs;
} more;
struct pppTimer FsmTimer;
struct pppTimer OpenTimer;
struct pppTimer StoppedTimer;
int LogLevel;
struct link *link;
struct bundle *bundle;
const struct fsm_parent *parent;
const struct fsm_callbacks *fn;
};
struct fsmheader {
u_char code;
u_char id;
u_short length;
};
#define CODE_CONFIGREQ 1
#define CODE_CONFIGACK 2
#define CODE_CONFIGNAK 3
#define CODE_CONFIGREJ 4
#define CODE_TERMREQ 5
#define CODE_TERMACK 6
#define CODE_CODEREJ 7
#define CODE_PROTOREJ 8
#define CODE_ECHOREQ 9
#define CODE_ECHOREP 10
#define CODE_DISCREQ 11
#define CODE_IDENT 12
#define CODE_TIMEREM 13
#define CODE_RESETREQ 14
#define CODE_RESETACK 15
struct fsm_opt_hdr {
u_char id;
u_char len;
} __packed;
#define MAX_FSM_OPT_LEN 52
struct fsm_opt {
struct fsm_opt_hdr hdr;
u_char data[MAX_FSM_OPT_LEN-2];
};
#define INC_FSM_OPT(ty, length, o) \
do { \
(o)->hdr.id = (ty); \
(o)->hdr.len = (length); \
(o) = (struct fsm_opt *)((u_char *)(o) + (length)); \
} while (0)
extern void fsm_Init(struct fsm *, const char *, u_short, int, int, int,
struct bundle *, struct link *, const struct fsm_parent *,
struct fsm_callbacks *, const char * const [3]);
extern void fsm_Output(struct fsm *, u_int, u_int, u_char *, unsigned, int);
extern void fsm_Open(struct fsm *);
extern void fsm_Up(struct fsm *);
extern void fsm_Down(struct fsm *);
extern void fsm_Input(struct fsm *, struct mbuf *);
extern void fsm_Close(struct fsm *);
extern int fsm_NullRecvResetReq(struct fsm *);
extern void fsm_NullRecvResetAck(struct fsm *, u_char);
extern void fsm_Reopen(struct fsm *);
extern void fsm2initial(struct fsm *);
extern const char *State2Nam(u_int);
extern struct fsm_opt *fsm_readopt(u_char **);
extern void fsm_rej(struct fsm_decode *, const struct fsm_opt *);
extern void fsm_ack(struct fsm_decode *, const struct fsm_opt *);
extern void fsm_nak(struct fsm_decode *, const struct fsm_opt *);
extern void fsm_opt_normalise(struct fsm_decode *);