pppfsm.h
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:6k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. #ifndef _PPPFSM_H
  2. #define _PPPFSM_H
  3. #ifndef _MBUF_H
  4. #include "mbuf.h"
  5. #endif
  6. #ifndef _PROC_H
  7. #include "proc.h"
  8. #endif
  9. #ifndef _IFACE_H
  10. #include "iface.h"
  11. #endif
  12. #ifndef _TIMER_H
  13. #include "timer.h"
  14. #endif
  15. /* 00: serious internal problems */
  16. /* 01: interoperability problems */
  17. /* 02: state machine messages */
  18. #define PPP_DEBUG_RAW
  19. #define PPP_DEBUG_OPTIONS 0x08
  20. #define PPP_DEBUG_CHECKS(x) if(PPPtrace & 0x40) trace_log(PPPiface,x);
  21. #define PPP_DEBUG_ROUTINES(x) if(PPPtrace & 0x80) trace_log(PPPiface,x);
  22. /* config packet header */
  23. struct config_hdr {
  24. byte_t code;
  25. #define CONFIG_REQ  1
  26. #define CONFIG_ACK  2
  27. #define CONFIG_NAK  3
  28. #define CONFIG_REJ  4
  29. #define TERM_REQ  5
  30. #define TERM_ACK  6
  31. #define CODE_REJ  7
  32. #define PROT_REJ  8
  33. #define ECHO_REQ  9
  34. #define ECHO_REPLY 10
  35. #define DISCARD_REQ 11
  36. #define QUALITY_REPORT 12
  37. byte_t id;
  38. uint16 len;
  39. };
  40. #define CONFIG_HDR_LEN 4 /* Length of config packet header */
  41. /* config option header */
  42. struct option_hdr {
  43. byte_t type; /* protocol dependant types */
  44. byte_t len;
  45. };
  46. #define OPTION_HDR_LEN 2 /* Length of option header */
  47. /* Supported Configuration Protocol index */
  48. enum {
  49. Lcp,
  50. Pap,
  51. IPcp,
  52. fsmi_Size
  53. };
  54. struct fsm_s; /* forward declaration */
  55. /* Protocol Constants needed by State Machine */
  56. struct fsm_constant_s {
  57. char *name; /* Name of protocol */
  58. uint16 protocol; /* Protocol number */
  59. uint16 recognize; /* Config codes to use (bits) */
  60. byte_t fsmi; /* Finite State Machine index */
  61. byte_t try_req; /* # tries for request */
  62. byte_t try_nak; /* # tries for nak substitutes */
  63. byte_t try_terminate; /* # tries for terminate */
  64. int32 timeout; /* Time for timeouts (milliseconds)*/
  65. /* To free structure */
  66. void (*free)(struct fsm_s *fsm_p);
  67. /* Set negotiation to initial values */
  68. void (*reset)(struct fsm_s *fsm_p);
  69. /* When leaving Closed or Listen */
  70. void (*starting)(struct fsm_s *fsm_p);
  71. /* When entering Opened */
  72. void (*opening)(struct fsm_s *fsm_p);
  73. /* When leaving Opened */
  74. void (*closing)(struct fsm_s *fsm_p);
  75. /* When entering Closed or Listen (after termination) */
  76. void (*stopping)(struct fsm_s *fsm_p);
  77. struct mbuf *(*makereq)(struct fsm_s *fsm_p);
  78. int (*request)(struct fsm_s *fsm_p,
  79. struct config_hdr *hdr,
  80. struct mbuf **bpp);
  81. int (*ack)(struct fsm_s *fsm_p,
  82. struct config_hdr *hdr,
  83. struct mbuf **bpp);
  84. int (*nak)(struct fsm_s *fsm_p,
  85. struct config_hdr *hdr,
  86. struct mbuf **bpp);
  87. int (*reject)(struct fsm_s *fsm_p,
  88. struct config_hdr *hdr,
  89. struct mbuf **bpp);
  90. };
  91. /* FSM states */
  92. enum {
  93. fsmCLOSED,
  94. fsmLISTEN,
  95. fsmREQ_Sent,
  96. fsmACK_Rcvd,
  97. fsmACK_Sent,
  98. fsmOPENED,
  99. fsmTERM_Sent,
  100. fsmState_Size
  101. };
  102. /* State Machine Control Block */
  103. struct fsm_s {
  104. byte_t state; /* FSM state */
  105. byte_t lastid; /* ID of last REQ we sent */
  106. byte_t flags;
  107. #define PPP_ESCAPED 0x01
  108. #define PPP_TOSS 0x02
  109. #define FSM_PASSIVE 0x40 /* opened passive */
  110. #define FSM_ACTIVE 0x80 /* opened active */
  111. byte_t retry; /* counter for timeouts */
  112. byte_t try_req; /* # tries for request */
  113. byte_t try_terminate; /* # tries for terminate */
  114. byte_t retry_nak; /* counter for naks of requests */
  115. byte_t try_nak; /* # tries for nak substitutes */
  116. struct ppp_s *ppp_p; /* the ppp we belong to */
  117. struct timer timer;
  118. struct fsm_constant_s *pdc; /* protocol dependent constants */
  119. void *pdv; /* protocol dependent variables */
  120. };
  121. /* Link Phases */
  122. enum {
  123. pppDEAD, /* Waiting for physical layer */
  124. pppLCP, /* Link Control Phase */
  125. pppAP, /* Authentication Phase */
  126. pppREADY, /* Link ready for traffic */
  127. pppTERMINATE, /* Termination Phase */
  128. pppPhase_Size
  129. };
  130. /* PPP control block */
  131. struct ppp_s {
  132. struct iface *iface; /* pointer to interface block */
  133. byte_t phase; /* phase of link initialization */
  134. byte_t id; /* id counter for connection */
  135. byte_t flags;
  136. #define PPP_AP_LOCAL 0x10 /* local authentication */
  137. #define PPP_AP_REMOTE 0x20 /* remote authentication */
  138. byte_t trace; /* trace flags for connection */
  139. struct fsm_s fsm[fsmi_Size]; /* finite state machines */
  140. int32 upsince; /* Timestamp when Link Opened */
  141. char *peername; /* Peername from remote (if any) */
  142. int32 OutTxOctetCount; /* # octets sent */
  143. int32 OutOpenFlag; /* # of open flags sent */
  144. uint16 OutNCP[fsmi_Size]; /* # NCP packets sent by protocol */
  145. uint16 OutError; /* # packets with error on send */
  146. uint16 OutMemory; /* # alloc failures on send */
  147. int32 InRxOctetCount; /* # octets received */
  148. int32 InOpenFlag; /* # of open flags */
  149. uint16 InNCP[fsmi_Size]; /* # NCP packets by protocol */
  150. uint16 InUnknown; /* # unknown packets received */
  151. uint16 InChecksum; /* # packets with bad checksum */
  152. uint16 InFrame; /* # packets with frame error */
  153. uint16 InError; /* # packets with other error */
  154. uint16 InMemory;  /* # alloc failures */
  155. };
  156. extern char *fsmStates[];
  157. extern char *fsmCodes[];
  158. void htoncnf(struct config_hdr *cnf, struct mbuf **data);
  159. int ntohcnf(struct config_hdr *cnf, struct mbuf **bpp);
  160. int ntohopt(struct option_hdr *opt, struct mbuf **bpp);
  161. void fsm_no_action(struct fsm_s *fsm_p);
  162. int fsm_no_check(struct fsm_s *fsm_p,
  163. struct config_hdr *hdr,
  164. struct mbuf **bp);
  165. void fsm_log(struct fsm_s *fsm_p, char *comment);
  166. void fsm_timer(struct fsm_s *fsm_p);
  167. int fsm_send(struct fsm_s *fsm_p, byte_t code,
  168. byte_t id, struct mbuf **data);
  169. int fsm_sendreq(struct fsm_s *fsm_p);
  170. void fsm_proc(struct fsm_s *fsm_p, struct mbuf **bp);
  171. void fsm_start(struct fsm_s *fsm_p);
  172. void fsm_down(struct fsm_s *fsm_p);
  173. void fsm_close(struct fsm_s *fsm_p);
  174. void fsm_init(struct fsm_s *fsm_p);
  175. void fsm_free(struct fsm_s *fsm_p);
  176. #endif /* _PPPFSM_H */