lynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-msc/+/38410?usp=email )
Change subject: vlr: add a logging layer ......................................................................
vlr: add a logging layer
To prepare the split off into a separate library, the logging can't use log category from a define. Use the same strategy as all the other osmo libraries and use a global array which is set on initialisation to define the logging categories.
Change-Id: I6d87b38d6d7d704c7c7b2c90ad12187e4b953b8b --- M include/osmocom/vlr/vlr.h M src/libmsc/msc_net_init.c M src/libvlr/vlr.c M src/libvlr/vlr_access_req_fsm.c M src/libvlr/vlr_access_req_fsm.h M src/libvlr/vlr_auth_fsm.c M src/libvlr/vlr_lu_fsm.c M src/libvlr/vlr_lu_fsm.h M src/libvlr/vlr_sgs.c M src/libvlr/vlr_sgs_fsm.c M src/libvlr/vlr_sgs_fsm.h 11 files changed, 106 insertions(+), 43 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/10/38410/1
diff --git a/include/osmocom/vlr/vlr.h b/include/osmocom/vlr/vlr.h index 6d5c71c..1a2ef9e 100644 --- a/include/osmocom/vlr/vlr.h +++ b/include/osmocom/vlr/vlr.h @@ -17,12 +17,6 @@ #include <osmocom/gsupclient/gsup_client.h> #include <osmocom/vlr/vlr_sgs.h>
-#define LOGGSUPP(level, gsup, fmt, args...) \ - LOGP(DVLR, level, "GSUP(%s) " fmt, (gsup)->imsi, ## args) - -#define LOGVSUBP(level, vsub, fmt, args...) \ - LOGP(DVLR, level, "SUBSCR(%s) " fmt, vlr_subscr_name(vsub), ## args) - struct log_target; struct osmo_mobile_identity;
@@ -498,3 +492,24 @@ enum gsm48_reject_value vlr_gmm_cause_to_reject_cause_domain(enum gsm48_gmm_cause gmm_cause, bool is_cs); enum gsm48_reject_value vlr_reject_causes_cs(enum gsm48_reject_value reject_cause); enum gsm48_reject_value vlr_reject_causes_ps(enum gsm48_reject_value reject_cause); + +/* logging */ +enum osmo_vlr_cat { + OSMO_VLR_LOGC_VLR, + OSMO_VLR_LOGC_SGS, + _OSMO_VLR_LOGC_MAX, +}; + +void osmo_vlr_set_log_cat(enum osmo_vlr_cat logc, int logc_num); + +extern int g_vlr_log_cat[_OSMO_VLR_LOGC_MAX]; + +#define LOGVLR(lvl, fmt, args...) LOGP(g_vlr_log_cat[OSMO_VLR_LOGC_VLR], lvl, fmt, ## args) +#define LOGSGS(lvl, fmt, args...) LOGP(g_vlr_log_cat[OSMO_VLR_LOGC_SGS], lvl, fmt, ## args) + +#define LOGGSUPP(level, gsup, fmt, args...) \ + LOGVLR(level, "GSUP(%s) " fmt, (gsup)->imsi, ## args) + +#define LOGVSUBP(level, vsub, fmt, args...) \ + LOGVLR(level, "SUBSCR(%s) " fmt, vlr_subscr_name(vsub), ## args) + diff --git a/src/libmsc/msc_net_init.c b/src/libmsc/msc_net_init.c index ad0c19a..21f68cf 100644 --- a/src/libmsc/msc_net_init.c +++ b/src/libmsc/msc_net_init.c @@ -28,6 +28,7 @@
#include <osmocom/msc/gsm_data.h> #include <osmocom/vlr/vlr.h> +#include <osmocom/msc/debug.h> #include <osmocom/msc/gsup_client_mux.h> #include <osmocom/msc/gsm_04_11_gsup.h> #include <osmocom/msc/gsm_09_11.h> @@ -107,6 +108,8 @@ /* Allocate net->vlr so that the VTY may configure the VLR's data structures */ int msc_vlr_alloc(struct gsm_network *net) { + osmo_vlr_set_log_cat(OSMO_VLR_LOGC_VLR, DVLR); + osmo_vlr_set_log_cat(OSMO_VLR_LOGC_SGS, DSGS); net->vlr = vlr_alloc(net, &msc_vlr_ops); if (!net->vlr) return -ENOMEM; diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c index 81429bb..3aa5a5e 100644 --- a/src/libvlr/vlr.c +++ b/src/libvlr/vlr.c @@ -454,7 +454,7 @@ { llist_del(&vsub->list); vlr_stat_item_dec(vsub->vlr, VLR_STAT_SUBSCRIBER_COUNT); - DEBUGP(DVLR, "freeing VLR subscr %s (max total use count was %d)\n", vlr_subscr_name(vsub), + LOGVLR(LOGL_DEBUG, "freeing VLR subscr %s (max total use count was %d)\n", vlr_subscr_name(vsub), vsub->max_total_use_count);
/* Make sure SGs timer Ts5 is removed */ @@ -478,7 +478,7 @@ for (tried = 0; tried < 100; tried++) { rc = osmo_get_rand_id((uint8_t *) &tmsi, sizeof(tmsi)); if (rc < 0) { - LOGP(DVLR, LOGL_ERROR, "osmo_get_rand_id() failed: %s\n", strerror(-rc)); + LOGVLR(LOGL_ERROR, "osmo_get_rand_id() failed: %s\n", strerror(-rc)); return rc; }
@@ -486,7 +486,7 @@ int16_t nri_v; osmo_tmsi_nri_v_limit_by_ranges(&tmsi, vlr->cfg.nri_ranges, vlr->cfg.nri_bitlen); osmo_tmsi_nri_v_get(&nri_v, tmsi, vlr->cfg.nri_bitlen); - LOGP(DVLR, LOGL_DEBUG, "New NRI from range [%s] = 0x%x --> TMSI 0x%08x\n", + LOGVLR(LOGL_DEBUG, "New NRI from range [%s] = 0x%x --> TMSI 0x%08x\n", osmo_nri_ranges_to_str_c(OTC_SELECT, vlr->cfg.nri_ranges), nri_v, tmsi); }
@@ -515,7 +515,7 @@ return 0; }
- LOGP(DVLR, LOGL_ERROR, "subscr %s: unable to generate valid TMSI" + LOGVLR(LOGL_ERROR, "subscr %s: unable to generate valid TMSI" " after %d tries\n", vlr_subscr_name(vsub), tried); return -1; } @@ -544,7 +544,7 @@ return NULL; vlr_subscr_get_src(vsub, use, file, line); vlr_subscr_set_imsi(vsub, imsi); - LOGP(DVLR, LOGL_INFO, "New subscr, IMSI: %s\n", vsub->imsi); + LOGVLR(LOGL_INFO, "New subscr, IMSI: %s\n", vsub->imsi); if (created) *created = true; return vsub; @@ -574,7 +574,7 @@ return NULL; vlr_subscr_get_src(vsub, use, file, line); vsub->tmsi = tmsi; - LOGP(DVLR, LOGL_INFO, "New subscr, TMSI: 0x%08x\n", vsub->tmsi); + LOGVLR(LOGL_INFO, "New subscr, TMSI: 0x%08x\n", vsub->tmsi); if (created) *created = true; return vsub; @@ -585,7 +585,7 @@ struct vlr_instance *vlr = exists->vlr; int i; int j; - LOGP(DVLR, LOGL_NOTICE, + LOGVLR(LOGL_NOTICE, "There is an existing subscriber for IMSI %s used by %s, replacing with new VLR subscr: %s used by %s\n", exists->imsi, osmo_use_count_to_str_c(OTC_SELECT, &exists->use_count), vlr_subscr_name(vsub), @@ -638,13 +638,13 @@
/* Set the IMSI on the new subscriber, here. */ if (OSMO_STRLCPY_ARRAY(vsub->imsi, imsi) >= sizeof(vsub->imsi)) { - LOGP(DVLR, LOGL_NOTICE, "IMSI was truncated: full IMSI=%s, truncated IMSI=%s\n", + LOGVLR(LOGL_NOTICE, "IMSI was truncated: full IMSI=%s, truncated IMSI=%s\n", imsi, vsub->imsi); /* XXX Set truncated IMSI anyway, we currently cannot return an error from here. */ }
vsub->id = atoll(vsub->imsi); - DEBUGP(DVLR, "set IMSI on subscriber; IMSI=%s id=%llu\n", + LOGVLR(LOGL_DEBUG, "set IMSI on subscriber; IMSI=%s id=%llu\n", vsub->imsi, vsub->id); }
@@ -653,7 +653,7 @@ if (!vsub) return; OSMO_STRLCPY_ARRAY(vsub->imei, imei); - DEBUGP(DVLR, "set IMEI on subscriber; IMSI=%s IMEI=%s\n", + LOGVLR(LOGL_DEBUG, "set IMEI on subscriber; IMSI=%s IMEI=%s\n", vsub->imsi, vsub->imei); }
@@ -662,7 +662,7 @@ if (!vsub) return; OSMO_STRLCPY_ARRAY(vsub->imeisv, imeisv); - DEBUGP(DVLR, "set IMEISV on subscriber; IMSI=%s IMEISV=%s\n", + LOGVLR(LOGL_DEBUG, "set IMEISV on subscriber; IMSI=%s IMEISV=%s\n", vsub->imsi, vsub->imeisv);
/* Copy IMEISV to IMEI (additional SV digits get cut off) */ @@ -675,7 +675,7 @@ if (!vsub) return; OSMO_STRLCPY_ARRAY(vsub->msisdn, msisdn); - DEBUGP(DVLR, "set MSISDN on subscriber; IMSI=%s MSISDN=%s\n", + LOGVLR(LOGL_DEBUG, "set MSISDN on subscriber; IMSI=%s MSISDN=%s\n", vsub->imsi, vsub->msisdn); }
@@ -690,7 +690,7 @@ } else { vsub->sgs.last_eutran_plmn_present = false; } - DEBUGP(DVLR, "set Last E-UTRAN PLMN ID on subscriber: %s\n", + LOGVLR(LOGL_DEBUG, "set Last E-UTRAN PLMN ID on subscriber: %s\n", vsub->sgs.last_eutran_plmn_present ? osmo_plmn_name(&vsub->sgs.last_eutran_plmn) : "(none)"); @@ -723,7 +723,7 @@ int vlr_subscr_changed(struct vlr_subscr *vsub) { /* FIXME */ - LOGP(DVLR, LOGL_ERROR, "Not implemented: %s\n", __func__); + LOGVLR(LOGL_ERROR, "Not implemented: %s\n", __func__); return 0; }
@@ -735,7 +735,7 @@ if (osmo_clock_gettime(CLOCK_MONOTONIC, &now) == 0) { vsub->expire_lu = now.tv_sec + vlr_timer(vsub->vlr, 3212); } else { - LOGP(DVLR, LOGL_ERROR, + LOGVLR(LOGL_ERROR, "%s: Could not enable Location Update expiry: unable to read current time\n", vlr_subscr_name(vsub)); /* Disable LU expiry for this subscriber. This subscriber will only be freed after an explicit IMSI detach. */ vsub->expire_lu = VLR_SUBSCRIBER_NO_EXPIRATION; @@ -757,7 +757,7 @@ goto done;
if (osmo_clock_gettime(CLOCK_MONOTONIC, &now) != 0) { - LOGP(DVLR, LOGL_ERROR, "Skipping Location Update expiry: Could not read current time\n"); + LOGVLR(LOGL_ERROR, "Skipping Location Update expiry: Could not read current time\n"); goto done; }
@@ -765,7 +765,7 @@ if (vsub->expire_lu == VLR_SUBSCRIBER_NO_EXPIRATION || vsub->expire_lu > now.tv_sec) continue;
- LOGP(DVLR, LOGL_DEBUG, "%s: Location Update expired\n", vlr_subscr_name(vsub)); + LOGVLR(LOGL_DEBUG, "%s: Location Update expired\n", vlr_subscr_name(vsub)); vlr_rate_ctr_inc(vlr, VLR_CTR_DETACH_BY_T3212); vlr_subscr_detach(vsub); } @@ -843,20 +843,20 @@ const struct osmo_gsup_message *gsup_msg) { if (OSMO_GSUP_IS_MSGT_REQUEST(gsup_msg->message_type)) { - LOGP(DVLR, LOGL_NOTICE, + LOGVLR(LOGL_NOTICE, "Unknown IMSI %s, discarding GSUP request " "of type 0x%02x\n", gsup_msg->imsi, gsup_msg->message_type); gsup_client_mux_tx_error_reply(vlr->gcm, gsup_msg, GMM_CAUSE_IMSI_UNKNOWN); } else if (OSMO_GSUP_IS_MSGT_ERROR(gsup_msg->message_type)) { - LOGP(DVLR, LOGL_NOTICE, + LOGVLR(LOGL_NOTICE, "Unknown IMSI %s, discarding GSUP error " "of type 0x%02x, cause '%s' (%d)\n", gsup_msg->imsi, gsup_msg->message_type, get_value_string(gsm48_gmm_cause_names, gsup_msg->cause), gsup_msg->cause); } else { - LOGP(DVLR, LOGL_NOTICE, + LOGVLR(LOGL_NOTICE, "Unknown IMSI %s, discarding GSUP response " "of type 0x%02x\n", gsup_msg->imsi, gsup_msg->message_type); @@ -1028,13 +1028,13 @@ gsm48_decode_bcd_number2(vsub->msisdn, sizeof(vsub->msisdn), gsup_msg->msisdn_enc, gsup_msg->msisdn_enc_len, 0); - LOGP(DVLR, LOGL_DEBUG, "IMSI:%s has MSISDN:%s\n", + LOGVLR(LOGL_DEBUG, "IMSI:%s has MSISDN:%s\n", vsub->imsi, vsub->msisdn); }
if (gsup_msg->hlr_enc) { if (gsup_msg->hlr_enc_len > sizeof(vsub->hlr.buf)) { - LOGP(DVLR, LOGL_ERROR, "HLR-Number too long (%zu)\n", + LOGVLR(LOGL_ERROR, "HLR-Number too long (%zu)\n", gsup_msg->hlr_enc_len); vsub->hlr.len = 0; } else { @@ -1047,7 +1047,7 @@ if (gsup_msg->pdp_info_compl) { rc = vlr_subscr_pdp_data_clear(vsub); if (rc > 0) - LOGP(DVLR, LOGL_INFO, "Cleared existing PDP info\n"); + LOGVLR(LOGL_INFO, "Cleared existing PDP info\n"); }
for (idx = 0; idx < gsup_msg->num_pdp_infos; idx++) { @@ -1689,3 +1689,25 @@ } else target->filter_map &= ~(1 << LOG_FLT_VLR_SUBSCR); } + +int g_vlr_log_cat[_OSMO_VLR_LOGC_MAX]; + +void osmo_vlr_set_log_cat(enum osmo_vlr_cat logc, int logc_num) +{ + if (logc <= OSMO_VLR_LOGC_VLR || logc >= _OSMO_VLR_LOGC_MAX) + return; + + g_vlr_log_cat[logc] = logc_num; + + switch (logc) { + case OSMO_VLR_LOGC_VLR: + vlr_auth_fsm.log_subsys = logc_num; + vlr_lu_fsm_set_loglevel(logc_num); + break; + case OSMO_VLR_LOGC_SGS: + vlr_sgs_fsm_set_loglevel(logc_num); + break; + default: + break; + } +} diff --git a/src/libvlr/vlr_access_req_fsm.c b/src/libvlr/vlr_access_req_fsm.c index c2e185b..3b46ddb 100644 --- a/src/libvlr/vlr_access_req_fsm.c +++ b/src/libvlr/vlr_access_req_fsm.c @@ -650,7 +650,7 @@ .num_states = ARRAY_SIZE(proc_arq_vlr_states), .allstate_event_mask = 0, .allstate_action = NULL, - .log_subsys = DVLR, + .log_subsys = DLGLOBAL, .event_names = proc_arq_vlr_event_names, .cleanup = proc_arq_vlr_cleanup, }; @@ -809,3 +809,8 @@ //OSMO_ASSERT(osmo_fsm_register(&upd_loc_child_vlr_fsm) == 0); OSMO_ASSERT(osmo_fsm_register(&proc_arq_vlr_fsm) == 0); } + +void vlr_parq_fsm_set_loglevel(int log_level) +{ + proc_arq_vlr_fsm.log_subsys = log_level; +} diff --git a/src/libvlr/vlr_access_req_fsm.h b/src/libvlr/vlr_access_req_fsm.h index 8386da6..1c4db24 100644 --- a/src/libvlr/vlr_access_req_fsm.h +++ b/src/libvlr/vlr_access_req_fsm.h @@ -15,3 +15,5 @@ PR_ARQ_S_WAIT_CECK_CONF, PR_ARQ_S_DONE, }; + +void vlr_parq_fsm_set_loglevel(int log_level); diff --git a/src/libvlr/vlr_auth_fsm.c b/src/libvlr/vlr_auth_fsm.c index 3a74ec1..3b398dd 100644 --- a/src/libvlr/vlr_auth_fsm.c +++ b/src/libvlr/vlr_auth_fsm.c @@ -610,7 +610,7 @@ .num_states = ARRAY_SIZE(auth_fsm_states), .allstate_event_mask = 0, .allstate_action = NULL, - .log_subsys = DVLR, + .log_subsys = DLGLOBAL, .event_names = fsm_auth_event_names, .cleanup = auth_fsm_cleanup, }; diff --git a/src/libvlr/vlr_lu_fsm.c b/src/libvlr/vlr_lu_fsm.c index b26eed7..1279801 100644 --- a/src/libvlr/vlr_lu_fsm.c +++ b/src/libvlr/vlr_lu_fsm.c @@ -150,7 +150,7 @@ .num_states = ARRAY_SIZE(upd_hlr_vlr_states), .allstate_event_mask = 0, .allstate_action = NULL, - .log_subsys = DVLR, + .log_subsys = DLGLOBAL, .event_names = upd_hlr_vlr_event_names, };
@@ -262,7 +262,7 @@ .num_states = ARRAY_SIZE(sub_pres_vlr_states), .allstate_event_mask = 0, .allstate_action = NULL, - .log_subsys = DVLR, + .log_subsys = DLGLOBAL, .event_names = sub_pres_vlr_event_names, };
@@ -601,7 +601,7 @@ .num_states = ARRAY_SIZE(lu_compl_vlr_states), .allstate_event_mask = 0, .allstate_action = NULL, - .log_subsys = DVLR, + .log_subsys = DLGLOBAL, .event_names = lu_compl_vlr_event_names, };
@@ -1492,7 +1492,7 @@ .num_states = ARRAY_SIZE(vlr_lu_fsm_states), .allstate_event_mask = 0, .allstate_action = NULL, - .log_subsys = DVLR, + .log_subsys = DLGLOBAL, .event_names = fsm_lu_event_names, .cleanup = fsm_lu_cleanup, }; @@ -1595,3 +1595,11 @@ OSMO_ASSERT(osmo_fsm_register(&sub_pres_vlr_fsm) == 0); OSMO_ASSERT(osmo_fsm_register(&lu_compl_vlr_fsm) == 0); } + +void vlr_lu_fsm_set_loglevel(int log_level) +{ + vlr_lu_fsm.log_subsys = log_level; + upd_hlr_vlr_fsm.log_subsys = log_level; + sub_pres_vlr_fsm.log_subsys = log_level; + lu_compl_vlr_fsm.log_subsys = log_level; +} diff --git a/src/libvlr/vlr_lu_fsm.h b/src/libvlr/vlr_lu_fsm.h index b5c4a5e..29cc24a 100644 --- a/src/libvlr/vlr_lu_fsm.h +++ b/src/libvlr/vlr_lu_fsm.h @@ -17,3 +17,4 @@ };
void vlr_lu_fsm_init(void); +void vlr_lu_fsm_set_loglevel(int log_level); diff --git a/src/libvlr/vlr_sgs.c b/src/libvlr/vlr_sgs.c index a0147c0..ace2c5d 100644 --- a/src/libvlr/vlr_sgs.c +++ b/src/libvlr/vlr_sgs.c @@ -51,7 +51,7 @@
OSMO_ASSERT(vlr);
- LOGP(DVLR, LOGL_INFO, "dropping all SGs associations.\n"); + LOGSGS(LOGL_INFO, "dropping all SGs associations.\n");
llist_for_each_entry(vsub, &vlr->subscribers, list) { osmo_fsm_inst_dispatch(vsub->sgs_fsm, SGS_UE_E_RX_RESET_FROM_MME, NULL); @@ -85,7 +85,7 @@
vsub = vlr_subscr_find_or_create_by_imsi(vlr, imsi, VSUB_USE_SGS_LU, NULL); if (!vsub) { - LOGP(DSGS, LOGL_ERROR, "VLR subscriber allocation failed\n"); + LOGSGS(LOGL_ERROR, "VLR subscriber allocation failed\n"); return -EINVAL; }
@@ -168,7 +168,7 @@ evt = SGS_UE_E_RX_DETACH_IND_FROM_MME; break; default: - LOGP(DSGS, LOGL_ERROR, "(sub %s) invalid SGS IMSI detach type, detaching anyway...\n", + LOGSGS(LOGL_ERROR, "(sub %s) invalid SGS IMSI detach type, detaching anyway...\n", vlr_subscr_msisdn_or_name(vsub)); evt = SGS_UE_E_RX_DETACH_IND_FROM_MME; break; @@ -206,7 +206,7 @@ evt = SGS_UE_E_RX_DETACH_IND_FROM_MME; break; default: - LOGP(DSGS, LOGL_ERROR, "(sub %s) invalid SGS IMSI detach type, detaching anyway...\n", + LOGSGS(LOGL_ERROR, "(sub %s) invalid SGS IMSI detach type, detaching anyway...\n", vlr_subscr_msisdn_or_name(vsub)); evt = SGS_UE_E_RX_DETACH_IND_FROM_MME; break; @@ -253,7 +253,7 @@ /* On the reception of a paging rej the VLR is supposed to stop Ts5, also 3GPP TS 29.118, chapter 5.1.2.4 */ osmo_timer_del(&vsub->sgs.Ts5); - LOGP(DSGS, LOGL_DEBUG, "(sub %s) Paging via SGs interface rejected by MME, %s stopped, cause: %s!\n", + LOGSGS(LOGL_DEBUG, "(sub %s) Paging via SGs interface rejected by MME, %s stopped, cause: %s!\n", vlr_subscr_msisdn_or_name(vsub), vlr_sgs_state_timer_name(SGS_STATE_TS5), sgsap_sgs_cause_name(cause));
osmo_fsm_inst_dispatch(vsub->sgs_fsm, SGS_UE_E_RX_PAGING_FAILURE, &cause); @@ -295,7 +295,7 @@ /* On the reception of an UE unreachable the VLR is supposed to stop * Ts5, also 3GPP TS 29.118, chapter 5.1.2.5 */ osmo_timer_del(&vsub->sgs.Ts5); - LOGP(DSGS, LOGL_DEBUG, + LOGSGS(LOGL_DEBUG, "(sub %s) Paging via SGs interface not possible, UE unreachable, %s stopped, cause: %s\n", vlr_subscr_msisdn_or_name(vsub), vlr_sgs_state_timer_name(SGS_STATE_TS5), sgsap_sgs_cause_name(cause));
@@ -313,7 +313,7 @@ * failed. Other actions may check the status of Ts5 to see if a paging * is still ongoing or not. */
- LOGP(DSGS, LOGL_ERROR, "(sub %s) Paging via SGs interface timed out (%s expired)!\n", + LOGSGS(LOGL_ERROR, "(sub %s) Paging via SGs interface timed out (%s expired)!\n", vlr_subscr_msisdn_or_name(vsub), vlr_sgs_state_timer_name(SGS_STATE_TS5));
/* Balance ref count increment from vlr_sgs_pag() */ diff --git a/src/libvlr/vlr_sgs_fsm.c b/src/libvlr/vlr_sgs_fsm.c index c7a9fdd..4cea056 100644 --- a/src/libvlr/vlr_sgs_fsm.c +++ b/src/libvlr/vlr_sgs_fsm.c @@ -355,7 +355,7 @@ S(SGS_UE_E_RX_LU_FROM_A_IU_GS), .allstate_action = sgs_ue_fsm_allstate, .timer_cb = sgs_ue_fsm_timer_cb, - .log_subsys = DSGS, + .log_subsys = DLGLOBAL, .event_names = sgs_ue_fsm_event_names, };
@@ -366,6 +366,12 @@ OSMO_ASSERT(osmo_fsm_register(&sgs_ue_fsm) == 0); }
+/*! Set the log level of the fsm */ +void vlr_sgs_fsm_set_loglevel(int log_level) +{ + sgs_ue_fsm.log_subsys = log_level; +} + /*! Crate SGs FSM in struct vlr_subscr. * \param[in] vsub VLR subscriber for which the SGs FSM should be created. */ void vlr_sgs_fsm_create(struct vlr_subscr *vsub) diff --git a/src/libvlr/vlr_sgs_fsm.h b/src/libvlr/vlr_sgs_fsm.h index 6a09433..3dd84c3 100644 --- a/src/libvlr/vlr_sgs_fsm.h +++ b/src/libvlr/vlr_sgs_fsm.h @@ -39,6 +39,7 @@ };
void vlr_sgs_fsm_init(void); +void vlr_sgs_fsm_set_loglevel(int log_level); void vlr_sgs_fsm_create(struct vlr_subscr *vsub); void vlr_sgs_fsm_remove(struct vlr_subscr *vsub); void vlr_sgs_fsm_update_id(struct vlr_subscr *vsub);