@ -108,6 +108,56 @@ static int internal_state_cmp(void *obj, void *arg, int flags)
return CMP_MATCH ;
}
/*! \brief hashing function for state objects */
static int transport_state_hash ( const void * obj , const int flags )
{
const struct ast_sip_transport_state * object ;
const char * key ;
switch ( flags & OBJ_SEARCH_MASK ) {
case OBJ_SEARCH_KEY :
key = obj ;
break ;
case OBJ_SEARCH_OBJECT :
object = obj ;
key = object - > id ;
break ;
default :
ast_assert ( 0 ) ;
return 0 ;
}
return ast_str_hash ( key ) ;
}
/*! \brief comparator function for state objects */
static int transport_state_cmp ( void * obj , void * arg , int flags )
{
const struct ast_sip_transport_state * object_left = obj ;
const struct ast_sip_transport_state * object_right = arg ;
const char * right_key = arg ;
int cmp ;
switch ( flags & OBJ_SEARCH_MASK ) {
case OBJ_SEARCH_OBJECT :
right_key = object_right - > id ;
/* Fall through */
case OBJ_SEARCH_KEY :
cmp = strcmp ( object_left - > id , right_key ) ;
break ;
case OBJ_SEARCH_PARTIAL_KEY :
/* Not supported by container. */
ast_assert ( 0 ) ;
return 0 ;
default :
cmp = 0 ;
break ;
}
if ( cmp ) {
return 0 ;
}
return CMP_MATCH ;
}
static int sip_transport_to_ami ( const struct ast_sip_transport * transport ,
struct ast_str * * buf )
{
@ -499,7 +549,6 @@ static int transport_apply(const struct ast_sorcery *sorcery, void *obj)
if ( res = = PJ_SUCCESS & & ( transport - > tos | | transport - > cos ) ) {
pj_sock_t sock ;
pj_qos_params qos_params ;
sock = pjsip_udp_transport_get_socket ( temp_state - > state - > transport ) ;
pj_sock_get_qos_params ( sock , & qos_params ) ;
set_qos ( transport , & qos_params ) ;
@ -657,6 +706,11 @@ static int privkey_file_to_str(const void *obj, const intptr_t *args, char **buf
static int transport_protocol_handler ( const struct aco_option * opt , struct ast_variable * var , void * obj )
{
struct ast_sip_transport * transport = obj ;
RAII_VAR ( struct ast_sip_transport_state * , state , find_or_create_temporary_state ( transport ) , ao2_cleanup ) ;
if ( ! state ) {
return - 1 ;
}
if ( ! strcasecmp ( var - > value , " udp " ) ) {
transport - > type = AST_TRANSPORT_UDP ;
@ -672,6 +726,8 @@ static int transport_protocol_handler(const struct aco_option *opt, struct ast_v
return - 1 ;
}
state - > type = transport - > type ;
return 0 ;
}
@ -1240,9 +1296,26 @@ struct ast_sip_transport_state *ast_sip_get_transport_state(const char *transpor
return state - > state ;
}
static int populate_transport_states ( void * obj , void * arg , int flags )
{
struct internal_state * state = obj ;
struct ao2_container * container = arg ;
ao2_link ( container , state - > state ) ;
return CMP_MATCH ;
}
struct ao2_container * ast_sip_get_transport_states ( void )
{
return ao2_container_clone ( transport_states , 0 ) ;
struct ao2_container * states = ao2_container_alloc ( DEFAULT_STATE_BUCKETS , transport_state_hash , transport_state_cmp ) ;
if ( ! states ) {
return NULL ;
}
ao2_callback ( transport_states , OBJ_NODATA | OBJ_MULTIPLE , populate_transport_states , states ) ;
return states ;
}
/*! \brief Initialize sorcery with transport support */