xref: /csrg-svn/sys/netccitt/hdlc.h (revision 63216)
149266Sbostic /*-
241705Ssklower  * Copyright (c) University of British Columbia, 1984
3*63216Sbostic  * Copyright (c) 1991, 1993
4*63216Sbostic  *	The Regents of the University of California.  All rights reserved.
541705Ssklower  *
649266Sbostic  * This code is derived from software contributed to Berkeley by the
749266Sbostic  * Laboratory for Computation Vision and the Computer Science Department
841705Ssklower  * of the University of British Columbia.
941705Ssklower  *
1049266Sbostic  * %sccs.include.redist.c%
1141705Ssklower  *
12*63216Sbostic  *	@(#)hdlc.h	8.1 (Berkeley) 06/10/93
1341705Ssklower  */
1449266Sbostic 
1542382Ssklower #ifndef ORDER4
1641589Ssklower #define FALSE   0
1741589Ssklower #define TRUE    1
1841589Ssklower typedef u_char octet;
1942382Ssklower typedef char    bool;
2041589Ssklower 
2142382Ssklower /*
2242382Ssklower  *  HDLC Packet format definitions
2342382Ssklower  *  This will eventually have to be rewritten without reference
2442382Ssklower  *  to bit fields, to be compliant with ANSI C and alignment safe.
2542382Ssklower  */
2642382Ssklower 
2742382Ssklower #if BYTE_ORDER == BIG_ENDIAN
2842382Ssklower #define ORDER4(a, b, c, d) a , b , c , d
2942382Ssklower #define ORDER5(a, b, c, d, e) a , b , c , d , e
3042382Ssklower #endif
3142382Ssklower 
3242382Ssklower #if BYTE_ORDER == LITTLE_ENDIAN
3342382Ssklower #define ORDER4(a, b, c, d) d , c , b , a
3442382Ssklower #define ORDER5(a, b, c, d, e) e , d , c , b , a
3542382Ssklower #endif
3642382Ssklower #endif
3742382Ssklower 
3841589Ssklower #define MAX_INFO_LEN    4096+3+4
3941589Ssklower #define ADDRESS_A       3	/* B'00000011' */
4041589Ssklower #define ADDRESS_B       1	/* B'00000001' */
4141589Ssklower 
4241589Ssklower struct Hdlc_iframe {
4341589Ssklower 	octet	address;
4442382Ssklower 	octet	ORDER4(nr:3, pf:1, ns:3, hdlc_0:1);
4542382Ssklower 	octet    i_field[MAX_INFO_LEN];
4641589Ssklower };
4741589Ssklower 
4841589Ssklower struct Hdlc_sframe {
4941589Ssklower 	octet	address;
5042382Ssklower 	octet	ORDER4(nr:3, pf:1, s2:2, hdlc_01:2);
5141589Ssklower };
5241589Ssklower 
5341589Ssklower struct	Hdlc_uframe {
5441589Ssklower 	octet	address;
5542382Ssklower 	octet	ORDER4(m3:3, pf:1, m2:2, hdlc_11:2);
5641589Ssklower };
5741589Ssklower 
5841589Ssklower struct	Frmr_frame {
5941589Ssklower 	octet	address;
6041589Ssklower 	octet	control;
6141589Ssklower 	octet	frmr_control;
6242382Ssklower 	octet	ORDER4(frmr_nr:3, frmr_f1_0:1, frmr_ns:3, frmr_f2_0:1);
6342382Ssklower 	octet	ORDER5(frmr_0000:4, frmr_z:1, frmr_y:1, frmr_x:1, frmr_w:1);
6441589Ssklower };
6541589Ssklower 
6641589Ssklower #define HDHEADERLN	2
6741589Ssklower #define MINFRLN		2		/* Minimum frame length. */
6841589Ssklower 
6941589Ssklower struct	Hdlc_frame {
7041589Ssklower 	octet	address;
7141589Ssklower 	octet	control;
7242382Ssklower 	octet	info[3];	/* min for FRMR */
7341589Ssklower };
7441589Ssklower 
7541589Ssklower #define SABM_CONTROL 057	/* B'00101111' */
7641589Ssklower #define UA_CONTROL   0143	/* B'01100011' */
7741589Ssklower #define DISC_CONTROL 0103	/* B'01000011' */
7841589Ssklower #define DM_CONTROL   017	/* B'00001111' */
7941589Ssklower #define FRMR_CONTROL 0207	/* B'10000111' */
8041589Ssklower #define RR_CONTROL   01		/* B'00000001' */
8141589Ssklower #define RNR_CONTROL  05		/* B'00000101' */
8241589Ssklower #define REJ_CONTROL  011	/* B'00001001' */
8341589Ssklower 
8441589Ssklower #define POLLOFF  0
8541589Ssklower #define POLLON   1
8641589Ssklower 
8741589Ssklower /* Define Link State constants. */
8841589Ssklower 
8941589Ssklower #define INIT		0
9041589Ssklower #define DM_SENT		1
9141589Ssklower #define SABM_SENT	2
9241589Ssklower #define ABM		3
9341589Ssklower #define WAIT_SABM	4
9441589Ssklower #define WAIT_UA		5
9541589Ssklower #define DISC_SENT	6
9641589Ssklower #define DISCONNECTED	7
9741589Ssklower #define MAXSTATE	8
9841589Ssklower 
9941589Ssklower /* The following constants are used in a switch statement to process
10041589Ssklower    frames read from the communications line. */
10141589Ssklower 
10241589Ssklower #define SABM     0 * MAXSTATE
10341589Ssklower #define DM       1 * MAXSTATE
10441589Ssklower #define DISC     2 * MAXSTATE
10541589Ssklower #define UA       3 * MAXSTATE
10641589Ssklower #define FRMR     4 * MAXSTATE
10741589Ssklower #define RR       5 * MAXSTATE
10841589Ssklower #define RNR      6 * MAXSTATE
10941589Ssklower #define REJ      7 * MAXSTATE
11041589Ssklower #define IFRAME   8 * MAXSTATE
11141589Ssklower #define ILLEGAL  9 * MAXSTATE
11241589Ssklower 
11341589Ssklower #define T1	(3 * PR_SLOWHZ)		/*  IFRAME TIMEOUT - 3 seconds */
11441589Ssklower #define T3	(T1 / 2)		/*  RR generate timeout - 1.5 seconds */
11541589Ssklower #define N2	10
11641589Ssklower #define MODULUS 8
11741589Ssklower #define MAX_WINDOW_SIZE 7
11841589Ssklower 
11941589Ssklower #define Z  0
12041589Ssklower #define Y  1
12141589Ssklower #define X  2
12241589Ssklower #define W  3
12341589Ssklower #define A  4
12441589Ssklower 
12541589Ssklower #define TX 0
12641589Ssklower #define RX 1
12741589Ssklower 
12841589Ssklower bool	range_check ();
12941589Ssklower bool	valid_nr ();
13041589Ssklower struct	mbuf *hd_remove ();
131