1 /*
2  * Copyright (C) 2005-2006 iptelorg GmbH
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 * \file
24 * \brief Kamailio core :: Select framework, basic core functions
25 * \author mma
26 * \ingroup core
27 * Module: \ref core
28 */
29 
30 
31 #ifndef _SELECT_CORE_H
32 #define _SELECT_CORE_H
33 
34 #include "str.h"
35 #include "parser/msg_parser.h"
36 #include "select.h"
37 
38 enum {
39 	SEL_PARAM_TAG,
40 	SEL_PARAM_Q, SEL_PARAM_EXPIRES, SEL_PARAM_METHODS, SEL_PARAM_RECEIVED, SEL_PARAM_INSTANCE,
41 	SEL_PARAM_BRANCH, SEL_PARAM_RPORT, SEL_PARAM_I, SEL_PARAM_ALIAS
42        };
43 
44 enum {
45 	SEL_AUTH_PROXY,
46 	SEL_AUTH_WWW,
47 	SEL_AUTH_USERNAME,
48 	SEL_AUTH_USER,
49 	SEL_AUTH_DOMAIN,
50 	SEL_AUTH_REALM,
51 	SEL_AUTH_NONCE,
52 	SEL_AUTH_URI,
53 	SEL_AUTH_CNONCE,
54 	SEL_AUTH_NC,
55 	SEL_AUTH_RESPONSE,
56 	SEL_AUTH_OPAQUE,
57 	SEL_AUTH_ALG,
58 	SEL_AUTH_QOP
59 };
60 
61 enum {
62 	SEL_SRC  = 1<<0,
63 	SEL_DST  = 1<<1,
64 	SEL_RCV  = 1<<2,
65 	SEL_PROTO= 1<<5,
66 	SEL_IP   = 1<<6,
67 	SEL_PORT = 1<<7,
68 	SEL_IP_PORT = SEL_IP | SEL_PORT,
69 };
70 
71 enum {
72 	SEL_NOW_GMT = 1,
73 	SEL_NOW_LOCAL = 2
74 };
75 
76 enum {
77 	SEL_BRANCH_URI = 1<<0,
78 	SEL_BRANCH_Q = 1<<1,
79 	SEL_BRANCH_DST_URI = 1<<2
80 };
81 
82 SELECT_F(select_ruri)
83 SELECT_F(select_dst_uri)
84 SELECT_F(select_next_hop)
85 SELECT_F(select_next_hop_src_ip)
86 SELECT_F(select_from)
87 SELECT_F(select_from_uri)
88 SELECT_F(select_from_tag)
89 SELECT_F(select_from_name)
90 SELECT_F(select_from_params)
91 SELECT_F(select_to)
92 SELECT_F(select_to_uri)
93 SELECT_F(select_to_tag)
94 SELECT_F(select_to_name)
95 SELECT_F(select_to_params)
96 SELECT_F(select_refer_to)
97 SELECT_F(select_refer_to_uri)
98 SELECT_F(select_refer_to_tag)
99 SELECT_F(select_refer_to_name)
100 SELECT_F(select_refer_to_params)
101 SELECT_F(select_rpid)
102 SELECT_F(select_rpid_uri)
103 SELECT_F(select_rpid_tag)
104 SELECT_F(select_rpid_name)
105 SELECT_F(select_rpid_params)
106 SELECT_F(select_contact)
107 SELECT_F(select_contact_uri)
108 SELECT_F(select_contact_name)
109 SELECT_F(select_contact_params)
110 SELECT_F(select_contact_params_spec)
111 SELECT_F(select_via)
112 SELECT_F(select_via_name)
113 SELECT_F(select_via_version)
114 SELECT_F(select_via_transport)
115 SELECT_F(select_via_host)
116 SELECT_F(select_via_port)
117 SELECT_F(select_via_comment)
118 SELECT_F(select_via_params)
119 SELECT_F(select_via_params_spec)
120 
121 SELECT_F(select_msg)
122 SELECT_F(select_msg_first_line)
123 SELECT_F(select_msg_flags)
124 SELECT_F(select_msg_type)
125 SELECT_F(select_msg_len)
126 SELECT_F(select_msg_id)
127 SELECT_F(select_msg_id_hex)
128 SELECT_F(select_msg_body)
129 SELECT_F(select_msg_body_sdp)
130 SELECT_F(select_sdp_line)
131 SELECT_F(select_msg_header)
132 SELECT_F(select_anyheader)
133 SELECT_F(select_anyheader_params)
134 SELECT_F(select_msg_request)
135 SELECT_F(select_msg_request_method)
136 SELECT_F(select_msg_request_uri)
137 SELECT_F(select_msg_request_version)
138 SELECT_F(select_msg_response)
139 SELECT_F(select_msg_response_version)
140 SELECT_F(select_msg_response_status)
141 SELECT_F(select_msg_response_reason)
142 SELECT_F(select_version)
143 
144 SELECT_F(select_any_nameaddr)
145 SELECT_F(select_nameaddr_name)
146 SELECT_F(select_nameaddr_uri)
147 SELECT_F(select_nameaddr_params)
148 SELECT_F(select_any_params)
149 
150 SELECT_F(select_any_uri)
151 SELECT_F(select_uri_type)
152 SELECT_F(select_uri_user)
153 SELECT_F(select_uri_rn_user)
154 SELECT_F(select_uri_pwd)
155 SELECT_F(select_uri_host)
156 SELECT_F(select_uri_port)
157 SELECT_F(select_uri_hostport)
158 SELECT_F(select_uri_params)
159 SELECT_F(select_uri_proto)
160 
161 SELECT_F(select_event)
162 
163 SELECT_F(select_rr)
164 SELECT_F(select_rr_uri)
165 SELECT_F(select_rr_name)
166 SELECT_F(select_rr_params)
167 
168 SELECT_F(select_cseq)
169 SELECT_F(select_cseq_method)
170 SELECT_F(select_cseq_num)
171 
172 SELECT_F(select_auth)
173 SELECT_F(select_auth_param)
174 SELECT_F(select_auth_username)
175 SELECT_F(select_auth_username_comp)
176 
177 SELECT_F(select_src)
178 SELECT_F(select_dst)
179 SELECT_F(select_rcv)
180 SELECT_F(select_ip_port)
181 
182 SELECT_F(select_call_id)
183 SELECT_F(select_expires)
184 SELECT_F(select_max_forwards)
185 SELECT_F(select_content_type)
186 SELECT_F(select_content_length)
187 SELECT_F(select_subject)
188 SELECT_F(select_organization)
189 SELECT_F(select_priority)
190 SELECT_F(select_session_expires)
191 SELECT_F(select_min_se)
192 SELECT_F(select_user_agent)
193 SELECT_F(select_sip_if_match)
194 
195 SELECT_F(select_sys)
196 SELECT_F(select_sys_pid)
197 SELECT_F(select_sys_server_id)
198 SELECT_F(select_sys_unique)
199 SELECT_F(select_sys_now)
200 SELECT_F(select_sys_now_fmt)
201 
202 SELECT_F(select_branch)
203 SELECT_F(select_branch_count)
204 SELECT_F(select_branch_uri)
205 SELECT_F(select_branch_dst_uri)
206 SELECT_F(select_branch_uriq)
207 SELECT_F(select_branch_q)
208 
209 SELECT_F(select_date)
210 SELECT_F(select_identity)
211 SELECT_F(select_identity_info)
212 
213 SELECT_F(select_cfg_var)
214 SELECT_F(select_cfg_var1)
215 SELECT_F(cfg_selected_inst)
216 
217 static select_row_t select_core[] = {
218 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("ruri"), select_ruri, 0}, /* not the same as request.uri because it is involved by new_uri */
219 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("request_uri"), select_ruri, 0},
220 	{ select_ruri, SEL_PARAM_STR, STR_NULL, select_any_uri, NESTED},
221 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("dst_uri"), select_dst_uri, 0},
222 	{ select_dst_uri, SEL_PARAM_STR, STR_NULL, select_any_uri, NESTED},
223 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("next_hop"), select_next_hop, 0},
224 	{ select_next_hop, SEL_PARAM_STR, STR_STATIC_INIT("src_ip"), select_next_hop_src_ip, 0},
225 	{ select_next_hop, SEL_PARAM_STR, STR_NULL, select_any_uri, NESTED},
226 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("from"), select_from, 0},
227 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("f"), select_from, 0},
228 	{ select_from, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_from_uri, 0},
229 	{ select_from, SEL_PARAM_STR, STR_STATIC_INIT("tag"), select_from_tag, 0},
230 	{ select_from, SEL_PARAM_STR, STR_STATIC_INIT("name"), select_from_name, 0},
231 	{ select_from, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_from_params, CONSUME_NEXT_STR},
232 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("to"), select_to, 0},
233 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("t"), select_to, 0},
234 	{ select_to, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_to_uri, 0},
235 	{ select_to, SEL_PARAM_STR, STR_STATIC_INIT("tag"), select_to_tag, 0},
236 	{ select_to, SEL_PARAM_STR, STR_STATIC_INIT("name"), select_to_name, 0},
237 	{ select_to, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_to_params, CONSUME_NEXT_STR},
238 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("refer_to"), select_refer_to, 0},
239 	{ select_refer_to, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_refer_to_uri, 0},
240 	{ select_refer_to, SEL_PARAM_STR, STR_STATIC_INIT("tag"), select_refer_to_tag, 0},
241 	{ select_refer_to, SEL_PARAM_STR, STR_STATIC_INIT("name"), select_refer_to_name, 0},
242 	{ select_refer_to, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_refer_to_params, CONSUME_NEXT_STR},
243 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("remote_party_id"), select_rpid, 0},
244 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("rpid"), select_rpid, 0},
245 	{ select_rpid, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_rpid_uri, 0},
246 	{ select_rpid, SEL_PARAM_STR, STR_STATIC_INIT("tag"), select_rpid_tag, 0},
247 	{ select_rpid, SEL_PARAM_STR, STR_STATIC_INIT("name"), select_rpid_name, 0},
248 	{ select_rpid, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_rpid_params, CONSUME_NEXT_STR},
249 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("contact"), select_contact, 0},
250 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("m"), select_contact, 0},
251 	{ select_contact, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_contact_uri, 0},
252 	{ select_contact, SEL_PARAM_STR, STR_STATIC_INIT("name"), select_contact_name, 0},
253 	{ select_contact, SEL_PARAM_STR, STR_STATIC_INIT("q"), select_contact_params_spec, DIVERSION | SEL_PARAM_Q},
254 	{ select_contact, SEL_PARAM_STR, STR_STATIC_INIT("expires"), select_contact_params_spec, DIVERSION | SEL_PARAM_EXPIRES},
255 	{ select_contact, SEL_PARAM_STR, STR_STATIC_INIT("methods"), select_contact_params_spec, DIVERSION | SEL_PARAM_METHODS},
256 	{ select_contact, SEL_PARAM_STR, STR_STATIC_INIT("received"), select_contact_params_spec, DIVERSION | SEL_PARAM_RECEIVED},
257 	{ select_contact, SEL_PARAM_STR, STR_STATIC_INIT("instance"), select_contact_params_spec, DIVERSION | SEL_PARAM_INSTANCE},
258 	{ select_contact, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_contact_params, CONSUME_NEXT_STR},
259 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("via"), select_via, OPTIONAL | CONSUME_NEXT_INT},
260 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("v"), select_via, OPTIONAL | CONSUME_NEXT_INT},
261 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("name"), select_via_name, 0},
262 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("version"), select_via_version, 0},
263 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("transport"), select_via_transport, 0},
264 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("host"), select_via_host, 0},
265 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("port"), select_via_port, 0},
266 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("comment"), select_via_comment, 0},
267 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("branch"), select_via_params_spec, DIVERSION | SEL_PARAM_BRANCH},
268 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("received"), select_via_params_spec, DIVERSION | SEL_PARAM_RECEIVED},
269 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("rport"), select_via_params_spec, DIVERSION | SEL_PARAM_RPORT},
270 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("i"), select_via_params_spec, DIVERSION | SEL_PARAM_I},
271 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("alias"), select_via_params_spec, DIVERSION | SEL_PARAM_ALIAS},
272 	{ select_via, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_via_params, CONSUME_NEXT_STR},
273 
274 	{ select_from_uri, SEL_PARAM_INT, STR_NULL, select_any_uri, NESTED},
275 	{ select_to_uri, SEL_PARAM_INT, STR_NULL, select_any_uri, NESTED},
276 	{ select_refer_to_uri, SEL_PARAM_INT, STR_NULL, select_any_uri, NESTED},
277 	{ select_rpid_uri, SEL_PARAM_INT, STR_NULL, select_any_uri, NESTED},
278 	{ select_contact_uri, SEL_PARAM_INT, STR_NULL, select_any_uri, NESTED},
279 	{ select_rr_uri, SEL_PARAM_INT, STR_NULL, select_any_uri, NESTED},
280 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("type"), select_uri_type, 0},
281 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("user"), select_uri_user, 0},
282 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("rn_user"), select_uri_rn_user, 0},
283 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("pwd"), select_uri_pwd, 0},
284 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("host"), select_uri_host, 0},
285 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("port"), select_uri_port, 0},
286 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_uri_params, CONSUME_NEXT_STR | OPTIONAL | FIXUP_CALL },
287 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("hostport"), select_uri_hostport, 0},
288 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("transport"), select_uri_proto, 0},
289 
290 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("event"), select_event, 0},
291 
292 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("record_route"), select_rr, 0},
293 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("rr"), select_rr, 0},
294 	{ select_rr, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_rr_uri, 0},
295 	{ select_rr, SEL_PARAM_STR, STR_STATIC_INIT("name"), select_rr_name, 0},
296 	{ select_rr, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_rr_params, CONSUME_NEXT_STR},
297 
298 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("cseq"), select_cseq, 0},
299 	{ select_cseq, SEL_PARAM_STR, STR_STATIC_INIT("num"), select_cseq_num, 0},
300 	{ select_cseq, SEL_PARAM_STR, STR_STATIC_INIT("method"), select_cseq_method, 0},
301 
302 	{ select_any_nameaddr, SEL_PARAM_STR, STR_STATIC_INIT("name"), select_nameaddr_name, 0},
303 	{ select_any_nameaddr, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_nameaddr_uri, 0},
304 	{ select_any_nameaddr, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_nameaddr_params, OPTIONAL | CONSUME_NEXT_STR},
305 	{ select_nameaddr_uri, SEL_PARAM_INT, STR_NULL, select_any_uri, NESTED},
306 
307 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("msg"), select_msg, 0},
308 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("message"), select_msg, 0},
309 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("first_line"), select_msg_first_line, 0},
310 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("flags"), select_msg_flags, 0},
311 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("len"), select_msg_len, 0},
312 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("id"), select_msg_id, 0},
313 	{ select_msg_id, SEL_PARAM_STR, STR_STATIC_INIT("hex"), select_msg_id_hex, 0},
314 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("type"), select_msg_type, 0},
315 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("header"), select_msg_header, 0},
316 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("h"), select_msg_header, 0},
317 	{ select_msg_header, SEL_PARAM_STR, STR_NULL, select_anyheader, OPTIONAL | CONSUME_NEXT_INT | FIXUP_CALL},
318 	{ select_anyheader, SEL_PARAM_STR, STR_STATIC_INIT("nameaddr"), select_any_nameaddr, NESTED | CONSUME_NEXT_STR},
319 	{ select_anyheader, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_anyheader_params, NESTED},
320 	{ select_anyheader_params, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_any_params, CONSUME_NEXT_STR},
321 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("body"), select_msg_body, 0},
322 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("content"), select_msg_body, 0},
323 	{ select_msg_body, SEL_PARAM_STR, STR_STATIC_INIT("sdp"), select_msg_body_sdp, 0},
324 	{ select_msg_body_sdp, SEL_PARAM_STR, STR_STATIC_INIT("line"), select_sdp_line, CONSUME_NEXT_STR | FIXUP_CALL},
325 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("request"), select_msg_request, 0},
326 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("req"), select_msg_request, 0},
327 	{ select_msg_request, SEL_PARAM_STR, STR_STATIC_INIT("method"), select_msg_request_method, 0},
328 	{ select_msg_request, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_msg_request_uri, 0},
329 	{ select_msg_request_uri, SEL_PARAM_STR, STR_NULL, select_any_uri, NESTED},
330 	{ select_msg_request, SEL_PARAM_STR, STR_STATIC_INIT("version"), select_msg_request_version, 0},
331 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("response"), select_msg_response, 0},
332 	{ select_msg, SEL_PARAM_STR, STR_STATIC_INIT("res"), select_msg_response, 0},
333 	{ select_msg_response, SEL_PARAM_STR, STR_STATIC_INIT("version"), select_msg_response_version, 0},
334 	{ select_msg_response, SEL_PARAM_STR, STR_STATIC_INIT("status"), select_msg_response_status, 0},
335 	{ select_msg_response, SEL_PARAM_STR, STR_STATIC_INIT("code"), select_msg_response_status, 0},
336 	{ select_msg_response, SEL_PARAM_STR, STR_STATIC_INIT("reason"), select_msg_response_reason, 0},
337 	/*short aliases*/
338 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("method"), select_msg_request_method, 0},
339 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("version"), select_version, 0},
340 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("status"), select_msg_response_status, 0},
341 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("code"), select_msg_response_status, 0},
342 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("reason"), select_msg_response_reason, 0},
343 
344 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("proxy_authorization"), select_auth, CONSUME_NEXT_STR | DIVERSION | SEL_AUTH_PROXY | FIXUP_CALL},
345 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("authorization"), select_auth, CONSUME_NEXT_STR | DIVERSION | SEL_AUTH_WWW | FIXUP_CALL},
346 	{ select_auth, SEL_PARAM_STR, STR_STATIC_INIT("username"), select_auth_username, DIVERSION | SEL_AUTH_USERNAME},
347 	{ select_auth, SEL_PARAM_STR, STR_STATIC_INIT("realm"), select_auth_param, DIVERSION | SEL_AUTH_REALM},
348 	{ select_auth, SEL_PARAM_STR, STR_STATIC_INIT("nonce"), select_auth_param, DIVERSION | SEL_AUTH_NONCE},
349 	{ select_auth, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_auth_param, DIVERSION | SEL_AUTH_URI},
350 	{ select_auth, SEL_PARAM_STR, STR_STATIC_INIT("cnonce"), select_auth_param, DIVERSION | SEL_AUTH_CNONCE},
351 	{ select_auth, SEL_PARAM_STR, STR_STATIC_INIT("nc"), select_auth_param, DIVERSION | SEL_AUTH_NC},
352 	{ select_auth, SEL_PARAM_STR, STR_STATIC_INIT("response"), select_auth_param, DIVERSION | SEL_AUTH_RESPONSE},
353 	{ select_auth, SEL_PARAM_STR, STR_STATIC_INIT("opaque"), select_auth_param, DIVERSION | SEL_AUTH_OPAQUE},
354 	{ select_auth, SEL_PARAM_STR, STR_STATIC_INIT("algorithm"), select_auth_param, DIVERSION | SEL_AUTH_ALG},
355 	{ select_auth, SEL_PARAM_STR, STR_STATIC_INIT("qop"), select_auth_param, DIVERSION | SEL_AUTH_QOP},
356 	{ select_auth_username, SEL_PARAM_STR, STR_STATIC_INIT("user"), select_auth_username_comp, DIVERSION | SEL_AUTH_USER},
357 	{ select_auth_username, SEL_PARAM_STR, STR_STATIC_INIT("domain"), select_auth_username_comp, DIVERSION | SEL_AUTH_DOMAIN},
358 
359 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("src"), select_src, SEL_PARAM_EXPECTED},
360 	{ select_src, SEL_PARAM_STR, STR_STATIC_INIT("ip"), select_ip_port, DIVERSION | SEL_SRC | SEL_IP},
361 	{ select_src, SEL_PARAM_STR, STR_STATIC_INIT("port"), select_ip_port, DIVERSION | SEL_SRC | SEL_PORT},
362 	{ select_src, SEL_PARAM_STR, STR_STATIC_INIT("ip_port"), select_ip_port, DIVERSION | SEL_SRC | SEL_IP_PORT},
363 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("dst"), select_dst, SEL_PARAM_EXPECTED},
364 	{ select_dst, SEL_PARAM_STR, STR_STATIC_INIT("ip"), select_ip_port, DIVERSION | SEL_DST | SEL_IP},
365 	{ select_dst, SEL_PARAM_STR, STR_STATIC_INIT("port"), select_ip_port, DIVERSION | SEL_DST | SEL_PORT},
366 	{ select_dst, SEL_PARAM_STR, STR_STATIC_INIT("ip_port"), select_ip_port, DIVERSION | SEL_DST | SEL_IP_PORT},
367 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("received"), select_rcv, SEL_PARAM_EXPECTED},
368 	{ select_rcv, SEL_PARAM_STR, STR_STATIC_INIT("proto"), select_ip_port, DIVERSION | SEL_RCV | SEL_PROTO},
369 	{ select_rcv, SEL_PARAM_STR, STR_STATIC_INIT("ip"), select_ip_port, DIVERSION | SEL_RCV | SEL_IP},
370 	{ select_rcv, SEL_PARAM_STR, STR_STATIC_INIT("port"), select_ip_port, DIVERSION | SEL_RCV | SEL_PORT},
371 	{ select_rcv, SEL_PARAM_STR, STR_STATIC_INIT("ip_port"), select_ip_port, DIVERSION | SEL_RCV | SEL_IP_PORT},
372 	{ select_rcv, SEL_PARAM_STR, STR_STATIC_INIT("proto_ip_port"), select_ip_port, DIVERSION | SEL_RCV | SEL_PROTO | SEL_IP_PORT},
373 
374 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("call_id"), select_call_id, 0},
375 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("expires"), select_expires, 0},
376 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("max_forwards"), select_max_forwards, 0},
377 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("content_type"), select_content_type, 0},
378 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("content_length"), select_content_length, 0},
379 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("subject"), select_subject, 0},
380 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("organization"), select_organization, 0},
381 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("priority"), select_priority, 0},
382 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("session_expires"), select_session_expires, 0},
383 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("min_se"), select_min_se, 0},
384 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("user_agent"), select_user_agent, 0},
385 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("sip_if_match"), select_sip_if_match, 0},
386 
387 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("sys"), select_sys, SEL_PARAM_EXPECTED},
388 	{ select_sys, SEL_PARAM_STR, STR_STATIC_INIT("pid"), select_sys_pid, 0},
389 	{ select_sys, SEL_PARAM_STR, STR_STATIC_INIT("unique"), select_sys_unique, 0},
390 	{ select_sys, SEL_PARAM_STR, STR_STATIC_INIT("now"), select_sys_now, 0},
391 	{ select_sys_now, SEL_PARAM_STR, STR_STATIC_INIT("local"), select_sys_now_fmt, OPTIONAL | CONSUME_NEXT_STR | DIVERSION | SEL_NOW_LOCAL},
392 	{ select_sys_now, SEL_PARAM_STR, STR_STATIC_INIT("gmt"), select_sys_now_fmt, OPTIONAL | CONSUME_NEXT_STR | DIVERSION | SEL_NOW_GMT},
393 	{ select_sys_now, SEL_PARAM_STR, STR_STATIC_INIT("utc"), select_sys_now_fmt, OPTIONAL | CONSUME_NEXT_STR | DIVERSION | SEL_NOW_GMT},
394 	{ select_sys, SEL_PARAM_STR, STR_STATIC_INIT("server_id"), select_sys_server_id, 0},
395 
396 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("branch"), select_branch, SEL_PARAM_EXPECTED},
397 	{ select_branch, SEL_PARAM_STR, STR_STATIC_INIT("count"), select_branch_count, 0},
398 	{ select_branch, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_branch_uri, OPTIONAL | CONSUME_NEXT_INT | DIVERSION | SEL_BRANCH_URI },
399 	{ select_branch, SEL_PARAM_STR, STR_STATIC_INIT("dst_uri"), select_branch_dst_uri, OPTIONAL | CONSUME_NEXT_INT | DIVERSION | SEL_BRANCH_DST_URI},
400 	{ select_branch_uri, SEL_PARAM_STR, STR_NULL, select_any_uri, NESTED},
401 	{ select_branch_dst_uri, SEL_PARAM_STR, STR_NULL, select_any_uri, NESTED},
402 	{ select_branch, SEL_PARAM_STR, STR_STATIC_INIT("uriq"), select_branch_uriq, OPTIONAL | CONSUME_NEXT_INT | DIVERSION | SEL_BRANCH_URI | SEL_BRANCH_Q},
403 	{ select_branch_uriq, SEL_PARAM_STR, STR_NULL, select_any_nameaddr, NESTED},
404 	{ select_branch, SEL_PARAM_STR, STR_STATIC_INIT("q"), select_branch_q, OPTIONAL | CONSUME_NEXT_INT | DIVERSION | SEL_BRANCH_Q},
405 
406 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("date"), select_date, 0},
407 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("identity"), select_identity, 0},
408 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("identity_info"), select_identity_info, 0},
409 
410 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("cfg_get"), select_cfg_var1, SEL_PARAM_EXPECTED | CONSUME_NEXT_STR},
411 	{ select_cfg_var1, SEL_PARAM_STR, STR_NULL, select_cfg_var, FIXUP_CALL },
412 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("cfg_selected"), cfg_selected_inst, CONSUME_NEXT_STR | FIXUP_CALL },
413 
414 	{ select_cfg_var, SEL_PARAM_STR, STR_STATIC_INIT("nameaddr"), select_any_nameaddr, NESTED | CONSUME_NEXT_STR},
415 	{ select_cfg_var, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_any_uri, NESTED | CONSUME_NEXT_STR},
416 	{ select_cfg_var, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_anyheader_params, NESTED},
417 
418 	{ NULL, SEL_PARAM_INT, STR_NULL, NULL, 0}
419 };
420 
421 static select_table_t select_core_table = {select_core, NULL};
422 
423 #endif // _SELECT_CORE_H
424