1*2882Svi117747 /* 2*2882Svi117747 * CDDL HEADER START 3*2882Svi117747 * 4*2882Svi117747 * The contents of this file are subject to the terms of the 5*2882Svi117747 * Common Development and Distribution License (the "License"). 6*2882Svi117747 * You may not use this file except in compliance with the License. 7*2882Svi117747 * 8*2882Svi117747 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*2882Svi117747 * or http://www.opensolaris.org/os/licensing. 10*2882Svi117747 * See the License for the specific language governing permissions 11*2882Svi117747 * and limitations under the License. 12*2882Svi117747 * 13*2882Svi117747 * When distributing Covered Code, include this CDDL HEADER in each 14*2882Svi117747 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*2882Svi117747 * If applicable, add the following below this CDDL HEADER, with the 16*2882Svi117747 * fields enclosed by brackets "[]" replaced with your own identifying 17*2882Svi117747 * information: Portions Copyright [yyyy] [name of copyright owner] 18*2882Svi117747 * 19*2882Svi117747 * CDDL HEADER END 20*2882Svi117747 */ 21*2882Svi117747 22*2882Svi117747 /* 23*2882Svi117747 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24*2882Svi117747 * Use is subject to license terms. 25*2882Svi117747 */ 26*2882Svi117747 27*2882Svi117747 #pragma ident "%Z%%M% %I% %E% SMI" 28*2882Svi117747 29*2882Svi117747 #ifdef __linux__ 30*2882Svi117747 #include <stdarg.h> 31*2882Svi117747 #else 32*2882Svi117747 #include <sys/varargs.h> 33*2882Svi117747 #endif 34*2882Svi117747 #include "sip_parse_uri.h" 35*2882Svi117747 #include "sip_msg.h" 36*2882Svi117747 #include "sip_miscdefs.h" 37*2882Svi117747 #include "sip_xaction.h" 38*2882Svi117747 #include "sip_hash.h" 39*2882Svi117747 #include "sip_dialog.h" 40*2882Svi117747 #include "sip_parse_generic.h" 41*2882Svi117747 42*2882Svi117747 #define SIP_MSG_BUF_SZ 100 43*2882Svi117747 44*2882Svi117747 45*2882Svi117747 void (*sip_ulp_recv)(const sip_conn_object_t, sip_msg_t, 46*2882Svi117747 const sip_dialog_t) = NULL; 47*2882Svi117747 uint_t (*sip_stack_timeout)(void *, void (*func)(void *), 48*2882Svi117747 struct timeval *) = NULL; 49*2882Svi117747 boolean_t (*sip_stack_untimeout)(uint_t) = NULL; 50*2882Svi117747 int (*sip_stack_send)(sip_conn_object_t xonn_object, char *, int) = 51*2882Svi117747 NULL; 52*2882Svi117747 void (*sip_refhold_conn)(sip_conn_object_t) = NULL; 53*2882Svi117747 void (*sip_refrele_conn)(sip_conn_object_t) = NULL; 54*2882Svi117747 boolean_t (*sip_is_conn_stream)(sip_conn_object_t) = NULL; 55*2882Svi117747 boolean_t (*sip_is_conn_reliable)(sip_conn_object_t) = NULL; 56*2882Svi117747 int (*sip_conn_rem_addr)(sip_conn_object_t, struct sockaddr *, 57*2882Svi117747 socklen_t *) = NULL; 58*2882Svi117747 int (*sip_conn_local_addr)(sip_conn_object_t, struct sockaddr *, 59*2882Svi117747 socklen_t *) = NULL; 60*2882Svi117747 int (*sip_conn_transport)(sip_conn_object_t) = NULL; 61*2882Svi117747 int (*sip_conn_timer1)(sip_conn_object_t) = NULL; 62*2882Svi117747 int (*sip_conn_timer2)(sip_conn_object_t) = NULL; 63*2882Svi117747 int (*sip_conn_timer4)(sip_conn_object_t) = NULL; 64*2882Svi117747 int (*sip_conn_timerd)(sip_conn_object_t) = NULL; 65*2882Svi117747 66*2882Svi117747 boolean_t sip_manage_dialog = B_FALSE; 67*2882Svi117747 68*2882Svi117747 uint64_t sip_hash_salt = 0; 69*2882Svi117747 70*2882Svi117747 /* 71*2882Svi117747 * Defaults, overridden by configured values, if any 72*2882Svi117747 */ 73*2882Svi117747 int sip_timer_T1 = SIP_TIMER_T1; 74*2882Svi117747 int sip_timer_T2 = SIP_TIMER_T2; 75*2882Svi117747 int sip_timer_T4 = SIP_TIMER_T4; 76*2882Svi117747 int sip_timer_TD = 32 * SIP_SECONDS; 77*2882Svi117747 78*2882Svi117747 /* 79*2882Svi117747 * list of sent-by values registered by the UA 80*2882Svi117747 */ 81*2882Svi117747 sent_by_list_t *sip_sent_by = NULL; 82*2882Svi117747 int sip_sent_by_count = 0; 83*2882Svi117747 pthread_mutex_t sip_sent_by_lock; 84*2882Svi117747 85*2882Svi117747 /* 86*2882Svi117747 * Create and send an error response 87*2882Svi117747 */ 88*2882Svi117747 static void 89*2882Svi117747 sip_send_resp(sip_conn_object_t conn_obj, _sip_msg_t *sip_msg, int resp) 90*2882Svi117747 { 91*2882Svi117747 _sip_msg_t *sip_msg_resp; 92*2882Svi117747 93*2882Svi117747 sip_msg_resp = (_sip_msg_t *)sip_create_response((sip_msg_t)sip_msg, 94*2882Svi117747 resp, sip_get_resp_desc(resp), NULL, NULL); 95*2882Svi117747 if (sip_msg_resp == NULL) { 96*2882Svi117747 /* 97*2882Svi117747 * Message was too bad to even create a 98*2882Svi117747 * response. Just drop the messge. 99*2882Svi117747 */ 100*2882Svi117747 return; 101*2882Svi117747 } 102*2882Svi117747 /* 103*2882Svi117747 * We directly send it to the transport here. 104*2882Svi117747 */ 105*2882Svi117747 if (sip_adjust_msgbuf(sip_msg_resp) != 0) { 106*2882Svi117747 sip_free_msg((sip_msg_t)sip_msg_resp); 107*2882Svi117747 return; 108*2882Svi117747 } 109*2882Svi117747 (void) sip_stack_send(conn_obj, sip_msg_resp->sip_msg_buf, 110*2882Svi117747 sip_msg_resp->sip_msg_len); 111*2882Svi117747 sip_free_msg((sip_msg_t)sip_msg_resp); 112*2882Svi117747 } 113*2882Svi117747 114*2882Svi117747 /* 115*2882Svi117747 * Validate some of the common headers 116*2882Svi117747 */ 117*2882Svi117747 boolean_t 118*2882Svi117747 sip_check_common_headers(sip_conn_object_t conn_obj, _sip_msg_t *sip_msg) 119*2882Svi117747 { 120*2882Svi117747 int err; 121*2882Svi117747 122*2882Svi117747 if (sip_get_to_uri_str((sip_msg_t)sip_msg, &err) == NULL) 123*2882Svi117747 goto error; 124*2882Svi117747 if (sip_get_from_uri_str((sip_msg_t)sip_msg, &err) == NULL) 125*2882Svi117747 goto error; 126*2882Svi117747 if (sip_get_callseq_num((sip_msg_t)sip_msg, &err) < 0) 127*2882Svi117747 goto error; 128*2882Svi117747 if (sip_get_callid((sip_msg_t)sip_msg, &err) == NULL) 129*2882Svi117747 goto error; 130*2882Svi117747 return (B_FALSE); 131*2882Svi117747 error: 132*2882Svi117747 sip_send_resp(conn_obj, sip_msg, SIP_BAD_REQUEST); 133*2882Svi117747 return (B_TRUE); 134*2882Svi117747 } 135*2882Svi117747 136*2882Svi117747 /* 137*2882Svi117747 * setup pointers to where the headers are. 138*2882Svi117747 */ 139*2882Svi117747 static int 140*2882Svi117747 sip_setup_header_pointers(_sip_msg_t *sip_msg) 141*2882Svi117747 { 142*2882Svi117747 char *msg; 143*2882Svi117747 _sip_header_t *sip_msg_header; 144*2882Svi117747 char *end; 145*2882Svi117747 146*2882Svi117747 msg = sip_msg->sip_msg_buf; 147*2882Svi117747 end = sip_msg->sip_msg_buf + sip_msg->sip_msg_len; 148*2882Svi117747 /* 149*2882Svi117747 * Skip while space. 150*2882Svi117747 */ 151*2882Svi117747 while (isspace(*msg)) { 152*2882Svi117747 if (msg < end) 153*2882Svi117747 msg++; 154*2882Svi117747 else 155*2882Svi117747 return (EINVAL); 156*2882Svi117747 } 157*2882Svi117747 158*2882Svi117747 /* 159*2882Svi117747 * We consider Request and Response line as a header 160*2882Svi117747 */ 161*2882Svi117747 for (;;) { 162*2882Svi117747 /* 163*2882Svi117747 * Skip CRLF 164*2882Svi117747 */ 165*2882Svi117747 if (strncmp(SIP_CRLF, msg, strlen(SIP_CRLF)) == 0) { 166*2882Svi117747 if (sip_msg->sip_msg_headers_end != NULL) { 167*2882Svi117747 SKIP_CRLF(msg); 168*2882Svi117747 sip_msg->sip_msg_headers_end->sip_hdr_end = msg; 169*2882Svi117747 } 170*2882Svi117747 /* 171*2882Svi117747 * Start of a header. 172*2882Svi117747 * Check for empty line. 173*2882Svi117747 */ 174*2882Svi117747 if (strncmp(SIP_CRLF, msg, strlen(SIP_CRLF)) == 0) { 175*2882Svi117747 /* 176*2882Svi117747 * empty line, start of content. 177*2882Svi117747 */ 178*2882Svi117747 SKIP_CRLF(msg); 179*2882Svi117747 sip_msg->sip_msg_headers_end->sip_hdr_end = msg; 180*2882Svi117747 break; 181*2882Svi117747 } 182*2882Svi117747 /* 183*2882Svi117747 * store start of header. 184*2882Svi117747 */ 185*2882Svi117747 sip_msg_header = calloc(1, sizeof (_sip_header_t)); 186*2882Svi117747 if (sip_msg_header == NULL) 187*2882Svi117747 return (EINVAL); 188*2882Svi117747 sip_msg_header->sip_hdr_start = msg; 189*2882Svi117747 sip_msg_header->sip_hdr_current = msg; 190*2882Svi117747 sip_msg_header->sip_hdr_allocated = B_FALSE; 191*2882Svi117747 sip_msg_header->sip_hdr_prev = 192*2882Svi117747 sip_msg->sip_msg_headers_end; 193*2882Svi117747 sip_msg_header->sip_hdr_next = NULL; 194*2882Svi117747 sip_msg_header->sip_hdr_sipmsg = sip_msg; 195*2882Svi117747 sip_msg->sip_msg_headers_end->sip_hdr_next = 196*2882Svi117747 sip_msg_header; 197*2882Svi117747 sip_msg->sip_msg_headers_end = sip_msg_header; 198*2882Svi117747 } else { 199*2882Svi117747 if (sip_msg->sip_msg_headers_start == NULL) { 200*2882Svi117747 /* 201*2882Svi117747 * Allocate first header structure. 202*2882Svi117747 */ 203*2882Svi117747 sip_msg_header = calloc(1, 204*2882Svi117747 sizeof (_sip_header_t)); 205*2882Svi117747 if (sip_msg_header == NULL) 206*2882Svi117747 return (EINVAL); 207*2882Svi117747 sip_msg_header->sip_hdr_allocated = B_FALSE; 208*2882Svi117747 sip_msg_header->sip_hdr_start = msg; 209*2882Svi117747 sip_msg_header->sip_hdr_current = msg; 210*2882Svi117747 sip_msg_header->sip_hdr_sipmsg = sip_msg; 211*2882Svi117747 sip_msg->sip_msg_headers_start = sip_msg_header; 212*2882Svi117747 sip_msg->sip_msg_headers_end = sip_msg_header; 213*2882Svi117747 } 214*2882Svi117747 msg++; 215*2882Svi117747 } 216*2882Svi117747 /* 217*2882Svi117747 * We have reached the end without hitting the empty line. 218*2882Svi117747 */ 219*2882Svi117747 if (msg - sip_msg->sip_msg_buf >= sip_msg->sip_msg_len) 220*2882Svi117747 return (EINVAL); 221*2882Svi117747 } 222*2882Svi117747 223*2882Svi117747 if (sip_msg->sip_msg_headers_start == NULL) 224*2882Svi117747 return (EPROTO); 225*2882Svi117747 226*2882Svi117747 /* 227*2882Svi117747 * Move start line to be a separate line. 228*2882Svi117747 */ 229*2882Svi117747 sip_msg->sip_msg_start_line = sip_msg->sip_msg_headers_start; 230*2882Svi117747 sip_msg->sip_msg_headers_start = 231*2882Svi117747 sip_msg->sip_msg_headers_start->sip_hdr_next; 232*2882Svi117747 sip_msg->sip_msg_start_line->sip_hdr_prev = NULL; 233*2882Svi117747 sip_msg->sip_msg_start_line->sip_hdr_next = NULL; 234*2882Svi117747 235*2882Svi117747 if (sip_msg->sip_msg_headers_start == NULL) 236*2882Svi117747 return (EINVAL); 237*2882Svi117747 sip_msg->sip_msg_headers_start->sip_hdr_prev = NULL; 238*2882Svi117747 239*2882Svi117747 240*2882Svi117747 /* 241*2882Svi117747 * Deal with content. 242*2882Svi117747 */ 243*2882Svi117747 sip_msg->sip_msg_content = calloc(1, sizeof (sip_content_t)); 244*2882Svi117747 sip_msg->sip_msg_content->sip_content_start = msg; 245*2882Svi117747 sip_msg->sip_msg_content->sip_content_end = sip_msg->sip_msg_buf + 246*2882Svi117747 sip_msg->sip_msg_len; 247*2882Svi117747 sip_msg->sip_msg_content->sip_content_allocated = B_FALSE; 248*2882Svi117747 sip_msg->sip_msg_content_len = 249*2882Svi117747 sip_msg->sip_msg_content->sip_content_end - 250*2882Svi117747 sip_msg->sip_msg_content->sip_content_start; 251*2882Svi117747 return (0); 252*2882Svi117747 } 253*2882Svi117747 254*2882Svi117747 /* 255*2882Svi117747 * The send interface to the sip stack. Used by upper layers. 256*2882Svi117747 */ 257*2882Svi117747 int 258*2882Svi117747 sip_sendmsg(sip_conn_object_t obj, sip_msg_t sip_msg, sip_dialog_t dialog, 259*2882Svi117747 uint32_t flags) 260*2882Svi117747 { 261*2882Svi117747 sip_xaction_t *sip_trans = NULL; 262*2882Svi117747 int ret = 0; 263*2882Svi117747 sip_message_type_t *sip_msg_info; 264*2882Svi117747 _sip_msg_t *_sip_msg; 265*2882Svi117747 boolean_t stateful = flags & SIP_SEND_STATEFUL; 266*2882Svi117747 boolean_t dlg_on_fork = flags & SIP_DIALOG_ON_FORK; 267*2882Svi117747 268*2882Svi117747 sip_refhold_conn(obj); 269*2882Svi117747 270*2882Svi117747 _sip_msg = (_sip_msg_t *)sip_msg; 271*2882Svi117747 if ((ret = sip_adjust_msgbuf(_sip_msg)) != 0) { 272*2882Svi117747 sip_refrele_conn(obj); 273*2882Svi117747 return (ret); 274*2882Svi117747 } 275*2882Svi117747 276*2882Svi117747 assert(_sip_msg->sip_msg_req_res != NULL); 277*2882Svi117747 sip_msg_info = _sip_msg->sip_msg_req_res; 278*2882Svi117747 /* 279*2882Svi117747 * Send it statefully if: 280*2882Svi117747 * if stateful is set in 'flags' AND 281*2882Svi117747 * this is not an ACK request, if it is a request (should the upper 282*2882Svi117747 * layer set stateful in the latter case?, i.e is the check 283*2882Svi117747 * necessary here?) 284*2882Svi117747 */ 285*2882Svi117747 if (stateful && (!sip_msg_info->is_request || 286*2882Svi117747 sip_msg_info->sip_req_method != ACK)) { 287*2882Svi117747 sip_trans = (sip_xaction_t *)sip_xaction_get(obj, sip_msg, 288*2882Svi117747 B_TRUE, sip_msg_info->is_request ? SIP_CLIENT_TRANSACTION : 289*2882Svi117747 SIP_SERVER_TRANSACTION, &ret); 290*2882Svi117747 if (sip_trans == NULL) { 291*2882Svi117747 sip_refrele_conn(obj); 292*2882Svi117747 return (ret); 293*2882Svi117747 } 294*2882Svi117747 ret = sip_xaction_output(obj, sip_trans, _sip_msg); 295*2882Svi117747 SIP_XACTION_REFCNT_DECR(sip_trans); 296*2882Svi117747 if (ret != 0) { 297*2882Svi117747 sip_refrele_conn(obj); 298*2882Svi117747 return (ret); 299*2882Svi117747 } 300*2882Svi117747 } 301*2882Svi117747 /* 302*2882Svi117747 * If the appln wants us to create the dialog, create a partial 303*2882Svi117747 * dialog at this stage, when we get the response, we will 304*2882Svi117747 * complete it. 305*2882Svi117747 */ 306*2882Svi117747 if (sip_manage_dialog) { 307*2882Svi117747 if (sip_msg_info->is_request && dialog == NULL) { 308*2882Svi117747 dialog = (sip_dialog_t)sip_seed_dialog(obj, sip_msg, 309*2882Svi117747 dlg_on_fork, SIP_UAC_DIALOG); 310*2882Svi117747 } else if (dialog != NULL && (!sip_msg_info->is_request || 311*2882Svi117747 sip_msg_info->sip_req_method == NOTIFY)) { 312*2882Svi117747 (void) sip_update_dialog(dialog, _sip_msg); 313*2882Svi117747 } 314*2882Svi117747 } 315*2882Svi117747 316*2882Svi117747 if ((ret = sip_stack_send(obj, _sip_msg->sip_msg_buf, 317*2882Svi117747 _sip_msg->sip_msg_len)) != 0) { 318*2882Svi117747 if (sip_trans != NULL) { 319*2882Svi117747 sip_xaction_terminate(sip_trans, _sip_msg, 320*2882Svi117747 sip_conn_transport(obj)); 321*2882Svi117747 } 322*2882Svi117747 sip_refrele_conn(obj); 323*2882Svi117747 return (ret); 324*2882Svi117747 } 325*2882Svi117747 sip_refrele_conn(obj); 326*2882Svi117747 return (ret); 327*2882Svi117747 } 328*2882Svi117747 329*2882Svi117747 /* 330*2882Svi117747 * Given a sent-by value check if it is in the registered list. If no values 331*2882Svi117747 * have been registered, the check passes. 332*2882Svi117747 */ 333*2882Svi117747 static boolean_t 334*2882Svi117747 sip_sent_by_registered(const sip_str_t *sb_val) 335*2882Svi117747 { 336*2882Svi117747 sent_by_list_t *sb; 337*2882Svi117747 int count = 0; 338*2882Svi117747 339*2882Svi117747 (void) pthread_mutex_lock(&sip_sent_by_lock); 340*2882Svi117747 if (sip_sent_by == NULL) { 341*2882Svi117747 (void) pthread_mutex_unlock(&sip_sent_by_lock); 342*2882Svi117747 return (B_TRUE); 343*2882Svi117747 } 344*2882Svi117747 sb = sip_sent_by; 345*2882Svi117747 for (count = 0; count < sip_sent_by_count; count++) { 346*2882Svi117747 if (strncasecmp(sb->sb_val, sb_val->sip_str_ptr, 347*2882Svi117747 sb_val->sip_str_len) == 0) { 348*2882Svi117747 (void) pthread_mutex_unlock(&sip_sent_by_lock); 349*2882Svi117747 return (B_TRUE); 350*2882Svi117747 } 351*2882Svi117747 sb = sb->sb_next; 352*2882Svi117747 } 353*2882Svi117747 (void) pthread_mutex_unlock(&sip_sent_by_lock); 354*2882Svi117747 return (B_FALSE); 355*2882Svi117747 } 356*2882Svi117747 357*2882Svi117747 /* 358*2882Svi117747 * Given a response, check if the sent-by in the VIA header is valid. 359*2882Svi117747 */ 360*2882Svi117747 boolean_t 361*2882Svi117747 sip_valid_sent_by(sip_msg_t sip_msg) 362*2882Svi117747 { 363*2882Svi117747 sip_header_t via; 364*2882Svi117747 sip_header_value_t value = NULL; 365*2882Svi117747 int error; 366*2882Svi117747 const sip_str_t *sent_by = NULL; 367*2882Svi117747 368*2882Svi117747 via = (sip_header_t)sip_get_header(sip_msg, SIP_VIA, NULL, &error); 369*2882Svi117747 if (via == NULL || error != 0) 370*2882Svi117747 return (B_TRUE); 371*2882Svi117747 value = (sip_header_value_t)sip_get_header_value(via, &error); 372*2882Svi117747 if (value == NULL || error != 0) 373*2882Svi117747 return (B_TRUE); 374*2882Svi117747 sent_by = sip_get_via_sent_by_host(value, &error); 375*2882Svi117747 if (sent_by == NULL || error != 0) 376*2882Svi117747 return (B_TRUE); 377*2882Svi117747 if (sip_sent_by_registered(sent_by)) 378*2882Svi117747 return (B_TRUE); 379*2882Svi117747 return (B_FALSE); 380*2882Svi117747 } 381*2882Svi117747 382*2882Svi117747 383*2882Svi117747 /* 384*2882Svi117747 * The receive interface to the transport layer. 385*2882Svi117747 */ 386*2882Svi117747 void 387*2882Svi117747 sip_process_new_packet(sip_conn_object_t conn_object, void *msgstr, 388*2882Svi117747 size_t msglen) 389*2882Svi117747 { 390*2882Svi117747 _sip_msg_t *sip_msg; 391*2882Svi117747 sip_message_type_t *sip_msg_info; 392*2882Svi117747 sip_xaction_t *sip_trans; 393*2882Svi117747 sip_dialog_t dialog = NULL; 394*2882Svi117747 boolean_t dialog_created = B_FALSE; 395*2882Svi117747 int transport; 396*2882Svi117747 char *msgbuf = NULL; 397*2882Svi117747 398*2882Svi117747 sip_refhold_conn(conn_object); 399*2882Svi117747 transport = sip_conn_transport(conn_object); 400*2882Svi117747 if (transport == IPPROTO_TCP) { 401*2882Svi117747 next_msg: 402*2882Svi117747 msgstr = (char *)sip_get_tcp_msg(conn_object, (char *)msgstr, 403*2882Svi117747 &msglen); 404*2882Svi117747 if (msgstr == NULL) { 405*2882Svi117747 sip_refrele_conn(conn_object); 406*2882Svi117747 return; 407*2882Svi117747 } 408*2882Svi117747 } else { 409*2882Svi117747 msgbuf = (char *)malloc(msglen + 1); 410*2882Svi117747 if (msgbuf == NULL) { 411*2882Svi117747 sip_refrele_conn(conn_object); 412*2882Svi117747 return; 413*2882Svi117747 } 414*2882Svi117747 (void) strncpy(msgbuf, msgstr, msglen); 415*2882Svi117747 msgbuf[msglen] = '\0'; 416*2882Svi117747 msgstr = msgbuf; 417*2882Svi117747 } 418*2882Svi117747 sip_msg = (_sip_msg_t *)sip_new_msg(); 419*2882Svi117747 if (sip_msg == NULL) { 420*2882Svi117747 if (msgbuf != NULL) 421*2882Svi117747 free(msgbuf); 422*2882Svi117747 sip_refrele_conn(conn_object); 423*2882Svi117747 return; 424*2882Svi117747 } 425*2882Svi117747 sip_msg->sip_msg_buf = (char *)msgstr; 426*2882Svi117747 sip_msg->sip_msg_len = msglen; 427*2882Svi117747 (void) pthread_mutex_lock(&sip_msg->sip_msg_mutex); 428*2882Svi117747 if (sip_setup_header_pointers(sip_msg) != 0) { 429*2882Svi117747 (void) pthread_mutex_unlock(&sip_msg->sip_msg_mutex); 430*2882Svi117747 sip_refrele_conn(conn_object); 431*2882Svi117747 sip_free_msg((sip_msg_t)sip_msg); 432*2882Svi117747 return; 433*2882Svi117747 } 434*2882Svi117747 if (sip_parse_first_line(sip_msg->sip_msg_start_line, 435*2882Svi117747 &sip_msg->sip_msg_req_res)) { 436*2882Svi117747 (void) pthread_mutex_unlock(&sip_msg->sip_msg_mutex); 437*2882Svi117747 sip_refrele_conn(conn_object); 438*2882Svi117747 sip_free_msg((sip_msg_t)sip_msg); 439*2882Svi117747 return; 440*2882Svi117747 } 441*2882Svi117747 sip_msg_info = sip_msg->sip_msg_req_res; 442*2882Svi117747 (void) pthread_mutex_unlock(&sip_msg->sip_msg_mutex); 443*2882Svi117747 444*2882Svi117747 if (sip_check_common_headers(conn_object, sip_msg)) { 445*2882Svi117747 sip_refrele_conn(conn_object); 446*2882Svi117747 sip_free_msg((sip_msg_t)sip_msg); 447*2882Svi117747 return; 448*2882Svi117747 } 449*2882Svi117747 450*2882Svi117747 /* 451*2882Svi117747 * Silently discard the response if the top VIA has a sent-by value AND 452*2882Svi117747 * the UA has registered sent-by values AND the one in the VIA is 453*2882Svi117747 * not part of the registerd sent-by values. 454*2882Svi117747 */ 455*2882Svi117747 if (!sip_msg_info->is_request && !sip_valid_sent_by(sip_msg)) { 456*2882Svi117747 sip_refrele_conn(conn_object); 457*2882Svi117747 sip_free_msg((sip_msg_t)sip_msg); 458*2882Svi117747 return; 459*2882Svi117747 460*2882Svi117747 } 461*2882Svi117747 sip_trans = (sip_xaction_t *)sip_xaction_get(conn_object, 462*2882Svi117747 (sip_msg_t)sip_msg, 463*2882Svi117747 B_FALSE, sip_msg_info->is_request ? SIP_SERVER_TRANSACTION : 464*2882Svi117747 SIP_CLIENT_TRANSACTION, NULL); 465*2882Svi117747 if (sip_trans != NULL) { 466*2882Svi117747 if (sip_xaction_input(conn_object, sip_trans, &sip_msg) != 0) { 467*2882Svi117747 SIP_XACTION_REFCNT_DECR(sip_trans); 468*2882Svi117747 sip_refrele_conn(conn_object); 469*2882Svi117747 sip_free_msg((sip_msg_t)sip_msg); 470*2882Svi117747 return; 471*2882Svi117747 } 472*2882Svi117747 SIP_XACTION_REFCNT_DECR(sip_trans); 473*2882Svi117747 474*2882Svi117747 /* 475*2882Svi117747 * msg was retransmission - handled by the transaction 476*2882Svi117747 */ 477*2882Svi117747 if (sip_msg == NULL) 478*2882Svi117747 goto check_next; 479*2882Svi117747 } else { 480*2882Svi117747 /* 481*2882Svi117747 * If we are getting an INVITE request, let us send a 482*2882Svi117747 * 100 TRYING response here, as in 17.2.1: 483*2882Svi117747 * "The server transaction MUST generate a 100 (Trying) 484*2882Svi117747 * response unless it knows that the TU will generate a 485*2882Svi117747 * provisional or final response within 200 ms". 486*2882Svi117747 */ 487*2882Svi117747 if (sip_msg_info->is_request && 488*2882Svi117747 sip_msg_info->sip_req_method == INVITE) { 489*2882Svi117747 sip_send_resp(conn_object, sip_msg, SIP_TRYING); 490*2882Svi117747 } 491*2882Svi117747 } 492*2882Svi117747 if (sip_manage_dialog) { 493*2882Svi117747 dialog = sip_dialog_find(sip_msg); 494*2882Svi117747 if (dialog == NULL) { 495*2882Svi117747 if (sip_msg_info->is_request) { 496*2882Svi117747 /* 497*2882Svi117747 * sip_seed_dialog will check for the 498*2882Svi117747 * method in the request 499*2882Svi117747 */ 500*2882Svi117747 dialog = (sip_dialog_t)sip_seed_dialog( 501*2882Svi117747 conn_object, sip_msg, 502*2882Svi117747 B_FALSE, SIP_UAS_DIALOG); 503*2882Svi117747 dialog_created = B_TRUE; 504*2882Svi117747 } 505*2882Svi117747 } else if (sip_incomplete_dialog(dialog)) { 506*2882Svi117747 if (!sip_msg_info->is_request || 507*2882Svi117747 sip_msg_info->sip_req_method == NOTIFY) { 508*2882Svi117747 dialog = sip_update_dialog(dialog, sip_msg); 509*2882Svi117747 } 510*2882Svi117747 } else if (sip_dialog_process(sip_msg, &dialog) != 0) { 511*2882Svi117747 if (dialog != NULL) 512*2882Svi117747 sip_release_dialog(dialog); 513*2882Svi117747 /* 514*2882Svi117747 * cseq number in error, send a 515*2882Svi117747 * SIP_SERVER_INTERNAL_ERROR response. 516*2882Svi117747 */ 517*2882Svi117747 if (sip_msg_info->is_request) { 518*2882Svi117747 sip_send_resp(conn_object, sip_msg, 519*2882Svi117747 SIP_SERVER_INTERNAL_ERROR); 520*2882Svi117747 } 521*2882Svi117747 sip_refrele_conn(conn_object); 522*2882Svi117747 sip_free_msg((sip_msg_t)sip_msg); 523*2882Svi117747 return; 524*2882Svi117747 } 525*2882Svi117747 } 526*2882Svi117747 sip_ulp_recv(conn_object, (sip_msg_t)sip_msg, dialog); 527*2882Svi117747 sip_free_msg((sip_msg_t)sip_msg); 528*2882Svi117747 if (dialog != NULL && !dialog_created) 529*2882Svi117747 sip_release_dialog(dialog); 530*2882Svi117747 check_next: 531*2882Svi117747 /* 532*2882Svi117747 * Check if there are more complete messages in the TCP fragment list 533*2882Svi117747 * to be consumed 534*2882Svi117747 */ 535*2882Svi117747 if (transport == IPPROTO_TCP) { 536*2882Svi117747 msgstr = NULL; 537*2882Svi117747 msglen = 0; 538*2882Svi117747 goto next_msg; 539*2882Svi117747 } 540*2882Svi117747 sip_refrele_conn(conn_object); 541*2882Svi117747 } 542*2882Svi117747 543*2882Svi117747 /* 544*2882Svi117747 * Initialize the stack. The connection manager functions, upper layer 545*2882Svi117747 * receive functions are mandatory. 546*2882Svi117747 */ 547*2882Svi117747 int 548*2882Svi117747 sip_stack_init(sip_stack_init_t *stack_val) 549*2882Svi117747 { 550*2882Svi117747 #ifdef __linux__ 551*2882Svi117747 struct timespec tspec; 552*2882Svi117747 #endif 553*2882Svi117747 554*2882Svi117747 /* 555*2882Svi117747 * If the stack has already been configured, return error 556*2882Svi117747 */ 557*2882Svi117747 if (sip_stack_send != NULL || 558*2882Svi117747 stack_val->sip_version != SIP_STACK_VERSION) { 559*2882Svi117747 return (EINVAL); 560*2882Svi117747 } 561*2882Svi117747 if (stack_val->sip_io_pointers == NULL || 562*2882Svi117747 stack_val->sip_ulp_pointers == NULL) { 563*2882Svi117747 return (EINVAL); 564*2882Svi117747 } 565*2882Svi117747 sip_ulp_recv = stack_val->sip_ulp_pointers->sip_ulp_recv; 566*2882Svi117747 sip_manage_dialog = stack_val->sip_stack_flags & SIP_STACK_DIALOGS; 567*2882Svi117747 568*2882Svi117747 sip_stack_send = stack_val->sip_io_pointers->sip_conn_send; 569*2882Svi117747 sip_refhold_conn = stack_val->sip_io_pointers->sip_hold_conn_object; 570*2882Svi117747 sip_refrele_conn = stack_val->sip_io_pointers->sip_rel_conn_object; 571*2882Svi117747 sip_is_conn_stream = stack_val->sip_io_pointers->sip_conn_is_stream; 572*2882Svi117747 sip_is_conn_reliable = stack_val->sip_io_pointers->sip_conn_is_reliable; 573*2882Svi117747 sip_conn_rem_addr = stack_val->sip_io_pointers->sip_conn_remote_address; 574*2882Svi117747 sip_conn_local_addr = 575*2882Svi117747 stack_val->sip_io_pointers->sip_conn_local_address; 576*2882Svi117747 sip_conn_transport = stack_val->sip_io_pointers->sip_conn_transport; 577*2882Svi117747 sip_header_function_table_external = stack_val->sip_function_table; 578*2882Svi117747 579*2882Svi117747 if (sip_ulp_recv == NULL || sip_stack_send == NULL || 580*2882Svi117747 sip_refhold_conn == NULL || sip_refrele_conn == NULL || 581*2882Svi117747 sip_is_conn_stream == NULL || sip_is_conn_reliable == NULL || 582*2882Svi117747 sip_conn_rem_addr == NULL || sip_conn_local_addr == NULL || 583*2882Svi117747 sip_conn_transport == NULL) { 584*2882Svi117747 err_ret: 585*2882Svi117747 sip_ulp_recv = NULL; 586*2882Svi117747 sip_stack_send = NULL; 587*2882Svi117747 sip_refhold_conn = NULL; 588*2882Svi117747 sip_refrele_conn = NULL; 589*2882Svi117747 sip_is_conn_stream = NULL; 590*2882Svi117747 sip_is_conn_reliable = NULL; 591*2882Svi117747 sip_conn_rem_addr = NULL; 592*2882Svi117747 sip_conn_local_addr = NULL; 593*2882Svi117747 sip_conn_transport = NULL; 594*2882Svi117747 sip_header_function_table_external = NULL; 595*2882Svi117747 sip_stack_timeout = NULL; 596*2882Svi117747 sip_stack_untimeout = NULL; 597*2882Svi117747 return (EINVAL); 598*2882Svi117747 } 599*2882Svi117747 600*2882Svi117747 sip_conn_timer1 = stack_val->sip_io_pointers->sip_conn_timer1; 601*2882Svi117747 sip_conn_timer2 = stack_val->sip_io_pointers->sip_conn_timer2; 602*2882Svi117747 sip_conn_timer4 = stack_val->sip_io_pointers->sip_conn_timer4; 603*2882Svi117747 sip_conn_timerd = stack_val->sip_io_pointers->sip_conn_timerd; 604*2882Svi117747 605*2882Svi117747 /* 606*2882Svi117747 * Use Appln timeout routines, if provided 607*2882Svi117747 */ 608*2882Svi117747 if (stack_val->sip_ulp_pointers->sip_ulp_timeout != NULL) { 609*2882Svi117747 if (stack_val->sip_ulp_pointers->sip_ulp_untimeout == NULL) 610*2882Svi117747 goto err_ret; 611*2882Svi117747 sip_stack_timeout = 612*2882Svi117747 stack_val->sip_ulp_pointers->sip_ulp_timeout; 613*2882Svi117747 sip_stack_untimeout = 614*2882Svi117747 stack_val->sip_ulp_pointers->sip_ulp_untimeout; 615*2882Svi117747 } else { 616*2882Svi117747 if (stack_val->sip_ulp_pointers->sip_ulp_untimeout != NULL) 617*2882Svi117747 goto err_ret; 618*2882Svi117747 sip_timeout_init(); 619*2882Svi117747 sip_stack_timeout = sip_timeout; 620*2882Svi117747 sip_stack_untimeout = sip_untimeout; 621*2882Svi117747 } 622*2882Svi117747 623*2882Svi117747 /* 624*2882Svi117747 * Manage Dialogs? 625*2882Svi117747 */ 626*2882Svi117747 if (sip_manage_dialog) { 627*2882Svi117747 sip_dialog_init(stack_val->sip_ulp_pointers->sip_ulp_dlg_del, 628*2882Svi117747 stack_val->sip_ulp_pointers->sip_ulp_dlg_state_cb); 629*2882Svi117747 } 630*2882Svi117747 sip_xaction_init(stack_val->sip_ulp_pointers->sip_ulp_trans_error, 631*2882Svi117747 stack_val->sip_ulp_pointers->sip_ulp_trans_state_cb); 632*2882Svi117747 633*2882Svi117747 #ifdef __linux__ 634*2882Svi117747 if (clock_gettime(CLOCK_REALTIME, &tspec) != 0) 635*2882Svi117747 goto err_ret; 636*2882Svi117747 sip_hash_salt = tspec.tv_nsec; 637*2882Svi117747 #else 638*2882Svi117747 sip_hash_salt = gethrtime(); 639*2882Svi117747 #endif 640*2882Svi117747 (void) pthread_mutex_init(&sip_sent_by_lock, NULL); 641*2882Svi117747 return (0); 642*2882Svi117747 } 643