diff options
-rw-r--r-- | drivers/net/wan/hdlc.c | 24 | ||||
-rw-r--r-- | drivers/net/wan/hdlc_cisco.c | 5 | ||||
-rw-r--r-- | drivers/net/wan/hdlc_fr.c | 7 | ||||
-rw-r--r-- | drivers/net/wan/hdlc_ppp.c | 2 | ||||
-rw-r--r-- | drivers/net/wan/hdlc_raw.c | 2 | ||||
-rw-r--r-- | drivers/net/wan/hdlc_raw_eth.c | 2 | ||||
-rw-r--r-- | drivers/net/wan/hdlc_x25.c | 10 | ||||
-rw-r--r-- | include/linux/hdlc.h | 25 |
8 files changed, 31 insertions, 46 deletions
diff --git a/drivers/net/wan/hdlc.c b/drivers/net/wan/hdlc.c index d553e6f32851..39951d0c34d6 100644 --- a/drivers/net/wan/hdlc.c +++ b/drivers/net/wan/hdlc.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Generic HDLC support routines for Linux | 2 | * Generic HDLC support routines for Linux |
3 | * | 3 | * |
4 | * Copyright (C) 1999 - 2006 Krzysztof Halasa <khc@pm.waw.pl> | 4 | * Copyright (C) 1999 - 2008 Krzysztof Halasa <khc@pm.waw.pl> |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 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 | 7 | * under the terms of version 2 of the GNU General Public License |
@@ -39,7 +39,7 @@ | |||
39 | #include <net/net_namespace.h> | 39 | #include <net/net_namespace.h> |
40 | 40 | ||
41 | 41 | ||
42 | static const char* version = "HDLC support module revision 1.21"; | 42 | static const char* version = "HDLC support module revision 1.22"; |
43 | 43 | ||
44 | #undef DEBUG_LINK | 44 | #undef DEBUG_LINK |
45 | 45 | ||
@@ -66,19 +66,15 @@ static struct net_device_stats *hdlc_get_stats(struct net_device *dev) | |||
66 | static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev, | 66 | static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev, |
67 | struct packet_type *p, struct net_device *orig_dev) | 67 | struct packet_type *p, struct net_device *orig_dev) |
68 | { | 68 | { |
69 | struct hdlc_device_desc *desc = dev_to_desc(dev); | 69 | struct hdlc_device *hdlc = dev_to_hdlc(dev); |
70 | 70 | ||
71 | if (dev->nd_net != &init_net) { | 71 | if (dev->nd_net != &init_net) { |
72 | kfree_skb(skb); | 72 | kfree_skb(skb); |
73 | return 0; | 73 | return 0; |
74 | } | 74 | } |
75 | 75 | ||
76 | if (desc->netif_rx) | 76 | BUG_ON(!hdlc->proto->netif_rx); |
77 | return desc->netif_rx(skb); | 77 | return hdlc->proto->netif_rx(skb); |
78 | |||
79 | desc->stats.rx_dropped++; /* Shouldn't happen */ | ||
80 | dev_kfree_skb(skb); | ||
81 | return NET_RX_DROP; | ||
82 | } | 78 | } |
83 | 79 | ||
84 | 80 | ||
@@ -87,7 +83,7 @@ static inline void hdlc_proto_start(struct net_device *dev) | |||
87 | { | 83 | { |
88 | hdlc_device *hdlc = dev_to_hdlc(dev); | 84 | hdlc_device *hdlc = dev_to_hdlc(dev); |
89 | if (hdlc->proto->start) | 85 | if (hdlc->proto->start) |
90 | return hdlc->proto->start(dev); | 86 | hdlc->proto->start(dev); |
91 | } | 87 | } |
92 | 88 | ||
93 | 89 | ||
@@ -96,7 +92,7 @@ static inline void hdlc_proto_stop(struct net_device *dev) | |||
96 | { | 92 | { |
97 | hdlc_device *hdlc = dev_to_hdlc(dev); | 93 | hdlc_device *hdlc = dev_to_hdlc(dev); |
98 | if (hdlc->proto->stop) | 94 | if (hdlc->proto->stop) |
99 | return hdlc->proto->stop(dev); | 95 | hdlc->proto->stop(dev); |
100 | } | 96 | } |
101 | 97 | ||
102 | 98 | ||
@@ -263,8 +259,7 @@ static void hdlc_setup(struct net_device *dev) | |||
263 | struct net_device *alloc_hdlcdev(void *priv) | 259 | struct net_device *alloc_hdlcdev(void *priv) |
264 | { | 260 | { |
265 | struct net_device *dev; | 261 | struct net_device *dev; |
266 | dev = alloc_netdev(sizeof(struct hdlc_device_desc) + | 262 | dev = alloc_netdev(sizeof(struct hdlc_device), "hdlc%d", hdlc_setup); |
267 | sizeof(hdlc_device), "hdlc%d", hdlc_setup); | ||
268 | if (dev) | 263 | if (dev) |
269 | dev_to_hdlc(dev)->priv = priv; | 264 | dev_to_hdlc(dev)->priv = priv; |
270 | return dev; | 265 | return dev; |
@@ -281,7 +276,7 @@ void unregister_hdlc_device(struct net_device *dev) | |||
281 | 276 | ||
282 | 277 | ||
283 | int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto, | 278 | int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto, |
284 | int (*rx)(struct sk_buff *skb), size_t size) | 279 | size_t size) |
285 | { | 280 | { |
286 | detach_hdlc_protocol(dev); | 281 | detach_hdlc_protocol(dev); |
287 | 282 | ||
@@ -297,7 +292,6 @@ int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto, | |||
297 | return -ENOBUFS; | 292 | return -ENOBUFS; |
298 | } | 293 | } |
299 | dev_to_hdlc(dev)->proto = proto; | 294 | dev_to_hdlc(dev)->proto = proto; |
300 | dev_to_desc(dev)->netif_rx = rx; | ||
301 | return 0; | 295 | return 0; |
302 | } | 296 | } |
303 | 297 | ||
diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c index 038a6e748bbf..7133c688cf20 100644 --- a/drivers/net/wan/hdlc_cisco.c +++ b/drivers/net/wan/hdlc_cisco.c | |||
@@ -250,7 +250,7 @@ static int cisco_rx(struct sk_buff *skb) | |||
250 | return NET_RX_DROP; | 250 | return NET_RX_DROP; |
251 | 251 | ||
252 | rx_error: | 252 | rx_error: |
253 | dev_to_desc(dev)->stats.rx_errors++; /* Mark error */ | 253 | dev_to_hdlc(dev)->stats.rx_errors++; /* Mark error */ |
254 | dev_kfree_skb_any(skb); | 254 | dev_kfree_skb_any(skb); |
255 | return NET_RX_DROP; | 255 | return NET_RX_DROP; |
256 | } | 256 | } |
@@ -314,6 +314,7 @@ static struct hdlc_proto proto = { | |||
314 | .stop = cisco_stop, | 314 | .stop = cisco_stop, |
315 | .type_trans = cisco_type_trans, | 315 | .type_trans = cisco_type_trans, |
316 | .ioctl = cisco_ioctl, | 316 | .ioctl = cisco_ioctl, |
317 | .netif_rx = cisco_rx, | ||
317 | .module = THIS_MODULE, | 318 | .module = THIS_MODULE, |
318 | }; | 319 | }; |
319 | 320 | ||
@@ -360,7 +361,7 @@ static int cisco_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
360 | if (result) | 361 | if (result) |
361 | return result; | 362 | return result; |
362 | 363 | ||
363 | result = attach_hdlc_protocol(dev, &proto, cisco_rx, | 364 | result = attach_hdlc_protocol(dev, &proto, |
364 | sizeof(struct cisco_state)); | 365 | sizeof(struct cisco_state)); |
365 | if (result) | 366 | if (result) |
366 | return result; | 367 | return result; |
diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c index 51296c2b8b89..2bd609c27068 100644 --- a/drivers/net/wan/hdlc_fr.c +++ b/drivers/net/wan/hdlc_fr.c | |||
@@ -956,7 +956,7 @@ static int fr_rx(struct sk_buff *skb) | |||
956 | 956 | ||
957 | 957 | ||
958 | if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) { | 958 | if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) { |
959 | dev_to_desc(frad)->stats.rx_dropped++; | 959 | dev_to_hdlc(frad)->stats.rx_dropped++; |
960 | return NET_RX_DROP; | 960 | return NET_RX_DROP; |
961 | } | 961 | } |
962 | 962 | ||
@@ -1017,7 +1017,7 @@ static int fr_rx(struct sk_buff *skb) | |||
1017 | } | 1017 | } |
1018 | 1018 | ||
1019 | rx_error: | 1019 | rx_error: |
1020 | dev_to_desc(frad)->stats.rx_errors++; /* Mark error */ | 1020 | dev_to_hdlc(frad)->stats.rx_errors++; /* Mark error */ |
1021 | dev_kfree_skb_any(skb); | 1021 | dev_kfree_skb_any(skb); |
1022 | return NET_RX_DROP; | 1022 | return NET_RX_DROP; |
1023 | } | 1023 | } |
@@ -1217,6 +1217,7 @@ static struct hdlc_proto proto = { | |||
1217 | .stop = fr_stop, | 1217 | .stop = fr_stop, |
1218 | .detach = fr_destroy, | 1218 | .detach = fr_destroy, |
1219 | .ioctl = fr_ioctl, | 1219 | .ioctl = fr_ioctl, |
1220 | .netif_rx = fr_rx, | ||
1220 | .module = THIS_MODULE, | 1221 | .module = THIS_MODULE, |
1221 | }; | 1222 | }; |
1222 | 1223 | ||
@@ -1275,7 +1276,7 @@ static int fr_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
1275 | return result; | 1276 | return result; |
1276 | 1277 | ||
1277 | if (dev_to_hdlc(dev)->proto != &proto) { /* Different proto */ | 1278 | if (dev_to_hdlc(dev)->proto != &proto) { /* Different proto */ |
1278 | result = attach_hdlc_protocol(dev, &proto, fr_rx, | 1279 | result = attach_hdlc_protocol(dev, &proto, |
1279 | sizeof(struct frad_state)); | 1280 | sizeof(struct frad_state)); |
1280 | if (result) | 1281 | if (result) |
1281 | return result; | 1282 | return result; |
diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c index 519e1550e2e7..10396d9686f4 100644 --- a/drivers/net/wan/hdlc_ppp.c +++ b/drivers/net/wan/hdlc_ppp.c | |||
@@ -122,7 +122,7 @@ static int ppp_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
122 | if (result) | 122 | if (result) |
123 | return result; | 123 | return result; |
124 | 124 | ||
125 | result = attach_hdlc_protocol(dev, &proto, NULL, | 125 | result = attach_hdlc_protocol(dev, &proto, |
126 | sizeof(struct ppp_state)); | 126 | sizeof(struct ppp_state)); |
127 | if (result) | 127 | if (result) |
128 | return result; | 128 | return result; |
diff --git a/drivers/net/wan/hdlc_raw.c b/drivers/net/wan/hdlc_raw.c index e23bc6656267..bbbb819d764c 100644 --- a/drivers/net/wan/hdlc_raw.c +++ b/drivers/net/wan/hdlc_raw.c | |||
@@ -82,7 +82,7 @@ static int raw_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
82 | if (result) | 82 | if (result) |
83 | return result; | 83 | return result; |
84 | 84 | ||
85 | result = attach_hdlc_protocol(dev, &proto, NULL, | 85 | result = attach_hdlc_protocol(dev, &proto, |
86 | sizeof(raw_hdlc_proto)); | 86 | sizeof(raw_hdlc_proto)); |
87 | if (result) | 87 | if (result) |
88 | return result; | 88 | return result; |
diff --git a/drivers/net/wan/hdlc_raw_eth.c b/drivers/net/wan/hdlc_raw_eth.c index 8895394e6006..11b16bdfe6aa 100644 --- a/drivers/net/wan/hdlc_raw_eth.c +++ b/drivers/net/wan/hdlc_raw_eth.c | |||
@@ -96,7 +96,7 @@ static int raw_eth_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
96 | if (result) | 96 | if (result) |
97 | return result; | 97 | return result; |
98 | 98 | ||
99 | result = attach_hdlc_protocol(dev, &proto, NULL, | 99 | result = attach_hdlc_protocol(dev, &proto, |
100 | sizeof(raw_hdlc_proto)); | 100 | sizeof(raw_hdlc_proto)); |
101 | if (result) | 101 | if (result) |
102 | return result; | 102 | return result; |
diff --git a/drivers/net/wan/hdlc_x25.c b/drivers/net/wan/hdlc_x25.c index cd7b22f50edc..c15cc11e399b 100644 --- a/drivers/net/wan/hdlc_x25.c +++ b/drivers/net/wan/hdlc_x25.c | |||
@@ -164,17 +164,17 @@ static void x25_close(struct net_device *dev) | |||
164 | 164 | ||
165 | static int x25_rx(struct sk_buff *skb) | 165 | static int x25_rx(struct sk_buff *skb) |
166 | { | 166 | { |
167 | struct hdlc_device_desc *desc = dev_to_desc(skb->dev); | 167 | struct hdlc_device *hdlc = dev_to_hdlc(skb->dev); |
168 | 168 | ||
169 | if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) { | 169 | if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) { |
170 | desc->stats.rx_dropped++; | 170 | hdlc->stats.rx_dropped++; |
171 | return NET_RX_DROP; | 171 | return NET_RX_DROP; |
172 | } | 172 | } |
173 | 173 | ||
174 | if (lapb_data_received(skb->dev, skb) == LAPB_OK) | 174 | if (lapb_data_received(skb->dev, skb) == LAPB_OK) |
175 | return NET_RX_SUCCESS; | 175 | return NET_RX_SUCCESS; |
176 | 176 | ||
177 | desc->stats.rx_errors++; | 177 | hdlc->stats.rx_errors++; |
178 | dev_kfree_skb_any(skb); | 178 | dev_kfree_skb_any(skb); |
179 | return NET_RX_DROP; | 179 | return NET_RX_DROP; |
180 | } | 180 | } |
@@ -184,6 +184,7 @@ static struct hdlc_proto proto = { | |||
184 | .open = x25_open, | 184 | .open = x25_open, |
185 | .close = x25_close, | 185 | .close = x25_close, |
186 | .ioctl = x25_ioctl, | 186 | .ioctl = x25_ioctl, |
187 | .netif_rx = x25_rx, | ||
187 | .module = THIS_MODULE, | 188 | .module = THIS_MODULE, |
188 | }; | 189 | }; |
189 | 190 | ||
@@ -211,8 +212,7 @@ static int x25_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
211 | if (result) | 212 | if (result) |
212 | return result; | 213 | return result; |
213 | 214 | ||
214 | if ((result = attach_hdlc_protocol(dev, &proto, | 215 | if ((result = attach_hdlc_protocol(dev, &proto, 0))) |
215 | x25_rx, 0)) != 0) | ||
216 | return result; | 216 | return result; |
217 | dev->hard_start_xmit = x25_xmit; | 217 | dev->hard_start_xmit = x25_xmit; |
218 | dev->type = ARPHRD_X25; | 218 | dev->type = ARPHRD_X25; |
diff --git a/include/linux/hdlc.h b/include/linux/hdlc.h index db390c511ada..6115545a5b9c 100644 --- a/include/linux/hdlc.h +++ b/include/linux/hdlc.h | |||
@@ -26,13 +26,6 @@ | |||
26 | #include <linux/netdevice.h> | 26 | #include <linux/netdevice.h> |
27 | #include <linux/hdlc/ioctl.h> | 27 | #include <linux/hdlc/ioctl.h> |
28 | 28 | ||
29 | |||
30 | /* Used by all network devices here, pointed to by netdev_priv(dev) */ | ||
31 | struct hdlc_device_desc { | ||
32 | int (*netif_rx)(struct sk_buff *skb); | ||
33 | struct net_device_stats stats; | ||
34 | }; | ||
35 | |||
36 | /* This structure is a private property of HDLC protocols. | 29 | /* This structure is a private property of HDLC protocols. |
37 | Hardware drivers have no interest here */ | 30 | Hardware drivers have no interest here */ |
38 | 31 | ||
@@ -44,12 +37,15 @@ struct hdlc_proto { | |||
44 | void (*detach)(struct net_device *dev); | 37 | void (*detach)(struct net_device *dev); |
45 | int (*ioctl)(struct net_device *dev, struct ifreq *ifr); | 38 | int (*ioctl)(struct net_device *dev, struct ifreq *ifr); |
46 | __be16 (*type_trans)(struct sk_buff *skb, struct net_device *dev); | 39 | __be16 (*type_trans)(struct sk_buff *skb, struct net_device *dev); |
40 | int (*netif_rx)(struct sk_buff *skb); | ||
47 | struct module *module; | 41 | struct module *module; |
48 | struct hdlc_proto *next; /* next protocol in the list */ | 42 | struct hdlc_proto *next; /* next protocol in the list */ |
49 | }; | 43 | }; |
50 | 44 | ||
51 | 45 | ||
46 | /* Pointed to by dev->priv */ | ||
52 | typedef struct hdlc_device { | 47 | typedef struct hdlc_device { |
48 | struct net_device_stats stats; | ||
53 | /* used by HDLC layer to take control over HDLC device from hw driver*/ | 49 | /* used by HDLC layer to take control over HDLC device from hw driver*/ |
54 | int (*attach)(struct net_device *dev, | 50 | int (*attach)(struct net_device *dev, |
55 | unsigned short encoding, unsigned short parity); | 51 | unsigned short encoding, unsigned short parity); |
@@ -83,18 +79,11 @@ void unregister_hdlc_protocol(struct hdlc_proto *proto); | |||
83 | 79 | ||
84 | struct net_device *alloc_hdlcdev(void *priv); | 80 | struct net_device *alloc_hdlcdev(void *priv); |
85 | 81 | ||
86 | 82 | static inline struct hdlc_device* dev_to_hdlc(struct net_device *dev) | |
87 | static __inline__ struct hdlc_device_desc* dev_to_desc(struct net_device *dev) | ||
88 | { | ||
89 | return netdev_priv(dev); | ||
90 | } | ||
91 | |||
92 | static __inline__ hdlc_device* dev_to_hdlc(struct net_device *dev) | ||
93 | { | 83 | { |
94 | return netdev_priv(dev) + sizeof(struct hdlc_device_desc); | 84 | return dev->priv; |
95 | } | 85 | } |
96 | 86 | ||
97 | |||
98 | static __inline__ void debug_frame(const struct sk_buff *skb) | 87 | static __inline__ void debug_frame(const struct sk_buff *skb) |
99 | { | 88 | { |
100 | int i; | 89 | int i; |
@@ -116,13 +105,13 @@ int hdlc_open(struct net_device *dev); | |||
116 | void hdlc_close(struct net_device *dev); | 105 | void hdlc_close(struct net_device *dev); |
117 | 106 | ||
118 | int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto, | 107 | int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto, |
119 | int (*rx)(struct sk_buff *skb), size_t size); | 108 | size_t size); |
120 | /* May be used by hardware driver to gain control over HDLC device */ | 109 | /* May be used by hardware driver to gain control over HDLC device */ |
121 | void detach_hdlc_protocol(struct net_device *dev); | 110 | void detach_hdlc_protocol(struct net_device *dev); |
122 | 111 | ||
123 | static __inline__ struct net_device_stats *hdlc_stats(struct net_device *dev) | 112 | static __inline__ struct net_device_stats *hdlc_stats(struct net_device *dev) |
124 | { | 113 | { |
125 | return &dev_to_desc(dev)->stats; | 114 | return &dev_to_hdlc(dev)->stats; |
126 | } | 115 | } |
127 | 116 | ||
128 | 117 | ||