- TM retransmissions disabled for all but UDP
[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  * History:
28  * --------
29  * 2003-03-01  kr set through a function now (jiri)
30  */
31
32 #include "defs.h"
33
34
35 #ifndef _H_TABLE_H
36 #define _H_TABLE_H
37
38 #include <stdio.h>
39 #include <stdlib.h>
40
41 #include "../../parser/msg_parser.h"
42 #include "../../types.h"
43 #include "../../md5utils.h"
44 #include "config.h"
45
46 struct s_table;
47 struct entry;
48 struct cell;
49 struct timer;
50 struct retr_buf;
51
52 #include "../../mem/shm_mem.h"
53 #include "lock.h"
54 #include "sip_msg.h"
55 #include "t_reply.h"
56 #include "t_hooks.h"
57 #include "timer.h"
58
59 #define LOCK_HASH(_h) lock_hash((_h))
60 #define UNLOCK_HASH(_h) unlock_hash((_h))
61
62 void lock_hash(int i);
63 void unlock_hash(int i);
64
65
66 #define NO_CANCEL       ( (char*) 0 )
67 #define EXTERNAL_CANCEL ( (char*) -1)
68
69 #define TYPE_LOCAL_CANCEL -1
70 #define TYPE_REQUEST       0
71
72 /* to be able to assess whether a script writer forgot to
73    release a transaction and leave it for ever in memory,
74    we mark it with operations done over it; if none of these
75    flags is set and script is being left, it is a sign of
76    script error and we need to release on writer's
77    behalf
78
79    REQ_FWDED means there is a UAC with final response timer
80              ticking. If it hits, transaction will be completed.
81    REQ_RPLD means that a transaction has been replied -- either
82             it implies going to wait state, or for invite transactions
83             FR timer is ticking until ACK arrives
84    REQ_RLSD means that a transaction was put on wait explicitely
85             from t_release_transaction
86    REQ_EXIST means that this request is a retransmission which does not
87             affect transactional state
88          
89 */
90 enum kill_reason { REQ_FWDED=1, REQ_RPLD=2, REQ_RLSD=4, REQ_EXIST=8 };
91
92 typedef struct retr_buf
93 {
94         int activ_type;
95         /* set to status code if the buffer is a reply,
96         0 if request or -1 if local CANCEL */
97
98         char *buffer;
99         int   buffer_len;
100         
101         struct dest_info dst;
102
103         /* a message can be linked just to retransmission and FR list */
104         struct timer_link retr_timer;
105         struct timer_link fr_timer;
106         enum lists retr_list;
107
108         /*the cell that containes this retrans_buff*/
109         struct cell* my_T;
110         unsigned int branch;
111
112 }retr_buf_type;
113
114
115
116 /* User Agent Server content */
117
118 typedef struct ua_server
119 {
120         struct sip_msg   *request;
121         struct retr_buf  response;
122         unsigned int     status;
123 #ifdef _TOTAG
124         str              to_tag;
125 #endif
126         unsigned int     isACKed;
127 }ua_server_type;
128
129
130
131 /* User Agent Client content */
132
133 typedef struct ua_client
134 {
135         struct retr_buf  request;
136         /* we maintain a separate copy of cancel rather than
137            reuse the strructure for original request; the 
138            original request is no longer needed but its delayed
139            timer may fire and interfere with whoever tries to
140            rewrite it
141         */
142         struct retr_buf local_cancel;
143         /* pointer to retransmission buffer where uri is printed;
144            good for generating ACK/CANCEL */
145         str              uri;
146         /* if we store a reply (branch picking), this is where it is */
147         struct sip_msg  *reply;
148         /* if we don't store, we at least want to know the status */
149         int     last_received;
150
151 }ua_client_type;
152
153
154
155 /* transaction context */
156
157 typedef struct cell
158 {
159         /* linking data */
160         struct cell*     next_cell;
161         struct cell*     prev_cell;
162
163         /* needed for generating local ACK/CANCEL for local
164            transactions; all but cseq_n include the entire
165            header field value, cseq_n only Cseq number; with
166            local transactions, pointers point to outbound buffer,
167            with proxied transactions to inbound request */
168         str from, callid, cseq_n, to;
169         /* a short-cut for remember whether this transaction needs
170            INVITE-special handling (e.g., CANCEL, ACK, FR...)
171         */
172         short is_invite;
173         /* method shortcut -- for local transactions, pointer to
174            outbound buffer, for proxies transactions pointer to
175            original message; needed for reply matching
176         */
177         str method;
178
179         /* callback and parameter on completion of local transactions */
180         transaction_cb *completion_cb;
181         /* the parameter stores a pointer to shmem -- it will be released
182            during freeing transaction too
183         */
184         void *cbp;
185
186         /* how many processes are currently processing this transaction ;
187            note that only processes working on a request/reply belonging
188            to a transaction increase ref_count -- timers don't, since we
189            rely on transaction state machine to clean-up all but wait timer
190            when entering WAIT state and the wait timer is the only place
191            from which a transaction can be deleted (if ref_count==0); good
192            for protecting from conditions in which wait_timer hits and
193            tries to delete a transaction whereas at the same time 
194            a delayed message belonging to the transaction is received
195         */
196         volatile unsigned int ref_count;
197         /* tells in which hash table entry the cell lives */
198         unsigned int  hash_index;
199         /* sequence number within hash collision slot */
200         unsigned int  label;
201
202         /* bindings to wait and delete timer */
203         struct timer_link wait_tl;
204         struct timer_link dele_tl;
205
206         /* number of forks */
207         int nr_of_outgoings;
208         /* nr of replied branch */
209         int relaied_reply_branch;
210         /* UA Server */
211         struct ua_server  uas;
212         /* UA Clients */
213         struct ua_client  uac[ MAX_BRANCHES ];
214
215         /* protection against concurrent reply processing */
216         ser_lock_t   reply_mutex;
217
218         /* the route to take if no final positive reply arrived */
219         unsigned int on_negative;
220         /* set to one if you want to disallow silent transaction
221            dropping when C timer hits
222         */
223         int noisy_ctimer;
224         /* is it a local transaction ? */
225         int local;
226
227 #ifdef _XWAIT
228         /* protection against reentering WAIT state */
229         ser_lock_t      wait_mutex;
230         /* has the transaction been put on wait status ? */
231         int on_wait;
232 #endif
233
234         /* MD5checksum  (meaningful only if syn_branch=0 */
235         char md5[MD5_LEN];
236
237 #ifdef  EXTRA_DEBUG
238         /* scheduled for deletion ? */
239         short damocles;
240 #endif
241         /* has the transaction been scheduled to die? */
242         enum kill_reason kr;
243 }cell_type;
244
245
246
247 /* double-linked list of cells with hash synonyms */
248 typedef struct entry
249 {
250         struct cell*    first_cell;
251         struct cell*    last_cell;
252         /* currently highest sequence number in a synonym list */
253         unsigned int    next_label;
254         /* sync mutex */
255         ser_lock_t      mutex;
256         unsigned long acc_entries;
257         unsigned long cur_entries;
258 }entry_type;
259
260
261
262 /* transaction table */
263 struct s_table
264 {
265         /* table of hash entries; each of them is a list of synonyms  */
266         struct entry   entrys[ TABLE_ENTRIES ];
267 };
268
269 inline static void set_kr( struct cell *t, enum kill_reason kr )
270 {
271         if (t->kr!=0) {
272                 LOG(L_ERR, "ERROR: set_kr: kill_reason reset: from=%d to=%d\n",
273                 t->kr, kr);
274         }
275         t->kr|=kr;
276 }
277
278 struct s_table* get_tm_table();
279 struct s_table* init_hash_table();
280 void   free_hash_table( );
281 void   free_cell( struct cell* dead_cell );
282 struct cell*  build_cell( struct sip_msg* p_msg );
283 void   remove_from_hash_table_unsafe( struct cell * p_cell);
284 void   insert_into_hash_table( struct cell * p_cell);
285 void   insert_into_hash_table_unsafe( struct cell * p_cell );
286
287 unsigned int transaction_count( void );
288
289 int fifo_hash( FILE *stream, char *response_file );
290
291 #endif
292
293