mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-ggsn.git
synced 2025-10-23 00:12:08 +00:00
Osmocom has maintained this program since about 7 years now, while the original author / copyright holder has completely disappeared. With the introduction of Osmocom-style CTRL and VTY interfaces, the way how the program is used and configured has substantially changed. In order to avoid confusion in terms of configuration file format etc, let's rename it to OsmoGGSN. Change-Id: I2da30f7d4828e185bfac1a4e2d8414b01cbe4f9d
71 lines
2.7 KiB
C
71 lines
2.7 KiB
C
/*
|
|
* OsmoGGSN - 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.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* Queue.c
|
|
* Reliable delivery of signalling messages
|
|
*/
|
|
|
|
#ifndef _QUEUE_H
|
|
#define _QUEUE_H
|
|
|
|
#define QUEUE_DEBUG 0 /* Print debug information */
|
|
|
|
#define QUEUE_SIZE 1024 /* 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 */
|
|
uint8_t type; /* The type of packet */
|
|
void *cbp; /* Application specific pointer */
|
|
union gtp_packet p; /* The packet stored */
|
|
int l; /* Length of the packet */
|
|
int fd; /* Socket packet was sent to / received from */
|
|
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 **cbp);
|
|
|
|
#endif /* !_QUEUE_H */
|