forked from kamailio/kamailio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dset.h
261 lines (210 loc) · 6.86 KB
/
dset.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
/*
* Copyright (C) 2001-2004 FhG FOKUS
*
* This file is part of Kamailio, a free SIP server.
*
* Kamailio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version
*
* Kamailio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*!
* \file
* \brief Kamailio core :: Destination set handling
* \ingroup core
* Module: \ref core
*/
#ifndef _DSET_H
#define _DSET_H
#include "ip_addr.h"
#include "qvalue.h"
#include "flags.h"
#include "parser/msg_parser.h"
extern unsigned int nr_branches;
extern int ruri_is_new;
/*! \brief
* Structure for storing branch attributes
*/
struct branch
{
char uri[MAX_URI_SIZE];
unsigned int len;
/* Real destination of the request */
char dst_uri[MAX_URI_SIZE];
unsigned int dst_uri_len;
/* Path set */
char path[MAX_PATH_SIZE];
unsigned int path_len;
int q; /* Preference of the contact among
* contact within the array */
struct socket_info* force_send_socket;
/* +sip.instance contact header param value */
char instance[MAX_INSTANCE_SIZE];
unsigned int instance_len;
/* reg-id contact header param value */
unsigned int reg_id;
/* ruid value from usrloc */
char ruid[MAX_RUID_SIZE];
unsigned int ruid_len;
char location_ua[MAX_UA_SIZE + 1];
unsigned int location_ua_len;
/* Branch flags */
flag_t flags;
};
typedef struct branch branch_t;
/*! \brief
* Return pointer to branch[idx] structure
*/
branch_t *get_sip_branch(int idx);
/*! \brief
* Drop branch[idx]
*/
int drop_sip_branch(int idx);
/*! \brief
* Add a new branch to current transaction
*/
int append_branch(struct sip_msg* msg, str* uri, str* dst_uri, str* path,
qvalue_t q, unsigned int flags,
struct socket_info* force_socket,
str* instance, unsigned int reg_id,
str* ruid, str* location_ua);
/*! \brief kamailio compatible version */
#define km_append_branch(msg, uri, dst_uri, path, q, flags, force_socket) \
append_branch(msg, uri, dst_uri, path, q, flags, force_socket, 0, 0, 0, 0)
/*! \brief ser compatible append_branch version.
* append_branch version compatible with ser: no path or branch flags support
* and no str parameters.
*/
static inline int ser_append_branch(struct sip_msg* msg,
char* uri, int uri_len,
char* dst_uri, int dst_uri_len,
qvalue_t q,
struct socket_info* force_socket)
{
str s_uri, s_dst_uri;
s_uri.s=uri;
s_uri.len=uri_len;
s_dst_uri.s=dst_uri;
s_dst_uri.len=dst_uri_len;
return append_branch(msg, &s_uri, &s_dst_uri, 0, q, 0, force_socket, 0, 0, 0, 0);
}
/*! \brief
* Init the index to iterate through the list of transaction branches
*/
void init_branch_iterator(void);
/*! \brief
* Return branch iterator position
*/
int get_branch_iterator(void);
/*! \brief
* Set branch iterator position
*/
void set_branch_iterator(int n);
/*! \brief Get the next branch in the current transaction.
* @return pointer to the uri of the next branch (which the length written in
* *len) or 0 if there are no more branches.
*/
char* next_branch(int* len, qvalue_t* q, str* dst_uri, str* path,
unsigned int* flags, struct socket_info** force_socket,
str *ruid, str *instance, str *location_ua);
char* get_branch( unsigned int i, int* len, qvalue_t* q, str* dst_uri,
str* path, unsigned int *flags,
struct socket_info** force_socket,
str* ruid, str *instance, str *location_ua);
/*! \brief
* Empty the array of branches
*/
void clear_branches(void);
/*! \brief
* Create a Contact header field from the
* list of current branches
*/
char* print_dset(struct sip_msg* msg, int* len);
/*! \brief
* Set the q value of the Request-URI
*/
void set_ruri_q(qvalue_t q);
/*! \brief
* Get src ip, port and proto as SIP uri or proxy address
*/
int msg_get_src_addr(sip_msg_t *msg, str *uri, int mode);
/*! \brief
* Get the q value of the Request-URI
*/
qvalue_t get_ruri_q(void);
/*
* Get actual Request-URI
*/
inline static int get_request_uri(struct sip_msg* _m, str* _u)
{
*_u=*GET_RURI(_m);
return 0;
}
#define ruri_mark_new() (ruri_is_new = 1)
#define ruri_mark_consumed() (ruri_is_new = 0)
/** returns whether or not ruri should be used when forking.
* (usefull for serial forking)
* @return 0 if already marked as consumed, 1 if not.
*/
#define ruri_get_forking_state() (ruri_is_new)
int rewrite_uri(struct sip_msg* _m, str* _s);
/*! \brief
* Set a per-branch flag to 1.
*
* This function sets the value of one particular branch flag to 1.
* @param branch Number of the branch (0 for the main Request-URI branch)
* @param flag Number of the flag to be set (starting with 0)
* @return 1 on success, -1 on failure.
*/
int setbflag(unsigned int branch, flag_t flag);
/*! \brief
* Reset a per-branch flag value to 0.
*
* This function resets the value of one particular branch flag to 0.
* @param branch Number of the branch (0 for the main Request-URI branch)
* @param flag Number of the flag to be reset (starting with 0)
* @return 1 on success, -1 on failure.
*/
int resetbflag(unsigned int branch, flag_t flag);
/*! \brief
* Determine if a branch flag is set.
*
* This function tests the value of one particular per-branch flag.
* @param branch Number of the branch (0 for the main Request-URI branch)
* @param flag Number of the flag to be tested (starting with 0)
* @return 1 if the branch flag is set, -1 if not or on failure.
*/
int isbflagset(unsigned int branch, flag_t flag);
/*! \brief
* Get the value of all branch flags for a branch
*
* This function returns the value of all branch flags
* combined in a single variable.
* @param branch Number of the branch (0 for the main Request-URI branch)
* @param res A pointer to a variable to store the result
* @return 1 on success, -1 on failure
*/
int getbflagsval(unsigned int branch, flag_t* res);
/*! \brief
* Set the value of all branch flags at once for a given branch.
*
* This function sets the value of all branch flags for a given
* branch at once.
* @param branch Number of the branch (0 for the main Request-URI branch)
* @param val All branch flags combined into a single variable
* @return 1 on success, -1 on failure
*/
int setbflagsval(unsigned int branch, flag_t val);
int uri_add_rcv_alias(sip_msg_t *msg, str *uri, str *nuri);
int uri_restore_rcv_alias(str *uri, str *nuri, str *suri);
int init_dst_set(void);
#endif /* _DSET_H */