Skip to content

Commit ff4e702

Browse files
committed
DTLS Bucket improvements
- test_wolfSSL_DTLS_fragment_buckets: rewrite to use Expect framework - Correctly handle buckets between other buckets that don't touch - Fix DTLS fragment combine when data overlaps cur from the left
1 parent b7e7e75 commit ff4e702

2 files changed

Lines changed: 123 additions & 79 deletions

File tree

src/internal.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9692,8 +9692,9 @@ static DtlsFragBucket* DtlsMsgCombineFragBuckets(DtlsMsg* msg,
96929692
}
96939693
else {
96949694
/* data -> cur. memcpy as much possible as its faster. */
9695-
XMEMMOVE(newBucket->buf + dataSz, cur->buf,
9696-
cur->m.m.sz - (offsetEnd - cur->m.m.offset));
9695+
word32 skipInCur = offsetEnd - cur->m.m.offset;
9696+
XMEMMOVE(newBucket->buf + dataSz, cur->buf + skipInCur,
9697+
cur->m.m.sz - skipInCur);
96979698
XMEMCPY(newBucket->buf, data, dataSz);
96989699
}
96999700
}
@@ -9854,22 +9855,25 @@ int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte ty
98549855
msg->fragBucketListCount++;
98559856
}
98569857
}
9857-
else if (prev == NULL && fragOffsetEnd < cur->m.m.offset) {
9858-
/* This is the new first fragment we have received */
9858+
else if (fragOffsetEnd < cur->m.m.offset) {
9859+
/* Fragment is entirely before cur with a gap */
9860+
DtlsFragBucket** prev_next;
98599861
if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
98609862
WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
98619863
return DTLS_TOO_MANY_FRAGMENTS_E;
98629864
}
9863-
msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data,
9865+
prev_next = prev != NULL
9866+
? &prev->m.m.next : &msg->fragBucketList;
9867+
*prev_next = DtlsMsgCreateFragBucket(fragOffset, data,
98649868
fragSz, heap);
9865-
if (msg->fragBucketList != NULL) {
9866-
msg->fragBucketList->m.m.next = cur;
9869+
if (*prev_next != NULL) {
9870+
(*prev_next)->m.m.next = cur;
98679871
msg->bytesReceived += fragSz;
98689872
msg->fragBucketListCount++;
98699873
}
98709874
else {
98719875
/* reset on error */
9872-
msg->fragBucketList = cur;
9876+
*prev_next = cur;
98739877
}
98749878
}
98759879
else {

tests/api.c

Lines changed: 111 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -28611,6 +28611,7 @@ static int test_wolfSSL_DtlsUpdateWindow(void)
2861128611
static int DFB_TEST(WOLFSSL* ssl, word32 seq, word32 len, word32 f_offset,
2861228612
word32 f_len, word32 f_count, byte ready, word32 bytesReceived)
2861328613
{
28614+
EXPECT_DECLS;
2861428615
DtlsMsg* cur;
2861528616
static byte msg[100];
2861628617
static byte msgInit = 0;
@@ -28623,40 +28624,33 @@ static int DFB_TEST(WOLFSSL* ssl, word32 seq, word32 len, word32 f_offset,
2862328624
}
2862428625

2862528626
/* Sanitize test parameters */
28626-
if (len > sizeof(msg))
28627-
return -1;
28628-
if (f_offset + f_len > sizeof(msg))
28629-
return -1;
28627+
ExpectIntLE(len, sizeof(msg));
28628+
ExpectIntLE(f_offset + f_len, sizeof(msg));
2863028629

28631-
DtlsMsgStore(ssl, 0, seq, msg + f_offset, len, certificate, f_offset, f_len, NULL);
28630+
if (EXPECT_SUCCESS())
28631+
DtlsMsgStore(ssl, 0, seq, msg + f_offset, len, certificate, f_offset, f_len, NULL);
2863228632

28633-
if (ssl->dtls_rx_msg_list == NULL)
28634-
return -100;
28633+
ExpectNotNull(ssl->dtls_rx_msg_list);
2863528634

28636-
if ((cur = DtlsMsgFind(ssl->dtls_rx_msg_list, 0, seq)) == NULL)
28637-
return -200;
28638-
if (cur->fragBucketListCount != f_count)
28639-
return -300;
28640-
if (cur->ready != ready)
28641-
return -400;
28642-
if (cur->bytesReceived != bytesReceived)
28643-
return -500;
28635+
ExpectNotNull(cur = DtlsMsgFind(ssl->dtls_rx_msg_list, 0, seq));
28636+
ExpectIntEQ(cur->fragBucketListCount, f_count);
28637+
ExpectIntEQ(cur->ready, ready);
28638+
ExpectIntEQ(cur->bytesReceived, bytesReceived);
2864428639
if (ready) {
28645-
if (cur->fragBucketList != NULL)
28646-
return -600;
28647-
if (XMEMCMP(cur->fullMsg, msg, cur->sz) != 0)
28648-
return -700;
28640+
ExpectNull(cur->fragBucketList);
28641+
ExpectBufEQ(cur->fullMsg, msg, cur->sz);
2864928642
}
2865028643
else {
2865128644
DtlsFragBucket* fb;
28652-
if (cur->fragBucketList == NULL)
28653-
return -800;
28654-
for (fb = cur->fragBucketList; fb != NULL; fb = fb->m.m.next) {
28655-
if (XMEMCMP(fb->buf, msg + fb->m.m.offset, fb->m.m.sz) != 0)
28656-
return -900;
28657-
}
28645+
ExpectNotNull(cur->fragBucketList);
28646+
for (fb = cur->fragBucketList; EXPECT_SUCCESS() && fb != NULL; fb = fb->m.m.next)
28647+
ExpectBufEQ(fb->buf, msg + fb->m.m.offset, fb->m.m.sz);
2865828648
}
28659-
return 0;
28649+
if (EXPECT_FAIL()) {
28650+
printf("Test parameters: seq %u len %u f_offset %u f_len %u f_count %u ready %u bytesReceived %u\n",
28651+
seq, len, f_offset, f_len, f_count, ready, bytesReceived);
28652+
}
28653+
return EXPECT_RESULT();
2866028654
}
2866128655

2866228656
static int test_wolfSSL_DTLS_fragment_buckets(void)
@@ -28666,68 +28660,114 @@ static int test_wolfSSL_DTLS_fragment_buckets(void)
2866628660

2866728661
XMEMSET(ssl, 0, sizeof(*ssl));
2866828662

28669-
ExpectIntEQ(DFB_TEST(ssl, 0, 100, 0, 100, 0, 1, 100), 0); /* 0-100 */
28663+
EXPECT_TEST(DFB_TEST(ssl, 0, 100, 0, 100, 0, 1, 100)); /* 0-100 */
2867028664

28671-
ExpectIntEQ(DFB_TEST(ssl, 1, 100, 0, 20, 1, 0, 20), 0); /* 0-20 */
28672-
ExpectIntEQ(DFB_TEST(ssl, 1, 100, 20, 20, 1, 0, 40), 0); /* 20-40 */
28673-
ExpectIntEQ(DFB_TEST(ssl, 1, 100, 40, 20, 1, 0, 60), 0); /* 40-60 */
28674-
ExpectIntEQ(DFB_TEST(ssl, 1, 100, 60, 20, 1, 0, 80), 0); /* 60-80 */
28675-
ExpectIntEQ(DFB_TEST(ssl, 1, 100, 80, 20, 0, 1, 100), 0); /* 80-100 */
28665+
EXPECT_TEST(DFB_TEST(ssl, 1, 100, 0, 20, 1, 0, 20)); /* 0-20 */
28666+
EXPECT_TEST(DFB_TEST(ssl, 1, 100, 20, 20, 1, 0, 40)); /* 20-40 */
28667+
EXPECT_TEST(DFB_TEST(ssl, 1, 100, 40, 20, 1, 0, 60)); /* 40-60 */
28668+
EXPECT_TEST(DFB_TEST(ssl, 1, 100, 60, 20, 1, 0, 80)); /* 60-80 */
28669+
EXPECT_TEST(DFB_TEST(ssl, 1, 100, 80, 20, 0, 1, 100)); /* 80-100 */
2867628670

2867728671
/* Test all permutations of 3 regions */
2867828672
/* 1 2 3 */
28679-
ExpectIntEQ(DFB_TEST(ssl, 2, 100, 0, 30, 1, 0, 30), 0); /* 0-30 */
28680-
ExpectIntEQ(DFB_TEST(ssl, 2, 100, 30, 30, 1, 0, 60), 0); /* 30-60 */
28681-
ExpectIntEQ(DFB_TEST(ssl, 2, 100, 60, 40, 0, 1, 100), 0); /* 60-100 */
28673+
EXPECT_TEST(DFB_TEST(ssl, 2, 100, 0, 30, 1, 0, 30)); /* 0-30 */
28674+
EXPECT_TEST(DFB_TEST(ssl, 2, 100, 30, 30, 1, 0, 60)); /* 30-60 */
28675+
EXPECT_TEST(DFB_TEST(ssl, 2, 100, 60, 40, 0, 1, 100)); /* 60-100 */
2868228676
/* 1 3 2 */
28683-
ExpectIntEQ(DFB_TEST(ssl, 3, 100, 0, 30, 1, 0, 30), 0); /* 0-30 */
28684-
ExpectIntEQ(DFB_TEST(ssl, 3, 100, 60, 40, 2, 0, 70), 0); /* 60-100 */
28685-
ExpectIntEQ(DFB_TEST(ssl, 3, 100, 30, 30, 0, 1, 100), 0); /* 30-60 */
28677+
EXPECT_TEST(DFB_TEST(ssl, 3, 100, 0, 30, 1, 0, 30)); /* 0-30 */
28678+
EXPECT_TEST(DFB_TEST(ssl, 3, 100, 60, 40, 2, 0, 70)); /* 60-100 */
28679+
EXPECT_TEST(DFB_TEST(ssl, 3, 100, 30, 30, 0, 1, 100)); /* 30-60 */
2868628680
/* 2 1 3 */
28687-
ExpectIntEQ(DFB_TEST(ssl, 4, 100, 30, 30, 1, 0, 30), 0); /* 30-60 */
28688-
ExpectIntEQ(DFB_TEST(ssl, 4, 100, 0, 30, 1, 0, 60), 0); /* 0-30 */
28689-
ExpectIntEQ(DFB_TEST(ssl, 4, 100, 60, 40, 0, 1, 100), 0); /* 60-100 */
28681+
EXPECT_TEST(DFB_TEST(ssl, 4, 100, 30, 30, 1, 0, 30)); /* 30-60 */
28682+
EXPECT_TEST(DFB_TEST(ssl, 4, 100, 0, 30, 1, 0, 60)); /* 0-30 */
28683+
EXPECT_TEST(DFB_TEST(ssl, 4, 100, 60, 40, 0, 1, 100)); /* 60-100 */
2869028684
/* 2 3 1 */
28691-
ExpectIntEQ(DFB_TEST(ssl, 5, 100, 30, 30, 1, 0, 30), 0); /* 30-60 */
28692-
ExpectIntEQ(DFB_TEST(ssl, 5, 100, 60, 40, 1, 0, 70), 0); /* 60-100 */
28693-
ExpectIntEQ(DFB_TEST(ssl, 5, 100, 0, 30, 0, 1, 100), 0); /* 0-30 */
28685+
EXPECT_TEST(DFB_TEST(ssl, 5, 100, 30, 30, 1, 0, 30)); /* 30-60 */
28686+
EXPECT_TEST(DFB_TEST(ssl, 5, 100, 60, 40, 1, 0, 70)); /* 60-100 */
28687+
EXPECT_TEST(DFB_TEST(ssl, 5, 100, 0, 30, 0, 1, 100)); /* 0-30 */
2869428688
/* 3 1 2 */
28695-
ExpectIntEQ(DFB_TEST(ssl, 6, 100, 60, 40, 1, 0, 40), 0); /* 60-100 */
28696-
ExpectIntEQ(DFB_TEST(ssl, 6, 100, 0, 30, 2, 0, 70), 0); /* 0-30 */
28697-
ExpectIntEQ(DFB_TEST(ssl, 6, 100, 30, 30, 0, 1, 100), 0); /* 30-60 */
28689+
EXPECT_TEST(DFB_TEST(ssl, 6, 100, 60, 40, 1, 0, 40)); /* 60-100 */
28690+
EXPECT_TEST(DFB_TEST(ssl, 6, 100, 0, 30, 2, 0, 70)); /* 0-30 */
28691+
EXPECT_TEST(DFB_TEST(ssl, 6, 100, 30, 30, 0, 1, 100)); /* 30-60 */
2869828692
/* 3 2 1 */
28699-
ExpectIntEQ(DFB_TEST(ssl, 7, 100, 60, 40, 1, 0, 40), 0); /* 60-100 */
28700-
ExpectIntEQ(DFB_TEST(ssl, 7, 100, 30, 30, 1, 0, 70), 0); /* 30-60 */
28701-
ExpectIntEQ(DFB_TEST(ssl, 7, 100, 0, 30, 0, 1, 100), 0); /* 0-30 */
28693+
EXPECT_TEST(DFB_TEST(ssl, 7, 100, 60, 40, 1, 0, 40)); /* 60-100 */
28694+
EXPECT_TEST(DFB_TEST(ssl, 7, 100, 30, 30, 1, 0, 70)); /* 30-60 */
28695+
EXPECT_TEST(DFB_TEST(ssl, 7, 100, 0, 30, 0, 1, 100)); /* 0-30 */
2870228696

2870328697
/* Test overlapping regions */
28704-
ExpectIntEQ(DFB_TEST(ssl, 8, 100, 0, 30, 1, 0, 30), 0); /* 0-30 */
28705-
ExpectIntEQ(DFB_TEST(ssl, 8, 100, 20, 10, 1, 0, 30), 0); /* 20-30 */
28706-
ExpectIntEQ(DFB_TEST(ssl, 8, 100, 70, 10, 2, 0, 40), 0); /* 70-80 */
28707-
ExpectIntEQ(DFB_TEST(ssl, 8, 100, 20, 30, 2, 0, 60), 0); /* 20-50 */
28708-
ExpectIntEQ(DFB_TEST(ssl, 8, 100, 40, 60, 0, 1, 100), 0); /* 40-100 */
28698+
EXPECT_TEST(DFB_TEST(ssl, 8, 100, 0, 30, 1, 0, 30)); /* 0-30 */
28699+
EXPECT_TEST(DFB_TEST(ssl, 8, 100, 20, 10, 1, 0, 30)); /* 20-30 */
28700+
EXPECT_TEST(DFB_TEST(ssl, 8, 100, 70, 10, 2, 0, 40)); /* 70-80 */
28701+
EXPECT_TEST(DFB_TEST(ssl, 8, 100, 20, 30, 2, 0, 60)); /* 20-50 */
28702+
EXPECT_TEST(DFB_TEST(ssl, 8, 100, 40, 60, 0, 1, 100)); /* 40-100 */
2870928703

2871028704
/* Test overlapping multiple regions */
28711-
ExpectIntEQ(DFB_TEST(ssl, 9, 100, 0, 20, 1, 0, 20), 0); /* 0-20 */
28712-
ExpectIntEQ(DFB_TEST(ssl, 9, 100, 30, 5, 2, 0, 25), 0); /* 30-35 */
28713-
ExpectIntEQ(DFB_TEST(ssl, 9, 100, 40, 5, 3, 0, 30), 0); /* 40-45 */
28714-
ExpectIntEQ(DFB_TEST(ssl, 9, 100, 50, 5, 4, 0, 35), 0); /* 50-55 */
28715-
ExpectIntEQ(DFB_TEST(ssl, 9, 100, 60, 5, 5, 0, 40), 0); /* 60-65 */
28716-
ExpectIntEQ(DFB_TEST(ssl, 9, 100, 70, 5, 6, 0, 45), 0); /* 70-75 */
28717-
ExpectIntEQ(DFB_TEST(ssl, 9, 100, 30, 25, 4, 0, 55), 0); /* 30-55 */
28718-
ExpectIntEQ(DFB_TEST(ssl, 9, 100, 55, 15, 2, 0, 65), 0); /* 55-70 */
28719-
ExpectIntEQ(DFB_TEST(ssl, 9, 100, 75, 25, 2, 0, 90), 0); /* 75-100 */
28720-
ExpectIntEQ(DFB_TEST(ssl, 9, 100, 10, 25, 0, 1, 100), 0); /* 10-35 */
28721-
28722-
ExpectIntEQ(DFB_TEST(ssl, 10, 100, 0, 20, 1, 0, 20), 0); /* 0-20 */
28723-
ExpectIntEQ(DFB_TEST(ssl, 10, 100, 30, 20, 2, 0, 40), 0); /* 30-50 */
28724-
ExpectIntEQ(DFB_TEST(ssl, 10, 100, 0, 40, 1, 0, 50), 0); /* 0-40 */
28725-
ExpectIntEQ(DFB_TEST(ssl, 10, 100, 50, 50, 0, 1, 100), 0); /* 10-35 */
28705+
EXPECT_TEST(DFB_TEST(ssl, 9, 100, 0, 20, 1, 0, 20)); /* 0-20 */
28706+
EXPECT_TEST(DFB_TEST(ssl, 9, 100, 30, 5, 2, 0, 25)); /* 30-35 */
28707+
EXPECT_TEST(DFB_TEST(ssl, 9, 100, 40, 5, 3, 0, 30)); /* 40-45 */
28708+
EXPECT_TEST(DFB_TEST(ssl, 9, 100, 50, 5, 4, 0, 35)); /* 50-55 */
28709+
EXPECT_TEST(DFB_TEST(ssl, 9, 100, 60, 5, 5, 0, 40)); /* 60-65 */
28710+
EXPECT_TEST(DFB_TEST(ssl, 9, 100, 70, 5, 6, 0, 45)); /* 70-75 */
28711+
EXPECT_TEST(DFB_TEST(ssl, 9, 100, 30, 25, 4, 0, 55)); /* 30-55 */
28712+
EXPECT_TEST(DFB_TEST(ssl, 9, 100, 55, 15, 2, 0, 65)); /* 55-70 */
28713+
EXPECT_TEST(DFB_TEST(ssl, 9, 100, 75, 25, 2, 0, 90)); /* 75-100 */
28714+
EXPECT_TEST(DFB_TEST(ssl, 9, 100, 10, 25, 0, 1, 100)); /* 10-35 */
28715+
28716+
EXPECT_TEST(DFB_TEST(ssl,10, 100, 0, 20, 1, 0, 20)); /* 0-20 */
28717+
EXPECT_TEST(DFB_TEST(ssl,10, 100, 30, 20, 2, 0, 40)); /* 30-50 */
28718+
EXPECT_TEST(DFB_TEST(ssl,10, 100, 0, 40, 1, 0, 50)); /* 0-40 */
28719+
EXPECT_TEST(DFB_TEST(ssl,10, 100, 50, 50, 0, 1, 100)); /* 50-100 */
28720+
28721+
/* Test region between other regions */
28722+
EXPECT_TEST(DFB_TEST(ssl,11, 100, 0, 20, 1, 0, 20)); /* 0-20 */
28723+
EXPECT_TEST(DFB_TEST(ssl,11, 100, 80, 20, 2, 0, 40)); /* 80-100 */
28724+
EXPECT_TEST(DFB_TEST(ssl,11, 100, 40, 20, 3, 0, 60)); /* 40-60 */
28725+
EXPECT_TEST(DFB_TEST(ssl,11, 100, 20, 20, 2, 0, 80)); /* 20-40 */
28726+
EXPECT_TEST(DFB_TEST(ssl,11, 100, 60, 20, 0, 1, 100)); /* 60-80 */
28727+
28728+
/* Test gap before first bucket (prev==NULL in gap-before branch) */
28729+
EXPECT_TEST(DFB_TEST(ssl,12, 100, 50, 20, 1, 0, 20)); /* 50-70 */
28730+
EXPECT_TEST(DFB_TEST(ssl,12, 100, 0, 20, 2, 0, 40)); /* 0-20 gap before first */
28731+
EXPECT_TEST(DFB_TEST(ssl,12, 100, 20, 30, 1, 0, 70)); /* 20-50 bridges gap */
28732+
EXPECT_TEST(DFB_TEST(ssl,12, 100, 70, 30, 0, 1, 100)); /* 70-100 */
28733+
28734+
/* Test fragment after message is already complete (ready early return) */
28735+
EXPECT_TEST(DFB_TEST(ssl,13, 100, 0,100, 0, 1, 100)); /* 0-100 complete */
28736+
EXPECT_TEST(DFB_TEST(ssl,13, 100, 0, 50, 0, 1, 100)); /* 0-50 dup on ready */
28737+
28738+
/* Test combine where next bucket is larger than cur (chosenBucket=&next) */
28739+
EXPECT_TEST(DFB_TEST(ssl,14, 100, 0, 10, 1, 0, 10)); /* 0-10 */
28740+
EXPECT_TEST(DFB_TEST(ssl,14, 100, 30, 50, 2, 0, 60)); /* 30-80 */
28741+
EXPECT_TEST(DFB_TEST(ssl,14, 100, 5, 30, 1, 0, 80)); /* 5-35 next>cur */
28742+
EXPECT_TEST(DFB_TEST(ssl,14, 100, 80, 20, 0, 1, 100)); /* 80-100 */
28743+
28744+
/* Test super fragment covering all existing buckets */
28745+
EXPECT_TEST(DFB_TEST(ssl,15, 100, 10, 10, 1, 0, 10)); /* 10-20 */
28746+
EXPECT_TEST(DFB_TEST(ssl,15, 100, 30, 10, 2, 0, 20)); /* 30-40 */
28747+
EXPECT_TEST(DFB_TEST(ssl,15, 100, 60, 10, 3, 0, 30)); /* 60-70 */
28748+
EXPECT_TEST(DFB_TEST(ssl,15, 100, 0,100, 0, 1, 100)); /* 0-100 super frag */
28749+
28750+
/* Test exact duplicate fragment */
28751+
EXPECT_TEST(DFB_TEST(ssl,16, 100, 20, 40, 1, 0, 40)); /* 20-60 */
28752+
EXPECT_TEST(DFB_TEST(ssl,16, 100, 20, 40, 1, 0, 40)); /* 20-60 exact dup */
28753+
EXPECT_TEST(DFB_TEST(ssl,16, 100, 0, 20, 1, 0, 60)); /* 0-20 */
28754+
EXPECT_TEST(DFB_TEST(ssl,16, 100, 60, 40, 0, 1, 100)); /* 60-100 */
28755+
28756+
/* Test combine bridging two buckets (combineNext, cur->data) */
28757+
EXPECT_TEST(DFB_TEST(ssl,17, 100, 0, 30, 1, 0, 30)); /* 0-30 */
28758+
EXPECT_TEST(DFB_TEST(ssl,17, 100, 60, 20, 2, 0, 50)); /* 60-80 */
28759+
EXPECT_TEST(DFB_TEST(ssl,17, 100, 20, 45, 1, 0, 80)); /* 20-65 bridge */
28760+
EXPECT_TEST(DFB_TEST(ssl,17, 100, 80, 20, 0, 1, 100)); /* 80-100 */
28761+
28762+
/* Test progressive left-extension with partial overlaps */
28763+
EXPECT_TEST(DFB_TEST(ssl,18, 100, 70, 30, 1, 0, 30)); /* 70-100 */
28764+
EXPECT_TEST(DFB_TEST(ssl,18, 100, 50, 30, 1, 0, 50)); /* 50-80 extend left */
28765+
EXPECT_TEST(DFB_TEST(ssl,18, 100, 30, 30, 1, 0, 70)); /* 30-60 extend left */
28766+
EXPECT_TEST(DFB_TEST(ssl,18, 100, 0, 40, 0, 1, 100)); /* 0-40 complete left */
2872628767

2872728768
DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
2872828769
ssl->dtls_rx_msg_list = NULL;
2872928770
ssl->dtls_rx_msg_list_sz = 0;
28730-
2873128771
return EXPECT_RESULT();
2873228772
}
2873328773

0 commit comments

Comments
 (0)