14c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/*
24c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * DTLS implementation written by Nagendra Modadugu
34c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
44c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley */
54c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* ====================================================================
64c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * Copyright (c) 1999-2005 The OpenSSL Project.  All rights reserved.
74c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *
84c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * Redistribution and use in source and binary forms, with or without
94c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * modification, are permitted provided that the following conditions
104c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * are met:
114c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *
124c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 1. Redistributions of source code must retain the above copyright
134c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    notice, this list of conditions and the following disclaimer.
144c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *
154c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 2. Redistributions in binary form must reproduce the above copyright
164c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    notice, this list of conditions and the following disclaimer in
174c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    the documentation and/or other materials provided with the
184c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    distribution.
194c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *
204c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 3. All advertising materials mentioning features or use of this
214c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    software must display the following acknowledgment:
224c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    "This product includes software developed by the OpenSSL Project
234c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
244c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *
254c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
264c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    endorse or promote products derived from this software without
274c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    prior written permission. For written permission, please contact
284c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    openssl-core@OpenSSL.org.
294c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *
304c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 5. Products derived from this software may not be called "OpenSSL"
314c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    nor may "OpenSSL" appear in their names without prior written
324c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    permission of the OpenSSL Project.
334c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *
344c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 6. Redistributions of any form whatsoever must retain the following
354c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    acknowledgment:
364c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    "This product includes software developed by the OpenSSL Project
374c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
384c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *
394c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
404c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
414c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
424c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
434c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
444c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
454c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
464c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
474c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
484c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
494c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
504c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * OF THE POSSIBILITY OF SUCH DAMAGE.
514c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * ====================================================================
524c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *
534c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * This product includes cryptographic software written by Eric Young
544c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * (eay@cryptsoft.com).  This product includes software written by Tim
554c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * Hudson (tjh@cryptsoft.com). */
564c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
574c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#ifndef OPENSSL_HEADER_PQUEUE_H
584c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define OPENSSL_HEADER_PQUEUE_H
594c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
604c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#include <openssl/base.h>
614c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
624c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#if defined(__cplusplus)
634c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleyextern "C" {
644c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif
654c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
664c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
674c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* Priority queue.
684c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley *
694c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * The priority queue maintains a linked-list of nodes, each with a unique,
704c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 64-bit priority, in ascending priority order. */
714c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
724c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleytypedef struct _pqueue *pqueue;
734c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
744c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleytypedef struct _pitem {
754c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley  uint8_t priority[8]; /* 64-bit value in big-endian encoding */
764c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley  void *data;
774c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley  struct _pitem *next;
784c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley} pitem;
794c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
804c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleytypedef struct _pitem *piterator;
814c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
824c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
834c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* Creating and freeing queues. */
844c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
854c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pqueue_new allocates a fresh, empty priority queue object and returns it, or
864c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * NULL on error. */
877bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT pqueue pqueue_new(void);
884c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
894c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pqueue_free frees |pq| but not any of the items it points to. Thus |pq| must
904c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * be empty or a memory leak will occur. */
917bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT void pqueue_free(pqueue pq);
924c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
934c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
944c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* Creating and freeing items. */
954c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
964c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pitem_new allocates a fresh priority queue item that points at |data| and
974c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * has a priority given by |prio64be|, which is a 64-bit, unsigned number
984c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * expressed in big-endian form. It returns the fresh item, or NULL on
994c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * error. */
1007bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT pitem *pitem_new(uint8_t prio64be[8], void *data);
1014c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1024c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pitem_free frees |item|, but not any data that it points to. */
1037bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT void pitem_free(pitem *item);
1044c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1054c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1064c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* Queue accessor functions */
1074c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1084c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pqueue_peek returns the item with the smallest priority from |pq|, or NULL
1094c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * if empty. */
1107bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT pitem *pqueue_peek(pqueue pq);
1114c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1124c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pqueue_find returns the item whose priority matches |prio64be| or NULL if no
1134c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * such item exists. */
1147bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT pitem *pqueue_find(pqueue pq, uint8_t *prio64be);
1154c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1164c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1174c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* Queue mutation functions */
1184c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1194c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pqueue_insert inserts |item| into |pq| and returns item. */
1207bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT pitem *pqueue_insert(pqueue pq, pitem *item);
1214c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1224c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pqueue_pop takes the item with the least priority from |pq| and returns it,
1234c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * or NULL if |pq| is empty. */
1247bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT pitem *pqueue_pop(pqueue pq);
1254c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1264c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pqueue_size returns the number of items in |pq|. */
1277bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT size_t pqueue_size(pqueue pq);
1284c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1294c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1304c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* Iterating */
1314c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1324c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pqueue_iterator returns an iterator that can be used to iterate over the
1334c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * contents of the queue. */
1347bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT piterator pqueue_iterator(pqueue pq);
1354c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1364c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* pqueue_next returns the current value of |iter| and advances it to the next
1374c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * position. If the iterator has advanced over all the elements, it returns
1384c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * NULL. */
1397bdec13c03744049ba5f776b6418cbcfe61356cdAdam LangleyOPENSSL_EXPORT pitem *pqueue_next(piterator *iter);
1404c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1414c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1424c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#if defined(__cplusplus)
1434c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley}  /* extern C */
1444c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif
1454c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley
1464c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif  /* OPENSSL_HEADER_PQUEUE_H */
147