1*f5b1c8a1SJohn Marino /* $OpenBSD$ */ 2*f5b1c8a1SJohn Marino /* 3*f5b1c8a1SJohn Marino * DTLS implementation written by Nagendra Modadugu 4*f5b1c8a1SJohn Marino * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 5*f5b1c8a1SJohn Marino */ 6*f5b1c8a1SJohn Marino /* ==================================================================== 7*f5b1c8a1SJohn Marino * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. 8*f5b1c8a1SJohn Marino * 9*f5b1c8a1SJohn Marino * Redistribution and use in source and binary forms, with or without 10*f5b1c8a1SJohn Marino * modification, are permitted provided that the following conditions 11*f5b1c8a1SJohn Marino * are met: 12*f5b1c8a1SJohn Marino * 13*f5b1c8a1SJohn Marino * 1. Redistributions of source code must retain the above copyright 14*f5b1c8a1SJohn Marino * notice, this list of conditions and the following disclaimer. 15*f5b1c8a1SJohn Marino * 16*f5b1c8a1SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 17*f5b1c8a1SJohn Marino * notice, this list of conditions and the following disclaimer in 18*f5b1c8a1SJohn Marino * the documentation and/or other materials provided with the 19*f5b1c8a1SJohn Marino * distribution. 20*f5b1c8a1SJohn Marino * 21*f5b1c8a1SJohn Marino * 3. All advertising materials mentioning features or use of this 22*f5b1c8a1SJohn Marino * software must display the following acknowledgment: 23*f5b1c8a1SJohn Marino * "This product includes software developed by the OpenSSL Project 24*f5b1c8a1SJohn Marino * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25*f5b1c8a1SJohn Marino * 26*f5b1c8a1SJohn Marino * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27*f5b1c8a1SJohn Marino * endorse or promote products derived from this software without 28*f5b1c8a1SJohn Marino * prior written permission. For written permission, please contact 29*f5b1c8a1SJohn Marino * openssl-core@OpenSSL.org. 30*f5b1c8a1SJohn Marino * 31*f5b1c8a1SJohn Marino * 5. Products derived from this software may not be called "OpenSSL" 32*f5b1c8a1SJohn Marino * nor may "OpenSSL" appear in their names without prior written 33*f5b1c8a1SJohn Marino * permission of the OpenSSL Project. 34*f5b1c8a1SJohn Marino * 35*f5b1c8a1SJohn Marino * 6. Redistributions of any form whatsoever must retain the following 36*f5b1c8a1SJohn Marino * acknowledgment: 37*f5b1c8a1SJohn Marino * "This product includes software developed by the OpenSSL Project 38*f5b1c8a1SJohn Marino * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39*f5b1c8a1SJohn Marino * 40*f5b1c8a1SJohn Marino * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41*f5b1c8a1SJohn Marino * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42*f5b1c8a1SJohn Marino * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43*f5b1c8a1SJohn Marino * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44*f5b1c8a1SJohn Marino * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45*f5b1c8a1SJohn Marino * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46*f5b1c8a1SJohn Marino * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47*f5b1c8a1SJohn Marino * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48*f5b1c8a1SJohn Marino * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49*f5b1c8a1SJohn Marino * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50*f5b1c8a1SJohn Marino * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51*f5b1c8a1SJohn Marino * OF THE POSSIBILITY OF SUCH DAMAGE. 52*f5b1c8a1SJohn Marino * ==================================================================== 53*f5b1c8a1SJohn Marino * 54*f5b1c8a1SJohn Marino * This product includes cryptographic software written by Eric Young 55*f5b1c8a1SJohn Marino * (eay@cryptsoft.com). This product includes software written by Tim 56*f5b1c8a1SJohn Marino * Hudson (tjh@cryptsoft.com). 57*f5b1c8a1SJohn Marino * 58*f5b1c8a1SJohn Marino */ 59*f5b1c8a1SJohn Marino 60*f5b1c8a1SJohn Marino #include <stdlib.h> 61*f5b1c8a1SJohn Marino #include <string.h> 62*f5b1c8a1SJohn Marino 63*f5b1c8a1SJohn Marino #include "pqueue.h" 64*f5b1c8a1SJohn Marino 65*f5b1c8a1SJohn Marino typedef struct _pqueue { 66*f5b1c8a1SJohn Marino pitem *items; 67*f5b1c8a1SJohn Marino int count; 68*f5b1c8a1SJohn Marino } pqueue_s; 69*f5b1c8a1SJohn Marino 70*f5b1c8a1SJohn Marino pitem * 71*f5b1c8a1SJohn Marino pitem_new(unsigned char *prio64be, void *data) 72*f5b1c8a1SJohn Marino { 73*f5b1c8a1SJohn Marino pitem *item = malloc(sizeof(pitem)); 74*f5b1c8a1SJohn Marino 75*f5b1c8a1SJohn Marino if (item == NULL) 76*f5b1c8a1SJohn Marino return NULL; 77*f5b1c8a1SJohn Marino 78*f5b1c8a1SJohn Marino memcpy(item->priority, prio64be, sizeof(item->priority)); 79*f5b1c8a1SJohn Marino 80*f5b1c8a1SJohn Marino item->data = data; 81*f5b1c8a1SJohn Marino item->next = NULL; 82*f5b1c8a1SJohn Marino 83*f5b1c8a1SJohn Marino return item; 84*f5b1c8a1SJohn Marino } 85*f5b1c8a1SJohn Marino 86*f5b1c8a1SJohn Marino void 87*f5b1c8a1SJohn Marino pitem_free(pitem *item) 88*f5b1c8a1SJohn Marino { 89*f5b1c8a1SJohn Marino free(item); 90*f5b1c8a1SJohn Marino } 91*f5b1c8a1SJohn Marino 92*f5b1c8a1SJohn Marino pqueue_s * 93*f5b1c8a1SJohn Marino pqueue_new(void) 94*f5b1c8a1SJohn Marino { 95*f5b1c8a1SJohn Marino return calloc(1, sizeof(pqueue_s)); 96*f5b1c8a1SJohn Marino } 97*f5b1c8a1SJohn Marino 98*f5b1c8a1SJohn Marino void 99*f5b1c8a1SJohn Marino pqueue_free(pqueue_s *pq) 100*f5b1c8a1SJohn Marino { 101*f5b1c8a1SJohn Marino free(pq); 102*f5b1c8a1SJohn Marino } 103*f5b1c8a1SJohn Marino 104*f5b1c8a1SJohn Marino pitem * 105*f5b1c8a1SJohn Marino pqueue_insert(pqueue_s *pq, pitem *item) 106*f5b1c8a1SJohn Marino { 107*f5b1c8a1SJohn Marino pitem *curr, *next; 108*f5b1c8a1SJohn Marino 109*f5b1c8a1SJohn Marino if (pq->items == NULL) { 110*f5b1c8a1SJohn Marino pq->items = item; 111*f5b1c8a1SJohn Marino return item; 112*f5b1c8a1SJohn Marino } 113*f5b1c8a1SJohn Marino 114*f5b1c8a1SJohn Marino for (curr = NULL, next = pq->items; next != NULL; 115*f5b1c8a1SJohn Marino curr = next, next = next->next) { 116*f5b1c8a1SJohn Marino /* we can compare 64-bit value in big-endian encoding 117*f5b1c8a1SJohn Marino * with memcmp:-) */ 118*f5b1c8a1SJohn Marino int cmp = memcmp(next->priority, item->priority, 119*f5b1c8a1SJohn Marino sizeof(item->priority)); 120*f5b1c8a1SJohn Marino if (cmp > 0) { /* next > item */ 121*f5b1c8a1SJohn Marino item->next = next; 122*f5b1c8a1SJohn Marino 123*f5b1c8a1SJohn Marino if (curr == NULL) 124*f5b1c8a1SJohn Marino pq->items = item; 125*f5b1c8a1SJohn Marino else 126*f5b1c8a1SJohn Marino curr->next = item; 127*f5b1c8a1SJohn Marino 128*f5b1c8a1SJohn Marino return item; 129*f5b1c8a1SJohn Marino } else if (cmp == 0) /* duplicates not allowed */ 130*f5b1c8a1SJohn Marino return NULL; 131*f5b1c8a1SJohn Marino } 132*f5b1c8a1SJohn Marino 133*f5b1c8a1SJohn Marino item->next = NULL; 134*f5b1c8a1SJohn Marino curr->next = item; 135*f5b1c8a1SJohn Marino 136*f5b1c8a1SJohn Marino return item; 137*f5b1c8a1SJohn Marino } 138*f5b1c8a1SJohn Marino 139*f5b1c8a1SJohn Marino pitem * 140*f5b1c8a1SJohn Marino pqueue_peek(pqueue_s *pq) 141*f5b1c8a1SJohn Marino { 142*f5b1c8a1SJohn Marino return pq->items; 143*f5b1c8a1SJohn Marino } 144*f5b1c8a1SJohn Marino 145*f5b1c8a1SJohn Marino pitem * 146*f5b1c8a1SJohn Marino pqueue_pop(pqueue_s *pq) 147*f5b1c8a1SJohn Marino { 148*f5b1c8a1SJohn Marino pitem *item = pq->items; 149*f5b1c8a1SJohn Marino 150*f5b1c8a1SJohn Marino if (pq->items != NULL) 151*f5b1c8a1SJohn Marino pq->items = pq->items->next; 152*f5b1c8a1SJohn Marino 153*f5b1c8a1SJohn Marino return item; 154*f5b1c8a1SJohn Marino } 155*f5b1c8a1SJohn Marino 156*f5b1c8a1SJohn Marino pitem * 157*f5b1c8a1SJohn Marino pqueue_find(pqueue_s *pq, unsigned char *prio64be) 158*f5b1c8a1SJohn Marino { 159*f5b1c8a1SJohn Marino pitem *next; 160*f5b1c8a1SJohn Marino 161*f5b1c8a1SJohn Marino for (next = pq->items; next != NULL; next = next->next) 162*f5b1c8a1SJohn Marino if (memcmp(next->priority, prio64be, 163*f5b1c8a1SJohn Marino sizeof(next->priority)) == 0) 164*f5b1c8a1SJohn Marino return next; 165*f5b1c8a1SJohn Marino 166*f5b1c8a1SJohn Marino return NULL; 167*f5b1c8a1SJohn Marino } 168*f5b1c8a1SJohn Marino 169*f5b1c8a1SJohn Marino pitem * 170*f5b1c8a1SJohn Marino pqueue_iterator(pqueue_s *pq) 171*f5b1c8a1SJohn Marino { 172*f5b1c8a1SJohn Marino return pqueue_peek(pq); 173*f5b1c8a1SJohn Marino } 174*f5b1c8a1SJohn Marino 175*f5b1c8a1SJohn Marino pitem * 176*f5b1c8a1SJohn Marino pqueue_next(pitem **item) 177*f5b1c8a1SJohn Marino { 178*f5b1c8a1SJohn Marino pitem *ret; 179*f5b1c8a1SJohn Marino 180*f5b1c8a1SJohn Marino if (item == NULL || *item == NULL) 181*f5b1c8a1SJohn Marino return NULL; 182*f5b1c8a1SJohn Marino 183*f5b1c8a1SJohn Marino /* *item != NULL */ 184*f5b1c8a1SJohn Marino ret = *item; 185*f5b1c8a1SJohn Marino *item = (*item)->next; 186*f5b1c8a1SJohn Marino 187*f5b1c8a1SJohn Marino return ret; 188*f5b1c8a1SJohn Marino } 189*f5b1c8a1SJohn Marino 190*f5b1c8a1SJohn Marino int 191*f5b1c8a1SJohn Marino pqueue_size(pqueue_s *pq) 192*f5b1c8a1SJohn Marino { 193*f5b1c8a1SJohn Marino pitem *item = pq->items; 194*f5b1c8a1SJohn Marino int count = 0; 195*f5b1c8a1SJohn Marino 196*f5b1c8a1SJohn Marino while (item != NULL) { 197*f5b1c8a1SJohn Marino count++; 198*f5b1c8a1SJohn Marino item = item->next; 199*f5b1c8a1SJohn Marino } 200*f5b1c8a1SJohn Marino return count; 201*f5b1c8a1SJohn Marino } 202