aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2018-06-14 03:54:33 +0700
committerHarald Welte <laforge@gnumonks.org>2018-07-29 16:22:06 +0200
commit8a0e2588e208e1975c74d7e849e66fd205129acb (patch)
treeeca86132222001be7b4ac914920ddbb751d85ef5
parent2760585cca854b1ca5ac7e74b015e31c157a66c5 (diff)
libvlr/vlr.c: forward unhandled GSUP messages towards MSC
Some internal sub-systems, such as SS/USSD or SMS implementation, may also need to use GSUP connection with HLR. Previously, it was only available within the libvlr code, and nowhere else. Let's introduce the generic GSUP message router, which will receive messages unhandled by VLR itself, and route them to a handler depending on the message type. Change-Id: Ib8146ce5788c8f249dcaa39d61bd0388574bf892
-rw-r--r--include/osmocom/msc/vlr.h4
-rw-r--r--src/libmsc/gsm_04_08.c13
-rw-r--r--src/libvlr/vlr.c7
3 files changed, 20 insertions, 4 deletions
diff --git a/include/osmocom/msc/vlr.h b/include/osmocom/msc/vlr.h
index f12d75882..b54aa553d 100644
--- a/include/osmocom/msc/vlr.h
+++ b/include/osmocom/msc/vlr.h
@@ -8,6 +8,7 @@
#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
#include <osmocom/gsm/gsm23003.h>
#include <osmocom/gsm/gsm0808.h>
+#include <osmocom/gsm/gsup.h>
#include <osmocom/msc/gsm_data.h>
// for GSM_NAME_LENGTH
#include <osmocom/msc/gsm_subscriber.h>
@@ -226,6 +227,9 @@ struct vlr_ops {
/* notify MSC/SGSN that the given subscriber has been associated
* with this msc_conn_ref */
void (*subscr_assoc)(void *msc_conn_ref, struct vlr_subscr *vsub);
+
+ /* Forward a parsed GSUP message towards MSC message router */
+ int (*forward_gsup_msg)(struct vlr_subscr *vsub, struct osmo_gsup_message *gsup_msg);
};
enum vlr_timer {
diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c
index f81a6fa51..c10a701e2 100644
--- a/src/libmsc/gsm_04_08.c
+++ b/src/libmsc/gsm_04_08.c
@@ -1698,6 +1698,18 @@ static void msc_vlr_subscr_assoc(void *msc_conn_ref,
conn->vsub->cs.attached_via_ran = conn->via_ran;
}
+static int msc_vlr_route_gsup_msg(struct vlr_subscr *vsub,
+ struct osmo_gsup_message *gsup_msg)
+{
+ switch (gsup_msg->message_type) {
+ /* Nowhere to route for now */
+ default:
+ LOGP(DMM, LOGL_ERROR, "No handler found for %s, dropping message...\n",
+ osmo_gsup_message_type_name(gsup_msg->message_type));
+ return -GMM_CAUSE_MSGT_NOTEXIST_NOTIMPL;
+ }
+}
+
/* operations that we need to implement for libvlr */
static const struct vlr_ops msc_vlr_ops = {
.tx_auth_req = msc_vlr_tx_auth_req,
@@ -1712,6 +1724,7 @@ static const struct vlr_ops msc_vlr_ops = {
.tx_mm_info = msc_vlr_tx_mm_info,
.subscr_update = msc_vlr_subscr_update,
.subscr_assoc = msc_vlr_subscr_assoc,
+ .forward_gsup_msg = msc_vlr_route_gsup_msg,
};
/* Allocate net->vlr so that the VTY may configure the VLR's data structures */
diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c
index cff2e1204..2f7dc3052 100644
--- a/src/libvlr/vlr.c
+++ b/src/libvlr/vlr.c
@@ -1042,10 +1042,8 @@ int vlr_gsupc_read_cb(struct gsup_client *gsupc, struct msgb *msg)
rc = -GMM_CAUSE_MSGT_NOTEXIST_NOTIMPL;
break;
default:
- LOGVSUBP(LOGL_ERROR, vsub,
- "Rx GSUP msg_type=%d not valid at VLR/SGSN side\n",
- gsup.message_type);
- rc = -GMM_CAUSE_MSGT_NOTEXIST_NOTIMPL;
+ /* Forward message towards MSC */
+ rc = vlr->ops.forward_gsup_msg(vsub, &gsup);
break;
}
@@ -1192,6 +1190,7 @@ struct vlr_instance *vlr_alloc(void *ctx, const struct vlr_ops *ops)
OSMO_ASSERT(ops->tx_common_id);
OSMO_ASSERT(ops->subscr_update);
OSMO_ASSERT(ops->subscr_assoc);
+ OSMO_ASSERT(ops->forward_gsup_msg);
INIT_LLIST_HEAD(&vlr->subscribers);
INIT_LLIST_HEAD(&vlr->operations);