Version 0.5.0 of tinydtls

Dependents:   tinydtls_test_cellular tinydtls_test_ethernet tiny-dtls

Revision:
0:ff9ebe0cf0e9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/netq.h	Fri Oct 18 13:18:30 2013 +0000
@@ -0,0 +1,90 @@
+/* netq.h -- Simple packet queue
+ *
+ * Copyright (C) 2010--2012 Olaf Bergmann <bergmann@tzi.org>
+ *
+ * This file is part of the library tinyDTLS. Please see the file
+ * LICENSE for terms of use.
+ */
+
+#ifndef _NETQ_H_
+#define _NETQ_H_
+
+#include "config.h"
+#include "global.h"
+#include "dtls.h"
+#include "dtls_time.h"
+
+/**
+ * \defgroup netq Network Packet Queue
+ * The netq utility functions implement an ordered queue of data packets
+ * to send over the network and can also be used to queue received packets
+ * from the network.
+ * @{
+ */
+
+#ifndef NETQ_MAXCNT
+#define NETQ_MAXCNT 4 /**< maximum number of elements in netq structure */
+#endif
+
+/** 
+ * Datagrams in the netq_t structure have a fixed maximum size of
+ * DTLS_MAX_BUF to simplify memory management on constrained nodes. */ 
+typedef unsigned char netq_packet_t[DTLS_MAX_BUF];
+
+typedef struct netq_t {
+  struct netq_t *next;
+
+  clock_time_t t;	        /**< when to send PDU for the next time */
+  unsigned char retransmit_cnt;	/**< retransmission counter, will be removed when zero */
+  unsigned int timeout;		/**< randomized timeout value */
+
+  dtls_peer_t *peer;		/**< remote address */
+
+  size_t length;		/**< actual length of data */
+  netq_packet_t data;		/**< the datagram to send */
+} netq_t;
+
+#ifndef WITH_CONTIKI
+static inline void netq_init()
+{ }
+#else
+void netq_init();
+#endif
+
+/** 
+ * Adds a node to the given queue, ordered by their time-stamp t.
+ * This function returns @c 0 on error, or non-zero if @p node has
+ * been added successfully.
+ *
+ * @param queue A pointer to the queue head where @p node will be added.
+ * @param node  The new item to add.
+ * @return @c 0 on error, or non-zero if the new item was added.
+ */
+int netq_insert_node(netq_t **queue, netq_t *node);
+
+/** Destroys specified node and releases any memory that was allocated
+ * for the associated datagram. */
+void netq_node_free(netq_t *node);
+
+/** Removes all items from given queue and frees the allocated storage */
+void netq_delete_all(netq_t *queue);
+
+/** Creates a new node suitable for adding to a netq_t queue. */
+netq_t *netq_node_new();
+
+/**
+ * Returns a pointer to the first item in given queue or NULL if
+ * empty. 
+ */
+netq_t *netq_head(netq_t **queue);
+
+/**
+ * Removes the first item in given queue and returns a pointer to the
+ * removed element. If queue is empty when netq_pop_first() is called,
+ * this function returns NULL.
+ */
+netq_t *netq_pop_first(netq_t **queue);
+
+/**@}*/
+
+#endif /* _NETQ_H_ */