mirror of
https://github.com/espressif/openthread.git
synced 2026-09-25 02:17:39 +00:00
Add API to set the IEEE 802.15.4 Extended Address. (#289)
This commit is contained in:
@@ -265,7 +265,8 @@ enum
|
||||
OT_THREAD_CHILD_ADDED = 1 << 6, ///< Child was added
|
||||
OT_THREAD_CHILD_REMOVED = 1 << 7, ///< Child was removed
|
||||
|
||||
OT_IP6_ML_ADDR_CHANGED = 1 << 8, ///< The mesh-local address has changed
|
||||
OT_IP6_LL_ADDR_CHANGED = 1 << 8, ///< The link-local address has changed
|
||||
OT_IP6_ML_ADDR_CHANGED = 1 << 9, ///< The mesh-local address has changed
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -316,6 +316,17 @@ void otSetChildTimeout(uint32_t aTimeout);
|
||||
*/
|
||||
const uint8_t *otGetExtendedAddress(void);
|
||||
|
||||
/**
|
||||
* This function sets the IEEE 802.15.4 Extended Address.
|
||||
*
|
||||
* @param[in] aExtendedAddress A pointer to the IEEE 802.15.4 Extended Address.
|
||||
*
|
||||
* @retval kThreadError_None Successfully set the IEEE 802.15.4 Extended Address.
|
||||
* @retval kThreadError_InvalidArgs @p aExtendedAddress was NULL.
|
||||
*
|
||||
*/
|
||||
ThreadError otSetExtendedAddress(const otExtAddress *aExtendedAddress);
|
||||
|
||||
/**
|
||||
* Get the IEEE 802.15.4 Extended PAN ID.
|
||||
*
|
||||
|
||||
+12
-2
@@ -185,7 +185,17 @@ Get the IEEE 802.15.4 Extended Address.
|
||||
|
||||
```bash
|
||||
> extaddr
|
||||
0xdead00beef00cafe
|
||||
dead00beef00cafe
|
||||
Done
|
||||
```
|
||||
|
||||
### extaddr \<extaddr\>
|
||||
|
||||
Set the IEEE 802.15.4 Extended Address.
|
||||
|
||||
```bash
|
||||
> extaddr dead00beef00cafe
|
||||
dead00beef00cafe
|
||||
Done
|
||||
```
|
||||
|
||||
@@ -195,7 +205,7 @@ Get the Thread Extended PAN ID value.
|
||||
|
||||
```bash
|
||||
> extpanid
|
||||
0xdead00beef00cafe
|
||||
dead00beef00cafe
|
||||
Done
|
||||
```
|
||||
|
||||
|
||||
+18
-5
@@ -386,11 +386,24 @@ exit:
|
||||
|
||||
void Interpreter::ProcessExtAddress(int argc, char *argv[])
|
||||
{
|
||||
OutputBytes(otGetExtendedAddress(), OT_EXT_ADDRESS_SIZE);
|
||||
sServer->OutputFormat("\r\n");
|
||||
AppendResult(kThreadError_None);
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
ThreadError error = kThreadError_None;
|
||||
|
||||
if (argc == 0)
|
||||
{
|
||||
OutputBytes(otGetExtendedAddress(), OT_EXT_ADDRESS_SIZE);
|
||||
sServer->OutputFormat("\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
otExtAddress extAddress;
|
||||
|
||||
VerifyOrExit(Hex2Bin(argv[0], extAddress.m8, sizeof(otExtAddress)) >= 0, error = kThreadError_Parse);
|
||||
|
||||
otSetExtendedAddress(&extAddress);
|
||||
}
|
||||
|
||||
exit:
|
||||
AppendResult(error);
|
||||
}
|
||||
|
||||
void Interpreter::ProcessExtPanId(int argc, char *argv[])
|
||||
|
||||
@@ -199,15 +199,21 @@ const ExtAddress *Mac::GetExtAddress(void) const
|
||||
|
||||
ThreadError Mac::SetExtAddress(const ExtAddress &aExtAddress)
|
||||
{
|
||||
ThreadError error;
|
||||
uint8_t buf[8];
|
||||
|
||||
VerifyOrExit(!aExtAddress.IsGroup(), error = kThreadError_InvalidArgs);
|
||||
|
||||
for (size_t i = 0; i < sizeof(buf); i++)
|
||||
{
|
||||
buf[i] = mExtAddress.m8[7 - i];
|
||||
}
|
||||
|
||||
SuccessOrExit(error = otPlatRadioSetExtendedAddress(buf));
|
||||
mExtAddress = aExtAddress;
|
||||
return otPlatRadioSetExtendedAddress(buf);
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
ShortAddress Mac::GetShortAddress(void) const
|
||||
|
||||
@@ -81,6 +81,15 @@ typedef otShortAddress ShortAddress;
|
||||
class ExtAddress: public otExtAddress
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* This method indicates whether or not the Group bit is set.
|
||||
*
|
||||
* @retval TRUE If the group bit is set.
|
||||
* @retval FALSE If the group bit is not set.
|
||||
*
|
||||
*/
|
||||
bool IsGroup(void) const { return (m8[0] & kGroupFlag) != 0; }
|
||||
|
||||
/**
|
||||
* This method sets the Group bit.
|
||||
*
|
||||
@@ -96,6 +105,15 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method indicates whether or not the Local bit is set.
|
||||
*
|
||||
* @retval TRUE If the local bit is set.
|
||||
* @retval FALSE If the local bit is not set.
|
||||
*
|
||||
*/
|
||||
bool IsLocal(void) const { return (m8[0] & kLocalFlag) != 0; }
|
||||
|
||||
/**
|
||||
* This method sets the Local bit.
|
||||
*
|
||||
|
||||
@@ -96,6 +96,19 @@ const uint8_t *otGetExtendedAddress(void)
|
||||
return reinterpret_cast<const uint8_t *>(sThreadNetif->GetMac().GetExtAddress());
|
||||
}
|
||||
|
||||
ThreadError otSetExtendedAddress(const otExtAddress *aExtAddress)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
|
||||
VerifyOrExit(aExtAddress != NULL, error = kThreadError_InvalidArgs);
|
||||
|
||||
SuccessOrExit(error = sThreadNetif->GetMac().SetExtAddress(*static_cast<const Mac::ExtAddress *>(aExtAddress)));
|
||||
SuccessOrExit(error = sThreadNetif->GetMle().UpdateLinkLocalAddress());
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
const uint8_t *otGetExtendedPanId(void)
|
||||
{
|
||||
return sThreadNetif->GetMac().GetExtendedPanId();
|
||||
|
||||
@@ -342,6 +342,17 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
ThreadError Mle::UpdateLinkLocalAddress(void)
|
||||
{
|
||||
mNetif.RemoveUnicastAddress(mLinkLocal64);
|
||||
mLinkLocal64.GetAddress().SetIid(*mMac.GetExtAddress());
|
||||
mNetif.AddUnicastAddress(mLinkLocal64);
|
||||
|
||||
mNetif.SetStateChangedFlags(OT_IP6_LL_ADDR_CHANGED);
|
||||
|
||||
return kThreadError_None;
|
||||
}
|
||||
|
||||
const uint8_t *Mle::GetMeshLocalPrefix(void) const
|
||||
{
|
||||
return mMeshLocal16.GetAddress().mFields.m8;
|
||||
|
||||
@@ -406,6 +406,16 @@ public:
|
||||
*/
|
||||
ThreadError SetMeshLocalPrefix(const uint8_t *aPrefix);
|
||||
|
||||
/**
|
||||
* This method updates the link local address.
|
||||
*
|
||||
* Call this method when the IEEE 802.15.4 Extended Address has changed.
|
||||
*
|
||||
* @retval kThreadError_None Successfully updated the link local address.
|
||||
*
|
||||
*/
|
||||
ThreadError UpdateLinkLocalAddress(void);
|
||||
|
||||
/**
|
||||
* This method returns a pointer to the link-local all Thread nodes multicast address.
|
||||
*
|
||||
|
||||
@@ -477,6 +477,14 @@ void NcpBase::UpdateChangedProps()
|
||||
ResetReasonToSpinelStatus(otPlatGetResetReason())
|
||||
);
|
||||
}
|
||||
else if ((mChangedFlags & OT_IP6_LL_ADDR_CHANGED) != 0)
|
||||
{
|
||||
mChangedFlags &= ~OT_IP6_LL_ADDR_CHANGED;
|
||||
HandleCommandPropertyGet(
|
||||
SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0,
|
||||
SPINEL_PROP_IPV6_LL_ADDR
|
||||
);
|
||||
}
|
||||
else if ((mChangedFlags & OT_IP6_ML_ADDR_CHANGED) != 0)
|
||||
{
|
||||
mChangedFlags &= ~OT_IP6_ML_ADDR_CHANGED;
|
||||
|
||||
Reference in New Issue
Block a user