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

TCP/IP协议栈

开发平台:

Visual C++

  1. #ifndef _NR4_H
  2. #define _NR4_H
  3. /* nr4.h:  defines for netrom layer 4 (transport) support */
  4. #ifndef _MBUF_H
  5. #include "mbuf.h"
  6. #endif
  7. #ifndef _TIMER_H
  8. #include "timer.h"
  9. #endif
  10. #ifndef _AX25_H
  11. #include "ax25.h"
  12. #endif
  13. /* compile-time limitations */
  14. #define NR4MAXCIRC 20 /* maximum number of open circuits */
  15. #define NR4MAXWIN 127 /* maximum window size, send and receive */
  16. /* protocol limitation: */
  17. #define NR4MAXINFO 236 /* maximum data in an info packet */
  18. /* sequence number wraparound mask */
  19. #define NR4SEQMASK 0xff /* eight-bit sequence numbers */
  20. /* flags in high nybble of opcode byte */
  21. #define NR4CHOKE 0x80
  22. #define NR4NAK 0x40
  23. #define NR4MORE 0x20 /* The "more follows" flag for */
  24. /* pointless packet reassembly */
  25. /* mask for opcode nybble */
  26. #define NR4OPCODE 0x0f
  27. /* opcodes */
  28. #define NR4OPPID 0 /* protocol ID extension to network layer */
  29. #define NR4OPCONRQ 1 /* connect request */
  30. #define NR4OPCONAK 2 /* connect acknowledge */
  31. #define NR4OPDISRQ 3 /* disconnect request */
  32. #define NR4OPDISAK 4 /* disconnect acknowledge */
  33. #define NR4OPINFO 5 /* information packet */
  34. #define NR4OPACK 6 /* information ACK */
  35. #define NR4NUMOPS 7 /* number of transport opcodes */
  36. /* minimum length of NET/ROM transport header */
  37. #define NR4MINHDR 5
  38. /* host format net/rom transport header */
  39. struct nr4hdr {
  40. uint8 opcode ; /* opcode and flags */
  41. uint8 yourindex ; /* receipient's circuit index */
  42. uint8 yourid ; /* receipient's circuit ID */
  43. union {
  44. struct { /* network extension */
  45. uint8 family ; /* protocol family */
  46. uint8 proto ; /* protocol within family */
  47. } pid ;
  48. struct { /* connect request */
  49. uint8 myindex ; /* sender's circuit index */
  50. uint8 myid ; /* sender's circuit ID */
  51. uint8 window ; /* sender's proposed window size */
  52. uint8 user[AXALEN] ; /* callsign of originating user */
  53. uint8 node[AXALEN] ; /* callsign of originating node */
  54. } conreq ;
  55. struct { /* connect acknowledge */
  56. uint8 myindex ; /* sender's circuit index */
  57. uint8 myid ; /* sender's circuit ID */
  58. uint8 window ;  /* accepted window size */
  59. } conack ;
  60. struct { /* information */
  61. uint8 txseq ; /* sender's tx sequence number */
  62. uint8 rxseq ; /* sender's rx sequence number */
  63. } info ;
  64. struct { /* information acknowledge */
  65. uint8 rxseq ; /* sender's rx sequence number */
  66. } ack ;
  67. } u ; /* End of union */
  68. } ;
  69. /* A netrom send buffer structure */
  70. struct nr4txbuf {
  71. struct timer tretry ; /* retry timer */
  72. unsigned retries ; /* number of retries */
  73. struct mbuf *data ; /* data sent but not acknowledged */
  74. } ;
  75. /* A netrom receive buffer structure */
  76. struct nr4rxbuf {
  77. uint8 occupied ; /* flag: buffer in use */
  78. struct mbuf *data ;  /* data received out of sequence */
  79. } ;
  80. /* address structure */
  81. struct nr4_addr {
  82. uint8 user[AXALEN];
  83. uint8 node[AXALEN];
  84. };
  85. struct sockaddr_nr {
  86. short nr_family;
  87. struct nr4_addr nr_addr;
  88. };
  89. /* The netrom circuit control block */
  90. struct nr4cb {
  91. unsigned mynum ; /* my circuit number */
  92. unsigned myid ; /* my circuit ID */
  93. unsigned yournum ; /* remote circuit number */
  94. unsigned yourid ; /* remote circuit ID */
  95. struct nr4_addr remote ; /* address of remote node */
  96. struct nr4_addr local ; /* our own address */
  97. unsigned window ; /* negotiated window size */
  98. /* Data for round trip timer calculation and setting */
  99. long srtt ; /* Smoothed round trip time */
  100. long mdev ; /* Mean deviation in round trip time */
  101. unsigned blevel ; /* Backoff level */
  102. unsigned txmax ; /* The maximum number of retries among */
  103. /* the frames in the window.  This is 0 */
  104. /* if there are no frames in the window. */
  105. /* It is used as a baseline to determine */
  106. /* when to increment the backoff level. */
  107. /* flags */
  108. char clone ; /* clone this cb upon connect */
  109. char choked ; /* choke received from remote */
  110. char qfull ; /* receive queue is full, and we have */
  111. /* choked the other end */
  112. char naksent ; /* a NAK has already been sent */
  113. /* transmit buffers and window variables */
  114. struct nr4txbuf *txbufs ; /* pointer to array[windowsize] of bufs */
  115. uint8 nextosend ; /* sequence # of next frame to send */
  116. uint8 ackxpected ; /* sequence number of next expected ACK */
  117. unsigned nbuffered ; /* number of buffered TX frames */
  118. struct mbuf *txq ; /* queue of unsent data */
  119. /* receive buffers and window variables */
  120. struct nr4rxbuf *rxbufs ; /* pointer to array[windowsize] of bufs */
  121. uint8 rxpected ; /* # of next receive frame expected */
  122. uint8 rxpastwin ; /* top of RX window + 1 */
  123. struct mbuf *rxq ; /* "fully" received data queue */
  124. /* Connection state */
  125. int state ; /* connection state */
  126. #define NR4STDISC 0 /* disconnected */
  127. #define NR4STCPEND 1 /* connection pending */
  128. #define NR4STCON 2 /* connected */
  129. #define NR4STDPEND 3 /* disconnect requested locally */
  130. #define NR4STLISTEN 4 /* listening for incoming connections */
  131. int dreason ; /* Reason for disconnect */
  132. #define NR4RNORMAL 0 /* Normal, requested disconnect */
  133. #define NR4RREMOTE 1 /* Remote requested */
  134. #define NR4RTIMEOUT 2 /* Connection timed out */
  135. #define NR4RRESET 3 /* Connection reset locally */
  136. #define NR4RREFUSED 4 /* Connect request refused */
  137. /* Per-connection timers */
  138. struct timer tchoke ; /* choke timeout */
  139. struct timer tack ; /* ack delay timer */
  140. struct timer tcd ; /* connect/disconnect timer */
  141. unsigned cdtries ; /* Number of connect/disconnect tries */
  142. void (*r_upcall)(struct nr4cb *,uint16);
  143. /* receive upcall */
  144. void (*t_upcall)(struct nr4cb *,uint16);
  145. /* transmit upcall */
  146. void (*s_upcall)(struct nr4cb *,int,int);
  147. /* state change upcall */
  148. int user ; /* user linkage area */
  149. } ;
  150. /* The netrom circuit pointer structure */
  151. struct nr4circp {
  152. uint8 cid ; /* circuit ID; incremented each time*/
  153. /* this circuit is used */
  154. struct nr4cb *ccb ; /* pointer to circuit control block, */
  155. /*  NULL if not in use */
  156. } ;
  157. /* The circuit table: */
  158. extern struct nr4circp Nr4circuits[NR4MAXCIRC] ;
  159. /* Some globals */
  160. extern unsigned short Nr4window ; /* The advertised window size, in frames */
  161. extern long Nr4irtt ; /* The initial round trip time */
  162. extern unsigned short Nr4retries ; /* The number of times to retry */
  163. extern long Nr4acktime ; /* How long to wait until ACK'ing */
  164. extern char *Nr4states[] ; /* NET/ROM state names */
  165. extern char *Nr4reasons[] ; /* Disconnect reason names */
  166. extern unsigned short Nr4qlimit ; /* max receive queue length before CHOKE */
  167. extern long Nr4choketime ; /* CHOKEd state timeout */
  168. extern uint8 Nr4user[AXALEN]; /* User callsign in outgoing connects */
  169. /* function definitions */
  170. /* In nr4hdr.c: */
  171. int ntohnr4(struct nr4hdr *, struct mbuf **);
  172. struct mbuf *htonnr4(struct nr4hdr *);
  173. /* In nr4subr.c: */
  174. void free_n4circ(struct nr4cb *);
  175. struct nr4cb *get_n4circ(int, int);
  176. int init_nr4window(struct nr4cb *, unsigned);
  177. int nr4between(unsigned, unsigned, unsigned);
  178. struct nr4cb *match_n4circ(int, int,uint8 *,uint8 *);
  179. struct nr4cb *new_n4circ(void);
  180. void nr4defaults(struct nr4cb *);
  181. int nr4valcb(struct nr4cb *);
  182. void nr_garbage(int red);
  183. /* In nr4.c: */
  184. void nr4input(struct nr4hdr *hdr,struct mbuf **bp);
  185. int nr4output(struct nr4cb *);
  186. void nr4sbuf(struct nr4cb *, unsigned);
  187. void nr4sframe(uint8 *, struct nr4hdr *, struct mbuf **);
  188. void nr4state(struct nr4cb *, int);
  189. /* In nr4timer.c */
  190. void nr4ackit(void *);
  191. void nr4cdtimeout(void *);
  192. void nr4txtimeout(void *);
  193. void nr4unchoke(void *);
  194. /* In nr4user.c: */
  195. void disc_nr4(struct nr4cb *);
  196. int kick_nr4(struct nr4cb *);
  197. struct nr4cb *open_nr4(struct nr4_addr *, struct nr4_addr *, int,
  198.   void (*)(struct nr4cb *,uint16),
  199.   void (*)(struct nr4cb *,uint16),
  200.   void (*)(struct nr4cb *,int,int),int);
  201. struct mbuf *recv_nr4(struct nr4cb *, uint16);
  202. void reset_nr4(struct nr4cb *);
  203. int send_nr4(struct nr4cb *, struct mbuf **);
  204. /* In nrcmd.c: */
  205. void nr4_state(struct nr4cb *, int, int);
  206. #endif /* _NR4_H */