[ip6] add IPv6 fragmentation and reassembly support (#3948)

This commit is contained in:
Christian Stauffer
2019-08-28 10:31:55 -07:00
committed by Jonathan Hui
parent 3198a3be69
commit 864e3458f5
21 changed files with 770 additions and 37 deletions
+53 -5
View File
@@ -136,14 +136,27 @@ otError UdpExample::ProcessSend(int argc, char *argv[])
{
otError error;
otMessageInfo messageInfo;
otMessage * message = NULL;
int curArg = 0;
otMessage * message = NULL;
int curArg = 0;
unsigned long autoGenMessageLength = 0;
memset(&messageInfo, 0, sizeof(messageInfo));
VerifyOrExit(argc == 1 || argc == 3, error = OT_ERROR_INVALID_ARGS);
VerifyOrExit(argc == 1 || argc == 3 || argc == 4, error = OT_ERROR_INVALID_ARGS);
if (argc == 3)
if (argc == 4)
{
if (strcmp(argv[curArg++], "-s") == 0)
{
Interpreter::ParseUnsignedLong(argv[curArg++], autoGenMessageLength);
}
else
{
ExitNow(error = OT_ERROR_INVALID_ARGS);
}
}
if (argc >= 3)
{
long value;
@@ -159,7 +172,14 @@ otError UdpExample::ProcessSend(int argc, char *argv[])
message = otUdpNewMessage(mInterpreter.mInstance, NULL);
VerifyOrExit(message != NULL, error = OT_ERROR_NO_BUFS);
error = otMessageAppend(message, argv[curArg], static_cast<uint16_t>(strlen(argv[curArg])));
if (autoGenMessageLength != 0)
{
error = WriteCharToBuffer(message, static_cast<uint16_t>(autoGenMessageLength));
}
else
{
error = otMessageAppend(message, argv[curArg], static_cast<uint16_t>(strlen(argv[curArg])));
}
SuccessOrExit(error);
error = otUdpSend(&mSocket, message, &messageInfo);
@@ -174,6 +194,34 @@ exit:
return error;
}
otError UdpExample::WriteCharToBuffer(otMessage *aMessage, uint16_t aMessageSize)
{
otError error = OT_ERROR_NONE;
uint8_t character = 0x30; // 0
for (uint16_t index = 0; index < aMessageSize; index++)
{
SuccessOrExit(error = otMessageAppend(aMessage, &character, 1));
character++;
switch (character)
{
case 0x3A: // 9
character = 0x41; // A
break;
case 0x5B: // Z
character = 0x61; // a
break;
case 0x7B: // z
character = 0x30; // 0
break;
}
}
exit:
return error;
}
otError UdpExample::Process(int argc, char *argv[])
{
otError error = OT_ERROR_PARSE;