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