Annotation of embedaddon/mpd/src/fsm.h, revision 1.1

1.1     ! misho       1: 
        !             2: /*
        !             3:  * fsm.h
        !             4:  *
        !             5:  * Written by Toshiharu OHNO <tony-o@iij.ad.jp>
        !             6:  * Copyright (c) 1993, Internet Initiative Japan, Inc. All rights reserved.
        !             7:  * See ``COPYRIGHT.iij''
        !             8:  * 
        !             9:  * Rewritten by Archie Cobbs <archie@freebsd.org>
        !            10:  * Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
        !            11:  * See ``COPYRIGHT.whistle''
        !            12:  */
        !            13: 
        !            14: #ifndef _FSM_H_
        !            15: #define _FSM_H_
        !            16: 
        !            17: #include <netinet/in.h>
        !            18: #include "mbuf.h"
        !            19: #include "timer.h"
        !            20: #include <netgraph/ng_ppp.h>
        !            21: 
        !            22: /*
        !            23:  * DEFINITIONS
        !            24:  */
        !            25: 
        !            26:     /* States: don't change these! */
        !            27:     enum fsm_state {
        !            28:        ST_INITIAL = 0,
        !            29:        ST_STARTING,
        !            30:        ST_CLOSED,
        !            31:        ST_STOPPED,
        !            32:        ST_CLOSING,
        !            33:        ST_STOPPING,
        !            34:        ST_REQSENT,
        !            35:        ST_ACKRCVD,
        !            36:        ST_ACKSENT,
        !            37:        ST_OPENED
        !            38:     };
        !            39: 
        !            40:   #define OPEN_STATE(s)                ((s) > ST_CLOSING || ((s) & 1))
        !            41: 
        !            42:   #define MODE_REQ     0
        !            43:   #define MODE_NAK     1
        !            44:   #define MODE_REJ     2
        !            45:   #define MODE_NOP     3
        !            46: 
        !            47:   /* Codes */
        !            48:   #define CODE_VENDOR          0
        !            49:   #define CODE_CONFIGREQ       1
        !            50:   #define CODE_CONFIGACK       2
        !            51:   #define CODE_CONFIGNAK       3
        !            52:   #define CODE_CONFIGREJ       4
        !            53:   #define CODE_TERMREQ         5
        !            54:   #define CODE_TERMACK         6
        !            55:   #define CODE_CODEREJ         7
        !            56:   #define CODE_PROTOREJ                8
        !            57:   #define CODE_ECHOREQ         9
        !            58:   #define CODE_ECHOREP         10
        !            59:   #define CODE_DISCREQ         11
        !            60:   #define CODE_IDENT           12
        !            61:   #define CODE_TIMEREM         13
        !            62:   #define CODE_RESETREQ                14
        !            63:   #define CODE_RESETACK                15
        !            64: 
        !            65:   /* All the various ways that the FSM can fail */
        !            66:   /* XXX This should be extended to contain more descriptive information
        !            67:      XXX about the cause of the failure, like what the rejected protocol
        !            68:      XXX or option was, etc. */
        !            69:   enum fsmfail {
        !            70:     FAIL_NEGOT_FAILURE,                /* option negotiation failed */
        !            71:     FAIL_RECD_BADMAGIC,                /* rec'd bad magic number */
        !            72:     FAIL_RECD_CODEREJ,         /* rec'd fatal code reject */
        !            73:     FAIL_RECD_PROTREJ,         /* rec'd fatal protocol reject */
        !            74:     FAIL_WAS_PROTREJ,          /* protocol was rejected */
        !            75:     FAIL_ECHO_TIMEOUT,         /* peer not responding to echo requests */
        !            76:     FAIL_CANT_ENCRYPT          /* failed to negotiate required encryption */
        !            77:   };
        !            78: 
        !            79:   /* FSM descriptor */
        !            80:   struct fsm;
        !            81:   typedef struct fsm                   *Fsm;
        !            82:   struct fsmoption;
        !            83:   typedef struct fsmoption             *FsmOption;
        !            84:   struct fsmoptinfo;
        !            85:   typedef const struct fsmoptinfo      *FsmOptInfo;
        !            86: 
        !            87:   struct fsmconf {
        !            88:     short      maxconfig;      /* "Max-Configure" initial value */
        !            89:     short      maxterminate;   /* "Max-Terminate" initial value */
        !            90:     short      maxfailure;     /* "Max-Failure" initial value */
        !            91:     short      echo_int;       /* LCP echo interval (zero disables) */
        !            92:     short      echo_max;       /* LCP max quiet timeout */
        !            93:     u_char     check_magic;    /* Validate any magic numbers seen */
        !            94:     u_char     passive;        /* Passive option (see rfc 1661) */
        !            95:   };
        !            96:   typedef struct fsmconf       *FsmConf;
        !            97: 
        !            98:   struct fsmtype {
        !            99:     const char         *name;          /* Name of protocol */
        !           100:     uint16_t           proto;          /* Protocol number */
        !           101:     uint16_t           known_codes;    /* Accepted FSM codes */
        !           102:     u_char             link_layer;     /* Link level FSM */
        !           103:     int                        log, log2;      /* Log levels for FSM events */
        !           104: 
        !           105:     void               (*NewState)(Fsm f, enum fsm_state old, enum fsm_state new);
        !           106:     void               (*LayerUp)(Fsm f);
        !           107:     void               (*LayerDown)(Fsm f);
        !           108:     void               (*LayerStart)(Fsm f);
        !           109:     void               (*LayerFinish)(Fsm f);
        !           110:     u_char *           (*BuildConfigReq)(Fsm f, u_char *cp);
        !           111:     void               (*DecodeConfig)(Fsm f, FsmOption a, int num, int mode);
        !           112:     void               (*Configure)(Fsm f);
        !           113:     void               (*UnConfigure)(Fsm f);
        !           114:     void               (*SendTerminateReq)(Fsm f);
        !           115:     void               (*SendTerminateAck)(Fsm f);
        !           116:     int                        (*RecvCodeRej)(Fsm f, int code, Mbuf bp);
        !           117:     int                        (*RecvProtoRej)(Fsm f, int proto, Mbuf bp);
        !           118:     void               (*Failure)(Fsm f, enum fsmfail reason);
        !           119:     void               (*RecvResetReq)(Fsm f, int id, Mbuf bp);
        !           120:     void               (*RecvResetAck)(Fsm f, int id, Mbuf bp);
        !           121:     void               (*RecvIdent)(Fsm f, Mbuf bp);
        !           122:     void               (*RecvDiscReq)(Fsm f, Mbuf bp);
        !           123:     void               (*RecvTimeRemain)(Fsm f, Mbuf bp);
        !           124:     void               (*RecvVendor)(Fsm f, Mbuf bp);
        !           125:   };
        !           126:   typedef const struct fsmtype *FsmType;
        !           127: 
        !           128:   struct fsm {
        !           129:     FsmType            type;           /* FSM constant stuff */
        !           130:     void               *arg;           /* Context (Link or Bund) */
        !           131:     int                        log;            /* Current log level */
        !           132:     int                        log2;           /* Current log2 level */
        !           133:     struct fsmconf     conf;           /* FSM parameters */
        !           134:     enum fsm_state     state;          /* State of the machine */
        !           135:     u_char             reqid;          /* Next request id */
        !           136:     u_char             rejid;          /* Next reject id */
        !           137:     u_char             echoid;         /* Next echo request id */
        !           138:     short              restart;        /* Restart counter value */
        !           139:     short              failure;        /* How many failures left */
        !           140:     short              config;         /* How many configs left */
        !           141:     short              quietCount;     /* How long peer has been silent */
        !           142:     struct pppTimer    timer;          /* Restart Timer */
        !           143:     struct pppTimer    echoTimer;      /* Keep-alive timer */
        !           144:     struct ng_ppp_link_stat
        !           145:                        idleStats;      /* Stats for echo timeout */
        !           146:   };
        !           147: 
        !           148:   /* Packet header */
        !           149:   struct fsmheader {
        !           150:     u_char     code;           /* Request code */
        !           151:     u_char     id;             /* Identification */
        !           152:     u_short    length;         /* Length of packet */
        !           153:   };
        !           154:   typedef struct fsmheader     *FsmHeader;
        !           155: 
        !           156:   /* One config option */
        !           157:   struct fsmoption {
        !           158:     u_char     type;
        !           159:     u_char     len;
        !           160:     u_char     *data;
        !           161:   };
        !           162: 
        !           163:   /* Fsm option descriptor */
        !           164:   struct fsmoptinfo {
        !           165:     const char *name;
        !           166:     u_char     type;
        !           167:     u_char     minLen;
        !           168:     u_char     maxLen;
        !           169:     u_char     supported;
        !           170:   };
        !           171: 
        !           172: /*
        !           173:  * VARIABLES
        !           174:  */
        !           175: 
        !           176:   extern u_int         gAckSize, gNakSize, gRejSize;
        !           177: 
        !           178: /*
        !           179:  * FUNCTIONS
        !           180:  */
        !           181: 
        !           182:   extern void          FsmInit(Fsm f, FsmType t, void *arg);
        !           183:   extern void          FsmInst(Fsm fp, Fsm fpt, void *arg);
        !           184:   extern void          FsmOpen(Fsm f);
        !           185:   extern void          FsmClose(Fsm f);
        !           186:   extern void          FsmUp(Fsm f);
        !           187:   extern void          FsmDown(Fsm f);
        !           188:   extern void          FsmInput(Fsm f, Mbuf bp);
        !           189:   extern void          FsmOutput(Fsm, u_int, u_int, u_char *, int);
        !           190:   extern void          FsmOutputMbuf(Fsm, u_int, u_int, Mbuf);
        !           191:   extern void          FsmSendEchoReq(Fsm fp, Mbuf payload);
        !           192:   extern void          FsmSendIdent(Fsm fp, const char *ident);
        !           193:   extern void          FsmSendTimeRemaining(Fsm fp, u_int seconds);
        !           194:   extern u_char                *FsmConfValue(u_char *cp, int ty,
        !           195:                                int len, const void *data);
        !           196:   extern void          FsmFailure(Fsm fp, enum fsmfail reason);
        !           197:   extern const char    *FsmFailureStr(enum fsmfail reason);
        !           198: 
        !           199:   extern void          FsmAck(Fsm fp, const struct fsmoption *opt);
        !           200:   extern void          FsmNak(Fsm fp, const struct fsmoption *opt);
        !           201:   extern void          FsmRej(Fsm fp, const struct fsmoption *opt);
        !           202: 
        !           203:   extern FsmOptInfo    FsmFindOptInfo(FsmOptInfo list, u_char type);
        !           204:   extern const char    *FsmStateName(enum fsm_state state);
        !           205:   extern const char    *FsmCodeName(int code);
        !           206: 
        !           207: #define Pref(fp)        ( (fp)->type->link_layer ? ((Link)((fp)->arg))->name : ((Bund)((fp)->arg))->name )
        !           208: #define Fsm(fp)                 ( (fp)->type->name )
        !           209: 
        !           210: #endif /* _FSM_H_ */
        !           211: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>