diff options
author | Rich Salz <rsalz@akamai.com> | 2016-01-22 14:54:01 -0500 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2016-01-24 18:25:04 -0500 |
commit | cf2cede4a75f5e269f791bf1dcc029bba8c1f689 (patch) | |
tree | 093d88fcb4a288e899114adf1ecd2e208ac94758 /ssl | |
parent | 68ed0b2480023424f280e98cda7199d913f3d7cc (diff) |
Move pqueue into ssl
This is an internal facility, never documented, not for
public consumption. Move it into ssl (where it's only used
for DTLS).
I also made the typedef's for pqueue and pitem follow our style: they
name structures, not pointers.
Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'ssl')
-rw-r--r-- | ssl/Makefile.in | 2 | ||||
-rw-r--r-- | ssl/d1_lib.c | 4 | ||||
-rw-r--r-- | ssl/pqueue.c | 218 | ||||
-rw-r--r-- | ssl/record/rec_layer_d1.c | 7 | ||||
-rw-r--r-- | ssl/record/record.h | 4 | ||||
-rw-r--r-- | ssl/ssl_locl.h | 28 | ||||
-rw-r--r-- | ssl/statem/statem_dtls.c | 2 |
7 files changed, 253 insertions, 12 deletions
diff --git a/ssl/Makefile.in b/ssl/Makefile.in index fd0ab76d0c..b3860d3ca4 100644 --- a/ssl/Makefile.in +++ b/ssl/Makefile.in @@ -17,6 +17,7 @@ GENERAL=Makefile README ssl-lib.com install.com LIB=$(TOP)/libssl.a SHARED_LIB= libssl$(SHLIB_EXT) LIBSRC= \ + pqueue.c \ statem/statem_srvr.c statem/statem_clnt.c s3_lib.c s3_enc.c record/rec_layer_s3.c \ statem/statem_lib.c s3_cbc.c s3_msg.c \ methods.c t1_lib.c t1_enc.c t1_ext.c \ @@ -29,6 +30,7 @@ LIBSRC= \ record/ssl3_buffer.c record/ssl3_record.c record/dtls1_bitmap.c \ statem/statem.c LIBOBJ= \ + pqueue.o \ statem/statem_srvr.o statem/statem_clnt.o s3_lib.o s3_enc.o record/rec_layer_s3.o \ statem/statem_lib.o s3_cbc.o s3_msg.o \ methods.o t1_lib.o t1_enc.o t1_ext.o \ diff --git a/ssl/d1_lib.c b/ssl/d1_lib.c index aaa9803572..88822c06b9 100644 --- a/ssl/d1_lib.c +++ b/ssl/d1_lib.c @@ -201,8 +201,8 @@ void dtls1_free(SSL *s) void dtls1_clear(SSL *s) { - pqueue buffered_messages; - pqueue sent_messages; + pqueue *buffered_messages; + pqueue *sent_messages; unsigned int mtu; unsigned int link_mtu; diff --git a/ssl/pqueue.c b/ssl/pqueue.c new file mode 100644 index 0000000000..21ee83eccc --- /dev/null +++ b/ssl/pqueue.c @@ -0,0 +1,218 @@ +/* crypto/pqueue/pqueue.c */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#include "ssl_locl.h" +#include <openssl/bn.h> + +struct pqueue_st { + pitem *items; + int count; +}; + +pitem *pitem_new(unsigned char *prio64be, void *data) +{ + pitem *item = OPENSSL_malloc(sizeof(*item)); + if (item == NULL) + return NULL; + + memcpy(item->priority, prio64be, sizeof(item->priority)); + + item->data = data; + item->next = NULL; + + return item; +} + +void pitem_free(pitem *item) +{ + OPENSSL_free(item); +} + +pqueue *pqueue_new() +{ + pqueue *pq = OPENSSL_zalloc(sizeof(*pq)); + + return pq; +} + +void pqueue_free(pqueue *pq) +{ + OPENSSL_free(pq); +} + +pitem *pqueue_insert(pqueue *pq, pitem *item) +{ + pitem *curr, *next; + + if (pq->items == NULL) { + pq->items = item; + return item; + } + + for (curr = NULL, next = pq->items; + next != NULL; curr = next, next = next->next) { + /* + * we can compare 64-bit value in big-endian encoding with memcmp:-) + */ + int cmp = memcmp(next->priority, item->priority, 8); + if (cmp > 0) { /* next > item */ + item->next = next; + + if (curr == NULL) + pq->items = item; + else + curr->next = item; + + return item; + } + + else if (cmp == 0) /* duplicates not allowed */ + return NULL; + } + + item->next = NULL; + curr->next = item; + + return item; +} + +pitem *pqueue_peek(pqueue *pq) +{ + return pq->items; +} + +pitem *pqueue_pop(pqueue *pq) +{ + pitem *item = pq->items; + + if (pq->items != NULL) + pq->items = pq->items->next; + + return item; +} + +pitem *pqueue_find(pqueue *pq, unsigned char *prio64be) +{ + pitem *next; + pitem *found = NULL; + + if (pq->items == NULL) + return NULL; + + for (next = pq->items; next->next != NULL; next = next->next) { + if (memcmp(next->priority, prio64be, 8) == 0) { + found = next; + break; + } + } + + /* check the one last node */ + if (memcmp(next->priority, prio64be, 8) == 0) + found = next; + + if (!found) + return NULL; + + return found; +} + +void pqueue_print(pqueue *pq) +{ + pitem *item = pq->items; + + while (item != NULL) { + printf("item\t%02x%02x%02x%02x%02x%02x%02x%02x\n", + item->priority[0], item->priority[1], + item->priority[2], item->priority[3], + item->priority[4], item->priority[5], + item->priority[6], item->priority[7]); + item = item->next; + } +} + +pitem *pqueue_iterator(pqueue *pq) +{ + return pqueue_peek(pq); +} + +pitem *pqueue_next(pitem **item) +{ + pitem *ret; + + if (item == NULL || *item == NULL) + return NULL; + + /* *item != NULL */ + ret = *item; + *item = (*item)->next; + + return ret; +} + +int pqueue_size(pqueue *pq) +{ + pitem *item = pq->items; + int count = 0; + + while (item != NULL) { + count++; + item = item->next; + } + return count; +} diff --git a/ssl/record/rec_layer_d1.c b/ssl/record/rec_layer_d1.c index ebe486e419..eabbddb61d 100644 --- a/ssl/record/rec_layer_d1.c +++ b/ssl/record/rec_layer_d1.c @@ -119,7 +119,6 @@ #include "../ssl_locl.h" #include <openssl/evp.h> #include <openssl/buffer.h> -#include <openssl/pqueue.h> #include <openssl/rand.h> #include "record_locl.h" @@ -165,9 +164,9 @@ void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl) DTLS_RECORD_LAYER *d; pitem *item = NULL; DTLS1_RECORD_DATA *rdata; - pqueue unprocessed_rcds; - pqueue processed_rcds; - pqueue buffered_app_data; + pqueue *unprocessed_rcds; + pqueue *processed_rcds; + pqueue *buffered_app_data; d = rl->d; diff --git a/ssl/record/record.h b/ssl/record/record.h index af10166a88..36ae3a1021 100644 --- a/ssl/record/record.h +++ b/ssl/record/record.h @@ -109,8 +109,6 @@ * */ -#include <openssl/pqueue.h> - /***************************************************************************** * * * These structures should be considered PRIVATE to the record layer. No * @@ -186,7 +184,7 @@ typedef struct dtls1_bitmap_st { typedef struct record_pqueue_st { unsigned short epoch; - pqueue q; + struct pqueue_st *q; } record_pqueue; typedef struct dtls1_record_data_st { diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h index d9ff1c2db3..3745f0f0e2 100644 --- a/ssl/ssl_locl.h +++ b/ssl/ssl_locl.h @@ -1390,6 +1390,30 @@ typedef struct hm_fragment_st { unsigned char *reassembly; } hm_fragment; +typedef struct pqueue_st pqueue; +typedef struct pitem_st pitem; + +struct pitem_st { + unsigned char priority[8]; /* 64-bit value in big-endian encoding */ + void *data; + pitem *next; +}; + +typedef struct pitem_st *piterator; + +pitem *pitem_new(unsigned char *prio64be, void *data); +void pitem_free(pitem *item); +pqueue* pqueue_new(void); +void pqueue_free(pqueue *pq); +pitem *pqueue_insert(pqueue *pq, pitem *item); +pitem *pqueue_peek(pqueue *pq); +pitem *pqueue_pop(pqueue *pq); +pitem *pqueue_find(pqueue *pq, unsigned char *prio64be); +pitem *pqueue_iterator(pqueue *pq); +pitem *pqueue_next(piterator *iter); +void pqueue_print(pqueue *pq); +int pqueue_size(pqueue *pq); + typedef struct dtls1_state_st { unsigned char cookie[DTLS1_COOKIE_LENGTH]; unsigned int cookie_len; @@ -1401,9 +1425,9 @@ typedef struct dtls1_state_st { unsigned short handshake_read_seq; /* Buffered handshake messages */ - pqueue buffered_messages; + pqueue *buffered_messages; /* Buffered (sent) handshake records */ - pqueue sent_messages; + pqueue *sent_messages; unsigned int link_mtu; /* max on-the-wire DTLS packet size */ unsigned int mtu; /* max DTLS packet size */ diff --git a/ssl/statem/statem_dtls.c b/ssl/statem/statem_dtls.c index 627f20aab7..3aa34888b6 100644 --- a/ssl/statem/statem_dtls.c +++ b/ssl/statem/statem_dtls.c @@ -1066,7 +1066,7 @@ int dtls1_get_queue_priority(unsigned short seq, int is_ccs) int dtls1_retransmit_buffered_messages(SSL *s) { - pqueue sent = s->d1->sent_messages; + pqueue *sent = s->d1->sent_messages; piterator iter; pitem *item; hm_fragment *frag; |