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