aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);