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 | ============ |
| 7 | |
| 8 | The Linux-ZigBee project goal is to provide complete implementation |
| 9 | of IEEE 802.15.4 / ZigBee / 6LoWPAN protocols. IEEE 802.15.4 is a stack |
| 10 | of protocols for organizing Low-Rate Wireless Personal Area Networks. |
| 11 | |
| 12 | Currently only IEEE 802.15.4 layer is implemented. We have choosen |
| 13 | to use plain Berkeley socket API, the generic Linux networking stack |
| 14 | to transfer IEEE 802.15.4 messages and a special protocol over genetlink |
| 15 | for configuration/management |
| 16 | |
| 17 | |
| 18 | Socket API |
| 19 | ========== |
| 20 | |
| 21 | int sd = socket(PF_IEEE802154, SOCK_DGRAM, 0); |
| 22 | ..... |
| 23 | |
| 24 | The address family, socket addresses etc. are defined in the |
Dmitry Baryshkov | 48a2f11 | 2009-08-07 02:58:39 +0000 | [diff] [blame] | 25 | include/net/af_ieee802154.h header or in the special header |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 26 | in our userspace package (see either linux-zigbee sourceforge download page |
| 27 | or git tree at git://linux-zigbee.git.sourceforge.net/gitroot/linux-zigbee). |
| 28 | |
| 29 | One can use SOCK_RAW for passing raw data towards device xmit function. YMMV. |
| 30 | |
| 31 | |
| 32 | MLME - MAC Level Management |
| 33 | ============================ |
| 34 | |
| 35 | Most of IEEE 802.15.4 MLME interfaces are directly mapped on netlink commands. |
Dmitry Baryshkov | 48a2f11 | 2009-08-07 02:58:39 +0000 | [diff] [blame] | 36 | See the include/net/nl802154.h header. Our userspace tools package |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 37 | (see above) provides CLI configuration utility for radio interfaces and simple |
| 38 | coordinator for IEEE 802.15.4 networks as an example users of MLME protocol. |
| 39 | |
| 40 | |
| 41 | Kernel side |
| 42 | ============= |
| 43 | |
| 44 | Like with WiFi, there are several types of devices implementing IEEE 802.15.4. |
| 45 | 1) 'HardMAC'. The MAC layer is implemented in the device itself, the device |
| 46 | exports MLME and data API. |
| 47 | 2) 'SoftMAC' or just radio. These types of devices are just radio transceivers |
| 48 | possibly with some kinds of acceleration like automatic CRC computation and |
| 49 | comparation, automagic ACK handling, address matching, etc. |
| 50 | |
| 51 | Those types of devices require different approach to be hooked into Linux kernel. |
| 52 | |
| 53 | |
| 54 | HardMAC |
| 55 | ======= |
| 56 | |
Dmitry Baryshkov | 48a2f11 | 2009-08-07 02:58:39 +0000 | [diff] [blame] | 57 | 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] | 58 | 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] | 59 | code via plain sk_buffs. On skb reception skb->cb must contain additional |
| 60 | info as described in the struct ieee802154_mac_cb. During packet transmission |
| 61 | the skb->cb is used to provide additional data to device's header_ops->create |
| 62 | function. Be aware, that this data can be overriden later (when socket code |
| 63 | submits skb to qdisc), so if you need something from that cb later, you should |
| 64 | store info in the skb->data on your own. |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 65 | |
| 66 | To hook the MLME interface you have to populate the ml_priv field of your |
| 67 | net_device with a pointer to struct ieee802154_mlme_ops instance. All fields are |
| 68 | required. |
| 69 | |
| 70 | We provide an example of simple HardMAC driver at drivers/ieee802154/fakehard.c |
| 71 | |
| 72 | |
| 73 | SoftMAC |
| 74 | ======= |
| 75 | |
Thadeu Lima de Souza Cascardo | 987b881 | 2009-07-26 12:34:40 -0300 | [diff] [blame] | 76 | We are going to provide intermediate layer implementing IEEE 802.15.4 MAC |
Sergey Lapin | 02cf228 | 2009-06-08 12:18:50 +0000 | [diff] [blame] | 77 | in software. This is currently WIP. |
| 78 | |
Dmitry Baryshkov | 48a2f11 | 2009-08-07 02:58:39 +0000 | [diff] [blame] | 79 | See header include/net/mac802154.h and several drivers in drivers/ieee802154/. |
Dmitry Eremin-Solenikov | a0aea57 | 2009-08-19 18:53:39 +0400 | [diff] [blame] | 80 | |