xref: /illumos-gate/usr/src/lib/libsip/common/sip_miscdefs.h (revision 1da57d551424de5a9d469760be7c4b4d4f10a755)
140cb5e5dSvi117747 /*
240cb5e5dSvi117747  * CDDL HEADER START
340cb5e5dSvi117747  *
440cb5e5dSvi117747  * The contents of this file are subject to the terms of the
540cb5e5dSvi117747  * Common Development and Distribution License (the "License").
640cb5e5dSvi117747  * You may not use this file except in compliance with the License.
740cb5e5dSvi117747  *
840cb5e5dSvi117747  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
940cb5e5dSvi117747  * or http://www.opensolaris.org/os/licensing.
1040cb5e5dSvi117747  * See the License for the specific language governing permissions
1140cb5e5dSvi117747  * and limitations under the License.
1240cb5e5dSvi117747  *
1340cb5e5dSvi117747  * When distributing Covered Code, include this CDDL HEADER in each
1440cb5e5dSvi117747  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1540cb5e5dSvi117747  * If applicable, add the following below this CDDL HEADER, with the
1640cb5e5dSvi117747  * fields enclosed by brackets "[]" replaced with your own identifying
1740cb5e5dSvi117747  * information: Portions Copyright [yyyy] [name of copyright owner]
1840cb5e5dSvi117747  *
1940cb5e5dSvi117747  * CDDL HEADER END
2040cb5e5dSvi117747  */
2140cb5e5dSvi117747 
2240cb5e5dSvi117747 /*
23*943efbc3Sgm209912  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
2440cb5e5dSvi117747  * Use is subject to license terms.
2540cb5e5dSvi117747  */
2640cb5e5dSvi117747 
2740cb5e5dSvi117747 #ifndef	_SIP_MISCDEFS_H
2840cb5e5dSvi117747 #define	_SIP_MISCDEFS_H
2940cb5e5dSvi117747 
3040cb5e5dSvi117747 #ifdef	__cplusplus
3140cb5e5dSvi117747 extern "C" {
3240cb5e5dSvi117747 #endif
3340cb5e5dSvi117747 
342c2c4183Svi117747 #include <pthread.h>
3540cb5e5dSvi117747 #include <sys/types.h>
362c2c4183Svi117747 #include <sys/time.h>
37*943efbc3Sgm209912 #include <stdio.h>
3840cb5e5dSvi117747 
3940cb5e5dSvi117747 #define	SIP_CR			'\r'
4040cb5e5dSvi117747 #define	SIP_SP			' '
4140cb5e5dSvi117747 #define	SIP_HCOLON		':'
4240cb5e5dSvi117747 #define	SIP_SEMI		';'
4340cb5e5dSvi117747 #define	SIP_COMMA		','
4440cb5e5dSvi117747 #define	SIP_LAQUOT		'<'
4540cb5e5dSvi117747 #define	SIP_RAQUOT		'>'
4640cb5e5dSvi117747 #define	SIP_QUOTE		'"'
4740cb5e5dSvi117747 #define	SIP_EQUAL		'='
4840cb5e5dSvi117747 #define	SIP_SLASH		'/'
4940cb5e5dSvi117747 #define	SIP_PERIOD		'.'
5040cb5e5dSvi117747 #define	SIP_LPAR		'('
5140cb5e5dSvi117747 #define	SIP_RPAR		')'
5240cb5e5dSvi117747 
5340cb5e5dSvi117747 #define	SIP_BRANCHID_LEN	28	/* incl. the magic cookie */
5440cb5e5dSvi117747 #define	SIP_TAG_LEN		20
5540cb5e5dSvi117747 #define	SIP_URI_LEN		25
5640cb5e5dSvi117747 #define	SIP_DISPLAY_LEN		25
5740cb5e5dSvi117747 #define	SIP_DOMAIN_LEN		25
5840cb5e5dSvi117747 #define	SIP_MAX_FWDLEN		5
5940cb5e5dSvi117747 #define	SIP_TRANSPORT_LEN	5
6040cb5e5dSvi117747 #define	SIP_SIZE_OF_STATUS_CODE	3
6140cb5e5dSvi117747 #define	SIP_SPACE_LEN		sizeof (char)
6240cb5e5dSvi117747 
63*943efbc3Sgm209912 #define	SIP_TRANSACTION_LOG		0x0001
64*943efbc3Sgm209912 #define	SIP_DIALOG_LOG			0x0002
65*943efbc3Sgm209912 #define	SIP_ASSERT_ERROR		0x0004
66*943efbc3Sgm209912 
6740cb5e5dSvi117747 #define	SIP_MS			1L
6840cb5e5dSvi117747 #define	SIP_SECONDS		(1000 * SIP_MS)
6940cb5e5dSvi117747 #define	SIP_MINUTES		(60 * SIP_SECONDS)
7040cb5e5dSvi117747 #define	SIP_HOURS   		(60 * SIP_MINUTES)
7140cb5e5dSvi117747 
7240cb5e5dSvi117747 /* timer granularity is in msecs */
7340cb5e5dSvi117747 #define	SIP_TIMER_T1		(1 * SIP_SECONDS)
7440cb5e5dSvi117747 #define	SIP_TIMER_T2		(4 * SIP_SECONDS)
7540cb5e5dSvi117747 #define	SIP_TIMER_T4		(5 * SIP_SECONDS)
7640cb5e5dSvi117747 
7740cb5e5dSvi117747 #ifdef		__linux__
7840cb5e5dSvi117747 #define		SEC		1
7940cb5e5dSvi117747 #define		MILLISEC	1000
8040cb5e5dSvi117747 #define		MICROSEC	1000000
8140cb5e5dSvi117747 #define		NANOSEC		1000000000
8240cb5e5dSvi117747 
8340cb5e5dSvi117747 typedef struct timespec	timestruc_t;
8440cb5e5dSvi117747 typedef	long long	hrtime_t;
8540cb5e5dSvi117747 #endif
8640cb5e5dSvi117747 
8740cb5e5dSvi117747 extern int	sip_timer_T1;
8840cb5e5dSvi117747 extern int	sip_timer_T2;
8940cb5e5dSvi117747 extern int	sip_timer_T4;
9040cb5e5dSvi117747 extern int	sip_timer_TD;
9140cb5e5dSvi117747 
9240cb5e5dSvi117747 /* Structure for SIP timers */
9340cb5e5dSvi117747 typedef struct sip_timer_s {
9440cb5e5dSvi117747 	uint_t		sip_timerid;
9540cb5e5dSvi117747 	struct timeval	sip_timeout_val;
9640cb5e5dSvi117747 }sip_timer_t;
9740cb5e5dSvi117747 
9840cb5e5dSvi117747 /* time is in msec */
9940cb5e5dSvi117747 #define	SIP_SET_TIMEOUT(timer, time) {					\
10040cb5e5dSvi117747 	int	mtime = (time);						\
10140cb5e5dSvi117747 									\
10240cb5e5dSvi117747 	(timer).sip_timeout_val.tv_sec = mtime / MILLISEC;	\
10340cb5e5dSvi117747 	mtime -= (timer).sip_timeout_val.tv_sec * MILLISEC;	\
10440cb5e5dSvi117747 	(timer).sip_timeout_val.tv_usec = mtime * MILLISEC;		\
10540cb5e5dSvi117747 }
10640cb5e5dSvi117747 
10740cb5e5dSvi117747 /* time is in msec */
10840cb5e5dSvi117747 #define	SIP_INIT_TIMER(timer, time) {				\
10940cb5e5dSvi117747 	SIP_SET_TIMEOUT(timer, time);				\
11040cb5e5dSvi117747 	(timer).sip_timerid = 0;				\
11140cb5e5dSvi117747 }
11240cb5e5dSvi117747 
11340cb5e5dSvi117747 #define	SIP_SCHED_TIMER(timer, obj, func) {			\
11440cb5e5dSvi117747 	(timer).sip_timerid = sip_stack_timeout((void *)(obj),	\
11540cb5e5dSvi117747 	    (func), &((timer).sip_timeout_val));			\
11640cb5e5dSvi117747 }
11740cb5e5dSvi117747 
11840cb5e5dSvi117747 #define	SIP_CANCEL_TIMER(timer) {				\
11940cb5e5dSvi117747 	if ((timer).sip_timerid != 0) {				\
12040cb5e5dSvi117747 		sip_stack_untimeout((timer).sip_timerid);	\
12140cb5e5dSvi117747 		(timer).sip_timerid = 0;			\
12240cb5e5dSvi117747 	}							\
12340cb5e5dSvi117747 }
12440cb5e5dSvi117747 
12540cb5e5dSvi117747 /* returned time is in msec */
12640cb5e5dSvi117747 #define	SIP_GET_TIMEOUT(timer)					\
12740cb5e5dSvi117747 	((timer).sip_timeout_val.tv_sec * MILLISEC +		\
12840cb5e5dSvi117747 	(timer).sip_timeout_val.tv_usec / MILLISEC)
12940cb5e5dSvi117747 
13040cb5e5dSvi117747 #define	SIP_IS_TIMER_RUNNING(timer)	((timer).sip_timerid != 0)
13140cb5e5dSvi117747 
132*943efbc3Sgm209912 #define	SIP_UPDATE_COUNTERS(is_request, method, resp_code, outbound, size) {   \
133*943efbc3Sgm209912 	(void) pthread_mutex_lock(&sip_counters.sip_counter_mutex);	       \
134*943efbc3Sgm209912 	if (sip_counters.enabled) {					       \
135*943efbc3Sgm209912 		(void) sip_measure_traffic((is_request), (method), (resp_code),\
136*943efbc3Sgm209912 		    (outbound), (size));				       \
137*943efbc3Sgm209912 	}								       \
138*943efbc3Sgm209912 	(void) pthread_mutex_unlock(&sip_counters.sip_counter_mutex);	       \
139*943efbc3Sgm209912 }
140*943efbc3Sgm209912 
14140cb5e5dSvi117747 /* This is the transaction list */
14240cb5e5dSvi117747 typedef struct sip_conn_cache_s {
14340cb5e5dSvi117747 	void			*obj;
14440cb5e5dSvi117747 	struct sip_conn_cache_s	*next;
14540cb5e5dSvi117747 	struct sip_conn_cache_s	*prev;
14640cb5e5dSvi117747 } sip_conn_cache_t;
14740cb5e5dSvi117747 
14840cb5e5dSvi117747 /* TCP fragment entry */
14940cb5e5dSvi117747 typedef struct sip_reass_entry_s {
15040cb5e5dSvi117747 	char		*sip_reass_msg;
15140cb5e5dSvi117747 	int		sip_reass_msglen;
15240cb5e5dSvi117747 }sip_reass_entry_t;
15340cb5e5dSvi117747 
15440cb5e5dSvi117747 /* Library data in stored in connection object */
15540cb5e5dSvi117747 typedef struct sip_conn_obj_pvt_s {
15640cb5e5dSvi117747 	sip_reass_entry_t	*sip_conn_obj_reass;
15740cb5e5dSvi117747 	pthread_mutex_t		sip_conn_obj_reass_lock;
15840cb5e5dSvi117747 	sip_conn_cache_t	*sip_conn_obj_cache;
15940cb5e5dSvi117747 	pthread_mutex_t		sip_conn_obj_cache_lock;
16040cb5e5dSvi117747 } sip_conn_obj_pvt_t;
16140cb5e5dSvi117747 
162*943efbc3Sgm209912 /* SIP traffic counters structure */
163*943efbc3Sgm209912 
164*943efbc3Sgm209912 typedef struct sip_traffic_counters_s {
165*943efbc3Sgm209912 	boolean_t	enabled;
166*943efbc3Sgm209912 	time_t		starttime;
167*943efbc3Sgm209912 	time_t		stoptime;
168*943efbc3Sgm209912 	uint64_t	sip_total_bytes_rcvd;
169*943efbc3Sgm209912 	uint64_t	sip_total_bytes_sent;
170*943efbc3Sgm209912 	uint64_t	sip_total_req_rcvd;
171*943efbc3Sgm209912 	uint64_t	sip_total_req_sent;
172*943efbc3Sgm209912 	uint64_t	sip_total_resp_rcvd;
173*943efbc3Sgm209912 	uint64_t	sip_total_resp_sent;
174*943efbc3Sgm209912 	uint64_t	sip_ack_req_rcvd;
175*943efbc3Sgm209912 	uint64_t	sip_ack_req_sent;
176*943efbc3Sgm209912 	uint64_t	sip_bye_req_rcvd;
177*943efbc3Sgm209912 	uint64_t	sip_bye_req_sent;
178*943efbc3Sgm209912 	uint64_t	sip_cancel_req_rcvd;
179*943efbc3Sgm209912 	uint64_t	sip_cancel_req_sent;
180*943efbc3Sgm209912 	uint64_t	sip_info_req_rcvd;
181*943efbc3Sgm209912 	uint64_t	sip_info_req_sent;
182*943efbc3Sgm209912 	uint64_t	sip_invite_req_rcvd;
183*943efbc3Sgm209912 	uint64_t	sip_invite_req_sent;
184*943efbc3Sgm209912 	uint64_t	sip_notify_req_rcvd;
185*943efbc3Sgm209912 	uint64_t	sip_notify_req_sent;
186*943efbc3Sgm209912 	uint64_t	sip_options_req_rcvd;
187*943efbc3Sgm209912 	uint64_t	sip_options_req_sent;
188*943efbc3Sgm209912 	uint64_t	sip_prack_req_rcvd;
189*943efbc3Sgm209912 	uint64_t	sip_prack_req_sent;
190*943efbc3Sgm209912 	uint64_t	sip_refer_req_rcvd;
191*943efbc3Sgm209912 	uint64_t	sip_refer_req_sent;
192*943efbc3Sgm209912 	uint64_t	sip_register_req_rcvd;
193*943efbc3Sgm209912 	uint64_t	sip_register_req_sent;
194*943efbc3Sgm209912 	uint64_t	sip_subscribe_req_rcvd;
195*943efbc3Sgm209912 	uint64_t	sip_subscribe_req_sent;
196*943efbc3Sgm209912 	uint64_t	sip_update_req_rcvd;
197*943efbc3Sgm209912 	uint64_t	sip_update_req_sent;
198*943efbc3Sgm209912 	uint64_t	sip_1xx_resp_rcvd;
199*943efbc3Sgm209912 	uint64_t	sip_1xx_resp_sent;
200*943efbc3Sgm209912 	uint64_t	sip_2xx_resp_rcvd;
201*943efbc3Sgm209912 	uint64_t	sip_2xx_resp_sent;
202*943efbc3Sgm209912 	uint64_t	sip_3xx_resp_rcvd;
203*943efbc3Sgm209912 	uint64_t	sip_3xx_resp_sent;
204*943efbc3Sgm209912 	uint64_t	sip_4xx_resp_rcvd;
205*943efbc3Sgm209912 	uint64_t	sip_4xx_resp_sent;
206*943efbc3Sgm209912 	uint64_t	sip_5xx_resp_rcvd;
207*943efbc3Sgm209912 	uint64_t	sip_5xx_resp_sent;
208*943efbc3Sgm209912 	uint64_t	sip_6xx_resp_rcvd;
209*943efbc3Sgm209912 	uint64_t	sip_6xx_resp_sent;
210*943efbc3Sgm209912 	pthread_mutex_t	sip_counter_mutex; /* Mutex should be always at end */
211*943efbc3Sgm209912 } sip_traffic_counters_t;
212*943efbc3Sgm209912 
213*943efbc3Sgm209912 /* SIP logfile structure */
214*943efbc3Sgm209912 typedef struct sip_logfile_s {
215*943efbc3Sgm209912 	boolean_t	sip_logging_enabled;
216*943efbc3Sgm209912 	FILE		*sip_logfile;
217*943efbc3Sgm209912 	pthread_mutex_t	sip_logfile_mutex;
218*943efbc3Sgm209912 } sip_logfile_t;
219*943efbc3Sgm209912 
220*943efbc3Sgm209912 typedef struct sip_msg_chain_s {
221*943efbc3Sgm209912 	char			*sip_msg;
222*943efbc3Sgm209912 	int			msg_seq;
223*943efbc3Sgm209912 	time_t			msg_timestamp;
224*943efbc3Sgm209912 	struct sip_msg_chain_s *next;
225*943efbc3Sgm209912 }sip_msg_chain_t;
226*943efbc3Sgm209912 
227*943efbc3Sgm209912 typedef struct sip_log_s {
228*943efbc3Sgm209912 	sip_msg_chain_t	*sip_msgs;
229*943efbc3Sgm209912 	int		sip_msgcnt;
230*943efbc3Sgm209912 }sip_log_t;
231*943efbc3Sgm209912 
232*943efbc3Sgm209912 extern sip_traffic_counters_t sip_counters;
233*943efbc3Sgm209912 
234*943efbc3Sgm209912 extern sip_logfile_t trans_log;
235*943efbc3Sgm209912 extern sip_logfile_t dialog_log;
236*943efbc3Sgm209912 
23740cb5e5dSvi117747 extern boolean_t sip_manage_dialog;
23840cb5e5dSvi117747 
23940cb5e5dSvi117747 /* To salt the hash function */
24040cb5e5dSvi117747 extern uint64_t	sip_hash_salt;
24140cb5e5dSvi117747 
24240cb5e5dSvi117747 extern void		sip_timeout_init();
24340cb5e5dSvi117747 extern uint_t		sip_timeout(void *, void (*)(void *), struct timeval *);
24440cb5e5dSvi117747 extern boolean_t	sip_untimeout(uint_t);
24540cb5e5dSvi117747 extern void		sip_md5_hash(char *, int, char *, int, char *, int,
24640cb5e5dSvi117747 			    char *, int, char *, int, char *, int, uchar_t *);
247*943efbc3Sgm209912 extern void		sip_measure_traffic(boolean_t, sip_method_t, int,
248*943efbc3Sgm209912 			    boolean_t, int);
249*943efbc3Sgm209912 extern void		sip_add_log(sip_log_t *, sip_msg_t, int, int);
250*943efbc3Sgm209912 extern void		sip_write_to_log(void *, int, char *, int);
25140cb5e5dSvi117747 
25240cb5e5dSvi117747 #ifdef	__cplusplus
25340cb5e5dSvi117747 }
25440cb5e5dSvi117747 #endif
25540cb5e5dSvi117747 
25640cb5e5dSvi117747 #endif	/* _SIP_MISCDEFS_H */
257