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