Files
unison/src/zigbee/model/zigbee-nwk.h
2025-09-28 15:56:44 +00:00

1845 lines
72 KiB
C++

/*
* Copyright (c) 2024 Tokushima University, Japan
*
* SPDX-License-Identifier: GPL-2.0-only
*
* Authors:
*
* Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
* Ryo Okuda <c611901200@tokushima-u.ac.jp>
*/
#ifndef ZIGBEE_NWK_H
#define ZIGBEE_NWK_H
#include "zigbee-group-table.h"
#include "zigbee-nwk-fields.h"
#include "zigbee-nwk-header.h"
#include "zigbee-nwk-payload-header.h"
#include "zigbee-nwk-tables.h"
#include "ns3/event-id.h"
#include "ns3/lr-wpan-mac-base.h"
#include "ns3/mac16-address.h"
#include "ns3/mac64-address.h"
#include "ns3/object.h"
#include "ns3/random-variable-stream.h"
#include "ns3/sequence-number.h"
#include "ns3/traced-callback.h"
#include "ns3/traced-value.h"
#include <cstdint>
#include <iomanip>
#include <iterator>
namespace ns3
{
namespace zigbee
{
/**
* @defgroup zigbee ZIGBEE models
*
* This section documents the API of the Zigbee Specification related models. For a generic
* functional description, please refer to the ns-3 manual.
*/
static constexpr uint32_t ALL_CHANNELS = 0x07FFF800; //!< Bitmap representing all channels (11~26)
//!< LSB b0-b26, b27-b31 MSB
//!< Page 0 in Zigbee (250kbps O-QPSK)
/**
* @ingroup Zigbee
*
* Indicates a pending NWK primitive
*/
enum PendingPrimitiveNwk : std::uint8_t
{
NLDE_NLME_NONE = 0, //!< No pending primitive
NLME_NETWORK_FORMATION = 1, //!< Pending NLME-NETWORK-FORMATION.request primitive
NLME_DIRECT_JOIN = 2, //!< Pending NLME-DIRECT-JOIN.request primitive
NLME_JOIN = 3, //!< Pending NLME-JOIN.request primitive
NLME_START_ROUTER = 4, //!< Pending NLME-START-ROUTER.request primitive
NLME_NET_DISCV = 5, //!< Pending NLME-NETWORK-DISCOVERY.request primitive
NLME_JOIN_INDICATION = 6, //!< Pending NLME-JOIN.indication primitive
NLME_ROUTE_DISCOVERY = 7, //!< Pending NLME-ROUTE-DISCOVERY.request primitive
NLDE_DATA = 8 //!< Pending NLDE-DATA.request primitive
};
/**
* @ingroup Zigbee
*
* Table 3.2 (Address Mode) NLDE-DATA-Request parameters
*/
enum AddressMode
{
NO_ADDRESS = 0x00, //!< No destination address
MCST = 0x01, //!< Multicast Address mode
UCST_BCST = 0x02 //!< Unicast or Broadcast address mode
};
/**
* Use to describe the method used to assign addresses in the NWK layer.
* See Zigbee specification r22.1.0, Table 3-58
*/
enum AddrAllocMethod
{
DISTRIBUTED_ALLOC = 0x00, //!< Distributed address allocation
//!< (Zigbee Specification r22.1.0 Section 3.6.1.6)
STOCHASTIC_ALLOC = 0x02 //!< Stochastic address allocation
//!< (Zigbee Specification r22.1.0 Section 3.6.1.7)
};
/**
* Use to describe the identifier of the zigbee stack profile.
*/
enum StackProfile
{
ZIGBEE = 0x01, //!< Zigbee stack profile 0x01 (a.k.a. Zigbee 2006, Zigbee 2007, Zigbee)
ZIGBEE_PRO = 0x02 //!< Zigbee stack profile 0x02 (Zigbee Pro, also known as r22.1.0, 3.0)
};
/**
* Use to describe the parameter that controls the method of joining the network.
* See Zigbee specification r22.1.0, Table 3-21
*/
enum JoiningMethod
{
ASSOCIATION = 0x00, //!< The device is requesting to join a network through association.
DIRECT_OR_REJOIN = 0x01, //!< The device is joining directly or rejoining using the
//!< orphaning procedure.
REJOINING = 0x02, //!< The device is joining the network using the rejoining procedure.
CHANGE_CHANNEL = 0x03 //!< The device is to change the operational network channel to
//!< that identified in the ScanChannel parameter.
};
/**
* The status returned while attempting to find the next hop in route towards a specific
* destination or a many-to-one route request attempt.
*/
enum RouteDiscoveryStatus : std::uint8_t
{
ROUTE_FOUND = 0x01, //!< The next hop toward the destination was found in our
//!< routing table or neighbor table (Mesh route).
ROUTE_NOT_FOUND = 0x02, //!< The next hop was not found. A new entry is is registered
//!< in the routing table with DISCOVER_UNDERWAY status(Mesh route).
TABLE_FULL = 0x03, //!< Either the routing or neighbor table are full.
ROUTE_UPDATED = 0x04, //!< A route was found and updated with a better route
//!< (Mesh route or Many-To-One route)
NO_DISCOVER_ROUTE = 0x05, //!< We are currently not allowed to perform a route discovery
//!< for this route (RouteDiscover flag in network header is false).
DISCOVER_UNDERWAY = 0x06, //!< The route was found in the tables but currently has no next hop.
//!< i.e. A previous attempt was already made is currently awaiting
//!< for a response (hence the route discover is underway).
MANY_TO_ONE_ROUTE = 0x07, //!< A new Many-To-One route was created
NO_ROUTE_CHANGE = 0x08 //!< No route entry was created or updated during
//!< a Many-To-One process
};
/**
* @ingroup Zigbee
*
* Network layer status values
* Combines Zigbee Specification r22.1.0 Table 3-73 and
* and IEEE 802.15.4-2006 Table 78
*
* Used to report the resulting status of various NWK operations.
*
* Note: UNSUPPORTED_ATTRIBUTE, LIMIT_REACHED, SCAN_IN_PROGRESS
*/
enum NwkStatus : std::uint8_t
{
// MAC defined status:
SUCCESS = 0, //!< The operation was completed successfully.
FULL_CAPACITY = 0x01, //!< PAN at capacity. Association Status field (std. 2006, Table 83).
ACCESS_DENIED = 0x02, //!< PAN access denied. Association Status field (std. 2006, Table 83).
COUNTER_ERROR = 0xdb, //!< The frame counter of the received frame is invalid.
IMPROPER_KEY_TYPE = 0xdc, //!< The key is not allowed to be used with that frame type.
IMPROPER_SECURITY_LEVEL = 0xdd, //!< Insufficient security level expected by the recipient.
UNSUPPORTED_LEGACY = 0xde, //!< Deprecated security used in IEEE 802.15.4-2003
UNSUPPORTED_SECURITY = 0xdf, //!< The security applied is not supported.
BEACON_LOSS = 0xe0, //!< The beacon was lost following a synchronization request.
CHANNEL_ACCESS_FAILURE = 0xe1, //!< A Tx could not take place due to activity in the CH.
DENIED = 0xe2, //!< The GTS request has been denied by the PAN coordinator.
DISABLE_TRX_FAILURE = 0xe3, //!< The attempt to disable the transceier has failed.
SECURITY_ERROR = 0xe4, //!< Cryptographic process of the frame failed(FAILED_SECURITY_CHECK).
FRAME_TOO_LONG = 0xe5, //!< Frame more than aMaxPHYPacketSize or too large for CAP or GTS.
INVALID_GTS = 0xe6, //!< Missing GTS transmit or undefined direction.
INVALID_HANDLE = 0xe7, //!< When purging from TX queue handle was not found.
INVALID_PARAMETER_MAC = 0xe8, //!< Invalid parameter in response to a request passed to the MAC.
NO_ACK = 0xe9, //!< No acknowledgment was received after macMaxFrameRetries.
NO_BEACON = 0xea, //!< A scan operation failed to find any network beacons.
NO_DATA = 0xeb, //!< No response data were available following a request.
NO_SHORT_ADDRESS = 0xec, //!< Failure due to unallocated 16-bit short address.
OUT_OF_CAP = 0xed, //!< (Deprecated) See IEEE 802.15.4-2003
PAN_ID_CONFLICT = 0xee, //!< PAN id conflict detected and informed to the coordinator.
REALIGMENT = 0xef, //!< A coordinator realigment command has been received.
TRANSACTION_EXPIRED = 0xf0, //!< The transaction expired and its information discarded.
TRANSACTION_OVERFLOW = 0xf1, //!< There is no capacity to store the transaction.
TX_ACTIVE = 0xf2, //!< The transceiver was already enabled.
UNAVAILABLE_KEY = 0xf3, //!< Unavailable key, unknown or blacklisted.
INVALID_ADDRESS = 0xf5, //!< Invalid source or destination address.
ON_TIME_TOO_LONG = 0xf6, //!< RX enable request fail due to syms. longer than Bcn. interval
PAST_TIME = 0xf7, //!< Rx enable request fail due to lack of time in superframe.
TRACKING_OFF = 0xf8, //!< This device is currently not tracking beacons.
INVALID_INDEX = 0xf9, //!< A MAC PIB write failed because specified index is out of range.
READ_ONLY = 0xfb, //!< SET/GET request issued for a read only attribute.
SUPERFRAME_OVERLAP = 0xfd, //!< Coordinator sperframe and this device superframe tx overlap.
// Zigbee Specification defined status:
INVALID_PARAMETER = 0xc1, //!< Invalid Parameter (Zigbee specification r22.1.0)
INVALID_REQUEST = 0xc2, //!< Invalid request (Zigbee specification r22.1.0)
NOT_PERMITED = 0xc3, //!< Not permitted (Zigbee specification r22.1.0)
STARTUP_FAILURE = 0xc4, //!< Startup failure (Zigbee specification r22.1.0)
ALREADY_PRESENT = 0xc5, //!< Already present (Zigbee specification r22.1.0)
SYNC_FAILURE = 0xc6, //!< Sync Failure (Zigbee specification r22.1.0)
NEIGHBOR_TABLE_FULL = 0xc7, //!< Neighbor table full (Zigbee specification r22.1.0)
UNKNOWN_DEVICE = 0xc8, //!< Unknown device (Zigbee specification r22.1.0)
UNSUPPORTED_ATTRIBUTE = 0xc9, //!< Unsupported attribute (Zigbee specification r22.1.0)
NO_NETWORKS = 0xca, //!< No network (Zigbee specification r22.1.0)
MAX_FRM_COUNTER = 0xcc, //!< Max Frame counter (IEEE 802.15.4, Zigbee specification r22.1.0)
NO_KEY = 0xcd, //!< No Key (Zigbee specification r22.1.0)
BAD_CCM_OUTPUT = 0xce, //!< Bad ccm output (IEEE 802.15.4, Zigbee specification r22.1.0)
ROUTE_DISCOVERY_FAILED = 0xd0, //!< Route discovery failed (Zigbee specification r22.1.0)
ROUTE_ERROR = 0xd1, //!< Route error (Zigbee specification r22.1.0)
BT_TABLE_FULL = 0xd2, //!< Bt table full (Zigbee specification r22.1.0)
FRAME_NOT_BUFFERED = 0xd3, //!< Frame not buffered (Zigbee specification r22.1.0)
INVALID_INTERFACE = 0xd5, //!< Invalid interface (Zigbee specification r22.1.0)
LIMIT_REACHED = 0xd6, //!< Limit reached during network scan (IEEE 802.15.4-2011)
SCAN_IN_PROGRESS = 0xd7 //!< The dev was scanning during this call (IEEE 802.5.4)
};
/**
* Overloaded operator to print the value of a NwkStatus.
*
* @param os The output stream
* @param state The text value of the NWK state
* @return The output stream with text value of the NWK state
*/
std::ostream& operator<<(std::ostream& os, const NwkStatus& state);
/**
* Overloaded operator to print uint8_t vectors
*
* @param os The output stream
* @param vec The uint8_t vector to print
* @return The output stream with the text value of the uint8_t vector members
*/
std::ostream& operator<<(std::ostream& os, const std::vector<uint8_t>& vec);
/**
*
* @param os The output stream
* @param num The uint8_t number to print
* @return The output stream with the text value of the uint8_t number
*/
std::ostream& operator<<(std::ostream& os, const uint8_t& num);
/**
* @ingroup Zigbee
*
* Status codes for network status command frame and route discovery failures.
*
*/
enum NetworkStatusCode : std::uint8_t
{
NO_ROUTE_AVAILABLE = 0x00, //!< No route available
TREE_LINK_FAILURE = 0x01, //!< Tree link failure
NON_TREE_LINK_FAILURE = 0x02, //!< Non tree link failure
LOW_BATTERY = 0x03, //!< Low battery
NO_ROUTING_CAPACITY = 0x04, //!< No routing capacity
NO_INDIRECT_CAPACITY = 0x05, //!< No indirect capacity
INDIRECT_TRANSACTION_EXPIRY = 0x06, //!< Indirect transaction expiry
TARGET_DEVICE_UNAVAILABLE = 0x07, //!< Target device unavailable
TARGET_ADDRESS_UNALLOCATED = 0x08, //!< Target address unallocated
PARENT_LINK_FAILURE = 0x09, //!< Parent link failure
VALIDATE_ROUTE = 0x0a, //!< Validate route
SOURCE_ROUTE_FAILURE = 0x0b, //!< Source route failure
MANY_TO_ONE_ROUTE_FAILURE = 0x0c, //!< Many to one route failure
ADDRESS_CONFLICT = 0x0d, //!< Address conflict
VERIFY_ADDRESS = 0x0e, //!< Verify address
PAN_IDENTIFIER_UPDATE = 0x0f, //!< PAN identifier update
NETWORK_ADDRESS_UPDATE = 0x10, //!< Network address update
BAD_FRAME_COUNTER = 0x11, //!< Bad frame counter
BAD_KEY_SEQUENCE_NUMBER = 0x12, //!< Bad key sequence number
UNKNOWN_COMMAND = 0x13 //!< Unknown command
};
/**
* @ingroup Zigbee
*
* Channel List Structure. See Zigbee Specification 3.2.2.2.1
*/
struct ChannelList
{
uint8_t channelPageCount; //!< The number of the channel page structures contained in
//!< the channel list structure.
std::vector<uint32_t> channelsField; //!< The set of channels for a given page.
ChannelList()
: channelPageCount(1),
channelsField{ALL_CHANNELS}
{
}
};
/**
* @ingroup Zigbee
*
* NLDE-DATA.confirm params. See Zigbee Specification 3.2.1.2
*/
struct NldeDataConfirmParams
{
NwkStatus m_status{NwkStatus::INVALID_PARAMETER}; //!< The status of
//!< the corresponding request.
uint8_t m_nsduHandle{0}; //!< The handle associated with the NSDU being confirmed.
Time m_txTime{Seconds(0)}; //!< The time indication for the transmitted packet
//!< based on the local clock.
};
/**
* @ingroup Zigbee
*
* NLDE-DATA.indication params. See Zigbee Specification 3.2.1.3.1
*/
struct NldeDataIndicationParams
{
AddressMode m_dstAddrMode{UCST_BCST}; //!< Destination address mode.
//!< 0x01=MCST, 0x02=BCST or UCST
Mac16Address m_dstAddr; //!< The destination address to which the NSDU was sent
Mac16Address m_srcAddr; //!< The individual device address from which the NSDU originated
uint32_t m_nsduLength{0}; //!< The number of octets comprising the NSDU being indicated
uint8_t m_linkQuality{0}; //!< LQI value delivered by the MAC on receipt of this frame
Time m_rxTime{Seconds(0)}; //!< A time indication for the received packet
//!< based on the local clock
bool m_securityUse{false}; //!< An indication of whether the received data is using security
};
/**
* @ingroup Zigbee
*
* NLDE-DATA.request params. See Zigbee Specification 3.2.1.1
*/
struct NldeDataRequestParams
{
AddressMode m_dstAddrMode{UCST_BCST}; //!< Destination address mode.
//!< 0x01=MCST, 0x02=BCST or UCST
Mac16Address m_dstAddr; //!< The destination address.
uint32_t m_nsduLength{0}; //!< The number of octets comprising the NSDU to be transferred.
uint8_t m_nsduHandle{0}; //!< The NSDU handle
bool m_useAlias{false}; //!< Indicates if next higher layer use an alias for the current frame.
Mac16Address m_aliasSrcAddr; //!< The source address to be used by this NSDU
//!< (ignored ifuseAlias = false).
SequenceNumber8 m_aliasSeqNumber; //!< The sequence number used by this NSDU
//!< (ignored if useAlias = false).
uint8_t m_radius{0}; //!< Distance in hops that the frame is allowed to
//!< travel through the network.
uint8_t m_nonMemberRadius{0}; //!< Distance in hops that a multicast frame will be relayed by
//!< nodes not a member of the group. 0x07 = Infinity.
uint8_t m_discoverRoute{0}; //!< 0x01 Enable Route Discovery | 0x00: Suppress Route discovery
bool m_securityEnable{false}; //!< Enable NWK layer security for the current frame.
};
/**
* @ingroup Zigbee
*
* NLME-NETWORK-FORMATION.request params. See Zigbee Specification 3.2.2.5.1
*/
struct NlmeNetworkFormationRequestParams
{
ChannelList m_scanChannelList; //!< A structure
//!< that contain a description on the pages and
//!< their channels to be scanned.
uint8_t m_scanDuration; //!< The time spent of each channel in symbols:
//!< aBaseSuperframeDuriantion * (2n+1). n=0-14
uint8_t m_beaconOrder; //!< The beacon order
uint8_t m_superFrameOrder; //!< The superframe order
bool m_batteryLifeExtension; //!< True: The zigbee coordinator is started supporting
//!< battery extension mode.
bool m_distributedNetwork; //!< Indicates that distributed security will be used.
Mac16Address m_distributedNetworkAddress; //!< The address of the device in a
//!< distributed network.
NlmeNetworkFormationRequestParams()
: m_scanChannelList{},
m_scanDuration(14),
m_beaconOrder(15),
m_superFrameOrder(15),
m_batteryLifeExtension(false),
m_distributedNetwork(false),
m_distributedNetworkAddress("FF:F7")
{
}
};
/**
* @ingroup Zigbee
*
* A group of pending parameters arranged into a structure during the execution of
* a NLME-NETWORK-FORMATION.request primitive.
*/
struct NetFormPendingParamsGen : public SimpleRefCount<NetFormPendingParamsGen>
{
uint8_t channel{0}; //!< The channel selected during the initial steps of a network formation
uint8_t page{0}; //!< The page selected during the initial steps of a network formation.
uint16_t panId{0}; //!< The PAN id selected during the initial steps of a network formation.
};
/**
* @ingroup Zigbee
*
* NLME-NETWORK-FORMATION.confirm params. See Zigbee Specification 3.2.2.6.1
*/
struct NlmeNetworkFormationConfirmParams
{
NwkStatus m_status{NwkStatus::INVALID_PARAMETER}; //!< The status as a result of
//!< this request
};
/**
* @ingroup Zigbee
*
* NLME-ROUTE-DISCOVERY.request params. See Zigbee Specification 3.2.2.33
*/
struct NlmeRouteDiscoveryRequestParams
{
AddressMode m_dstAddrMode{UCST_BCST}; //!< Specifies the kind of destination address.
Mac16Address m_dstAddr; //!< The 16-bit destination address or Group ID (MCST destination)
//!< of the route discovery.
uint16_t m_radius{0}; //!< Optional parameter that describes the number of hops that the
//!< route request will travel through the network.
bool m_noRouteCache{true}; //!< This flag determines whether the NWK should establish a
//!< route record table.
};
/**
* @ingroup Zigbee
*
* NLME-ROUTE-DISCOVERY.confirm params. See Zigbee Specification r22.1.0, 3.2.2.34
*/
struct NlmeRouteDiscoveryConfirmParams
{
NwkStatus m_status{NwkStatus::INVALID_PARAMETER}; //!< The status as a result of
//!< this request.
NetworkStatusCode m_networkStatusCode{NetworkStatusCode::UNKNOWN_COMMAND}; //!< In case where
//!< the status parameter has a value of ROUTE_ERROR, this code gives further information about
//!< the error occurred. Otherwise, it should be ignored.
};
/**
* @ingroup Zigbee
*
* NLME-DIRECT-JOIN.request params.
* See Zigbee Specification r22.1.0, 3.2.2.16
*/
struct NlmeDirectJoinRequestParams
{
Mac64Address m_deviceAddr; //!< The EUI-64 bit address of the device directly joined.
uint8_t m_capabilityInfo; //!< The operating capabilities of the device
//!< being directly joined
};
/**
* @ingroup Zigbee
*
* NLME-DIRECT-JOIN.confirm params.
* See Zigbee Specification r22.1.0, 3.2.2.17
*/
struct NlmeDirectJoinConfirmParams
{
NwkStatus m_status{NwkStatus::INVALID_PARAMETER}; //!< The status
//!< the corresponding request.
Mac64Address m_deviceAddr; //!< The IEEE EUI-64 address in the request to
//!< which this is a confirmation.
};
/**
* @ingroup Zigbee
*
* NLME-NETWORK-DISCOVERY.request params.
* See Zigbee Specification r22.1.0, 3.2.2.3
*/
struct NlmeNetworkDiscoveryRequestParams
{
ChannelList m_scanChannelList; //!< The list of all channel pages and the associated
//!< channels that shall be scanned.
uint8_t m_scanDuration{0}; //!< A value used to calculate the length of time to spend
};
/**
* @ingroup lr-wpan
*
* Network Descriptor, Zigbee Specification r22.1.0, 3.2.2.4, Table 3-12
*/
struct NetworkDescriptor
{
uint64_t m_extPanId{0xFFFFFFFFFFFFFFFE}; //!< The 64-bit PAN identifier of the network.
uint16_t m_panId{0xFFFF}; //!< The 16-bit PAN identifier of the network.
uint8_t m_updateId{0}; //!< The value of the UpdateID from the NIB.
uint8_t m_logCh{11}; //!< The current channel number occupied by the network.
StackProfile m_stackProfile{ZIGBEE_PRO}; //!< The Zigbee stack profile identifier in use in
//!< the discovered network.
uint8_t m_zigbeeVersion; //!< The version of the zigbee protocol in use in
//!< the discovered network.
uint8_t m_beaconOrder{15}; //!< The beacon order value of the underlying MAC
//!< (Determinates the beacon frequency, 15 = No beacon)
uint8_t m_superframeOrder{15}; //!< The superframe order value of the underlying MAC
//!< (Determinates the value of the active period)
bool m_permitJoining{true}; //!< TRUE = Indicates that at least one zigbee router on the
//!< network currently permits joining.
bool m_routerCapacity{true}; //!< TRUE = The device is able to accept join requests from
//!< router-capable devices.
bool m_endDeviceCapacity{true}; //!< TRUE= The device is able to accept join request from
//!< end devices.
};
/**
* @ingroup Zigbee
*
* NLME-NETWORK-DISCOVERY.confirm params. See Zigbee Specification r22.1.0, 3.2.2.4
*/
struct NlmeNetworkDiscoveryConfirmParams
{
NwkStatus m_status{NwkStatus::INVALID_PARAMETER}; //!< The status of
//!< the corresponding request.
uint8_t m_networkCount{0}; //!< Gives the number of networks discovered by the search
std::vector<NetworkDescriptor> m_netDescList; //!< A list of descriptors,
//!< one for each of the networks discovered.
};
/**
* @ingroup Zigbee
*
* NLME-JOIN.request params.
* See Zigbee Specification r22.1.0, 3.2.2.13
*/
struct NlmeJoinRequestParams
{
uint64_t m_extendedPanId{1}; //!< The 64 bit PAN identifier of the
//!< the network to join.
JoiningMethod m_rejoinNetwork; //!< This parameter controls the method of joining the
//!< network.
ChannelList m_scanChannelList; //!< The list of all channel pages and the associated
//!< channels that shall be scanned.
uint8_t m_scanDuration{0}; //!< A value used to calculate the length of time to spend
//!< scanning each channel.
uint8_t m_capabilityInfo; //!< The operating capabilities of the device
//!< being directly joined (Bit map).
bool m_securityEnable{false}; //!< If the value of RejoinNetwork is REJOINING and this
//!< value is true, the device will rejoin securely.
};
/**
* @ingroup Zigbee
*
* NLME-JOIN.confirm params.
* See Zigbee Specification r22.1.0, 3.2.2.15
*/
struct NlmeJoinConfirmParams
{
NwkStatus m_status; //!< The status of
//!< the corresponding request.
Mac16Address m_networkAddress; //!< The 16 bit network address that was allocated
//!< to this device. Equal to 0xFFFF if association
//!< was unsuccessful.
uint64_t m_extendedPanId; //!< The extended 64 bit PAN ID for the network of which the
//!< device is now a member.
ChannelList m_channelList; //!< The structure indicating the current channel of the
//!< network that has been joined.
bool m_enhancedBeacon; //!< True if using enhanced beacons (placeholder, not supported)
uint8_t m_macInterfaceIndex; //!< The value of the MAC index from nwkMacInterfaceTable.
//!< (placeholder, not supported)
NlmeJoinConfirmParams()
: m_status(NwkStatus::INVALID_REQUEST),
m_networkAddress("FF:FF"),
m_extendedPanId(1),
m_channelList{},
m_enhancedBeacon(false),
m_macInterfaceIndex(0)
{
}
};
/**
* @ingroup Zigbee
*
* NLME-JOIN.indication params.
* See Zigbee Specification r22.1.0, 3.2.2.14
*/
struct NlmeJoinIndicationParams
{
Mac16Address m_networkAddress{0xFFFF}; //!< The 16 bit network address of an entity that
//!< has been added to the network.
Mac64Address m_extendedAddress; //!< The EUI-64 bit address of an entity that has been added
//!< to the network.
uint8_t m_capabilityInfo; //!< Specifies the operational capabilities of the
//!< joining device.
JoiningMethod m_rejoinNetwork; //!< This parameter indicates the method used to
//!< join the network.
bool m_secureRejoin{false}; //!< True if the rejoin was performed in a secure manner.
};
/**
* @ingroup Zigbee
*
* NLME-START-ROUTER.request params.
* See Zigbee Specification r22.1.0, 3.2.2.13
*/
struct NlmeStartRouterRequestParams
{
uint8_t m_beaconOrder{15}; //!< The beacon order of the network
uint8_t m_superframeOrder{15}; //!< The superframe order of the network
bool m_batteryLifeExt{false}; //!< True if the router supports battery life extension mode.
};
/**
* @ingroup Zigbee
*
* NLME-START-ROUTER.confirm params.
* See Zigbee Specification r22.1.0, 3.2.2.10
*/
struct NlmeStartRouterConfirmParams
{
NwkStatus m_status{NwkStatus::INVALID_REQUEST}; //!< The status of
//!< the corresponding request.
};
/**
* @ingroup Zigbee
*
* Class that implements the Zigbee Specification Network Layer
*/
class ZigbeeNwk : public Object
{
public:
/**
* Get the type ID.
*
* @return the object TypeId
*/
static TypeId GetTypeId();
/**
* Default constructor.
*/
ZigbeeNwk();
~ZigbeeNwk() override;
/**
* This callback is called after a NSDU has successfully received and
* NWK push it to deliver it to the next higher layer.
*/
using NldeDataIndicationCallback = Callback<void, NldeDataIndicationParams, Ptr<Packet>>;
/**
* This callback is used to notify the next higher layer with a confirmation in response to
* a previously issued NLDE-DATA.request.
*/
using NldeDataConfirmCallback = Callback<void, NldeDataConfirmParams>;
/**
* This callback is used to notify the next higher layer with a confirmation in response to
* a previously issued NLME-NETWORK-FORMATION.request.
*/
using NlmeNetworkFormationConfirmCallback = Callback<void, NlmeNetworkFormationConfirmParams>;
/**
* This callback is used to notify the next higher layer with a confirmation in response to
* a previously issued NLME-NETWORK-DISCOVERY.request.
*/
using NlmeNetworkDiscoveryConfirmCallback = Callback<void, NlmeNetworkDiscoveryConfirmParams>;
/**
* This callback is used to notify the next higher layer with a confirmation in response to
* a previously issued NLME-ROUTE-DISCOVERY.request.
*/
using NlmeRouteDiscoveryConfirmCallback = Callback<void, NlmeRouteDiscoveryConfirmParams>;
/**
* This callback is used to notify the next higher layer with a confirmation in response to
* a previously issued NLME-DIRECT-JOIN.request.
*/
using NlmeDirectJoinConfirmCallback = Callback<void, NlmeDirectJoinConfirmParams>;
/**
* This callback is used to notify the next higher layer with a confirmation in response to
* a previously issued NLME-JOIN.request.
*/
using NlmeJoinConfirmCallback = Callback<void, NlmeJoinConfirmParams>;
/**
* This callback is used to notify the next higher layer with an indication that a new
* device has successfully joined its network by association or rejoining.
*/
using NlmeJoinIndicationCallback = Callback<void, NlmeJoinIndicationParams>;
/**
* This callback is used to notify the next higher layer with a confirmation in response to
* a previously issued NLME-START-ROUTER.request.
*/
using NlmeStartRouterConfirmCallback = Callback<void, NlmeStartRouterConfirmParams>;
/**
* Set the underlying MAC to use in this Zigbee NWK
*
* @param mac The pointer to the underlying LrWpan MAC to set to this Zigbee NWK
*/
void SetMac(Ptr<lrwpan::LrWpanMacBase> mac);
/**
* Get the group table used by this Zigbee NWK.
*
* @param groupTable The pointer to the group table to set.
*/
void SetGroupTable(Ptr<ZigbeeGroupTable> groupTable);
/**
* Get the underlying MAC used by the current Zigbee NWK.
*
* @return The pointer to the underlying MAC object currently connected to the Zigbee NWK.
*/
Ptr<lrwpan::LrWpanMacBase> GetMac() const;
/**
* Print the entries in the routing table.
*
* @param stream The stream object used to print.
*/
void PrintRoutingTable(Ptr<OutputStreamWrapper> stream) const;
/**
* Print the entries in the route discovery table.
*
* @param stream The stream object used to print.
*/
void PrintRouteDiscoveryTable(Ptr<OutputStreamWrapper> stream);
/**
* Print the entries in the neighbor table.
*
* @param stream The stream object used to print.
*/
void PrintNeighborTable(Ptr<OutputStreamWrapper> stream) const;
/**
* Print the entries in the RREQ retry table.
*
* @param stream The stream object used to print.
*/
void PrintRREQRetryTable(Ptr<OutputStreamWrapper> stream) const;
/**
* Search for a specific destination in this device
* neighbor and routing tables.
* This function is only a quick reference used for debugging
* purposes.
*
* @param dst The destination to search in our tables
* @param neighbor A flag indicating whether or not the returned
* next hop was found in our neighbor table.
* @return The nexthop address to the destination.
*/
Mac16Address FindRoute(Mac16Address dst, bool& neighbor);
/**
* Obtain this device 16 bit network address (A.K.A. short address).
*
* This function should only be used for debugging purposes and it
* should not be use by higher layers. Higher layers should use
* NLME-GET.request instead to obtain this attribute.
*
* @return Returns this device's 16 bit network address.
*/
Mac16Address GetNetworkAddress() const;
/**
* Obtain this device 64 bit IEEE address (A.K.A. extended address).
*
* This function should only be used for debugging purposes and it
* should not be use by higher layers. Higher layers should use
* NLME-GET.request instead to obtain this attribute.
*
* @return Returns this device's 16 bit network address.
*/
Mac64Address GetIeeeAddress() const;
/**
* IEEE 802.15.4-2011 section 6.3.3
* MCPS-DATA.indication
* Indicates the reception of an MSDU from MAC to NWK (receiving)
*
* @param params The MCPS-DATA.indication parameters.
* @param msdu The set of octets forming the MSDU.
*/
void McpsDataIndication(lrwpan::McpsDataIndicationParams params, Ptr<Packet> msdu);
/**
* IEEE 802.15.4-2011 section 6.3.2
* MCPS-DATA.confirm
* Reports the results of a request to a transfer data to another device.
*
* @param params The MCPS-DATA.confirm parameters.
*/
void McpsDataConfirm(lrwpan::McpsDataConfirmParams params);
/**
* IEEE 802.15.4-2011 section 6.2.10.2
* MLME-SCAN.confirm
* Reports the results of a scan request.
*
* @param params The MLME-SCAN.confirm parameters.
*/
void MlmeScanConfirm(lrwpan::MlmeScanConfirmParams params);
/**
* IEEE 802.15.4-2011 section
* MlME-ASSOCIATE.confirm
* Report the results of an associate request attempt.
*
* @param params The MLME-ASSOCIATE.confirm parameters.
*/
void MlmeAssociateConfirm(lrwpan::MlmeAssociateConfirmParams params);
/**
* IEEE 802.15.4-2011 section 7.1.14.2
* MLME-START.confirm
* Reports the results of a network start request.
*
* @param params The MLME-START.confirm parameters.
*/
void MlmeStartConfirm(lrwpan::MlmeStartConfirmParams params);
/**
* IEEE 802.15.4-2011 section 6.2.11.2
* MLME-SET.confirm
* Reports the result of an attempt to change a MAC PIB attribute.
*
* @param params The MLME-SET.confirm params
*/
void MlmeSetConfirm(lrwpan::MlmeSetConfirmParams params);
/**
* IEEE 802.15.4-2011 section 6.2.5.1
* MLME-GET.confirm
* Reports the result of an attempt to obtain a MAC PIB attribute.
*
* @param status The status as a result of a MLME-GET.request operation
* @param id The identififier of the attribute requested
* @param attribute The value of of the attribute requested
*/
void MlmeGetConfirm(lrwpan::MacStatus status,
lrwpan::MacPibAttributeIdentifier id,
Ptr<lrwpan::MacPibAttributes> attribute);
/**
* IEEE 802.15.4-2011 sections 6.2.7.1,
* Zigbee Specification r22.1.0 Section 3.6.1.4.3 (parent procedure)
* MLME-ORPHAN.indication
* Generated by the coordinator and issued to its next higher
* layer on receipt of an orphan notification command, as defined
* in 5.3.6.
*
* @param params The MLME-ORPHAN.indication parameters
*/
void MlmeOrphanIndication(lrwpan::MlmeOrphanIndicationParams params);
/**
* IEEE 802.15.4-2011 section 6.2.4.2
* MLME-COMM-STATUS.indication
* Allows the MAC MLME to indicate a communication status.
*
* @param params The MLME-COMM-STATUS.indication parameters
*/
void MlmeCommStatusIndication(lrwpan::MlmeCommStatusIndicationParams params);
/**
* IEEE 802.15.4-2011, Section 6.2.4.1
* MLME-BEACON-NOTIFY.indication
* Allows the MAC MLME to indicate the reception of a beacon with payload.
*
* @param params The MLME-BEACON-NOTIFY.indication parameters
*/
void MlmeBeaconNotifyIndication(lrwpan::MlmeBeaconNotifyIndicationParams params);
/**
* IEEE 802.15.4-2011, Section 6.2.2.2.
* MLME-ASSOCIATE.indication
* Allows the MAC MLME to indicate the reception of an associate request
* on a PAN coordinator or router. In the Zigbee specification this implements
* the parent procedure when a device join a network through association
* (See Zigbee specification r22.1.0, Section 3.6.1.4.1)
*
* @param params The MLME-ASSOCIATE.indication parameters
*/
void MlmeAssociateIndication(lrwpan::MlmeAssociateIndicationParams params);
/**
* Zigbee Specification r22.1.0, Section 3.2.1.1
* NLDE-DATA.request
* Request to transfer a NSDU.
*
* @param params the request parameters
* @param packet the NSDU to be transmitted
*/
void NldeDataRequest(NldeDataRequestParams params, Ptr<Packet> packet);
/**
* Zigbee Specification r22.1.0, Section 3.2.2.5 and 3.6.1.1
* NLME-NETWORK-FORMATION.request
* Request the formation of a network in a capable device.
*
* @param params the network formation request params
*/
void NlmeNetworkFormationRequest(NlmeNetworkFormationRequestParams params);
/**
* Zigbee Specification r22.1.0, section 3.2.2.33.3 and 3.6.3.5
* NLME-ROUTE-DISCOVERY.request
* Allows the next higher layer to initiate route discovery.
*
* @param params the route discovery request params
*/
void NlmeRouteDiscoveryRequest(NlmeRouteDiscoveryRequestParams params);
/**
* Zigbee Specification r22.1.0, section 3.2.2.3
* NLME-NETWORK-DISCOVERY.request
* Allows the next higher layer to request that the NWK layer discover
* networks currently operating within the personal operating space (POS).
*
* @param params the network discovery request params
*/
void NlmeNetworkDiscoveryRequest(NlmeNetworkDiscoveryRequestParams params);
/**
* Zigbee Specification r22.1.0, section 3.2.2.16 and 3.6.1.4.3
* NLME-DIRECT-JOIN.request
* Allows the next layer of a Zigbee coordinator or router to request to
* directly join another device to its network
*
* @param params the direct join request params
*/
void NlmeDirectJoinRequest(NlmeDirectJoinRequestParams params);
/**
* Zigbee Specification r22.1.0, section 3.2.2.13
* NLME-JOIN.request
* This primitive allows the next higher layer to request to join or rejoin a
* network, or to change the operating channel for the device while within an
* operating network.
*
* @param params the join request params
*/
void NlmeJoinRequest(NlmeJoinRequestParams params);
/**
* Zigbee Specification r22.1.0, section 3.2.2.9
* NLME-START-ROUTER.request
* This primitive allows the next higher layer of a Zigbee router to initiate
* the activities expected of a Zigbee router including the routing of data
* framaes, route discovery, and the accepting of request to join the network
* from other devices.
*
* @param params the join request params
*/
void NlmeStartRouterRequest(NlmeStartRouterRequestParams params);
/**
* Set the callback for the end of a RX, as part of the
* interconnections between the NWK and the APS sublayer. The callback
* implements the callback used in a NLDE-DATA.indication.
* @param c the NldeDataIndication callback
*/
void SetNldeDataIndicationCallback(NldeDataIndicationCallback c);
/**
* Set the callback as part of the interconnections between the NWK and
* the APS sublayer (or any other higher layer). The callback
* implements the callback used in a NLDE-DATA.confirm
*
* @param c the NldeDataConfirm callback
*/
void SetNldeDataConfirmCallback(NldeDataConfirmCallback c);
/**
* Set the callback as part of the interconnections between the NWK and the
* APS sublayer (or any other higher layer). The callback implements the callback
* used in a NLME-NETWORK-FORMATION.confirm
* @param c the NlmeNetworkFormationConfirm callback
*/
void SetNlmeNetworkFormationConfirmCallback(NlmeNetworkFormationConfirmCallback c);
/**
* Set the callback as part of the interconnections between the NWK and the
* APS sublayer (or any other higher layer). The callback implements the callback
* used in a NLME-NETWORK-DISCOVERY.confirm
* @param c the NlmeNetworkDiscoveryConfirm callback
*/
void SetNlmeNetworkDiscoveryConfirmCallback(NlmeNetworkDiscoveryConfirmCallback c);
/**
* Set the callback as part of the interconnections between the NWK and the
* APS sublayer (or any other higher layer). The callback implements the callback
* used in a NLME-ROUTE-DISCOVERY.confirm
*
* @param c the NlmeRouteDiscoveryConfirm callback
*/
void SetNlmeRouteDiscoveryConfirmCallback(NlmeRouteDiscoveryConfirmCallback c);
/**
* Set the callback as part of the interconnections between the NWK and the
* APS sublayer (or any other higher layer). The callback implements the callback
* used in a NLME-DIRECT-JOIN.confirm
*
* @param c the NlmeDirectJoinConfirm callback
*/
void SetNlmeDirectJoinConfirmCallback(NlmeDirectJoinConfirmCallback c);
/**
* Set the callback as part of the interconnections between the NWK and the
* APS sublayer (or any other higher layer). The callback implements the callback
* used in a NLME-JOIN.confirm
*
* @param c the NlmeJoinConfirm callback
*/
void SetNlmeJoinConfirmCallback(NlmeJoinConfirmCallback c);
/**
* Set the callback as part of the interconnections between the NWK and the
* APS sublayer (or any other higher layer). The callback implements the callback
* used in a NLME-JOIN.indication
*
* @param c the NlmeJoinIndication callback
*/
void SetNlmeJoinIndicationCallback(NlmeJoinIndicationCallback c);
/**
* Set the callback as part of the interconnections between the NWK and the
* APS sublayer (or any other higher layer). The callback implements the callback
* used in a NLME-START-ROUTER.confirm
*
* @param c the NlmeStartRouterConfirm callback
*/
void SetNlmeStartRouterConfirmCallback(NlmeStartRouterConfirmCallback c);
/**
* Assign a fixed random variable stream number to the random variables
* used by this model. Return the number of streams (possibly zero) that
* have been assigned.
*
* @param stream first stream index to use
* @return the number of stream indices assigned by this model
*/
int64_t AssignStreams(int64_t stream);
/**
* TracedCallback signature for RreqRetriesExhaustedTrace events.
*
* @param rreqId The RREQ id used in the retries
* @param dst The destination address of the RREQ retries
* @param rreqRetriesNum The number of rreq retries attempted
*
*/
typedef void (*RreqRetriesExhaustedTracedCallback)(uint8_t rreqId,
Mac16Address dst,
uint8_t rreqRetriesNum);
protected:
void DoInitialize() override;
void DoDispose() override;
void NotifyConstructionCompleted() override;
private:
Ptr<lrwpan::LrWpanMacBase> m_mac; //!< Pointer to the underlying MAC
//!< connected to this Zigbee NWK.
/**
* Structure representing an element in the pending transaction queue.
*/
struct PendingTxPkt : public SimpleRefCount<PendingTxPkt>
{
uint8_t nsduHandle; //!< The NSDU handle
Mac16Address dstAddr; //!< The destination network Address
Ptr<Packet> txPkt; //!< The pending packet.
Time expireTime; //!< The expiration time of the packet
};
/**
* The pending transaction queue of data packets awaiting to be transmitted
* until a route to the destination becomes available.
*/
std::deque<Ptr<PendingTxPkt>> m_pendingTxQueue;
/**
* The maximum size of the pending transaction queue.
*/
uint32_t m_maxPendingTxQueueSize;
/**
* Structure representing an element in the Tx Buffer.
*/
struct TxPkt : public SimpleRefCount<TxPkt>
{
uint8_t macHandle; //!< The mac handle (msdu handle).
uint8_t nwkHandle; //!< The nwk handle (nsdu handle).
Ptr<Packet> txPkt; //!< The buffered packet.
};
/**
* The transmission buffer. Copies of DATA packets are stored here
* for post transmission handling.
*/
std::deque<Ptr<TxPkt>> m_txBuffer;
/**
* The maximum size of the transmission buffer
*/
uint8_t m_txBufferMaxSize;
///////////////
// Callbacks //
///////////////
/**
* A trace source that fires when a node has reached the maximum number
* of RREQ retries allowed. The trace provides the RREQ Id, the destination
* address of the RREQ and the number of the maximum allowed retries from
* this node.
*
*/
TracedCallback<uint8_t, Mac16Address, uint8_t> m_rreqRetriesExhaustedTrace;
/**
* This callback is used to notify incoming packets to the APS sublayer.
* See Zigbee Specification r22.1.0, section 6.2.1.3.
*/
NldeDataIndicationCallback m_nldeDataIndicationCallback;
/**
* This callback is used to respond to data PDU (NSDU) transfer
* request issued by APS sublayer to the NWK (or a layer higher to NWK).
* See Zigbee specification r22.1.0, section 3.2.1.2.
*/
NldeDataConfirmCallback m_nldeDataConfirmCallback;
/**
* This callback is used to to notify the results of a network
* formation to the APS sublayer making the request.
* See Zigbee specification r22.1.0, section 3.2.2.5
*/
NlmeNetworkFormationConfirmCallback m_nlmeNetworkFormationConfirmCallback;
/**
* This callback is used to to notify the results of a network
* formation to the APS sublayer making the request.
* See Zigbee specification r22.1.0, section 3.2.2.4
*/
NlmeNetworkDiscoveryConfirmCallback m_nlmeNetworkDiscoveryConfirmCallback;
/**
* This callback is used to to notify the results of a network
* formation to the APS sublayer making the request.
* See Zigbee specification r22.1.0, section 3.2.2.34
*/
NlmeRouteDiscoveryConfirmCallback m_nlmeRouteDiscoveryConfirmCallback;
/**
* This callback is used by the next layer of a zigbee coordinator or
* router to be notified of the result of its request to directly join
* another device to its network
* See Zigbee specification r22.1.0, section 3.2.2.17
*/
NlmeDirectJoinConfirmCallback m_nlmeDirectJoinConfirmCallback;
/**
* This callback is used by the next layer of a zigbee router or device
* to be notified of the result of its request to join
* another device network.
* See Zigbee specification r22.1.0, section 3.2.2.15
*/
NlmeJoinConfirmCallback m_nlmeJoinConfirmCallback;
/**
* This callback is used by the next layer of a zigbee coordinator or
* router to be notified when a new device has successfully joined its
* network by association or rejoined procedures.
* See Zigbee specification r22.1.0, section 3.2.2.14
*/
NlmeJoinIndicationCallback m_nlmeJoinIndicationCallback;
/**
* This callback is used by the next layer of a zigbee router or device
* to be notified of the result of its request to initiate activities
* as a zigbee router
* See Zigbee specification r22.1.0, section 3.2.2.10
*/
NlmeStartRouterConfirmCallback m_nlmeStartRouterConfirmCallback;
/**
* The parameters used during a NLME-NETWORK-FORMATION.request. These parameters
* are stored here while the scanning operations and network initialization
* procedures take place.
*/
NlmeNetworkFormationRequestParams m_netFormParams;
/**
* The values temporarily stored as a result of the initial steps of a
* NLME-NETWORK-FORMATION.request (i.e. after the first energy scan)
* Page, Channel, PanId.
*/
Ptr<NetFormPendingParamsGen> m_netFormParamsGen;
/**
* The parameters used during a NLME-JOIN.request. These parameters
* are stored here while the scanning operations and network joining
* procedures take place.
*/
NlmeJoinRequestParams m_joinParams;
/**
* Temporarily store the NLME-JOIN.indication parameters while the
* join operations (asocciation) conclude in the coordinator or router.
*/
NlmeJoinIndicationParams m_joinIndParams;
/**
* Temporarily store the NLME-START-ROUTER.request parameters during
* the router initialization process.
*/
NlmeStartRouterRequestParams m_startRouterParams;
/**
* Temporarily store MLME-ASSOCIATE.request parameters
* during a NLME-JOIN.request.
*/
lrwpan::MlmeAssociateRequestParams m_associateParams;
/**
* The maximum acceptable energy level used in an energy scan taking place
* during a NLME-NETWORK-FORMATION.request.
*/
uint8_t m_scanEnergyThreshold;
/**
* Contains the list of channels with acceptable energy levels in a bitmap form.
* This is the result of an Energy Detection (ED) scan during
* a NLME-NETWORK-FORMATION.request
*/
uint32_t m_filteredChannelMask;
/**
* Indicates the current primitive in use in the NWK layer.
*/
PendingPrimitiveNwk m_pendPrimitiveNwk;
/**
* The network layer neighbor table
* See Zigbee specification r22.1.0, 3.6.1.5
*/
NeighborTable m_nwkNeighborTable;
/**
* Use to keep track of neighboring 16 bit PAN id.
* This information is used during the Join process (Association).
*/
PanIdTable m_panIdTable;
/**
* The network layer routing table
* See Zigbee specification r22.1.0, 3.6.3.2
*/
RoutingTable m_nwkRoutingTable;
/**
* The network route discovery table
* See Zigbee specification r22.1.0, 3.6.3.2
*/
RouteDiscoveryTable m_nwkRouteDiscoveryTable;
/**
* Keep track of all the route request retries.
*/
RreqRetryTable m_rreqRetryTable;
/**
* The broadcast transaction table.
* See Zigbee specification r22.1.0, 3.6.5
*/
BroadcastTransactionTable m_btt;
/**
* The Group Table used by this Zigbee NWK.
* See Zigbee specification r22.1.0, 3.6.3.2
*/
Ptr<ZigbeeGroupTable> m_nwkGroupIdTable;
/**
* Enqueue a packet in the pending transmission queue until
* a route is discovered for its destination.
*
* @param p The packet to enqueue.
* @param nsduHandle The handle associated to this packet
*/
void EnqueuePendingTx(Ptr<Packet> p, uint8_t nsduHandle);
/**
* Dequeue a packet previously enqueued in the pending transmission queue.
* This is called after a route has successfully be found and the DATA
* packet is ready to be transmitted.
*
* @param dst The destination of the packet
* @param entry The pending packet element
*
* @return True if successfully dequeued
*/
bool DequeuePendingTx(Mac16Address dst, Ptr<PendingTxPkt> entry);
/**
* Dispose of all PendingTxPkt accumulated in the pending transmission queue.
*/
void DisposePendingTx();
/**
* Buffer a copy of a DATA frame for post transmission handling
* (Transmission failure counts, retransmission of DATA broadcasts,
* push of confirm notifications to the next layer)
*
* @param p The DATA packet to be buffered in the TxPkt buffer.
* @param macHandle The mac layer handle (msdu handle) associated to this frame.
* @param nwkHandle The nwk layer handle (nsdu handle) associated to this frame.
*/
void BufferTxPkt(Ptr<Packet> p, uint8_t macHandle, uint8_t nwkHandle);
/**
* Retrieves a previously DATA frame buffered in the TxPkt buffer.
* If the frame is successfully retrieved, the entry is removed from the
* TxPkt buffer.
*
* @param macHandle The mac layer handle (msdu handle) associated to this frame.
* @param txPkt The packet buffered in the TxPkt buffer.
* @return True if the txPkt is successfully retrieved.
*/
bool RetrieveTxPkt(uint8_t macHandle, Ptr<TxPkt>& txPkt);
/**
* Dispose of all the entries in the TxPkt Buffer.
*/
void DisposeTxPktBuffer();
/**
* Cast a Mac layer status to a NWK layer status.
*
* @param macStatus The Mac layer status to be casted.
* @return The ZigbeeNwkStatus resulting from the cast.
*/
NwkStatus GetNwkStatus(lrwpan::MacStatus macStatus) const;
/**
* Used by a Zigbee coordinator or router to allocate a
* 16 bit address (A.K.A short address or network address)
* to its associated device upon request.
*
* @return The allocated 16 bit address by this router or Zigbee coordinator.
*/
Mac16Address AllocateNetworkAddress();
/**
* Create and store a MAC beacon payload, then updates its registered size in the MAC.
* This is typically followed by updating the content of the beacon payload.
*/
void UpdateBeaconPayloadLength();
/**
* Updates the content of the beacon payload with the most recent information in the NWK.
*/
void UpdateBeaconPayload();
/**
* Get a non linear representation of a Link Quality Indicator (LQI).
* This is used to obtain LQI representations used in the link cost/Path cost
* of a route discovery and the Outgoing cost in the neighbors table.
*
* @param lqi The LQI value (1-255) mapped
* @return The LQI value mapped to a non linear representation (1-7)
*/
uint8_t GetLQINonLinearValue(uint8_t lqi) const;
/**
* Obtain the link cost based on the value of the nwkReportConstantCost.
* If nwkReportConstantCost is True, the link will use a constant value of 7,
* if false, it will use the LQI to obtain the link cost.
* When the LQI option is used, the link cost is based on a non linear mapping
* of LQI values.
* See Zigbee specification r22.1.0, 3.6.3.1
* See NXP Zigbee 3.0 Stack User Guide (JN-UG-3113, revision 1.5), page 108.
*
* @param lqi The lqi value (1-255) used to calculate the link cost.
* @return The link cost (1-7).
*/
uint8_t GetLinkCost(uint8_t lqi) const;
/**
* Send a route request command.
* See Zigbee specification r22.1.0, Section 3.4.1
*
* @param nwkHeader The network header of the RREQ packet to send
* @param payload The payload header of the RREQ packet to send
* @param rreqRetries The maximum number of retries the broadcast transmission of a route
* request command frame is retried. Only valid for non Many-To-One RREQs.
*/
void SendRREQ(ZigbeeNwkHeader nwkHeader,
ZigbeePayloadRouteRequestCommand payload,
uint8_t rreqRetries);
/**
* Handles the reception of a route request command.
* See Zigbee specification r22.1.0, Section 3.6.3.5.2
*
* @param macSrcAddr The MAC header source address
* @param nwkHeader The received network Header
* @param payload The received route request command payload
* @param linkCost The link cost associated to the received RREQ
*/
void ReceiveRREQ(Mac16Address macSrcAddr,
uint8_t linkCost,
ZigbeeNwkHeader nwkHeader,
ZigbeePayloadRouteRequestCommand payload);
/**
* Construct and send a route reply command.
* See Zigbee specification r22.1.0, Section 3.4.2
*
* @param nextHop The address of the next hop in the path back to the RREQ originator.
* @param originator The address of the originator device of the first RREQ.
* @param responder The address of the first device responding to the RREQ with a RREP.
* @param rreqId The RREQ identifier of the originator RREQ.
* @param pathcost The sum value of link costs along the way.
*/
void SendRREP(Mac16Address nextHop,
Mac16Address originator,
Mac16Address responder,
uint8_t rreqId,
uint8_t pathcost);
/**
* Handles the reception of a route reply command.
* See Zigbee specification r22.1.0, Section 3.6.3.5.3
*
* @param macSrcAddr The MAC source address of this reply (a.k.a. previous hop)
* @param nwkHeader The received network Header
* @param payload The received route reply command payload
* @param linkCost The link cost associated to the received RREP
*/
void ReceiveRREP(Mac16Address macSrcAddr,
uint8_t linkCost,
ZigbeeNwkHeader nwkHeader,
ZigbeePayloadRouteReplyCommand payload);
/**
* Process a Multicast Frame received as a member of a multicast group.
* See Zigbee specification r22.1.0 Section 3.6.6.3
*
* @param nwkHeader The network header of the received multicast frame.
* @param msdu The MSDU (MSDU = MAC Service Data Unit) received
* @param params The MCPS-DATA.indication parameters associated to the received frame.
*/
void ReceiveMulticastMemberFrame(ZigbeeNwkHeader nwkHeader,
Ptr<Packet> msdu,
lrwpan::McpsDataIndicationParams params);
/**
* Process a Multicast Frame received as a non member of a multicast group.
* See Zigbee specification r22.1.0 Section 3.6.6.4
*
* @param nwkHeader The network header of the received multicast frame.
* @param msdu The MSDU (MSDU = MAC Service Data Unit) received
* @param params The MCPS-DATA.indication parameters associated to the received frame.
*/
void ReceiveMulticastNonMemberFrame(ZigbeeNwkHeader nwkHeader,
Ptr<Packet> msdu,
lrwpan::McpsDataIndicationParams params);
/**
* Returns true if the address is a broadcast address according to
* Zigbee specification r22.1.0, Section 3.6.5, Table 3-69
*
* @param address The address to compare to a broadcast address
* @return True if the address in a broadcast address
*/
bool IsBroadcastAddress(Mac16Address address);
/**
* Send a data unicast packet, and if necessary look for the next hop route
* and store the pending data transmission until a route is found.
*
* @param packet The NPDU (nwkHeader + data payload) to transmit.
* @param nwkHandle The NWK handle associated to this packet (nsdu handle).
* A handle of 0 implies that the unicast transmission is a
* retransmission and do not requires a handle which is
* used to identify a packet in confirmations to
* requests (NLDE-DATA.confirm).
*/
void SendDataUcst(Ptr<Packet> packet, uint8_t nwkHandle);
/**
* Send a data broadcast packet, and add a record to the broadcast transaction
* table (BTT).
*
* @param packet The NPDU (nwkHeader + data payload) to transmit.
* @param nwkHandle The NWK handle associated to this packet (nsdu handle).
* A handle of 0 implies that the unicast transmission is a
* retransmission and do not requires a handle which is
* used to identify a packet in confirmations to
* requests (NLDE-DATA.confirm).
*/
void SendDataBcst(Ptr<Packet> packet, uint8_t nwkHandle);
/**
* Send a data multicast packet to all the members of a multicast group.
*
* @param packet The NPDU (nwkHeader + data payload) to transmit.
* @param nwkHandle The NWK handle associated to this packet (nsdu handle).
* A handle of 0 implies that the unicast transmission is a
* retransmission and do not requires a handle which is
* used to identify a packet in confirmations to
* requests (NLDE-DATA.confirm).
*/
void SendDataMcst(Ptr<Packet> packet, uint8_t nwkHandle);
/**
* Find the next hop in route to a destination.
*
* See RouteDiscoveryStatus enumeration for full information on the returned status.
*
* @param macSrcAddr The MAC address received from the previous hop.
* @param pathCost The path cost accumulated in the route discovery so far.
* @param nwkHeader The network header created at the initiator or the received RREQ.
* @param payload The payload header of the initiator or the received RREQ.
* @param nextHop If the destination is found in the routing or neighbor tables
* it contains the address of the next hop towards the destination.
*
* @return The RouteDiscoveryStatus of the route search attempt
*/
RouteDiscoveryStatus FindNextHop(Mac16Address macSrcAddr,
uint8_t pathCost,
ZigbeeNwkHeader nwkHeader,
ZigbeePayloadRouteRequestCommand payload,
Mac16Address& nextHop);
/**
* Process Many-To-One routes. In essence, creating new routes or updating
* existing ones from information contained in the received RREQs.
*
* @param macSrcAddr The MAC address received from the previous hop
* @param pathCost The path cost accumulated in the route discovery so far.
* @param nwkHeader The network header created at the initiator or the received RREQ.
* @param payload The payload header created at the initiator or the received RREQ.
*
* @return The resulting RouteDiscoveryStatus of the Many-To-One process request.
*/
RouteDiscoveryStatus ProcessManyToOneRoute(Mac16Address macSrcAddr,
uint8_t pathCost,
ZigbeeNwkHeader nwkHeader,
ZigbeePayloadRouteRequestCommand payload);
/**
* Provides uniform random values
*/
Ptr<UniformRandomVariable> m_uniformRandomVariable;
/**
* Provides uniform random values for the route request jitter
*/
Ptr<UniformRandomVariable> m_rreqJitter;
/**
* Provides uniform random values for the broadcast jitter
*/
Ptr<UniformRandomVariable> m_bcstJitter;
/**
* Temporarily store beacons information from POS routers and PAN coordinators
* during a network-discovery process.
*/
std::vector<NetworkDescriptor> m_networkDescriptorList;
/**
* Points to the beacon payload used during the network formation process.
*/
Ptr<Packet> m_beaconPayload;
/**
* Used to store the value of the PHY current channel.
*/
uint8_t m_currentChannel;
/////////////////////////////
// Network layer constants //
/////////////////////////////
/**
* Indicates whether the device is capable of becoming the ZigBee coordinator
* Zigbee Specification r22.1.0, Table 3-57. Defined as a constant in the specification
* but here is defined as variable to be able to change the devices capabilities.
*/
bool m_nwkcCoordinatorCapable;
/**
* Indicates the version of the ZigBee NWK protocol in the device.
* Zigbee Specification r22.1.0, Table 3-57. Defined as a constant in the specification
* but here is defined as variable to be able to change the devices capabilities.
*/
uint8_t m_nwkcProtocolVersion;
/**
* Indicates the duration until a route discovery expires.
* Zigbee Specification r22.1.0, Table 3-57. Defined as a constant in the specification
* but here is defined as variable to be able to change the devices capabilities.
*/
Time m_nwkcRouteDiscoveryTime;
/**
* The number of times the first broadcast transmission of a route request command
* frame is retried. Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
* in the specification but here is defined as variable to allow the selection of values
* per device.
*/
uint8_t m_nwkcInitialRREQRetries;
/**
* The number of times the broadcast transmission of a route request command frame is
* retried on relay by an intermediate Zigbee router or coordinator.
* Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
* in the specification but here is defined as variable to allow the selection of values
* per device.
*/
uint8_t m_nwkcRREQRetries;
/**
* Count the number of retries this device has transmitted an RREQ
*/
uint8_t m_countRREQRetries;
/**
* Duration between retries of a broadcast route request command frame.
* Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
* in the specification but here is defined as variable to allow the selection of values
* per device.
*/
Time m_nwkcRREQRetryInterval;
/**
* Minimum Route request broadcast jitter time (msec).
* Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
* in the specification but here is defined as variable to allow the selection of values
* per device.
*/
double m_nwkcMinRREQJitter;
/**
* Maximum Route request broadcast jitter time (msec).
* Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
* in the specification but here is defined as variable to allow the selection of values
* per device.
*/
double m_nwkcMaxRREQJitter;
/**
* Minimum Broadcast jitter time (msec).
* Zigbee Specification r22.1.0, Table 3-57. Defined as a constant
* in the specification but here is defined as variable to allow the selection of values
* per device.
*/
double m_nwkcMaxBroadcastJitter;
//////////////////////////////
// Network layer attributes //
//////////////////////////////
/**
* A value that determines the method used to assign addresses.
* See Zigbee specification r22.1.0, Table 3-58
*/
AddrAllocMethod m_nwkAddrAlloc;
/**
* The depth a device can have.
* Default value defined in the stack profile.
* See Zigbee specification r22.1.0 Layer protocol implementation conformance statement (PICS)
* and stack profiles (Section 10.4.2.1)
*/
uint8_t m_nwkMaxDepth;
/**
* The number of children a device is allowed to have on its current network.
* Default value defined in the stack profile.
* See Zigbee PRO/2007 Layer protocol implementation conformance statement (PICS)
* and stack profiles (Section 10.4.2.1)
*/
uint16_t m_nwkMaxChildren;
/**
* The number of routers any one device is allowed to have as children. This is
* determined by the zigbee coordinator for all devices in the network.
* This value is not used if stochastic address allocation is used.
* Default value defined in the stack profile.
* See Zigbee PRO/2007 Layer protocol implementation conformance statement (PICS)
* and stack profiles (Section 10.4.2.1)
*/
uint16_t m_nwkMaxRouters;
/**
* Describes the current stack profile used in this NWK layer
*/
StackProfile m_nwkStackProfile;
/**
* Indicates the index of the requested timeout field that contains the timeout
* in minutes for any end device that does not negotiate a different timeout
* value.
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
uint16_t m_nwkEndDeviceTimeoutDefault;
/**
* The extended PAN identifier for the PAN of which the device is a member.
* A value of 0 means that the extended PAN identifier is unknown.
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
uint64_t m_nwkExtendedPanId;
/**
* The 16-bit address that the device uses to communicate with the PAN.
* This attribute reflects the value of the MAC PIB attribute macShortAddress
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
Mac16Address m_nwkNetworkAddress;
/**
* The EUI 64 bit IEEE address of the local device.
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
Mac64Address m_nwkIeeeAddress;
/**
* This NIB attribute should, at all times, have the same value as macPANId .
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
uint16_t m_nwkPanId;
/**
*
* The behavior depends upon whether the device is a FFD or RFD.
* For RFD, this records the information received in an End device timeout
* response command indicating the parent information (Table 3-55).
* For FFD, this records the device's local capabilities.
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
uint8_t m_nwkParentInformation;
/**
* This NIB attribute contains the device capability information established
* at network joining time.
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
uint8_t m_nwkCapabilityInformation;
/**
* This NIB attribute is a flag determining if this device is a concentrator
* (Use in Many-To-One routing).
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
bool m_nwkIsConcentrator;
/**
* This NIB attribute indicates the hop count radius for concentrator
* route discoveries (Used by Many-To-One routing).
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
uint8_t m_nwkConcentratorRadius;
/**
* The time in seconds between concentrator route discoveries.
* If set to 0x0000, the discoveries are done at the start up
* and by the next higher layer only.
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
uint8_t m_nwkConcentratorDiscoveryTime;
/**
* This NIB attribute indicates whether the NWK layer should assume the ability to
* use hierarchical routing.
* True = Hierarchical routing False = Never use hierarchical routing
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
bool m_nwkUseTreeRouting;
/**
* If false, the NWK layer shall calculate the link cost from all neighbor nodes
* using the LQI values reported by the MAC layer, otherwise it shall report a
* constant value (7).
* See Zigbe Specification r22.1.0, Table 3-58 (NIB attributes)
*/
bool m_nwkReportConstantCost;
/**
* Describes the current route symmetry:
* True: Routes are considered to be symmetric links. Backward and forward routes
* are created during one-route discovery and they are identical.
* False: Routes are not consider to be comprised of symmetric links. Only the forward
* route is stored during route discovery.
* See Zigbe Specification r22.1.0, Table 3-58 (NIB attributes)
*/
bool m_nwkSymLink;
/**
* The maximum number of retries allowed after a broadcast transmission failure
* See Zigbe Specification r22.1.0, Table 3-58 (NIB attributes)
*/
uint8_t m_nwkMaxBroadcastRetries;
/**
* The maximum time duration in milliseconds allowed for the parent all the child devices to
* retransmit a broadcast message.
* See Zigbe Specification r22.1.0, Table 3-58 (NIB attributes)
* See Zigbee-2007 Layer PICS and Stack Profiles
*/
Time m_nwkPassiveAckTimeout;
/**
* Time duration that a broadcast message needs to encompass the entire network.
* Its default value is calculated based on other NIB attributes.
* See Zigbe Specification r22.1.0, Table 3-58 (NIB attributes)
*/
Time m_nwkNetworkBroadcastDeliveryTime;
/**
* The sequence number used to identify outgoing frames
* See Zigbee specification r22.1.0, Table 3-58 (NIB attributes)
*/
SequenceNumber8 m_nwkSequenceNumber;
/**
* The counter used to identify route request commands
*/
SequenceNumber8 m_routeRequestId;
/**
* The handle assigned when doing a transmission request
* to the MAC layer
*/
SequenceNumber8 m_macHandle;
/**
* The expiration time of routing table entry.
* This value is not standardized and it is implementation dependent.
*/
Time m_routeExpiryTime;
};
} // namespace zigbee
} // namespace ns3
#endif /* ZIGBEE_NWK_H */