diff --git a/examples/platforms/cc2538/radio.c b/examples/platforms/cc2538/radio.c index 48bd9a2aa..87326940b 100644 --- a/examples/platforms/cc2538/radio.c +++ b/examples/platforms/cc2538/radio.c @@ -111,6 +111,17 @@ void setChannel(uint8_t channel) HWREG(RFCORE_XREG_FREQCTRL) = 11 + (channel - 11) * 5; } +void otPlatRadioGetIeeeEui64(otInstance *aInstance, uint8_t *aIeeeEui64) +{ + uint8_t *eui64 = (uint8_t *)IEEE_EUI64; + (void)aInstance; + + for (uint8_t i = 0; i < OT_EXT_ADDRESS_SIZE; i++) + { + aIeeeEui64[i] = eui64[7 - i]; + } +} + ThreadError otPlatRadioSetPanId(otInstance *aInstance, uint16_t panid) { ThreadError error = kThreadError_Busy; diff --git a/examples/platforms/posix/radio.c b/examples/platforms/posix/radio.c index b996e494b..fa5fb86b4 100644 --- a/examples/platforms/posix/radio.c +++ b/examples/platforms/posix/radio.c @@ -260,6 +260,19 @@ static inline void getExtAddress(const uint8_t *frame, otExtAddress *address) } } +void otPlatRadioGetIeeeEui64(otInstance *aInstance, uint8_t *aIeeeEui64) +{ + (void)aInstance; + aIeeeEui64[0] = 0x18; + aIeeeEui64[1] = 0xb4; + aIeeeEui64[2] = 0x30; + aIeeeEui64[3] = 0x00; + aIeeeEui64[4] = (NODE_ID >> 24) & 0xff; + aIeeeEui64[5] = (NODE_ID >> 16) & 0xff; + aIeeeEui64[6] = (NODE_ID >> 8) & 0xff; + aIeeeEui64[7] = NODE_ID & 0xff; +} + ThreadError otPlatRadioSetPanId(otInstance *aInstance, uint16_t panid) { ThreadError error = kThreadError_Busy; diff --git a/include/platform/radio.h b/include/platform/radio.h index 6a336c433..32450f2fb 100644 --- a/include/platform/radio.h +++ b/include/platform/radio.h @@ -144,6 +144,15 @@ typedef enum PhyState * */ +/** + * Get the factory-assigned IEEE EUI-64 for this interface. + * + * @param[in] aInstance The OpenThread instance structure. + * @param[out] aIeeeEui64 A pointer to where the factory-assigned IEEE EUI-64 will be placed. + * + */ +void otPlatRadioGetIeeeEui64(otInstance *aInstance, uint8_t *aIeeeEui64); + /** * Set the PAN ID for address filtering. * diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 1481b31ea..a93dfddba 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include @@ -83,6 +84,7 @@ const struct Command Interpreter::sCommands[] = #endif { "discover", &Interpreter::ProcessDiscover }, { "eidcache", &Interpreter::ProcessEidCache }, + { "eui64", &Interpreter::ProcessEui64 }, #ifdef OPENTHREAD_EXAMPLES_POSIX { "exit", &Interpreter::ProcessExit }, #endif @@ -546,6 +548,22 @@ exit: AppendResult(kThreadError_None); } +void Interpreter::ProcessEui64(int argc, char *argv[]) +{ + ThreadError error = kThreadError_None; + otExtAddress extAddress; + + VerifyOrExit(argc == 0, error = kThreadError_Parse); + + otPlatRadioGetIeeeEui64(mInstance, extAddress.m8); + OutputBytes(extAddress.m8, OT_EXT_ADDRESS_SIZE); + sServer->OutputFormat("\r\n"); + +exit: + (void)argv; + AppendResult(error); +} + void Interpreter::ProcessExtAddress(int argc, char *argv[]) { ThreadError error = kThreadError_None; diff --git a/src/cli/cli.hpp b/src/cli/cli.hpp index 487cf456a..a107c7bf5 100644 --- a/src/cli/cli.hpp +++ b/src/cli/cli.hpp @@ -153,6 +153,7 @@ private: #endif // OPENTHREAD_ENABLE_DIAG void ProcessDiscover(int argc, char *argv[]); void ProcessEidCache(int argc, char *argv[]); + void ProcessEui64(int argc, char *argv[]); #ifdef OPENTHREAD_EXAMPLES_POSIX void ProcessExit(int argc, char *argv[]); #endif diff --git a/src/core/meshcop/joiner.cpp b/src/core/meshcop/joiner.cpp index 02e76ec85..7918e250e 100644 --- a/src/core/meshcop/joiner.cpp +++ b/src/core/meshcop/joiner.cpp @@ -44,6 +44,8 @@ #include #include #include +#include +#include #include #include @@ -65,6 +67,20 @@ Joiner::Joiner(ThreadNetif &aNetif): ThreadError Joiner::Start(const char *aPSKd) { ThreadError error; + union + { + Mac::ExtAddress extAddress; + uint8_t buf[Crypto::Sha256::kHashSize]; + }; + Crypto::Sha256 sha256; + + // use extended address based on factory-assigned IEEE EUI-64 + otPlatRadioGetIeeeEui64(NULL, buf); + sha256.Start(); + sha256.Update(buf, OT_EXT_ADDRESS_SIZE); + sha256.Finish(buf); + mNetif.GetMac().SetExtAddress(extAddress); + mNetif.GetMle().UpdateLinkLocalAddress(); SuccessOrExit(error = mNetif.GetDtls().SetPsk(reinterpret_cast(aPSKd), static_cast(strlen(aPSKd)))); @@ -268,6 +284,7 @@ void Joiner::HandleJoinerEntrust(Coap::Header &aHeader, Message &aMessage, const ExtendedPanIdTlv extendedPanId; NetworkNameTlv networkName; ActiveTimestampTlv activeTimestamp; + Mac::ExtAddress extAddress; VerifyOrExit(aHeader.GetType() == Coap::Header::kTypeConfirmable && aHeader.GetCode() == Coap::Header::kCodePost, error = kThreadError_Drop); @@ -296,6 +313,15 @@ void Joiner::HandleJoinerEntrust(Coap::Header &aHeader, Message &aMessage, const otLogInfoMeshCoP("join success!\r\n"); + // configure a random Extended Address + for (size_t i = 0; i < sizeof(extAddress); i++) + { + extAddress.m8[i] = static_cast(otPlatRandomGet()); + } + + mNetif.GetMac().SetExtAddress(extAddress); + mNetif.GetMle().UpdateLinkLocalAddress(); + exit: (void)aMessageInfo; return;