Annotation of embedaddon/libpdel/ppp/ppp_fsm.h, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: * Copyright (c) 2001-2002 Packet Design, LLC.
! 4: * All rights reserved.
! 5: *
! 6: * Subject to the following obligations and disclaimer of warranty,
! 7: * use and redistribution of this software, in source or object code
! 8: * forms, with or without modifications are expressly permitted by
! 9: * Packet Design; provided, however, that:
! 10: *
! 11: * (i) Any and all reproductions of the source or object code
! 12: * must include the copyright notice above and the following
! 13: * disclaimer of warranties; and
! 14: * (ii) No rights are granted, in any manner or form, to use
! 15: * Packet Design trademarks, including the mark "PACKET DESIGN"
! 16: * on advertising, endorsements, or otherwise except as such
! 17: * appears in the above copyright notice or in the software.
! 18: *
! 19: * THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND
! 20: * TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO
! 21: * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING
! 22: * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED
! 23: * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
! 24: * OR NON-INFRINGEMENT. PACKET DESIGN DOES NOT WARRANT, GUARANTEE,
! 25: * OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS
! 26: * OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY,
! 27: * RELIABILITY OR OTHERWISE. IN NO EVENT SHALL PACKET DESIGN BE
! 28: * LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE
! 29: * OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT,
! 30: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL
! 31: * DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF
! 32: * USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF
! 33: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 34: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
! 35: * THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF
! 36: * THE POSSIBILITY OF SUCH DAMAGE.
! 37: *
! 38: * Author: Archie Cobbs <archie@freebsd.org>
! 39: */
! 40:
! 41: #ifndef _PDEL_PPP_PPP_FSM_H_
! 42: #define _PDEL_PPP_PPP_FSM_H_
! 43:
! 44: #ifndef _PDEL_PPP_PRIVATE_H_
! 45: #error "This header is only for use by the ppp library."
! 46: #endif
! 47:
! 48: struct ppp_fsm;
! 49: struct ppp_fsm_instance;
! 50: struct ppp_fsm_options;
! 51: struct ppp_fsm_optdesc;
! 52:
! 53: /*
! 54: * FSM states
! 55: */
! 56: enum ppp_fsm_state {
! 57: FSM_STATE_INITIAL =0,
! 58: FSM_STATE_STARTING =1,
! 59: FSM_STATE_CLOSED =2,
! 60: FSM_STATE_STOPPED =3,
! 61: FSM_STATE_CLOSING =4,
! 62: FSM_STATE_STOPPING =5,
! 63: FSM_STATE_REQSENT =6,
! 64: FSM_STATE_ACKRCVD =7,
! 65: FSM_STATE_ACKSENT =8,
! 66: FSM_STATE_OPENED =9
! 67: };
! 68: #define FSM_STATE_MAX 10
! 69:
! 70: /*
! 71: * FSM codes
! 72: */
! 73: enum ppp_fsm_code {
! 74: FSM_CODE_VENDOR =0,
! 75: FSM_CODE_CONFIGREQ =1,
! 76: FSM_CODE_CONFIGACK =2,
! 77: FSM_CODE_CONFIGNAK =3,
! 78: FSM_CODE_CONFIGREJ =4,
! 79: FSM_CODE_TERMREQ =5,
! 80: FSM_CODE_TERMACK =6,
! 81: FSM_CODE_CODEREJ =7,
! 82: FSM_CODE_PROTOREJ =8,
! 83: FSM_CODE_ECHOREQ =9,
! 84: FSM_CODE_ECHOREP =10,
! 85: FSM_CODE_DISCREQ =11,
! 86: FSM_CODE_IDENT =12,
! 87: FSM_CODE_TIMEREM =13,
! 88: FSM_CODE_RESETREQ =14,
! 89: FSM_CODE_RESETACK =15
! 90: };
! 91: #define FSM_CODE_MAX 16
! 92:
! 93: /*
! 94: * FSM packet format
! 95: */
! 96: struct ppp_fsm_pkt {
! 97: u_char code; /* fsm code */
! 98: u_char id; /* packet id */
! 99: u_int16_t length; /* length (network order) */
! 100: u_char data[0]; /* packet data */
! 101: };
! 102:
! 103: /*
! 104: * Input to an FSM
! 105: */
! 106: enum ppp_fsm_input {
! 107: FSM_INPUT_OPEN = 1, /* request to open */
! 108: FSM_INPUT_CLOSE, /* request to close */
! 109: FSM_INPUT_UP, /* lower layer went up */
! 110: FSM_INPUT_DOWN_FATAL, /* lower layer went down, fatal */
! 111: FSM_INPUT_DOWN_NONFATAL, /* lower layer went down, not fatal */
! 112: FSM_INPUT_DATA, /* packet recieved */
! 113: FSM_INPUT_XMIT_PROTOREJ, /* send a protocol-reject to peer */
! 114: FSM_INPUT_RECD_PROTOREJ, /* indicate rec'd fatal proto-rej */
! 115: };
! 116:
! 117: /*
! 118: * Output from an FSM
! 119: */
! 120: enum ppp_fsmoutput {
! 121: FSM_OUTPUT_OPEN = 1, /* request opening lower layer */
! 122: FSM_OUTPUT_CLOSE, /* request closing lower layer */
! 123: FSM_OUTPUT_UP, /* fsm has reached the open state */
! 124: FSM_OUTPUT_DOWN, /* fsm has left the open state */
! 125: FSM_OUTPUT_DATA, /* packet to be sent */
! 126: FSM_OUTPUT_PROTOREJ, /* rec'd non-fatal protocol reject */
! 127: FSM_OUTPUT_DEAD, /* fsm has finished or failed */
! 128: };
! 129:
! 130: /* Reasons associated with a FSM_OUTPUT_DOWN or FSM_OUTPUT_DEAD output */
! 131: enum ppp_fsm_reason {
! 132: FSM_REASON_CLOSE = 1, /* rec'd FSM_INPUT_CLOSE */
! 133: FSM_REASON_DOWN_FATAL, /* rec'd FSM_INPUT_DOWN_FATAL */
! 134: FSM_REASON_DOWN_NONFATAL, /* rec'd FSM_INPUT_DOWN_NONFATAL */
! 135: FSM_REASON_CONF, /* rec'd Conf-Req, etc. (DOWN only) */
! 136: FSM_REASON_TERM, /* rec'd terminate request */
! 137: FSM_REASON_CODEREJ, /* rec'd fatal code reject */
! 138: FSM_REASON_PROTOREJ, /* rec'd fatal protocol reject */
! 139: FSM_REASON_NEGOT, /* negotiation failed/didn't converge */
! 140: FSM_REASON_BADMAGIC, /* bad magic number received */
! 141: FSM_REASON_LOOPBACK, /* looped back connection detected */
! 142: FSM_REASON_TIMEOUT, /* peer not responding to echo */
! 143: FSM_REASON_SYSERR, /* internal system error */
! 144: };
! 145:
! 146: /* FSM output structure */
! 147: struct ppp_fsm_output {
! 148: enum ppp_fsmoutput type; /* type of output */
! 149: union {
! 150: struct { /* if FSM_OUTPUT_DATA */
! 151: u_char *data;
! 152: u_int length;
! 153: } data;
! 154: u_int16_t proto; /* if FSM_OUTPUT_PROTOREJ */
! 155: struct { /* if FSM_OUTPUT_DOWN, DEAD */
! 156: enum ppp_fsm_reason reason; /* reason for DOWN or DEAD */
! 157: union {
! 158: int error; /* FSM_REASON_SYSERR */
! 159: u_char code; /* FSM_REASON_CODEREJ/CONF */
! 160: u_int16_t proto; /* FSM_REASON_PROTOREJ */
! 161: } u;
! 162: } down;
! 163: } u; /* type specific contents */
! 164: };
! 165:
! 166: /*
! 167: * FSM type function types
! 168: */
! 169: typedef void ppp_fsm_type_destroy_t(struct ppp_fsm_instance *fsm);
! 170: typedef int ppp_fsm_type_build_conf_req_t(struct ppp_fsm_instance *fsm,
! 171: struct ppp_fsm_options *opts);
! 172: typedef int ppp_fsm_type_recv_conf_req_t(struct ppp_fsm_instance *fsm,
! 173: struct ppp_fsm_options *req,
! 174: struct ppp_fsm_options *nak,
! 175: struct ppp_fsm_options *rej);
! 176: typedef int ppp_fsm_type_recv_conf_rej_t(struct ppp_fsm_instance *fsm,
! 177: struct ppp_fsm_options *rej);
! 178: typedef int ppp_fsm_type_recv_conf_nak_t(struct ppp_fsm_instance *fsm,
! 179: struct ppp_fsm_options *nak);
! 180: typedef u_int32_t ppp_fsm_type_get_magic_t(struct ppp_fsm_instance *fsm,
! 181: int dir);
! 182: typedef void ppp_fsm_type_recv_reset_req_t(struct ppp_fsm_instance *fsm,
! 183: const u_char *data, u_int len);
! 184: typedef void ppp_fsm_type_recv_reset_ack_t(struct ppp_fsm_instance *fsm,
! 185: const u_char *data, u_int len);
! 186: typedef void ppp_fsm_type_recv_vendor_t(struct ppp_fsm_instance *fsm,
! 187: const u_char *data, u_int len);
! 188:
! 189: /*
! 190: * FSM type
! 191: *
! 192: * Information describing one type of FSM (e.g., LCP, IPCP)
! 193: */
! 194: struct ppp_fsm_type {
! 195:
! 196: /* Basic stuff */
! 197: const char *name; /* name of protocol */
! 198: u_int16_t proto; /* fsm protocol number */
! 199: u_int32_t sup_codes; /* supported fsm codes */
! 200: u_int32_t req_codes; /* required fsm codes */
! 201:
! 202: /* FSM configuration options */
! 203: const struct ppp_fsm_optdesc *options; /* option descriptors */
! 204: const struct ppp_fsm_options *defaults; /* default options */
! 205:
! 206: /* Required callbacks */
! 207: ppp_fsm_type_destroy_t *destroy;
! 208: ppp_fsm_type_build_conf_req_t *build_conf_req;
! 209: ppp_fsm_type_recv_conf_req_t *recv_conf_req;
! 210: ppp_fsm_type_recv_conf_rej_t *recv_conf_rej;
! 211: ppp_fsm_type_recv_conf_nak_t *recv_conf_nak;
! 212:
! 213: /* Magic numbers */
! 214: ppp_fsm_type_get_magic_t *get_magic;
! 215:
! 216: /* Optional callbacks */
! 217: ppp_fsm_type_recv_reset_req_t *recv_reset_req;
! 218: ppp_fsm_type_recv_reset_ack_t *recv_reset_ack;
! 219: ppp_fsm_type_recv_vendor_t *recv_vendor;
! 220: };
! 221:
! 222: /*
! 223: * One instance of an FSM
! 224: */
! 225: struct ppp_fsm_instance {
! 226: const struct ppp_fsm_type *type; /* which type of fsm */
! 227: struct ppp_fsm *fsm; /* back-pointer to fsm */
! 228: void *arg; /* per-instance info */
! 229: };
! 230:
! 231: __BEGIN_DECLS
! 232:
! 233: /* Functions */
! 234: extern struct ppp_fsm *ppp_fsm_create(struct pevent_ctx *ctx,
! 235: pthread_mutex_t *mutex, struct ppp_fsm_instance *inst,
! 236: struct ppp_log *log);
! 237: extern void ppp_fsm_destroy(struct ppp_fsm **fsmp);
! 238:
! 239: extern struct mesg_port *ppp_fsm_get_outport(struct ppp_fsm *fsm);
! 240:
! 241: extern void ppp_fsm_input(struct ppp_fsm *fsm,
! 242: enum ppp_fsm_input input, ...);
! 243: extern void ppp_fsm_free_output(struct ppp_fsm_output *output);
! 244: extern enum ppp_fsm_state ppp_fsm_get_state(struct ppp_fsm *fsm);
! 245: extern time_t ppp_fsm_last_heard(struct ppp_fsm *fsm);
! 246: extern struct ppp_fsm_instance *ppp_fsm_get_instance(struct ppp_fsm *fsm);
! 247: extern void ppp_fsm_send_reset_req(struct ppp_fsm *fsm,
! 248: const void *data, size_t dlen);
! 249: extern void ppp_fsm_send_reset_ack(struct ppp_fsm *fsm,
! 250: const void *data, size_t dlen);
! 251:
! 252: extern const char *ppp_fsm_output_str(struct ppp_fsm_output *output);
! 253: extern const char *ppp_fsm_reason_str(struct ppp_fsm_output *output);
! 254:
! 255: __END_DECLS
! 256:
! 257: #endif /* _PDEL_PPP_PPP_FSM_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>