This is required to implement normal prefix/regexp routing in addition to
the current "if unroutable" model.
---
 openbsc/src/libmsc/gsm_04_11.c |   63 +++++++++++++++++++++++-----------------
 1 file changed, 37 insertions(+), 26 deletions(-)

diff --git a/openbsc/src/libmsc/gsm_04_11.c b/openbsc/src/libmsc/gsm_04_11.c
index e554b74..7e8ede8 100644
--- a/openbsc/src/libmsc/gsm_04_11.c
+++ b/openbsc/src/libmsc/gsm_04_11.c
@@ -279,6 +279,39 @@ static int gsm340_gen_tpdu(struct msgb *msg, struct 
gsm_sms *sms)
        return msg->len - old_msg_len;
 }
 
+static int sms_queue_try_deliver(struct gsm_subscriber_connection *conn,
+                                 struct msgb *msg, struct gsm_sms *gsms)
+{
+       /* determine gsms->receiver based on dialled number */
+       gsms->receiver = subscr_get_by_extension(conn->bts->network, 
gsms->dst.addr);
+       if (!gsms->receiver) {
+               rc = GSM411_RP_CAUSE_MO_NUM_UNASSIGNED;
+               goto out;
+       }
+
+       switch (sms_mti) {
+       case GSM340_SMS_SUBMIT_MS2SC:
+               /* MS is submitting a SMS */
+               rc = gsm340_rx_sms_submit(msg, gsms);
+               break;
+       case GSM340_SMS_COMMAND_MS2SC:
+       case GSM340_SMS_DELIVER_REP_MS2SC:
+               LOGP(DLSMS, LOGL_NOTICE, "Unimplemented MTI 0x%02x\n", sms_mti);
+               rc = GSM411_RP_CAUSE_IE_NOTEXIST;
+               break;
+       default:
+               LOGP(DLSMS, LOGL_NOTICE, "Undefined MTI 0x%02x\n", sms_mti);
+               rc = GSM411_RP_CAUSE_IE_NOTEXIST;
+               break;
+       }
+
+       if (!rc && !gsms->receiver)
+               rc = GSM411_RP_CAUSE_MO_NUM_UNASSIGNED;
+
+out:
+       return rc;
+}
+
 /* process an incoming TPDU (called from RP-DATA)
  * return value > 0: RP CAUSE for ERROR; < 0: silent error; 0 = success */
 static int gsm340_rx_tpdu(struct gsm_subscriber_connection *conn, struct msgb 
*msg)
@@ -393,44 +426,22 @@ static int gsm340_rx_tpdu(struct 
gsm_subscriber_connection *conn, struct msgb *m
        /* FIXME: This looks very wrong */
        send_signal(0, NULL, gsms, 0);
 
-       /* determine gsms->receiver based on dialled number */
-       gsms->receiver = subscr_get_by_extension(conn->bts->network, 
gsms->dst.addr);
-       if (!gsms->receiver) {
+       rc = sms_queue_try_deliver(conn, msg, gsms);
+       if (rc == GSM411_RP_CAUSE_MO_NUM_UNASSIGNED) {
 #ifdef BUILD_SMPP
                rc = smpp_try_deliver(gsms, conn);
-               if (rc == 1) {
-                       rc = 1; /* cause 1: unknown subscriber */
+               if (rc == GSM411_RP_CAUSE_MO_NUM_UNASSIGNED) {
                        
osmo_counter_inc(conn->bts->network->stats.sms.no_receiver);
                } else if (rc < 0) {
-                       rc = 21; /* cause 21: short message transfer rejected */
+                       rc = GSM411_RP_CAUSE_MO_NUM_UNASSIGNED;
                        /* FIXME: handle the error somehow? */
                }
 #else
-               rc = 1; /* cause 1: unknown subscriber */
                osmo_counter_inc(conn->bts->network->stats.sms.no_receiver);
 #endif
                goto out;
        }
 
-       switch (sms_mti) {
-       case GSM340_SMS_SUBMIT_MS2SC:
-               /* MS is submitting a SMS */
-               rc = gsm340_rx_sms_submit(msg, gsms);
-               break;
-       case GSM340_SMS_COMMAND_MS2SC:
-       case GSM340_SMS_DELIVER_REP_MS2SC:
-               LOGP(DLSMS, LOGL_NOTICE, "Unimplemented MTI 0x%02x\n", sms_mti);
-               rc = GSM411_RP_CAUSE_IE_NOTEXIST;
-               break;
-       default:
-               LOGP(DLSMS, LOGL_NOTICE, "Undefined MTI 0x%02x\n", sms_mti);
-               rc = GSM411_RP_CAUSE_IE_NOTEXIST;
-               break;
-       }
-
-       if (!rc && !gsms->receiver)
-               rc = GSM411_RP_CAUSE_MO_NUM_UNASSIGNED;
-
 out:
        sms_free(gsms);
 
-- 
1.7.9.5


Reply via email to