mirror of
https://github.com/espressif/openthread.git
synced 2026-08-17 16:09:51 +00:00
* Add CLI for sending MGMT_ACTIVE_GET, MGMT_ACTIVE_SET, MGMT_PENDING_GET and MGMT_PENDING_SET
This commit is contained in:
@@ -14,6 +14,7 @@ OpenThread test scripts use the CLI to execute test cases.
|
||||
* [childtimeout](#childtimeout)
|
||||
* [contextreusedelay](#contextreusedelay)
|
||||
* [counter](#counter)
|
||||
* [dataset](#dataset)
|
||||
* [discover](#discover)
|
||||
* [eidcache](#eidcache)
|
||||
* [extaddr](#extaddr)
|
||||
@@ -255,6 +256,276 @@ RxTotal: 11
|
||||
RxErrOther: 0
|
||||
```
|
||||
|
||||
### dataset help
|
||||
|
||||
Print meshcop dataset help menu.
|
||||
|
||||
```bash
|
||||
> dataset help
|
||||
help
|
||||
active
|
||||
activetimestamp
|
||||
channel
|
||||
clear
|
||||
commit
|
||||
delay
|
||||
extpanid
|
||||
masterkey
|
||||
meshlocalprefix
|
||||
mgmtgetcommand
|
||||
mgmtsetcommand
|
||||
networkname
|
||||
panid
|
||||
pending
|
||||
pendingtimestamp
|
||||
userdata
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset active
|
||||
|
||||
Print meshcop active operational dataset.
|
||||
|
||||
```bash
|
||||
> dataset active
|
||||
Active Timestamp: 0
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset activetimestamp
|
||||
|
||||
Set getting active timestamp flag.
|
||||
|
||||
```bash
|
||||
> dataset activestamp
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset activetimestamp \[activetimestamp\]
|
||||
|
||||
Set active timestamp.
|
||||
|
||||
```bash
|
||||
> dataset activestamp 123456789
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset channel
|
||||
|
||||
Set getting channel flag.
|
||||
|
||||
```bash
|
||||
> dataset channel
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset channel \[channel\]
|
||||
|
||||
Set channel.
|
||||
|
||||
```bash
|
||||
> dataset channel 12
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset clear
|
||||
|
||||
Reset operational dataset buffer.
|
||||
|
||||
```bash
|
||||
> dataset clear
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset commit \[commit\]
|
||||
|
||||
Commit operational dataset buffer to active/pending operational dataset.
|
||||
|
||||
```bash
|
||||
> dataset commit active
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset delay
|
||||
|
||||
Set getting delay timer value flag.
|
||||
|
||||
```bash
|
||||
> dataset delay
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset delay \[delay\]
|
||||
|
||||
Set delay timer value.
|
||||
|
||||
```bash
|
||||
> dataset delay 1000
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset extpanid
|
||||
|
||||
Set getting extended panid flag.
|
||||
|
||||
```bash
|
||||
> dataset extpanid
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset extpanid \[extpanid\]
|
||||
|
||||
Set extended panid.
|
||||
|
||||
```bash
|
||||
> dataset extpanid 000db80123456789
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset masterkey
|
||||
|
||||
Set getting master key flag.
|
||||
|
||||
```bash
|
||||
> dataset masterkey
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset masterkey \[masterkey\]
|
||||
|
||||
Set master key.
|
||||
|
||||
```bash
|
||||
> dataset master 1234567890123456
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset meshlocalprefix
|
||||
|
||||
Set getting mesh local prefix flag.
|
||||
|
||||
```bash
|
||||
> dataset meshlocalprefix
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset meshlocalprefix fd00:db8::
|
||||
|
||||
Set mesh local prefix.
|
||||
|
||||
```bash
|
||||
> dataset meshlocalprefix fd00:db8::
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset mgmtgetcommand active \[TLVs list\] \[binary\]
|
||||
|
||||
Send MGMT_ACTIVE_GET.
|
||||
|
||||
```bash
|
||||
> dataset mgmtgetcommand active activetimestamp 123 binary 0001
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset mgmtsetcommand active \[TLV Types list\] \[binary\]
|
||||
|
||||
Send MGMT_ACTIVE_SET.
|
||||
|
||||
```bash
|
||||
> dataset mgmtsetcommand active activetimestamp binary 820155
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset mgmtgetcommand pending \[TLVs list\] \[binary\]
|
||||
|
||||
Send MGMT_PENDING_GET.
|
||||
|
||||
```bash
|
||||
> dataset mgmtgetcommand pending activetimestamp binary 0001
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset mgmtsetcommand pending \[TLV Types list\] \[binary\]
|
||||
|
||||
Send MGMT_PENDING_SET.
|
||||
|
||||
```bash
|
||||
> dataset mgmtsetcommand pending activetimestamp binary 820155
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset networkname
|
||||
|
||||
Set getting network name flag.
|
||||
|
||||
```bash
|
||||
> dataset networkname
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset networkname \[networkname\]
|
||||
|
||||
Set network name.
|
||||
|
||||
```bash
|
||||
> dataset networkname openthread
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset panid
|
||||
|
||||
Set getting panid flag.
|
||||
|
||||
```bash
|
||||
> dataset panid
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset panid \[panid\]
|
||||
|
||||
Set panid.
|
||||
|
||||
```bash
|
||||
> dataset panid 0x1234
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset pending
|
||||
|
||||
Print meshcop pending operational dataset.
|
||||
|
||||
```bash
|
||||
> dataset pending
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset pendingtimestamp
|
||||
|
||||
Set getting pending timestamp flag.
|
||||
|
||||
```bash
|
||||
> dataset pendingtimestamp
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset pendingtimestamp \[pendingtimestamp\]
|
||||
|
||||
Set pending timestamp.
|
||||
|
||||
```bash
|
||||
> dataset pendingtimestamp 123456789
|
||||
Done
|
||||
```
|
||||
|
||||
### dataset userdata \[size\] \[data\]
|
||||
|
||||
Set user specific data for the command.
|
||||
|
||||
```bash
|
||||
> dataset userdata 3 820155
|
||||
Done
|
||||
```
|
||||
|
||||
### discover \[channel\]
|
||||
|
||||
Perform an MLE Discovery operation.
|
||||
|
||||
+1
-1
@@ -123,7 +123,7 @@ public:
|
||||
private:
|
||||
enum
|
||||
{
|
||||
kMaxArgs = 8,
|
||||
kMaxArgs = 32,
|
||||
};
|
||||
|
||||
static void AppendResult(ThreadError error);
|
||||
|
||||
+199
-1
@@ -56,6 +56,8 @@ const DatasetCommand Dataset::sCommands[] =
|
||||
{ "extpanid", &ProcessExtPanId },
|
||||
{ "masterkey", &ProcessMasterKey },
|
||||
{ "meshlocalprefix", &ProcessMeshLocalPrefix },
|
||||
{ "mgmtgetcommand", &ProcessMgmtGetCommand },
|
||||
{ "mgmtsetcommand", &ProcessMgmtSetCommand },
|
||||
{ "networkname", &ProcessNetworkName },
|
||||
{ "panid", &ProcessPanId },
|
||||
{ "pending", &ProcessPending },
|
||||
@@ -346,7 +348,6 @@ ThreadError Dataset::ProcessPendingTimestamp(int argc, char *argv[])
|
||||
long value;
|
||||
|
||||
VerifyOrExit(argc > 0, error = kThreadError_Parse);
|
||||
|
||||
SuccessOrExit(error = Interpreter::ParseLong(argv[0], value));
|
||||
sDataset.mPendingTimestamp = static_cast<uint64_t>(value);
|
||||
sDataset.mIsPendingTimestampSet = true;
|
||||
@@ -355,5 +356,202 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
ThreadError Dataset::ProcessMgmtSetCommand(int argc, char *argv[])
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
otOperationalDataset dataset;
|
||||
uint8_t tlvs[32];
|
||||
long value;
|
||||
int length = 0;
|
||||
otIp6Address prefix;
|
||||
|
||||
VerifyOrExit(argc > 0, error = kThreadError_Parse);
|
||||
|
||||
memset(&dataset, 0, sizeof(dataset));
|
||||
|
||||
for (uint8_t index = 1; index < argc; index++)
|
||||
{
|
||||
if (strcmp(argv[index], "activetimestamp") == 0)
|
||||
{
|
||||
VerifyOrExit(index < argc, error = kThreadError_Parse);
|
||||
dataset.mIsActiveTimestampSet = true;
|
||||
SuccessOrExit(error = Interpreter::ParseLong(argv[++index], value));
|
||||
dataset.mActiveTimestamp = static_cast<uint64_t>(value);
|
||||
}
|
||||
else if (strcmp(argv[index], "pendingtimestamp") == 0)
|
||||
{
|
||||
VerifyOrExit(index < argc, error = kThreadError_Parse);
|
||||
dataset.mIsPendingTimestampSet = true;
|
||||
SuccessOrExit(error = Interpreter::ParseLong(argv[++index], value));
|
||||
dataset.mPendingTimestamp = static_cast<uint64_t>(value);
|
||||
}
|
||||
else if (strcmp(argv[index], "masterkey") == 0)
|
||||
{
|
||||
VerifyOrExit(index < argc, error = kThreadError_Parse);
|
||||
dataset.mIsMasterKeySet = true;
|
||||
VerifyOrExit((length = Interpreter::Hex2Bin(argv[++index], dataset.mMasterKey.m8,
|
||||
sizeof(dataset.mMasterKey.m8))) == OT_MASTER_KEY_SIZE, error = kThreadError_Parse);
|
||||
length = 0;
|
||||
}
|
||||
else if (strcmp(argv[index], "networkname") == 0)
|
||||
{
|
||||
VerifyOrExit(index < argc, error = kThreadError_Parse);
|
||||
dataset.mIsNetworkNameSet = true;
|
||||
VerifyOrExit((length = static_cast<int>(strlen(argv[++index]))) <= OT_NETWORK_NAME_MAX_SIZE,
|
||||
error = kThreadError_Parse);
|
||||
memset(&dataset.mNetworkName, 0, sizeof(sDataset.mNetworkName));
|
||||
memcpy(dataset.mNetworkName.m8, argv[0], static_cast<size_t>(length));
|
||||
length = 0;
|
||||
}
|
||||
else if (strcmp(argv[index], "extpanid") == 0)
|
||||
{
|
||||
VerifyOrExit(index < argc, error = kThreadError_Parse);
|
||||
dataset.mIsExtendedPanIdSet = true;
|
||||
VerifyOrExit(Interpreter::Hex2Bin(argv[++index], dataset.mExtendedPanId.m8,
|
||||
sizeof(dataset.mExtendedPanId.m8)) >= 0, error = kThreadError_Parse);
|
||||
}
|
||||
else if (strcmp(argv[index], "localprefix") == 0)
|
||||
{
|
||||
VerifyOrExit(index < argc, error = kThreadError_Parse);
|
||||
dataset.mIsMeshLocalPrefixSet = true;
|
||||
SuccessOrExit(error = otIp6AddressFromString(argv[++index], &prefix));
|
||||
memcpy(dataset.mMeshLocalPrefix.m8, prefix.mFields.m8, sizeof(dataset.mMeshLocalPrefix.m8));
|
||||
}
|
||||
else if (strcmp(argv[index], "delaytimer") == 0)
|
||||
{
|
||||
VerifyOrExit(index < argc, error = kThreadError_Parse);
|
||||
dataset.mIsDelaySet = true;
|
||||
SuccessOrExit(error = Interpreter::ParseLong(argv[++index], value));
|
||||
dataset.mDelay = static_cast<uint32_t>(value);
|
||||
}
|
||||
else if (strcmp(argv[index], "panid") == 0)
|
||||
{
|
||||
VerifyOrExit(index < argc, error = kThreadError_Parse);
|
||||
dataset.mIsPanIdSet = true;
|
||||
SuccessOrExit(error = Interpreter::ParseLong(argv[++index], value));
|
||||
dataset.mPanId = static_cast<otPanId>(value);
|
||||
}
|
||||
else if (strcmp(argv[index], "channel") == 0)
|
||||
{
|
||||
VerifyOrExit(index < argc, error = kThreadError_Parse);
|
||||
dataset.mIsChannelSet = true;
|
||||
SuccessOrExit(error = Interpreter::ParseLong(argv[++index], value));
|
||||
dataset.mChannel = static_cast<uint16_t>(value);
|
||||
}
|
||||
else if (strcmp(argv[index], "binary") == 0)
|
||||
{
|
||||
VerifyOrExit((index + 1) < argc, error = kThreadError_Parse);
|
||||
length = static_cast<int>((strlen(argv[++index]) + 1) / 2);
|
||||
VerifyOrExit(static_cast<size_t>(length) <= sizeof(tlvs), error = kThreadError_NoBufs);
|
||||
VerifyOrExit(Interpreter::Hex2Bin(argv[index], tlvs, static_cast<uint16_t>(length)) >= 0,
|
||||
error = kThreadError_Parse);
|
||||
}
|
||||
else
|
||||
{
|
||||
ExitNow(error = kThreadError_Parse);
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(argv[0], "active") == 0)
|
||||
{
|
||||
SuccessOrExit(error = otSendActiveSet(&dataset, tlvs, static_cast<uint8_t>(length)));
|
||||
}
|
||||
else if (strcmp(argv[0], "pending") == 0)
|
||||
{
|
||||
SuccessOrExit(error = otSendPendingSet(&dataset, tlvs, static_cast<uint8_t>(length)));
|
||||
}
|
||||
else
|
||||
{
|
||||
ExitNow(error = kThreadError_Parse);
|
||||
}
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
ThreadError Dataset::ProcessMgmtGetCommand(int argc, char *argv[])
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
otOperationalDataset dataset;
|
||||
uint8_t tlvs[32];
|
||||
long value;
|
||||
int length = 0;
|
||||
|
||||
VerifyOrExit(argc > 0, error = kThreadError_Parse);
|
||||
|
||||
memset(&dataset, 0, sizeof(dataset));
|
||||
|
||||
for (uint8_t index = 1; index < argc; index++)
|
||||
{
|
||||
VerifyOrExit(static_cast<size_t>(length) < sizeof(tlvs), error = kThreadError_NoBufs);
|
||||
|
||||
if (strcmp(argv[index], "activetimestamp") == 0)
|
||||
{
|
||||
tlvs[length++] = OT_MESHCOP_TLV_ACTIVETIMESTAMP;
|
||||
}
|
||||
else if (strcmp(argv[index], "pendingtimestamp") == 0)
|
||||
{
|
||||
tlvs[length++] = OT_MESHCOP_TLV_PENDINGTIMESTAMP;
|
||||
}
|
||||
else if (strcmp(argv[index], "masterkey") == 0)
|
||||
{
|
||||
tlvs[length++] = OT_MESHCOP_TLV_MASTERKEY;
|
||||
}
|
||||
else if (strcmp(argv[index], "networkname") == 0)
|
||||
{
|
||||
tlvs[length++] = OT_MESHCOP_TLV_NETWORKNAME;
|
||||
}
|
||||
else if (strcmp(argv[index], "extpanid") == 0)
|
||||
{
|
||||
tlvs[length++] = OT_MESHCOP_TLV_EXTPANID;
|
||||
}
|
||||
else if (strcmp(argv[index], "localprefix") == 0)
|
||||
{
|
||||
tlvs[length++] = OT_MESHCOP_TLV_LOCALPREFIX;
|
||||
}
|
||||
else if (strcmp(argv[index], "delaytimer") == 0)
|
||||
{
|
||||
tlvs[length++] = OT_MESHCOP_TLV_DELAYTIMER;
|
||||
}
|
||||
else if (strcmp(argv[index], "panid") == 0)
|
||||
{
|
||||
tlvs[length++] = OT_MESHCOP_TLV_PANID;
|
||||
}
|
||||
else if (strcmp(argv[index], "channel") == 0)
|
||||
{
|
||||
tlvs[length++] = OT_MESHCOP_TLV_CHANNEL;
|
||||
}
|
||||
else if (strcmp(argv[index], "binary") == 0)
|
||||
{
|
||||
VerifyOrExit((index + 1) < argc, error = kThreadError_Parse);
|
||||
value = (strlen(argv[++index]) + 1) / 2;
|
||||
VerifyOrExit(static_cast<size_t>(value) <= (sizeof(tlvs) - static_cast<size_t>(length)), error = kThreadError_NoBufs);
|
||||
VerifyOrExit(Interpreter::Hex2Bin(argv[index], tlvs + length, static_cast<uint16_t>(value)) >= 0,
|
||||
error = kThreadError_Parse);
|
||||
length += value;
|
||||
}
|
||||
else
|
||||
{
|
||||
ExitNow(error = kThreadError_Parse);
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(argv[0], "active") == 0)
|
||||
{
|
||||
SuccessOrExit(error = otSendActiveGet(tlvs, static_cast<uint8_t>(length)));
|
||||
}
|
||||
else if (strcmp(argv[0], "pending") == 0)
|
||||
{
|
||||
SuccessOrExit(error = otSendPendingGet(tlvs, static_cast<uint8_t>(length)));
|
||||
}
|
||||
else
|
||||
{
|
||||
ExitNow(error = kThreadError_Parse);
|
||||
}
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
} // namespace Cli
|
||||
} // namespace Thread
|
||||
|
||||
@@ -86,6 +86,8 @@ private:
|
||||
static ThreadError ProcessPanId(int argc, char *argv[]);
|
||||
static ThreadError ProcessPending(int argc, char *argv[]);
|
||||
static ThreadError ProcessPendingTimestamp(int argc, char *argv[]);
|
||||
static ThreadError ProcessMgmtSetCommand(int argc, char *argv[]);
|
||||
static ThreadError ProcessMgmtGetCommand(int argc, char *argv[]);
|
||||
|
||||
static const DatasetCommand sCommands[];
|
||||
static otOperationalDataset sDataset;
|
||||
|
||||
Reference in New Issue
Block a user