Commit | Line | Data |
---|---|---|
02cf2286 SL |
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 | |
48a2f112 | 25 | include/net/af_ieee802154.h header or in the special header |
02cf2286 SL |
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. | |
48a2f112 | 36 | See the include/net/nl802154.h header. Our userspace tools package |
02cf2286 SL |
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 | ||
48a2f112 | 57 | See the header include/net/ieee802154_netdev.h. You have to implement Linux |
02cf2286 | 58 | net_device, with .type = ARPHRD_IEEE802154. Data is exchanged with socket family |
a0aea577 DES |
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. | |
02cf2286 SL |
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 | ||
987b8816 | 76 | We are going to provide intermediate layer implementing IEEE 802.15.4 MAC |
02cf2286 SL |
77 | in software. This is currently WIP. |
78 | ||
48a2f112 | 79 | See header include/net/mac802154.h and several drivers in drivers/ieee802154/. |
a0aea577 | 80 |