| rjw | 1f88458 | 2022-01-06 17:20:42 +0800 | [diff] [blame] | 1 |  | 
 | 2 | 		Linux IEEE 802.15.4 implementation | 
 | 3 |  | 
 | 4 |  | 
 | 5 | Introduction | 
 | 6 | ============ | 
 | 7 | The IEEE 802.15.4 working group focuses on standardization of the bottom | 
 | 8 | two layers: Medium Access Control (MAC) and Physical access (PHY). And there | 
 | 9 | are mainly two options available for upper layers: | 
 | 10 |  - ZigBee - proprietary protocol from the ZigBee Alliance | 
 | 11 |  - 6LoWPAN - IPv6 networking over low rate personal area networks | 
 | 12 |  | 
 | 13 | The goal of the Linux-wpan is to provide a complete implementation | 
 | 14 | of the IEEE 802.15.4 and 6LoWPAN protocols. IEEE 802.15.4 is a stack | 
 | 15 | of protocols for organizing Low-Rate Wireless Personal Area Networks. | 
 | 16 |  | 
 | 17 | The stack is composed of three main parts: | 
 | 18 |  - IEEE 802.15.4 layer;  We have chosen to use plain Berkeley socket API, | 
 | 19 |    the generic Linux networking stack to transfer IEEE 802.15.4 data | 
 | 20 |    messages and a special protocol over netlink for configuration/management | 
 | 21 |  - MAC - provides access to shared channel and reliable data delivery | 
 | 22 |  - PHY - represents device drivers | 
 | 23 |  | 
 | 24 |  | 
 | 25 | Socket API | 
 | 26 | ========== | 
 | 27 |  | 
 | 28 | int sd = socket(PF_IEEE802154, SOCK_DGRAM, 0); | 
 | 29 | ..... | 
 | 30 |  | 
 | 31 | The address family, socket addresses etc. are defined in the | 
 | 32 | include/net/af_ieee802154.h header or in the special header | 
 | 33 | in the userspace package (see either http://wpan.cakelab.org/ or the | 
 | 34 | git tree at https://github.com/linux-wpan/wpan-tools). | 
 | 35 |  | 
 | 36 |  | 
 | 37 | Kernel side | 
 | 38 | ============= | 
 | 39 |  | 
 | 40 | Like with WiFi, there are several types of devices implementing IEEE 802.15.4. | 
 | 41 | 1) 'HardMAC'. The MAC layer is implemented in the device itself, the device | 
 | 42 |    exports a management (e.g. MLME) and data API. | 
 | 43 | 2) 'SoftMAC' or just radio. These types of devices are just radio transceivers | 
 | 44 |    possibly with some kinds of acceleration like automatic CRC computation and | 
 | 45 |    comparation, automagic ACK handling, address matching, etc. | 
 | 46 |  | 
 | 47 | Those types of devices require different approach to be hooked into Linux kernel. | 
 | 48 |  | 
 | 49 |  | 
 | 50 | HardMAC | 
 | 51 | ======= | 
 | 52 |  | 
 | 53 | See the header include/net/ieee802154_netdev.h. You have to implement Linux | 
 | 54 | net_device, with .type = ARPHRD_IEEE802154. Data is exchanged with socket family | 
 | 55 | code via plain sk_buffs. On skb reception skb->cb must contain additional | 
 | 56 | info as described in the struct ieee802154_mac_cb. During packet transmission | 
 | 57 | the skb->cb is used to provide additional data to device's header_ops->create | 
 | 58 | function. Be aware that this data can be overridden later (when socket code | 
 | 59 | submits skb to qdisc), so if you need something from that cb later, you should | 
 | 60 | store info in the skb->data on your own. | 
 | 61 |  | 
 | 62 | To hook the MLME interface you have to populate the ml_priv field of your | 
 | 63 | net_device with a pointer to struct ieee802154_mlme_ops instance. The fields | 
 | 64 | assoc_req, assoc_resp, disassoc_req, start_req, and scan_req are optional. | 
 | 65 | All other fields are required. | 
 | 66 |  | 
 | 67 |  | 
 | 68 | SoftMAC | 
 | 69 | ======= | 
 | 70 |  | 
 | 71 | The MAC is the middle layer in the IEEE 802.15.4 Linux stack. This moment it | 
 | 72 | provides interface for drivers registration and management of slave interfaces. | 
 | 73 |  | 
 | 74 | NOTE: Currently the only monitor device type is supported - it's IEEE 802.15.4 | 
 | 75 | stack interface for network sniffers (e.g. WireShark). | 
 | 76 |  | 
 | 77 | This layer is going to be extended soon. | 
 | 78 |  | 
 | 79 | See header include/net/mac802154.h and several drivers in | 
 | 80 | drivers/net/ieee802154/. | 
 | 81 |  | 
 | 82 |  | 
 | 83 | Device drivers API | 
 | 84 | ================== | 
 | 85 |  | 
 | 86 | The include/net/mac802154.h defines following functions: | 
 | 87 |  - struct ieee802154_hw * | 
 | 88 |    ieee802154_alloc_hw(size_t priv_data_len, const struct ieee802154_ops *ops): | 
 | 89 |    allocation of IEEE 802.15.4 compatible hardware device | 
 | 90 |  | 
 | 91 |  - void ieee802154_free_hw(struct ieee802154_hw *hw): | 
 | 92 |    freeing allocated hardware device | 
 | 93 |  | 
 | 94 |  - int ieee802154_register_hw(struct ieee802154_hw *hw): | 
 | 95 |    register PHY which is the allocated hardware device, in the system | 
 | 96 |  | 
 | 97 |  - void ieee802154_unregister_hw(struct ieee802154_hw *hw): | 
 | 98 |    freeing registered PHY | 
 | 99 |  | 
 | 100 | Moreover IEEE 802.15.4 device operations structure should be filled. | 
 | 101 |  | 
 | 102 | Fake drivers | 
 | 103 | ============ | 
 | 104 |  | 
 | 105 | In addition there is a driver available which simulates a real device with | 
 | 106 | SoftMAC (fakelb - IEEE 802.15.4 loopback driver) interface. This option | 
 | 107 | provides a possibility to test and debug the stack without usage of real hardware. | 
 | 108 |  | 
 | 109 | See sources in drivers/net/ieee802154 folder for more details. | 
 | 110 |  | 
 | 111 |  | 
 | 112 | 6LoWPAN Linux implementation | 
 | 113 | ============================ | 
 | 114 |  | 
 | 115 | The IEEE 802.15.4 standard specifies an MTU of 127 bytes, yielding about 80 | 
 | 116 | octets of actual MAC payload once security is turned on, on a wireless link | 
 | 117 | with a link throughput of 250 kbps or less.  The 6LoWPAN adaptation format | 
 | 118 | [RFC4944] was specified to carry IPv6 datagrams over such constrained links, | 
 | 119 | taking into account limited bandwidth, memory, or energy resources that are | 
 | 120 | expected in applications such as wireless Sensor Networks.  [RFC4944] defines | 
 | 121 | a Mesh Addressing header to support sub-IP forwarding, a Fragmentation header | 
 | 122 | to support the IPv6 minimum MTU requirement [RFC2460], and stateless header | 
 | 123 | compression for IPv6 datagrams (LOWPAN_HC1 and LOWPAN_HC2) to reduce the | 
 | 124 | relatively large IPv6 and UDP headers down to (in the best case) several bytes. | 
 | 125 |  | 
 | 126 | In September 2011 the standard update was published - [RFC6282]. | 
 | 127 | It deprecates HC1 and HC2 compression and defines IPHC encoding format which is | 
 | 128 | used in this Linux implementation. | 
 | 129 |  | 
 | 130 | All the code related to 6lowpan you may find in files: net/6lowpan/* | 
 | 131 | and net/ieee802154/6lowpan/* | 
 | 132 |  | 
 | 133 | To setup a 6LoWPAN interface you need: | 
 | 134 | 1. Add IEEE802.15.4 interface and set channel and PAN ID; | 
 | 135 | 2. Add 6lowpan interface by command like: | 
 | 136 |    # ip link add link wpan0 name lowpan0 type lowpan | 
 | 137 | 3. Bring up 'lowpan0' interface |