xref: /illumos-gate/usr/src/lib/libsip/common/sip.h (revision 40cb5e5daa7b80bb70fcf8dadfb20f9281566331)
1*40cb5e5dSvi /*
2*40cb5e5dSvi  * CDDL HEADER START
3*40cb5e5dSvi  *
4*40cb5e5dSvi  * The contents of this file are subject to the terms of the
5*40cb5e5dSvi  * Common Development and Distribution License (the "License").
6*40cb5e5dSvi  * You may not use this file except in compliance with the License.
7*40cb5e5dSvi  *
8*40cb5e5dSvi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*40cb5e5dSvi  * or http://www.opensolaris.org/os/licensing.
10*40cb5e5dSvi  * See the License for the specific language governing permissions
11*40cb5e5dSvi  * and limitations under the License.
12*40cb5e5dSvi  *
13*40cb5e5dSvi  * When distributing Covered Code, include this CDDL HEADER in each
14*40cb5e5dSvi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*40cb5e5dSvi  * If applicable, add the following below this CDDL HEADER, with the
16*40cb5e5dSvi  * fields enclosed by brackets "[]" replaced with your own identifying
17*40cb5e5dSvi  * information: Portions Copyright [yyyy] [name of copyright owner]
18*40cb5e5dSvi  *
19*40cb5e5dSvi  * CDDL HEADER END
20*40cb5e5dSvi  */
21*40cb5e5dSvi 
22*40cb5e5dSvi /*
23*40cb5e5dSvi  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24*40cb5e5dSvi  * Use is subject to license terms.
25*40cb5e5dSvi  */
26*40cb5e5dSvi 
27*40cb5e5dSvi #ifndef	_SIP_H
28*40cb5e5dSvi #define	_SIP_H
29*40cb5e5dSvi 
30*40cb5e5dSvi #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*40cb5e5dSvi 
32*40cb5e5dSvi #ifdef	__cplusplus
33*40cb5e5dSvi extern "C" {
34*40cb5e5dSvi #endif
35*40cb5e5dSvi 
36*40cb5e5dSvi #define	_XPG4_2
37*40cb5e5dSvi #define	__EXTENSIONS__
38*40cb5e5dSvi 
39*40cb5e5dSvi #ifndef	DEBUG
40*40cb5e5dSvi #define	NDEBUG	1
41*40cb5e5dSvi #endif
42*40cb5e5dSvi 
43*40cb5e5dSvi #include <stdio.h>
44*40cb5e5dSvi #include <stdlib.h>
45*40cb5e5dSvi #include <ctype.h>
46*40cb5e5dSvi #include <string.h>
47*40cb5e5dSvi #include <strings.h>
48*40cb5e5dSvi #include <assert.h>
49*40cb5e5dSvi #include <sys/types.h>
50*40cb5e5dSvi #include <sys/socket.h>
51*40cb5e5dSvi #include <netinet/in.h>
52*40cb5e5dSvi #include <arpa/inet.h>
53*40cb5e5dSvi #include <pthread.h>
54*40cb5e5dSvi #include <errno.h>
55*40cb5e5dSvi #include <unistd.h>
56*40cb5e5dSvi #include <signal.h>
57*40cb5e5dSvi 
58*40cb5e5dSvi /* Send a SIP message statefully */
59*40cb5e5dSvi #define	SIP_SEND_STATEFUL	0x0001
60*40cb5e5dSvi 
61*40cb5e5dSvi /* Enable multiple dialogs if a request is forked */
62*40cb5e5dSvi #define	SIP_DIALOG_ON_FORK	0x0010
63*40cb5e5dSvi 
64*40cb5e5dSvi #define	SIP_CRLF 		"\r\n"
65*40cb5e5dSvi #define	SKIP_CRLF(msg_ptr)	(msg_ptr = msg_ptr + 2)
66*40cb5e5dSvi #define	SIP_VERSION		"SIP/2.0"
67*40cb5e5dSvi #define	SIP			"SIP"
68*40cb5e5dSvi 
69*40cb5e5dSvi /* SIP headers */
70*40cb5e5dSvi #define	SIP_TO				"TO"
71*40cb5e5dSvi #define	SIP_FROM			"FROM"
72*40cb5e5dSvi #define	SIP_TAG				"TAG="
73*40cb5e5dSvi #define	SIP_CONTENT_LENGTH		"CONTENT-LENGTH"
74*40cb5e5dSvi #define	SIP_CONTENT_TYPE		"CONTENT-TYPE"
75*40cb5e5dSvi #define	SIP_CALL_ID			"CALL-ID"
76*40cb5e5dSvi #define	SIP_CSEQ			"CSEQ"
77*40cb5e5dSvi #define	SIP_MAX_FORWARDS		"MAX-FORWARDS"
78*40cb5e5dSvi #define	SIP_CONTACT			"CONTACT"
79*40cb5e5dSvi #define	SIP_VIA				"Via"
80*40cb5e5dSvi #define	SIP_RECORD_ROUTE		"RECORD-ROUTE"
81*40cb5e5dSvi #define	SIP_ROUTE			"ROUTE"
82*40cb5e5dSvi #define	SIP_ACCEPT			"ACCEPT"
83*40cb5e5dSvi #define	SIP_ACCEPT_ENCODE		"ACCEPT-ENCODING"
84*40cb5e5dSvi #define	SIP_ACCEPT_LANG			"ACCEPT-LANGUAGE"
85*40cb5e5dSvi #define	SIP_ALERT_INFO			"ALERT-INFO"
86*40cb5e5dSvi #define	SIP_ALLOW			"ALLOW"
87*40cb5e5dSvi #define	SIP_CALL_INFO			"CALL-INFO"
88*40cb5e5dSvi #define	SIP_CONTENT_DIS			"CONTENT-DISPOSITION"
89*40cb5e5dSvi #define	SIP_CONTENT_ENCODE		"CONTENT-ENCODING"
90*40cb5e5dSvi #define	SIP_CONTENT_LANG		"CONTENT-LANGUAGE"
91*40cb5e5dSvi #define	SIP_DATE			"DATE"
92*40cb5e5dSvi #define	SIP_ERROR_INFO			"ERROR-INFO"
93*40cb5e5dSvi #define	SIP_EXPIRE			"EXPIRES"
94*40cb5e5dSvi #define	SIP_IN_REPLY_TO			"IN-REPLY-TO"
95*40cb5e5dSvi #define	SIP_MIN_EXPIRE			"MIN-EXPIRES"
96*40cb5e5dSvi #define	SIP_MIME_VERSION		"MIME-VERSION"
97*40cb5e5dSvi #define	SIP_ORGANIZATION		"ORGANIZATION"
98*40cb5e5dSvi #define	SIP_PRIORITY			"PRIORITY"
99*40cb5e5dSvi #define	SIP_REQUIRE			"REQUIRE"
100*40cb5e5dSvi #define	SIP_REPLYTO			"REPLY-TO"
101*40cb5e5dSvi #define	SIP_RETRY_AFTER			"RETRY-AFTER"
102*40cb5e5dSvi #define	SIP_SERVER			"SERVER"
103*40cb5e5dSvi #define	SIP_SUBJECT			"SUBJECT"
104*40cb5e5dSvi #define	SIP_SUPPORT			"SUPPORTED"
105*40cb5e5dSvi #define	SIP_TIMESTAMP			"TIMESTAMP"
106*40cb5e5dSvi #define	SIP_UNSUPPORT			"UNSUPPORTED"
107*40cb5e5dSvi #define	SIP_USER_AGENT			"USER-AGENT"
108*40cb5e5dSvi #define	SIP_WARNING			"WARNING"
109*40cb5e5dSvi #define	SIP_ALLOW_EVENTS		"ALLOW-EVENTS"
110*40cb5e5dSvi #define	SIP_EVENT			"EVENT"
111*40cb5e5dSvi #define	SIP_SUBSCRIPTION_STATE		"SUBSCRIPTION-STATE"
112*40cb5e5dSvi #define	SIP_WWW_AUTHEN			"WWW-AUTHENTICATE"
113*40cb5e5dSvi #define	SIP_AUTHOR			"AUTHORIZATION"
114*40cb5e5dSvi #define	SIP_AUTHEN_INFO			"AUTHENTICATION-INFO"
115*40cb5e5dSvi #define	SIP_PROXY_AUTHOR		"PROXY-AUTHORIZATION"
116*40cb5e5dSvi #define	SIP_PROXY_AUTHEN		"PROXY-AUTHENTICATE"
117*40cb5e5dSvi #define	SIP_PROXY_REQ			"PROXY-REQUIRE"
118*40cb5e5dSvi #define	SIP_PASSERTEDID			"P-ASSERTED-IDENTITY"
119*40cb5e5dSvi #define	SIP_PPREFERREDID		"P-PREFERRED-IDENTITY"
120*40cb5e5dSvi #define	SIP_PRIVACY			"PRIVACY"
121*40cb5e5dSvi #define	SIP_RACK			"RACK"
122*40cb5e5dSvi #define	SIP_RSEQ			"RSEQ"
123*40cb5e5dSvi 
124*40cb5e5dSvi /* SIP Response Codes */
125*40cb5e5dSvi 
126*40cb5e5dSvi /* 1XX - Provisional */
127*40cb5e5dSvi #define	SIP_TRYING			100
128*40cb5e5dSvi #define	SIP_RINGING			180
129*40cb5e5dSvi #define	SIP_CALL_IS_BEING_FORWARDED 	181
130*40cb5e5dSvi #define	SIP_QUEUED			182
131*40cb5e5dSvi #define	SIP_SESSION_PROGRESS		183
132*40cb5e5dSvi 
133*40cb5e5dSvi /* 2XX - Success */
134*40cb5e5dSvi #define	SIP_OK				200
135*40cb5e5dSvi #define	SIP_ACCEPTED			202
136*40cb5e5dSvi 
137*40cb5e5dSvi /* 3XX - Redirection */
138*40cb5e5dSvi #define	SIP_MULTIPLE_CHOICES		300
139*40cb5e5dSvi #define	SIP_MOVED_PERMANENTLY		301
140*40cb5e5dSvi #define	SIP_MOVED_TEMPORARILY		302
141*40cb5e5dSvi #define	SIP_USE_PROXY			303
142*40cb5e5dSvi #define	SIP_ALTERNATIVE_SERVICE		304
143*40cb5e5dSvi 
144*40cb5e5dSvi /* 4XX - Request Failed */
145*40cb5e5dSvi #define	SIP_BAD_REQUEST			400
146*40cb5e5dSvi #define	SIP_UNAUTHORIZED		401
147*40cb5e5dSvi #define	SIP_PAYMENT_REQUIRED		402
148*40cb5e5dSvi #define	SIP_FORBIDDEN			403
149*40cb5e5dSvi #define	SIP_NOT_FOUND			404
150*40cb5e5dSvi #define	SIP_METHOD_NOT_ALLOWED		405
151*40cb5e5dSvi #define	SIP_NOT_ACCEPTABLE		406
152*40cb5e5dSvi #define	SIP_PROXY_AUTH_REQUIRED		407
153*40cb5e5dSvi #define	SIP_REQUEST_TIMEOUT		408
154*40cb5e5dSvi #define	SIP_GONE			410
155*40cb5e5dSvi #define	SIP_REQUEST_ENTITY_2_LARGE	413
156*40cb5e5dSvi #define	SIP_REQUEST_URI_2_LONG		414
157*40cb5e5dSvi #define	SIP_UNSUPPORTED_MEDIA_TYPE	415
158*40cb5e5dSvi #define	SIP_UNSUPPORTED_URI_SCHEME	416
159*40cb5e5dSvi #define	SIP_BAD_EXTENSION		420
160*40cb5e5dSvi #define	SIP_EXTENSION_REQUIRED		421
161*40cb5e5dSvi #define	SIP_INTERVAL_2_BRIEF		423
162*40cb5e5dSvi #define	SIP_TEMPORARILY_UNAVAIL		480
163*40cb5e5dSvi #define	SIP_CALL_NON_EXISTANT		481
164*40cb5e5dSvi #define	SIP_LOOP_DETECTED		482
165*40cb5e5dSvi #define	SIP_TOO_MANY_HOOPS		483
166*40cb5e5dSvi #define	SIP_ADDRESS_INCOMPLETE		484
167*40cb5e5dSvi #define	SIP_AMBIGUOUS			485
168*40cb5e5dSvi #define	SIP_BUSY_HERE			486
169*40cb5e5dSvi #define	SIP_REQUEST_TERMINATED		487
170*40cb5e5dSvi #define	SIP_NOT_ACCEPTABLE_HERE		488
171*40cb5e5dSvi #define	SIP_BAD_EVENT			489
172*40cb5e5dSvi #define	SIP_REQUEST_PENDING		491
173*40cb5e5dSvi #define	SIP_UNDECIPHERABLE		493
174*40cb5e5dSvi 
175*40cb5e5dSvi /* 5XX - Server Failure */
176*40cb5e5dSvi #define	SIP_SERVER_INTERNAL_ERROR	500
177*40cb5e5dSvi #define	SIP_NOT_IMPLEMENTED		501
178*40cb5e5dSvi #define	SIP_BAD_GATEWAY			502
179*40cb5e5dSvi #define	SIP_SERVICE_UNAVAILABLE		503
180*40cb5e5dSvi #define	SIP_SERVER_TIMEOUT		504
181*40cb5e5dSvi #define	SIP_VERSION_NOT_SUPPORTED	505
182*40cb5e5dSvi #define	SIP_MESSAGE_2_LARGE		513
183*40cb5e5dSvi 
184*40cb5e5dSvi /* 6XX - Global Failures */
185*40cb5e5dSvi #define	SIP_BUSY_EVERYWHERE		600
186*40cb5e5dSvi #define	SIP_DECLINE			601
187*40cb5e5dSvi #define	SIP_DOES_NOT_EXIST_ANYWHERE 	604
188*40cb5e5dSvi #define	SIP_NOT_ACCEPTABLE_ANYWHERE	606
189*40cb5e5dSvi 
190*40cb5e5dSvi /* Response error types */
191*40cb5e5dSvi #define	SIP_PROVISIONAL_RESP(resp)	((resp) >= 100 && (resp) < 200)
192*40cb5e5dSvi #define	SIP_FINAL_RESP(resp)		((resp) >= 200 && (resp) < 700)
193*40cb5e5dSvi #define	SIP_OK_RESP(resp)		((resp) >= 200 && (resp) < 300)
194*40cb5e5dSvi #define	SIP_NONOK_FINAL_RESP(resp)	((resp) >= 300 && (resp) < 700)
195*40cb5e5dSvi #define	SIP_REDIRECT_RESP(resp)		((resp) >= 300 && (resp) < 400)
196*40cb5e5dSvi #define	SIP_REQFAIL_RESP(resp)		((resp) >= 400 && (resp) < 500)
197*40cb5e5dSvi #define	SIP_SRVFAIL_RESP(resp)		((resp) >= 500 && (resp) < 600)
198*40cb5e5dSvi #define	SIP_GLOBFAIL_RESP(resp)		((resp) >= 600 && (resp) < 700)
199*40cb5e5dSvi 
200*40cb5e5dSvi /* Types of transactions */
201*40cb5e5dSvi #define	SIP_CLIENT_TRANSACTION		1
202*40cb5e5dSvi #define	SIP_SERVER_TRANSACTION		2
203*40cb5e5dSvi 
204*40cb5e5dSvi /* Transaction states */
205*40cb5e5dSvi #define	SIP_NEW_TRANSACTION		0
206*40cb5e5dSvi 
207*40cb5e5dSvi /* Client Transaction States */
208*40cb5e5dSvi #define	SIP_CLNT_CALLING		1
209*40cb5e5dSvi #define	SIP_CLNT_INV_PROCEEDING 	2
210*40cb5e5dSvi #define	SIP_CLNT_INV_TERMINATED 	3
211*40cb5e5dSvi #define	SIP_CLNT_INV_COMPLETED		4
212*40cb5e5dSvi #define	SIP_CLNT_TRYING		5
213*40cb5e5dSvi #define	SIP_CLNT_NONINV_PROCEEDING 	6
214*40cb5e5dSvi #define	SIP_CLNT_NONINV_TERMINATED 	7
215*40cb5e5dSvi #define	SIP_CLNT_NONINV_COMPLETED	8
216*40cb5e5dSvi 
217*40cb5e5dSvi /* Server Transaction States */
218*40cb5e5dSvi #define	SIP_SRV_INV_PROCEEDING		9
219*40cb5e5dSvi #define	SIP_SRV_INV_COMPLETED		10
220*40cb5e5dSvi #define	SIP_SRV_CONFIRMED		11
221*40cb5e5dSvi #define	SIP_SRV_INV_TERMINATED		12
222*40cb5e5dSvi #define	SIP_SRV_TRYING			13
223*40cb5e5dSvi #define	SIP_SRV_NONINV_PROCEEDING	14
224*40cb5e5dSvi #define	SIP_SRV_NONINV_COMPLETED	15
225*40cb5e5dSvi #define	SIP_SRV_NONINV_TERMINATED	16
226*40cb5e5dSvi 
227*40cb5e5dSvi /* Dialog types */
228*40cb5e5dSvi #define	SIP_UAC_DIALOG			1
229*40cb5e5dSvi #define	SIP_UAS_DIALOG			2
230*40cb5e5dSvi 
231*40cb5e5dSvi /* Dialog state */
232*40cb5e5dSvi typedef enum dialog_state {
233*40cb5e5dSvi 	SIP_DLG_NEW = 0,	/* New dialog, no reply received yet */
234*40cb5e5dSvi 	SIP_DLG_EARLY,		/* Early dialog, provisional reply received */
235*40cb5e5dSvi 	SIP_DLG_CONFIRMED,	/* Confirmed dialog, 2xx reply received */
236*40cb5e5dSvi 	SIP_DLG_DESTROYED	/* Destroyed dialog */
237*40cb5e5dSvi } dialog_state_t;
238*40cb5e5dSvi 
239*40cb5e5dSvi /* SIP URI parse errors */
240*40cb5e5dSvi #define	SIP_URIERR_SCHEME	0x00000001 /* invalid URL SCHEME name */
241*40cb5e5dSvi #define	SIP_URIERR_USER		0x00000002 /* invalid user name */
242*40cb5e5dSvi #define	SIP_URIERR_PASS		0x00000004 /* invalid password  */
243*40cb5e5dSvi #define	SIP_URIERR_HOST		0x00000008 /* invalid domain name */
244*40cb5e5dSvi #define	SIP_URIERR_PORT		0x00000010 /* invalid port number */
245*40cb5e5dSvi #define	SIP_URIERR_PARAM	0x00000020 /* parameter specific error */
246*40cb5e5dSvi #define	SIP_URIERR_HEADER	0x00000040 /* headers specific error */
247*40cb5e5dSvi #define	SIP_URIERR_OPAQUE	0x00000080 /* opaque specific error */
248*40cb5e5dSvi #define	SIP_URIERR_QUERY	0x00000100 /* query specific error */
249*40cb5e5dSvi #define	SIP_URIERR_PATH		0x00000200 /* path specific error */
250*40cb5e5dSvi #define	SIP_URIERR_REGNAME	0x00000400 /* reg-name specific error */
251*40cb5e5dSvi #define	SIP_URIERR_NOURI	0x00000800 /* No URI */
252*40cb5e5dSvi #define	SIP_URIERR_MEMORY	0x00001000 /* out of memory */
253*40cb5e5dSvi 
254*40cb5e5dSvi #ifdef		__linux__
255*40cb5e5dSvi #define		B_FALSE		0
256*40cb5e5dSvi #define		B_TRUE		1
257*40cb5e5dSvi 
258*40cb5e5dSvi typedef int		boolean_t;
259*40cb5e5dSvi typedef unsigned char	uchar_t;
260*40cb5e5dSvi typedef unsigned int	uint_t;
261*40cb5e5dSvi typedef unsigned int	uint32_t;
262*40cb5e5dSvi #endif
263*40cb5e5dSvi 
264*40cb5e5dSvi typedef struct sip_message	*sip_msg_t;
265*40cb5e5dSvi typedef struct sip_header	*sip_header_t;
266*40cb5e5dSvi typedef struct sip_value	*sip_header_value_t;
267*40cb5e5dSvi typedef struct sip_dialog	*sip_dialog_t;
268*40cb5e5dSvi typedef struct sip_uri		*sip_uri_t;
269*40cb5e5dSvi typedef struct sip_conn_object	*sip_conn_object_t;
270*40cb5e5dSvi typedef	struct sip_xaction	*sip_transaction_t;
271*40cb5e5dSvi 
272*40cb5e5dSvi typedef struct sip_str {
273*40cb5e5dSvi 	char	*sip_str_ptr;
274*40cb5e5dSvi 	int	sip_str_len;
275*40cb5e5dSvi }sip_str_t;
276*40cb5e5dSvi 
277*40cb5e5dSvi 
278*40cb5e5dSvi /* SIP parameter */
279*40cb5e5dSvi typedef struct sip_param {
280*40cb5e5dSvi 	sip_str_t	param_name;
281*40cb5e5dSvi 	sip_str_t	param_value;
282*40cb5e5dSvi 	struct sip_param *param_next;
283*40cb5e5dSvi }sip_param_t;
284*40cb5e5dSvi 
285*40cb5e5dSvi 
286*40cb5e5dSvi /* Parsed header structure */
287*40cb5e5dSvi typedef struct sip_parsed_header {
288*40cb5e5dSvi 	int		 sip_parsed_header_version;
289*40cb5e5dSvi 	struct sip_value *value;
290*40cb5e5dSvi 	sip_header_t	sip_header;
291*40cb5e5dSvi }sip_parsed_header_t;
292*40cb5e5dSvi 
293*40cb5e5dSvi #define	SIP_PARSED_HEADER_VERSION_1	1
294*40cb5e5dSvi 
295*40cb5e5dSvi /* Value states */
296*40cb5e5dSvi typedef enum {
297*40cb5e5dSvi 	SIP_VALUE_ACTIVE = 0,
298*40cb5e5dSvi 	SIP_VALUE_BAD,
299*40cb5e5dSvi 	SIP_VALUE_DELETED
300*40cb5e5dSvi }sip_value_state_t;
301*40cb5e5dSvi 
302*40cb5e5dSvi /* SIP header value */
303*40cb5e5dSvi typedef struct sip_value {
304*40cb5e5dSvi 	int			sip_value_version;
305*40cb5e5dSvi 	void			*next;
306*40cb5e5dSvi 	sip_param_t		*param_list;
307*40cb5e5dSvi 	sip_value_state_t	value_state; /* Active/Deleted */
308*40cb5e5dSvi 	sip_parsed_header_t	*parsed_header;
309*40cb5e5dSvi 	char			*value_start;
310*40cb5e5dSvi 	char			*value_end;
311*40cb5e5dSvi 	sip_str_t		*sip_value_uri_str;
312*40cb5e5dSvi 	sip_uri_t		sip_value_parse_uri;
313*40cb5e5dSvi }sip_value_t;
314*40cb5e5dSvi 
315*40cb5e5dSvi #define	SIP_VALUE_VERSION_1	1
316*40cb5e5dSvi 
317*40cb5e5dSvi typedef struct sip_header_general {
318*40cb5e5dSvi 	char			*sip_hdr_start;
319*40cb5e5dSvi 	char			*sip_hdr_end;
320*40cb5e5dSvi 	char			*sip_hdr_current;
321*40cb5e5dSvi 	sip_parsed_header_t	*sip_hdr_parsed;
322*40cb5e5dSvi }sip_hdr_general_t;
323*40cb5e5dSvi 
324*40cb5e5dSvi /* SIP methods */
325*40cb5e5dSvi typedef enum {
326*40cb5e5dSvi 	UNKNOWN = 0,
327*40cb5e5dSvi 	INVITE,
328*40cb5e5dSvi 	ACK,
329*40cb5e5dSvi 	OPTIONS,
330*40cb5e5dSvi 	BYE,
331*40cb5e5dSvi 	CANCEL,
332*40cb5e5dSvi 	REGISTER,
333*40cb5e5dSvi 	REFER,
334*40cb5e5dSvi 	INFO,
335*40cb5e5dSvi 	SUBSCRIBE,
336*40cb5e5dSvi 	NOTIFY,
337*40cb5e5dSvi 	PRACK
338*40cb5e5dSvi }sip_method_t;
339*40cb5e5dSvi 
340*40cb5e5dSvi #define	MAX_SIP_METHODS	12
341*40cb5e5dSvi 
342*40cb5e5dSvi typedef struct sip_methods {
343*40cb5e5dSvi 	char *name;	/* Name of the method */
344*40cb5e5dSvi 	int  len;	/* Length for comparison */
345*40cb5e5dSvi }sip_methods_t;
346*40cb5e5dSvi 
347*40cb5e5dSvi extern sip_methods_t sip_methods[];
348*40cb5e5dSvi 
349*40cb5e5dSvi /* SIP header function table */
350*40cb5e5dSvi typedef struct header_function_table {
351*40cb5e5dSvi 	char		*header_name;
352*40cb5e5dSvi 	char		*header_short_name;
353*40cb5e5dSvi 	int		(*header_parse_func)(struct sip_header *,
354*40cb5e5dSvi 			    struct sip_parsed_header **);
355*40cb5e5dSvi 	boolean_t	(*header_check_compliance)(struct sip_parsed_header *);
356*40cb5e5dSvi 	boolean_t	(*header_is_equal)(struct sip_parsed_header *,
357*40cb5e5dSvi 			    struct sip_parsed_header *);
358*40cb5e5dSvi 	void		(*header_free)(struct sip_parsed_header *);
359*40cb5e5dSvi }sip_header_function_t;
360*40cb5e5dSvi 
361*40cb5e5dSvi /* Connection Manager interface */
362*40cb5e5dSvi typedef struct sip_io_pointers_s {
363*40cb5e5dSvi 	int	(*sip_conn_send)(const sip_conn_object_t, char *, int);
364*40cb5e5dSvi 	void	(*sip_hold_conn_object)(sip_conn_object_t);
365*40cb5e5dSvi 	void	(*sip_rel_conn_object)(sip_conn_object_t);
366*40cb5e5dSvi 	boolean_t	(*sip_conn_is_stream)(sip_conn_object_t);
367*40cb5e5dSvi 	boolean_t	(*sip_conn_is_reliable)(sip_conn_object_t);
368*40cb5e5dSvi 	int 	(*sip_conn_remote_address)(sip_conn_object_t, struct sockaddr *,
369*40cb5e5dSvi 		    socklen_t *);
370*40cb5e5dSvi 	int 	(*sip_conn_local_address)(sip_conn_object_t, struct sockaddr *,
371*40cb5e5dSvi 		    socklen_t *);
372*40cb5e5dSvi 	int	(*sip_conn_transport)(sip_conn_object_t);
373*40cb5e5dSvi 	int	(*sip_conn_timer1)(sip_conn_object_t);
374*40cb5e5dSvi 	int	(*sip_conn_timer2)(sip_conn_object_t);
375*40cb5e5dSvi 	int	(*sip_conn_timer4)(sip_conn_object_t);
376*40cb5e5dSvi 	int	(*sip_conn_timerd)(sip_conn_object_t);
377*40cb5e5dSvi }sip_io_pointers_t;
378*40cb5e5dSvi 
379*40cb5e5dSvi /* Upper layer registerations */
380*40cb5e5dSvi typedef struct sip_ulp_pointers_s {
381*40cb5e5dSvi 	void		(*sip_ulp_recv)(const sip_conn_object_t,
382*40cb5e5dSvi 			    sip_msg_t, const sip_dialog_t);
383*40cb5e5dSvi 	uint_t		(*sip_ulp_timeout)(void *, void (*func)(void *),
384*40cb5e5dSvi 			    struct timeval *);
385*40cb5e5dSvi 	boolean_t	(*sip_ulp_untimeout)(uint_t);
386*40cb5e5dSvi 	int		(*sip_ulp_trans_error)(sip_transaction_t, int, void *);
387*40cb5e5dSvi 	void		(*sip_ulp_dlg_del)(sip_dialog_t, sip_msg_t, void *);
388*40cb5e5dSvi 	void		(*sip_ulp_trans_state_cb)(sip_transaction_t,
389*40cb5e5dSvi 			    sip_msg_t, int, int);
390*40cb5e5dSvi 	void		(*sip_ulp_dlg_state_cb)(sip_dialog_t, sip_msg_t, int,
391*40cb5e5dSvi 			    int);
392*40cb5e5dSvi }sip_ulp_pointers_t;
393*40cb5e5dSvi 
394*40cb5e5dSvi /* SIP stack initialization structure */
395*40cb5e5dSvi typedef struct sip_stack_init_s {
396*40cb5e5dSvi 	int			sip_version;
397*40cb5e5dSvi 	int			sip_stack_flags;
398*40cb5e5dSvi 	sip_io_pointers_t	*sip_io_pointers;
399*40cb5e5dSvi 	sip_ulp_pointers_t	*sip_ulp_pointers;
400*40cb5e5dSvi 	sip_header_function_t	*sip_function_table;
401*40cb5e5dSvi }sip_stack_init_t;
402*40cb5e5dSvi 
403*40cb5e5dSvi /* SIP stack version */
404*40cb5e5dSvi #define	SIP_STACK_VERSION		1
405*40cb5e5dSvi 
406*40cb5e5dSvi /* Flags for sip_stack_flags */
407*40cb5e5dSvi #define	SIP_STACK_DIALOGS		0x0001
408*40cb5e5dSvi 
409*40cb5e5dSvi extern int		sip_init_conn_object(sip_conn_object_t);
410*40cb5e5dSvi extern void		sip_clear_stale_data(sip_conn_object_t);
411*40cb5e5dSvi extern void		sip_conn_destroyed(sip_conn_object_t);
412*40cb5e5dSvi 
413*40cb5e5dSvi extern int		(*sip_stack_send)(const sip_conn_object_t, char *, int);
414*40cb5e5dSvi extern void		(*sip_refhold_conn)(sip_conn_object_t);
415*40cb5e5dSvi extern void		(*sip_refrele_conn)(sip_conn_object_t);
416*40cb5e5dSvi extern boolean_t	(*sip_is_conn_stream)(sip_conn_object_t);
417*40cb5e5dSvi extern boolean_t	(*sip_is_conn_reliable)(sip_conn_object_t);
418*40cb5e5dSvi extern int 		(*sip_conn_rem_addr)(sip_conn_object_t,
419*40cb5e5dSvi 			    struct sockaddr *, socklen_t *);
420*40cb5e5dSvi extern int		(*sip_conn_local_addr)(sip_conn_object_t,
421*40cb5e5dSvi 			    struct sockaddr *, socklen_t *);
422*40cb5e5dSvi extern int		(*sip_conn_transport)(sip_conn_object_t);
423*40cb5e5dSvi extern int		(*sip_conn_timer1)(sip_conn_object_t);
424*40cb5e5dSvi extern int		(*sip_conn_timer2)(sip_conn_object_t);
425*40cb5e5dSvi extern int		(*sip_conn_timer4)(sip_conn_object_t);
426*40cb5e5dSvi extern int		(*sip_conn_timerd)(sip_conn_object_t);
427*40cb5e5dSvi 
428*40cb5e5dSvi extern uint_t		(*sip_stack_timeout)(void *, void (*func)(void *),
429*40cb5e5dSvi 			    struct timeval *);
430*40cb5e5dSvi extern boolean_t	(*sip_stack_untimeout)(uint_t);
431*40cb5e5dSvi 
432*40cb5e5dSvi extern sip_msg_t	sip_new_msg();
433*40cb5e5dSvi extern void		sip_free_msg(sip_msg_t);
434*40cb5e5dSvi extern void		sip_hold_msg(sip_msg_t);
435*40cb5e5dSvi extern int		sip_stack_init(sip_stack_init_t *);
436*40cb5e5dSvi extern int		sip_sendmsg(sip_conn_object_t, sip_msg_t, sip_dialog_t,
437*40cb5e5dSvi 			    uint32_t);
438*40cb5e5dSvi extern void		sip_process_new_packet(sip_conn_object_t, void *,
439*40cb5e5dSvi 			    size_t);
440*40cb5e5dSvi extern char 		*sip_guid();
441*40cb5e5dSvi extern char		*sip_sent_by_to_str(int *);
442*40cb5e5dSvi extern int		sip_register_sent_by(char *);
443*40cb5e5dSvi extern void		sip_unregister_sent_by(char *);
444*40cb5e5dSvi extern void		sip_unregister_all_sent_by();
445*40cb5e5dSvi extern char 		*sip_branchid(sip_msg_t);
446*40cb5e5dSvi extern uint32_t		sip_get_cseq();
447*40cb5e5dSvi extern uint32_t		sip_get_rseq();
448*40cb5e5dSvi extern int		sip_get_num_via(sip_msg_t, int *);
449*40cb5e5dSvi 
450*40cb5e5dSvi extern int 		sip_add_from(sip_msg_t, char *, char *, char *,
451*40cb5e5dSvi 			    boolean_t, char *);
452*40cb5e5dSvi extern int 		sip_add_to(sip_msg_t, char *, char *, char *,
453*40cb5e5dSvi 			    boolean_t, char *);
454*40cb5e5dSvi extern int 		sip_add_response_line(sip_msg_t, int, char *);
455*40cb5e5dSvi extern int 		sip_add_request_line(sip_msg_t, sip_method_t, char *);
456*40cb5e5dSvi extern int 		sip_add_via(sip_msg_t, char *, char *, int, char *);
457*40cb5e5dSvi extern int 		sip_add_maxforward(sip_msg_t, uint_t);
458*40cb5e5dSvi extern int 		sip_add_callid(sip_msg_t, char *);
459*40cb5e5dSvi extern int 		sip_add_cseq(sip_msg_t, sip_method_t, uint32_t);
460*40cb5e5dSvi extern int 		sip_add_content_type(sip_msg_t, char *, char *);
461*40cb5e5dSvi extern int 		sip_add_content(sip_msg_t, char *);
462*40cb5e5dSvi extern int 		sip_add_contact(sip_msg_t, char *, char *, boolean_t,
463*40cb5e5dSvi 			    char *);
464*40cb5e5dSvi extern int 		sip_add_route(sip_msg_t, char *, char *, char *);
465*40cb5e5dSvi extern int 		sip_add_record_route(sip_msg_t, char *, char *, char *);
466*40cb5e5dSvi extern int 		sip_add_branchid_to_via(sip_msg_t, char *);
467*40cb5e5dSvi extern int 		sip_add_accept(sip_msg_t, char *, char *, char *,
468*40cb5e5dSvi 			    char *);
469*40cb5e5dSvi extern int		sip_add_author(sip_msg_t, char *,  char *);
470*40cb5e5dSvi extern int		sip_add_authen_info(sip_msg_t, char *);
471*40cb5e5dSvi extern int		sip_add_proxy_authen(sip_msg_t, char *,  char *);
472*40cb5e5dSvi extern int		sip_add_proxy_author(sip_msg_t, char *, char *);
473*40cb5e5dSvi extern int		sip_add_proxy_require(sip_msg_t, char *);
474*40cb5e5dSvi extern int		sip_add_www_authen(sip_msg_t, char *, char *);
475*40cb5e5dSvi extern int		sip_add_accept_enc(sip_msg_t, char *, char *);
476*40cb5e5dSvi extern int		sip_add_accept_lang(sip_msg_t, char *, char *);
477*40cb5e5dSvi extern int		sip_add_alert_info(sip_msg_t, char *, char *);
478*40cb5e5dSvi extern int		sip_add_allow(sip_msg_t, sip_method_t);
479*40cb5e5dSvi extern int		sip_add_call_info(sip_msg_t, char *, char *);
480*40cb5e5dSvi extern int		sip_add_content_disp(sip_msg_t, char *, char *);
481*40cb5e5dSvi extern int		sip_add_content_enc(sip_msg_t, char *);
482*40cb5e5dSvi extern int		sip_add_content_lang(sip_msg_t, char *);
483*40cb5e5dSvi extern int		sip_add_date(sip_msg_t, char *);
484*40cb5e5dSvi extern int		sip_add_error_info(sip_msg_t, char *, char *);
485*40cb5e5dSvi extern int		sip_add_expires(sip_msg_t, int);
486*40cb5e5dSvi extern int		sip_add_in_reply_to(sip_msg_t, char *);
487*40cb5e5dSvi extern int		sip_add_mime_version(sip_msg_t, char *);
488*40cb5e5dSvi extern int		sip_add_min_expires(sip_msg_t, int);
489*40cb5e5dSvi extern int		sip_add_org(sip_msg_t, char *);
490*40cb5e5dSvi extern int		sip_add_priority(sip_msg_t, char *);
491*40cb5e5dSvi extern int		sip_add_reply_to(sip_msg_t, char *, char *, char *,
492*40cb5e5dSvi 			    boolean_t);
493*40cb5e5dSvi extern int		sip_add_require(sip_msg_t, char *);
494*40cb5e5dSvi extern int		sip_add_retry_after(sip_msg_t, int, char *, char *);
495*40cb5e5dSvi extern int		sip_add_server(sip_msg_t, char *);
496*40cb5e5dSvi extern int		sip_add_subject(sip_msg_t, char *);
497*40cb5e5dSvi extern int		sip_add_supported(sip_msg_t, char *);
498*40cb5e5dSvi extern int		sip_add_tstamp(sip_msg_t, char *, char *);
499*40cb5e5dSvi extern int		sip_add_unsupported(sip_msg_t, char *);
500*40cb5e5dSvi extern int		sip_add_user_agent(sip_msg_t, char *);
501*40cb5e5dSvi extern int		sip_add_warning(sip_msg_t, int, char *, char *);
502*40cb5e5dSvi extern int		sip_add_allow_events(sip_msg_t, char *);
503*40cb5e5dSvi extern int		sip_add_event(sip_msg_t, char *, char *);
504*40cb5e5dSvi extern int		sip_add_substate(sip_msg_t, char *, char *);
505*40cb5e5dSvi extern int		sip_add_privacy(sip_msg_t, char *);
506*40cb5e5dSvi extern int		sip_add_passertedid(sip_msg_t, char *, char *,
507*40cb5e5dSvi 			    boolean_t);
508*40cb5e5dSvi extern int		sip_add_ppreferredid(sip_msg_t, char *, char *,
509*40cb5e5dSvi 			    boolean_t);
510*40cb5e5dSvi extern int		sip_add_rack(sip_msg_t, int, int, sip_method_t);
511*40cb5e5dSvi extern int		sip_add_rseq(sip_msg_t, int);
512*40cb5e5dSvi extern const sip_str_t *sip_get_author_scheme(sip_msg_t, int *);
513*40cb5e5dSvi extern const sip_str_t *sip_get_author_param(sip_msg_t, char *, int *);
514*40cb5e5dSvi extern const sip_str_t *sip_get_authen_info(sip_header_value_t, int *);
515*40cb5e5dSvi extern const sip_str_t *sip_get_proxy_authen_scheme(sip_msg_t, int *);
516*40cb5e5dSvi extern const sip_str_t *sip_get_proxy_authen_param(sip_msg_t, char *, int *);
517*40cb5e5dSvi extern const sip_str_t *sip_get_proxy_author_scheme(sip_msg_t, int *);
518*40cb5e5dSvi extern const sip_str_t *sip_get_proxy_author_param(sip_msg_t, char *, int *);
519*40cb5e5dSvi extern const sip_str_t *sip_get_proxy_require(sip_header_value_t, int *);
520*40cb5e5dSvi extern const sip_str_t *sip_get_www_authen_scheme(sip_msg_t, int *);
521*40cb5e5dSvi extern const sip_str_t *sip_get_www_authen_param(sip_msg_t, char *, int *);
522*40cb5e5dSvi extern const sip_str_t	*sip_get_allow_events(sip_header_value_t, int *);
523*40cb5e5dSvi extern const sip_str_t	*sip_get_event(sip_msg_t, int *);
524*40cb5e5dSvi extern const sip_str_t	*sip_get_substate(sip_msg_t, int *);
525*40cb5e5dSvi extern const sip_str_t	*sip_get_accept_type(sip_header_value_t, int *);
526*40cb5e5dSvi extern const sip_str_t	*sip_get_accept_sub_type(sip_header_value_t, int *);
527*40cb5e5dSvi extern const sip_str_t	*sip_get_accept_enc(sip_header_value_t, int *);
528*40cb5e5dSvi extern const sip_str_t	*sip_get_accept_lang(sip_header_value_t, int *);
529*40cb5e5dSvi extern const sip_str_t	*sip_get_alert_info_uri(sip_header_value_t, int *);
530*40cb5e5dSvi extern sip_method_t	sip_get_allow_method(sip_header_value_t, int *);
531*40cb5e5dSvi extern int		sip_get_min_expires(sip_msg_t, int *);
532*40cb5e5dSvi extern const sip_str_t	*sip_get_mime_version(sip_msg_t, int *);
533*40cb5e5dSvi extern const sip_str_t	*sip_get_org(sip_msg_t, int *);
534*40cb5e5dSvi extern const sip_str_t	*sip_get_priority(sip_msg_t, int *);
535*40cb5e5dSvi extern const sip_str_t	*sip_get_replyto_display_name(sip_msg_t, int *);
536*40cb5e5dSvi extern const sip_str_t	*sip_get_replyto_uri_str(sip_msg_t, int *);
537*40cb5e5dSvi extern const sip_str_t	*sip_get_date_time(sip_msg_t, int *);
538*40cb5e5dSvi extern int		sip_get_date_day(sip_msg_t, int *);
539*40cb5e5dSvi extern const sip_str_t	*sip_get_date_month(sip_msg_t, int *);
540*40cb5e5dSvi extern const sip_str_t	*sip_get_date_wkday(sip_msg_t, int *);
541*40cb5e5dSvi extern int		sip_get_date_year(sip_msg_t, int *);
542*40cb5e5dSvi extern const sip_str_t	*sip_get_date_timezone(sip_msg_t, int *);
543*40cb5e5dSvi extern const sip_str_t	*sip_get_content_disp(sip_msg_t, int *);
544*40cb5e5dSvi extern const sip_str_t	*sip_get_content_lang(sip_header_value_t, int *);
545*40cb5e5dSvi extern const sip_str_t	*sip_get_content_enc(sip_header_value_t, int *);
546*40cb5e5dSvi extern const sip_str_t	*sip_get_error_info_uri(sip_header_value_t, int *);
547*40cb5e5dSvi extern int		sip_get_expires(sip_msg_t, int *);
548*40cb5e5dSvi extern const sip_str_t	*sip_get_require(sip_header_value_t, int *);
549*40cb5e5dSvi extern const sip_str_t	*sip_get_subject(sip_msg_t, int *);
550*40cb5e5dSvi extern const sip_str_t	*sip_get_supported(sip_header_value_t, int *);
551*40cb5e5dSvi extern const sip_str_t	*sip_get_tstamp_delay(sip_msg_t, int *);
552*40cb5e5dSvi extern const sip_str_t	*sip_get_tstamp_value(sip_msg_t, int *);
553*40cb5e5dSvi extern const sip_str_t	*sip_get_unsupported(sip_header_value_t, int *);
554*40cb5e5dSvi extern const sip_str_t	*sip_get_server(sip_msg_t, int *);
555*40cb5e5dSvi extern const sip_str_t	*sip_get_user_agent(sip_msg_t, int *);
556*40cb5e5dSvi extern int		sip_get_warning_code(sip_header_value_t, int *);
557*40cb5e5dSvi extern const sip_str_t	*sip_get_warning_agent(sip_header_value_t, int *);
558*40cb5e5dSvi extern const sip_str_t	*sip_get_warning_text(sip_header_value_t, int *);
559*40cb5e5dSvi extern const sip_str_t	*sip_get_call_info_uri(sip_header_value_t, int *);
560*40cb5e5dSvi extern const sip_str_t	*sip_get_in_reply_to(sip_header_value_t, int *);
561*40cb5e5dSvi extern int		sip_get_retry_after_time(sip_msg_t, int *);
562*40cb5e5dSvi extern const sip_str_t	*sip_get_retry_after_cmts(sip_msg_t, int *);
563*40cb5e5dSvi extern const sip_str_t	*sip_get_passertedid_display_name(sip_header_value_t,
564*40cb5e5dSvi 			    int *);
565*40cb5e5dSvi extern const sip_str_t	*sip_get_passertedid_uri_str(sip_header_value_t,
566*40cb5e5dSvi 			    int *);
567*40cb5e5dSvi extern const sip_str_t	*sip_get_ppreferredid_display_name(sip_header_value_t,
568*40cb5e5dSvi 			    int *);
569*40cb5e5dSvi extern const sip_str_t	*sip_get_ppreferredid_uri_str(sip_header_value_t,
570*40cb5e5dSvi 			    int *);
571*40cb5e5dSvi extern const sip_str_t	*sip_get_priv_value(sip_header_value_t, int *);
572*40cb5e5dSvi extern int		sip_get_rack_resp_num(sip_msg_t, int *);
573*40cb5e5dSvi extern int		sip_get_rack_cseq_num(sip_msg_t, int *);
574*40cb5e5dSvi extern sip_method_t	sip_get_rack_method(sip_msg_t, int *);
575*40cb5e5dSvi extern int		sip_get_rseq_resp_num(sip_msg_t, int *);
576*40cb5e5dSvi 
577*40cb5e5dSvi extern int		sip_copy_start_line(sip_msg_t, sip_msg_t);
578*40cb5e5dSvi extern int		sip_delete_start_line(sip_msg_t sip_msg);
579*40cb5e5dSvi extern int		sip_copy_header(sip_msg_t, sip_header_t, char *);
580*40cb5e5dSvi extern int		sip_copy_header_by_name(sip_msg_t, sip_msg_t, char *,
581*40cb5e5dSvi 			    char *);
582*40cb5e5dSvi extern int		sip_copy_all_headers(sip_msg_t, sip_msg_t);
583*40cb5e5dSvi extern int		sip_delete_header_by_name(sip_msg_t, char *);
584*40cb5e5dSvi extern int		sip_add_header(sip_msg_t, char *);
585*40cb5e5dSvi extern sip_header_t	sip_add_param(sip_header_t, char *, int *);
586*40cb5e5dSvi extern int		sip_delete_header(sip_header_t);
587*40cb5e5dSvi extern int		sip_delete_value(sip_header_t, sip_header_value_t);
588*40cb5e5dSvi extern sip_msg_t	sip_clone_msg(const sip_msg_t);
589*40cb5e5dSvi extern sip_msg_t	sip_create_response(const sip_msg_t, int, char *,
590*40cb5e5dSvi 			    char *, char *);
591*40cb5e5dSvi extern int		sip_create_OKack(const sip_msg_t, sip_msg_t, char *,
592*40cb5e5dSvi 			    char *, int, char *);
593*40cb5e5dSvi extern char 		*sip_get_resp_desc(int);
594*40cb5e5dSvi extern char		*sip_get_branchid(const sip_msg_t, int *);
595*40cb5e5dSvi 
596*40cb5e5dSvi extern const struct sip_header	*sip_get_header(sip_msg_t, char *, sip_header_t,
597*40cb5e5dSvi 				    int *);
598*40cb5e5dSvi extern const struct sip_value	*sip_get_header_value(
599*40cb5e5dSvi 				    const struct sip_header *, int *);
600*40cb5e5dSvi extern const struct sip_value	*sip_get_next_value(sip_header_value_t, int *);
601*40cb5e5dSvi extern const sip_str_t		*sip_get_param_value(sip_header_value_t,
602*40cb5e5dSvi 				    char *, int *);
603*40cb5e5dSvi extern const sip_param_t	*sip_get_params(sip_header_value_t, int *);
604*40cb5e5dSvi extern boolean_t		sip_is_param_present(const sip_param_t *,
605*40cb5e5dSvi 				    char *, int);
606*40cb5e5dSvi 
607*40cb5e5dSvi extern char		*sip_msg_to_str(sip_msg_t, int *);
608*40cb5e5dSvi extern char		*sip_hdr_to_str(sip_header_t, int *);
609*40cb5e5dSvi extern char		*sip_reqline_to_str(sip_msg_t, int *);
610*40cb5e5dSvi extern char		*sip_respline_to_str(sip_msg_t, int *);
611*40cb5e5dSvi extern boolean_t	sip_msg_is_request(const sip_msg_t, int *);
612*40cb5e5dSvi extern boolean_t	sip_msg_is_response(const sip_msg_t, int *);
613*40cb5e5dSvi extern sip_method_t	sip_get_request_method(const sip_msg_t, int *);
614*40cb5e5dSvi extern const sip_str_t	*sip_get_request_uri_str(sip_msg_t, int *);
615*40cb5e5dSvi extern int		sip_get_response_code(sip_msg_t, int *);
616*40cb5e5dSvi extern const sip_str_t	*sip_get_response_phrase(sip_msg_t, int *);
617*40cb5e5dSvi extern const sip_str_t	*sip_get_sip_version(sip_msg_t, int *);
618*40cb5e5dSvi extern int		sip_get_msg_len(sip_msg_t, int *);
619*40cb5e5dSvi extern const sip_str_t	*sip_get_route_uri_str(sip_header_value_t, int *);
620*40cb5e5dSvi extern const sip_str_t	*sip_get_route_display_name(sip_header_value_t, int *);
621*40cb5e5dSvi extern const sip_str_t	*sip_get_contact_uri_str(sip_header_value_t, int *);
622*40cb5e5dSvi extern const sip_str_t	*sip_get_contact_display_name(sip_header_value_t,
623*40cb5e5dSvi 			    int *);
624*40cb5e5dSvi extern const sip_str_t	*sip_get_from_uri_str(sip_msg_t, int *);
625*40cb5e5dSvi extern const sip_str_t	*sip_get_from_display_name(sip_msg_t, int *);
626*40cb5e5dSvi extern const sip_str_t	*sip_get_from_tag(sip_msg_t, int *);
627*40cb5e5dSvi extern const sip_str_t	*sip_get_to_uri_str(sip_msg_t, int *);
628*40cb5e5dSvi extern const sip_str_t	*sip_get_to_display_name(sip_msg_t, int *);
629*40cb5e5dSvi extern const sip_str_t	*sip_get_to_tag(sip_msg_t, int *);
630*40cb5e5dSvi extern const sip_str_t	*sip_get_callid(sip_msg_t, int *);
631*40cb5e5dSvi extern int		sip_get_callseq_num(sip_msg_t, int *);
632*40cb5e5dSvi extern sip_method_t	sip_get_callseq_method(sip_msg_t, int *);
633*40cb5e5dSvi extern const sip_str_t	*sip_get_via_sent_by_host(sip_header_value_t, int *);
634*40cb5e5dSvi extern int		sip_get_via_sent_by_port(sip_header_value_t, int *);
635*40cb5e5dSvi extern const sip_str_t	*sip_get_via_sent_protocol_version(sip_header_value_t,
636*40cb5e5dSvi 			    int *);
637*40cb5e5dSvi extern const sip_str_t	*sip_get_via_sent_protocol_name(sip_header_value_t,
638*40cb5e5dSvi 			    int *);
639*40cb5e5dSvi extern const sip_str_t	*sip_get_via_sent_transport(sip_header_value_t,
640*40cb5e5dSvi 			    int *);
641*40cb5e5dSvi extern int 		sip_get_maxforward(sip_msg_t, int *);
642*40cb5e5dSvi extern int 		sip_get_content_length(sip_msg_t, int *);
643*40cb5e5dSvi extern const sip_str_t	*sip_get_content_type(sip_msg_t, int *);
644*40cb5e5dSvi extern const sip_str_t	*sip_get_content_sub_type(sip_msg_t, int *);
645*40cb5e5dSvi extern char		*sip_get_content(sip_msg_t, int *);
646*40cb5e5dSvi extern sip_msg_t	sip_create_dialog_req(sip_method_t, sip_dialog_t,
647*40cb5e5dSvi 			    char *, char *, int, char *, uint32_t, int);
648*40cb5e5dSvi 
649*40cb5e5dSvi extern int			sip_get_dialog_state(sip_dialog_t, int *);
650*40cb5e5dSvi extern int			sip_get_dialog_method(sip_dialog_t, int *);
651*40cb5e5dSvi extern const sip_str_t		*sip_get_dialog_callid(sip_dialog_t, int *);
652*40cb5e5dSvi extern const sip_str_t		*sip_get_dialog_local_tag(sip_dialog_t, int *);
653*40cb5e5dSvi extern const sip_str_t		*sip_get_dialog_remote_tag(sip_dialog_t, int *);
654*40cb5e5dSvi extern const struct sip_uri	*sip_get_dialog_local_uri(sip_dialog_t, int *);
655*40cb5e5dSvi extern const struct sip_uri	*sip_get_dialog_remote_uri(sip_dialog_t, int *);
656*40cb5e5dSvi extern const struct sip_uri	*sip_get_dialog_remote_target_uri(sip_dialog_t,
657*40cb5e5dSvi 				    int *);
658*40cb5e5dSvi extern const sip_str_t		*sip_get_dialog_route_set(sip_dialog_t, int *);
659*40cb5e5dSvi extern boolean_t		sip_is_dialog_secure(sip_dialog_t, int *);
660*40cb5e5dSvi extern uint32_t			sip_get_dialog_local_cseq(sip_dialog_t, int *);
661*40cb5e5dSvi extern uint32_t			sip_get_dialog_remote_cseq(sip_dialog_t, int *);
662*40cb5e5dSvi extern int			sip_get_dialog_type(sip_dialog_t dialog, int *);
663*40cb5e5dSvi 
664*40cb5e5dSvi extern void			sip_hold_dialog(sip_dialog_t);
665*40cb5e5dSvi extern void			sip_release_dialog(sip_dialog_t);
666*40cb5e5dSvi extern void			sip_delete_dialog(sip_dialog_t);
667*40cb5e5dSvi 
668*40cb5e5dSvi extern sip_uri_t		sip_parse_uri(sip_str_t *, int *);
669*40cb5e5dSvi extern void			sip_free_parsed_uri(sip_uri_t);
670*40cb5e5dSvi extern boolean_t		sip_is_sipuri(const struct sip_uri *);
671*40cb5e5dSvi extern const sip_str_t		*sip_get_uri_scheme(const struct sip_uri *,
672*40cb5e5dSvi 				    int *);
673*40cb5e5dSvi extern const sip_str_t		*sip_get_uri_user(const struct sip_uri *,
674*40cb5e5dSvi 				    int *);
675*40cb5e5dSvi extern const sip_str_t		*sip_get_uri_password(const struct sip_uri *,
676*40cb5e5dSvi 				    int *);
677*40cb5e5dSvi extern const sip_str_t		*sip_get_uri_host(const struct sip_uri *,
678*40cb5e5dSvi 				    int *);
679*40cb5e5dSvi extern int			sip_get_uri_port(const struct sip_uri *,
680*40cb5e5dSvi 				    int *error);
681*40cb5e5dSvi extern const sip_param_t	*sip_get_uri_params(const struct sip_uri *,
682*40cb5e5dSvi 				    int *);
683*40cb5e5dSvi extern const sip_str_t		*sip_get_uri_headers(const struct sip_uri *,
684*40cb5e5dSvi 				    int *);
685*40cb5e5dSvi extern const sip_str_t		*sip_get_uri_opaque(const struct sip_uri *,
686*40cb5e5dSvi 				    int *);
687*40cb5e5dSvi extern const sip_str_t		*sip_get_uri_query(const struct sip_uri *,
688*40cb5e5dSvi 				    int *);
689*40cb5e5dSvi extern const sip_str_t		*sip_get_uri_path(const struct sip_uri *,
690*40cb5e5dSvi 				    int *);
691*40cb5e5dSvi extern const sip_str_t		*sip_get_uri_regname(const struct sip_uri *,
692*40cb5e5dSvi 				    int *);
693*40cb5e5dSvi extern boolean_t		sip_is_uri_teluser(const struct sip_uri *);
694*40cb5e5dSvi extern int			sip_get_uri_errflags(const struct sip_uri *,
695*40cb5e5dSvi 				    int *);
696*40cb5e5dSvi extern char			*sip_uri_errflags_to_str(int);
697*40cb5e5dSvi 
698*40cb5e5dSvi extern const struct sip_uri	*sip_get_request_uri(sip_msg_t, int *);
699*40cb5e5dSvi extern const struct sip_uri	*sip_get_uri_parsed(sip_header_value_t, int *);
700*40cb5e5dSvi 
701*40cb5e5dSvi /* Transaction functions */
702*40cb5e5dSvi extern const struct sip_xaction	*sip_get_trans(sip_msg_t, int, int *);
703*40cb5e5dSvi extern char 			*sip_get_trans_branchid(sip_transaction_t,
704*40cb5e5dSvi 				    int *);
705*40cb5e5dSvi extern sip_method_t		sip_get_trans_method(sip_transaction_t,
706*40cb5e5dSvi 				    int *);
707*40cb5e5dSvi extern int			sip_get_trans_state(sip_transaction_t, int *);
708*40cb5e5dSvi extern const struct sip_message	*sip_get_trans_resp_msg(sip_transaction_t,
709*40cb5e5dSvi 				    int *);
710*40cb5e5dSvi extern const struct sip_message	*sip_get_trans_orig_msg(sip_transaction_t,
711*40cb5e5dSvi 				    int *);
712*40cb5e5dSvi extern void			sip_hold_trans(sip_transaction_t);
713*40cb5e5dSvi extern void			sip_release_trans(sip_transaction_t);
714*40cb5e5dSvi extern const struct sip_conn_object	*sip_get_trans_conn_obj(
715*40cb5e5dSvi 					    sip_transaction_t, int *);
716*40cb5e5dSvi #ifdef	__cplusplus
717*40cb5e5dSvi }
718*40cb5e5dSvi #endif
719*40cb5e5dSvi 
720*40cb5e5dSvi #endif	/* _SIP_H */
721