aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-04-01 15:35:29 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-04-01 15:35:29 +0200
commit3d2787646bc579c36e64542de8cecbffe98a7735 (patch)
treefc8ec066b1e53ac405c706a27741cec15d4cbcf1
parent0e9434184e7d324be13910acc4bc301dfcb8bf05 (diff)
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.
-rw-r--r--src/app.h2
-rw-r--r--src/mncc.c18
-rw-r--r--src/vty.c20
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);
}