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