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