1 /* if_ether.h needed for definition of ETH_DATA_LEN and ETH_ALEN
2  */
3 #include "linux/if_ether.h"
4 
5 /* frame layout based on par3.2 "LLC PDU format"
6  */
7 typedef union {			/* pdu layout from pages 40 & 44 */
8     struct {			/* general header, all pdu types */
9 	unsigned dsap : 8;	/* dest service access point */
10 	unsigned ssap : 8;	/* source service access point */
11 	unsigned f1 : 1;	/* I- U- or S- format id bits */
12 	unsigned f2 : 1;
13 	unsigned : 6;
14 	unsigned : 8;
15    } pdu_hdr;
16    struct {
17         char dummy1[2];   	/* dsap + ssap */
18 	char byte1;
19 	char byte2;
20    } pdu_cntl;			/* unformatted control bytes */
21    struct {			/* header of an Information pdu */
22 	unsigned char dummy2[2];
23 	unsigned : 1;
24 	unsigned ns : 7;
25 	unsigned i_pflag : 1;   /* poll/final bit */
26 	unsigned nr : 7;	/* N(R)  */
27 	unsigned char is_info[ ETH_DATA_LEN ];
28    }  i_hdr;
29    struct {			/* header of a Supervisory pdu */
30  	unsigned char dummy3[2];
31 	unsigned : 2;
32 	unsigned ss : 2;	/* supervisory function bits */
33 	unsigned : 4;
34 	unsigned s_pflag : 1;   /* poll/final bit  */
35 	unsigned nr : 7;	/* N(R)  */
36    } s_hdr;
37 
38 /* when accessing the P/F bit or the N(R) field there's no need to distinguish
39    I pdus from S pdus i_pflag and s_pflag / i_nr and s_nr map to the same
40    physical location.
41  */
42    struct {			/* header of an Unnumbered pdu */
43 	unsigned char dummy4[2];
44 	unsigned : 2;
45 	unsigned mm1 : 2;	/* modifier function part1 */
46 	unsigned u_pflag : 1;    /* P/F for U- pdus */
47 	unsigned mm2 : 3;	/* modifier function part2 */
48 	unsigned char u_info[ ETH_DATA_LEN-1];
49    } u_hdr;
50    struct {			/* mm field in an Unnumbered pdu */
51 	unsigned char dummy5[2];
52 	unsigned : 2;
53 	unsigned mm : 6;	/* must be masked to get ridd of P/F !  */
54    } u_mm;
55 
56 } frame_type, *frameptr;
57 
58 /* frame format test macros: */
59 
60 #define IS_UFRAME( fr ) ( ( (fr)->pdu_hdr.f1) & ( (fr)->pdu_hdr.f2) )
61 
62 #define IS_IFRAME( fr ) ( !( (fr)->pdu_hdr.f1) )
63 
64 #define IS_SFRAME( fr ) ( ( (fr)->pdu_hdr.f1) & !( (fr)->pdu_hdr.f2) )
65 
66 #define IS_RSP( fr ) ( fr->pdu_hdr.ssap & 0x01 )
67 
68 
69 /* The transition table, the _encode tables and some tests in the
70    source code depend on the numeric order of these values.
71    Think twice before changing.
72  */
73 
74 /* frame names for TYPE 2 operation: */
75 #define I_CMD		0
76 #define RR_CMD		1
77 #define RNR_CMD		2
78 #define REJ_CMD		3
79 #define DISC_CMD	4
80 #define SABME_CMD	5
81 #define I_RSP		6
82 #define RR_RSP		7
83 #define RNR_RSP		8
84 #define REJ_RSP		9
85 #define UA_RSP		10
86 #define DM_RSP		11
87 #define FRMR_RSP	12
88 
89 /* junk frame name: */
90 #define BAD_FRAME	13
91 #define NO_FRAME	13
92 
93 /* frame names for TYPE 1 operation: */
94 #define UI_CMD		14
95 #define XID_CMD		15
96 #define TEST_CMD	16
97 #define XID_RSP		17
98 #define TEST_RSP	18
99