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 #include #include +#include #include // for GSM_NAME_LENGTH #include @@ -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);