diff options
author | jjako <jjako> | 2002-12-16 13:33:51 +0000 |
---|---|---|
committer | jjako <jjako> | 2002-12-16 13:33:51 +0000 |
commit | 52c2414f6cabefb0427475756e8ac4856180bc59 (patch) | |
tree | 5ecb31a74c392c36a7d7c802f18d37349973bf00 /gtp/queue.h |
Initial revision
Diffstat (limited to 'gtp/queue.h')
-rw-r--r-- | gtp/queue.h | 77 |
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 */ + |