Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 1 | |
| 2 | Linux IEEE 802.15.4 implementation |
| 3 | |
| 4 | |
| 5 | Introduction |
| 6 | ============ |
Stefan Schmidt | 6bf0d84 | 2016-11-28 18:22:33 +0100 | [diff] [blame] | 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 |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 9 | are mainly two options available for upper layers: |
Stefan Schmidt | 29cd5dd | 2015-09-03 16:31:34 +0200 | [diff] [blame] | 10 | - ZigBee - proprietary protocol from the ZigBee Alliance |
| 11 | - 6LoWPAN - IPv6 networking over low rate personal area networks |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 12 | |
Stefan Schmidt | 6bf0d84 | 2016-11-28 18:22:33 +0100 | [diff] [blame] | 13 | The goal of the Linux-wpan is to provide a complete implementation |
Stefan Schmidt | 29cd5dd | 2015-09-03 16:31:34 +0200 | [diff] [blame] | 14 | of the IEEE 802.15.4 and 6LoWPAN protocols. IEEE 802.15.4 is a stack |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 15 | of protocols for organizing Low-Rate Wireless Personal Area Networks. |
| 16 | |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 17 | The stack is composed of three main parts: |
| 18 | - IEEE 802.15.4 layer; We have chosen to use plain Berkeley socket API, |
Stefan Schmidt | 6bf0d84 | 2016-11-28 18:22:33 +0100 | [diff] [blame] | 19 | the generic Linux networking stack to transfer IEEE 802.15.4 data |
| 20 | messages and a special protocol over netlink for configuration/management |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 21 | - MAC - provides access to shared channel and reliable data delivery |
| 22 | - PHY - represents device drivers |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 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 |
Dmitry Baryshkov | 48a2f11 | 2009-08-07 02:58:39 +0000 | [diff] [blame] | 32 | include/net/af_ieee802154.h header or in the special header |
Lennert Buytenhek | b251d4d | 2015-05-25 15:38:29 +0300 | [diff] [blame] | 33 | in the userspace package (see either http://wpan.cakelab.org/ or the |
| 34 | git tree at https://github.com/linux-wpan/wpan-tools). |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 35 | |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 36 | |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 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 |
Stefan Schmidt | 6bf0d84 | 2016-11-28 18:22:33 +0100 | [diff] [blame] | 42 | exports a management (e.g. MLME) and data API. |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 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 | |
Dmitry Baryshkov | 48a2f11 | 2009-08-07 02:58:39 +0000 | [diff] [blame] | 53 | See the header include/net/ieee802154_netdev.h. You have to implement Linux |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 54 | net_device, with .type = ARPHRD_IEEE802154. Data is exchanged with socket family |
Dmitry Eremin-Solenikov | a0aea57 | 2009-08-19 18:53:39 +0400 | [diff] [blame] | 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 |
Masanari Iida | c17cb8b | 2013-10-30 16:46:15 +0900 | [diff] [blame] | 58 | function. Be aware that this data can be overridden later (when socket code |
Dmitry Eremin-Solenikov | a0aea57 | 2009-08-19 18:53:39 +0400 | [diff] [blame] | 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. |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 61 | |
| 62 | To hook the MLME interface you have to populate the ml_priv field of your |
Werner Almesberger | 56aa091 | 2013-04-04 06:32:35 +0000 | [diff] [blame] | 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. |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 66 | |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 67 | |
| 68 | SoftMAC |
| 69 | ======= |
| 70 | |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 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. |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 78 | |
Lennert Buytenhek | b251d4d | 2015-05-25 15:38:29 +0300 | [diff] [blame] | 79 | See header include/net/mac802154.h and several drivers in |
| 80 | drivers/net/ieee802154/. |
Dmitry Eremin-Solenikov | a0aea57 | 2009-08-19 18:53:39 +0400 | [diff] [blame] | 81 | |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 82 | |
| 83 | Device drivers API |
| 84 | ================== |
| 85 | |
| 86 | The include/net/mac802154.h defines following functions: |
Jian-Hong Pan | 8ac5ac1 | 2017-08-07 00:28:29 +0800 | [diff] [blame] | 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 |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 90 | |
Jian-Hong Pan | 8ac5ac1 | 2017-08-07 00:28:29 +0800 | [diff] [blame] | 91 | - void ieee802154_free_hw(struct ieee802154_hw *hw): |
| 92 | freeing allocated hardware device |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 93 | |
Jian-Hong Pan | 8ac5ac1 | 2017-08-07 00:28:29 +0800 | [diff] [blame] | 94 | - int ieee802154_register_hw(struct ieee802154_hw *hw): |
| 95 | register PHY which is the allocated hardware device, in the system |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 96 | |
Jian-Hong Pan | 8ac5ac1 | 2017-08-07 00:28:29 +0800 | [diff] [blame] | 97 | - void ieee802154_unregister_hw(struct ieee802154_hw *hw): |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 98 | freeing registered PHY |
| 99 | |
| 100 | Moreover IEEE 802.15.4 device operations structure should be filled. |
| 101 | |
| 102 | Fake drivers |
| 103 | ============ |
| 104 | |
Lennert Buytenhek | b251d4d | 2015-05-25 15:38:29 +0300 | [diff] [blame] | 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 |
Stefan Schmidt | 6bf0d84 | 2016-11-28 18:22:33 +0100 | [diff] [blame] | 107 | provides a possibility to test and debug the stack without usage of real hardware. |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 108 | |
Lennert Buytenhek | b251d4d | 2015-05-25 15:38:29 +0300 | [diff] [blame] | 109 | See sources in drivers/net/ieee802154 folder for more details. |
alex.bluesman.smirnov@gmail.com | dd456d4 | 2012-05-15 20:50:31 +0000 | [diff] [blame] | 110 | |
| 111 | |
alex.bluesman.smirnov@gmail.com | 63ce40e | 2011-11-10 07:41:11 +0000 | [diff] [blame] | 112 | 6LoWPAN Linux implementation |
| 113 | ============================ |
| 114 | |
Lennert Buytenhek | b251d4d | 2015-05-25 15:38:29 +0300 | [diff] [blame] | 115 | The IEEE 802.15.4 standard specifies an MTU of 127 bytes, yielding about 80 |
alex.bluesman.smirnov@gmail.com | 63ce40e | 2011-11-10 07:41:11 +0000 | [diff] [blame] | 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 | |
Stefan Schmidt | 6bf0d84 | 2016-11-28 18:22:33 +0100 | [diff] [blame] | 126 | In September 2011 the standard update was published - [RFC6282]. |
alex.bluesman.smirnov@gmail.com | 63ce40e | 2011-11-10 07:41:11 +0000 | [diff] [blame] | 127 | It deprecates HC1 and HC2 compression and defines IPHC encoding format which is |
| 128 | used in this Linux implementation. |
| 129 | |
Lennert Buytenhek | b251d4d | 2015-05-25 15:38:29 +0300 | [diff] [blame] | 130 | All the code related to 6lowpan you may find in files: net/6lowpan/* |
| 131 | and net/ieee802154/6lowpan/* |
alex.bluesman.smirnov@gmail.com | 63ce40e | 2011-11-10 07:41:11 +0000 | [diff] [blame] | 132 | |
Stefan Schmidt | 6bf0d84 | 2016-11-28 18:22:33 +0100 | [diff] [blame] | 133 | To setup a 6LoWPAN interface you need: |
| 134 | 1. Add IEEE802.15.4 interface and set channel and PAN ID; |
alex.bluesman.smirnov@gmail.com | 63ce40e | 2011-11-10 07:41:11 +0000 | [diff] [blame] | 135 | 2. Add 6lowpan interface by command like: |
| 136 | # ip link add link wpan0 name lowpan0 type lowpan |
Stefan Schmidt | 6bf0d84 | 2016-11-28 18:22:33 +0100 | [diff] [blame] | 137 | 3. Bring up 'lowpan0' interface |