xref: /onnv-gate/usr/src/lib/libsip/common/sip_msg.h (revision 3439:0302bfe973fe)
12882Svi117747 /*
22882Svi117747  * CDDL HEADER START
32882Svi117747  *
42882Svi117747  * The contents of this file are subject to the terms of the
52882Svi117747  * Common Development and Distribution License (the "License").
62882Svi117747  * You may not use this file except in compliance with the License.
72882Svi117747  *
82882Svi117747  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
92882Svi117747  * or http://www.opensolaris.org/os/licensing.
102882Svi117747  * See the License for the specific language governing permissions
112882Svi117747  * and limitations under the License.
122882Svi117747  *
132882Svi117747  * When distributing Covered Code, include this CDDL HEADER in each
142882Svi117747  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
152882Svi117747  * If applicable, add the following below this CDDL HEADER, with the
162882Svi117747  * fields enclosed by brackets "[]" replaced with your own identifying
172882Svi117747  * information: Portions Copyright [yyyy] [name of copyright owner]
182882Svi117747  *
192882Svi117747  * CDDL HEADER END
202882Svi117747  */
212882Svi117747 
222882Svi117747 /*
23*3439Svi117747  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
242882Svi117747  * Use is subject to license terms.
252882Svi117747  */
262882Svi117747 
272882Svi117747 #ifndef	_SIP_MSG_H
282882Svi117747 #define	_SIP_MSG_H
292882Svi117747 
302882Svi117747 #pragma ident	"%Z%%M%	%I%	%E% SMI"
312882Svi117747 
322882Svi117747 #ifdef	__cplusplus
332882Svi117747 extern "C" {
342882Svi117747 #endif
352882Svi117747 
36*3439Svi117747 #include <pthread.h>
372882Svi117747 #include <sip.h>
38*3439Svi117747 #include <sys/types.h>
392882Svi117747 
402882Svi117747 #ifdef	__solaris__
412882Svi117747 extern int mutex_held();
422882Svi117747 #endif
432882Svi117747 
442882Svi117747 extern sip_header_function_t *sip_header_function_table_external;
452882Svi117747 
462882Svi117747 /* Compare Cseq numbers */
472882Svi117747 #define	SIP_CSEQ_LT(a, b)	((int32_t)((a)-(b)) < 0)
482882Svi117747 #define	SIP_CSEQ_GT(a, b)	((int32_t)((a)-(b)) > 0)
492882Svi117747 #define	SIP_CSEQ_GEQ(a, b)	((int32_t)((a)-(b)) >= 0)
502882Svi117747 
512882Svi117747 #define	SIP_HEADER_ACTIVE	0x0
522882Svi117747 #define	SIP_HEADER_DELETED	0x1
532882Svi117747 #define	SIP_HEADER_DELETED_VAL	0x2
542882Svi117747 
552882Svi117747 /* List of registered sent-by values */
562882Svi117747 typedef struct sent_by_list_s {
572882Svi117747 	struct sent_by_list_s	*sb_next;
582882Svi117747 	struct sent_by_list_s	*sb_prev;
592882Svi117747 	char			*sb_val;
602882Svi117747 } sent_by_list_t;
612882Svi117747 
622882Svi117747 extern sent_by_list_t	*sip_sent_by;
632882Svi117747 extern int		sip_sent_by_count;
642882Svi117747 extern pthread_mutex_t	sip_sent_by_lock;
652882Svi117747 
662882Svi117747 typedef struct sip_header {
672882Svi117747 	sip_hdr_general_t	sip_hdr_general;
682882Svi117747 	/* active/deleted or has deleted val */
692882Svi117747 	int			sip_header_state;
702882Svi117747 	struct sip_header	*sip_hdr_next;
712882Svi117747 	struct sip_header	*sip_hdr_prev;
722882Svi117747 	struct sip_message	*sip_hdr_sipmsg;
732882Svi117747 	/* True if header was allocated */
742882Svi117747 	boolean_t		sip_hdr_allocated;
752882Svi117747 	sip_header_function_t	*sip_header_functions;
762882Svi117747 }_sip_header_t;
772882Svi117747 
782882Svi117747 /* Structure for the SIP message body */
792882Svi117747 typedef struct sip_content {
802882Svi117747 	char			*sip_content_start;
812882Svi117747 	char			*sip_content_end;
822882Svi117747 	char			*sip_content_current;
832882Svi117747 	struct sip_content	*sip_content_next;
842882Svi117747 	boolean_t		sip_content_allocated;
852882Svi117747 }sip_content_t;
862882Svi117747 
872882Svi117747 
882882Svi117747 /* General definitions */
892882Svi117747 
902882Svi117747 /* Two string values */
912882Svi117747 typedef struct sip_2strs {
922882Svi117747 	sip_str_t	s1;
932882Svi117747 	sip_str_t	s2;
942882Svi117747 }sip_2strs_t;
952882Svi117747 
962882Svi117747 /* An integer and a string value */
972882Svi117747 typedef struct sip_intstr {
982882Svi117747 	int		i;
992882Svi117747 	sip_str_t	s;
1002882Svi117747 } sip_intstr_t;
1012882Svi117747 
1022882Svi117747 /* Warn value */
1032882Svi117747 typedef struct sip_warn {
1042882Svi117747 	int		code;
1052882Svi117747 	sip_str_t	agt;
1062882Svi117747 	sip_str_t	text;
1072882Svi117747 } sip_warn_t;
1082882Svi117747 
1092882Svi117747 /* Date value */
1102882Svi117747 typedef struct sip_date {
1112882Svi117747 	sip_str_t	t;
1122882Svi117747 	int		d;
1132882Svi117747 	sip_str_t	m;
1142882Svi117747 	int		y;
1152882Svi117747 	sip_str_t	tz;
1162882Svi117747 	sip_str_t	wd;
1172882Svi117747 } sip_date_t;
1182882Svi117747 
1192882Svi117747 /* Authorization and authentication value */
1202882Svi117747 typedef struct sip_auth {
1212882Svi117747 	sip_str_t	scheme;
1222882Svi117747 	sip_param_t	*param;
1232882Svi117747 } sip_auth_t;
1242882Svi117747 
1252882Svi117747 /* RACK value */
1262882Svi117747 typedef struct sip_rack {
1272882Svi117747 	int		rack_resp_num;
1282882Svi117747 	int		rack_cseq_num;
1292882Svi117747 	sip_method_t	rack_method;
1302882Svi117747 }sip_rack_t;
1312882Svi117747 
1322882Svi117747 /* Cseq value */
1332882Svi117747 typedef struct sip_cseq {
1342882Svi117747 	int		num;
1352882Svi117747 	sip_method_t	method;
1362882Svi117747 } sip_cseq_value_t;
1372882Svi117747 
1382882Svi117747 /* Value for Contact, From and To header */
1392882Svi117747 typedef struct cftr_value {
1402882Svi117747 	sip_str_t	*display_name;
1412882Svi117747 	sip_str_t	uri;
1422882Svi117747 } sip_cftr_value_t;
1432882Svi117747 
1442882Svi117747 /* SIP name/version/transport value in Via */
1452882Svi117747 typedef struct sip_proto_version_s {
1462882Svi117747 	sip_str_t	name;
1472882Svi117747 	sip_str_t	version;
1482882Svi117747 	sip_str_t	transport;
1492882Svi117747 }sip_proto_version_t;
1502882Svi117747 
1512882Svi117747 /* Via value */
1522882Svi117747 typedef struct via_value {
1532882Svi117747 	sip_proto_version_t 	sent_protocol;
1542882Svi117747 	sip_str_t		sent_by_host;
1552882Svi117747 	int			sent_by_port;
1562882Svi117747 }sip_via_value_t;
1572882Svi117747 
1582882Svi117747 typedef struct sip_hdr_value {
1592882Svi117747 	sip_value_t	sip_value;
1602882Svi117747 	union {
1612882Svi117747 		int			i;
1622882Svi117747 		sip_str_t		str;
1632882Svi117747 		sip_2strs_t		strs;
1642882Svi117747 		sip_intstr_t		intstr;
1652882Svi117747 		sip_warn_t		warn;
1662882Svi117747 		sip_date_t		date;
1672882Svi117747 		sip_auth_t		auth;
1682882Svi117747 		sip_rack_t		rack;
1692882Svi117747 		sip_cseq_value_t	cseq;
1702882Svi117747 		sip_cftr_value_t	cftr;
1712882Svi117747 		sip_via_value_t		via;
1722882Svi117747 	} hdr_value;
1732882Svi117747 } sip_hdr_value_t;
1742882Svi117747 
1752882Svi117747 /*
1762882Svi117747  * NOTE: ALL value structs MUST have sip_value_t as the first field.
1772882Svi117747  */
1782882Svi117747 #define	sip_value_version	sip_value.sip_value_version
1792882Svi117747 #define	sip_next_value		sip_value.next
1802882Svi117747 #define	sip_param_list		sip_value.param_list
1812882Svi117747 #define	sip_value_state 	sip_value.value_state
1822882Svi117747 #define	sip_value_header 	sip_value.parsed_header
1832882Svi117747 #define	sip_value_start		sip_value.value_start
1842882Svi117747 #define	sip_value_end		sip_value.value_end
1852882Svi117747 #define	sip_value_parsed_uri 	sip_value.sip_value_parse_uri
1862882Svi117747 
1872882Svi117747 #define	auth_val		hdr_value.auth
1882882Svi117747 #define	auth_scheme_ptr		hdr_value.auth.scheme.sip_str_ptr
1892882Svi117747 #define	auth_scheme_len		hdr_value.auth.scheme.sip_str_len
1902882Svi117747 #define	auth_param		hdr_value.auth.param
1912882Svi117747 #define	int_val			hdr_value.i
1922882Svi117747 #define	str_val			hdr_value.str
1932882Svi117747 #define	str_val_ptr		hdr_value.str.sip_str_ptr
1942882Svi117747 #define	str_val_len		hdr_value.str.sip_str_len
1952882Svi117747 #define	strs_val		hdr_value.strs
1962882Svi117747 #define	strs_s1			hdr_value.strs.s1
1972882Svi117747 #define	strs_s2			hdr_value.strs.s2
1982882Svi117747 #define	strs1_val_ptr		hdr_value.strs.s1.sip_str_ptr
1992882Svi117747 #define	strs1_val_len		hdr_value.strs.s1.sip_str_len
2002882Svi117747 #define	strs2_val_ptr		hdr_value.strs.s2.sip_str_ptr
2012882Svi117747 #define	strs2_val_len		hdr_value.strs.s2.sip_str_len
2022882Svi117747 #define	intstr_val		hdr_value.intstr
2032882Svi117747 #define	intstr_int		hdr_value.intstr.i
2042882Svi117747 #define	intstr_str		hdr_value.intstr.s
2052882Svi117747 #define	intstr_str_ptr		hdr_value.intstr.s.sip_str_ptr
2062882Svi117747 #define	intstr_str_len		hdr_value.intstr.s.sip_str_len
2072882Svi117747 #define	warn_code		hdr_value.warn.code
2082882Svi117747 #define	warn_agt		hdr_value.warn.agt
2092882Svi117747 #define	warn_text		hdr_value.warn.text
2102882Svi117747 #define	warn_agt_ptr		warn_agt.sip_str_ptr
2112882Svi117747 #define	warn_agt_len		warn_agt.sip_str_len
2122882Svi117747 #define	warn_text_ptr		warn_text.sip_str_ptr
2132882Svi117747 #define	warn_text_len		warn_text.sip_str_len
2142882Svi117747 #define	date_t			hdr_value.date.t
2152882Svi117747 #define	date_d			hdr_value.date.d
2162882Svi117747 #define	date_m			hdr_value.date.m
2172882Svi117747 #define	date_y			hdr_value.date.y
2182882Svi117747 #define	date_tz			hdr_value.date.tz
2192882Svi117747 #define	date_wd			hdr_value.date.wd
2202882Svi117747 #define	date_t_ptr		date_t.sip_str_ptr
2212882Svi117747 #define	date_t_len		date_t.sip_str_len
2222882Svi117747 #define	date_m_ptr		date_m.sip_str_ptr
2232882Svi117747 #define	date_m_len		date_m.sip_str_len
2242882Svi117747 #define	date_tz_ptr		date_tz.sip_str_ptr
2252882Svi117747 #define	date_tz_len		date_tz.sip_str_len
2262882Svi117747 #define	date_wd_ptr		date_wd.sip_str_ptr
2272882Svi117747 #define	date_wd_len		date_wd.sip_str_len
2282882Svi117747 #define	rack_resp		hdr_value.rack.rack_resp_num
2292882Svi117747 #define	rack_cseq		hdr_value.rack.rack_cseq_num
2302882Svi117747 #define	rack_method		hdr_value.rack.rack_method
2312882Svi117747 #define	cftr_name		hdr_value.cftr.display_name
2322882Svi117747 #define	cftr_uri		hdr_value.cftr.uri
2332882Svi117747 #define	cseq_num		hdr_value.cseq.num
2342882Svi117747 #define	cseq_method		hdr_value.cseq.method
2352882Svi117747 #define	via_protocol		hdr_value.via.sent_protocol
2362882Svi117747 #define	via_protocol_name	hdr_value.via.sent_protocol.name
2372882Svi117747 #define	via_protocol_vers	hdr_value.via.sent_protocol.version
2382882Svi117747 #define	via_protocol_transport	hdr_value.via.sent_protocol.transport
2392882Svi117747 #define	via_sent_by_host	hdr_value.via.sent_by_host
2402882Svi117747 #define	via_sent_by_port	hdr_value.via.sent_by_port
2412882Svi117747 
2422882Svi117747 #define	SIP_INT_VAL		0x01
2432882Svi117747 #define	SIP_STR_VAL		0x02
2442882Svi117747 #define	SIP_STRS_VAL		0x03
2452882Svi117747 #define	SIP_INTSTR_VAL		0x04
2462882Svi117747 #define	SIP_AUTH_VAL		0x05
2472882Svi117747 
2482882Svi117747 /* hdr value contains two string */
2492882Svi117747 typedef sip_hdr_value_t sip_acpt_value_t;
2502882Svi117747 typedef sip_hdr_value_t sip_content_type_value_t;
2512882Svi117747 
2522882Svi117747 /* hdr value contains one string only */
2532882Svi117747 typedef sip_hdr_value_t sip_acpt_lang_value_t;
2542882Svi117747 typedef sip_hdr_value_t sip_acpt_encode_value_t;
2552882Svi117747 typedef sip_hdr_value_t sip_alert_value_t;
2562882Svi117747 typedef sip_hdr_value_t sip_cl_info_value_t;
2572882Svi117747 typedef sip_hdr_value_t sip_ct_disp_value_t;
2582882Svi117747 typedef sip_hdr_value_t sip_ct_encode_value_t;
2592882Svi117747 typedef sip_hdr_value_t sip_ct_lang_value_t;
2602882Svi117747 typedef sip_hdr_value_t sip_irt_value_t;
2612882Svi117747 typedef sip_hdr_value_t sip_mime_ver_value_t;
2622882Svi117747 typedef sip_hdr_value_t sip_org_value_t;
2632882Svi117747 typedef sip_hdr_value_t sip_prio_value_t;
2642882Svi117747 typedef sip_hdr_value_t sip_reply_value_t;
2652882Svi117747 typedef sip_hdr_value_t sip_privacy_value_t;
2662882Svi117747 typedef sip_hdr_value_t sip_ppassertedid_value_t;
2672882Svi117747 typedef sip_hdr_value_t sip_ppreferredid_value_t;
2682882Svi117747 typedef sip_hdr_value_t sip_pxy_req_value_t;
2692882Svi117747 typedef sip_hdr_value_t sip_req_value_t;
2702882Svi117747 typedef sip_hdr_value_t sip_subject_value_t;
2712882Svi117747 typedef sip_hdr_value_t sip_svr_value_t;
2722882Svi117747 typedef sip_hdr_value_t sip_support_value_t;
2732882Svi117747 typedef sip_hdr_value_t sip_unsupport_value_t;
2742882Svi117747 typedef sip_hdr_value_t sip_usr_agt_value_t;
2752882Svi117747 typedef sip_hdr_value_t sip_err_info_value_t;
2762882Svi117747 typedef sip_hdr_value_t sip_date_value_t;
2772882Svi117747 typedef sip_hdr_value_t sip_allert_value_t;
2782882Svi117747 typedef sip_hdr_value_t	sip_callid_value_t;
2792882Svi117747 
2802882Svi117747 /* hdr value contain one int only */
2812882Svi117747 typedef sip_hdr_value_t sip_expr_value_t;
2822882Svi117747 typedef sip_hdr_value_t sip_min_expr_value_t;
2832882Svi117747 typedef sip_hdr_value_t sip_retry_value_t;
2842882Svi117747 typedef sip_hdr_value_t sip_timestamp_value_t;
2852882Svi117747 typedef sip_hdr_value_t sip_rseq_value_t;
2862882Svi117747 typedef sip_hdr_value_t sip_content_len_value_t;
2872882Svi117747 typedef sip_hdr_value_t sip_max_forwards_value_t;
2882882Svi117747 typedef sip_hdr_value_t sip_allow_value_t;
2892882Svi117747 
2902882Svi117747 /* hdr value contain one int, two strings */
2912882Svi117747 typedef sip_hdr_value_t sip_warn_value_t;
2922882Svi117747 
2932882Svi117747 /* hdr field value is a list of param=param_val */
2942882Svi117747 typedef sip_hdr_value_t	sip_authen_value_t;
2952882Svi117747 typedef sip_hdr_value_t	sip_authen_info_value_t;
2962882Svi117747 typedef sip_hdr_value_t	sip_pxy_authen_value_t;
2972882Svi117747 typedef sip_hdr_value_t	sip_pxy_author_value_t;
2982882Svi117747 typedef sip_hdr_value_t	sip_3w_authen_value_t;
2992882Svi117747 
3002882Svi117747 /* SIP request line structure */
3012882Svi117747 typedef struct sip_request {
3022882Svi117747 	sip_method_t	sip_request_method;
3032882Svi117747 	sip_str_t	sip_request_uri;
3042882Svi117747 	sip_uri_t	sip_parse_uri;
3052882Svi117747 } sip_request_t;
3062882Svi117747 
3072882Svi117747 /* SIP response line structure */
3082882Svi117747 typedef struct sip_response {
3092882Svi117747 	int		sip_response_code;
3102882Svi117747 	sip_str_t	sip_response_phrase;
3112882Svi117747 } sip_response_t;
3122882Svi117747 
3132882Svi117747 /* SIP message type - request or response */
3142882Svi117747 typedef struct sip_message_type {
3152882Svi117747 	boolean_t		is_request;
3162882Svi117747 	sip_proto_version_t	sip_proto_version;
3172882Svi117747 	union {
3182882Svi117747 	sip_request_t		sip_request;
3192882Svi117747 	sip_response_t		sip_response;
3202882Svi117747 	} U;
3212882Svi117747 	/* This is to save old value when we use a recvd message. */
3222882Svi117747 	struct sip_message_type	*sip_next;
3232882Svi117747 } sip_message_type_t;
3242882Svi117747 
3252882Svi117747 /* Increment reference count on SIP message */
3262882Svi117747 #define	SIP_MSG_REFCNT_INCR(sip_msg) {				\
3272882Svi117747 	(void) pthread_mutex_lock(&(sip_msg)->sip_msg_mutex);	\
3282882Svi117747 	(sip_msg)->sip_msg_ref_cnt++;				\
3292882Svi117747 	(void) pthread_mutex_unlock(&(sip_msg)->sip_msg_mutex);	\
3302882Svi117747 }
3312882Svi117747 
3322882Svi117747 /* Decrement reference count on SIP message */
3332882Svi117747 #define	SIP_MSG_REFCNT_DECR(sip_msg) {					\
3342882Svi117747 	(void) pthread_mutex_lock(&(sip_msg)->sip_msg_mutex);		\
3352882Svi117747 	assert((sip_msg)->sip_msg_ref_cnt > 0);				\
3362882Svi117747 	if (--(sip_msg)->sip_msg_ref_cnt == 0) {			\
3372882Svi117747 		sip_destroy_msg(sip_msg);				\
3382882Svi117747 	} else {							\
3392882Svi117747 		(void) pthread_mutex_unlock(&(sip_msg)->sip_msg_mutex);	\
3402882Svi117747 	}								\
3412882Svi117747 }
3422882Svi117747 
3432882Svi117747 /* SIP message structure */
3442882Svi117747 typedef struct sip_message {
3452882Svi117747 	char			*sip_msg_buf;	/* Message */
3462882Svi117747 	char			*sip_msg_old_buf;
3472882Svi117747 	boolean_t		sip_msg_modified;
3482882Svi117747 	boolean_t		sip_msg_cannot_be_modified;
3492882Svi117747 	int			sip_msg_len;
3502882Svi117747 	size_t			sip_msg_content_len;	/* content length */
3512882Svi117747 	sip_content_t		*sip_msg_content;
3522882Svi117747 	/* All fields synchronizes on this */
3532882Svi117747 	pthread_mutex_t		sip_msg_mutex;
3542882Svi117747 	/* doubly linked list of headers */
3552882Svi117747 	_sip_header_t		*sip_msg_headers_start;
3562882Svi117747 	_sip_header_t		*sip_msg_headers_end;
3572882Svi117747 	_sip_header_t		*sip_msg_start_line;
3582882Svi117747 	sip_message_type_t	*sip_msg_req_res;
3592882Svi117747 	int			sip_msg_ref_cnt;
3602882Svi117747 }_sip_msg_t;
3612882Svi117747 
3622882Svi117747 extern char		*sip_get_tcp_msg(sip_conn_object_t, char *, size_t *);
3632882Svi117747 extern char		*sip_msg_to_msgbuf(_sip_msg_t *msg, int *error);
3642882Svi117747 extern char		*_sip_startline_to_str(_sip_msg_t *sip_msg, int *error);
3652882Svi117747 extern int		sip_adjust_msgbuf(_sip_msg_t *msg);
3662882Svi117747 extern void		sip_delete_all_headers(_sip_msg_t *sip_msg);
3672882Svi117747 extern _sip_header_t	*sip_dup_header(_sip_header_t *from);
3682882Svi117747 extern int		_sip_copy_header(_sip_msg_t *, _sip_header_t *, char *,
3692882Svi117747 			    boolean_t);
3702882Svi117747 extern int		_sip_find_and_copy_header(_sip_msg_t *, _sip_msg_t *,
3712882Svi117747 			    char *, char *, boolean_t);
3722882Svi117747 extern int		_sip_find_and_copy_all_header(_sip_msg_t *,
3732882Svi117747 			    _sip_msg_t *, char *header_name);
3742882Svi117747 extern _sip_header_t	*sip_search_for_header(_sip_msg_t *, char *,
3752882Svi117747 			    _sip_header_t *);
3762882Svi117747 extern void		_sip_add_header(_sip_msg_t *, _sip_header_t *,
3772882Svi117747 			    boolean_t, boolean_t, char *);
3782882Svi117747 extern _sip_header_t	*sip_new_header(int);
3792882Svi117747 extern int		sip_create_nonOKack(sip_msg_t, sip_msg_t, sip_msg_t);
3802882Svi117747 extern void		sip_destroy_msg(_sip_msg_t *);
3812882Svi117747 extern void		sip_free_header(_sip_header_t *sip_header);
3822882Svi117747 extern void		sip_free_phdr(sip_parsed_header_t *);
3832882Svi117747 extern void		sip_free_cftr_header(sip_parsed_header_t *);
3842882Svi117747 
3852882Svi117747 extern int		sip_parse_allow_events_header(_sip_header_t *,
3862882Svi117747 			    sip_parsed_header_t **);
3872882Svi117747 extern int		sip_parse_event_header(_sip_header_t *,
3882882Svi117747 			    sip_parsed_header_t **);
3892882Svi117747 extern int		sip_parse_substate_header(_sip_header_t *,
3902882Svi117747 			    sip_parsed_header_t **);
3912882Svi117747 extern int		sip_parse_acpt_header(_sip_header_t *,
3922882Svi117747 			    sip_parsed_header_t **);
3932882Svi117747 extern int		sip_parse_acpt_encode_header(_sip_header_t *,
3942882Svi117747 			    sip_parsed_header_t **);
3952882Svi117747 extern int		sip_parse_acpt_lang_header(_sip_header_t *,
3962882Svi117747 			    sip_parsed_header_t **);
3972882Svi117747 extern int		sip_parse_alert_header(_sip_header_t *,
3982882Svi117747 			    sip_parsed_header_t **);
3992882Svi117747 extern int		sip_parse_allow_header(_sip_header_t *,
4002882Svi117747 			    sip_parsed_header_t **);
4012882Svi117747 extern int		sip_parse_useragt_header(_sip_header_t *,
4022882Svi117747 			    sip_parsed_header_t **);
4032882Svi117747 extern int		sip_parse_usupport_header(_sip_header_t *,
4042882Svi117747 			    sip_parsed_header_t **);
4052882Svi117747 extern int		sip_parse_timestamp_header(_sip_header_t *,
4062882Svi117747 			    sip_parsed_header_t **);
4072882Svi117747 extern int		sip_parse_support_header(_sip_header_t *,
4082882Svi117747 			    sip_parsed_header_t **);
4092882Svi117747 extern int		sip_parse_subject_header(_sip_header_t *,
4102882Svi117747 			    sip_parsed_header_t **);
4112882Svi117747 extern int		sip_parse_server_header(_sip_header_t *,
4122882Svi117747 			    sip_parsed_header_t **);
4132882Svi117747 extern int		sip_parse_retryaft_header(_sip_header_t *,
4142882Svi117747 			    sip_parsed_header_t **);
4152882Svi117747 extern int		sip_parse_require_header(_sip_header_t *,
4162882Svi117747 			    sip_parsed_header_t **);
4172882Svi117747 extern int		sip_parse_replyto_header(_sip_header_t *,
4182882Svi117747 			    sip_parsed_header_t **);
4192882Svi117747 extern int		sip_parse_passertedid_header(_sip_header_t *,
4202882Svi117747 			    sip_parsed_header_t **);
4212882Svi117747 extern int		sip_parse_ppreferredid_header(_sip_header_t *,
4222882Svi117747 			    sip_parsed_header_t **);
4232882Svi117747 extern int		sip_parse_priority_header(_sip_header_t *,
4242882Svi117747 			    sip_parsed_header_t **);
4252882Svi117747 extern int		sip_parse_org_header(_sip_header_t *,
4262882Svi117747 			    sip_parsed_header_t **);
4272882Svi117747 extern int		sip_parse_mimeversion_header(_sip_header_t *,
4282882Svi117747 			    sip_parsed_header_t **);
4292882Svi117747 extern int		sip_parse_minexpire_header(_sip_header_t *,
4302882Svi117747 			    sip_parsed_header_t **);
4312882Svi117747 extern int		sip_parse_rseq_header(_sip_header_t *,
4322882Svi117747 			    sip_parsed_header_t **);
4332882Svi117747 extern int		sip_parse_inreplyto_header(_sip_header_t *,
4342882Svi117747 			    sip_parsed_header_t **);
4352882Svi117747 extern int		sip_parse_privacy_header(_sip_header_t *,
4362882Svi117747 			    sip_parsed_header_t **);
4372882Svi117747 extern int		sip_parse_expire_header(_sip_header_t *,
4382882Svi117747 			    sip_parsed_header_t **);
4392882Svi117747 extern int		sip_parse_errorinfo_header(_sip_header_t *,
4402882Svi117747 			    sip_parsed_header_t **);
4412882Svi117747 extern int		sip_parse_contentlang_header(_sip_header_t *,
4422882Svi117747 			    sip_parsed_header_t **);
4432882Svi117747 extern int		sip_parse_contentencode_header(_sip_header_t *,
4442882Svi117747 			    sip_parsed_header_t **);
4452882Svi117747 extern int		sip_parse_contentdis_header(_sip_header_t *,
4462882Svi117747 			    sip_parsed_header_t **);
4472882Svi117747 extern int		sip_parse_callinfo_header(_sip_header_t *,
4482882Svi117747 			    sip_parsed_header_t **);
4492882Svi117747 extern int		sip_parse_date_header(_sip_header_t *,
4502882Svi117747 			    sip_parsed_header_t **);
4512882Svi117747 extern int		sip_parse_warn_header(_sip_header_t *,
4522882Svi117747 			    sip_parsed_header_t **);
4532882Svi117747 extern int		sip_parse_cftr_header(_sip_header_t *,
4542882Svi117747 			    sip_parsed_header_t **);
4552882Svi117747 extern int		sip_parse_cseq_header(_sip_header_t *,
4562882Svi117747 			    sip_parsed_header_t **);
4572882Svi117747 extern int		sip_parse_cid_header(_sip_header_t *,
4582882Svi117747 			    sip_parsed_header_t **);
4592882Svi117747 extern int		sip_parse_via_header(_sip_header_t *,
4602882Svi117747 			    sip_parsed_header_t **);
4612882Svi117747 extern int		sip_parse_clen_header(_sip_header_t *,
4622882Svi117747 			    sip_parsed_header_t **);
4632882Svi117747 extern int		sip_parse_maxf_header(_sip_header_t *,
4642882Svi117747 			    sip_parsed_header_t **);
4652882Svi117747 extern int		sip_parse_ctype_header(_sip_header_t *,
4662882Svi117747 			    sip_parsed_header_t **);
4672882Svi117747 extern int		sip_parse_unknown_header(_sip_header_t *,
4682882Svi117747 			    sip_parsed_header_t **);
4692882Svi117747 extern int		sip_parse_ainfo_header(_sip_header_t *,
4702882Svi117747 			    sip_parsed_header_t **);
4712882Svi117747 extern int		sip_parse_preq_header(_sip_header_t *,
4722882Svi117747 			    sip_parsed_header_t **);
4732882Svi117747 extern int		sip_parse_author_header(_sip_header_t *,
4742882Svi117747 			    sip_parsed_header_t **);
4752882Svi117747 extern int		sip_parse_pauthor_header(_sip_header_t *,
4762882Svi117747 			    sip_parsed_header_t **);
4772882Svi117747 extern int		sip_parse_pauthen_header(_sip_header_t *,
4782882Svi117747 			    sip_parsed_header_t **);
4792882Svi117747 extern int		sip_parse_wauthen_header(_sip_header_t *,
4802882Svi117747 			    sip_parsed_header_t **);
4812882Svi117747 extern int		sip_parse_rseq(_sip_header_t *, sip_parsed_header_t **);
4822882Svi117747 extern int		sip_parse_rack(_sip_header_t *, sip_parsed_header_t **);
4832882Svi117747 extern int		sip_parse_passertedid(_sip_header_t *,
4842882Svi117747 			    sip_parsed_header_t **);
4852882Svi117747 extern int		sip_parse_ppreferredid(_sip_header_t *,
4862882Svi117747 			    sip_parsed_header_t **);
4872882Svi117747 extern int		sip_parse_privacy_header(_sip_header_t *,
4882882Svi117747 			    sip_parsed_header_t **);
4892882Svi117747 
4902882Svi117747 extern sip_param_t	*sip_get_param_from_list(sip_param_t *, char *);
4912882Svi117747 extern int		sip_copy_values(char *, _sip_header_t *);
4922882Svi117747 extern int		sip_add_content_length(_sip_msg_t *, int);
4932882Svi117747 extern int		sip_delete_start_line_locked(_sip_msg_t *);
4942882Svi117747 
4952882Svi117747 /* Useful access macros */
4962882Svi117747 #define	sip_resp_phrase_len	U.sip_response.sip_response_phrase.sip_str_len
4972882Svi117747 #define	sip_resp_phrase_ptr	U.sip_response.sip_response_phrase.sip_str_ptr
4982882Svi117747 
4992882Svi117747 #define	sip_resp_code		U.sip_response.sip_response_code
5002882Svi117747 #define	sip_resp_phrase		U.sip_response.sip_response_phrase
5012882Svi117747 
5022882Svi117747 #define	sip_req_method		U.sip_request.sip_request_method
5032882Svi117747 #define	sip_req_uri		U.sip_request.sip_request_uri
5042882Svi117747 #define	sip_req_uri_ptr		U.sip_request.sip_request_uri.sip_str_ptr
5052882Svi117747 #define	sip_req_uri_len		U.sip_request.sip_request_uri.sip_str_ptr
5062882Svi117747 #define	sip_req_parse_uri	U.sip_request.sip_parse_uri
5072882Svi117747 
5082882Svi117747 #define	sip_header_parse	sip_header_functions->header_parse_func
5092882Svi117747 #define	sip_header_name		sip_header_functions->header_name
5102882Svi117747 
5112882Svi117747 #define	sip_hdr_start		sip_hdr_general.sip_hdr_start
5122882Svi117747 #define	sip_hdr_end		sip_hdr_general.sip_hdr_end
5132882Svi117747 #define	sip_hdr_current		sip_hdr_general.sip_hdr_current
5142882Svi117747 #define	sip_hdr_parsed		sip_hdr_general.sip_hdr_parsed
5152882Svi117747 
5162882Svi117747 #ifdef	__cplusplus
5172882Svi117747 }
5182882Svi117747 #endif
5192882Svi117747 
5202882Svi117747 #endif	/* _SIP_MSG_H */
521