140cb5e5dSvi /* 240cb5e5dSvi * CDDL HEADER START 340cb5e5dSvi * 440cb5e5dSvi * The contents of this file are subject to the terms of the 540cb5e5dSvi * Common Development and Distribution License (the "License"). 640cb5e5dSvi * You may not use this file except in compliance with the License. 740cb5e5dSvi * 840cb5e5dSvi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 940cb5e5dSvi * or http://www.opensolaris.org/os/licensing. 1040cb5e5dSvi * See the License for the specific language governing permissions 1140cb5e5dSvi * and limitations under the License. 1240cb5e5dSvi * 1340cb5e5dSvi * When distributing Covered Code, include this CDDL HEADER in each 1440cb5e5dSvi * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1540cb5e5dSvi * If applicable, add the following below this CDDL HEADER, with the 1640cb5e5dSvi * fields enclosed by brackets "[]" replaced with your own identifying 1740cb5e5dSvi * information: Portions Copyright [yyyy] [name of copyright owner] 1840cb5e5dSvi * 1940cb5e5dSvi * CDDL HEADER END 2040cb5e5dSvi */ 2140cb5e5dSvi 2240cb5e5dSvi /* 23*943efbc3Sgm * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 2440cb5e5dSvi * Use is subject to license terms. 2540cb5e5dSvi */ 2640cb5e5dSvi 2740cb5e5dSvi #ifndef _SIP_XACTION_H 2840cb5e5dSvi #define _SIP_XACTION_H 2940cb5e5dSvi 3040cb5e5dSvi #ifdef __cplusplus 3140cb5e5dSvi extern "C" { 3240cb5e5dSvi #endif 3340cb5e5dSvi 342c2c4183Svi #include <pthread.h> 352c2c4183Svi #include <sip.h> 362c2c4183Svi #include <sys/types.h> 372c2c4183Svi 382c2c4183Svi #include "sip_msg.h" 392c2c4183Svi #include "sip_miscdefs.h" 4040cb5e5dSvi 4140cb5e5dSvi /* Various transaction timers */ 4240cb5e5dSvi typedef enum sip_timer_type_s { 4340cb5e5dSvi SIP_XACTION_TIMER_A = 0, 4440cb5e5dSvi SIP_XACTION_TIMER_B, 4540cb5e5dSvi SIP_XACTION_TIMER_D, 4640cb5e5dSvi SIP_XACTION_TIMER_E, 4740cb5e5dSvi SIP_XACTION_TIMER_F, 4840cb5e5dSvi SIP_XACTION_TIMER_G, 4940cb5e5dSvi SIP_XACTION_TIMER_H, 5040cb5e5dSvi SIP_XACTION_TIMER_I, 5140cb5e5dSvi SIP_XACTION_TIMER_J, 5240cb5e5dSvi SIP_XACTION_TIMER_K 5340cb5e5dSvi } sip_xaction_timer_type_t; 5440cb5e5dSvi 5540cb5e5dSvi 5640cb5e5dSvi /* Increment transaction reference count */ 5740cb5e5dSvi #define SIP_XACTION_REFCNT_INCR(trans) \ 5840cb5e5dSvi (trans)->sip_xaction_ref_cnt++; 5940cb5e5dSvi 6040cb5e5dSvi /* Decrement transaction reference count */ 6140cb5e5dSvi #define SIP_XACTION_REFCNT_DECR(trans) { \ 6240cb5e5dSvi (void) pthread_mutex_lock(&((trans)->sip_xaction_mutex)); \ 6340cb5e5dSvi assert((trans)->sip_xaction_ref_cnt > 0); \ 6440cb5e5dSvi (trans)->sip_xaction_ref_cnt--; \ 6540cb5e5dSvi if ((trans)->sip_xaction_ref_cnt == 0 && \ 6640cb5e5dSvi SIP_IS_XACTION_TERMINATED((trans)->sip_xaction_state)) { \ 6740cb5e5dSvi (void) pthread_mutex_unlock(&((trans)->sip_xaction_mutex));\ 6840cb5e5dSvi sip_xaction_delete(trans); \ 6940cb5e5dSvi } else { \ 7040cb5e5dSvi (void) pthread_mutex_unlock(&((trans)->sip_xaction_mutex));\ 7140cb5e5dSvi } \ 7240cb5e5dSvi } 7340cb5e5dSvi 7440cb5e5dSvi /* True if transaction is in the terminated state */ 7540cb5e5dSvi #define SIP_IS_XACTION_TERMINATED(trans_state) \ 7640cb5e5dSvi ((trans_state) == SIP_CLNT_INV_TERMINATED || \ 7740cb5e5dSvi (trans_state) == SIP_CLNT_NONINV_TERMINATED || \ 7840cb5e5dSvi (trans_state) == SIP_SRV_INV_TERMINATED || \ 7940cb5e5dSvi (trans_state) == SIP_SRV_NONINV_TERMINATED) 8040cb5e5dSvi 8140cb5e5dSvi /* Transaction structure */ 8240cb5e5dSvi typedef struct sip_xaction { 8340cb5e5dSvi char *sip_xaction_branch_id; /* Transaction id */ 8440cb5e5dSvi uint16_t sip_xaction_hash_digest[8]; 8540cb5e5dSvi _sip_msg_t *sip_xaction_orig_msg; /* orig request msg. */ 8640cb5e5dSvi _sip_msg_t *sip_xaction_last_msg; /* last msg sent */ 8740cb5e5dSvi sip_conn_object_t sip_xaction_conn_obj; 8840cb5e5dSvi int sip_xaction_state; /* Transaction State */ 8940cb5e5dSvi sip_method_t sip_xaction_method; 9040cb5e5dSvi uint32_t sip_xaction_ref_cnt; 9140cb5e5dSvi pthread_mutex_t sip_xaction_mutex; 9240cb5e5dSvi sip_timer_t sip_xaction_TA; 9340cb5e5dSvi sip_timer_t sip_xaction_TB; 9440cb5e5dSvi sip_timer_t sip_xaction_TD; 9540cb5e5dSvi sip_timer_t sip_xaction_TE; 9640cb5e5dSvi sip_timer_t sip_xaction_TF; 9740cb5e5dSvi sip_timer_t sip_xaction_TG; 9840cb5e5dSvi sip_timer_t sip_xaction_TH; 9940cb5e5dSvi sip_timer_t sip_xaction_TI; 10040cb5e5dSvi sip_timer_t sip_xaction_TJ; 10140cb5e5dSvi sip_timer_t sip_xaction_TK; 10240cb5e5dSvi void *sip_xaction_ctxt; /* currently unused */ 103*943efbc3Sgm int sip_xaction_msgcnt; 104*943efbc3Sgm sip_log_t sip_xaction_log[SIP_SRV_NONINV_TERMINATED + 1]; 10540cb5e5dSvi } sip_xaction_t; 10640cb5e5dSvi 10740cb5e5dSvi extern void sip_xaction_init(int (*ulp_trans_err)(sip_transaction_t, 10840cb5e5dSvi int, void *), void (*ulp_state_cb) 10940cb5e5dSvi (sip_transaction_t, sip_msg_t, int, int)); 11040cb5e5dSvi extern int sip_xaction_output(sip_conn_object_t, sip_xaction_t *, 11140cb5e5dSvi _sip_msg_t *); 11240cb5e5dSvi extern int sip_xaction_input(sip_conn_object_t, sip_xaction_t *, 11340cb5e5dSvi _sip_msg_t **); 11440cb5e5dSvi extern sip_xaction_t *sip_xaction_get(sip_conn_object_t, sip_msg_t, 11540cb5e5dSvi boolean_t, int, int *); 11640cb5e5dSvi extern void sip_xaction_delete(sip_xaction_t *); 11740cb5e5dSvi extern char *sip_get_xaction_state(int); 11840cb5e5dSvi extern int (*sip_xaction_ulp_trans_err)(sip_transaction_t, int, 11940cb5e5dSvi void *); 12040cb5e5dSvi extern void (*sip_xaction_ulp_state_cb)(sip_transaction_t, 12140cb5e5dSvi sip_msg_t, int, int); 12240cb5e5dSvi extern void sip_del_conn_obj_cache(sip_conn_object_t, void *); 12340cb5e5dSvi extern int sip_add_conn_obj_cache(sip_conn_object_t, void *); 12440cb5e5dSvi extern void sip_xaction_terminate(sip_xaction_t *, _sip_msg_t *, 12540cb5e5dSvi int); 12640cb5e5dSvi #ifdef __cplusplus 12740cb5e5dSvi } 12840cb5e5dSvi #endif 12940cb5e5dSvi 13040cb5e5dSvi #endif /* _SIP_XACTION_H */ 131