From 3d2787646bc579c36e64542de8cecbffe98a7735 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Fri, 1 Apr 2016 15:35:29 +0200 Subject: [PATCH] app/mncc: Add "use-imsi" to allow calling by IMSI In case one is using a PBX it might be the easiest just to call based on IMSI. Add a VTY option to enable/disable this feature. It can be used to keep the number assignment outside of the HLR database. --- src/app.h | 2 +- src/mncc.c | 18 +++++++++++++----- src/vty.c | 20 ++++++++++++++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/app.h b/src/app.h index f570d7a..ff48c79 100644 --- a/src/app.h +++ b/src/app.h @@ -20,7 +20,7 @@ struct app_config { struct mncc_connection conn; } mncc; - //int use_imsi_as_id; + int use_imsi_as_id; }; extern struct app_config g_app; diff --git a/src/mncc.c b/src/mncc.c index 84dac1d..1b2aacf 100644 --- a/src/mncc.c +++ b/src/mncc.c @@ -251,7 +251,11 @@ static void continue_mo_call(struct mncc_call_leg *leg) dest = talloc_asprintf(tall_mncc_ctx, "+%.32s", leg->called.number); else dest = talloc_asprintf(tall_mncc_ctx, "%.32s", leg->called.number); - source = talloc_asprintf(tall_mncc_ctx, "%.32s", leg->calling.number); + + if (leg->conn->app->use_imsi_as_id) + source = talloc_asprintf(tall_mncc_ctx, "%.16s", leg->imsi); + else + source = talloc_asprintf(tall_mncc_ctx, "%.32s", leg->calling.number); app_route_call(leg->base.call, source, dest); talloc_free(source); @@ -651,10 +655,14 @@ int mncc_create_remote_leg(struct mncc_connection *conn, struct call *call, mncc.calling.type = 0x0; memcpy(&mncc.calling.number, calling, sizeof(mncc.calling.number)); - mncc.fields |= MNCC_F_CALLED; - mncc.called.plan = 1; - mncc.called.type = 0x0; - memcpy(&mncc.called.number, called, sizeof(mncc.called.number)); + if (conn->app->use_imsi_as_id) { + snprintf(mncc.imsi, 16, called); + } else { + mncc.fields |= MNCC_F_CALLED; + mncc.called.plan = 1; + mncc.called.type = 0x0; + memcpy(&mncc.called.number, called, sizeof(mncc.called.number)); + } /* * TODO/FIXME: diff --git a/src/vty.c b/src/vty.c index 7783cf0..191cec8 100644 --- a/src/vty.c +++ b/src/vty.c @@ -99,6 +99,8 @@ static int config_write_mncc(struct vty *vty) static int config_write_app(struct vty *vty) { vty_out(vty, "app%s", VTY_NEWLINE); + if (g_app.use_imsi_as_id) + vty_out(vty, " use-imsi%s", VTY_NEWLINE); return CMD_SUCCESS; } @@ -153,6 +155,22 @@ DEFUN(cfg_app, cfg_app_cmd, return CMD_SUCCESS; } +DEFUN(cfg_use_imsi, cfg_use_imsi_cmd, + "use-imsi", + "Use the IMSI for MO calling and MT called address\n") +{ + g_app.use_imsi_as_id = 1; + return CMD_SUCCESS; +} + +DEFUN(cfg_no_use_imsi, cfg_no_use_imsi_cmd, + "no use-imsi", + NO_STR "Use the IMSI for MO calling and MT called address\n") +{ + g_app.use_imsi_as_id = 0; + return CMD_SUCCESS; +} + void mncc_sip_vty_init(void) { /* default values */ @@ -176,4 +194,6 @@ void mncc_sip_vty_init(void) install_element(CONFIG_NODE, &cfg_app_cmd); install_node(&app_node, config_write_app); + install_element(APP_NODE, &cfg_use_imsi_cmd); + install_element(APP_NODE, &cfg_no_use_imsi_cmd); }