~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/hdlc.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0-only */
  2 /*
  3  * Generic HDLC support routines for Linux
  4  *
  5  * Copyright (C) 1999-2005 Krzysztof Halasa <khc@pm.waw.pl>
  6  */
  7 #ifndef __HDLC_H
  8 #define __HDLC_H
  9 
 10 
 11 #include <linux/skbuff.h>
 12 #include <linux/netdevice.h>
 13 #include <linux/hdlc/ioctl.h>
 14 #include <uapi/linux/hdlc.h>
 15 
 16 /* This structure is a private property of HDLC protocols.
 17    Hardware drivers have no interest here */
 18 
 19 struct hdlc_proto {
 20         int (*open)(struct net_device *dev);
 21         void (*close)(struct net_device *dev);
 22         void (*start)(struct net_device *dev); /* if open & DCD */
 23         void (*stop)(struct net_device *dev); /* if open & !DCD */
 24         void (*detach)(struct net_device *dev);
 25         int (*ioctl)(struct net_device *dev, struct if_settings *ifs);
 26         __be16 (*type_trans)(struct sk_buff *skb, struct net_device *dev);
 27         int (*netif_rx)(struct sk_buff *skb);
 28         netdev_tx_t (*xmit)(struct sk_buff *skb, struct net_device *dev);
 29         struct module *module;
 30         struct hdlc_proto *next; /* next protocol in the list */
 31 };
 32 
 33 
 34 /* Pointed to by netdev_priv(dev) */
 35 typedef struct hdlc_device {
 36         /* used by HDLC layer to take control over HDLC device from hw driver*/
 37         int (*attach)(struct net_device *dev,
 38                       unsigned short encoding, unsigned short parity);
 39 
 40         /* hardware driver must handle this instead of dev->hard_start_xmit */
 41         netdev_tx_t (*xmit)(struct sk_buff *skb, struct net_device *dev);
 42 
 43         /* Things below are for HDLC layer internal use only */
 44         const struct hdlc_proto *proto;
 45         int carrier;
 46         int open;
 47         spinlock_t state_lock;
 48         void *state;
 49         void *priv;
 50 } hdlc_device;
 51 
 52 
 53 
 54 /* Exported from hdlc module */
 55 
 56 /* Called by hardware driver when a user requests HDLC service */
 57 int hdlc_ioctl(struct net_device *dev, struct if_settings *ifs);
 58 
 59 /* Must be used by hardware driver on module startup/exit */
 60 #define register_hdlc_device(dev)       register_netdev(dev)
 61 void unregister_hdlc_device(struct net_device *dev);
 62 
 63 
 64 void register_hdlc_protocol(struct hdlc_proto *proto);
 65 void unregister_hdlc_protocol(struct hdlc_proto *proto);
 66 
 67 struct net_device *alloc_hdlcdev(void *priv);
 68 
 69 static inline struct hdlc_device* dev_to_hdlc(struct net_device *dev)
 70 {
 71         return netdev_priv(dev);
 72 }
 73 
 74 static __inline__ void debug_frame(const struct sk_buff *skb)
 75 {
 76         int i;
 77 
 78         for (i=0; i < skb->len; i++) {
 79                 if (i == 100) {
 80                         printk("...\n");
 81                         return;
 82                 }
 83                 printk(" %02X", skb->data[i]);
 84         }
 85         printk("\n");
 86 }
 87 
 88 
 89 /* Must be called by hardware driver when HDLC device is being opened */
 90 int hdlc_open(struct net_device *dev);
 91 /* Must be called by hardware driver when HDLC device is being closed */
 92 void hdlc_close(struct net_device *dev);
 93 /* Must be pointed to by hw driver's dev->netdev_ops->ndo_start_xmit */
 94 netdev_tx_t hdlc_start_xmit(struct sk_buff *skb, struct net_device *dev);
 95 
 96 int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto,
 97                          size_t size);
 98 /* May be used by hardware driver to gain control over HDLC device */
 99 int detach_hdlc_protocol(struct net_device *dev);
100 
101 static __inline__ __be16 hdlc_type_trans(struct sk_buff *skb,
102                                          struct net_device *dev)
103 {
104         hdlc_device *hdlc = dev_to_hdlc(dev);
105 
106         skb->dev = dev;
107         skb_reset_mac_header(skb);
108 
109         if (hdlc->proto->type_trans)
110                 return hdlc->proto->type_trans(skb, dev);
111         else
112                 return htons(ETH_P_HDLC);
113 }
114 
115 #endif /* __HDLC_H */
116 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php