aboutsummaryrefslogtreecommitdiffstats
path: root/gtp/queue.h
diff options
context:
space:
mode:
Diffstat (limited to 'gtp/queue.h')
-rw-r--r--gtp/queue.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/gtp/queue.h b/gtp/queue.h
new file mode 100644
index 0000000..076a3ef
--- /dev/null
+++ b/gtp/queue.h
@@ -0,0 +1,77 @@
+/*
+ * OpenGGSN - Gateway GPRS Support Node
+ * Copyright (C) 2002 Mondru AB.
+ *
+ * The contents of this file may be used under the terms of the GNU
+ * General Public License Version 2, provided that the above copyright
+ * notice and this permission notice is included in all copies or
+ * substantial portions of the software.
+ *
+ * The initial developer of the original code is
+ * Jens Jakobsen <jj@openggsn.org>
+ *
+ * Contributor(s):
+ *
+ */
+
+/*
+ * Queue.c
+ * Reliable delivery of signalling messages
+ */
+
+#ifndef _QUEUE_H
+#define _QUEUE_H
+
+#define QUEUE_DEBUG 0 /* Print debug information */
+
+#define QUEUE_SIZE 256 /* Size of retransmission queue */
+#define QUEUE_HASH_SIZE 65536 /* Size of hash table (2^16) */
+
+struct qmsg_t { /* Holder for queued packets */
+ int state; /* 0=empty, 1=full */
+ uint16_t seq; /* The sequence number */
+ u_int8_t type; /* The type of packet */
+ void *aid; /* Application specific pointer */
+ union gtp_packet p; /* The packet stored */
+ int l; /* Length of the packet */
+ struct sockaddr_in peer;/* Address packet was sent to / received from */
+ struct qmsg_t *seqnext; /* Pointer to next in sequence hash list */
+ int next; /* Pointer to the next in queue. -1: Last */
+ int prev; /* Pointer to the previous in queue. -1: First */
+ int this; /* Pointer to myself */
+ time_t timeout; /* When do we retransmit this packet? */
+ int retrans; /* How many times did we retransmit this? */
+};
+
+struct queue_t {
+ struct qmsg_t qmsga[QUEUE_SIZE]; /* Array holding signalling messages */
+ void *hashseq[QUEUE_HASH_SIZE]; /* Hash array */
+ int next; /* Next location in queue to use */
+ int first; /* First packet in queue (oldest timeout) */
+ int last; /* Last packet in queue (youngest timeout) */
+};
+
+
+/* Allocates and initialises new queue structure */
+int queue_new(struct queue_t **queue);
+/* Deallocates queue structure */
+int queue_free(struct queue_t *queue);
+/* Find a new queue element. Return EOF if allready full */
+int queue_newmsg(struct queue_t *queue, struct qmsg_t **qmsg,
+ struct sockaddr_in *peer, uint16_t seq);
+/* Remove an element from the queue. */
+int queue_freemsg(struct queue_t *queue, struct qmsg_t *qmsg);
+/* Move an element to the back of the queue */
+int queue_back(struct queue_t *queue, struct qmsg_t *qmsg);
+/* Get the first element in the queue (oldest) */
+int queue_getfirst(struct queue_t *queue, struct qmsg_t **qmsg);
+/* Get the element with a particular sequence number */
+int queue_seqget(struct queue_t *queue, struct qmsg_t **qmsg,
+ struct sockaddr_in *peer, uint16_t seq);
+/* Free message based on sequence number */
+int queue_freemsg_seq(struct queue_t *queue, struct sockaddr_in *peer,
+ uint16_t seq, uint8_t *type, void **aid);
+
+
+#endif /* !_QUEUE_H */
+