Welcome to mirror list, hosted at ThFree Co, Russian Federation.

zigbee.bdb.h « include « stack « zigbee « STM32_WPAN « ST « Middlewares - github.com/Flipper-Zero/STM32CubeWB.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 25ce0ed8e738522a1651d4bbaa9db4e71d99cbe2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
/**
 * @file zigbee.bdb.h
 * @brief BDB header file
 * @author Exegin Technologies
 * @copyright Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved.
 */

#ifndef ZIGBEE_BDB_H
#define ZIGBEE_BDB_H

/* Values of the bdbCommissioningStatus attribute.
 * These are not interchangeable with Zigbee Status Codes. */
/** bdbCommissioningStatus */
enum ZbBdbCommissioningStatusT {
    ZB_BDB_COMMISS_STATUS_SUCCESS = 0x00, /**< SUCCESS - The commissioning sub-procedure was successful */
    ZB_BDB_COMMISS_STATUS_IN_PROGRESS, /**< IN_PROGRESS - One of the commissioning sub-procedures has started but is not yet complete */
    ZB_BDB_COMMISS_STATUS_NOT_AA_CAPABLE, /**< NOT_AA_CAPABLE - The initiator is not address assignment capable during touchlink */
    ZB_BDB_COMMISS_STATUS_NO_NETWORK, /**< NO_NETWORK - A network has not been found during network steering or touchlink*/
    ZB_BDB_COMMISS_STATUS_TARGET_FAILURE, /**< TARGET_FAILURE - A node has not joined a network when requested during touchlink */
    ZB_BDB_COMMISS_STATUS_FORMATION_FAILURE, /**< FORMATION_FAILURE - A network could not be formed during network formation */
    ZB_BDB_COMMISS_STATUS_NO_IDENTIFY_QUERY_RESPONSE, /* NO_IDENTIFY_QUERY_RESPONSE - No response to an identify query command has been received during finding & binding */
    ZB_BDB_COMMISS_STATUS_BINDING_TABLE_FULL, /**< BINDING_TABLE_FULL - A binding table entry could not be created due to insufficient space in the binding table during finding & binding */
    ZB_BDB_COMMISS_STATUS_NO_SCAN_RESPONSE, /**< NO_SCAN_RESPONSE - No response to a scan request inter-PAN command has been received during touchlink */
    ZB_BDB_COMMISS_STATUS_NOT_PERMITTED, /**< NOT_PERMITTED - A touchlink (steal) attempt was made when a node is already connected to a centralized security network */
    ZB_BDB_COMMISS_STATUS_TCLK_EX_FAILURE /**< TCLK_EX_FAILURE - The Trust Center link key exchange procedure has failed attempting to join a centralized security network */
};

#define BDB_DEFAULT_TC_NODE_JOIN_TIMEOUT        15 /* seconds */

#define DEFAULT_EP_BDB_COMMISSION_GRP_ID     0xffffU

/* Bits for ZB_BDB_CommissioningMode */
#define BDB_COMMISSION_MODE_MASK                0x0FU
#define BDB_COMMISSION_MODE_TOUCHLINK           0x01U
#define BDB_COMMISSION_MODE_NET_STEER           0x02U
#define BDB_COMMISSION_MODE_NET_FORM            0x04U /* Whether to form a network. Configured by ZbStartup (e.g. ZbStartTypeForm) */
#define BDB_COMMISSION_MODE_FIND_BIND           0x08U

/* Bits for bdbCommissioningCapability. */
#define BDB_COMMISSION_CAP_MASK                 0x0FU
#define BDB_COMMISSION_CAP_STEER                0x01U
#define BDB_COMMISSION_CAP_NETWORK              0x02U
#define BDB_COMMISSION_CAP_FIND_BIND            0x04U
#define BDB_COMMISSION_CAP_TL                   0x08U

/* Bits for bdbNodeJoinLinkKeyType */
#define BDB_JOINLINK_KEYTYPE_FLAG               0x0F
#define BDB_JOINLINK_KEYTYPE_GTC                0x01 /* global trust center*/
#define BDB_JOINLINK_KEYTYPE_DS                 0x02 /* distributed security global */
#define BDB_JOINLINK_KEYTYPE_IC                 0x04 /* install code preconfigured. */
#define BDB_JOINLINK_KEYTYPE_TC                 0x08 /* touchlink preconfigured. */

/* values for ZB_BDB_TCLinkKeyExchangeMethod / bdbTCLinkKeyExchangeMethod */
/** bdbTCLinkKeyExchangeMethod */
enum ZbBdbLinkKeyExchMethodT {
    BDB_LINKKEY_EXCHANGE_METHOD_APS = 0x00, /**< APS Request Key */
    BDB_LINKKEY_EXCHANGE_METHOD_CBKE = 0x01 /**< Certificate Based Key Exchange (CBKE) */
};

/* Touchlink Default Primary Channel Set (2.4 GHz, Page 0, based on WPAN_CHANNELMASK_2400MHZ)
 * Channels: 11, 15, 20, 25 */
#define BDBC_TL_PRIMARY_CHANNEL_SET             0x02108800U
/* Secondary = 0x05ef7000.
 * Note that scanning the full primary and secondary channels sets may
 * not get done before the Touchlink process times-out. This is an
 * inherent problem with the Touchlink spec. By default, the stack
 * uses a secondary mask equal to zero. */
#define BDBC_TL_SECONDARY_CHANNEL_SET           (WPAN_CHANNELMASK_2400MHZ ^ BDBC_TL_PRIMARY_CHANNEL_SET)

/* value for bdbRssiMin - used by touchLink ONLY */
#define BDB_TL_RSSI_MIN                         (-40)

/* Table 13-23 Key Encryption Algorithm
 * NOTE: This is what keyMask<->keyIndex translates to:
 * KeyMask   Key Description       Algorithm      Supported
 *   0       development key       13.3.4.10.4    NO - use 4 or 15 instead
 *   4       production key        13.3.4.10.5    YES (same as certification)
 *  15       certification key     13.3.4.10.5    YES
 */

/** ZbBdbTouchlinkKeyIndex */
enum ZbBdbTouchlinkKeyIndexT {
    TOUCHLINK_KEY_INDEX_DEVELOPMENT = 0, /**< Development key */
    TOUCHLINK_KEY_INDEX_PRODUCTION = 4, /**< Production key */
    TOUCHLINK_KEY_INDEX_CERTIFICATION = 15 /**< Certification key */
};

/* Touchlink Steal Flags */
#define TOUCHLINK_STEAL_START               0x01U /* Target is allowed to process a Touchlink Network Start Request */
#define TOUCHLINK_STEAL_JOIN                0x02U /* Target is allowed to process a Touchlink Join Request */
/* EXEGIN - Make ZB_BDB_TLDenyFactoryNew one of these flags */

/* BDB IB attributes */
enum ZbBdbAttrIdT {
    /* EXEGIN ZB_BDB_CommissioningGroupID ? = 0x1000 */
    ZB_BDB_CommissioningMode = 0x1001, /* bdbCommissioningMode - e.g. BDB_COMMISSION_MODE_MASK */
    ZB_BDB_JoiningNodeEui64 = 0x1002, /* for internal use only */
    ZB_BDB_JoiningNodeNewTCLinkKey = 0x1003, /* for internal use only */
    ZB_BDB_JoinUsesInstallCodeKey = 0x1004,
    ZB_BDB_NodeCommissioningCapability = 0x1005, /* bdbNodeCommissioningCapability - e.g. BDB_COMMISSION_CAP_MASK */
    ZB_BDB_NodeIsOnANetwork = 0x1006, /* Just checks nwkExtendedPanId if non-zero */
    ZB_BDB_NodeJoinLinkKeyType = 0x1007, /* e.g. BDB_JOINLINK_KEYTYPE_FLAG - Link key with which the node was able to decrypt the network key */
    ZB_BDB_PrimaryChannelSet = 0x1008,
    ZB_BDB_ScanDuration = 0x1009,
    ZB_BDB_SecondaryChannelSet = 0x100a,
    ZB_BDB_TCLK_ExchangeAttempts = 0x100b, /* TC link key   */
    ZB_BDB_TCLK_ExchangeAttemptsMax = 0x100c,
    ZB_BDB_TCLinkKeyExchangeMethod = 0x100d, /* enum ZbBdbLinkKeyExchMethodT */
    ZB_BDB_TrustCenterNodeJoinTimeout = 0x100e,
    ZB_BDB_TrustCenterRequiresKeyExchange = 0x100f, /* Modifies ZB_APSME_POLICY_TCLK_UPDATE_REQUIRED bit in ZB_APS_IB_ID_TRUST_CENTER_POLICY */
    ZB_BDB_AcceptNewUnsolicitedTCLinkKey = 0x1010, /* uint8_t */
    ZB_BDB_AcceptNewUnsolicitedApplicationLinkKey = 0x1011, /* uint8_t */

    /* Extra stuff not explicitly covered by the BDB spec. */
    ZB_BDB_JoiningNodeParent = 0x1100, /* EUI of parent of joining device (where to send APS Remove Request if necessary) */
    ZB_BDB_vDoPrimaryScan, /* 0x1101 - internal use only - boolean whether to use ZB_BDB_PrimaryChannelSet or ZB_BDB_SecondaryChannelSet */
    /* Address assignment */
    ZB_BDB_FreeNetAddrBegin, /* 0x1102 */
    ZB_BDB_FreeNetAddrCurrent, /* 0x1103 */
    ZB_BDB_FreeNetAddrEnd, /* 0x1104 */
    /* 0x1105 - was ZB_BDB_FreeGroupIDBegin */
    /* 0x1106 - was ZB_BDB_FreeGroupIDEnd */
    ZB_BDB_TLRssiMin = 0x1107, /* 0x1107 - RSSI threshold, int8_t value */
    ZB_BDB_TLTestFlags, /* 0x1108 - Touchlink test flags (enum ZbTlTestFlagsT) */
    ZB_BDB_UpdateDeviceKeyId, /* 0x1109 - enum ZbSecHdrKeyIdT (e.g. ZB_SEC_KEYID_NETWORK (default) or ZB_SEC_KEYID_LINK) */
    ZB_BDB_JoinScanType, /* 0x110a - MCP_SCAN_ACTIVE (default) or MCP_SCAN_ENHANCED */
    ZB_BDB_JoinIgnoreLqi, /* 0x110b - bool - Ignore LQI (link cost <= 3) of potential parent's beacon  */
    ZB_BDB_NlmeSyncFailNumBeforeError, /* 0x110c - uint8_t - Number of consecutive NLME-SYNC failures before reporting ZB_NWK_STATUS_CODE_PARENT_LINK_FAILURE */
    ZB_BDB_ZdoTimeout, /* 0x110d - ZDO response wait timeout in milliseconds - default is 6000 mS */
    ZB_BDB_TLStealFlags, /* 0x110e */
    ZB_BDB_JoinTclkNodeDescReqDelay, /* 0x110f */
    ZB_BDB_JoinTclkRequestKeyDelay, /* 0x1110 */
    ZB_BDB_TLDenyFactoryNew, /* 0x1111 */
    ZB_BDB_TLKey, /* 0x1112 */
    ZB_BDB_TLKeyIndex, /* 0x1113 - enum ZbBdbTouchlinkKeyIndexT */
    ZB_BDB_ZdoPermitJoinAfterJoin, /* 0x1114 - Default is enabled. */
    ZB_BDB_ZdoZigbeeProtocolRevision, /* 0x1115 - Default 22 (R22) - was ZB_PROTOCOL_REVISION. */
    ZB_BDB_NwkAllowRouterLeaveRejoin, /* 0x1116 - Default is disabled. */
    ZB_BDB_PersistTimeoutMs, /* 0x1117 */
    ZB_BDB_JoinAttemptsMax, /* 0x1118 - uint8_t - maximum number attempts to join a network. If an attempt fails, the EPID is added to a blacklist before the next attempt. */
    ZB_BDB_MaxConcurrentJoiners, /* 0x1119 - uint8_t - maximum number of concurrent joiners the coordinator supports */
    ZB_BDB_DisablePersistRejoin, /* 0x111a - boolean */
    ZB_BDB_ZdoBindCheckCluster, /* boolean */
    ZB_BDB_ApsInterpanDisabled, /* boolean */

    /* Constants which are accessible through a BDB GET IB request. */
    ZB_BDBC_MaxSameNetworkRetryAttempts = 0x1200,
    ZB_BDBC_MinCommissioningTime, /* seconds */
    ZB_BDBC_RecSameNetworkRetryAttempts,
    ZB_BDBC_TCLinkKeyExchangeTimeout, /* seconds */
    ZB_BDBC_TLInterPANTransIdLifetime, /* seconds */
    ZB_BDBC_TLMinStartupDelayTime, /* seconds */
    ZB_BDBC_TLRxWindowDuration, /* seconds */
    ZB_BDBC_TLScanTimeBaseDuration /* uint8_t - milliseconds */
};

/** BDB-GET.request */
struct ZbBdbGetReqT {
    enum ZbBdbAttrIdT attrId; /**< Attribute ID */
    void *attr; /**< Pointer to attribute */
    unsigned int attrLength; /**< Attribute Length */
    unsigned int attrIndex; /**< Attribute Index */
};

/** BDB-GET.confirm */
struct ZbBdbGetConfT {
    enum ZbStatusCodeT status; /**< Status */
    enum ZbBdbAttrIdT attrId; /**< Attribute ID */
};

/** BDB-SET.request */
struct ZbBdbSetReqT {
    enum ZbBdbAttrIdT attrId; /**< Attribute ID */
    const void *attr; /**< Pointer to attribute */
    unsigned int attrLength; /**< Attribute Length */
    unsigned int attrIndex; /**< Attribute Index */
};

/** BDB-SET.confirm */
struct ZbBdbSetConfT {
    enum ZbStatusCodeT status; /**< Status */
    enum ZbBdbAttrIdT attrId; /**< Attribute ID */
};

#define ZbBdbGet(_zb_, _id_, _ptr_, _sz_) ZbBdbGetIndex(_zb_, _id_, _ptr_, _sz_, 0)
#define ZbBdbSet(_zb_, _id_, _ptr_, _sz_) ZbBdbSetIndex(_zb_, _id_, _ptr_, _sz_, 0)

/**
 * Read a BDB IB attribute.
 * @param zb Zigbee stack instance
 * @param attrId Attribute ID
 * @param attrPtr Pointer to the attribute
 * @param attrSz Attribute size
 * @param attrIndex Index attribute
 * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
 */
enum ZbStatusCodeT ZbBdbGetIndex(struct ZigBeeT *zb, enum ZbBdbAttrIdT attrId, void *attrPtr, unsigned int attrSz, unsigned int attrIndex);

/**
 * Write a BDB IB attribute.
 * @param zb Zigbee stack instance
 * @param attrId Attribute ID
 * @param attrPtr Pointer to the attribute
 * @param attrSz Attribute size
 * @param attrIndex Index attribute
 * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
 */
enum ZbStatusCodeT ZbBdbSetIndex(struct ZigBeeT *zb, enum ZbBdbAttrIdT attrId, const void *attrPtr, unsigned int attrSz, unsigned int attrIndex);

/**
 * Send a BDB-GET.request.
 * @param zb Zigbee stack instance
 * @param getReqPtr Pointer to BDB-GET.request
 * @param getConfPtr Pointer to BDB-GET.confirm
 * @return Returns void
 */
void ZbBdbGetReq(struct ZigBeeT *zb, struct ZbBdbGetReqT *getReqPtr, struct ZbBdbGetConfT *getConfPtr);

/**
 * Send a BDB-SET.request.
 * @param zb Zigbee stack instance
 * @param setReqPtr Pointer to BDB-SET.request
 * @param setConfPtr Pointer to BDB-SET.confirm
 * @return Returns void
 */
void ZbBdbSetReq(struct ZigBeeT *zb, struct ZbBdbSetReqT *setReqPtr, struct ZbBdbSetConfT *setConfPtr);

/* Helpers for ZB_BDB_CommissioningMode bits */
/* ZbBdbCommissionModeBitSupported - Check if a BDB_COMMISSION_MODE_ bit or mask is
 * supported by bdbNodeCommissioningCapability. */
bool ZbBdbCommissionModeBitSupported(struct ZigBeeT *zb, uint8_t new_mode_bit);
enum ZbStatusCodeT ZbBdbCommissionModeBitSet(struct ZigBeeT *zb, uint8_t new_mode_bit);
enum ZbStatusCodeT ZbBdbCommissionModeBitClear(struct ZigBeeT *zb, uint8_t new_mode_bit);

enum ZbBdbCommissioningStatusT ZbBdbNwkStatusToBdbStatus(enum ZbStatusCodeT status);
enum ZbStatusCodeT ZbBdbStatusToNwkStatus(enum ZbBdbCommissioningStatusT status);

/* Returns the commissioning status for the given endpoint (same for all endpoints?).
 * If endpoint = ZB_ENDPOINT_BCAST, returns the status for the first endpoint found. */
enum ZbBdbCommissioningStatusT ZbBdbGetEndpointStatus(struct ZigBeeT *zb, uint8_t endpoint);

/* Configures the endpoint with the given commissioning status. Mostly for internal use only. */
void ZbBdbSetEndpointStatus(struct ZigBeeT *zb, enum ZbBdbCommissioningStatusT status, uint8_t endpoint);

#endif /* ZIGBEE_BDB_H */