2009-06-08 12:18:50 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2011-03-31 01:57:33 +00:00
|
|
|
Currently only IEEE 802.15.4 layer is implemented. We have chosen
|
2009-06-08 12:18:50 +00:00
|
|
|
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
|
2009-08-07 02:58:39 +00:00
|
|
|
include/net/af_ieee802154.h header or in the special header
|
2009-06-08 12:18:50 +00:00
|
|
|
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.
|
2009-08-07 02:58:39 +00:00
|
|
|
See the include/net/nl802154.h header. Our userspace tools package
|
2009-06-08 12:18:50 +00:00
|
|
|
(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
|
|
|
|
=======
|
|
|
|
|
2009-08-07 02:58:39 +00:00
|
|
|
See the header include/net/ieee802154_netdev.h. You have to implement Linux
|
2009-06-08 12:18:50 +00:00
|
|
|
net_device, with .type = ARPHRD_IEEE802154. Data is exchanged with socket family
|
2009-08-19 14:53:39 +00:00
|
|
|
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.
|
2009-06-08 12:18:50 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
=======
|
|
|
|
|
2009-07-26 15:34:40 +00:00
|
|
|
We are going to provide intermediate layer implementing IEEE 802.15.4 MAC
|
2009-06-08 12:18:50 +00:00
|
|
|
in software. This is currently WIP.
|
|
|
|
|
2009-08-07 02:58:39 +00:00
|
|
|
See header include/net/mac802154.h and several drivers in drivers/ieee802154/.
|
2009-08-19 14:53:39 +00:00
|
|
|
|
2011-11-10 07:41:11 +00:00
|
|
|
6LoWPAN Linux implementation
|
|
|
|
============================
|
|
|
|
|
|
|
|
The IEEE 802.15.4 standard specifies an MTU of 128 bytes, yielding about 80
|
|
|
|
octets of actual MAC payload once security is turned on, on a wireless link
|
|
|
|
with a link throughput of 250 kbps or less. The 6LoWPAN adaptation format
|
|
|
|
[RFC4944] was specified to carry IPv6 datagrams over such constrained links,
|
|
|
|
taking into account limited bandwidth, memory, or energy resources that are
|
|
|
|
expected in applications such as wireless Sensor Networks. [RFC4944] defines
|
|
|
|
a Mesh Addressing header to support sub-IP forwarding, a Fragmentation header
|
|
|
|
to support the IPv6 minimum MTU requirement [RFC2460], and stateless header
|
|
|
|
compression for IPv6 datagrams (LOWPAN_HC1 and LOWPAN_HC2) to reduce the
|
|
|
|
relatively large IPv6 and UDP headers down to (in the best case) several bytes.
|
|
|
|
|
|
|
|
In Semptember 2011 the standard update was published - [RFC6282].
|
|
|
|
It deprecates HC1 and HC2 compression and defines IPHC encoding format which is
|
|
|
|
used in this Linux implementation.
|
|
|
|
|
|
|
|
All the code related to 6lowpan you may find in files: net/ieee802154/6lowpan.*
|
|
|
|
|
|
|
|
To setup 6lowpan interface you need (busybox release > 1.17.0):
|
|
|
|
1. Add IEEE802.15.4 interface and initialize PANid;
|
|
|
|
2. Add 6lowpan interface by command like:
|
|
|
|
# ip link add link wpan0 name lowpan0 type lowpan
|
|
|
|
3. Set MAC (if needs):
|
|
|
|
# ip link set lowpan0 address de:ad:be:ef:ca:fe:ba:be
|
|
|
|
4. Bring up 'lowpan0' interface
|