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 if_settings *ifs) 200 { 201 struct hdlc_proto *proto = first_proto; 202 int result; 203 204 if (dev_to_hdlc(dev)->proto) { 205 result = dev_to_hdlc(dev)->proto->ioctl(dev, ifs); 206 if (result != -EINVAL) 207 return result; 208 } 209 210 /* Not handled by currently attached protocol (if any) */ 211 212 while (proto) { 213 result = proto->ioctl(dev, ifs); 214 if (result != -EINVAL) 215 return result; 216 proto = proto->next; 217 } 218 return -EINVAL; 219 } 220 EXPORT_SYMBOL(hdlc_ioctl); 221 222 static const struct header_ops hdlc_null_ops; 223 224 static void hdlc_setup_dev(struct net_device *dev) 225 { 226 /* Re-init all variables changed by HDLC protocol drivers, 227 * including ether_setup() called from hdlc_raw_eth.c. 228 */ 229 dev->flags = IFF_POINTOPOINT | IFF_NOARP; 230 dev->priv_flags = IFF_WAN_HDLC; 231 dev->mtu = HDLC_MAX_MTU; 232 dev->min_mtu = 68; 233 dev->max_mtu = HDLC_MAX_MTU; 234 dev->type = ARPHRD_RAWHDLC; 235 dev->hard_header_len = 0; 236 dev->needed_headroom = 0; 237 dev->addr_len = 0; 238 dev->header_ops = &hdlc_null_ops; 239 } 240 241 static void hdlc_setup(struct net_device *dev) 242 { 243 hdlc_device *hdlc = dev_to_hdlc(dev); 244 245 hdlc_setup_dev(dev); 246 hdlc->carrier = 1; 247 hdlc->open = 0; 248 spin_lock_init(&hdlc->state_lock); 249 } 250 251 struct net_device *alloc_hdlcdev(void *priv) 252 { 253 struct net_device *dev; 254 255 dev = alloc_netdev(sizeof(struct hdlc_device), "hdlc%d", 256 NET_NAME_UNKNOWN, hdlc_setup); 257 if (dev) 258 dev_to_hdlc(dev)->priv = priv; 259 return dev; 260 } 261 EXPORT_SYMBOL(alloc_hdlcdev); 262 263 void unregister_hdlc_device(struct net_device *dev) 264 { 265 rtnl_lock(); 266 detach_hdlc_protocol(dev); 267 unregister_netdevice(dev); 268 rtnl_unlock(); 269 } 270 EXPORT_SYMBOL(unregister_hdlc_device); 271 272 int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto, 273 size_t size) 274 { 275 int err; 276 277 err = detach_hdlc_protocol(dev); 278 if (err) 279 return err; 280 281 if (!try_module_get(proto->module)) 282 return -ENOSYS; 283 284 if (size) { 285 dev_to_hdlc(dev)->state = kmalloc(size, GFP_KERNEL); 286 if (!dev_to_hdlc(dev)->state) { 287 module_put(proto->module); 288 return -ENOBUFS; 289 } 290 } 291 dev_to_hdlc(dev)->proto = proto; 292 293 return 0; 294 } 295 EXPORT_SYMBOL(attach_hdlc_protocol); 296 297 int detach_hdlc_protocol(struct net_device *dev) 298 { 299 hdlc_device *hdlc = dev_to_hdlc(dev); 300 int err; 301 302 if (hdlc->proto) { 303 err = call_netdevice_notifiers(NETDEV_PRE_TYPE_CHANGE, dev); 304 err = notifier_to_errno(err); 305 if (err) { 306 netdev_err(dev, "Refused to change device type\n"); 307 return err; 308 } 309 310 if (hdlc->proto->detach) 311 hdlc->proto->detach(dev); 312 module_put(hdlc->proto->module); 313 hdlc->proto = NULL; 314 } 315 kfree(hdlc->state); 316 hdlc->state = NULL; 317 hdlc_setup_dev(dev); 318 319 return 0; 320 } 321 EXPORT_SYMBOL(detach_hdlc_protocol); 322 323 void register_hdlc_protocol(struct hdlc_proto *proto) 324 { 325 rtnl_lock(); 326 proto->next = first_proto; 327 first_proto = proto; 328 rtnl_unlock(); 329 } 330 EXPORT_SYMBOL(register_hdlc_protocol); 331 332 void unregister_hdlc_protocol(struct hdlc_proto *proto) 333 { 334 struct hdlc_proto **p; 335 336 rtnl_lock(); 337 p = &first_proto; 338 while (*p != proto) { 339 BUG_ON(!*p); 340 p = &((*p)->next); 341 } 342 *p = proto->next; 343 rtnl_unlock(); 344 } 345 EXPORT_SYMBOL(unregister_hdlc_protocol); 346 347 MODULE_AUTHOR("Krzysztof Halasa <khc@pm.waw.pl>"); 348 MODULE_DESCRIPTION("HDLC support module"); 349 MODULE_LICENSE("GPL v2"); 350 351 static struct packet_type hdlc_packet_type __read_mostly = { 352 .type = cpu_to_be16(ETH_P_HDLC), 353 .func = hdlc_rcv, 354 }; 355 356 static struct notifier_block hdlc_notifier = { 357 .notifier_call = hdlc_device_event, 358 }; 359 360 static int __init hdlc_module_init(void) 361 { 362 int result; 363 364 pr_info("%s\n", version); 365 result = register_netdevice_notifier(&hdlc_notifier); 366 if (result) 367 return result; 368 dev_add_pack(&hdlc_packet_type); 369 return 0; 370 } 371 372 static void __exit hdlc_module_exit(void) 373 { 374 dev_remove_pack(&hdlc_packet_type); 375 unregister_netdevice_notifier(&hdlc_notifier); 376 } 377 378 module_init(hdlc_module_init); 379 module_exit(hdlc_module_exit); 380