GPLization banner introduced to *.[hc] files
[sip-router] / modules / tm / h_table.h
1 /*
2  * $Id$
3  *
4  * Copyright (C) 2001-2003 Fhg Fokus
5  *
6  * This file is part of ser, a free SIP server.
7  *
8  * ser is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version
12  *
13  * For a license to use the ser software under conditions
14  * other than those described here, or to purchase support for this
15  * software, please contact iptel.org by e-mail at the following addresses:
16  *    info@iptel.org
17  *
18  * ser is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License 
24  * along with this program; if not, write to the Free Software 
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26  */
27
28
29
30 #ifndef _H_TABLE_H
31 #define _H_TABLE_H
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <pthread.h>
36 #include <arpa/inet.h>
37
38 #include "../../parser/msg_parser.h"
39 #include "../../types.h"
40 #include "../../md5utils.h"
41 #include "config.h"
42
43 struct s_table;
44 struct entry;
45 struct cell;
46 struct timer;
47 struct retr_buf;
48
49 #include "../../mem/shm_mem.h"
50 #include "lock.h"
51 #include "sip_msg.h"
52 #include "t_reply.h"
53 #include "t_hooks.h"
54 #include "timer.h"
55
56 #define LOCK_HASH(_h) lock_hash((_h))
57 #define UNLOCK_HASH(_h) unlock_hash((_h))
58
59 void lock_hash(int i);
60 void unlock_hash(int i);
61
62
63 #define NO_CANCEL       ( (char*) 0 )
64 #define EXTERNAL_CANCEL ( (char*) -1)
65
66 #define TYPE_LOCAL_CANCEL -1
67 #define TYPE_REQUEST       0
68
69 /* to be able to assess whether a script writer forgot to
70    release a transaction and leave it for ever in memory,
71    we mark it with operations done over it; if none of these
72    flags is set and script is being left, it is a sign of
73    script error and we need to release on writer's
74    behalf
75 */
76 enum kill_reason { REQ_FWDED=1, REQ_RPLD=2, REQ_RLSD=4, REQ_EXIST=8 };
77
78 typedef struct retr_buf
79 {
80         int activ_type;
81         /* set to status code if the buffer is a reply,
82         0 if request or -1 if local CANCEL */
83
84         char *buffer;
85         int   buffer_len;
86
87         union sockaddr_union to;
88         struct socket_info* send_sock;
89
90         /* a message can be linked just to retransmission and FR list */
91         struct timer_link retr_timer;
92         struct timer_link fr_timer;
93         enum lists retr_list;
94
95         /*the cell that containes this retrans_buff*/
96         struct cell* my_T;
97         unsigned int branch;
98
99 }retr_buf_type;
100
101
102
103 /* User Agent Server content */
104
105 typedef struct ua_server
106 {
107         struct sip_msg   *request;
108         struct retr_buf  response;
109         unsigned int     status;
110         str              to_tag;
111         unsigned int     isACKed;
112 }ua_server_type;
113
114
115
116 /* User Agent Client content */
117
118 typedef struct ua_client
119 {
120         struct retr_buf  request;
121         /* we maintain a separate copy of cancel rather than
122            reuse the strructure for original request; the 
123            original request is no longer needed but its delayed
124            timer may fire and interfere with whoever tries to
125            rewrite it
126         */
127         struct retr_buf local_cancel;
128         /* pointer to retransmission buffer where uri is printed;
129            good for generating ACK/CANCEL */
130         str              uri;
131         /* if we store a reply (branch picking), this is where it is */
132         struct sip_msg  *reply;
133         /* if we don't store, we at least want to know the status */
134         int     last_received;
135
136 }ua_client_type;
137
138
139
140 /* transaction context */
141
142 typedef struct cell
143 {
144         /* linking data */
145         struct cell*     next_cell;
146         struct cell*     prev_cell;
147
148         /* needed for generating local ACK/CANCEL for local
149            transactions; all but cseq_n include the entire
150            header field value, cseq_n only Cseq number; with
151            local transactions, pointers point to outbound buffer,
152            with proxied transactions to inbound request */
153         str from, callid, cseq_n, to;
154         /* a short-cut for remember whether this transaction needs
155            INVITE-special handling (e.g., CANCEL, ACK, FR...)
156         */
157         short is_invite;
158         /* method shortcut -- for local transactions, pointer to
159            outbound buffer, for proxies transactions pointer to
160            original message; needed for reply matching
161         */
162         str method;
163
164         /* callback and parameter on completion of local transactions */
165         transaction_cb *completion_cb;
166         /* the parameter stores a pointer to shmem -- it will be released
167            during freeing transaction too
168         */
169         void *cbp;
170
171         /* how many processes are currently processing this transaction ;
172            note that only processes working on a request/reply belonging
173            to a transaction increase ref_count -- timers don't, since we
174            rely on transaction state machine to clean-up all but wait timer
175            when entering WAIT state and the wait timer is the only place
176            from which a transaction can be deleted (if ref_count==0); good
177            for protecting from conditions in which wait_timer hits and
178            tries to delete a transaction whereas at the same time 
179            a delayed message belonging to the transaction is received
180         */
181         volatile unsigned int ref_count;
182         /* tells in which hash table entry the cell lives */
183         unsigned int  hash_index;
184         /* sequence number within hash collision slot */
185         unsigned int  label;
186
187         /* bindings to wait and delete timer */
188         struct timer_link wait_tl;
189         struct timer_link dele_tl;
190
191         /* number of forks */
192         int nr_of_outgoings;
193         /* nr of replied branch */
194         int relaied_reply_branch;
195         /* UA Server */
196         struct ua_server  uas;
197         /* UA Clients */
198         struct ua_client  uac[ MAX_BRANCHES ];
199
200         /* protection against concurrent reply processing */
201         ser_lock_t   reply_mutex;
202
203         /* the route to take if no final positive reply arrived */
204         unsigned int on_negative;
205         /* set to one if you want to disallow silent transaction
206            dropping when C timer hits
207         */
208         int noisy_ctimer;
209         /* is it a local transaction ? */
210         int local;
211
212 #ifdef _XWAIT
213         /* protection against reentering WAIT state */
214         ser_lock_t      wait_mutex;
215         /* has the transaction been put on wait status ? */
216         int on_wait;
217 #endif
218
219         /* MD5checksum  (meaningful only if syn_branch=0 */
220         char md5[MD5_LEN];
221
222 #ifdef  EXTRA_DEBUG
223         /* scheduled for deletion ? */
224         short damocles;
225 #endif
226         /* has the transaction been scheduled to die? */
227         enum kill_reason kr;
228 }cell_type;
229
230
231
232 /* double-linked list of cells with hash synonyms */
233 typedef struct entry
234 {
235         struct cell*    first_cell;
236         struct cell*    last_cell;
237         /* currently highest sequence number in a synonym list */
238         unsigned int    next_label;
239         /* sync mutex */
240         ser_lock_t      mutex;
241         unsigned int    entries;
242 }entry_type;
243
244
245
246 /* transaction table */
247 struct s_table
248 {
249         /* table of hash entries; each of them is a list of synonyms  */
250         struct entry   entrys[ TABLE_ENTRIES ];
251 #ifdef _OBSOLETED
252         /* table of timer lists */
253         struct timer   timers[ NR_OF_TIMER_LISTS ];
254 #endif
255 };
256
257
258 struct s_table* get_tm_table();
259 struct s_table* init_hash_table();
260 void   free_hash_table( );
261 void   free_cell( struct cell* dead_cell );
262 struct cell*  build_cell( struct sip_msg* p_msg );
263 void   remove_from_hash_table_unsafe( struct cell * p_cell);
264 void   insert_into_hash_table( struct cell * p_cell);
265 void   insert_into_hash_table_unsafe( struct cell * p_cell );
266
267 unsigned int transaction_count( void );
268
269 #endif
270
271