/** * init module function */ static int mod_init(void) { if(msrp_sruid_init()<0) { LM_ERR("cannot init msrp uid\n"); return -1; } if(msrp_cmap_init_rpc()<0) { LM_ERR("failed to register cmap RPC commands\n"); return -1; } if(msrp_cmap_size>0) { if(msrp_cmap_size>16) msrp_cmap_size = 16; if(msrp_cmap_init(1<<msrp_cmap_size)<0) { LM_ERR("Cannot init internal cmap\n"); return -1; } if(msrp_timer_interval<=0) msrp_timer_interval = 60; register_sync_timers(1); } sr_event_register_cb(SREV_TCP_MSRP_FRAME, msrp_frame_received); return 0; }
/** * init module function */ static int mod_init(void) { if(register_mi_mod(exports.name, mi_cmds)!=0) { LM_ERR("failed to register MI commands\n"); return -1; } if(htable_init_rpc()!=0) { LM_ERR("failed to register RPC commands\n"); return -1; } if(ht_init_tables()!=0) return -1; ht_db_init_params(); if(ht_db_url.len>0) { if(ht_db_init_con()!=0) return -1; if(ht_db_open_con()!=0) return -1; if(ht_db_load_tables()!=0) { ht_db_close_con(); return -1; } ht_db_close_con(); } if(ht_has_autoexpire()) { LM_DBG("starting auto-expire timer\n"); if(ht_timer_interval<=0) ht_timer_interval = 20; if(ht_timer_procs<=0) { if(register_timer(ht_timer, 0, ht_timer_interval)<0) { LM_ERR("failed to register timer function\n"); return -1; } } else { register_sync_timers(ht_timer_procs); } } if (ht_enable_dmq>0 && ht_dmq_initialize()!=0) { LM_ERR("failed to initialize dmq integration\n"); return -1; } ht_iterator_init(); return 0; }
/** * init module function */ static int mod_init(void) { if(msrp_sruid_init()<0) { LM_ERR("cannot init msrp uid\n"); return -1; } if(msrp_cmap_init_rpc()<0) { LM_ERR("failed to register cmap RPC commands\n"); return -1; } if(msrp_cmap_size>0) { if(msrp_cmap_size>16) msrp_cmap_size = 16; if(msrp_cmap_init(1<<msrp_cmap_size)<0) { LM_ERR("Cannot init internal cmap\n"); return -1; } if(msrp_timer_interval<=0) msrp_timer_interval = 60; register_sync_timers(1); } sr_event_register_cb(SREV_TCP_MSRP_FRAME, msrp_frame_received); if(!module_loaded("tls")) { LM_WARN("\"tls\" module is not loaded. TLS is mandatory for" " MSRP Relays. To comply with RFC 4976 you must use" " TLS.\n"); } else { msrp_tls_module_loaded = 1; } return 0; }
static int mod_init(void) { if (sl_load_api(&ws_slb) != 0) { LM_ERR("binding to SL\n"); goto error; } if (sr_event_register_cb(SREV_TCP_WS_FRAME_IN, ws_frame_receive) != 0) { LM_ERR("registering WebSocket receive call-back\n"); goto error; } if (sr_event_register_cb(SREV_TCP_WS_FRAME_OUT, ws_frame_transmit) != 0) { LM_ERR("registering WebSocket transmit call-back\n"); goto error; } if (register_module_stats(exports.name, stats) != 0) { LM_ERR("registering core statistics\n"); goto error; } if (register_mi_mod(exports.name, mi_cmds) != 0) { LM_ERR("registering MI commands\n"); goto error; } if (wsconn_init() < 0) { LM_ERR("initialising WebSocket connections table\n"); goto error; } if (ws_ping_application_data.len < 1 || ws_ping_application_data.len > 125) { ws_ping_application_data.s = DEFAULT_PING_APPLICATION_DATA + 8; ws_ping_application_data.len = DEFAULT_PING_APPLICATION_DATA_LEN - 8; } if (ws_keepalive_mechanism != KEEPALIVE_MECHANISM_NONE) { if (ws_keepalive_timeout < 1 || ws_keepalive_timeout > 3600) ws_keepalive_timeout = DEFAULT_KEEPALIVE_TIMEOUT; switch(ws_keepalive_mechanism) { case KEEPALIVE_MECHANISM_PING: case KEEPALIVE_MECHANISM_PONG: break; default: ws_keepalive_mechanism = DEFAULT_KEEPALIVE_MECHANISM; break; } if (ws_keepalive_interval < 1 || ws_keepalive_interval > 60) ws_keepalive_interval = DEFAULT_KEEPALIVE_INTERVAL; if (ws_keepalive_processes < 1 || ws_keepalive_processes > 16) ws_keepalive_processes = DEFAULT_KEEPALIVE_PROCESSES; /* Add extra process/timer for the keepalive process */ register_sync_timers(ws_keepalive_processes); } if (ws_sub_protocols & SUB_PROTOCOL_MSRP && !sr_event_enabled(SREV_TCP_MSRP_FRAME)) ws_sub_protocols &= ~SUB_PROTOCOL_MSRP; if ((ws_sub_protocols & SUB_PROTOCOL_ALL) == 0) { LM_ERR("no sub-protocols enabled\n"); goto error; } if ((ws_sub_protocols | SUB_PROTOCOL_ALL) != SUB_PROTOCOL_ALL) { LM_ERR("unrecognised sub-protocols enabled\n"); goto error; } if (ws_cors_mode < 0 || ws_cors_mode > 2) { LM_ERR("bad value for cors_mode\n"); goto error; } if (cfg_declare("websocket", ws_cfg_def, &default_ws_cfg, cfg_sizeof(websocket), &ws_cfg)) { LM_ERR("declaring configuration\n"); return -1; } cfg_get(websocket, ws_cfg, keepalive_timeout) = ws_keepalive_timeout; if (!module_loaded("xhttp")) { LM_ERR("\"xhttp\" must be loaded to use WebSocket.\n"); return -1; } if (((ws_sub_protocols & SUB_PROTOCOL_SIP) == SUB_PROTOCOL_SIP) && !module_loaded("nathelper") && !module_loaded("outbound")) { LM_WARN("neither \"nathelper\" nor \"outbound\" modules are" " loaded. At least one of these is required for correct" " routing of SIP over WebSocket.\n"); } return 0; error: wsconn_destroy(); return -1; }
static int mod_init(void) { unsigned int n; if(dlg_ka_interval!=0 && dlg_ka_interval<30) { LM_ERR("ka interval too low (%d), has to be at least 30\n", dlg_ka_interval); return -1; } 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; /* 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.len<=0) { LM_ERR("invalid r-uri PV string\n"); return -1; } 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; } 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 (dlg_timeout_noreset != 0 && dlg_timeout_noreset != 1) { LM_ERR("invalid value %d for timeout_noreset param!!\n", dlg_timeout_noreset); 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(dlg_timer_procs<=0) { if ( register_timer( dlg_timer_routine, 0, 1)<0 ) { LM_ERR("failed to register timer \n"); return -1; } } else { register_sync_timers(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; }
/*! \brief * Module initialization function */ static int mod_init(void) { int i; udomain_t* d; if(sruid_init(&_ul_sruid, '-', "ulcx", SRUID_INC)<0) return -1; #ifdef STATISTICS /* register statistics */ if (register_module_stats( exports.name, mod_stats)!=0 ) { LM_ERR("failed to register core statistics\n"); 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(ul_rpc)!=0) { LM_ERR("failed to register RPC commands\n"); return -1; } /* Compute the lengths of string parameters */ ruid_col.len = strlen(ruid_col.s); user_col.len = strlen(user_col.s); domain_col.len = strlen(domain_col.s); contact_col.len = strlen(contact_col.s); expires_col.len = strlen(expires_col.s); q_col.len = strlen(q_col.s); callid_col.len = strlen(callid_col.s); cseq_col.len = strlen(cseq_col.s); flags_col.len = strlen(flags_col.s); cflags_col.len = strlen(cflags_col.s); user_agent_col.len = strlen(user_agent_col.s); received_col.len = strlen(received_col.s); path_col.len = strlen(path_col.s); sock_col.len = strlen(sock_col.s); methods_col.len = strlen(methods_col.s); instance_col.len = strlen(instance_col.s); reg_id_col.len = strlen(reg_id_col.s); last_mod_col.len = strlen(last_mod_col.s); db_url.len = strlen(db_url.s); if(ul_xavp_contact_name.s!=NULL) ul_xavp_contact_name.len = strlen(ul_xavp_contact_name.s); if(ul_hash_size<=1) ul_hash_size = 512; else ul_hash_size = 1<<ul_hash_size; ul_locks_no = ul_hash_size; /* check matching mode */ switch (matching_mode) { case CONTACT_ONLY: case CONTACT_CALLID: case CONTACT_PATH: break; default: LM_ERR("invalid matching mode %d\n", matching_mode); } if(ul_init_locks()!=0) { LM_ERR("locks array initialization failed\n"); return -1; } /* Register cache timer */ if(ul_timer_procs<=0) { if (timer_interval > 0) register_timer(ul_core_timer, 0, timer_interval); } else register_sync_timers(ul_timer_procs); /* init the callbacks list */ if ( init_ulcb_list() < 0) { LM_ERR("usrloc/callbacks initialization failed\n"); return -1; } /* Shall we use database ? */ if (db_mode != NO_DB) { /* Yes */ if (db_bind_mod(&db_url, &ul_dbf) < 0) { /* Find database module */ LM_ERR("failed to bind database module\n"); return -1; } if (!DB_CAPABILITY(ul_dbf, DB_CAP_ALL)) { LM_ERR("database module does not implement all functions" " needed by the module\n"); return -1; } if(ul_fetch_rows<=0) { LM_ERR("invalid fetch_rows number '%d'\n", ul_fetch_rows); return -1; } } if (nat_bflag==(unsigned int)-1) { nat_bflag = 0; } else if ( nat_bflag>=8*sizeof(nat_bflag) ) { LM_ERR("bflag index (%d) too big!\n", nat_bflag); return -1; } else { nat_bflag = 1<<nat_bflag; } for(i=0; i<ul_preload_index; i++) { if(register_udomain((const char*)ul_preload_list[i], &d)<0) { LM_ERR("cannot register preloaded table %s\n", ul_preload_list[i]); return -1; } } if (handle_lost_tcp && db_mode == DB_ONLY) LM_WARN("handle_lost_tcp option makes nothing in DB_ONLY mode\n"); init_flag = 1; return 0; }
/*! \brief * Module initialization function */ static int mod_init(void) { int i; if (usrloc_debug){ LM_INFO("Logging usrloc records to %.*s\n", usrloc_debug_file.len, usrloc_debug_file.s); debug_file = fopen(usrloc_debug_file.s, "a"); fprintf(debug_file, "starting\n"); fflush(debug_file); } if (rpc_register_array(ul_rpc) != 0) { LM_ERR("failed to register RPC commands\n"); return -1; } if (ul_hash_size <= 1) ul_hash_size = 512; else ul_hash_size = 1 << ul_hash_size; ul_locks_no = ul_hash_size; if (subs_hash_size <= 1) subs_hash_size = 512; else subs_hash_size = 1 << subs_hash_size; subs_locks_no = subs_hash_size; if (contacts_hash_size <= 1) contacts_hash_size = 512; else contacts_hash_size = 1 << contacts_hash_size; contacts_locks_no = contacts_hash_size; /* check matching mode */ switch (matching_mode) { case CONTACT_ONLY: case CONTACT_CALLID: case CONTACT_PATH: case CONTACT_PORT_IP_ONLY: break; default: LM_ERR("invalid matching mode %d\n", matching_mode); } if (ul_init_locks() != 0) { LM_ERR("locks array initialization failed\n"); return -1; } /* create hash table for storing registered contacts */ if (init_contacts_locks() !=0) { LM_ERR("failed to initialise locks array for contacts\n"); return -1; } contact_list = (struct contact_list*)shm_malloc(sizeof(struct contact_list)); if (!contact_list) { LM_ERR("no more memory to create contact list structure\n"); return -1; } contact_list->slot = (struct contact_hslot*) shm_malloc(sizeof(struct contact_hslot) * contacts_hash_size); if (!contact_list->slot) { LM_ERR("no more memory to create contact list structure\n"); return -1; } for (i=0; i<contacts_hash_size;i++) { init_contact_slot(&contact_list->slot[i], i); } contact_list->size = contacts_hash_size; if (subs_init_locks() != 0) { LM_ERR("IMS Subscription locks array initialization failed\n"); return -1; } ims_subscription_list = (struct ims_subscription_list*) shm_malloc(sizeof(struct ims_subscription_list)); if (!ims_subscription_list) { LM_ERR("no more shm memory to create ims subscription list\n"); return -1; } ims_subscription_list->slot = (struct hslot_sp*) shm_malloc(sizeof(struct hslot_sp) * subs_hash_size); if (!ims_subscription_list->slot) { LM_ERR("no more memory to create subscription list structure\n"); return -1; } for (i=0; i<subs_hash_size;i++) { subs_init_slot(&ims_subscription_list->slot[i], i); } ims_subscription_list->size = subs_hash_size; /* presence binding for subscribe processing*/ presence_api_t pres; bind_presence_t bind_presence; bind_presence= (bind_presence_t)find_export("bind_presence", 1,0); if (!bind_presence) { LM_ERR("can't bind presence\n"); return -1; } if (bind_presence(&pres) < 0) { LM_ERR("can't bind pua\n"); return -1; } pres_extract_sdialog_info= pres.extract_sdialog_info; pres_new_shtable = pres.new_shtable; pres_destroy_shtable = pres.destroy_shtable; pres_insert_shtable = pres.insert_shtable; pres_delete_shtable = pres.delete_shtable; pres_update_shtable = pres.update_shtable; pres_search_shtable = pres.search_shtable; if(!pres_new_shtable || !pres_destroy_shtable || !pres_insert_shtable || !pres_delete_shtable || !pres_update_shtable || !pres_search_shtable || !pres_extract_sdialog_info) { LM_ERR("could not import add_event\n"); return -1; } /* subscriber dialog hash table */ if(sub_dialog_hash_size<=1) { sub_dialog_hash_size= 512; } else { sub_dialog_hash_size = 1<<sub_dialog_hash_size; } sub_dialog_table= pres_new_shtable(sub_dialog_hash_size); if(sub_dialog_table== NULL) { LM_ERR("while creating new hash table\n"); return -1; } /* Shall we use database ? */ if (db_mode != NO_DB) { /* Yes */ if (db_bind_mod(&db_url, &ul_dbf) < 0) { /* Find database module */ LM_ERR("failed to bind database module\n"); return -1; } if (!DB_CAPABILITY(ul_dbf, DB_CAP_ALL)) { LM_ERR("database module does not implement all functions" " needed by the module\n"); return -1; } if (ul_fetch_rows <= 0) { LM_ERR("invalid fetch_rows number '%d'\n", ul_fetch_rows); return -1; } } if (load_ims_dlg_api(&dlgb) != 0) { /* load the dialog API */ LM_ERR("can't load Dialog API\n"); return -1; } /* Register counters */ if (ul_scscf_init_counters() != 0) { LM_ERR("Failed to register counters\n"); return -1; } /* Register cache timer */ if(ul_timer_procs<=0) { if (timer_interval > 0) register_timer(timer, 0, timer_interval); } else register_sync_timers(ul_timer_procs); /* init the callbacks list */ if (init_ulcb_list() < 0) { LM_ERR("usrloc/callbacks initialization failed\n"); return -1; } if (nat_bflag == (unsigned int) -1) { nat_bflag = 0; } else if (nat_bflag >= 8 * sizeof(nat_bflag)) { LM_ERR("bflag index (%d) too big!\n", nat_bflag); return -1; } else { nat_bflag = 1 << nat_bflag; } init_flag = 1; /* From contact_dlg_handlers.c * * V1.1*/ if (dlgb.register_dlgcb(0x00, DLGCB_CREATED, contact_dlg_create_handler, 0x00, 0x00) ) { LM_ERR("Unable to setup DLGCB_CREATED"); return -1; } else { LM_DBG(" DLGCB_CREATED created successfully"); } return 0; }