blob: 9f624824a00947e5e135fe11c026f026b61b253f [file] [log] [blame]
Pau Espin Pedrolf0829ff2019-06-20 16:58:55 +02001/*
Harald Welte632e8432017-09-05 18:12:14 +02002 * OsmoGGSN - Gateway GPRS Support Node
jjako52c24142002-12-16 13:33:51 +00003 * Copyright (C) 2002 Mondru AB.
Pau Espin Pedrolf0829ff2019-06-20 16:58:55 +02004 *
jjako52c24142002-12-16 13:33:51 +00005 * The contents of this file may be used under the terms of the GNU
6 * General Public License Version 2, provided that the above copyright
7 * notice and this permission notice is included in all copies or
8 * substantial portions of the software.
Pau Espin Pedrolf0829ff2019-06-20 16:58:55 +02009 *
jjako52c24142002-12-16 13:33:51 +000010 */
11
12/*
13 * Queue.c
14 * Reliable delivery of signalling messages
15 */
16
17#ifndef _QUEUE_H
18#define _QUEUE_H
19
Pau Espin Pedrol623c5b32019-08-16 13:20:09 +020020#include <osmocom/core/linuxlist.h>
21
Pau Espin Pedrol8b90bce2019-06-20 17:06:13 +020022#include "gtp.h"
23
Harald Weltebed35df2011-11-02 13:06:18 +010024#define QUEUE_DEBUG 0 /* Print debug information */
jjako52c24142002-12-16 13:33:51 +000025
Pau Espin Pedrol05857692022-02-28 14:09:58 +010026#define QUEUE_SIZE (PDP_MAX*2) /* Size of retransmission queue */
Harald Weltebed35df2011-11-02 13:06:18 +010027#define QUEUE_HASH_SIZE 65536 /* Size of hash table (2^16) */
jjako52c24142002-12-16 13:33:51 +000028
Harald Weltebed35df2011-11-02 13:06:18 +010029struct qmsg_t { /* Holder for queued packets */
30 int state; /* 0=empty, 1=full */
31 uint16_t seq; /* The sequence number */
32 uint8_t type; /* The type of packet */
33 void *cbp; /* Application specific pointer */
34 union gtp_packet p; /* The packet stored */
35 int l; /* Length of the packet */
36 int fd; /* Socket packet was sent to / received from */
37 struct sockaddr_in peer; /* Address packet was sent to / received from */
38 struct qmsg_t *seqnext; /* Pointer to next in sequence hash list */
39 int next; /* Pointer to the next in queue. -1: Last */
40 int prev; /* Pointer to the previous in queue. -1: First */
41 int this; /* Pointer to myself */
42 time_t timeout; /* When do we retransmit this packet? */
43 int retrans; /* How many times did we retransmit this? */
Pau Espin Pedrol623c5b32019-08-16 13:20:09 +020044 struct llist_head entry; /* Listed with other qmsg_t belonging to a pdp_t->qmsg_list_req */
jjako52c24142002-12-16 13:33:51 +000045};
46
47struct queue_t {
Harald Weltebed35df2011-11-02 13:06:18 +010048 struct qmsg_t qmsga[QUEUE_SIZE]; /* Array holding signalling messages */
49 void *hashseq[QUEUE_HASH_SIZE]; /* Hash array */
50 int next; /* Next location in queue to use */
51 int first; /* First packet in queue (oldest timeout) */
52 int last; /* Last packet in queue (youngest timeout) */
jjako52c24142002-12-16 13:33:51 +000053};
54
jjako52c24142002-12-16 13:33:51 +000055/* Allocates and initialises new queue structure */
56int queue_new(struct queue_t **queue);
57/* Deallocates queue structure */
58int queue_free(struct queue_t *queue);
59/* Find a new queue element. Return EOF if allready full */
60int queue_newmsg(struct queue_t *queue, struct qmsg_t **qmsg,
61 struct sockaddr_in *peer, uint16_t seq);
62/* Remove an element from the queue. */
63int queue_freemsg(struct queue_t *queue, struct qmsg_t *qmsg);
64/* Move an element to the back of the queue */
65int queue_back(struct queue_t *queue, struct qmsg_t *qmsg);
66/* Get the first element in the queue (oldest) */
67int queue_getfirst(struct queue_t *queue, struct qmsg_t **qmsg);
68/* Get the element with a particular sequence number */
69int queue_seqget(struct queue_t *queue, struct qmsg_t **qmsg,
Harald Weltebed35df2011-11-02 13:06:18 +010070 struct sockaddr_in *peer, uint16_t seq);
jjako52c24142002-12-16 13:33:51 +000071/* Free message based on sequence number */
72int queue_freemsg_seq(struct queue_t *queue, struct sockaddr_in *peer,
Harald Weltebed35df2011-11-02 13:06:18 +010073 uint16_t seq, uint8_t * type, void **cbp);
jjako52c24142002-12-16 13:33:51 +000074
Harald Weltebed35df2011-11-02 13:06:18 +010075#endif /* !_QUEUE_H */