| 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 | 
 | 25 | include/net/ieee802154/af_ieee802154.h header or in the special header | 
 | 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. | 
 | 36 | See the include/net/ieee802154/nl802154.h header. Our userspace tools package | 
 | 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 |  | 
 | 57 | See the header include/net/ieee802154/netdevice.h. You have to implement Linux | 
 | 58 | net_device, with .type = ARPHRD_IEEE802154. Data is exchanged with socket family | 
 | 59 | code via plain sk_buffs. The control block of sk_buffs will contain additional | 
 | 60 | info as described in the struct ieee802154_mac_cb. | 
 | 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. All fields are | 
 | 64 | required. | 
 | 65 |  | 
 | 66 | We provide an example of simple HardMAC driver at drivers/ieee802154/fakehard.c | 
 | 67 |  | 
 | 68 |  | 
 | 69 | SoftMAC | 
 | 70 | ======= | 
 | 71 |  | 
 | 72 | We are going to provide intermediate layer impelementing IEEE 802.15.4 MAC | 
 | 73 | in software. This is currently WIP. | 
 | 74 |  | 
 | 75 | See header include/net/ieee802154/mac802154.h and several drivers in | 
 | 76 | drivers/ieee802154/ |