home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 3 / hamradioversion3.0examsandprograms1992.iso / misc / 9q920411 / nr4.h < prev    next >
C/C++ Source or Header  |  1991-03-16  |  9KB  |  273 lines

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