Following up with yesterday's discussion about SMS routing, I would like to re-submit this patch.
On Sat, Oct 5, 2013 at 1:00 PM, Alexander Chemeris alexander.chemeris@gmail.com wrote:
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