Add CLI for sending MGMT_ACTIVE_GET/SET, MGMT_PENDING_GET/SET (Reopen #402) (#474)

* Add CLI for sending MGMT_ACTIVE_GET, MGMT_ACTIVE_SET, MGMT_PENDING_GET and MGMT_PENDING_SET
This commit is contained in:
Lu Wang
2016-08-30 10:48:52 -07:00
committed by Jonathan Hui
parent 8858313feb
commit f4ea00c5f3
10 changed files with 769 additions and 20 deletions
+271
View File
@@ -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
View File
@@ -123,7 +123,7 @@ public:
private:
enum
{
kMaxArgs = 8,
kMaxArgs = 32,
};
static void AppendResult(ThreadError error);
+199 -1
View File
@@ -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
+2
View File
@@ -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;