llc_frame.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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