161a7d8a6cfc945e82a60eda6558fcda45fa431c
[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 "../../msg_parser.h"
15 #include "../../types.h"
16 #include "config.h"
17
18 struct s_table;
19 struct entry;
20 struct cell;
21 struct timer;
22
23 #include "sh_malloc.h"
24
25 #include "timer.h"
26 #include "lock.h"
27 #include "sip_msg.h"
28
29
30 #define T_UNDEFINED     ( (struct cell*) -1 )
31 #define T_NULL          ( (struct cell*) 0 )
32
33
34
35 typedef struct retrans_buff
36 {
37    char               *retr_buffer;
38    int                  bufflen;
39
40    struct sockaddr_in to;
41    size_t tolen;
42
43    /* a message can be linked just to retransmission and FR list */
44    struct timer_link retr_timer;
45    struct timer_link fr_timer;
46
47    /*the cell that containes this retrans_buff*/
48    struct cell* my_T;
49
50         enum lists retr_list;
51
52 }retrans_buff_type;
53
54
55 /* transaction context */
56
57 typedef struct cell
58 {
59         /* linking data */
60         struct cell*     next_cell;
61         struct cell*     prev_cell;
62
63         /* indicates which process is currently processing this transaction */
64         process_bm_t    ref_bitmap;
65         /* tells in which hash table entry the cell lives */
66         unsigned int  hash_index;
67         /* sequence number within hash collision slot */
68         unsigned int  label;
69
70         /* bindings to wait and delete timer */
71         struct timer_link wait_tl;
72         struct timer_link dele_tl;
73
74         /*the transaction that is canceled (usefull only for CANCEL req)*/
75         struct cell *T_canceled;
76
77         /* useful data */
78         /* UA Server */
79         struct sip_msg         *inbound_request;
80         struct retrans_buff   outbound_response;
81         unsigned int             status;
82         str*                             tag;
83         unsigned int             inbound_request_isACKed;
84         int                              relaied_reply_branch;
85         int                               nr_of_outgoings;
86         /* UA Clients */
87         struct retrans_buff   *outbound_request[ MAX_FORK ];
88         struct sip_msg          *inbound_response[ MAX_FORK ];
89         unsigned int             outbound_request_isACKed[MAX_FORK];
90
91 #ifdef  EXTRA_DEBUG
92         /* scheduled for deletion ? */
93         short damocles;
94 #endif
95 }cell_type;
96
97
98
99 /* double-linked list of cells with hash synonyms */
100 typedef struct entry
101 {
102    struct cell*       first_cell;
103    struct cell*       last_cell;
104    /* currently highest sequence number in a synonym list */
105    unsigned int    next_label;
106    /* sync mutex */
107    ser_lock_t                 mutex;
108 }entry_type;
109
110
111
112 /* transaction table */
113 struct s_table
114 {
115    /* table of hash entries; each of them is a list of synonyms  */
116    struct entry   entrys[ TABLE_ENTRIES ];
117    /* table of timer lists */
118    struct timer   timers[ NR_OF_TIMER_LISTS ];
119 };
120
121
122 struct s_table* init_hash_table();
123 void free_hash_table( struct s_table* hash_table );
124 void free_cell( struct cell* dead_cell );
125 struct cell*  build_cell( struct sip_msg* p_msg );
126 void remove_from_hash_table( struct s_table *hash_table, struct cell * p_cell );
127 void insert_into_hash_table( struct s_table *hash_table, struct cell * p_cell );
128
129 #endif