/* Upper sub-layer (LAPB) definitions */

/* Control field templates */
#define	I	0x00	/* Information frames */
#define	S	0x01	/* Supervisory frames */
#define	RR	0x01	/* Receiver ready */
#define	RNR	0x05	/* Receiver not ready */
#define	REJ	0x09	/* Reject */
#define	U	0x03	/* Unnumbered frames */
#define	SABM	0x2f	/* Set Asynchronous Balanced Mode */
#define	DISC	0x43	/* Disconnect */
#define	DM	0x0f	/* Disconnected mode */
#define	UA	0x63	/* Unnumbered acknowledge */
#define	FRMR	0x87	/* Frame reject */
#define	UI	0x03	/* Unnumbered information */
#define	PF	0x10	/* Poll/final bit */

#define	MMASK	7	/* Mask for modulo-8 sequence numbers */

/* FRMR reason bits */
#define	W	1	/* Invalid control field */
#define	X	2	/* Unallowed I-field */
#define	Y	4	/* Too-long I-field */
#define	Z	8	/* Invalid sequence number */

/* Per-connection link control block
 * These are created and destroyed dynamically,
 * and are indexed through a hash table.
 * One exists for each logical AX.25 Level 2 connection
 */
struct ax25_cb {
	struct ax25_cb *next;		/* Doubly linked list pointers */
	struct ax25_cb *prev;

	struct mbuf *txq;		/* Transmit queue */
	struct mbuf *rxasm;		/* Receive reassembly buffer */
	struct mbuf *rxq;		/* Receive queue */

	struct ax25 addr;		/* Address header */

	struct interface *interface;	/* Associated interface */

	char rejsent;			/* REJ frame has been sent */
	char remotebusy;		/* Remote sent RNR */
	char waitack;			/* Wait for F-bit ack */
	char response;			/* Response owed to other end */

	char vs;			/* Our send state variable */
	char vr;			/* Our receive state variable */
	char unack;			/* Number of unacked frames */
	int maxframe;			/* Transmit flow control level */
	int16 paclen;			/* Maximum outbound packet size */
	int16 window;			/* Local flow control limit */
	char proto;			/* Protocol version */
#define	V1	0			/* AX.25 Version 1 */
#define	V2	1			/* AX.25 Version 2 */
	unsigned retries;		/* Retry counter */
	unsigned n2;			/* Retry limit */
	int state;			/* Link state */
#define	DISCONNECTED	0
#define	SETUP		1
#define	DISCPENDING	2
#define	CONNECTED	3
#define	FRAMEREJECT	4
	char frmrinfo[3];		/* I-field for FRMR message */
	struct timer t1;		/* Retry timer */
	struct timer t2;		/* Acknowledgement delay timer */
	struct timer t3;		/* Keep-alive poll timer */

	void (*r_upcall)();		/* Receiver upcall */
	void (*t_upcall)();		/* Transmit upcall */
	void (*s_upcall)();		/* State change upcall */
	char *user;			/* User pointer */
};
#define	NULLAX25	((struct ax25_cb *)0)
extern struct ax25_cb ax25default;
extern struct ax25_cb *ax25_cb[];
#define	NHASH	17

#define	YES	1
#define	NO	0
