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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Generic HDLC support routines for Linux
  3.  *
  4.  * Copyright (C) 1999, 2000 Krzysztof Halasa <khc@pm.waw.pl>
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  */
  11. #ifndef __HDLC_H
  12. #define __HDLC_H
  13. /* Ioctls - to be changed */
  14. #define HDLCGSLOTMAP (0x89F4) /* E1/T1 slot bitmap */
  15. #define HDLCGCLOCK (0x89F5) /* clock sources */
  16. #define HDLCGCLOCKRATE (0x89F6) /* clock rate */
  17. #define HDLCGMODE (0x89F7) /* internal to hdlc.c - protocol used */
  18. #define HDLCGLINE (0x89F8) /* physical interface */
  19. #define HDLCSSLOTMAP (0x89F9)
  20. #define HDLCSCLOCK (0x89FA)
  21. #define HDLCSCLOCKRATE (0x89FB)
  22. #define HDLCSMODE (0x89FC) /* internal to hdlc.c - select protocol */
  23. #define HDLCPVC (0x89FD) /* internal to hdlc.c - create/delete PVC */
  24. #define HDLCSLINE (0x89FE)
  25. #define HDLCRUN (0x89FF) /* Download firmware and run board */
  26. /* Modes */
  27. #define MODE_NONE 0x00000000 /* Not initialized */
  28. #define MODE_DCE 0x00000080 /* DCE */
  29. #define MODE_HDLC 0x00000100 /* Raw HDLC frames */
  30. #define MODE_CISCO 0x00000200
  31. #define MODE_PPP 0x00000400
  32. #define MODE_FR 0x00000800 /* Any LMI */
  33. #define MODE_FR_ANSI 0x00000801
  34. #define MODE_FR_CCITT 0x00000802
  35. #define MODE_X25 0x00001000
  36. #define MODE_MASK 0x0000FF00
  37. #define MODE_SOFT 0x80000000 /* Driver modes, using hardware HDLC */
  38. /* Lines */
  39. #define LINE_DEFAULT 0x00000000
  40. #define LINE_V35 0x00000001
  41. #define LINE_RS232 0x00000002
  42. #define LINE_X21 0x00000003
  43. #define LINE_T1 0x00000004
  44. #define LINE_E1 0x00000005
  45. #define LINE_MASK 0x000000FF
  46. #define LINE_LOOPBACK 0x80000000 /* On-card loopback */
  47. #define CLOCK_EXT 0 /* External TX and RX clock - DTE */
  48. #define CLOCK_INT 1 /* Internal TX and RX clock - DCE */
  49. #define CLOCK_TXINT 2 /* Internal TX and external RX clock */
  50. #define CLOCK_TXFROMRX 3 /* TX clock derived from external RX clock */
  51. #define HDLC_MAX_MTU 1500 /* Ethernet 1500 bytes */
  52. #define HDLC_MAX_MRU (HDLC_MAX_MTU + 10) /* max 10 bytes for FR */
  53. #ifdef __KERNEL__
  54. #include <linux/skbuff.h>
  55. #include <linux/netdevice.h>
  56. #include <net/syncppp.h>
  57. #define MAXLEN_LMISTAT  20 /* max size of status enquiry frame */
  58. #define LINK_STATE_RELIABLE 0x01
  59. #define LINK_STATE_REQUEST  0x02 /* full stat sent (DCE) / req pending (DTE) */
  60. #define LINK_STATE_CHANGED  0x04 /* change in PVCs state, send full report */
  61. #define LINK_STATE_FULLREP_SENT 0x08 /* full report sent */
  62. #define PVC_STATE_NEW       0x01
  63. #define PVC_STATE_ACTIVE    0x02
  64. #define PVC_STATE_FECN     0x08 /* FECN condition */
  65. #define PVC_STATE_BECN      0x10 /* BECN condition */
  66. #define FR_UI              0x03
  67. #define FR_PAD             0x00
  68. #define NLPID_IP           0xCC
  69. #define NLPID_IPV6         0x8E
  70. #define NLPID_SNAP         0x80
  71. #define NLPID_PAD          0x00
  72. #define NLPID_Q933         0x08
  73. #define LMI_DLCI                   0 /* LMI DLCI */
  74. #define LMI_PROTO               0x08
  75. #define LMI_CALLREF             0x00 /* Call Reference */
  76. #define LMI_ANSI_LOCKSHIFT      0x95 /* ANSI lockshift */
  77. #define LMI_REPTYPE                1 /* report type */
  78. #define LMI_CCITT_REPTYPE       0x51
  79. #define LMI_ALIVE                  3 /* keep alive */
  80. #define LMI_CCITT_ALIVE         0x53
  81. #define LMI_PVCSTAT                7 /* pvc status */
  82. #define LMI_CCITT_PVCSTAT       0x57
  83. #define LMI_FULLREP                0 /* full report  */
  84. #define LMI_INTEGRITY              1 /* link integrity report */
  85. #define LMI_SINGLE                 2 /* single pvc report */
  86. #define LMI_STATUS_ENQUIRY      0x75
  87. #define LMI_STATUS              0x7D /* reply */
  88. #define LMI_REPT_LEN               1 /* report type element length */
  89. #define LMI_INTEG_LEN              2 /* link integrity element length */
  90. #define LMI_LENGTH                13 /* standard LMI frame length */
  91. #define LMI_ANSI_LENGTH           14
  92. typedef struct {
  93. unsigned ea1  : 1;
  94. unsigned cr   : 1;
  95. unsigned dlcih: 6;
  96.   
  97. unsigned ea2  : 1;
  98. unsigned de   : 1;
  99. unsigned becn : 1;
  100. unsigned fecn : 1;
  101. unsigned dlcil: 4;
  102. }__attribute__ ((packed)) fr_hdr;
  103. typedef struct { /* Used in Cisco and PPP mode */
  104. u8 address;
  105. u8 control;
  106. u16 protocol;
  107. }__attribute__ ((packed)) hdlc_header;
  108. typedef struct {
  109. u32 type; /* code */
  110. u32 par1;
  111. u32 par2;
  112. u16 rel; /* reliability */
  113. u32 time;
  114. }__attribute__ ((packed)) cisco_packet;
  115. #define CISCO_PACKET_LEN 18
  116. #define CISCO_BIG_PACKET_LEN 20
  117. typedef struct pvc_device_struct {
  118. struct net_device netdev; /* PVC net device - must be first */
  119. struct net_device_stats stats;
  120. struct hdlc_device_struct *master;
  121. struct pvc_device_struct *next;
  122. u8 state;
  123. u8 newstate;
  124. }pvc_device;
  125. typedef struct {
  126. u32 last_errors; /* last errors bit list */
  127. int last_poll; /* ! */
  128. u8 T391; /* ! link integrity verification polling timer */
  129. u8 T392; /* ! polling verification timer */
  130. u8 N391; /* full status polling counter */
  131. u8 N392; /* error threshold */
  132. u8 N393; /* monitored events count */
  133. u8 N391cnt;
  134. u8 state; /* ! */
  135. u32 txseq; /* ! TX sequence number - Cisco uses 4 bytes */
  136. u32 rxseq; /* ! RX sequence number */
  137. }fr_lmi; /* ! means used in Cisco HDLC as well */
  138. typedef struct hdlc_device_struct {
  139. /* to be initialized by hardware driver: */
  140. struct net_device netdev; /* master net device - must be first */
  141. struct net_device_stats stats;
  142. struct ppp_device pppdev;
  143. struct ppp_device *syncppp_ptr;
  144. /* set_mode may be NULL if HDLC-only board */
  145. int (*set_mode)(struct hdlc_device_struct *hdlc, int mode);
  146. int (*open)(struct hdlc_device_struct *hdlc);
  147. void (*close)(struct hdlc_device_struct *hdlc);
  148. int (*xmit)(struct hdlc_device_struct *hdlc, struct sk_buff *skb);
  149. int (*ioctl)(struct hdlc_device_struct *hdlc, struct ifreq *ifr,
  150.      int cmd);
  151.   
  152. /* Only in "hardware" FR modes etc. - may be NULL */
  153. int (*create_pvc)(pvc_device *pvc);
  154. void (*destroy_pvc)(pvc_device *pvc);
  155. int (*open_pvc)(pvc_device *pvc);
  156. void (*close_pvc)(pvc_device *pvc);
  157. /* for hdlc.c internal use only */
  158. pvc_device *first_pvc;
  159. u16 pvc_count;
  160. int mode;
  161. struct timer_list timer;
  162. fr_lmi lmi;
  163. }hdlc_device;
  164. int register_hdlc_device(hdlc_device *hdlc);
  165. void unregister_hdlc_device(hdlc_device *hdlc);
  166. void hdlc_netif_rx(hdlc_device *hdlc, struct sk_buff *skb);
  167. static __inline__ struct net_device* hdlc_to_dev(hdlc_device *hdlc)
  168. {
  169. return &hdlc->netdev;
  170. }
  171. static __inline__ hdlc_device* dev_to_hdlc(struct net_device *dev)
  172. {
  173. return (hdlc_device*)dev;
  174. }
  175. static __inline__ struct net_device* pvc_to_dev(pvc_device *pvc)
  176. {
  177. return &pvc->netdev;
  178. }
  179. static __inline__ pvc_device* dev_to_pvc(struct net_device *dev)
  180. {
  181. return (pvc_device*)dev;
  182. }
  183. static __inline__ const char *hdlc_to_name(hdlc_device *hdlc)
  184. {
  185. return hdlc_to_dev(hdlc)->name;
  186. }
  187. static __inline__ const char *pvc_to_name(pvc_device *pvc)
  188. {
  189. return pvc_to_dev(pvc)->name;
  190. }
  191. static __inline__ u16 status_to_dlci(hdlc_device *hdlc, u8 *status, u8 *state)
  192. {
  193. *state &= ~(PVC_STATE_ACTIVE | PVC_STATE_NEW);
  194. if (status[2] & 0x08)
  195. *state |= PVC_STATE_NEW;
  196. else if (status[2] & 0x02)
  197. *state |= PVC_STATE_ACTIVE;
  198. return ((status[0] & 0x3F)<<4) | ((status[1] & 0x78)>>3);
  199. }
  200. static __inline__ void dlci_to_status(hdlc_device *hdlc, u16 dlci, u8 *status,
  201.       u8 state)
  202. {
  203. status[0] = (dlci>>4) & 0x3F;
  204. status[1] = ((dlci<<3) & 0x78) | 0x80;
  205. status[2] = 0x80;
  206. if (state & PVC_STATE_NEW)
  207. status[2] |= 0x08;
  208. else if (state & PVC_STATE_ACTIVE)
  209. status[2] |= 0x02;
  210. }
  211. static __inline__ u16 netdev_dlci(struct net_device *dev)
  212. {
  213. return ntohs(*(u16*)dev->dev_addr);
  214. }
  215. static __inline__ u16 q922_to_dlci(u8 *hdr)
  216. {
  217. return ((hdr[0] & 0xFC)<<2) | ((hdr[1] & 0xF0)>>4);
  218. }
  219. static __inline__ void dlci_to_q922(u8 *hdr, u16 dlci)
  220. {
  221. hdr[0] = (dlci>>2) & 0xFC;
  222. hdr[1] = ((dlci<<4) & 0xF0) | 0x01;
  223. }
  224. static __inline__ int mode_is(hdlc_device *hdlc, int mask)
  225. {
  226. return (hdlc->mode & mask) == mask;
  227. }
  228. static __inline__ pvc_device* find_pvc(hdlc_device *hdlc, u16 dlci)
  229. {
  230. pvc_device *pvc=hdlc->first_pvc;
  231. while (pvc) {
  232. if (netdev_dlci(&pvc->netdev) == dlci)
  233. return pvc;
  234. pvc=pvc->next;
  235. }
  236. return NULL;
  237. }
  238. static __inline__ void debug_frame(const struct sk_buff *skb)
  239. {
  240. int i;
  241. for (i=0; i<skb->len; i++) {
  242. if (i == 100) {
  243. printk("...n");
  244. return;
  245. }
  246. printk(" %02X", skb->data[i]);
  247. }
  248. printk("n");
  249. }
  250. #endif /* __KERNEL */
  251. #endif /* __HDLC_H */