/* nr4.h: defines for netrom layer 4 (transport) support. * Copyright 1989 by Daniel M. Frank, W9NK. Permission granted for * non-commercial distribution only. */ /* compile-time limitations */ #define NR4MAXCIRC 20 /* maximum number of open circuits */ #define NR4MAXWIN 127 /* maximum window size, send and receive */ /* protocol limitation: */ #define NR4MAXINFO 236 /* maximum data in an info packet */ /* sequence number wraparound mask */ #define NR4SEQMASK 0xff /* eight-bit sequence numbers */ /* flags in high nybble of opcode byte */ #define NR4CHOKE 0x80 #define NR4NAK 0x40 #define NR4MORE 0x20 /* The "more follows" flag for */ /* pointless packet reassembly */ /* mask for opcode nybble */ #define NR4OPCODE 0x0f /* opcodes */ #define NR4OPPID 0 /* protocol ID extension to network layer */ #define NR4OPCONRQ 1 /* connect request */ #define NR4OPCONAK 2 /* connect acknowledge */ #define NR4OPDISRQ 3 /* disconnect request */ #define NR4OPDISAK 4 /* disconnect acknowledge */ #define NR4OPINFO 5 /* information packet */ #define NR4OPACK 6 /* information ACK */ #define NR4NUMOPS 7 /* number of transport opcodes */ /* minimum length of NET/ROM transport header */ #define NR4MINHDR 5 /* host format net/rom transport header */ struct nr4hdr { unsigned char opcode ; /* opcode and flags */ unsigned char yourindex ; /* receipient's circuit index */ unsigned char yourid ; /* receipient's circuit ID */ union { struct { /* network extension */ unsigned char family ; /* protocol family */ unsigned char proto ; /* protocol within family */ } pid ; struct { /* connect request */ unsigned char myindex ; /* sender's circuit index */ unsigned char myid ; /* sender's circuit ID */ unsigned char window ; /* sender's proposed window size */ struct ax25_addr user ; /* callsign of originating user */ struct ax25_addr node ; /* callsign of originating node */ } conreq ; struct { /* connect acknowledge */ unsigned char myindex ; /* sender's circuit index */ unsigned char myid ; /* sender's circuit ID */ unsigned char window ; /* accepted window size */ } conack ; struct { /* information */ unsigned char txseq ; /* sender's tx sequence number */ unsigned char rxseq ; /* sender's rx sequence number */ } info ; struct { /* information acknowledge */ unsigned char rxseq ; /* sender's rx sequence number */ } ack ; } u ; /* End of union */ } ; /* The netrom circuit pointer structure */ struct nr4circp { unsigned char cid ; /* circuit ID; incremented each time*/ /* this circuit is used */ struct nr4cb *ccb ; /* pointer to circuit control block, */ /* NULLNR4CB if not in use */ } ; /* The circuit table: */ extern struct nr4circp Nr4circuits[NR4MAXCIRC] ; /* A netrom send buffer structure */ struct nr4txbuf { struct timer tretry ; /* retry timer */ unsigned retries ; /* number of retries */ struct mbuf *data ; /* data sent but not acknowledged */ } ; /* A netrom receive buffer structure */ struct nr4rxbuf { unsigned char occupied ; /* flag: buffer in use */ struct mbuf *data ; /* data received out of sequence */ } ; /* The netrom circuit control block */ struct nr4cb { unsigned mynum ; /* my circuit number */ unsigned myid ; /* my circuit ID */ unsigned yournum ; /* remote circuit number */ unsigned yourid ; /* remote circuit ID */ struct ax25_addr user ; /* callsign of originating user (if any) */ struct ax25_addr node ; /* callsign of remote node */ struct ax25_addr luser ; /* callsign of local "user", for connections */ /* that we initiate */ unsigned window ; /* negotiated window size */ /* Data for round trip timer calculation and setting */ long srtt ; /* Smoothed round trip time */ long mdev ; /* Mean deviation in round trip time */ unsigned blevel ; /* Backoff level */ unsigned txmax ; /* The maximum number of retries among */ /* the frames in the window. This is 0 */ /* if there are no frames in the window. */ /* It is used as a baseline to determine */ /* when to increment the backoff level. */ /* flags */ char choked ; /* choke received from remote */ char qfull ; /* receive queue is full, and we have */ /* choked the other end */ char naksent ; /* a NAK has already been sent */ /* transmit buffers and window variables */ struct nr4txbuf *txbufs ; /* pointer to array[windowsize] of bufs */ unsigned char nextosend ; /* sequence # of next frame to send */ unsigned char ackxpected ; /* sequence number of next expected ACK */ unsigned nbuffered ; /* number of buffered TX frames */ struct mbuf *txq ; /* queue of unsent data */ /* receive buffers and window variables */ struct nr4rxbuf *rxbufs ; /* pointer to array[windowsize] of bufs */ unsigned char rxpected ; /* # of next receive frame expected */ unsigned char rxpastwin ; /* top of RX window + 1 */ struct mbuf *rxq ; /* "fully" received data queue */ /* Connection state */ int state ; /* connection state */ #define NR4STDISC 0 /* disconnected */ #define NR4STCPEND 1 /* connection pending */ #define NR4STCON 2 /* connected */ #define NR4STDPEND 3 /* disconnect requested locally */ int dreason ; /* Reason for disconnect */ #define NR4RNORMAL 0 /* Normal, requested disconnect */ #define NR4RREMOTE 1 /* Remote requested */ #define NR4RTIMEOUT 2 /* Connection timed out */ #define NR4RRESET 3 /* Connection reset locally */ #define NR4RREFUSED 4 /* Connect request refused */ /* Per-connection timers */ struct timer tchoke ; /* choke timeout */ struct timer tack ; /* ack delay timer */ struct timer tcd ; /* connect/disconnect timer */ unsigned cdtries ; /* Number of connect/disconnect tries */ void (*r_upcall)() ; /* receive upcall */ void (*t_upcall)() ; /* transmit upcall */ void (*s_upcall)() ; /* state change upcall */ char *puser ; /* user pointer */ } ; #define NULLNR4CB (struct nr4cb *)0 /* Some globals */ extern unsigned Nr4window ; /* The advertised window size, in frames */ extern long Nr4irtt ; /* The initial round trip time */ extern unsigned Nr4retries ; /* The number of times to retry */ extern long Nr4acktime ; /* How long to wait until ACK'ing */ extern char *Nr4states[] ; /* NET/ROM state names */ extern char *Nr4reasons[] ; /* Disconnect reason names */ extern unsigned Nr4qlimit ; /* max receive queue length before CHOKE */ extern long Nr4choketime ; /* CHOKEd state timeout */ #if UNIX || ATARI_ST /* function definitions */ /* In nr4subr.c: */ extern int ntohnr4() ; extern struct mbuf *htonnr4() ; extern struct nr4cb *new_n4circ() ; extern int init_nr4window() ; extern void free_n4circ() ; extern struct nr4cb *match_n4circ() ; extern struct nr4cb *get_n4circ() ; extern int nr4between() ; extern void nr4defaults() ; extern int nr4valcb() ; /* In nr4.c: */ extern void nr4sframe() ; extern void nr4rframe() ; extern void nr4sbuf() ; extern void nr4ackours() ; extern void nr4gotnak() ; extern int nr4output() ; extern void nr4state() ; extern void nr4choke() ; /* In nr4timer.c */ extern void nr4txtimeout() ; extern void nr4ackit() ; extern void nr4cdtimeout() ; extern void nr4unchoke() ; /* In nr4user.c: */ extern struct nr4cb *open_nr4() ; extern int send_nr4() ; extern struct mbuf *recv_nr4() ; extern void disc_nr4() ; extern void reset_nr4() ; extern int kick_nr4() ; /* In nrcmd.c: */ extern void nr4_state() ; extern void nr4_parse() ; extern void nr4_incom() ; extern void nr4_rx() ; extern void nr4_tx() ; #else /* function definitions */ /* In nr4subr.c: */ extern int ntohnr4(struct nr4hdr *, struct mbuf **) ; extern struct mbuf *htonnr4(struct nr4hdr *) ; extern struct nr4cb *new_n4circ() ; extern int init_nr4window(struct nr4cb *, unsigned) ; extern void free_n4circ(struct nr4cb *) ; extern struct nr4cb *match_n4circ(int, int, struct ax25_addr *, struct ax25_addr *) ; extern struct nr4cb *get_n4circ(int, int) ; extern int nr4between(unsigned, unsigned, unsigned) ; extern void nr4defaults(struct nr4cb *) ; extern int nr4valcb(struct nr4cb *) ; /* In nr4.c: */ extern void nr4sframe(struct ax25_addr *, struct nr4hdr *, struct mbuf *) ; extern void nr4rframe(struct nr4cb *, unsigned, struct mbuf *) ; extern void nr4sbuf(struct nr4cb *, unsigned) ; extern void nr4ackours(struct nr4cb *, unsigned, int) ; extern void nr4gotnak(struct nr4cb *, unsigned) ; extern int nr4output(struct nr4cb *) ; extern void nr4state(struct nr4cb *, int) ; extern void nr4choke(struct nr4cb *) ; /* In nr4timer.c */ extern void nr4txtimeout(char *) ; extern void nr4ackit(char *) ; extern void nr4cdtimeout(char *) ; extern void nr4unchoke(char *) ; /* In nr4user.c: */ extern struct nr4cb *open_nr4(struct ax25_addr *, struct ax25_addr *, void (*)(), void (*)(), void (*)(), char *) ; extern int send_nr4(struct nr4cb *, struct mbuf *) ; extern struct mbuf *recv_nr4(struct nr4cb *, int16) ; extern void disc_nr4(struct nr4cb *) ; extern void reset_nr4(struct nr4cb *) ; extern int kick_nr4(struct nr4cb *) ; /* In nrcmd.c: */ extern void nr4_state(struct nr4cb *, int, int) ; extern void nr4_parse(char *, int16) ; extern void nr4_incom(struct nr4cb *, int, int) ; extern void nr4_rx(struct nr4cb *, int16) ; extern void nr4_tx(struct nr4cb *, int16) ; #endif