Merge tag 'reset-for-v5.3' of git://git.pengutronix.de/git/pza/linux into arm/drivers
[sfrench/cifs-2.6.git] / drivers / net / wan / hdlc.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Generic HDLC support routines for Linux
4  *
5  * Copyright (C) 1999 - 2008 Krzysztof Halasa <khc@pm.waw.pl>
6  *
7  * Currently supported:
8  *      * raw IP-in-HDLC
9  *      * Cisco HDLC
10  *      * Frame Relay with ANSI or CCITT LMI (both user and network side)
11  *      * PPP
12  *      * X.25
13  *
14  * Use sethdlc utility to set line parameters, protocol and PVCs
15  *
16  * How does it work:
17  * - proto->open(), close(), start(), stop() calls are serialized.
18  *   The order is: open, [ start, stop ... ] close ...
19  * - proto->start() and stop() are called with spin_lock_irq held.
20  */
21
22 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
23
24 #include <linux/errno.h>
25 #include <linux/hdlc.h>
26 #include <linux/if_arp.h>
27 #include <linux/inetdevice.h>
28 #include <linux/init.h>
29 #include <linux/kernel.h>
30 #include <linux/module.h>
31 #include <linux/notifier.h>
32 #include <linux/pkt_sched.h>
33 #include <linux/poll.h>
34 #include <linux/rtnetlink.h>
35 #include <linux/skbuff.h>
36 #include <linux/slab.h>
37 #include <net/net_namespace.h>
38
39
40 static const char* version = "HDLC support module revision 1.22";
41
42 #undef DEBUG_LINK
43
44 static struct hdlc_proto *first_proto;
45
46 static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev,
47                     struct packet_type *p, struct net_device *orig_dev)
48 {
49         struct hdlc_device *hdlc = dev_to_hdlc(dev);
50
51         if (!net_eq(dev_net(dev), &init_net)) {
52                 kfree_skb(skb);
53                 return 0;
54         }
55
56         BUG_ON(!hdlc->proto->netif_rx);
57         return hdlc->proto->netif_rx(skb);
58 }
59
60 netdev_tx_t hdlc_start_xmit(struct sk_buff *skb, struct net_device *dev)
61 {
62         hdlc_device *hdlc = dev_to_hdlc(dev);
63
64         if (hdlc->proto->xmit)
65                 return hdlc->proto->xmit(skb, dev);
66
67         return hdlc->xmit(skb, dev); /* call hardware driver directly */
68 }
69
70 static inline void hdlc_proto_start(struct net_device *dev)
71 {
72         hdlc_device *hdlc = dev_to_hdlc(dev);
73         if (hdlc->proto->start)
74                 hdlc->proto->start(dev);
75 }
76
77
78
79 static inline void hdlc_proto_stop(struct net_device *dev)
80 {
81         hdlc_device *hdlc = dev_to_hdlc(dev);
82         if (hdlc->proto->stop)
83                 hdlc->proto->stop(dev);
84 }
85
86
87
88 static int hdlc_device_event(struct notifier_block *this, unsigned long event,
89                              void *ptr)
90 {
91         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
92         hdlc_device *hdlc;
93         unsigned long flags;
94         int on;
95
96         if (!net_eq(dev_net(dev), &init_net))
97                 return NOTIFY_DONE;
98
99         if (!(dev->priv_flags & IFF_WAN_HDLC))
100                 return NOTIFY_DONE; /* not an HDLC device */
101
102         if (event != NETDEV_CHANGE)
103                 return NOTIFY_DONE; /* Only interested in carrier changes */
104
105         on = netif_carrier_ok(dev);
106
107 #ifdef DEBUG_LINK
108         printk(KERN_DEBUG "%s: hdlc_device_event NETDEV_CHANGE, carrier %i\n",
109                dev->name, on);
110 #endif
111
112         hdlc = dev_to_hdlc(dev);
113         spin_lock_irqsave(&hdlc->state_lock, flags);
114
115         if (hdlc->carrier == on)
116                 goto carrier_exit; /* no change in DCD line level */
117
118         hdlc->carrier = on;
119
120         if (!hdlc->open)
121                 goto carrier_exit;
122
123         if (hdlc->carrier) {
124                 netdev_info(dev, "Carrier detected\n");
125                 hdlc_proto_start(dev);
126         } else {
127                 netdev_info(dev, "Carrier lost\n");
128                 hdlc_proto_stop(dev);
129         }
130
131 carrier_exit:
132         spin_unlock_irqrestore(&hdlc->state_lock, flags);
133         return NOTIFY_DONE;
134 }
135
136
137
138 /* Must be called by hardware driver when HDLC device is being opened */
139 int hdlc_open(struct net_device *dev)
140 {
141         hdlc_device *hdlc = dev_to_hdlc(dev);
142 #ifdef DEBUG_LINK
143         printk(KERN_DEBUG "%s: hdlc_open() carrier %i open %i\n", dev->name,
144                hdlc->carrier, hdlc->open);
145 #endif
146
147         if (hdlc->proto == NULL)
148                 return -ENOSYS; /* no protocol attached */
149
150         if (hdlc->proto->open) {
151                 int result = hdlc->proto->open(dev);
152                 if (result)
153                         return result;
154         }
155
156         spin_lock_irq(&hdlc->state_lock);
157
158         if (hdlc->carrier) {
159                 netdev_info(dev, "Carrier detected\n");
160                 hdlc_proto_start(dev);
161         } else
162                 netdev_info(dev, "No carrier\n");
163
164         hdlc->open = 1;
165
166         spin_unlock_irq(&hdlc->state_lock);
167         return 0;
168 }
169
170
171
172 /* Must be called by hardware driver when HDLC device is being closed */
173 void hdlc_close(struct net_device *dev)
174 {
175         hdlc_device *hdlc = dev_to_hdlc(dev);
176 #ifdef DEBUG_LINK
177         printk(KERN_DEBUG "%s: hdlc_close() carrier %i open %i\n", dev->name,
178                hdlc->carrier, hdlc->open);
179 #endif
180
181         spin_lock_irq(&hdlc->state_lock);
182
183         hdlc->open = 0;
184         if (hdlc->carrier)
185                 hdlc_proto_stop(dev);
186
187         spin_unlock_irq(&hdlc->state_lock);
188
189         if (hdlc->proto->close)
190                 hdlc->proto->close(dev);
191 }
192
193
194
195 int hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
196 {
197         struct hdlc_proto *proto = first_proto;
198         int result;
199
200         if (cmd != SIOCWANDEV)
201                 return -EINVAL;
202
203         if (dev_to_hdlc(dev)->proto) {
204                 result = dev_to_hdlc(dev)->proto->ioctl(dev, ifr);
205                 if (result != -EINVAL)
206                         return result;
207         }
208
209         /* Not handled by currently attached protocol (if any) */
210
211         while (proto) {
212                 if ((result = proto->ioctl(dev, ifr)) != -EINVAL)
213                         return result;
214                 proto = proto->next;
215         }
216         return -EINVAL;
217 }
218
219 static const struct header_ops hdlc_null_ops;
220
221 static void hdlc_setup_dev(struct net_device *dev)
222 {
223         /* Re-init all variables changed by HDLC protocol drivers,
224          * including ether_setup() called from hdlc_raw_eth.c.
225          */
226         dev->flags               = IFF_POINTOPOINT | IFF_NOARP;
227         dev->priv_flags          = IFF_WAN_HDLC;
228         dev->mtu                 = HDLC_MAX_MTU;
229         dev->min_mtu             = 68;
230         dev->max_mtu             = HDLC_MAX_MTU;
231         dev->type                = ARPHRD_RAWHDLC;
232         dev->hard_header_len     = 16;
233         dev->addr_len            = 0;
234         dev->header_ops          = &hdlc_null_ops;
235 }
236
237 static void hdlc_setup(struct net_device *dev)
238 {
239         hdlc_device *hdlc = dev_to_hdlc(dev);
240
241         hdlc_setup_dev(dev);
242         hdlc->carrier = 1;
243         hdlc->open = 0;
244         spin_lock_init(&hdlc->state_lock);
245 }
246
247 struct net_device *alloc_hdlcdev(void *priv)
248 {
249         struct net_device *dev;
250         dev = alloc_netdev(sizeof(struct hdlc_device), "hdlc%d",
251                            NET_NAME_UNKNOWN, hdlc_setup);
252         if (dev)
253                 dev_to_hdlc(dev)->priv = priv;
254         return dev;
255 }
256
257 void unregister_hdlc_device(struct net_device *dev)
258 {
259         rtnl_lock();
260         detach_hdlc_protocol(dev);
261         unregister_netdevice(dev);
262         rtnl_unlock();
263 }
264
265
266
267 int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto,
268                          size_t size)
269 {
270         int err;
271
272         err = detach_hdlc_protocol(dev);
273         if (err)
274                 return err;
275
276         if (!try_module_get(proto->module))
277                 return -ENOSYS;
278
279         if (size) {
280                 dev_to_hdlc(dev)->state = kmalloc(size, GFP_KERNEL);
281                 if (dev_to_hdlc(dev)->state == NULL) {
282                         module_put(proto->module);
283                         return -ENOBUFS;
284                 }
285         }
286         dev_to_hdlc(dev)->proto = proto;
287
288         return 0;
289 }
290
291
292 int detach_hdlc_protocol(struct net_device *dev)
293 {
294         hdlc_device *hdlc = dev_to_hdlc(dev);
295         int err;
296
297         if (hdlc->proto) {
298                 err = call_netdevice_notifiers(NETDEV_PRE_TYPE_CHANGE, dev);
299                 err = notifier_to_errno(err);
300                 if (err) {
301                         netdev_err(dev, "Refused to change device type\n");
302                         return err;
303                 }
304
305                 if (hdlc->proto->detach)
306                         hdlc->proto->detach(dev);
307                 module_put(hdlc->proto->module);
308                 hdlc->proto = NULL;
309         }
310         kfree(hdlc->state);
311         hdlc->state = NULL;
312         hdlc_setup_dev(dev);
313
314         return 0;
315 }
316
317
318 void register_hdlc_protocol(struct hdlc_proto *proto)
319 {
320         rtnl_lock();
321         proto->next = first_proto;
322         first_proto = proto;
323         rtnl_unlock();
324 }
325
326
327 void unregister_hdlc_protocol(struct hdlc_proto *proto)
328 {
329         struct hdlc_proto **p;
330
331         rtnl_lock();
332         p = &first_proto;
333         while (*p != proto) {
334                 BUG_ON(!*p);
335                 p = &((*p)->next);
336         }
337         *p = proto->next;
338         rtnl_unlock();
339 }
340
341
342
343 MODULE_AUTHOR("Krzysztof Halasa <khc@pm.waw.pl>");
344 MODULE_DESCRIPTION("HDLC support module");
345 MODULE_LICENSE("GPL v2");
346
347 EXPORT_SYMBOL(hdlc_start_xmit);
348 EXPORT_SYMBOL(hdlc_open);
349 EXPORT_SYMBOL(hdlc_close);
350 EXPORT_SYMBOL(hdlc_ioctl);
351 EXPORT_SYMBOL(alloc_hdlcdev);
352 EXPORT_SYMBOL(unregister_hdlc_device);
353 EXPORT_SYMBOL(register_hdlc_protocol);
354 EXPORT_SYMBOL(unregister_hdlc_protocol);
355 EXPORT_SYMBOL(attach_hdlc_protocol);
356 EXPORT_SYMBOL(detach_hdlc_protocol);
357
358 static struct packet_type hdlc_packet_type __read_mostly = {
359         .type = cpu_to_be16(ETH_P_HDLC),
360         .func = hdlc_rcv,
361 };
362
363
364 static struct notifier_block hdlc_notifier = {
365         .notifier_call = hdlc_device_event,
366 };
367
368
369 static int __init hdlc_module_init(void)
370 {
371         int result;
372
373         pr_info("%s\n", version);
374         if ((result = register_netdevice_notifier(&hdlc_notifier)) != 0)
375                 return result;
376         dev_add_pack(&hdlc_packet_type);
377         return 0;
378 }
379
380
381
382 static void __exit hdlc_module_exit(void)
383 {
384         dev_remove_pack(&hdlc_packet_type);
385         unregister_netdevice_notifier(&hdlc_notifier);
386 }
387
388
389 module_init(hdlc_module_init);
390 module_exit(hdlc_module_exit);