2 * Generic HDLC support routines for Linux
4 * Copyright (C) 1999-2005 Krzysztof Halasa <khc@pm.waw.pl>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of version 2 of the GNU General Public License
8 * as published by the Free Software Foundation.
14 #define GENERIC_HDLC_VERSION 4 /* For synchronization with sethdlc utility */
16 #define CLOCK_DEFAULT 0 /* Default setting */
17 #define CLOCK_EXT 1 /* External TX and RX clock - DTE */
18 #define CLOCK_INT 2 /* Internal TX and RX clock - DCE */
19 #define CLOCK_TXINT 3 /* Internal TX and external RX clock */
20 #define CLOCK_TXFROMRX 4 /* TX clock derived from external RX clock */
23 #define ENCODING_DEFAULT 0 /* Default setting */
24 #define ENCODING_NRZ 1
25 #define ENCODING_NRZI 2
26 #define ENCODING_FM_MARK 3
27 #define ENCODING_FM_SPACE 4
28 #define ENCODING_MANCHESTER 5
31 #define PARITY_DEFAULT 0 /* Default setting */
32 #define PARITY_NONE 1 /* No parity */
33 #define PARITY_CRC16_PR0 2 /* CRC16, initial value 0x0000 */
34 #define PARITY_CRC16_PR1 3 /* CRC16, initial value 0xFFFF */
35 #define PARITY_CRC16_PR0_CCITT 4 /* CRC16, initial 0x0000, ITU-T version */
36 #define PARITY_CRC16_PR1_CCITT 5 /* CRC16, initial 0xFFFF, ITU-T version */
37 #define PARITY_CRC32_PR0_CCITT 6 /* CRC32, initial value 0x00000000 */
38 #define PARITY_CRC32_PR1_CCITT 7 /* CRC32, initial value 0xFFFFFFFF */
40 #define LMI_DEFAULT 0 /* Default setting */
41 #define LMI_NONE 1 /* No LMI, all PVCs are static */
42 #define LMI_ANSI 2 /* ANSI Annex D */
43 #define LMI_CCITT 3 /* ITU-T Annex A */
44 #define LMI_CISCO 4 /* The "original" LMI, aka Gang of Four */
46 #define HDLC_MAX_MTU 1500 /* Ethernet 1500 bytes */
47 #define HDLC_MAX_MRU (HDLC_MAX_MTU + 10 + 14 + 4) /* for ETH+VLAN over FR */
52 #include <linux/skbuff.h>
53 #include <linux/netdevice.h>
54 #include <net/syncppp.h>
55 #include <linux/hdlc/ioctl.h>
58 typedef struct { /* Used in Cisco and PPP mode */
62 }__attribute__ ((packed
)) hdlc_header
;
70 u16 rel
; /* reliability */
72 }__attribute__ ((packed
)) cisco_packet
;
73 #define CISCO_PACKET_LEN 18
74 #define CISCO_BIG_PACKET_LEN 20
78 typedef struct pvc_device_struct
{
79 struct net_device
*master
;
80 struct net_device
*main
;
81 struct net_device
*ether
; /* bridged Ethernet interface */
82 struct pvc_device_struct
*next
; /* Sorted in ascending DLCI order */
88 unsigned int active
: 1;
89 unsigned int exist
: 1;
90 unsigned int deleted
: 1;
93 unsigned int bandwidth
; /* Cisco LMI reporting only */
99 typedef struct hdlc_device_struct
{
100 /* To be initialized by hardware driver */
101 struct net_device_stats stats
;
103 /* used by HDLC layer to take control over HDLC device from hw driver*/
104 int (*attach
)(struct net_device
*dev
,
105 unsigned short encoding
, unsigned short parity
);
107 /* hardware driver must handle this instead of dev->hard_start_xmit */
108 int (*xmit
)(struct sk_buff
*skb
, struct net_device
*dev
);
111 /* Things below are for HDLC layer internal use only */
113 int (*open
)(struct net_device
*dev
);
114 void (*close
)(struct net_device
*dev
);
117 void (*start
)(struct net_device
*dev
);
119 void (*stop
)(struct net_device
*dev
);
121 void (*detach
)(struct hdlc_device_struct
*hdlc
);
122 int (*netif_rx
)(struct sk_buff
*skb
);
123 unsigned short (*type_trans
)(struct sk_buff
*skb
,
124 struct net_device
*dev
);
125 int id
; /* IF_PROTO_HDLC/CISCO/FR/etc. */
130 spinlock_t state_lock
;
135 pvc_device
*first_pvc
;
138 struct timer_list timer
;
139 unsigned long last_poll
;
144 u32 last_errors
; /* last errors bit list */
146 u8 txseq
; /* TX sequence number */
147 u8 rxseq
; /* RX sequence number */
151 cisco_proto settings
;
153 struct timer_list timer
;
154 unsigned long last_poll
;
157 u32 txseq
; /* TX sequence number */
158 u32 rxseq
; /* RX sequence number */
162 raw_hdlc_proto settings
;
166 struct ppp_device pppdev
;
167 struct ppp_device
*syncppp_ptr
;
168 int (*old_change_mtu
)(struct net_device
*dev
,
177 int hdlc_raw_ioctl(struct net_device
*dev
, struct ifreq
*ifr
);
178 int hdlc_raw_eth_ioctl(struct net_device
*dev
, struct ifreq
*ifr
);
179 int hdlc_cisco_ioctl(struct net_device
*dev
, struct ifreq
*ifr
);
180 int hdlc_ppp_ioctl(struct net_device
*dev
, struct ifreq
*ifr
);
181 int hdlc_fr_ioctl(struct net_device
*dev
, struct ifreq
*ifr
);
182 int hdlc_x25_ioctl(struct net_device
*dev
, struct ifreq
*ifr
);
185 /* Exported from hdlc.o */
187 /* Called by hardware driver when a user requests HDLC service */
188 int hdlc_ioctl(struct net_device
*dev
, struct ifreq
*ifr
, int cmd
);
190 /* Must be used by hardware driver on module startup/exit */
191 int register_hdlc_device(struct net_device
*dev
);
192 void unregister_hdlc_device(struct net_device
*dev
);
194 struct net_device
*alloc_hdlcdev(void *priv
);
196 static __inline__ hdlc_device
* dev_to_hdlc(struct net_device
*dev
)
198 return netdev_priv(dev
);
202 static __inline__ pvc_device
* dev_to_pvc(struct net_device
*dev
)
204 return (pvc_device
*)dev
->priv
;
208 static __inline__
void debug_frame(const struct sk_buff
*skb
)
212 for (i
=0; i
< skb
->len
; i
++) {
217 printk(" %02X", skb
->data
[i
]);
223 /* Must be called by hardware driver when HDLC device is being opened */
224 int hdlc_open(struct net_device
*dev
);
225 /* Must be called by hardware driver when HDLC device is being closed */
226 void hdlc_close(struct net_device
*dev
);
227 /* Called by hardware driver when DCD line level changes */
228 void hdlc_set_carrier(int on
, struct net_device
*dev
);
230 /* May be used by hardware driver to gain control over HDLC device */
231 static __inline__
void hdlc_proto_detach(hdlc_device
*hdlc
)
233 if (hdlc
->proto
.detach
)
234 hdlc
->proto
.detach(hdlc
);
235 hdlc
->proto
.detach
= NULL
;
239 static __inline__
struct net_device_stats
*hdlc_stats(struct net_device
*dev
)
241 return &dev_to_hdlc(dev
)->stats
;
245 static __inline__
unsigned short hdlc_type_trans(struct sk_buff
*skb
,
246 struct net_device
*dev
)
248 hdlc_device
*hdlc
= dev_to_hdlc(dev
);
250 skb
->mac
.raw
= skb
->data
;
253 if (hdlc
->proto
.type_trans
)
254 return hdlc
->proto
.type_trans(skb
, dev
);
256 return htons(ETH_P_HDLC
);
259 #endif /* __KERNEL */
260 #endif /* __HDLC_H */