mirror of
https://github.com/apache/nuttx.git
synced 2026-06-04 23:03:27 +08:00
1751 lines
54 KiB
C
1751 lines
54 KiB
C
/****************************************************************************
|
|
* include/nuttx/wireless/ieee802154/ieee802154_mac.h
|
|
*
|
|
* Copyright (C) 2016 Sebastien Lorquet. All rights reserved.
|
|
* Copyright (C) 2017 Verge Inc. All rights reserved.
|
|
*
|
|
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
|
|
* Author: Anthony Merlino <anthony@vergeaero.com>
|
|
*
|
|
* The naming and comments for various fields are taken directly
|
|
* from the IEEE 802.15.4 2011 standard.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
* 3. Neither the name NuttX nor the names of its contributors may be
|
|
* used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __INCLUDE_NUTTX_WIRELESS_IEEE802154_IEEE802154_MAC_H
|
|
#define __INCLUDE_NUTTX_WIRELESS_IEEE802154_IEEE802154_MAC_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
#ifdef CONFIG_NET_6LOWPAN
|
|
# include <net/if.h>
|
|
#endif
|
|
|
|
#include <nuttx/fs/ioctl.h>
|
|
|
|
/****************************************************************************
|
|
* Pre-Processor Definitions
|
|
****************************************************************************/
|
|
/* Configuration ************************************************************/
|
|
|
|
#if !defined(CONFIG_MAC802154_NPANDESC) || CONFIG_MAC802154_NPANDESC <= 0
|
|
# undef CONFIG_MAC802154_NPANDESC
|
|
# define CONFIG_MAC802154_NPANDESC 5
|
|
#endif
|
|
|
|
#define MAC802154_NPANDESC CONFIG_MAC802154_NPANDESC
|
|
|
|
/* IEEE 802.15.4 address macros */
|
|
/* Copy a an IEEE 802.15.4 address */
|
|
|
|
#define IEEE802154_ANYADDRCOPY(dest,src,len) \
|
|
memcpy(dest, src, len)
|
|
|
|
#define IEEE802154_PANIDCOPY(dest,src) \
|
|
IEEE802154_ANYADDRCOPY(dest,src,IEEE802154_PANIDSIZE)
|
|
|
|
#define IEEE802154_SADDRCOPY(dest,src) \
|
|
IEEE802154_ANYADDRCOPY(dest,src,IEEE802154_SADDRSIZE)
|
|
|
|
#define IEEE802154_EADDRCOPY(dest,src) \
|
|
IEEE802154_ANYADDRCOPY(dest,src,IEEE802154_EADDRSIZE)
|
|
|
|
/* Compare two IEEE 802.15.4 addresses */
|
|
|
|
#define IEEE802154_ANYADDRCMP(addr1,addr2,len) \
|
|
(memcmp(addr1, addr2, len) == 0)
|
|
|
|
#define IEEE802154_PANIDCMP(addr1,addr2) \
|
|
IEEE802154_ANYADDRCMP(addr1,addr2,IEEE802154_PANIDSIZE)
|
|
|
|
#define IEEE802154_SADDRCMP(addr1,addr2) \
|
|
IEEE802154_ANYADDRCMP(addr1,addr2,IEEE802154_SADDRSIZE)
|
|
|
|
#define IEEE802154_EADDRCMP(addr1,addr2) \
|
|
IEEE802154_ANYADDRCMP(addr1,addr2,IEEE802154_EADDRSIZE)
|
|
|
|
/* Some addresses */
|
|
|
|
#define IEEE802154_PANID_UNSPEC ((uint8_t[]){0xFF,0xFF})
|
|
#define IEEE802154_SADDR_UNSPEC ((uint8_t[]){0xFF,0xFF})
|
|
#define IEEE802154_SADDR_BCAST ((uint8_t[]){0xFE,0xFF})
|
|
#define IEEE802154_EADDR_UNSPEC ((uint8_t[]){0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF})
|
|
|
|
|
|
/* IEEE 802.15.4 MAC Character Driver IOCTL Commands ************************/
|
|
|
|
/* The IEEE 802.15.4 standard specifies a MLME Service Access Point (SAP)
|
|
* including a series of primitives that are used as an interface between
|
|
* the MLME and the next highest layer. There are 4 types of primitives:
|
|
*
|
|
* - Request
|
|
* - Indication
|
|
* - Response
|
|
* - Confirm
|
|
*
|
|
* Of these, Request and Response primitives are sent from the next highest
|
|
* layer to the MLME. Indication and Confirm primitives are used to notify the
|
|
* next highest layer of changes or actions that have taken place.
|
|
*
|
|
* The MAC802154 character driver exposed here provides IOCTL hooks for all
|
|
* Request and Response primitives.
|
|
*/
|
|
|
|
#define MAC802154IOC_MLME_ASSOC_REQUEST _MAC802154IOC(0x0003)
|
|
#define MAC802154IOC_MLME_ASSOC_RESPONSE _MAC802154IOC(0x0004)
|
|
#define MAC802154IOC_MLME_DISASSOC_REQUEST _MAC802154IOC(0x0005)
|
|
#define MAC802154IOC_MLME_GET_REQUEST _MAC802154IOC(0x0006)
|
|
#define MAC802154IOC_MLME_GTS_REQUEST _MAC802154IOC(0x0007)
|
|
#define MAC802154IOC_MLME_ORPHAN_RESPONSE _MAC802154IOC(0x0008)
|
|
#define MAC802154IOC_MLME_RESET_REQUEST _MAC802154IOC(0x0009)
|
|
#define MAC802154IOC_MLME_RXENABLE_REQUEST _MAC802154IOC(0x000A)
|
|
#define MAC802154IOC_MLME_SCAN_REQUEST _MAC802154IOC(0x000B)
|
|
#define MAC802154IOC_MLME_SET_REQUEST _MAC802154IOC(0x000C)
|
|
#define MAC802154IOC_MLME_START_REQUEST _MAC802154IOC(0x000D)
|
|
#define MAC802154IOC_MLME_SYNC_REQUEST _MAC802154IOC(0x000E)
|
|
#define MAC802154IOC_MLME_POLL_REQUEST _MAC802154IOC(0x000F)
|
|
#define MAC802154IOC_MLME_DPS_REQUEST _MAC802154IOC(0x0010)
|
|
#define MAC802154IOC_MLME_SOUNDING_REQUEST _MAC802154IOC(0x0011)
|
|
#define MAC802154IOC_MLME_CALIBRATE_REQUEST _MAC802154IOC(0x0012)
|
|
|
|
/* IEEE 802.15.4 MAC Interface **********************************************/
|
|
|
|
/* Frame control field masks, 2 bytes
|
|
* Seee IEEE 802.15.4/2011 5.2.1.1 page 57
|
|
*/
|
|
|
|
#define IEEE802154_FRAMECTRL_FTYPE 0x0007 /* Frame type, bits 0-2 */
|
|
#define IEEE802154_FRAMECTRL_SEC 0x0008 /* Security Enabled, bit 3 */
|
|
#define IEEE802154_FRAMECTRL_PEND 0x0010 /* Frame pending, bit 4 */
|
|
#define IEEE802154_FRAMECTRL_ACKREQ 0x0020 /* Acknowledge request, bit 5 */
|
|
#define IEEE802154_FRAMECTRL_PANIDCOMP 0x0040 /* PAN ID Compression, bit 6 */
|
|
#define IEEE802154_FRAMECTRL_DADDR 0x0C00 /* Dest addressing mode, bits 10-11 */
|
|
#define IEEE802154_FRAMECTRL_VERSION 0x3000 /* Source addressing mode, bits 12-13 */
|
|
#define IEEE802154_FRAMECTRL_SADDR 0xC000 /* Source addressing mode, bits 14-15 */
|
|
|
|
#define IEEE802154_FRAMECTRL_SHIFT_FTYPE 0 /* Frame type, bits 0-2 */
|
|
#define IEEE802154_FRAMECTRL_SHIFT_SEC 3 /* Security Enabled, bit 3 */
|
|
#define IEEE802154_FRAMECTRL_SHIFT_PEND 4 /* Frame pending, bit 4 */
|
|
#define IEEE802154_FRAMECTRL_SHIFT_ACKREQ 5 /* Acknowledge request, bit 5 */
|
|
#define IEEE802154_FRAMECTRL_SHIFT_PANIDCOMP 6 /* PAN ID Compression, bit 6 */
|
|
#define IEEE802154_FRAMECTRL_SHIFT_DADDR 10 /* Dest addressing mode, bits 10-11 */
|
|
#define IEEE802154_FRAMECTRL_SHIFT_VERSION 12 /* Source addressing mode, bits 12-13 */
|
|
#define IEEE802154_FRAMECTRL_SHIFT_SADDR 14 /* Source addressing mode, bits 14-15 */
|
|
|
|
/* Superframe Specification field masks, 2 bytes
|
|
* Seee IEEE 802.15.4/2011 5.2.2.1.2 page 62
|
|
*/
|
|
|
|
#define IEEE802154_SFSPEC_BEACONORDER 0x000F /* Beacon order, bits 0-3 */
|
|
#define IEEE802154_SFSPEC_SFORDER 0x00F0 /* Superframe Order, bit 4-7 */
|
|
#define IEEE802154_SFSPEC_FINCAPSLOT 0x0F00 /* Final CAP Slot, bit 8-11 */
|
|
#define IEEE802154_SFSPEC_BLE 0x1000 /* Battery Life Ext, bit 12 */
|
|
#define IEEE802154_SFSPEC_PANCOORD 0x4000 /* PAN Coordinator, bit 14 */
|
|
#define IEEE802154_SFSPEC_ASSOCPERMIT 0x8000 /* Association Permit, bit 15 */
|
|
|
|
#define IEEE802154_SFSPEC_SHIFT_BEACONORDER 0 /* Beacon order, bits 0-3 */
|
|
#define IEEE802154_SFSPEC_SHIFT_SFORDER 4 /* Superframe order, bit 4-7 */
|
|
#define IEEE802154_SFSPEC_SHIFT_FINCAPSLOT 8 /* Final CAP Slot, bit 8-11 */
|
|
#define IEEE802154_SFSPEC_SHIFT_BLE 12 /* Battery Life Ext, bit 12 */
|
|
#define IEEE802154_SFSPEC_SHIFT_PANCOORD 14 /* PAN Coordinator, bit 14 */
|
|
#define IEEE802154_SFSPEC_SHIFT_ASSOCPERMIT 15 /* Association Permit, bit 15 */
|
|
|
|
/* GTS Specification field masks, 1 byte
|
|
* Seee IEEE 802.15.4/2011 5.2.2.1.3 page 63
|
|
*/
|
|
|
|
#define IEEE802154_GTSSPEC_DESCCOUNT 0x07 /* GTS Desc. count, bits 0-2 */
|
|
#define IEEE802154_GTSSPEC_PERMIT 0x80 /* GTS Desc. count, bit 7 */
|
|
|
|
#define IEEE802154_GTSSPEC_SHIFT_DESCCOUNT 0 /* GTS Desc. count, bits 0-2 */
|
|
#define IEEE802154_GTSSPEC_SHIFT_PERMIT 7 /* GTS Desc. count, bit 7 */
|
|
|
|
/* GTS Directions field masks, 1 byte
|
|
* Seee IEEE 802.15.4/2011 5.2.2.1.3 page 63
|
|
*/
|
|
|
|
#define IEEE802154_GTSDIR_MASK 0x7F /* GTS Directions Mask, bits 0-6 */
|
|
|
|
#define IEEE802154_GTSDIR_SHIFT_MASK 0 /* GTS Directions Mask, bits 0-6 */
|
|
|
|
/* Pending address specifications field masks, 1 byte
|
|
* See IEEE 802.15.4/2011 5.2.2.1.6 page 64
|
|
*/
|
|
|
|
#define IEEE802154_PENDADDR_NSADDR 0x07 /* # of short addresses, bits 0-2 */
|
|
#define IEEE802154_PENDADDR_NEADDR 0x70 /* # of extended addresses, bits 4-6 */
|
|
|
|
#define IEEE802154_PENDADDR_SHIFT_NSADDR 0 /* # of short addresses, bits 0-2 */
|
|
#define IEEE802154_PENDADDR_SHIFT_NEADDR 4 /* # of extended addresses, bits 4-6 */
|
|
|
|
/* Capability Information Bitfield
|
|
*/
|
|
|
|
#define IEEE802154_CAPABILITY_DEVTYPE 0x02
|
|
#define IEEE802154_CAPABILITY_PWRSRC 0x04
|
|
#define IEEE802154_CAPABILITY_RXONIDLE 0x08
|
|
#define IEEE802154_CAPABILITY_SECURITY 0x40
|
|
#define IEEE802154_CAPABILITY_ALLOCADDR 0x80
|
|
|
|
#define IEEE802154_CAPABILITY_SHIFT_DEVTYPE 1
|
|
#define IEEE802154_CAPABILITY_SHIFT_PWRSRC 2
|
|
#define IEEE802154_CAPABILITY_SHIFT_RXONIDLE 3
|
|
#define IEEE802154_CAPABILITY_SHIFT_SECURITY 6
|
|
#define IEEE802154_CAPABILITY_SHIFT_ALLOCADDR 7
|
|
|
|
/* IEEE 802.15.4 PHY constants */
|
|
|
|
#define IEEE802154_MAX_PHY_PACKET_SIZE 127
|
|
#define IEEE802154_TURN_AROUND_TIME 12 /*symbol periods*/
|
|
|
|
/* IEEE 802.15.4 MAC constants */
|
|
|
|
#define IEEE802154_BASE_SLOT_DURATION 60
|
|
#define IEEE802154_NUM_SUPERFRAME_SLOTS 16
|
|
|
|
#define IEEE802154_BASE_SUPERFRAME_DURATION \
|
|
(IEEE802154_BASE_SLOT_DURATION * IEEE802154_NUM_SUPERFRAME_SLOTS)
|
|
|
|
#define IEEE802154_GTS_DESC_PERSISTENCE_TIME 4
|
|
#define IEEE802154_MAX_BEACON_OVERHEAD 75
|
|
|
|
#define IEEE802154_MAX_BEACON_PAYLOAD_LEN \
|
|
(IEEE802154_MAX_PHY_PACKET_SIZE - IEEE802154_MAX_BEACON_OVERHEAD)
|
|
|
|
#define IEEE802154_MAX_LOST_BEACONS 4
|
|
#define IEEE802154_MIN_MPDU_OVERHEAD 9
|
|
#define IEEE802154_MAX_UNSEC_MHR_OVERHEAD 23
|
|
#define IEEE802154_MFR_LENGTH 2
|
|
|
|
#define IEEE802154_MAX_MPDU_UNSEC_OVERHEAD \
|
|
(IEEE802154_MAX_UNSEC_MHR_OVERHEAD + IEEE802154_MFR_LENGTH)
|
|
|
|
#define IEEE802154_MAX_SAFE_MAC_PAYLOAD_SIZE \
|
|
(IEEE802154_MAX_PHY_PACKET_SIZE - IEEE802154_MAX_MPDU_UNSEC_OVERHEAD)
|
|
|
|
#define IEEE802154_MAX_MAC_PAYLOAD_SIZE \
|
|
(IEEE802154_MAX_PHY_PACKET_SIZE - IEEE802154_MIN_MPDU_OVERHEAD)
|
|
|
|
#define IEEE802154_MAX_SIFS_FRAME_SIZE 18
|
|
#define IEEE802154_MIN_CAP_LENGTH 440
|
|
#define IEEE802154_UNIT_BACKOFF_PERIOD 20
|
|
|
|
/* IEEE 802.15.4 MAC PIB Attribut Defaults */
|
|
|
|
/* Definitions used by IOCTL calls */
|
|
|
|
#define MAX_ORPHAN_ADDR 32 /* REVISIT */
|
|
|
|
/****************************************************************************
|
|
* Public Types
|
|
****************************************************************************/
|
|
|
|
/* IEEE 802.15.4 MAC status codes */
|
|
|
|
enum ieee802154_status_e
|
|
{
|
|
/* This first section of enums is defined in the standard. [1] pg. 70
|
|
* They must be in this order
|
|
*/
|
|
|
|
IEEE802154_STATUS_SUCCESS = 0,
|
|
IEEE802154_STATUS_OUT_OF_CAPACITY,
|
|
IEEE802154_STATUS_DENIED,
|
|
|
|
/* As of now, all values below do not have a specific value defined in the
|
|
* standard
|
|
*/
|
|
|
|
IEEE802154_STATUS_FAILURE, /* This value is not outlined in the standard. It
|
|
* is a catch-all for any failures that are not
|
|
* outlined in the standard
|
|
*/
|
|
|
|
IEEE802154_STATUS_BEACON_LOSS,
|
|
IEEE802154_STATUS_CHANNEL_ACCESS_FAILURE,
|
|
IEEE802154_STATUS_DISABLE_TRX_FAILURE,
|
|
IEEE802154_STATUS_FAILED_SECURITY_CHECK,
|
|
IEEE802154_STATUS_FRAME_TOO_LONG,
|
|
IEEE802154_STATUS_INVALID_GTS,
|
|
IEEE802154_STATUS_INVALID_HANDLE,
|
|
IEEE802154_STATUS_INVALID_PARAMETER,
|
|
IEEE802154_STATUS_NO_ACK,
|
|
IEEE802154_STATUS_NO_BEACON,
|
|
IEEE802154_STATUS_NO_DATA,
|
|
IEEE802154_STATUS_NO_SHORT_ADDRESS,
|
|
IEEE802154_STATUS_PAN_ID_CONFLICT,
|
|
IEEE802154_STATUS_REALIGNMENT,
|
|
IEEE802154_STATUS_TRANSACTION_EXPIRED,
|
|
IEEE802154_STATUS_TRANSACTION_OVERFLOW,
|
|
IEEE802154_STATUS_TX_ACTIVE,
|
|
IEEE802154_STATUS_UNAVAILABLE_KEY,
|
|
IEEE802154_STATUS_UNSUPPORTED_ATTRIBUTE,
|
|
IEEE802154_STATUS_LIMITREACHED,
|
|
};
|
|
|
|
static const char *IEEE802154_STATUS_STRING[] =
|
|
{
|
|
"Success",
|
|
"Out of capacity",
|
|
"Denied",
|
|
"Failure",
|
|
"Beacon loss",
|
|
"Channel access failure",
|
|
"Disable TRX failure",
|
|
"Failed security check",
|
|
"Frame too long",
|
|
"Invalid GTS",
|
|
"Invalid handle",
|
|
"Invalid parameter",
|
|
"No ack",
|
|
"No beacon",
|
|
"No data",
|
|
"No short address",
|
|
"PAN ID conflict",
|
|
"Realignment",
|
|
"Transaction expired",
|
|
"Transaction overflow",
|
|
"Tx active",
|
|
"Unavailable key",
|
|
"Unsupported attribute",
|
|
"Limit reached",
|
|
};
|
|
|
|
/* IEEE 802.15.4 PHY/MAC PIB attributes IDs */
|
|
|
|
enum ieee802154_attr_e
|
|
{
|
|
/* PHY PIB Attributes */
|
|
|
|
IEEE802154_ATTR_PHY_CHAN = 0x00,
|
|
IEEE802154_ATTR_PHY_CHANNELS_SUPPORTED,
|
|
IEEE802154_ATTR_PHY_TX_POWER_TOLERANCE,
|
|
IEEE802154_ATTR_PHY_TX_POWER,
|
|
IEEE802154_ATTR_PHY_CCA_MODE,
|
|
IEEE802154_ATTR_PHY_CURRENT_PAGE,
|
|
IEEE802154_ATTR_PHY_MAX_FRAME_DURATION,
|
|
IEEE802154_ATTR_PHY_SHR_DURATION,
|
|
IEEE802154_ATTR_PHY_SYM_PER_OCTET,
|
|
IEEE802154_ATTR_PHY_PREAMBLE_SYM_LEN,
|
|
IEEE802154_ATTR_PHY_UWB_DATARATES_SUP,
|
|
IEEE802154_ATTR_PHY_CSS_LOW_DATARATE_SUP,
|
|
IEEE802154_ATTR_PHY_UWB_COU_PULSES_SUP,
|
|
IEEE802154_ATTR_PHY_UWB_CS_PULSES_SUP,
|
|
IEEE802154_ATTR_PHY_UWB_LCP_PULSES_SUP,
|
|
IEEE802154_ATTR_PHY_UWB_CURR_PULSE_SHAPE,
|
|
IEEE802154_ATTR_PHY_UWB_COU_PULSE,
|
|
IEEE802154_ATTR_PHY_UWB_CS_PULSE,
|
|
IEEE802154_ATTR_PHY_UWB_LCP_WEIGHT1,
|
|
IEEE802154_ATTR_PHY_UWB_LCP_WEIGHT2,
|
|
IEEE802154_ATTR_PHY_UWB_LCP_WEIGHT3,
|
|
IEEE802154_ATTR_PHY_UWB_LCP_WEIGHT4,
|
|
IEEE802154_ATTR_PHY_UWB_LCP_DELAY2,
|
|
IEEE802154_ATTR_PHY_UWB_LCP_DELAY3,
|
|
IEEE802154_ATTR_PHY_UWB_LCP_DELAY4,
|
|
IEEE802154_ATTR_PHY_RANGING,
|
|
IEEE802154_ATTR_PHY_RANGING_CRYSTAL_OFFSET,
|
|
IEEE802154_ATTR_PHY_RANGING_DPS,
|
|
IEEE802154_ATTR_PHY_CURRENT_CODE,
|
|
IEEE802154_ATTR_PHY_NATIVE_PRF,
|
|
IEEE802154_ATTR_PHY_UWB_SCAN_BINS_PER_CHAN,
|
|
IEEE802154_ATTR_PHY_UWB_INS_PREAMBLE_INTERVAL,
|
|
IEEE802154_ATTR_PHY_UWB_TX_RMARKER,
|
|
IEEE802154_ATTR_PHY_UWB_RX_RMARKER,
|
|
IEEE802154_ATTR_PHY_RFRAME_PROC_TIME,
|
|
IEEE802154_ATTR_PHY_CCA_DURATION,
|
|
IEEE802154_ATTR_PHY_SYMBOL_DURATION, /* Non-standard attribute */
|
|
|
|
/* MAC PIB Attributes */
|
|
|
|
IEEE802154_ATTR_MAC_EADDR = 0x40,
|
|
IEEE802154_ATTR_MAC_ACK_WAIT_DUR,
|
|
IEEE802154_ATTR_MAC_ASSOCIATED_PANCOORD,
|
|
IEEE802154_ATTR_MAC_ASSOCIATION_PERMIT,
|
|
IEEE802154_ATTR_MAC_AUTO_REQUEST,
|
|
IEEE802154_ATTR_MAC_BATT_LIFE_EXT,
|
|
IEEE802154_ATTR_MAC_BATT_LIFE_EXT_PERIODS,
|
|
IEEE802154_ATTR_MAC_BEACON_PAYLOAD,
|
|
IEEE802154_ATTR_MAC_BEACON_PAYLOAD_LEN,
|
|
IEEE802154_ATTR_MAC_BEACON_ORDER,
|
|
IEEE802154_ATTR_MAC_BEACON_TX_TIME,
|
|
IEEE802154_ATTR_MAC_BSN,
|
|
IEEE802154_ATTR_MAC_COORD_EADDR,
|
|
IEEE802154_ATTR_MAC_COORD_SADDR,
|
|
IEEE802154_ATTR_MAC_DSN,
|
|
IEEE802154_ATTR_MAC_GTS_PERMIT,
|
|
IEEE802154_ATTR_MAC_MAX_BE,
|
|
IEEE802154_ATTR_MAC_MAX_CSMA_BACKOFFS,
|
|
IEEE802154_ATTR_MAC_MAX_FRAME_WAITTIME,
|
|
IEEE802154_ATTR_MAC_MAX_FRAME_RETRIES,
|
|
IEEE802154_ATTR_MAC_MIN_BE,
|
|
IEEE802154_ATTR_MAC_LIFS_PERIOD,
|
|
IEEE802154_ATTR_MAC_SIFS_PERIOD,
|
|
IEEE802154_ATTR_MAC_PANID,
|
|
IEEE802154_ATTR_MAC_PROMISCUOUS_MODE,
|
|
IEEE802154_ATTR_MAC_RANGING_SUPPORT,
|
|
IEEE802154_ATTR_MAC_RESPONSE_WAIT_TIME,
|
|
IEEE802154_ATTR_MAC_RX_ON_WHEN_IDLE,
|
|
IEEE802154_ATTR_MAC_SECURITY_ENABLED,
|
|
IEEE802154_ATTR_MAC_SADDR,
|
|
IEEE802154_ATTR_MAC_SUPERFRAME_ORDER,
|
|
IEEE802154_ATTR_MAC_SYNC_SYMBOL_OFFSET,
|
|
IEEE802154_PIB_MAC_TIMESTAMP_SUPPORT,
|
|
IEEE802154_PIB_MAC_TRANSACTION_PERSIST_TIME,
|
|
IEEE802154_PIB_MAC_TX_CTRL_ACTIVE_DUR,
|
|
IEEE802154_PIB_MAC_TX_CTRL_PAUSE_DUR,
|
|
IEEE802154_PIB_MAC_TX_TOTAL_DUR,
|
|
IEEE802154_ATTR_MAC_DEVMODE, /* Non-standard */
|
|
|
|
/* MAC Security Attributes */
|
|
|
|
IEEE802154_PIB_MAC_KEY_TABLE = 0x70,
|
|
IEEE802154_PIB_MAC_DEV_TABLE,
|
|
IEEE802154_PIB_MAC_SEC_LVL_TABLE,
|
|
IEEE802154_PIB_MAC_FRAME_COUNTER,
|
|
IEEE802154_PIB_MAC_AUTOREQ_SEC_LVL,
|
|
IEEE802154_PIB_MAC_AUTOREQ_KEY_ID_MODE,
|
|
IEEE802154_PIB_MAC_AUTOREQ_KEY_SOURCE,
|
|
IEEE802154_PIB_MAC_AUTOREQ_KEY_INDEX,
|
|
IEEE802154_PIB_MAC_DEFAULT_KEY_SRC,
|
|
IEEE802154_PIB_MAC_PANCOORD_EXT_ADDR,
|
|
IEEE802154_PIB_MAC_PANCOORD_SHORT_ADDR,
|
|
};
|
|
|
|
/* Frame Type */
|
|
|
|
enum ieee802154_frametype_e
|
|
{
|
|
IEEE802154_FRAME_BEACON = 0,
|
|
IEEE802154_FRAME_DATA,
|
|
IEEE802154_FRAME_ACK,
|
|
IEEE802154_FRAME_COMMAND
|
|
};
|
|
|
|
/* MAC command IDs */
|
|
/* TODO: Change terminology to be "current primitive" */
|
|
|
|
enum ieee802154_cmdid_e
|
|
{
|
|
IEEE802154_CMD_ASSOC_REQ = 1,
|
|
IEEE802154_CMD_ASSOC_RESP,
|
|
IEEE802154_CMD_DISASSOC_NOT,
|
|
IEEE802154_CMD_DATA_REQ,
|
|
IEEE802154_CMD_PANID_CONF_NOT,
|
|
IEEE802154_CMD_ORPHAN_NOT,
|
|
IEEE802154_CMD_BEACON_REQ,
|
|
IEEE802154_CMD_COORD_REALIGN,
|
|
IEEE802154_CMD_GTS_REQ,
|
|
};
|
|
|
|
enum ieee802154_devmode_e
|
|
{
|
|
IEEE802154_DEVMODE_ENDPOINT = 0x00,
|
|
IEEE802154_DEVMODE_COORD,
|
|
IEEE802154_DEVMODE_PANCOORD
|
|
};
|
|
|
|
#define IEEE802154_PANIDSIZE 2
|
|
#define IEEE802154_SADDRSIZE 2
|
|
#define IEEE802154_EADDRSIZE 8
|
|
|
|
/* IEEE 802.15.4 Device address
|
|
* The addresses in ieee802154 have several formats:
|
|
* No address : [none]
|
|
* Short address + PAN id : PPPP/SSSS
|
|
* Extended address + PAN id : PPPP/LLLLLLLLLLLLLLLL
|
|
*/
|
|
|
|
enum ieee802154_addrmode_e
|
|
{
|
|
IEEE802154_ADDRMODE_NONE = 0,
|
|
IEEE802154_ADDRMODE_SHORT = 2,
|
|
IEEE802154_ADDRMODE_EXTENDED
|
|
|
|
/* TODO: Add a IEEE802154_ADDRMODE_ANY setting for structs where both the
|
|
* extended and short addresses are safe to use.
|
|
*/
|
|
};
|
|
|
|
struct ieee802154_addr_s
|
|
{
|
|
/* Address mode. Short or Extended */
|
|
|
|
enum ieee802154_addrmode_e mode;
|
|
|
|
uint8_t panid[IEEE802154_PANIDSIZE]; /* PAN identifier */
|
|
uint8_t saddr[IEEE802154_SADDRSIZE]; /* short address */
|
|
uint8_t eaddr[IEEE802154_EADDRSIZE]; /* extended address */
|
|
};
|
|
|
|
#define IEEE802154_ADDRSTRLEN 22 /* (2*2+1+8*2, PPPP/EEEEEEEEEEEEEEEE) */
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
struct ieee802154_security_s
|
|
{
|
|
uint8_t level; /* Security level to be used */
|
|
uint8_t key_id_mode; /* Mode used to identify the key to be used */
|
|
uint8_t key_source[8]; /* Originator of the key to be used */
|
|
uint8_t key_index; /* Index of the key to be used */
|
|
};
|
|
#endif
|
|
|
|
#ifdef CONFIG_IEEE802154_UWB
|
|
enum ieee802154_uwbprf_e
|
|
{
|
|
IEEE802154_UWBPRF_OFF = 0,
|
|
IEEE802154_UWBPRF_4M,
|
|
IEEE802154_UWBPRF_16M,
|
|
IEEE802154_UWBPRF_64M
|
|
};
|
|
|
|
enum ieee802154_uwb_datarate_e
|
|
{
|
|
IEEE802154_UWB_DATARATE_0 = 0,
|
|
IEEE802154_UWB_DATARATE_16,
|
|
IEEE802154_UWB_DATARATE_64,
|
|
IEEE802154_UWB_DATARATE_1024,
|
|
IEEE802154_UWB_DATARATE_4096
|
|
};
|
|
#endif
|
|
|
|
enum ieee802154_ranging_e
|
|
{
|
|
IEEE802154_NON_RANGING = 0,
|
|
IEEE802154_ALL_RANGING,
|
|
IEEE802154_PHY_HEADER_ONLY
|
|
};
|
|
|
|
struct ieee802154_capability_info_s
|
|
{
|
|
uint8_t reserved_0 : 1; /* Reserved */
|
|
uint8_t devtype : 1; /* 0=RFD, 1=FFD */
|
|
uint8_t powersource : 1; /* 1=AC, 0=Other */
|
|
uint8_t rxonidle : 1; /* 0=Receiver off when idle
|
|
* 1=Receiver on when idle */
|
|
uint8_t reserved_45 : 2; /* Reserved */
|
|
uint8_t security : 1; /* 0=disabled, 1=enabled */
|
|
uint8_t allocaddr : 1; /* 1=Coordinator allocates short address
|
|
* 0=otherwise */
|
|
};
|
|
|
|
struct ieee802154_superframespec_s
|
|
{
|
|
uint16_t beaconorder : 4; /* Transmission interval of beacon */
|
|
uint16_t sforder : 4; /* Length of active portion of superframe */
|
|
uint16_t final_capslot : 4; /* Last slot utilized by CAP */
|
|
uint16_t ble : 1; /* Battery Life Extension (BLE) */
|
|
uint16_t reserved : 1; /* Reserved bit */
|
|
uint16_t pancoord : 1; /* 1 if beacon sent by pan coordinator */
|
|
uint16_t assocpermit : 1; /* 1 if coordinator is accepting associaton */
|
|
};
|
|
|
|
struct ieee802154_pandesc_s
|
|
{
|
|
/* The coordinator address of the received beacon frame */
|
|
|
|
struct ieee802154_addr_s coordaddr;
|
|
|
|
uint8_t chan; /* current channel occupied by the network */
|
|
uint8_t chpage; /* current channel page occupied by the network */
|
|
|
|
/* The superframe specifications received in the beacon frame */
|
|
|
|
struct ieee802154_superframespec_s sfspec;
|
|
|
|
uint8_t gtspermit; /* 0=No GTS requests allowed
|
|
* 1=GTS request allowed */
|
|
uint8_t lqi; /* Link Quality Indication of the beacon */
|
|
uint32_t timestamp; /* Time at which the beacon frame was received
|
|
* in symbols */
|
|
};
|
|
|
|
struct ieee802154_pendaddr_s
|
|
{
|
|
uint8_t nsaddr : 3; /* Number of short addresses pending */
|
|
uint8_t neaddr : 3; /* Number of extended addresses pending */
|
|
struct ieee802154_addr_s addr[7]; /* Array of at most 7 addresses */
|
|
};
|
|
|
|
struct ieee802154_cca_s
|
|
{
|
|
uint8_t use_ed : 1; /* CCA using ED */
|
|
uint8_t use_cs : 1; /* CCA using carrier sense */
|
|
uint8_t edth; /* Energy detection threshold for CCA */
|
|
uint8_t csth; /* Carrier sense threshold for CCA */
|
|
};
|
|
|
|
/* Primitive Support Types ***************************************************/
|
|
|
|
union ieee802154_macattr_u
|
|
{
|
|
uint8_t eaddr[IEEE802154_EADDRSIZE];
|
|
uint8_t saddr[IEEE802154_SADDRSIZE];
|
|
uint8_t panid[IEEE802154_PANIDSIZE];
|
|
|
|
uint8_t coordeaddr[IEEE802154_EADDRSIZE];
|
|
uint8_t coordsaddr[IEEE802154_SADDRSIZE];
|
|
|
|
enum ieee802154_devmode_e devmode;
|
|
|
|
bool is_assoc;
|
|
bool assocpermit;
|
|
bool autoreq;
|
|
bool batt_life_ext;
|
|
bool gts_permit;
|
|
bool promisc_mode;
|
|
bool rng_support;
|
|
bool resp_waittime;
|
|
bool rxonidle;
|
|
bool sec_enabled;
|
|
bool timestamp_support;
|
|
|
|
uint32_t ack_wait_dur;
|
|
uint8_t batt_life_ext_periods;
|
|
uint8_t max_csma_backoffs : 3;
|
|
uint8_t max_be : 4;
|
|
uint8_t min_be : 4;
|
|
uint32_t max_frame_waittime;
|
|
uint8_t max_retries;
|
|
uint8_t lifs_period;
|
|
uint8_t sifs_period;
|
|
uint32_t sync_symb_offset : 12;
|
|
uint16_t trans_persist_time;
|
|
uint32_t tx_ctrl_active_dur;
|
|
uint32_t tx_ctrl_pause_dur;
|
|
uint32_t tx_total_dur;
|
|
|
|
uint8_t beacon_payload[IEEE802154_ATTR_MAC_BEACON_PAYLOAD_LEN];
|
|
uint8_t beacon_payload_len;
|
|
uint8_t beacon_order;
|
|
uint32_t beacon_tx_time : 24;
|
|
|
|
uint8_t superframeorder;
|
|
|
|
uint8_t bsn;
|
|
uint8_t dsn;
|
|
};
|
|
|
|
union ieee802154_phyattr_u
|
|
{
|
|
uint8_t chan;
|
|
int32_t txpwr;
|
|
uint32_t symdur_picosec;
|
|
/* TODO: Fill this out as we implement supported get/set commands */
|
|
};
|
|
|
|
union ieee802154_secattr_u
|
|
{
|
|
/* TODO: Fill this out as we implement supported get/set commands */
|
|
};
|
|
|
|
union ieee802154_attr_u
|
|
{
|
|
union ieee802154_macattr_u mac;
|
|
union ieee802154_phyattr_u phy;
|
|
union ieee802154_secattr_u sec;
|
|
};
|
|
|
|
struct ieee802154_gts_info_s
|
|
{
|
|
uint8_t length : 4; /* Number of SF slots for GTS */
|
|
uint8_t direction : 1; /* 0=transmit-only, 1=receive-only */
|
|
uint8_t type : 1; /* 0=GTS deallocation, 1= GTS allocation */
|
|
uint8_t reserved : 2;
|
|
};
|
|
|
|
enum ieee802154_scantype_e
|
|
{
|
|
IEEE802154_SCANTYPE_ED,
|
|
IEEE802154_SCANTYPE_ACTIVE,
|
|
IEEE802154_SCANTYPE_PASSIVE,
|
|
IEEE802154_SCANTYPE_ORPHAN
|
|
};
|
|
|
|
struct ieee802154_frame_meta_s
|
|
{
|
|
enum ieee802154_addrmode_e srcaddr_mode; /* Source Address Mode */
|
|
struct ieee802154_addr_s destaddr; /* Destination Address */
|
|
|
|
uint8_t msdu_handle; /* Handle assoc. with MSDU */
|
|
|
|
struct
|
|
{
|
|
uint8_t ack_tx : 1; /* Acknowledge TX? */
|
|
uint8_t gts_tx : 1; /* 1=GTS used for TX, 0=CAP used for TX */
|
|
uint8_t indirect_tx : 1; /* Should indirect transmission be used? */
|
|
} msdu_flags;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
|
|
#ifdef CONFIG_IEEE802154_UWB
|
|
/* The UWB Pulse Repetition Frequency to be used for the transmission */
|
|
|
|
enum ieee802154_uwbprf_e uwb_prf;
|
|
|
|
/* The UWB preamble symbol repititions
|
|
* Should be one of:
|
|
* 0, 16, 64, 1024, 4096
|
|
*/
|
|
|
|
uint16_t uwb_presym_rep;
|
|
|
|
/* The UWB Data Rate to be used for the transmission */
|
|
|
|
enum ieee802154_uwb_datarate_e data_rate;
|
|
#endif
|
|
|
|
enum ieee802154_ranging_e ranging;
|
|
};
|
|
|
|
/* Primitive Semantics *******************************************************/
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MCPS-DATA.confirm
|
|
*
|
|
* Description:
|
|
* Reports the results of a request to transfer data to another device.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_data_conf_s
|
|
{
|
|
uint8_t handle; /* Handle assoc. with MSDU */
|
|
|
|
/* The time, in symbols, at which the data were transmitted */
|
|
|
|
uint32_t timestamp;
|
|
enum ieee802154_status_e status; /* The status of the MSDU transmission */
|
|
|
|
#ifdef CONFIG_IEEE802154_RANGING
|
|
bool rng_rcvd; /* Ranging indicated by MSDU */
|
|
|
|
/* A count of the time units corresponding to an RMARKER at the antenna at
|
|
* the beginning of the ranging exchange
|
|
*/
|
|
|
|
uint32_t rng_counter_start;
|
|
|
|
/* A count of the time units corresponding to an RMARKER at the antenna at
|
|
* end of the ranging exchange
|
|
*/
|
|
|
|
uint32_t rng_counter_stop;
|
|
|
|
/* A count of the time units in a message exchange over which the tracking
|
|
* offset was measured
|
|
*/
|
|
|
|
uint32_t rng_tracking_interval;
|
|
|
|
/* A count of the time units slipped or advanced by the radio tracking
|
|
* system over the course of the entire tracking interval
|
|
*/
|
|
|
|
uint32_t rng_offset;
|
|
|
|
/* The Figure of Merit (FoM) characterizing the ranging measurement */
|
|
|
|
uint8_t rng_fom;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MCPS-DATA.indication
|
|
*
|
|
* Description:
|
|
* Indicates the reception of data from another device.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_data_ind_s
|
|
{
|
|
FAR struct ieee802154_data_ind_s *flink;
|
|
|
|
FAR struct iob_s *frame;
|
|
|
|
struct ieee802154_addr_s src; /* Source addressing information */
|
|
struct ieee802154_addr_s dest; /* Destination addressing infromation */
|
|
uint8_t lqi; /* Link Quality Index */
|
|
uint8_t rssi; /* Non-standard field */
|
|
uint8_t dsn; /* Data Sequence Number */
|
|
uint32_t timestamp; /* Time of received frame */
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif /* CONFIG_IEEE802154_SECURITY */
|
|
|
|
#ifdef CONFIG_IEEE802154_UWB
|
|
/* The UWB Pulse Repetition Frequency to be used for the transmission */
|
|
|
|
enum ieee802154_uwbprf_e uwb_prf;
|
|
|
|
/* The UWB preamble symbol repititions
|
|
* Should be one of:
|
|
* 0, 16, 64, 1024, 4096
|
|
*/
|
|
|
|
uint16_t uwb_presym_rep;
|
|
|
|
/* The UWB Data Rate to be used for the transmission */
|
|
|
|
enum ieee802154_uwb_datarate_e data_rate;
|
|
#endif /* CONFIG_IEEE802154_UWB */
|
|
|
|
#ifdef CONFIG_IEEE802154_RANGING
|
|
bool rng_rcvd; /* Ranging indicated by MSDU */
|
|
|
|
/* A count of the time units corresponding to an RMARKER at the antenna at
|
|
* the beginning of the ranging exchange
|
|
*/
|
|
|
|
uint32_t rng_counter_start;
|
|
|
|
/* A count of the time units corresponding to an RMARKER at the antenna at
|
|
* end of the ranging exchange
|
|
*/
|
|
|
|
uint32_t rng_counter_stop;
|
|
|
|
/* A count of the time units in a message exchange over which the tracking
|
|
* offset was measured
|
|
*/
|
|
|
|
uint34_t rng_tracking_interval;
|
|
|
|
/* A count of the time units slipped or advanced by the radio tracking
|
|
* system over the course of the entire tracking interval
|
|
*/
|
|
|
|
uint32_t rng_offset;
|
|
|
|
/* The Figure of Merit (FoM) characterizing the ranging measurement */
|
|
|
|
uint8_t rng_fom;
|
|
#endif /* CONFIG_IEEE802154_RANGING */
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MCPS-PURGE.request
|
|
*
|
|
* Description:
|
|
* Allows the next higher layer to purge an MSDU from the transaction queue.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_purge_req_s
|
|
{
|
|
uint8_t msdu_handle; /* Handle assoc. with MSDU */
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-ASSOCIATE.request
|
|
*
|
|
* Description:
|
|
* Used by a device to request an association with a coordinator.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_assoc_req_s
|
|
{
|
|
uint8_t chan; /* Channel number to attempt association */
|
|
uint8_t chpage; /* Channel page to attempt association */
|
|
|
|
/* TODO:
|
|
* This is a non-standard field. I believe there is a catch 22 in the
|
|
* standard and until I can figure it out, I'm adding this boolean to let the
|
|
* application tell the MAC whether it is trying to assocaite with a beacon
|
|
* enabled PAN or non-beacon enabled PAN. If it is beacon-enabled, the MAC
|
|
* will track the beacon first before transmitting the association. This can
|
|
* take some time depending on the beacon interval. If the PAN is non-beacon
|
|
* enabled, the association request is sent immediately via CSMA.
|
|
*
|
|
* The catch 22: The standard outlines the procedure for associating: reset
|
|
* the MAC, scan to find PAN's and pass coordinator address info to
|
|
* application, application calls associate passing address info of
|
|
* coordinator. Which sounds good. The problem is that the primitive has no
|
|
* field for determining if the PAN we are trying to join is beacon enabled
|
|
* or not. Which means we don't know whether to tranmsit immediately or try
|
|
* to track the beacon. The standard does say that ALL command frames should
|
|
* be sent during the Contention Access Period (CAP), but how could you send
|
|
* it at the rigth tiem, if you are not tracking the beacon. What's worse is
|
|
* in the association section, it says if you are tracking the beacon, to
|
|
* send the association request during the CAP. But how can you track the
|
|
* beacon if you are not associated. Normally tracking the beacon would be
|
|
* triggered by the SYNC.request primitive. But from my understanding that
|
|
* primitive is intended to be used AFTER association since it requires the
|
|
* MAC to already have a coordinator address and PAN ID so that it can track
|
|
* the beacon frames properly. Which, of course, how could the MAC have that
|
|
* info if it is not associated.
|
|
*/
|
|
|
|
bool beacon;
|
|
|
|
/* Coordinator Address with which to associate */
|
|
|
|
struct ieee802154_addr_s coordaddr;
|
|
|
|
/* Capabilities of associating device */
|
|
|
|
struct ieee802154_capability_info_s capabilities;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-ASSOCIATE.indication
|
|
*
|
|
* Description:
|
|
* Used to indicate the reception of an association request command.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_assoc_ind_s
|
|
{
|
|
/* Address of device requesting association. Always in extended mode */
|
|
|
|
uint8_t devaddr[IEEE802154_EADDRSIZE];
|
|
|
|
/* Capabilities of associating device */
|
|
|
|
struct ieee802154_capability_info_s capabilities;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-ASSOCIATE.response
|
|
*
|
|
* Description:
|
|
* Used to initiate a response to an MLME-ASSOCIATE.indication primitive.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_assoc_resp_s
|
|
{
|
|
/* Address of device requesting association. Always in extended mode */
|
|
|
|
uint8_t devaddr[IEEE802154_EADDRSIZE];
|
|
|
|
/* Address assigned to the device. 0xFFFF if failure */
|
|
|
|
uint8_t assocsaddr[IEEE802154_SADDRSIZE];
|
|
|
|
/* Status of association attempt */
|
|
|
|
enum ieee802154_status_e status;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-ASSOCIATE.confirm
|
|
*
|
|
* Description:
|
|
* Used to inform the next higher layer of the initiating device whether its
|
|
* request to associate was successful or unsuccessful.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_assoc_conf_s
|
|
{
|
|
/* Associated device address ALWAYS passed in short address mode. The
|
|
* address will be IEEE802154_SADDR_UNSPEC if association was
|
|
* unsuccessful.
|
|
*/
|
|
|
|
uint8_t saddr[IEEE802154_SADDRSIZE];
|
|
|
|
/* Status of association attempt */
|
|
|
|
enum ieee802154_status_e status;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-DISASSOCIATE.request
|
|
*
|
|
* Description:
|
|
* Used by an associated device to notify the coordinator of its intent to
|
|
* leave the PAN. It is also used by the coordinator to instruct an
|
|
* associated device to leave the PAN.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_disassoc_req_s
|
|
{
|
|
/* Address of device to send disassociation notification */
|
|
|
|
struct ieee802154_addr_s dev_addr;
|
|
|
|
/* Reason for the disassosiation */
|
|
|
|
enum ieee802154_status_e disassoc_reason;
|
|
|
|
uint8_t tx_indirect; /* 0=Send Direct, 1=Send Indirect */
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-DISASSOCIATE.indication
|
|
*
|
|
* Description:
|
|
* Used to indicate the reception of a disassociation notification command.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_disassoc_ind_s
|
|
{
|
|
/* Address of device requesting disassociation. Always extended mode */
|
|
|
|
struct ieee802154_addr_s dev_addr;
|
|
|
|
/* Reason for the disassosiation */
|
|
|
|
enum ieee802154_status_e disassoc_reason;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-DISASSOCIATE.confirm
|
|
*
|
|
* Description:
|
|
* Reports the results of an MLME-DISASSOCIATE.request primitive.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_disassoc_conf_s
|
|
{
|
|
/* Status of the disassociation attempt */
|
|
|
|
enum ieee802154_status_e status;
|
|
|
|
/* Address of device either requesting or being intructed to disassociate */
|
|
|
|
struct ieee802154_addr_s dev_addr;
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-BEACONNOTIFY.indication
|
|
*
|
|
* Description:
|
|
* Used to send parameters contained within a beacon frame received by the
|
|
* MAC sublayer to the next higher layer when either macAutoRequest is set to
|
|
* FALSE or when the beacon frame contains one or more octets of payload. The
|
|
* primitive also sends a measure of the LQI and the time the beacon frame
|
|
* was received.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_beacon_ind_s
|
|
{
|
|
uint8_t bsn; /* Beacon sequence number */
|
|
|
|
/* PAN descriptor for the received beacon */
|
|
|
|
struct ieee802154_pandesc_s pandesc;
|
|
|
|
/* Beacon pending addresses */
|
|
|
|
struct ieee802154_pendaddr_s pendaddr;
|
|
uint8_t payloadlength; /* # of octets contained in the beacon payload */
|
|
uint8_t payload[IEEE802154_MAX_BEACON_PAYLOAD_LEN];
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-COMM-STATUS.indication
|
|
*
|
|
* Description:
|
|
* Allows the MLME to indicate a communications status.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_commstatus_ind_s
|
|
{
|
|
struct ieee802154_addr_s src_addr;
|
|
struct ieee802154_addr_s dest_addr;
|
|
enum ieee802154_status_e status;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-GTS.request
|
|
*
|
|
* Description:
|
|
* Allows a device to send a request to the PAN coordinator to allocate a new
|
|
* GTS or to deallocate an existing GTS. This primitive is also used by the
|
|
* PAN coordinator to initiate a GTS deallocation.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_gts_req_s
|
|
{
|
|
struct ieee802154_gts_info_s gts_info;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-GTS.confirm
|
|
*
|
|
* Description:
|
|
* Reports the results of a request to allocate a new GTS or to deallocate an
|
|
* existing GTS.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_gts_conf_s
|
|
{
|
|
struct ieee802154_gts_info_s gts_info;
|
|
enum ieee802154_status_e status;
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-GTS.indication
|
|
*
|
|
* Description:
|
|
* Indicates that a GTS has been allocated or that a previously allocated
|
|
* GTS has been deallocated.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_gts_ind_s
|
|
{
|
|
uint16_t dev_addr;
|
|
struct ieee802154_gts_info_s gts_info;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-ORPHAN.indication
|
|
*
|
|
* Description:
|
|
* Generated by the MLME of a coordinator and issued to its next higher layer
|
|
* on receipt of an orphan notification command.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_orphan_ind_s
|
|
{
|
|
uint8_t orphan_addr[8];
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-ORPHAN.response
|
|
*
|
|
* Description:
|
|
* Allows the next higher layer of a coordinator to respond to the
|
|
* MLME-ORPHAN.indication primitive.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_orphan_resp_s
|
|
{
|
|
uint8_t orphan_addr[8];
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-RESET.request
|
|
*
|
|
* Description:
|
|
* Used by the next higher layer to request that the MLME performs a reset
|
|
* operation.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_reset_req_s
|
|
{
|
|
bool resetattr;
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-RXENABLE.request
|
|
*
|
|
* Description:
|
|
* Allows the next higher layer to request that the receiver is either
|
|
* enabled for a finite period of time or disabled.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_rxenable_req_s
|
|
{
|
|
/* Number of symbols measured from the start of the superframe before the
|
|
* receiver is to be enabled or disabled.
|
|
*/
|
|
|
|
uint32_t rxon_time;
|
|
|
|
/* Number of symbols for which the receiver is to be enabled */
|
|
|
|
uint32_t rxon_dur;
|
|
|
|
uint8_t defer_permit : 1; /* 0=Only attempt operation on current superframe
|
|
* 1=Operation can be deferred to next superframe */
|
|
uint8_t rng_rxctrl : 1; /* 0=RANGING_OFF, 1=RANGING_OFF */
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-RXENABLE.confirm
|
|
*
|
|
* Description:
|
|
* Reports the results of the attempt to enable or disable the receiver.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_rxenable_conf_s
|
|
{
|
|
enum ieee802154_status_e status;
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-SCAN.request
|
|
*
|
|
* Description:
|
|
* Used to initiate a channel scan over a given list of channels.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_scan_req_s
|
|
{
|
|
enum ieee802154_scantype_e type;
|
|
uint8_t duration;
|
|
uint8_t chpage;
|
|
uint8_t channels[15];
|
|
uint8_t numchan;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-SCAN.confirm
|
|
*
|
|
* Description:
|
|
* Reports the result of the channel scan request.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_scan_conf_s
|
|
{
|
|
enum ieee802154_status_e status;
|
|
enum ieee802154_scantype_e type;
|
|
uint8_t chpage;
|
|
uint8_t unscanned[15];
|
|
uint8_t numunscanned;
|
|
uint8_t numdesc;
|
|
struct ieee802154_pandesc_s pandescs[MAC802154_NPANDESC];
|
|
uint8_t edlist[MAC802154_NPANDESC];
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-GET.request
|
|
*
|
|
* Description:
|
|
* Requests information about a given PIB attribute.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_get_req_s
|
|
{
|
|
enum ieee802154_attr_e attr;
|
|
union ieee802154_attr_u attrval;
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-SET.request
|
|
*
|
|
* Description:
|
|
* Attempts to write the given value to the indicated PIB attribute.
|
|
*
|
|
* NOTE: The standard specifies that confirmation should be indicated via
|
|
* the asynchronous MLME-SET.confirm primitve. However, in our implementation
|
|
* there is no reason not to synchronously return the status immediately.
|
|
* Therefore, we do merge the functionality of the MLME-SET.request and
|
|
* MLME-SET.confirm primitives together.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_set_req_s
|
|
{
|
|
enum ieee802154_attr_e attr;
|
|
union ieee802154_attr_u attrval;
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-START.request
|
|
*
|
|
* Description:
|
|
* Used by the PAN coordinator to initiate a new PAN or to begin using a new
|
|
* superframe configuration. This primitive is also used by a device already
|
|
* associated with an existing PAN to begin using a new superframe
|
|
* configuration.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_start_req_s
|
|
{
|
|
uint8_t panid[IEEE802154_PANIDSIZE];
|
|
uint8_t chan;
|
|
uint8_t chpage;
|
|
|
|
uint32_t starttime : 24;
|
|
uint32_t beaconorder : 8;
|
|
|
|
uint8_t superframeorder;
|
|
|
|
uint8_t pancoord : 1;
|
|
uint8_t battlifeext : 1;
|
|
uint8_t coordrealign : 1;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s coordrealign;
|
|
struct ieee802154_security_s beacon;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-START.confirm
|
|
*
|
|
* Description:
|
|
* Reports the results of the attempt to start using a new superframe
|
|
* configuration.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_start_conf_s
|
|
{
|
|
enum ieee802154_status_e status;
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-SYNC.request
|
|
*
|
|
* Description:
|
|
* Requests to synchronize with the coordinator by acquiring and, if
|
|
* specified, tracking its beacons.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_sync_req_s
|
|
{
|
|
uint8_t ch_num;
|
|
uint8_t ch_page;
|
|
bool track_beacon;
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-SYNC-LOSS.indication
|
|
*
|
|
* Description:
|
|
* Indicates the loss of synchronization with a coordinator.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_syncloss_ind_s
|
|
{
|
|
enum ieee802154_status_e loss_reason;
|
|
uint16_t pan_id;
|
|
uint8_t ch_num;
|
|
uint8_t ch_page;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-POLL.request
|
|
*
|
|
* Description:
|
|
* Prompts the device to request data from the coordinator.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_poll_req_s
|
|
{
|
|
struct ieee802154_addr_s coordaddr;
|
|
|
|
#ifdef CONFIG_IEEE802154_SECURITY
|
|
/* Security information if enabled */
|
|
|
|
struct ieee802154_security_s security;
|
|
#endif
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Primitive: MLME-POLL.confirm
|
|
*
|
|
* Description:
|
|
* Reports the results of a request to poll the coordinator for data.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
struct ieee802154_poll_conf_s
|
|
{
|
|
enum ieee802154_status_e status;
|
|
};
|
|
|
|
/* MAC Service Notifications */
|
|
|
|
enum ieee802154_notify_e
|
|
{
|
|
/* MCPS Notifications */
|
|
|
|
IEEE802154_NOTIFY_CONF_DATA = 0x00,
|
|
|
|
/* MLME Notifications */
|
|
|
|
IEEE802154_NOTIFY_CONF_ASSOC,
|
|
IEEE802154_NOTIFY_CONF_DISASSOC,
|
|
IEEE802154_NOTIFY_CONF_GTS,
|
|
IEEE802154_NOTIFY_CONF_RESET,
|
|
IEEE802154_NOTIFY_CONF_RXENABLE,
|
|
IEEE802154_NOTIFY_CONF_SCAN,
|
|
IEEE802154_NOTIFY_CONF_START,
|
|
IEEE802154_NOTIFY_CONF_POLL,
|
|
|
|
IEEE802154_NOTIFY_IND_ASSOC,
|
|
IEEE802154_NOTIFY_IND_DISASSOC,
|
|
IEEE802154_NOTIFY_IND_BEACONNOTIFY,
|
|
IEEE802154_NOTIFY_IND_GTS,
|
|
IEEE802154_NOTIFY_IND_ORPHAN,
|
|
IEEE802154_NOTIFY_IND_COMMSTATUS,
|
|
IEEE802154_NOTIFY_IND_SYNCLOSS
|
|
};
|
|
|
|
union ieee802154_notif_u
|
|
{
|
|
/* MCPS Notifications */
|
|
|
|
struct ieee802154_data_conf_s dataconf;
|
|
|
|
/* MLME Notifications */
|
|
|
|
struct ieee802154_assoc_conf_s assocconf;
|
|
struct ieee802154_disassoc_conf_s disassocconf;
|
|
struct ieee802154_gts_conf_s gtsconf;
|
|
struct ieee802154_rxenable_conf_s rxenableconf;
|
|
struct ieee802154_scan_conf_s scanconf;
|
|
struct ieee802154_start_conf_s startconf;
|
|
struct ieee802154_poll_conf_s pollconf;
|
|
|
|
struct ieee802154_assoc_ind_s assocind;
|
|
struct ieee802154_disassoc_ind_s disassocind;
|
|
struct ieee802154_beacon_ind_s beaconind;
|
|
struct ieee802154_gts_ind_s gtsind;
|
|
struct ieee802154_orphan_ind_s orphanind;
|
|
struct ieee802154_commstatus_ind_s commstatusind;
|
|
struct ieee802154_syncloss_ind_s synclossind;
|
|
};
|
|
|
|
struct ieee802154_notif_s
|
|
{
|
|
/* Must be first member so that we can interchange between the actual
|
|
* notification and this extended struct.
|
|
*/
|
|
|
|
union ieee802154_notif_u u;
|
|
enum ieee802154_notify_e notiftype;
|
|
|
|
/* Support a singly linked list. For use by receivers. The MAC has it's own
|
|
* extended struct type with another forward link that the MAC uses internally
|
|
* to handle allocation and freeing.
|
|
*/
|
|
|
|
FAR struct ieee802154_notif_s *flink;
|
|
};
|
|
|
|
/* A pointer to this structure is passed as the argument of each IOCTL
|
|
* command.
|
|
*/
|
|
|
|
union ieee802154_macarg_u
|
|
{
|
|
struct ieee802154_assoc_req_s assocreq; /* MAC802154IOC_MLME_ASSOC_REQUEST */
|
|
struct ieee802154_assoc_resp_s assocresp; /* MAC802154IOC_MLME_ASSOC_RESPONSE */
|
|
struct ieee802154_disassoc_req_s disassocreq; /* MAC802154IOC_MLME_DISASSOC_REQUEST */
|
|
struct ieee802154_get_req_s getreq; /* MAC802154IOC_MLME_GET_REQUEST */
|
|
struct ieee802154_gts_req_s gtsreq; /* MAC802154IOC_MLME_GTS_REQUEST */
|
|
struct ieee802154_orphan_resp_s orphanresp; /* MAC802154IOC_MLME_ORPHAN_RESPONSE */
|
|
struct ieee802154_reset_req_s resetreq; /* MAC802154IOC_MLME_RESET_REQUEST */
|
|
struct ieee802154_rxenable_req_s rxenabreq; /* MAC802154IOC_MLME_RXENABLE_REQUEST */
|
|
struct ieee802154_scan_req_s scanreq; /* MAC802154IOC_MLME_SCAN_REQUEST */
|
|
struct ieee802154_set_req_s setreq; /* MAC802154IOC_MLME_SET_REQUEST */
|
|
struct ieee802154_start_req_s startreq; /* MAC802154IOC_MLME_START_REQUEST */
|
|
struct ieee802154_sync_req_s syncreq; /* MAC802154IOC_MLME_SYNC_REQUEST */
|
|
struct ieee802154_poll_req_s pollreq; /* MAC802154IOC_MLME_POLL_REQUEST */
|
|
/* To be determined */ /* MAC802154IOC_MLME_DPS_REQUEST */
|
|
/* To be determined */ /* MAC802154IOC_MLME_SOUNDING_REQUEST */
|
|
/* To be determined */ /* MAC802154IOC_MLME_CALIBRATE_REQUEST */
|
|
};
|
|
|
|
#ifdef CONFIG_NET_6LOWPAN
|
|
/* For the case of network IOCTLs, the network IOCTL to the MAC network
|
|
* driver will include a device name like "wpan0" as the destination of
|
|
* the IOCTL command.
|
|
*/
|
|
|
|
struct ieee802154_netmac_s
|
|
{
|
|
char ifr_name[IFNAMSIZ]; /* Interface name, e.g. "wpan0" */
|
|
union ieee802154_macarg_u u; /* Data payload */
|
|
};
|
|
#endif
|
|
|
|
/* This is an opaque reference to the MAC's internal private state. It is
|
|
* returned by mac802154_create() when it is created. It may then be used
|
|
* at other interfaces in order to interact with the MAC.
|
|
*/
|
|
|
|
typedef FAR void *MACHANDLE;
|
|
|
|
#ifdef __cplusplus
|
|
#define EXTERN extern "C"
|
|
extern "C"
|
|
{
|
|
#else
|
|
#define EXTERN extern
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Public Function Prototypes
|
|
****************************************************************************/
|
|
|
|
struct ieee802154_radio_s; /* Forward reference */
|
|
|
|
/****************************************************************************
|
|
* Name: mac802154_create
|
|
*
|
|
* Description:
|
|
* Create a 802.15.4 MAC device from a 802.15.4 compatible radio device.
|
|
*
|
|
* The returned MAC structure should be passed to either the next highest
|
|
* layer in the network stack, or registered with a mac802154dev character
|
|
* or network drivers. In any of these scenarios, the next highest layer
|
|
* should register a set of callbacks with the MAC layer by setting the
|
|
* mac->cbs member.
|
|
*
|
|
* NOTE: This API does not create any device accessible to userspace. If you
|
|
* want to call these APIs from userspace, you have to wrap your mac in a
|
|
* character device via mac802154_device.c.
|
|
*
|
|
* Input Parameters:
|
|
* radiodev - an instance of an IEEE 802.15.4 radio
|
|
*
|
|
* Returned Value:
|
|
* An opaque reference to the MAC state data.
|
|
*
|
|
****************************************************************************/
|
|
|
|
MACHANDLE mac802154_create(FAR struct ieee802154_radio_s *radiodev);
|
|
|
|
/****************************************************************************
|
|
* Name: mac802154dev_register
|
|
*
|
|
* Description:
|
|
* Register a character driver to access the IEEE 802.15.4 MAC layer from
|
|
* user-space
|
|
*
|
|
* Input Parameters:
|
|
* mac - Pointer to the mac layer struct to be registered.
|
|
* minor - The device minor number. The IEEE802.15.4 MAC character device
|
|
* will be registered as /dev/ieeeN where N is the minor number
|
|
*
|
|
* Returned Values:
|
|
* Zero (OK) is returned on success. Otherwise a negated errno value is
|
|
* returned to indicate the nature of the failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int mac802154dev_register(MACHANDLE mac, int minor);
|
|
|
|
/****************************************************************************
|
|
* Name: mac802154netdev_register
|
|
*
|
|
* Description:
|
|
* Register a network driver to access the IEEE 802.15.4 MAC layer from
|
|
* a socket using 6LoWPAN
|
|
*
|
|
* Input Parameters:
|
|
* mac - Pointer to the mac layer struct to be registered.
|
|
*
|
|
* Returned Values:
|
|
* Zero (OK) is returned on success. Otherwise a negated errno value is
|
|
* returned to indicate the nature of the failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int mac802154netdev_register(MACHANDLE mac);
|
|
|
|
/****************************************************************************
|
|
* Name: ieee802154_indpool_initialize
|
|
*
|
|
* Description:
|
|
* This function initializes the meta-data allocator. This function must
|
|
* be called early in the initialization sequence before any radios
|
|
* begin operation.
|
|
*
|
|
* Inputs:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*
|
|
****************************************************************************/
|
|
|
|
void ieee802154_indpool_initialize(void);
|
|
|
|
/****************************************************************************
|
|
* Name: ieee802154_ind_allocate
|
|
*
|
|
* Description:
|
|
* The ieee802154_ind_allocate function will get a free meta-data
|
|
* structure for use by the IEEE 802.15.4 MAC.
|
|
*
|
|
* Interrupt handling logic will first attempt to allocate from the
|
|
* g_indfree list. If that list is empty, it will attempt to allocate
|
|
* from its reserve, g_indfree_irq. If that list is empty, then the
|
|
* allocation fails (NULL is returned).
|
|
*
|
|
* Non-interrupt handler logic will attempt to allocate from g_indfree
|
|
* list. If that the list is empty, then the meta-data structure will be
|
|
* allocated from the dynamic memory pool.
|
|
*
|
|
* Inputs:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* A reference to the allocated msg structure. All user fields in this
|
|
* structure have been zeroed. On a failure to allocate, NULL is
|
|
* returned.
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR struct ieee802154_data_ind_s *ieee802154_ind_allocate(void);
|
|
|
|
/****************************************************************************
|
|
* Name: ieee802154_ind_free
|
|
*
|
|
* Description:
|
|
* The ieee802154_ind_free function will return a meta-data structure to
|
|
* the free pool of messages if it was a pre-allocated meta-data
|
|
* structure. If the meta-data structure was allocated dynamically it will
|
|
* be deallocated.
|
|
*
|
|
* Inputs:
|
|
* ind - meta-data structure to free
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*
|
|
****************************************************************************/
|
|
|
|
void ieee802154_ind_free(FAR struct ieee802154_data_ind_s *ind);
|
|
|
|
|
|
#undef EXTERN
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCLUDE_NUTTX_WIRELESS_IEEE802154_IEEE802154_MAC_H */
|