Commit | Line | Data |
---|---|---|
02cf2286 SL |
1 | |
2 | Linux IEEE 802.15.4 implementation | |
3 | ||
4 | ||
5 | Introduction | |
6 | ============ | |
c17cb8b5 | 7 | The IEEE 802.15.4 working group focuses on standardization of bottom |
3d9738aa | 8 | two layers: Medium Access Control (MAC) and Physical (PHY). And there |
dd456d45 | 9 | are mainly two options available for upper layers: |
10 | - ZigBee - proprietary protocol from ZigBee Alliance | |
11 | - 6LowPAN - IPv6 networking over low rate personal area networks | |
02cf2286 SL |
12 | |
13 | The Linux-ZigBee project goal is to provide complete implementation | |
dd456d45 | 14 | of IEEE 802.15.4 and 6LoWPAN protocols. IEEE 802.15.4 is a stack |
02cf2286 SL |
15 | of protocols for organizing Low-Rate Wireless Personal Area Networks. |
16 | ||
dd456d45 | 17 | The stack is composed of three main parts: |
18 | - IEEE 802.15.4 layer; We have chosen to use plain Berkeley socket API, | |
19 | the generic Linux networking stack to transfer IEEE 802.15.4 messages | |
20 | and a special protocol over genetlink for configuration/management | |
21 | - MAC - provides access to shared channel and reliable data delivery | |
22 | - PHY - represents device drivers | |
02cf2286 SL |
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 | |
48a2f112 | 32 | include/net/af_ieee802154.h header or in the special header |
02cf2286 SL |
33 | in our userspace package (see either linux-zigbee sourceforge download page |
34 | or git tree at git://linux-zigbee.git.sourceforge.net/gitroot/linux-zigbee). | |
35 | ||
36 | One can use SOCK_RAW for passing raw data towards device xmit function. YMMV. | |
37 | ||
38 | ||
02cf2286 SL |
39 | Kernel side |
40 | ============= | |
41 | ||
42 | Like with WiFi, there are several types of devices implementing IEEE 802.15.4. | |
43 | 1) 'HardMAC'. The MAC layer is implemented in the device itself, the device | |
44 | exports MLME and data API. | |
45 | 2) 'SoftMAC' or just radio. These types of devices are just radio transceivers | |
46 | possibly with some kinds of acceleration like automatic CRC computation and | |
47 | comparation, automagic ACK handling, address matching, etc. | |
48 | ||
49 | Those types of devices require different approach to be hooked into Linux kernel. | |
50 | ||
51 | ||
dd456d45 | 52 | MLME - MAC Level Management |
53 | ============================ | |
54 | ||
55 | Most of IEEE 802.15.4 MLME interfaces are directly mapped on netlink commands. | |
56 | See the include/net/nl802154.h header. Our userspace tools package | |
57 | (see above) provides CLI configuration utility for radio interfaces and simple | |
58 | coordinator for IEEE 802.15.4 networks as an example users of MLME protocol. | |
59 | ||
60 | ||
02cf2286 SL |
61 | HardMAC |
62 | ======= | |
63 | ||
48a2f112 | 64 | See the header include/net/ieee802154_netdev.h. You have to implement Linux |
02cf2286 | 65 | net_device, with .type = ARPHRD_IEEE802154. Data is exchanged with socket family |
a0aea577 DES |
66 | code via plain sk_buffs. On skb reception skb->cb must contain additional |
67 | info as described in the struct ieee802154_mac_cb. During packet transmission | |
68 | the skb->cb is used to provide additional data to device's header_ops->create | |
c17cb8b5 | 69 | function. Be aware that this data can be overridden later (when socket code |
a0aea577 DES |
70 | submits skb to qdisc), so if you need something from that cb later, you should |
71 | store info in the skb->data on your own. | |
02cf2286 SL |
72 | |
73 | To hook the MLME interface you have to populate the ml_priv field of your | |
56aa091d WA |
74 | net_device with a pointer to struct ieee802154_mlme_ops instance. The fields |
75 | assoc_req, assoc_resp, disassoc_req, start_req, and scan_req are optional. | |
76 | All other fields are required. | |
02cf2286 SL |
77 | |
78 | We provide an example of simple HardMAC driver at drivers/ieee802154/fakehard.c | |
79 | ||
80 | ||
81 | SoftMAC | |
82 | ======= | |
83 | ||
dd456d45 | 84 | The MAC is the middle layer in the IEEE 802.15.4 Linux stack. This moment it |
85 | provides interface for drivers registration and management of slave interfaces. | |
86 | ||
87 | NOTE: Currently the only monitor device type is supported - it's IEEE 802.15.4 | |
88 | stack interface for network sniffers (e.g. WireShark). | |
89 | ||
90 | This layer is going to be extended soon. | |
02cf2286 | 91 | |
48a2f112 | 92 | See header include/net/mac802154.h and several drivers in drivers/ieee802154/. |
a0aea577 | 93 | |
dd456d45 | 94 | |
95 | Device drivers API | |
96 | ================== | |
97 | ||
98 | The include/net/mac802154.h defines following functions: | |
99 | - struct ieee802154_dev *ieee802154_alloc_device | |
100 | (size_t priv_size, struct ieee802154_ops *ops): | |
101 | allocation of IEEE 802.15.4 compatible device | |
102 | ||
103 | - void ieee802154_free_device(struct ieee802154_dev *dev): | |
104 | freeing allocated device | |
105 | ||
106 | - int ieee802154_register_device(struct ieee802154_dev *dev): | |
107 | register PHY in the system | |
108 | ||
109 | - void ieee802154_unregister_device(struct ieee802154_dev *dev): | |
110 | freeing registered PHY | |
111 | ||
112 | Moreover IEEE 802.15.4 device operations structure should be filled. | |
113 | ||
114 | Fake drivers | |
115 | ============ | |
116 | ||
117 | In addition there are two drivers available which simulate real devices with | |
118 | HardMAC (fakehard) and SoftMAC (fakelb - IEEE 802.15.4 loopback driver) | |
119 | interfaces. This option provides possibility to test and debug stack without | |
120 | usage of real hardware. | |
121 | ||
122 | See sources in drivers/ieee802154 folder for more details. | |
123 | ||
124 | ||
63ce40e4 | 125 | 6LoWPAN Linux implementation |
126 | ============================ | |
127 | ||
128 | The IEEE 802.15.4 standard specifies an MTU of 128 bytes, yielding about 80 | |
129 | octets of actual MAC payload once security is turned on, on a wireless link | |
130 | with a link throughput of 250 kbps or less. The 6LoWPAN adaptation format | |
131 | [RFC4944] was specified to carry IPv6 datagrams over such constrained links, | |
132 | taking into account limited bandwidth, memory, or energy resources that are | |
133 | expected in applications such as wireless Sensor Networks. [RFC4944] defines | |
134 | a Mesh Addressing header to support sub-IP forwarding, a Fragmentation header | |
135 | to support the IPv6 minimum MTU requirement [RFC2460], and stateless header | |
136 | compression for IPv6 datagrams (LOWPAN_HC1 and LOWPAN_HC2) to reduce the | |
137 | relatively large IPv6 and UDP headers down to (in the best case) several bytes. | |
138 | ||
139 | In Semptember 2011 the standard update was published - [RFC6282]. | |
140 | It deprecates HC1 and HC2 compression and defines IPHC encoding format which is | |
141 | used in this Linux implementation. | |
142 | ||
143 | All the code related to 6lowpan you may find in files: net/ieee802154/6lowpan.* | |
144 | ||
145 | To setup 6lowpan interface you need (busybox release > 1.17.0): | |
146 | 1. Add IEEE802.15.4 interface and initialize PANid; | |
147 | 2. Add 6lowpan interface by command like: | |
148 | # ip link add link wpan0 name lowpan0 type lowpan | |
149 | 3. Set MAC (if needs): | |
150 | # ip link set lowpan0 address de:ad:be:ef:ca:fe:ba:be | |
151 | 4. Bring up 'lowpan0' interface |