File: /usr/src/linux/include/net/llc_frame.h

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