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