Module capsules::ieee802154::xmac [] [src]

[]

X-MAC protocol layer for low power 802.15.4 reception, intended primarily to manage an Atmel RF233 radio.

Original X-MAC paper, on which this implementation is heavily based: http://www.cs.cmu.edu/~andersoe/papers/xmac-sensys.pdf

Nodes using this layer place their radios to sleep for the vast majority of the time, thereby reducing power consumption. Transmitters wake and send a stream of small, strobed preamble packets to the desired recipient. If a receiver wakes and ACKS a relevant preamble, the receiver waits for a data packet before returning to sleep. See comments below for implementation details.

Additional notes:

Usage

This capsule implements the capsules::ieee802154::mac::Mac interface while wrapping an actual kernel::hil::radio::Radio' with a similar interface, and can be used as the backend for acapsules::ieee802154::device::MacDevice`, which should fully encode frames before passing it to this layer.

For imix, I've uploaded a sample main.rs/Xcargo.toml config in a gist that you can find here (current as of 01/28/18). In general, given a radio driver RF233Device, a kernel::hil::time::Alarm, and a kernel::hil::rng::RNG device, the necessary modifications to the board configuration are shown below for imixs:

// Xargo.toml
...
features = ["c", "mem"]
// main.rs

use capsules::ieee802154::mac::Mac;
use capsules::ieee802154::xmac;
type XMacDevice = capsules::ieee802154::xmac::XMac<'static, RF233Device, Alarm>;

// ...
// XMac needs one buffer in addition to those provided to the RF233 driver.
//   1. stores actual packet contents to free the SPI buffers used by the
//      radio for transmitting preamble packets
static mut MAC_BUF: [u8; radio::MAX_BUF_SIZE] = [0x00; radio::MAX_BUF_SIZE];
// ...
let xmac: &XMacDevice = static_init!(XMacDevice, xmac::XMac::new(rf233, alarm, rng));
rng.set_client(xmac);
alarm.set_client(xmac);

// Hook up the radio to the XMAC implementation.
rf233.set_transmit_client(xmac);
rf233.set_receive_client(xmac, &mut RF233_RX_BUF);
rf233.set_power_client(xmac);

xmac.initialize(&mut MAC_BUF);

// We can now use the XMac driver to instantiate a MacDevice like a Framer
let mac_device = static_init!(
    capsules::ieee802154::framer::Framer<'static, XMacDevice>,
    capsules::ieee802154::framer::Framer::new(xmac));
xmac.set_transmit_client(mac_device);
xmac.set_receive_client(mac_device);
xmac.set_config_client(mac_device);

Reexports

use core::cell::Cell;
use ieee802154::mac::Mac;
use kernel::ReturnCode;
use kernel::common::take_cell::TakeCell;
use kernel::hil::radio;
use kernel::hil::rng;
use kernel::hil::rng::RNG;
use kernel::hil::time;
use kernel::hil::time::Alarm;
use kernel::hil::time::Frequency;
use kernel::hil::time::Time;
use net::ieee802154::*;

Structs

XMac
XMacHeaderInfo

Enums

XMacState

Constants

MAX_RX_SLEEP_DELAY_MS
MAX_TX_BACKOFF_MS
PREAMBLE_TX_MS
SLEEP_TIME_MS
WAKE_TIME_MS