added list for DTLS handshake datagram reordering

This commit is contained in:
John Safranek
2013-02-07 11:26:02 -08:00
parent 6616975f81
commit 982b72796e
3 changed files with 89 additions and 2 deletions

View File

@@ -228,7 +228,8 @@ enum {
DYNAMIC_TYPE_SOCKADDR = 35, DYNAMIC_TYPE_SOCKADDR = 35,
DYNAMIC_TYPE_LIBZ = 36, DYNAMIC_TYPE_LIBZ = 36,
DYNAMIC_TYPE_ECC = 37, DYNAMIC_TYPE_ECC = 37,
DYNAMIC_TYPE_TMP_BUFFER = 38 DYNAMIC_TYPE_TMP_BUFFER = 38,
DYNAMIC_TYPE_DTLS_MSG = 39
}; };
/* stack protection */ /* stack protection */

View File

@@ -1385,6 +1385,13 @@ typedef struct DtlsPool {
int used; int used;
} DtlsPool; } DtlsPool;
typedef struct DtlsMsg {
struct DtlsMsg* next;
word32 seq;
word32 sz;
byte msg[1500];
} DtlsMsg;
/* CyaSSL ssl type */ /* CyaSSL ssl type */
struct CYASSL { struct CYASSL {
@@ -1457,6 +1464,7 @@ struct CYASSL {
#ifdef CYASSL_DTLS #ifdef CYASSL_DTLS
int dtls_timeout; int dtls_timeout;
DtlsPool* dtls_pool; DtlsPool* dtls_pool;
DtlsMsg* dtls_msg_list;
#endif #endif
#ifdef CYASSL_CALLBACKS #ifdef CYASSL_CALLBACKS
HandShakeInfo handShakeInfo; /* info saved during handshake */ HandShakeInfo handShakeInfo; /* info saved during handshake */
@@ -1677,6 +1685,10 @@ CYASSL_LOCAL int GrowInputBuffer(CYASSL* ssl, int size, int usedLength);
CYASSL_LOCAL int DtlsPoolTimeout(CYASSL*); CYASSL_LOCAL int DtlsPoolTimeout(CYASSL*);
CYASSL_LOCAL int DtlsPoolSend(CYASSL*); CYASSL_LOCAL int DtlsPoolSend(CYASSL*);
CYASSL_LOCAL void DtlsPoolReset(CYASSL*); CYASSL_LOCAL void DtlsPoolReset(CYASSL*);
CYASSL_LOCAL DtlsMsg* DtlsMsgNew(word32, byte*, word32, void*);
CYASSL_LOCAL void DtlsMsgDelete(DtlsMsg*, void*);
CYASSL_LOCAL void DtlsMsgListFree(DtlsMsg*, void*);
CYASSL_LOCAL DtlsMsg* DtlsMsgInsert(DtlsMsg*, DtlsMsg*);
#endif /* CYASSL_DTLS */ #endif /* CYASSL_DTLS */
#ifndef NO_TLS #ifndef NO_TLS

View File

@@ -1164,6 +1164,7 @@ int InitSSL(CYASSL* ssl, CYASSL_CTX* ctx)
ssl->keys.dtls_expected_peer_epoch = 0; ssl->keys.dtls_expected_peer_epoch = 0;
ssl->dtls_timeout = DTLS_DEFAULT_TIMEOUT; ssl->dtls_timeout = DTLS_DEFAULT_TIMEOUT;
ssl->dtls_pool = NULL; ssl->dtls_pool = NULL;
ssl->dtls_msg_list = NULL;
#endif #endif
ssl->keys.encryptionOn = 0; /* initially off */ ssl->keys.encryptionOn = 0; /* initially off */
ssl->keys.decryptedCur = 0; /* initially off */ ssl->keys.decryptedCur = 0; /* initially off */
@@ -1412,6 +1413,10 @@ void SSL_ResourceFree(CYASSL* ssl)
DtlsPoolReset(ssl); DtlsPoolReset(ssl);
XFREE(ssl->dtls_pool, ssl->heap, DYNAMIC_TYPE_NONE); XFREE(ssl->dtls_pool, ssl->heap, DYNAMIC_TYPE_NONE);
} }
if (ssl->dtls_msg_list != NULL) {
DtlsMsgListFree(ssl->dtls_msg_list, ssl->heap);
ssl->dtls_msg_list = NULL;
}
XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR); XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
ssl->buffers.dtlsCtx.peer.sa = NULL; ssl->buffers.dtlsCtx.peer.sa = NULL;
#endif #endif
@@ -1644,7 +1649,76 @@ int DtlsPoolSend(CYASSL* ssl)
return 0; return 0;
} }
#endif
/* functions for managing DTLS datagram reordering */
DtlsMsg* DtlsMsgNew(word32 dataSz, byte* data, word32 seq, void* heap)
{
DtlsMsg* msg = NULL;
if (dataSz > 0)
msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
if (msg != NULL) {
msg->next = NULL;
msg->seq = seq;
msg->sz = dataSz;
XMEMCPY(msg->msg, data, dataSz);
}
return msg;
}
void DtlsMsgDelete(DtlsMsg* msg, void* heap)
{
(void)heap;
if (msg != NULL)
XFREE(msg, heap, DYNAMIC_TYPE_DTLS_MSG);
}
void DtlsMsgListFree(DtlsMsg* head, void* heap)
{
DtlsMsg* next;
while (head) {
next = head->next;
DtlsMsgDelete(head, heap);
head = next;
}
}
DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
{
if (head == NULL || item->seq < head->seq) {
item->next = head;
head = item;
}
else if (head->next == NULL) {
head->next = item;
}
else {
DtlsMsg* cur = head->next;
DtlsMsg* prev = head;
while (cur) {
if (item->seq < cur->seq) {
item->next = cur;
prev->next = item;
break;
}
prev = cur;
cur = cur->next;
}
if (cur == NULL) {
prev->next = item;
}
}
return head;
}
#endif /* CYASSL_DTLS */
#ifndef NO_OLD_TLS #ifndef NO_OLD_TLS