tm: remove old timer based transaction delete functionality, not active since 2007
[kamailio] / src / modules / tm / t_funcs.h
1 /*
2  * Copyright (C) 2001-2003 FhG Fokus
3  *
4  * This file is part of Kamailio, a free SIP server.
5  *
6  * Kamailio is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version
10  *
11  * Kamailio is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License 
17  * along with this program; if not, write to the Free Software 
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20
21
22
23 #ifndef _T_FUNCS_H
24 #define _T_FUNCS_H
25
26 #include "defs.h"
27
28
29 #include <errno.h>
30 #include <netdb.h>
31
32 #include "../../core/mem/shm_mem.h"
33 #include "../../core/parser/msg_parser.h"
34 #include "../../core/globals.h"
35 #include "../../core/udp_server.h"
36 #include "../../core/msg_translator.h"
37 #include "../../core/timer.h"
38 #include "../../core/forward.h"
39 #include "../../core/mem/mem.h"
40 #include "../../core/md5utils.h"
41 #include "../../core/ip_addr.h"
42 #include "../../core/parser/parse_uri.h"
43 #include "../../core/usr_avp.h"
44 #include "../../core/atomic_ops.h"
45
46 #include "config.h"
47 #include "lock.h"
48 #include "timer.h"
49 #include "sip_msg.h"
50 #include "h_table.h"
51 #include "ut.h"
52
53 struct s_table;
54 struct timer;
55 struct entry;
56 struct cell;
57
58 extern int tm_error; /* delayed tm error */
59 extern struct msgid_var user_cell_set_flags;
60 extern struct msgid_var user_cell_reset_flags;
61
62 extern int fr_inv_timer_avp_type;
63 extern int_str fr_inv_timer_avp;
64 extern str contacts_avp;
65 extern str contact_flows_avp;
66
67 /* default names for timer's AVPs  */
68 #define FR_TIMER_AVP      "callee_fr_timer"
69 #define FR_INV_TIMER_AVP  "callee_fr_inv_timer"
70
71
72 /* send a private buffer: utilize a retransmission structure
73    but take a separate buffer not referred by it; healthy
74    for reducing time spend in REPLIES locks
75 */
76
77
78 /* send a buffer -- 'PR' means private, i.e., it is assumed noone
79    else can affect the buffer during sending time
80 */
81 #ifdef EXTRA_DEBUG
82 int send_pr_buffer( struct retr_buf *rb,
83         void *buf, int len, char* file, const char *function, int line );
84 #define SEND_PR_BUFFER(_rb,_bf,_le ) \
85         send_pr_buffer( (_rb), (_bf), (_le), __FILE__,  __FUNCTION__, __LINE__ )
86 #else
87 int send_pr_buffer( struct retr_buf *rb, void *buf, int len);
88 #define SEND_PR_BUFFER(_rb,_bf,_le ) \
89         send_pr_buffer( (_rb), (_bf), (_le))
90 #endif
91
92 #define SEND_BUFFER( _rb ) \
93         SEND_PR_BUFFER( (_rb) , (_rb)->buffer , (_rb)->buffer_len )
94
95
96
97 #define UNREF_FREE(_T_cell, _T_unlinked) \
98         do{\
99                 if (atomic_dec_and_test(&(_T_cell)->ref_count)){ \
100                         unlink_timers((_T_cell)); \
101                         free_cell((_T_cell)); \
102                 }else{ \
103                         if(_T_unlinked){ \
104                                 if(t_linked_timers(_T_cell)) { \
105                                         unlink_timers((_T_cell)); \
106                                 } \
107                                 free_cell((_T_cell)); \
108                         }else{ \
109                                 t_stats_delayed_free(); \
110                         } \
111                 } \
112         }while(0)
113
114 #define UNREF_NOSTATS(_T_cell) \
115         do{\
116                 if (atomic_dec_and_test(&(_T_cell)->ref_count)){ \
117                         unlink_timers((_T_cell)); \
118                         free_cell((_T_cell)); \
119                 }\
120         }while(0)
121
122 #define UNREF_UNSAFE(_T_cell) UNREF_NOSTATS(_T_cell)
123 /* all the version are safe when using atomic ops */
124 #define UNREF(_T_cell) UNREF_UNSAFE(_T_cell); 
125 #define REF(_T_cell) (atomic_inc(&(_T_cell)->ref_count))
126 #define REF_UNSAFE(_T_cell)  REF(_T_cell)
127 #define INIT_REF(_T_cell, v) atomic_set(&(_T_cell)->ref_count, v)
128
129 /*
130  * Parse and fixup the fr_*_timer AVP specs
131  */
132 int init_avp_params(char *fr_timer_param, char *fr_inv_timer_param);
133
134
135 typedef void (*unref_cell_f)(struct cell *t);
136 void unref_cell(struct cell *t);
137 /*
138  * Get the FR_{INV}_TIMER from corresponding AVP
139  */
140 int fr_avp2timer(unsigned int* timer);
141 int fr_inv_avp2timer(unsigned int* timer);
142
143
144 #ifdef TIMER_DEBUG
145 #define start_retr(rb) \
146         _set_fr_retr((rb), \
147                                 ((rb)->dst.proto==PROTO_UDP) ? RT_T1_TIMEOUT_MS(rb) : \
148                                                                                                 (unsigned)(-1), \
149                                 __FILE__, __FUNCTION__, __LINE__)
150
151 #define force_retr(rb) \
152         _set_fr_retr((rb), RT_T1_TIMEOUT_MS(rb), __FILE__, __FUNCTION__, __LINE__)
153
154 #else
155 #define start_retr(rb) \
156         _set_fr_retr((rb), \
157                                 ((rb)->dst.proto==PROTO_UDP) ? RT_T1_TIMEOUT_MS(rb) : \
158                                                                                                 (unsigned)(-1))
159
160 #define force_retr(rb) \
161         _set_fr_retr((rb), RT_T1_TIMEOUT_MS(rb))
162
163 #endif
164
165
166
167
168 void tm_shutdown(void);
169
170
171 /* function returns:
172  *       1 - a new transaction was created
173  *      -1 - error, including retransmission
174  */
175 int  t_add_transaction( struct sip_msg* p_msg  );
176
177
178 /* returns 1 if everything was OK or -1 for error */
179 int t_release_transaction( struct cell *trans );
180 typedef int (*trelease_t)(struct cell *t);
181
182
183 int get_ip_and_port_from_uri( str* uri , unsigned int *param_ip,
184         unsigned int *param_port);
185
186
187 void put_on_wait(  struct cell  *Trans  );
188 int t_on_wait(tm_cell_t *Trans);
189
190
191 int t_relay_to( struct sip_msg  *p_msg ,
192         struct proxy_l *proxy, int proto, int replicate ) ;
193
194 int kill_transaction( struct cell *trans, int error );
195 int kill_transaction_unsafe( struct cell *trans, int error );
196 #endif
197