keith has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-msc/+/28342
)
Change subject: After RX of an SMPP Submit, send the SMS we just received.
......................................................................
After RX of an SMPP Submit, send the SMS we just received.
Previously, after we have stored the new SMS in the db, we then
signalled the queue to run, but this is not good enough.
The queue may not pick up this new SMS on the next run,
if there are sufficient older messages in the queue. So let's
specifically send the message that was just submitted.
Change-Id: I9af51ef0d9c2e6c5acc5128efd6195df881b680c
---
M include/osmocom/msc/signal.h
M src/libmsc/smpp_openbsc.c
M src/libmsc/sms_queue.c
3 files changed, 42 insertions(+), 3 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/42/28342/1
diff --git a/include/osmocom/msc/signal.h b/include/osmocom/msc/signal.h
index 9153131..77a9bcf 100644
--- a/include/osmocom/msc/signal.h
+++ b/include/osmocom/msc/signal.h
@@ -86,4 +86,6 @@
struct gsm_sms *sms;
/* true when paging was successful */
bool paging_result;
+ /* the id of the last inserted SMS */
+ unsigned long long id;
};
diff --git a/src/libmsc/smpp_openbsc.c b/src/libmsc/smpp_openbsc.c
index 91666a9..19e3914 100644
--- a/src/libmsc/smpp_openbsc.c
+++ b/src/libmsc/smpp_openbsc.c
@@ -301,6 +301,8 @@
case 1: /* datagram */
case 3: /* store-and-forward */
rc = db_sms_store(sms);
+ memset(&sig, 0, sizeof(sig));
+ sig.id = sms->id;
sms_free(sms);
sms = NULL;
if (rc < 0) {
@@ -312,7 +314,6 @@
strcpy((char *)submit_r->message_id, "msg_id_not_implemented");
LOGP(DLSMS, LOGL_INFO, "SMPP SUBMIT-SM: Stored in DB\n");
- memset(&sig, 0, sizeof(sig));
osmo_signal_dispatch(SS_SMS, S_SMS_SUBMITTED, &sig);
rc = 0;
break;
diff --git a/src/libmsc/sms_queue.c b/src/libmsc/sms_queue.c
index 9b42024..8d4217b 100644
--- a/src/libmsc/sms_queue.c
+++ b/src/libmsc/sms_queue.c
@@ -580,10 +580,46 @@
struct sms_signal_data *sig_sms = signal_data;
struct gsm_sms_pending *pending;
struct vlr_subscr *vsub;
+ struct gsm_sms *sms;
/* We got a new SMS and maybe should launch the queue again. */
- if (signal == S_SMS_SUBMITTED || signal == S_SMS_SMMA) {
- /* TODO: For SMMA we might want to re-use the radio connection. */
+ if (signal == S_SMS_SUBMITTED) {
+ if (sig_sms->id) {
+ LOGP(DLSMS, LOGL_INFO, "Got Signal for new Sms Submitted with ID [%llu]\n",
+ sig_sms->id);
+ sms = db_sms_get(network, sig_sms->id);
+ if (!sms)
+ return -1;
+ if (!sms->receiver || !sms->receiver->lu_complete) {
+ LOGP(DLSMS, LOGL_DEBUG,
+ "Subscriber %s%s is not attached, skipping SMS.\n",
+ sms->receiver ? "" : "MSISDN-",
+ sms->receiver ? vlr_subscr_msisdn_or_name(sms->receiver) :
sms->dst.addr);
+ return -1;
+ }
+
+ /* Check somehow it's not already in the pending list */
+ if (sms_queue_sms_is_pending(smq, sms->id)) {
+ sms_free(sms);
+ return 0;
+ }
+ /* Or that this sub is not already pending */
+ if (sms_subscriber_is_pending(smq, sms->receiver)) {
+ sms_free(sms);
+ return 0;
+ }
+ /* Now add this SMS to the Queue for immediate sending. */
+ pending = sms_pending_from(smq, sms);
+ sms_free(sms);
+ /* Schedule the timer to send this SMS */
+ sms_pending_resend(pending);
+ return 0;
+ }
+ }
+
+ if (signal == S_SMS_SMMA) {
+ /* TODO: For SMMA we might want to re-use the radio connection.
+ */
sms_queue_trigger(smq);
return 0;
}
--
To view, visit
https://gerrit.osmocom.org/c/osmo-msc/+/28342
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-Change-Id: I9af51ef0d9c2e6c5acc5128efd6195df881b680c
Gerrit-Change-Number: 28342
Gerrit-PatchSet: 1
Gerrit-Owner: keith <keith(a)rhizomatica.org>
Gerrit-MessageType: newchange