static int mod_init(void) { unsigned int n; dlg_event_rt[DLG_EVENTRT_START] = route_lookup(&event_rt, "dialog:start"); dlg_event_rt[DLG_EVENTRT_END] = route_lookup(&event_rt, "dialog:end"); dlg_event_rt[DLG_EVENTRT_FAILED] = route_lookup(&event_rt, "dialog:failed"); #ifdef STATISTICS /* register statistics */ if (register_module_stats( exports.name, mod_stats)!=0 ) { LM_ERR("failed to register %s statistics\n", exports.name); return -1; } #endif if(register_mi_mod(exports.name, mi_cmds)!=0) { LM_ERR("failed to register MI commands\n"); return -1; } if (rpc_register_array(rpc_methods)!=0) { LM_ERR("failed to register RPC commands\n"); return -1; } if(faked_msg_init()<0) return -1; if(dlg_bridge_init_hdrs()<0) return -1; if (timeout_spec.s) timeout_spec.len = strlen(timeout_spec.s); dlg_bridge_controller.len = strlen(dlg_bridge_controller.s); db_url.len = strlen(db_url.s); call_id_column.len = strlen(call_id_column.s); from_uri_column.len = strlen(from_uri_column.s); from_tag_column.len = strlen(from_tag_column.s); to_uri_column.len = strlen(to_uri_column.s); to_tag_column.len = strlen(to_tag_column.s); h_id_column.len = strlen(h_id_column.s); h_entry_column.len = strlen(h_entry_column.s); state_column.len = strlen(state_column.s); start_time_column.len = strlen(start_time_column.s); timeout_column.len = strlen(timeout_column.s); to_cseq_column.len = strlen(to_cseq_column.s); from_cseq_column.len = strlen(from_cseq_column.s); to_route_column.len = strlen(to_route_column.s); from_route_column.len = strlen(from_route_column.s); to_contact_column.len = strlen(to_contact_column.s); from_contact_column.len = strlen(from_contact_column.s); to_sock_column.len = strlen(to_sock_column.s); from_sock_column.len = strlen(from_sock_column.s); sflags_column.len = strlen(sflags_column.s); toroute_name_column.len = strlen(toroute_name_column.s); dialog_table_name.len = strlen(dialog_table_name.s); dialog_vars_table_name.len = strlen(dialog_vars_table_name.s); vars_h_id_column.len = strlen(vars_h_id_column.s); vars_h_entry_column.len = strlen(vars_h_entry_column.s); vars_key_column.len = strlen(vars_key_column.s); vars_value_column.len = strlen(vars_value_column.s); if(dlg_xavp_cfg.s!=NULL) dlg_xavp_cfg.len = strlen(dlg_xavp_cfg.s); /* param checkings */ if (dlg_flag==-1) { LM_ERR("no dlg flag set!!\n"); return -1; } else if (dlg_flag>MAX_FLAG) { LM_ERR("invalid dlg flag %d!!\n",dlg_flag); return -1; } if (rr_param==0 || rr_param[0]==0) { LM_ERR("empty rr_param!!\n"); return -1; } else if (strlen(rr_param)>MAX_DLG_RR_PARAM_NAME) { LM_ERR("rr_param too long (max=%d)!!\n", MAX_DLG_RR_PARAM_NAME); return -1; } if (timeout_spec.s) { if ( pv_parse_spec(&timeout_spec, &timeout_avp)==0 && (timeout_avp.type!=PVT_AVP)){ LM_ERR("malformed or non AVP timeout " "AVP definition in '%.*s'\n", timeout_spec.len,timeout_spec.s); return -1; } } if (default_timeout<=0) { LM_ERR("0 default_timeout not accepted!!\n"); return -1; } if (ruri_pvar_param.s==NULL || *ruri_pvar_param.s=='\0') { LM_ERR("invalid r-uri PV string\n"); return -1; } ruri_pvar_param.len = strlen(ruri_pvar_param.s); if(pv_parse_format(&ruri_pvar_param, &ruri_param_model) < 0 || ruri_param_model==NULL) { LM_ERR("malformed r-uri PV string: %s\n", ruri_pvar_param.s); return -1; } if (initial_cbs_inscript != 0 && initial_cbs_inscript != 1) { LM_ERR("invalid parameter for running initial callbacks in-script" " (must be either 0 or 1)\n"); return -1; } /* update the len of the extra headers */ if (dlg_extra_hdrs.s) dlg_extra_hdrs.len = strlen(dlg_extra_hdrs.s); if (seq_match_mode!=SEQ_MATCH_NO_ID && seq_match_mode!=SEQ_MATCH_FALLBACK && seq_match_mode!=SEQ_MATCH_STRICT_ID ) { LM_ERR("invalid value %d for seq_match_mode param!!\n",seq_match_mode); return -1; } if (detect_spirals != 0 && detect_spirals != 1) { LM_ERR("invalid value %d for detect_spirals param!!\n",detect_spirals); return -1; } /* if statistics are disabled, prevent their registration to core */ if (dlg_enable_stats==0) exports.stats = 0; /* create profile hashes */ if (add_profile_definitions( profiles_nv_s, 0)!=0 ) { LM_ERR("failed to add profiles without value\n"); return -1; } if (add_profile_definitions( profiles_wv_s, 1)!=0 ) { LM_ERR("failed to add profiles with value\n"); return -1; } /* load the TM API */ if (load_tm_api(&d_tmb)!=0) { LM_ERR("can't load TM API\n"); return -1; } /* load RR API also */ if (load_rr_api(&d_rrb)!=0) { LM_ERR("can't load RR API\n"); return -1; } /* register callbacks*/ /* listen for all incoming requests */ if ( d_tmb.register_tmcb( 0, 0, TMCB_REQUEST_IN, dlg_onreq, 0, 0 ) <=0 ) { LM_ERR("cannot register TMCB_REQUEST_IN callback\n"); return -1; } /* listen for all routed requests */ if ( d_rrb.register_rrcb( dlg_onroute, 0 ) <0 ) { LM_ERR("cannot register RR callback\n"); return -1; } if (register_script_cb( profile_cleanup, POST_SCRIPT_CB|REQUEST_CB,0)<0) { LM_ERR("cannot register script callback"); return -1; } if (register_script_cb(dlg_cfg_cb, PRE_SCRIPT_CB|REQUEST_CB,0)<0) { LM_ERR("cannot register pre-script ctx callback\n"); return -1; } if (register_script_cb(dlg_cfg_cb, POST_SCRIPT_CB|REQUEST_CB,0)<0) { LM_ERR("cannot register post-script ctx callback\n"); return -1; } if (register_script_cb( spiral_detect_reset, POST_SCRIPT_CB|REQUEST_CB,0)<0) { LM_ERR("cannot register req pre-script spiral detection reset callback\n"); return -1; } if ( register_timer( dlg_timer_routine, 0, 1)<0 ) { LM_ERR("failed to register timer \n"); return -1; } /* init handlers */ init_dlg_handlers( rr_param, dlg_flag, timeout_spec.s?&timeout_avp:0, default_timeout, seq_match_mode); /* init timer */ if (init_dlg_timer(dlg_ontimeout)!=0) { LM_ERR("cannot init timer list\n"); return -1; } /* sanitize dlg_hash_zie */ if (dlg_hash_size < 1){ LM_WARN("hash_size is smaller " "then 1 -> rounding from %d to 1\n", dlg_hash_size); dlg_hash_size = 1; } /* initialized the hash table */ for( n=0 ; n<(8*sizeof(n)) ; n++) { if (dlg_hash_size==(1<<n)) break; if (n && dlg_hash_size<(1<<n)) { LM_WARN("hash_size is not a power " "of 2 as it should be -> rounding from %d to %d\n", dlg_hash_size, 1<<(n-1)); dlg_hash_size = 1<<(n-1); } } if ( init_dlg_table(dlg_hash_size)<0 ) { LM_ERR("failed to create hash table\n"); return -1; } /* if a database should be used to store the dialogs' information */ dlg_db_mode = dlg_db_mode_param; if (dlg_db_mode==DB_MODE_NONE) { db_url.s = 0; db_url.len = 0; } else { if (dlg_db_mode!=DB_MODE_REALTIME && dlg_db_mode!=DB_MODE_DELAYED && dlg_db_mode!=DB_MODE_SHUTDOWN ) { LM_ERR("unsupported db_mode %d\n", dlg_db_mode); return -1; } if ( !db_url.s || db_url.len==0 ) { LM_ERR("db_url not configured for db_mode %d\n", dlg_db_mode); return -1; } if (init_dlg_db(&db_url, dlg_hash_size, db_update_period,db_fetch_rows)!=0) { LM_ERR("failed to initialize the DB support\n"); return -1; } run_load_callbacks(); } destroy_dlg_callbacks( DLGCB_LOADED ); /* timer process to send keep alive requests */ if(dlg_ka_timer>0 && dlg_ka_interval>0) register_sync_timers(1); /* timer process to clean old unconfirmed dialogs */ register_sync_timers(1); return 0; }
static int mod_init( void ) { #ifdef SQL_ACC if (db_url.s) { db_url.len = strlen(db_url.s); if(db_url.len<=0) { db_url.s = NULL; db_url.len = 0; } } db_table_acc.len = strlen(db_table_acc.s); if(db_table_acc.len!=3 || strncmp(db_table_acc.s, "acc", 3)!=0) { db_table_acc_data = db_table_acc.s; if(fixup_var_pve_str_12(&db_table_acc_data, 1)<0) { LM_ERR("unable to parse acc table name [%.*s]\n", db_table_acc.len, db_table_acc.s); return -1; } } db_table_mc.len = strlen(db_table_mc.s); if(db_table_mc.len!=12 || strncmp(db_table_mc.s, "missed_calls", 12)!=0) { db_table_mc_data = db_table_mc.s; if(fixup_var_pve_str_12(&db_table_mc_data, 1)<0) { LM_ERR("unable to parse mc table name [%.*s]\n", db_table_mc.len, db_table_mc.s); return -1; } } acc_method_col.len = strlen(acc_method_col.s); acc_fromtag_col.len = strlen(acc_fromtag_col.s); acc_totag_col.len = strlen(acc_totag_col.s); acc_callid_col.len = strlen(acc_callid_col.s); acc_sipcode_col.len = strlen(acc_sipcode_col.s); acc_sipreason_col.len = strlen(acc_sipreason_col.s); acc_time_col.len = strlen(acc_time_col.s); #endif if (log_facility_str) { int tmp = str2facility(log_facility_str); if (tmp != -1) log_facility = tmp; else { LM_ERR("invalid log facility configured"); return -1; } } /* ----------- GENERIC INIT SECTION ----------- */ /* failed transaction handling */ if ((failed_transaction_flag != -1) && !flag_in_range(failed_transaction_flag)) { LM_ERR("failed_transaction_flag set to invalid value\n"); return -1; } if (failed_filter_str) { if (parse_failed_filter(failed_filter_str, failed_filter) == 0) { LM_ERR("failed to parse failed_filter param\n"); return -1; } } else { failed_filter[0] = 0; } /* load the TM API */ if (load_tm_api(&tmb)!=0) { LM_ERR("can't load TM API\n"); return -1; } /* if detect_direction is enabled, load rr also */ if (detect_direction) { if (load_rr_api(&rrb)!=0) { LM_ERR("can't load RR API\n"); return -1; } /* we need the append_fromtag on in RR */ if (!rrb.append_fromtag) { LM_ERR("'append_fromtag' RR param is not enabled!" " - required by 'detect_direction'\n"); return -1; } } /* listen for all incoming requests */ if ( tmb.register_tmcb( 0, 0, TMCB_REQUEST_IN, acc_onreq, 0, 0 ) <=0 ) { LM_ERR("cannot register TMCB_REQUEST_IN callback\n"); return -1; } /* init the extra engine */ init_acc_extra(); /* configure multi-leg accounting */ if (leg_info_str && (leg_info=parse_acc_leg(leg_info_str))==0 ) { LM_ERR("failed to parse multileg_info param\n"); return -1; } /* ----------- SYSLOG INIT SECTION ----------- */ /* parse the extra string, if any */ if (log_extra_str && (log_extra=parse_acc_extra(log_extra_str))==0 ) { LM_ERR("failed to parse log_extra param\n"); return -1; } if ((log_flag != -1) && !flag_in_range(log_flag)) { LM_ERR("log_flag set to invalid value\n"); return -1; } if ((log_missed_flag != -1) && !flag_in_range(log_missed_flag)) { LM_ERR("log_missed_flag set to invalid value\n"); return -1; } acc_log_init(); /* ----------- INIT CDR GENERATION ----------- */ if( cdr_enable < 0 || cdr_enable > 1) { LM_ERR("cdr_enable is out of range\n"); return -1; } if( cdr_enable) { if( !cdr_start_str.s || !cdr_end_str.s || !cdr_duration_str.s) { LM_ERR( "necessary cdr_parameters are not set\n"); return -1; } cdr_start_str.len = strlen(cdr_start_str.s); cdr_end_str.len = strlen(cdr_end_str.s); cdr_duration_str.len = strlen(cdr_duration_str.s); if( !cdr_start_str.len || !cdr_end_str.len || !cdr_duration_str.len) { LM_ERR( "necessary cdr_parameters are empty\n"); return -1; } if( set_cdr_extra( cdr_log_extra_str) != 0) { LM_ERR( "failed to set cdr extra '%s'\n", cdr_log_extra_str); return -1; } if( cdr_facility_str && set_cdr_facility( cdr_facility_str) != 0) { LM_ERR( "failed to set cdr facility '%s'\n", cdr_facility_str); return -1; } if( init_cdr_generation() != 0) { LM_ERR("failed to init cdr generation\n"); return -1; } } /* ------------ SQL INIT SECTION ----------- */ #ifdef SQL_ACC if (db_url.s && db_url.len > 0) { /* parse the extra string, if any */ if (db_extra_str && (db_extra=parse_acc_extra(db_extra_str))==0 ) { LM_ERR("failed to parse db_extra param\n"); return -1; } if (acc_db_init(&db_url)<0){ LM_ERR("failed...did you load a database module?\n"); return -1; } /* fix the flags */ if ((db_flag != -1) && !flag_in_range(db_flag)) { LM_ERR("db_flag set to invalid value\n"); return -1; } if ((db_missed_flag != -1) && !flag_in_range(db_missed_flag)) { LM_ERR("db_missed_flag set to invalid value\n"); return -1; } } else { db_url.s = NULL; db_url.len = 0; db_flag = -1; db_missed_flag = -1; } #endif /* ------------ RADIUS INIT SECTION ----------- */ #ifdef RAD_ACC if (radius_config && radius_config[0]) { /* parse the extra string, if any */ if (rad_extra_str && (rad_extra=parse_acc_extra(rad_extra_str))==0 ) { LM_ERR("failed to parse rad_extra param\n"); return -1; } /* fix the flags */ if ((radius_flag != -1) && !flag_in_range(radius_flag)) { LM_ERR("radius_flag set to invalid value\n"); return -1; } if ((radius_missed_flag != -1) && !flag_in_range(radius_missed_flag)) { LM_ERR("radius_missed_flag set to invalid value\n"); return -1; } if (init_acc_rad( radius_config, service_type)!=0 ) { LM_ERR("failed to init radius\n"); return -1; } } else { radius_config = 0; radius_flag = -1; radius_missed_flag = -1; } #endif /* ------------ DIAMETER INIT SECTION ----------- */ #ifdef DIAM_ACC /* fix the flags */ if (flag_idx2mask(&diameter_flag)<0) return -1; if (flag_idx2mask(&diameter_missed_flag)<0) return -1; /* parse the extra string, if any */ if (dia_extra_str && (dia_extra=parse_acc_extra(dia_extra_str))==0 ) { LM_ERR("failed to parse dia_extra param\n"); return -1; } if (acc_diam_init()!=0) { LM_ERR("failed to init diameter engine\n"); return -1; } #endif _acc_module_initialized = 1; if(acc_init_engines()<0) { LM_ERR("failed to init extra engines\n"); return -1; } return 0; }
static int mod_init(void) { unsigned int n; LM_INFO("Dialog module - initializing\n"); if (timeout_spec.s) timeout_spec.len = strlen(timeout_spec.s); init_db_url( db_url , 1 /*can be null*/); dlg_id_column.len = strlen(dlg_id_column.s); call_id_column.len = strlen(call_id_column.s); from_uri_column.len = strlen(from_uri_column.s); from_tag_column.len = strlen(from_tag_column.s); to_uri_column.len = strlen(to_uri_column.s); to_tag_column.len = strlen(to_tag_column.s); state_column.len = strlen(state_column.s); start_time_column.len = strlen(start_time_column.s); timeout_column.len = strlen(timeout_column.s); to_cseq_column.len = strlen(to_cseq_column.s); from_cseq_column.len = strlen(from_cseq_column.s); to_route_column.len = strlen(to_route_column.s); from_route_column.len = strlen(from_route_column.s); to_contact_column.len = strlen(to_contact_column.s); from_contact_column.len = strlen(from_contact_column.s); to_sock_column.len = strlen(to_sock_column.s); from_sock_column.len = strlen(from_sock_column.s); profiles_column.len = strlen(profiles_column.s); vars_column.len = strlen(vars_column.s); sflags_column.len = strlen(sflags_column.s); dialog_table_name.len = strlen(dialog_table_name.s); /* param checkings */ if( log_profile_hash_size <= 0) { LM_ERR("invalid value for log_profile_hash_size:%d!!\n", log_profile_hash_size); return -1; } if (rr_param==0 || rr_param[0]==0) { LM_ERR("empty rr_param!!\n"); return -1; } else if (strlen(rr_param)>MAX_DLG_RR_PARAM_NAME) { LM_ERR("rr_param too long (max=%d)!!\n", MAX_DLG_RR_PARAM_NAME); return -1; } if (timeout_spec.s) { if ( pv_parse_spec(&timeout_spec, &timeout_avp)==0 && (timeout_avp.type!=PVT_AVP)){ LM_ERR("malformed or non AVP timeout " "AVP definition in '%.*s'\n", timeout_spec.len,timeout_spec.s); return -1; } } if (default_timeout<=0) { LM_ERR("0 default_timeout not accepted!!\n"); return -1; } if (ping_interval<=0) { LM_ERR("Non-positive ping interval not accepted!!\n"); return -1; } /* update the len of the extra headers */ if (dlg_extra_hdrs.s) dlg_extra_hdrs.len = strlen(dlg_extra_hdrs.s); if (seq_match_mode!=SEQ_MATCH_NO_ID && seq_match_mode!=SEQ_MATCH_FALLBACK && seq_match_mode!=SEQ_MATCH_STRICT_ID ) { LM_ERR("invalid value %d for seq_match_mode param!!\n",seq_match_mode); return -1; } /* if statistics are disabled, prevent their registration to core */ if (dlg_enable_stats==0) exports.stats = 0; /* we are only interested in these parameters if the cachedb url was defined */ if (cdb_url.s) { cdb_url.len = strlen(cdb_url.s); if (init_cachedb_utils() <0) { LM_ERR("cannot init cachedb utils\n"); return -1; } cdb_val_prefix.len = strlen(cdb_val_prefix.s); cdb_noval_prefix.len = strlen(cdb_noval_prefix.s); cdb_size_prefix.len = strlen(cdb_size_prefix.s); } /* create profile hashes */ if (add_profile_definitions( profiles_nv_s, 0)!=0 ) { LM_ERR("failed to add profiles without value\n"); return -1; } if (add_profile_definitions( profiles_wv_s, 1)!=0 ) { LM_ERR("failed to add profiles with value\n"); return -1; } /* load the TM API */ if (load_tm_api(&d_tmb)!=0) { LM_ERR("can't load TM API\n"); return -1; } /* load RR API also */ if (load_rr_api(&d_rrb)!=0) { LM_ERR("can't load RR API\n"); return -1; } /* register callbacks*/ /* listen for all incoming requests */ if ( d_tmb.register_tmcb( 0, 0, TMCB_REQUEST_IN, dlg_onreq, 0, 0 ) <=0 ) { LM_ERR("cannot register TMCB_REQUEST_IN callback\n"); return -1; } /* listen for all routed requests */ if ( d_rrb.register_rrcb( dlg_onroute, 0, 1 ) <0 ) { LM_ERR("cannot register RR callback\n"); return -1; } if (register_script_cb( dialog_cleanup, POST_SCRIPT_CB|REQ_TYPE_CB,0)<0) { LM_ERR("cannot regsiter script callback"); return -1; } if (dlg_have_own_timer_proc) { LM_INFO("Running with dedicated dialog timer process\n"); dlg_own_timer_proc = register_timer_process( "dlg-timer", dlg_timer_routine, NULL,1,TIMER_PROC_INIT_FLAG ); if (dlg_own_timer_proc == NULL) { LM_ERR("Failed to init dialog own timer proc\n"); return -1; } if (append_timer_to_process("dlg-pinger", dlg_ping_routine, NULL, ping_interval,dlg_own_timer_proc) < 0) { LM_ERR("Failed to append ping timer \n"); return -1; } } else { if ( register_timer( "dlg-timer", dlg_timer_routine, NULL, 1)<0 ) { LM_ERR("failed to register timer \n"); return -1; } if ( register_timer( "dlg-pinger", dlg_ping_routine, NULL, ping_interval)<0) { LM_ERR("failed to register timer 2 \n"); return -1; } } /* init handlers */ init_dlg_handlers( rr_param, timeout_spec.s?&timeout_avp:0, default_timeout); /* init timer */ if (init_dlg_timer(dlg_ontimeout)!=0) { LM_ERR("cannot init timer list\n"); return -1; } if (init_dlg_ping_timer()!=0) { LM_ERR("cannot init ping timer\n"); return -1; } /* initialized the hash table */ for( n=0 ; n<(8*sizeof(n)) ; n++) { if (dlg_hash_size==(1<<n)) break; if (dlg_hash_size<(1<<n)) { LM_WARN("hash_size is not a power " "of 2 as it should be -> rounding from %d to %d\n", dlg_hash_size, 1<<(n-1)); dlg_hash_size = 1<<(n-1); break; } } if ( init_dlg_table(dlg_hash_size)<0 ) { LM_ERR("failed to create hash table\n"); return -1; } /* if a database should be used to store the dialogs' information */ if (dlg_db_mode==DB_MODE_NONE) { db_url.s = 0; db_url.len = 0; } else { if (dlg_db_mode!=DB_MODE_REALTIME && dlg_db_mode!=DB_MODE_DELAYED && dlg_db_mode!=DB_MODE_SHUTDOWN ) { LM_ERR("unsupported db_mode %d\n", dlg_db_mode); return -1; } if ( !db_url.s || db_url.len==0 ) { LM_ERR("db_url not configured for db_mode %d\n", dlg_db_mode); return -1; } if (init_dlg_db(&db_url, dlg_hash_size, db_update_period)!=0) { LM_ERR("failed to initialize the DB support\n"); return -1; } run_load_callbacks(); } /* if profiles should be kept in cachedb's */ destroy_dlg_callbacks( DLGCB_LOADED ); destroy_cachedb(0); return 0; }
static int mod_init(void) { LM_INFO("initializing...\n"); int rr_api_loaded=0; int dlg_api_loaded=0; if ( is_script_func_used("uac_auth", -1) ) { /* load the UAC_AUTH API as uac_auth() is invoked from script */ if(load_uac_auth_api(&uac_auth_api)<0){ LM_ERR("can't load UAC_AUTH API, needed for uac_auth()\n"); goto error; } } /* load the TM API - FIXME it should be loaded only * if NO_RESTORE and AUTH */ if (load_tm_api(&uac_tmb)!=0) { LM_ERR("can't load TM API\n"); goto error; } if (restore_mode_str && *restore_mode_str) { if (strcasecmp(restore_mode_str,"none")==0) { restore_mode = UAC_NO_RESTORE; } else if (strcasecmp(restore_mode_str,"manual")==0) { restore_mode = UAC_MANUAL_RESTORE; } else if (strcasecmp(restore_mode_str,"auto")==0) { restore_mode = UAC_AUTO_RESTORE; } else { LM_ERR("unsupported value '%s' for restore_mode\n", restore_mode_str); goto error; } } if ( is_script_func_used("uac_replace_from", -1) || is_script_func_used("uac_replace_to", -1) ) { /* replace TO/FROM stuff is used, get prepared */ rr_from_param.len = strlen(rr_from_param.s); rr_to_param.len = strlen(rr_to_param.s); if ( (rr_from_param.len==0 || rr_to_param.len==0) && restore_mode!=UAC_NO_RESTORE) { LM_ERR("rr_store_param cannot be empty if FROM is restoreable\n"); goto error; } uac_passwd.len = strlen(uac_passwd.s); if (restore_mode!=UAC_NO_RESTORE) { /* load the RR API */ if (load_rr_api(&uac_rrb)!=0) { LM_ERR("can't load RR API\n"); goto error; } rr_api_loaded=1; if (restore_mode==UAC_AUTO_RESTORE) { /* we need the append_fromtag on in RR */ if (!force_dialog && !uac_rrb.append_fromtag) { LM_ERR("'append_fromtag' RR param is not enabled!" " - required by AUTO restore mode\n"); goto error; } /* trying to load dialog module */ memset(&dlg_api, 0, sizeof(struct dlg_binds)); if (load_dlg_api(&dlg_api)!=0) { if (force_dialog) { LM_ERR("cannot force dialog. dialog module not loaded\n"); goto error; } LM_DBG("failed to find dialog API - is dialog module loaded?\n"); } else { dlg_api_loaded=1; if ( (parse_store_bavp(&store_to_bavp, &to_bavp_spec) || parse_store_bavp(&store_from_bavp, &from_bavp_spec))) { LM_ERR("cannot set correct store parameters\n"); goto error; } /* install calback to catch all loaded dialogs */ if ( dlg_api.register_dlgcb( NULL, DLGCB_LOADED, dlg_restore_callback, NULL, NULL) != 0 ) { LM_ERR("failed to install dialog restore callback\n"); goto error; } } /* get all requests doing loose route */ if (uac_rrb.register_rrcb( rr_checker, 0, 2)!=0) { LM_ERR("failed to install RR callback\n"); goto error; } } } /* init from replacer */ init_from_replacer(); } if (is_script_func_used("uac_auth", -1)) { if (!rr_api_loaded) { if (load_rr_api(&uac_rrb)!=0) { LM_ERR("can't load RR API\n"); goto error; } } if (!dlg_api_loaded) { if (load_dlg_api(&dlg_api)!=0) { LM_ERR("Can't load dlg API \n"); } } if (!uac_rrb.append_fromtag) { LM_ERR("'append_fromtag' RR param is not enabled!" " - required by uac_auth() restore mode\n"); goto error; } if (uac_rrb.register_rrcb( rr_uac_auth_checker, 0, 2)!=0) { LM_ERR("failed to install RR callback\n"); goto error; } } return 0; error: return -1; }
static int mod_init(void) { unsigned int n; LM_INFO("Dialog module - initializing\n"); if (timeout_spec.s) timeout_spec.len = strlen(timeout_spec.s); init_db_url( db_url , 1 /*can be null*/); dlg_id_column.len = strlen(dlg_id_column.s); call_id_column.len = strlen(call_id_column.s); from_uri_column.len = strlen(from_uri_column.s); from_tag_column.len = strlen(from_tag_column.s); to_uri_column.len = strlen(to_uri_column.s); to_tag_column.len = strlen(to_tag_column.s); state_column.len = strlen(state_column.s); start_time_column.len = strlen(start_time_column.s); timeout_column.len = strlen(timeout_column.s); to_cseq_column.len = strlen(to_cseq_column.s); from_cseq_column.len = strlen(from_cseq_column.s); to_route_column.len = strlen(to_route_column.s); from_route_column.len = strlen(from_route_column.s); to_contact_column.len = strlen(to_contact_column.s); from_contact_column.len = strlen(from_contact_column.s); to_sock_column.len = strlen(to_sock_column.s); from_sock_column.len = strlen(from_sock_column.s); profiles_column.len = strlen(profiles_column.s); vars_column.len = strlen(vars_column.s); sflags_column.len = strlen(sflags_column.s); mflags_column.len = strlen(mflags_column.s); flags_column.len = strlen(flags_column.s); dialog_table_name.len = strlen(dialog_table_name.s); /* param checkings */ if( log_profile_hash_size <= 0) { LM_ERR("invalid value for log_profile_hash_size:%d!!\n", log_profile_hash_size); return -1; } if (rr_param.s==0 || rr_param.s[0]==0) { LM_ERR("empty rr_param!!\n"); return -1; } rr_param.len = strlen(rr_param.s); if (rr_param.len>MAX_DLG_RR_PARAM_NAME) { LM_ERR("rr_param too long (max=%d)!!\n", MAX_DLG_RR_PARAM_NAME); return -1; } if (default_timeout<=0) { LM_ERR("0 default_timeout not accepted!!\n"); return -1; } if (ping_interval<=0) { LM_ERR("Non-positive ping interval not accepted!!\n"); return -1; } /* update the len of the extra headers */ if (dlg_extra_hdrs.s) dlg_extra_hdrs.len = strlen(dlg_extra_hdrs.s); if (seq_match_mode!=SEQ_MATCH_NO_ID && seq_match_mode!=SEQ_MATCH_FALLBACK && seq_match_mode!=SEQ_MATCH_STRICT_ID ) { LM_ERR("invalid value %d for seq_match_mode param!!\n",seq_match_mode); return -1; } /* if statistics are disabled, prevent their registration to core */ if (dlg_enable_stats==0) exports.stats = 0; /* we are only interested in these parameters if the cachedb url was defined */ if (cdb_url.s) { cdb_url.len = strlen(cdb_url.s); if (init_cachedb_utils() <0) { LM_ERR("cannot init cachedb utils\n"); return -1; } cdb_val_prefix.len = strlen(cdb_val_prefix.s); cdb_noval_prefix.len = strlen(cdb_noval_prefix.s); cdb_size_prefix.len = strlen(cdb_size_prefix.s); } /* allocate a slot in the processing context */ ctx_dlg_idx = context_register_ptr(CONTEXT_GLOBAL); ctx_timeout_idx = context_register_int(CONTEXT_GLOBAL); ctx_lastdstleg_idx = context_register_int(CONTEXT_GLOBAL); /* create dialog state changed event */ if (state_changed_event_init() < 0) { LM_ERR("cannot create dialog state changed event\n"); return -1; } /* create profile hashes */ if (add_profile_definitions( profiles_nv_s, 0)!=0 ) { LM_ERR("failed to add profiles without value\n"); return -1; } if (add_profile_definitions( profiles_wv_s, 1)!=0 ) { LM_ERR("failed to add profiles with value\n"); return -1; } /* load the TM API */ if (load_tm_api(&d_tmb)!=0) { LM_ERR("can't load TM API\n"); return -1; } /* load RR API also */ if (load_rr_api(&d_rrb)!=0) { LM_ERR("can't load RR API\n"); return -1; } /* register callbacks*/ /* listen for all incoming requests */ if ( d_tmb.register_tmcb( 0, 0, TMCB_REQUEST_IN, dlg_onreq, 0, 0 ) <=0 ) { LM_ERR("cannot register TMCB_REQUEST_IN callback\n"); return -1; } /* listen for all routed requests */ if ( d_rrb.register_rrcb( dlg_onroute, 0, 1 ) <0 ) { LM_ERR("cannot register RR callback\n"); return -1; } if (register_script_cb( dialog_cleanup, POST_SCRIPT_CB|REQ_TYPE_CB|RPL_TYPE_CB,0)<0) { LM_ERR("cannot register script callback"); return -1; } if ((accept_replicated_dlg || accept_repl_profiles) && bin_register_cb("dialog", receive_binary_packet) < 0) { LM_ERR("Cannot register binary packet callback!\n"); return -1; } if ( register_timer( "dlg-timer", dlg_timer_routine, NULL, 1, TIMER_FLAG_DELAY_ON_DELAY)<0 ) { LM_ERR("failed to register timer\n"); return -1; } if ( register_timer( "dlg-pinger", dlg_ping_routine, NULL, ping_interval, TIMER_FLAG_DELAY_ON_DELAY)<0) { LM_ERR("failed to register timer 2\n"); return -1; } /* init handlers */ init_dlg_handlers(default_timeout); /* init timer */ if (init_dlg_timer(dlg_ontimeout)!=0) { LM_ERR("cannot init timer list\n"); return -1; } if (init_dlg_ping_timer()!=0) { LM_ERR("cannot init ping timer\n"); return -1; } /* initialized the hash table */ for( n=0 ; n<(8*sizeof(n)) ; n++) { if (dlg_hash_size==(1<<n)) break; if (dlg_hash_size<(1<<n)) { LM_WARN("hash_size is not a power " "of 2 as it should be -> rounding from %d to %d\n", dlg_hash_size, 1<<(n-1)); dlg_hash_size = 1<<(n-1); break; } } if ( init_dlg_table(dlg_hash_size)<0 ) { LM_ERR("failed to create hash table\n"); return -1; } if (repl_prof_init() < 0) { LM_ERR("cannot initialize profile replication\n"); return -1; } /* if a database should be used to store the dialogs' information */ if (dlg_db_mode==DB_MODE_NONE) { db_url.s = 0; db_url.len = 0; } else { if (dlg_db_mode!=DB_MODE_REALTIME && dlg_db_mode!=DB_MODE_DELAYED && dlg_db_mode!=DB_MODE_SHUTDOWN ) { LM_ERR("unsupported db_mode %d\n", dlg_db_mode); return -1; } if ( !db_url.s || db_url.len==0 ) { LM_ERR("db_url not configured for db_mode %d\n", dlg_db_mode); return -1; } if (init_dlg_db(&db_url, dlg_hash_size, db_update_period)!=0) { LM_ERR("failed to initialize the DB support\n"); return -1; } run_load_callbacks(); } mark_dlg_loaded_callbacks_run(); destroy_cachedb(0); return 0; }
static int mod_init(void) { unsigned int n; if (register_mi_mod(exports.name, mi_cmds) != 0) { LM_ERR("failed to register MI commands\n"); return -1; } if (rpc_register_array(rpc_methods) != 0) { LM_ERR("failed to register RPC commands\n"); return -1; } if (faked_msg_init() < 0) return -1; if (timeout_spec.s) timeout_spec.len = strlen(timeout_spec.s); dlg_bridge_controller.len = strlen(dlg_bridge_controller.s); /* param checkings */ if (dlg_flag == -1) { LM_ERR("no dlg flag set!!\n"); return -1; } else if (dlg_flag > MAX_FLAG) { LM_ERR("invalid dlg flag %d!!\n", dlg_flag); return -1; } if (rr_param == 0 || rr_param[0] == 0) { LM_ERR("empty rr_param!!\n"); return -1; } else if (strlen(rr_param) > MAX_DLG_RR_PARAM_NAME) { LM_ERR("rr_param too long (max=%d)!!\n", MAX_DLG_RR_PARAM_NAME); return -1; } if (timeout_spec.s) { if (pv_parse_spec(&timeout_spec, &timeout_avp) == 0 && (timeout_avp.type != PVT_AVP)) { LM_ERR("malformed or non AVP timeout " "AVP definition in '%.*s'\n", timeout_spec.len, timeout_spec.s); return -1; } } if (default_timeout <= 0) { LM_ERR("0 default_timeout not accepted!!\n"); return -1; } if (ruri_pvar_param.s == NULL || *ruri_pvar_param.s == '\0') { LM_ERR("invalid r-uri PV string\n"); return -1; } ruri_pvar_param.len = strlen(ruri_pvar_param.s); if (pv_parse_format(&ruri_pvar_param, &ruri_param_model) < 0 || ruri_param_model == NULL) { LM_ERR("malformed r-uri PV string: %s\n", ruri_pvar_param.s); return -1; } /* update the len of the extra headers */ if (dlg_extra_hdrs.s) dlg_extra_hdrs.len = strlen(dlg_extra_hdrs.s); if (seq_match_mode != SEQ_MATCH_NO_ID && seq_match_mode != SEQ_MATCH_FALLBACK && seq_match_mode != SEQ_MATCH_STRICT_ID) { LM_ERR("invalid value %d for seq_match_mode param!!\n", seq_match_mode); return -1; } if (detect_spirals != 0 && detect_spirals != 1) { LM_ERR("invalid value %d for detect_spirals param!!\n", detect_spirals); return -1; } /* create profile hashes */ if (add_profile_definitions(profiles_nv_s, 0) != 0) { LM_ERR("failed to add profiles without value\n"); return -1; } if (add_profile_definitions(profiles_wv_s, 1) != 0) { LM_ERR("failed to add profiles with value\n"); return -1; } /* load the TM API */ if (load_tm_api(&d_tmb) != 0) { LM_ERR("can't load TM API\n"); return -1; } /* load RR API also */ if (load_rr_api(&d_rrb) != 0) { LM_ERR("can't load RR API\n"); return -1; } /* register callbacks*/ /* listen for all incoming requests */ if (d_tmb.register_tmcb(0, 0, TMCB_REQUEST_IN, dlg_onreq, 0, 0) <= 0) { LM_ERR("cannot register TMCB_REQUEST_IN callback\n"); return -1; } /* listen for all routed requests */ if (d_rrb.register_rrcb(dlg_onroute, 0) < 0) { LM_ERR("cannot register RR callback\n"); return -1; } if (register_script_cb(profile_cleanup, POST_SCRIPT_CB | REQUEST_CB, 0) < 0) { LM_ERR("cannot regsiter script callback"); return -1; } if (register_script_cb(dlg_cfg_cb, PRE_SCRIPT_CB | REQUEST_CB, 0) < 0) { LM_ERR("cannot regsiter pre-script ctx callback\n"); return -1; } if (register_script_cb(dlg_cfg_cb, POST_SCRIPT_CB | REQUEST_CB, 0) < 0) { LM_ERR("cannot regsiter post-script ctx callback\n"); return -1; } if (register_script_cb(spiral_detect_reset, POST_SCRIPT_CB | REQUEST_CB, 0) < 0) { LM_ERR("cannot register req pre-script spiral detection reset callback\n"); return -1; } if (register_timer(dlg_timer_routine, 0, 1) < 0) { LM_ERR("failed to register timer \n"); return -1; } /*for testing only!!!! setup timer to call print all dlg every 10 seconds!*/ if (register_timer(print_all_dlgs, 0, 10) < 0) { LM_ERR("failed to register timer \n"); return -1; } /* init handlers */ init_dlg_handlers(rr_param, dlg_flag, timeout_spec.s ? &timeout_avp : 0, default_timeout, seq_match_mode); /* init timer */ if (init_dlg_timer(dlg_ontimeout) != 0) { LM_ERR("cannot init timer list\n"); return -1; } /* sanitize dlg_hash_zie */ if (dlg_hash_size < 1) { LM_WARN("hash_size is smaller " "then 1 -> rounding from %d to 1\n", dlg_hash_size); dlg_hash_size = 1; } /* initialized the hash table */ for (n = 0; n < (8 * sizeof (n)); n++) { if (dlg_hash_size == (1 << n)) break; if (n && dlg_hash_size < (1 << n)) { LM_WARN("hash_size is not a power " "of 2 as it should be -> rounding from %d to %d\n", dlg_hash_size, 1 << (n - 1)); dlg_hash_size = 1 << (n - 1); } } if (init_dlg_table(dlg_hash_size) < 0) { LM_ERR("failed to create hash table\n"); return -1; } destroy_dlg_callbacks(DLGCB_LOADED); return 0; }