xref: /illumos-gate/usr/src/lib/libsip/common/sip_msg.h (revision 1da57d55)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SIP_MSG_H
28 #define	_SIP_MSG_H
29 
30 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 #include <pthread.h>
35 #include <sip.h>
36 #include <sys/types.h>
37 
38 #ifdef	__solaris__
39 extern int mutex_held();
40 #endif
41 
42 extern sip_header_function_t *sip_header_function_table_external;
43 
44 /* Compare Cseq numbers */
45 #define	SIP_CSEQ_LT(a, b)	((int32_t)((a)-(b)) < 0)
46 #define	SIP_CSEQ_GT(a, b)	((int32_t)((a)-(b)) > 0)
47 #define	SIP_CSEQ_GEQ(a, b)	((int32_t)((a)-(b)) >= 0)
48 
49 #define	SIP_HEADER_ACTIVE	0x0
50 #define	SIP_HEADER_DELETED	0x1
51 #define	SIP_HEADER_DELETED_VAL	0x2
52 
53 /* List of registered sent-by values */
54 typedef struct sent_by_list_s {
55 	struct sent_by_list_s	*sb_next;
56 	struct sent_by_list_s	*sb_prev;
57 	char			*sb_val;
58 } sent_by_list_t;
59 
60 extern sent_by_list_t	*sip_sent_by;
61 extern int		sip_sent_by_count;
62 extern pthread_mutex_t	sip_sent_by_lock;
63 
64 typedef struct sip_header {
65 	sip_hdr_general_t	sip_hdr_general;
66 	/* active/deleted or has deleted val */
67 	int			sip_header_state;
68 	struct sip_header	*sip_hdr_next;
69 	struct sip_header	*sip_hdr_prev;
70 	struct sip_message	*sip_hdr_sipmsg;
71 	/* True if header was allocated */
72 	boolean_t		sip_hdr_allocated;
73 	sip_header_function_t	*sip_header_functions;
74 }_sip_header_t;
75 
76 /* Structure for the SIP message body */
77 typedef struct sip_content {
78 	char			*sip_content_start;
79 	char			*sip_content_end;
80 	char			*sip_content_current;
81 	struct sip_content	*sip_content_next;
82 	boolean_t		sip_content_allocated;
83 }sip_content_t;
84 
85 
86 /* General definitions */
87 
88 /* Two string values */
89 typedef struct sip_2strs {
90 	sip_str_t	s1;
91 	sip_str_t	s2;
92 }sip_2strs_t;
93 
94 /* An integer and a string value */
95 typedef struct sip_intstr {
96 	int		i;
97 	sip_str_t	s;
98 } sip_intstr_t;
99 
100 /* Warn value */
101 typedef struct sip_warn {
102 	int		code;
103 	sip_str_t	agt;
104 	sip_str_t	text;
105 } sip_warn_t;
106 
107 /* Date value */
108 typedef struct sip_date {
109 	sip_str_t	t;
110 	int		d;
111 	sip_str_t	m;
112 	int		y;
113 	sip_str_t	tz;
114 	sip_str_t	wd;
115 } sip_date_t;
116 
117 /* Authorization and authentication value */
118 typedef struct sip_auth {
119 	sip_str_t	scheme;
120 	sip_param_t	*param;
121 } sip_auth_t;
122 
123 /* RACK value */
124 typedef struct sip_rack {
125 	int		rack_resp_num;
126 	int		rack_cseq_num;
127 	sip_method_t	rack_method;
128 }sip_rack_t;
129 
130 /* Cseq value */
131 typedef struct sip_cseq {
132 	int		num;
133 	sip_method_t	method;
134 } sip_cseq_value_t;
135 
136 /* Value for Contact, From and To header */
137 typedef struct cftr_value {
138 	sip_str_t	*display_name;
139 	sip_str_t	uri;
140 } sip_cftr_value_t;
141 
142 /* SIP name/version/transport value in Via */
143 typedef struct sip_proto_version_s {
144 	sip_str_t	name;
145 	sip_str_t	version;
146 	sip_str_t	transport;
147 }sip_proto_version_t;
148 
149 /* Via value */
150 typedef struct via_value {
151 	sip_proto_version_t 	sent_protocol;
152 	sip_str_t		sent_by_host;
153 	int			sent_by_port;
154 }sip_via_value_t;
155 
156 typedef struct sip_hdr_value {
157 	sip_value_t	sip_value;
158 	union {
159 		int			i;
160 		sip_str_t		str;
161 		sip_2strs_t		strs;
162 		sip_intstr_t		intstr;
163 		sip_warn_t		warn;
164 		sip_date_t		date;
165 		sip_auth_t		auth;
166 		sip_rack_t		rack;
167 		sip_cseq_value_t	cseq;
168 		sip_cftr_value_t	cftr;
169 		sip_via_value_t		via;
170 	} hdr_value;
171 } sip_hdr_value_t;
172 
173 /*
174  * NOTE: ALL value structs MUST have sip_value_t as the first field.
175  */
176 #define	sip_value_version	sip_value.sip_value_version
177 #define	sip_next_value		sip_value.next
178 #define	sip_param_list		sip_value.param_list
179 #define	sip_value_state 	sip_value.value_state
180 #define	sip_value_header 	sip_value.parsed_header
181 #define	sip_value_start		sip_value.value_start
182 #define	sip_value_end		sip_value.value_end
183 #define	sip_value_parsed_uri 	sip_value.sip_value_parse_uri
184 
185 #define	auth_val		hdr_value.auth
186 #define	auth_scheme_ptr		hdr_value.auth.scheme.sip_str_ptr
187 #define	auth_scheme_len		hdr_value.auth.scheme.sip_str_len
188 #define	auth_param		hdr_value.auth.param
189 #define	int_val			hdr_value.i
190 #define	str_val			hdr_value.str
191 #define	str_val_ptr		hdr_value.str.sip_str_ptr
192 #define	str_val_len		hdr_value.str.sip_str_len
193 #define	strs_val		hdr_value.strs
194 #define	strs_s1			hdr_value.strs.s1
195 #define	strs_s2			hdr_value.strs.s2
196 #define	strs1_val_ptr		hdr_value.strs.s1.sip_str_ptr
197 #define	strs1_val_len		hdr_value.strs.s1.sip_str_len
198 #define	strs2_val_ptr		hdr_value.strs.s2.sip_str_ptr
199 #define	strs2_val_len		hdr_value.strs.s2.sip_str_len
200 #define	intstr_val		hdr_value.intstr
201 #define	intstr_int		hdr_value.intstr.i
202 #define	intstr_str		hdr_value.intstr.s
203 #define	intstr_str_ptr		hdr_value.intstr.s.sip_str_ptr
204 #define	intstr_str_len		hdr_value.intstr.s.sip_str_len
205 #define	warn_code		hdr_value.warn.code
206 #define	warn_agt		hdr_value.warn.agt
207 #define	warn_text		hdr_value.warn.text
208 #define	warn_agt_ptr		warn_agt.sip_str_ptr
209 #define	warn_agt_len		warn_agt.sip_str_len
210 #define	warn_text_ptr		warn_text.sip_str_ptr
211 #define	warn_text_len		warn_text.sip_str_len
212 #define	date_t			hdr_value.date.t
213 #define	date_d			hdr_value.date.d
214 #define	date_m			hdr_value.date.m
215 #define	date_y			hdr_value.date.y
216 #define	date_tz			hdr_value.date.tz
217 #define	date_wd			hdr_value.date.wd
218 #define	date_t_ptr		date_t.sip_str_ptr
219 #define	date_t_len		date_t.sip_str_len
220 #define	date_m_ptr		date_m.sip_str_ptr
221 #define	date_m_len		date_m.sip_str_len
222 #define	date_tz_ptr		date_tz.sip_str_ptr
223 #define	date_tz_len		date_tz.sip_str_len
224 #define	date_wd_ptr		date_wd.sip_str_ptr
225 #define	date_wd_len		date_wd.sip_str_len
226 #define	rack_resp		hdr_value.rack.rack_resp_num
227 #define	rack_cseq		hdr_value.rack.rack_cseq_num
228 #define	rack_method		hdr_value.rack.rack_method
229 #define	cftr_name		hdr_value.cftr.display_name
230 #define	cftr_uri		hdr_value.cftr.uri
231 #define	cseq_num		hdr_value.cseq.num
232 #define	cseq_method		hdr_value.cseq.method
233 #define	via_protocol		hdr_value.via.sent_protocol
234 #define	via_protocol_name	hdr_value.via.sent_protocol.name
235 #define	via_protocol_vers	hdr_value.via.sent_protocol.version
236 #define	via_protocol_transport	hdr_value.via.sent_protocol.transport
237 #define	via_sent_by_host	hdr_value.via.sent_by_host
238 #define	via_sent_by_port	hdr_value.via.sent_by_port
239 
240 #define	SIP_INT_VAL		0x01
241 #define	SIP_STR_VAL		0x02
242 #define	SIP_STRS_VAL		0x03
243 #define	SIP_INTSTR_VAL		0x04
244 #define	SIP_AUTH_VAL		0x05
245 
246 /* hdr value contains two string */
247 typedef sip_hdr_value_t sip_acpt_value_t;
248 typedef sip_hdr_value_t sip_content_type_value_t;
249 
250 /* hdr value contains one string only */
251 typedef sip_hdr_value_t sip_acpt_lang_value_t;
252 typedef sip_hdr_value_t sip_acpt_encode_value_t;
253 typedef sip_hdr_value_t sip_alert_value_t;
254 typedef sip_hdr_value_t sip_cl_info_value_t;
255 typedef sip_hdr_value_t sip_ct_disp_value_t;
256 typedef sip_hdr_value_t sip_ct_encode_value_t;
257 typedef sip_hdr_value_t sip_ct_lang_value_t;
258 typedef sip_hdr_value_t sip_irt_value_t;
259 typedef sip_hdr_value_t sip_mime_ver_value_t;
260 typedef sip_hdr_value_t sip_org_value_t;
261 typedef sip_hdr_value_t sip_prio_value_t;
262 typedef sip_hdr_value_t sip_reply_value_t;
263 typedef sip_hdr_value_t sip_privacy_value_t;
264 typedef sip_hdr_value_t sip_ppassertedid_value_t;
265 typedef sip_hdr_value_t sip_ppreferredid_value_t;
266 typedef sip_hdr_value_t sip_pxy_req_value_t;
267 typedef sip_hdr_value_t sip_req_value_t;
268 typedef sip_hdr_value_t sip_subject_value_t;
269 typedef sip_hdr_value_t sip_svr_value_t;
270 typedef sip_hdr_value_t sip_support_value_t;
271 typedef sip_hdr_value_t sip_unsupport_value_t;
272 typedef sip_hdr_value_t sip_usr_agt_value_t;
273 typedef sip_hdr_value_t sip_err_info_value_t;
274 typedef sip_hdr_value_t sip_date_value_t;
275 typedef sip_hdr_value_t sip_allert_value_t;
276 typedef sip_hdr_value_t	sip_callid_value_t;
277 
278 /* hdr value contain one int only */
279 typedef sip_hdr_value_t sip_expr_value_t;
280 typedef sip_hdr_value_t sip_min_expr_value_t;
281 typedef sip_hdr_value_t sip_retry_value_t;
282 typedef sip_hdr_value_t sip_timestamp_value_t;
283 typedef sip_hdr_value_t sip_rseq_value_t;
284 typedef sip_hdr_value_t sip_content_len_value_t;
285 typedef sip_hdr_value_t sip_max_forwards_value_t;
286 typedef sip_hdr_value_t sip_allow_value_t;
287 
288 /* hdr value contain one int, two strings */
289 typedef sip_hdr_value_t sip_warn_value_t;
290 
291 /* hdr field value is a list of param=param_val */
292 typedef sip_hdr_value_t	sip_authen_value_t;
293 typedef sip_hdr_value_t	sip_authen_info_value_t;
294 typedef sip_hdr_value_t	sip_pxy_authen_value_t;
295 typedef sip_hdr_value_t	sip_pxy_author_value_t;
296 typedef sip_hdr_value_t	sip_3w_authen_value_t;
297 
298 /* SIP request line structure */
299 typedef struct sip_request {
300 	sip_method_t	sip_request_method;
301 	sip_str_t	sip_request_uri;
302 	sip_uri_t	sip_parse_uri;
303 } sip_request_t;
304 
305 /* SIP response line structure */
306 typedef struct sip_response {
307 	int		sip_response_code;
308 	sip_str_t	sip_response_phrase;
309 } sip_response_t;
310 
311 /* SIP message type - request or response */
312 typedef struct sip_message_type {
313 	boolean_t		is_request;
314 	sip_proto_version_t	sip_proto_version;
315 	union {
316 	sip_request_t		sip_request;
317 	sip_response_t		sip_response;
318 	} U;
319 	/* This is to save old value when we use a recvd message. */
320 	struct sip_message_type	*sip_next;
321 } sip_message_type_t;
322 
323 /* Increment reference count on SIP message */
324 #define	SIP_MSG_REFCNT_INCR(sip_msg) {				\
325 	(void) pthread_mutex_lock(&(sip_msg)->sip_msg_mutex);	\
326 	(sip_msg)->sip_msg_ref_cnt++;				\
327 	(void) pthread_mutex_unlock(&(sip_msg)->sip_msg_mutex);	\
328 }
329 
330 /* Decrement reference count on SIP message */
331 #define	SIP_MSG_REFCNT_DECR(sip_msg) {					\
332 	(void) pthread_mutex_lock(&(sip_msg)->sip_msg_mutex);		\
333 	assert((sip_msg)->sip_msg_ref_cnt > 0);				\
334 	if (--(sip_msg)->sip_msg_ref_cnt == 0) {			\
335 		sip_destroy_msg(sip_msg);				\
336 	} else {							\
337 		(void) pthread_mutex_unlock(&(sip_msg)->sip_msg_mutex);	\
338 	}								\
339 }
340 
341 /* SIP message structure */
342 typedef struct sip_message {
343 	char			*sip_msg_buf;	/* Message */
344 	char			*sip_msg_old_buf;
345 	boolean_t		sip_msg_modified;
346 	boolean_t		sip_msg_cannot_be_modified;
347 	int			sip_msg_len;
348 	size_t			sip_msg_content_len;	/* content length */
349 	sip_content_t		*sip_msg_content;
350 	/* All fields synchronizes on this */
351 	pthread_mutex_t		sip_msg_mutex;
352 	/* doubly linked list of headers */
353 	_sip_header_t		*sip_msg_headers_start;
354 	_sip_header_t		*sip_msg_headers_end;
355 	_sip_header_t		*sip_msg_start_line;
356 	sip_message_type_t	*sip_msg_req_res;
357 	int			sip_msg_ref_cnt;
358 }_sip_msg_t;
359 
360 extern char		*sip_get_tcp_msg(sip_conn_object_t, char *, size_t *);
361 extern char		*sip_msg_to_msgbuf(_sip_msg_t *msg, int *error);
362 extern char		*_sip_startline_to_str(_sip_msg_t *sip_msg, int *error);
363 extern int		sip_adjust_msgbuf(_sip_msg_t *msg);
364 extern void		sip_delete_all_headers(_sip_msg_t *sip_msg);
365 extern _sip_header_t	*sip_dup_header(_sip_header_t *from);
366 extern int		_sip_copy_header(_sip_msg_t *, _sip_header_t *, char *,
367 			    boolean_t);
368 extern int		_sip_find_and_copy_header(_sip_msg_t *, _sip_msg_t *,
369 			    char *, char *, boolean_t);
370 extern int		_sip_find_and_copy_all_header(_sip_msg_t *,
371 			    _sip_msg_t *, char *header_name);
372 extern _sip_header_t	*sip_search_for_header(_sip_msg_t *, char *,
373 			    _sip_header_t *);
374 extern void		_sip_add_header(_sip_msg_t *, _sip_header_t *,
375 			    boolean_t, boolean_t, char *);
376 extern _sip_header_t	*sip_new_header(int);
377 extern int		sip_create_nonOKack(sip_msg_t, sip_msg_t, sip_msg_t);
378 extern void		sip_destroy_msg(_sip_msg_t *);
379 extern void		sip_free_header(_sip_header_t *sip_header);
380 extern void		sip_free_phdr(sip_parsed_header_t *);
381 extern void		sip_free_cftr_header(sip_parsed_header_t *);
382 
383 extern int		sip_parse_allow_events_header(_sip_header_t *,
384 			    sip_parsed_header_t **);
385 extern int		sip_parse_event_header(_sip_header_t *,
386 			    sip_parsed_header_t **);
387 extern int		sip_parse_substate_header(_sip_header_t *,
388 			    sip_parsed_header_t **);
389 extern int		sip_parse_acpt_header(_sip_header_t *,
390 			    sip_parsed_header_t **);
391 extern int		sip_parse_acpt_encode_header(_sip_header_t *,
392 			    sip_parsed_header_t **);
393 extern int		sip_parse_acpt_lang_header(_sip_header_t *,
394 			    sip_parsed_header_t **);
395 extern int		sip_parse_alert_header(_sip_header_t *,
396 			    sip_parsed_header_t **);
397 extern int		sip_parse_allow_header(_sip_header_t *,
398 			    sip_parsed_header_t **);
399 extern int		sip_parse_useragt_header(_sip_header_t *,
400 			    sip_parsed_header_t **);
401 extern int		sip_parse_usupport_header(_sip_header_t *,
402 			    sip_parsed_header_t **);
403 extern int		sip_parse_timestamp_header(_sip_header_t *,
404 			    sip_parsed_header_t **);
405 extern int		sip_parse_support_header(_sip_header_t *,
406 			    sip_parsed_header_t **);
407 extern int		sip_parse_subject_header(_sip_header_t *,
408 			    sip_parsed_header_t **);
409 extern int		sip_parse_server_header(_sip_header_t *,
410 			    sip_parsed_header_t **);
411 extern int		sip_parse_retryaft_header(_sip_header_t *,
412 			    sip_parsed_header_t **);
413 extern int		sip_parse_require_header(_sip_header_t *,
414 			    sip_parsed_header_t **);
415 extern int		sip_parse_replyto_header(_sip_header_t *,
416 			    sip_parsed_header_t **);
417 extern int		sip_parse_passertedid_header(_sip_header_t *,
418 			    sip_parsed_header_t **);
419 extern int		sip_parse_ppreferredid_header(_sip_header_t *,
420 			    sip_parsed_header_t **);
421 extern int		sip_parse_priority_header(_sip_header_t *,
422 			    sip_parsed_header_t **);
423 extern int		sip_parse_org_header(_sip_header_t *,
424 			    sip_parsed_header_t **);
425 extern int		sip_parse_mimeversion_header(_sip_header_t *,
426 			    sip_parsed_header_t **);
427 extern int		sip_parse_minexpire_header(_sip_header_t *,
428 			    sip_parsed_header_t **);
429 extern int		sip_parse_rseq_header(_sip_header_t *,
430 			    sip_parsed_header_t **);
431 extern int		sip_parse_inreplyto_header(_sip_header_t *,
432 			    sip_parsed_header_t **);
433 extern int		sip_parse_privacy_header(_sip_header_t *,
434 			    sip_parsed_header_t **);
435 extern int		sip_parse_expire_header(_sip_header_t *,
436 			    sip_parsed_header_t **);
437 extern int		sip_parse_errorinfo_header(_sip_header_t *,
438 			    sip_parsed_header_t **);
439 extern int		sip_parse_contentlang_header(_sip_header_t *,
440 			    sip_parsed_header_t **);
441 extern int		sip_parse_contentencode_header(_sip_header_t *,
442 			    sip_parsed_header_t **);
443 extern int		sip_parse_contentdis_header(_sip_header_t *,
444 			    sip_parsed_header_t **);
445 extern int		sip_parse_callinfo_header(_sip_header_t *,
446 			    sip_parsed_header_t **);
447 extern int		sip_parse_date_header(_sip_header_t *,
448 			    sip_parsed_header_t **);
449 extern int		sip_parse_warn_header(_sip_header_t *,
450 			    sip_parsed_header_t **);
451 extern int		sip_parse_cftr_header(_sip_header_t *,
452 			    sip_parsed_header_t **);
453 extern int		sip_parse_cseq_header(_sip_header_t *,
454 			    sip_parsed_header_t **);
455 extern int		sip_parse_cid_header(_sip_header_t *,
456 			    sip_parsed_header_t **);
457 extern int		sip_parse_via_header(_sip_header_t *,
458 			    sip_parsed_header_t **);
459 extern int		sip_parse_clen_header(_sip_header_t *,
460 			    sip_parsed_header_t **);
461 extern int		sip_parse_maxf_header(_sip_header_t *,
462 			    sip_parsed_header_t **);
463 extern int		sip_parse_ctype_header(_sip_header_t *,
464 			    sip_parsed_header_t **);
465 extern int		sip_parse_unknown_header(_sip_header_t *,
466 			    sip_parsed_header_t **);
467 extern int		sip_parse_ainfo_header(_sip_header_t *,
468 			    sip_parsed_header_t **);
469 extern int		sip_parse_preq_header(_sip_header_t *,
470 			    sip_parsed_header_t **);
471 extern int		sip_parse_author_header(_sip_header_t *,
472 			    sip_parsed_header_t **);
473 extern int		sip_parse_pauthor_header(_sip_header_t *,
474 			    sip_parsed_header_t **);
475 extern int		sip_parse_pauthen_header(_sip_header_t *,
476 			    sip_parsed_header_t **);
477 extern int		sip_parse_wauthen_header(_sip_header_t *,
478 			    sip_parsed_header_t **);
479 extern int		sip_parse_rseq(_sip_header_t *, sip_parsed_header_t **);
480 extern int		sip_parse_rack(_sip_header_t *, sip_parsed_header_t **);
481 extern int		sip_parse_passertedid(_sip_header_t *,
482 			    sip_parsed_header_t **);
483 extern int		sip_parse_ppreferredid(_sip_header_t *,
484 			    sip_parsed_header_t **);
485 extern int		sip_parse_privacy_header(_sip_header_t *,
486 			    sip_parsed_header_t **);
487 
488 extern sip_param_t	*sip_get_param_from_list(sip_param_t *, char *);
489 extern int		sip_copy_values(char *, _sip_header_t *);
490 extern int		sip_add_content_length(_sip_msg_t *, int);
491 extern int		sip_delete_start_line_locked(_sip_msg_t *);
492 
493 /* Useful access macros */
494 #define	sip_resp_phrase_len	U.sip_response.sip_response_phrase.sip_str_len
495 #define	sip_resp_phrase_ptr	U.sip_response.sip_response_phrase.sip_str_ptr
496 
497 #define	sip_resp_code		U.sip_response.sip_response_code
498 #define	sip_resp_phrase		U.sip_response.sip_response_phrase
499 
500 #define	sip_req_method		U.sip_request.sip_request_method
501 #define	sip_req_uri		U.sip_request.sip_request_uri
502 #define	sip_req_uri_ptr		U.sip_request.sip_request_uri.sip_str_ptr
503 #define	sip_req_uri_len		U.sip_request.sip_request_uri.sip_str_ptr
504 #define	sip_req_parse_uri	U.sip_request.sip_parse_uri
505 
506 #define	sip_header_parse	sip_header_functions->header_parse_func
507 #define	sip_header_name		sip_header_functions->header_name
508 
509 #define	sip_hdr_start		sip_hdr_general.sip_hdr_start
510 #define	sip_hdr_end		sip_hdr_general.sip_hdr_end
511 #define	sip_hdr_current		sip_hdr_general.sip_hdr_current
512 #define	sip_hdr_parsed		sip_hdr_general.sip_hdr_parsed
513 
514 #ifdef	__cplusplus
515 }
516 #endif
517 
518 #endif	/* _SIP_MSG_H */
519