| |
| Linux IEEE 802.15.4 implementation |
| |
| |
| Introduction |
| ============ |
| |
| The Linux-ZigBee project goal is to provide complete implementation |
| of IEEE 802.15.4 / ZigBee / 6LoWPAN protocols. IEEE 802.15.4 is a stack |
| of protocols for organizing Low-Rate Wireless Personal Area Networks. |
| |
| Currently only IEEE 802.15.4 layer is implemented. We have chosen |
| to use plain Berkeley socket API, the generic Linux networking stack |
| to transfer IEEE 802.15.4 messages and a special protocol over genetlink |
| for configuration/management |
| |
| |
| Socket API |
| ========== |
| |
| int sd = socket(PF_IEEE802154, SOCK_DGRAM, 0); |
| ..... |
| |
| The address family, socket addresses etc. are defined in the |
| include/net/af_ieee802154.h header or in the special header |
| in our userspace package (see either linux-zigbee sourceforge download page |
| or git tree at git://linux-zigbee.git.sourceforge.net/gitroot/linux-zigbee). |
| |
| One can use SOCK_RAW for passing raw data towards device xmit function. YMMV. |
| |
| |
| MLME - MAC Level Management |
| ============================ |
| |
| Most of IEEE 802.15.4 MLME interfaces are directly mapped on netlink commands. |
| See the include/net/nl802154.h header. Our userspace tools package |
| (see above) provides CLI configuration utility for radio interfaces and simple |
| coordinator for IEEE 802.15.4 networks as an example users of MLME protocol. |
| |
| |
| Kernel side |
| ============= |
| |
| Like with WiFi, there are several types of devices implementing IEEE 802.15.4. |
| 1) 'HardMAC'. The MAC layer is implemented in the device itself, the device |
| exports MLME and data API. |
| 2) 'SoftMAC' or just radio. These types of devices are just radio transceivers |
| possibly with some kinds of acceleration like automatic CRC computation and |
| comparation, automagic ACK handling, address matching, etc. |
| |
| Those types of devices require different approach to be hooked into Linux kernel. |
| |
| |
| HardMAC |
| ======= |
| |
| See the header include/net/ieee802154_netdev.h. You have to implement Linux |
| net_device, with .type = ARPHRD_IEEE802154. Data is exchanged with socket family |
| code via plain sk_buffs. On skb reception skb->cb must contain additional |
| info as described in the struct ieee802154_mac_cb. During packet transmission |
| the skb->cb is used to provide additional data to device's header_ops->create |
| function. Be aware, that this data can be overriden later (when socket code |
| submits skb to qdisc), so if you need something from that cb later, you should |
| store info in the skb->data on your own. |
| |
| To hook the MLME interface you have to populate the ml_priv field of your |
| net_device with a pointer to struct ieee802154_mlme_ops instance. All fields are |
| required. |
| |
| We provide an example of simple HardMAC driver at drivers/ieee802154/fakehard.c |
| |
| |
| SoftMAC |
| ======= |
| |
| We are going to provide intermediate layer implementing IEEE 802.15.4 MAC |
| in software. This is currently WIP. |
| |
| See header include/net/mac802154.h and several drivers in drivers/ieee802154/. |
| |