49af62e0dbd3d500bbb7bdfce111493de4f6ecdb
[sip-router] / modules / tm / t_funcs.h
1 /*
2  * $Id$
3  */
4
5
6 #ifndef _T_FUNCS_H
7 #define _T_FUNCS_H
8
9 #include <errno.h>
10 #include <netinet/in.h>
11 #include <netdb.h>
12 #include "../../msg_parser.h"
13 #include "../../globals.h"
14 #include "../../udp_server.h"
15 #include "../../msg_translator.h"
16 #include "../../forward.h"
17 #include "../../mem/mem.h"
18
19 struct s_table;
20 struct timer;
21 struct entry;
22 struct cell;
23
24 extern struct cell         *T;
25 extern unsigned int     global_msg_id;
26 extern struct s_table*  hash_table;
27
28
29 #include "sh_malloc.h"
30
31 #include "timer.h"
32 #include "lock.h"
33 #include "sip_msg.h"
34
35
36
37 /* convenience short-cut macros */
38 #define REQ_METHOD first_line.u.request.method_value
39 #define REPLY_STATUS first_line.u.reply.statuscode
40 #define REPLY_CLASS(_reply) ((_reply)->REPLY_STATUS/100)
41 #define SEND_BUFFER( _rb ) ({ if ((_rb)->retr_buffer) \
42         { udp_send( (_rb)->retr_buffer, \
43           (_rb)->bufflen, (struct sockaddr*)&((_rb)->to) , \
44           sizeof(struct sockaddr_in) ); \
45         } else \
46         DBG("ERROR: attempt to send an empty buffer from %s (%d)", \
47         __FUNCTION__, __LINE__ ); })
48
49
50 /* 
51   macros for reference bitmap (lock-less process non-exclusive ownership) 
52 */
53 #define T_IS_REFED(_T_cell) ((_T_cell)->ref_bitmap)
54 #define T_REFCOUNTER(_T_cell) \
55         ( { int _i=0; \
56                 process_bm_t _b=(_T_cell)->ref_bitmap; \
57                 while (_b) { \
58                         if ( (_b) & 1 ) _i++; \
59                         (_b) >>= 1; \
60                 } ;\
61                 (_i); \
62          } )
63                 
64
65 #ifdef EXTRA_DEBUG
66 #define T_IS_REFED_BYSELF(_T_cell) ((_T_cell)->ref_bitmap & process_bit)
67 #       define DBG_REF(_action, _t) DBG("DEBUG: XXXXX %s (%s:%d): T=%p , ref (bm=%x, cnt=%d)\n",\
68                         (_action), __FUNCTION__, __LINE__, (_t),(_t)->ref_bitmap, T_REFCOUNTER(_t));
69 #       define T_UNREF(_T_cell) \
70         ( { \
71                 DBG_REF("unref", (_T_cell)); \
72                 if (!T_IS_REFED_BYSELF(_T_cell)) { \
73                         DBG("ERROR: unrefering unrefered transaction %p from %s , %s : %d\n", \
74                                 (_T_cell), __FUNCTION__, __FILE__, __LINE__ ); \
75                         abort(); \
76                 } \
77                 (_T_cell)->ref_bitmap &= ~process_bit; \
78         } )
79
80 #       define T_REF(_T_cell) \
81         ( { \
82                 DBG_REF("ref", (_T_cell));       \
83                 if (T_IS_REFED_BYSELF(_T_cell)) { \
84                         DBG("ERROR: refering already refered transaction %p from %s , %s : %d\n", \
85                                 (_T_cell), __FUNCTION__, __FILE__, __LINE__ ); \
86                         abort(); \
87                 } \
88                 (_T_cell)->ref_bitmap |= process_bit; \
89         } )
90 #else
91 #       define T_UNREF(_T_cell) ({ (_T_cell)->ref_bitmap &= ~process_bit; })
92 #       define T_REF(_T_cell) ({ (_T_cell)->ref_bitmap |= process_bit; })
93 #endif
94
95
96         
97
98 #ifdef _OLD_XX
99 #define unref_T(_T_cell) \
100         ( {\
101                 lock( hash_table->entrys[(_T_cell)->hash_index].mutex );\
102                 (_T_cell)->ref_counter--;\
103                 DBG_REF("unref", (_T_cell)); \
104                 unlock( hash_table->entrys[(_T_cell)->hash_index].mutex );\
105         } );
106
107 /* we assume that ref_T is only called from places where
108    the associated locks are set up and we don't need to
109    lock/unlock
110 */
111 #define ref_T(_T_cell) ({ ((_T_cell)->ref_counter++); \
112                 DBG_REF("ref", (_T_cell));      })
113 #endif
114
115
116 int   tm_startup();
117 void tm_shutdown();
118
119
120 /* function returns:
121  *       1 - a new transaction was created
122  *      -1 - error, including retransmission
123  */
124 int  t_add_transaction( struct sip_msg* p_msg, char* foo, char* bar  );
125
126
127
128
129 /* function returns:
130  *      -1 - transaction wasn't found
131  *       1 - transaction found
132  */
133 int t_check( struct sip_msg* , int *branch );
134
135
136
137
138 /* Forwards the inbound request to a given IP and port.  Returns:
139  *       1 - forward successfull
140  *      -1 - error during forward
141  */
142 int t_forward( struct sip_msg* p_msg , unsigned int dst_ip ,
143                                 unsigned int dst_port);
144
145
146
147
148 /* Forwards the inbound request to dest. from via.  Returns:
149  *       1 - forward successfull
150  *      -1 - error during forward
151  */
152 int t_forward_uri( struct sip_msg* p_msg , char* foo, char* bar );
153
154
155
156 /*  This function is called whenever a reply for our module is received; we need to register
157   *  this function on module initialization;
158   *  Returns :   0 - core router stops
159   *                    1 - core router relay statelessly
160   */
161 int t_on_reply_received( struct sip_msg  *p_msg ) ;
162
163
164
165
166 /*  This function is called whenever a request for our module is received; we need to register
167   *  this function on module initialization;
168   *  Returns :   0 - core router stops
169   *                    1 - core router relay statelessly
170   */
171 int t_on_request_received( struct sip_msg  *p_msg , unsigned int ip, unsigned int port) ;
172
173
174
175
176 /*  This function is called whenever a request for our module is received; we need to register
177   *  this function on module initialization;
178   *  Returns :   0 - core router stops
179   *                    1 - core router relay statelessly
180   */
181 int t_on_request_received_uri( struct sip_msg  *p_msg ) ;
182
183
184
185
186 /* returns 1 if everything was OK or -1 for error
187 */
188 int t_release_transaction( struct sip_msg* );
189
190
191
192
193 /* Retransmits the last sent inbound reply.
194   * Returns  -1 -error
195   *                1 - OK
196   */
197 int t_retransmit_reply( struct sip_msg *, char* , char* );
198
199
200
201
202 /* Force a new response into inbound response buffer.
203  * returns 1 if everything was OK or -1 for erro
204  */
205 int t_send_reply( struct sip_msg * , unsigned int , char *  );
206
207
208 /* releases T-context */
209 int t_unref( struct sip_msg* p_msg, char* foo, char* bar );
210
211
212
213 struct cell* t_lookupOriginalT(  struct s_table* hash_table , struct sip_msg* p_msg );
214 int t_reply_matching( struct sip_msg* , unsigned int*  );
215 int t_store_incoming_reply( struct cell* , unsigned int , struct sip_msg* );
216 int  t_lookup_request( struct sip_msg* p_msg );
217 int t_all_final( struct cell * );
218 int t_build_and_send_ACK( struct cell *Trans , unsigned int brach , struct sip_msg* rpl);
219 int t_cancel_branch(unsigned int branch); //TO DO
220 int t_should_relay_response( struct cell *Trans, int new_code );
221 int t_update_timers_after_sending_reply( struct retrans_buff *rb );
222 int t_put_on_wait(  struct cell  *Trans  );
223 int relay_lowest_reply_upstream( struct cell *Trans , struct sip_msg *p_msg );
224 int push_reply_from_uac_to_uas( struct cell* Trans , unsigned int );
225 int add_branch_label( struct cell *Trans, struct sip_msg *p_msg , int branch );
226 int get_ip_and_port_from_uri( struct sip_msg* p_msg , unsigned int *param_ip, unsigned int *param_port);
227
228 void retransmission_handler( void *);
229 void final_response_handler( void *);
230 void wait_handler( void *);
231 void delete_handler( void *);
232
233
234
235
236 #endif