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