aboutsummaryrefslogtreecommitdiffstats
path: root/src/libmsc
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2019-11-18 07:08:16 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2020-01-08 23:37:37 +0100
commite8e76e61e9ce55dd885f2f6d50e986dea7833e2f (patch)
tree99b4bc935b696d719f0d08970d94ff050c376270 /src/libmsc
parent98def3a6aaf2635a017b2e50faf0ea66a1195d0e (diff)
Fix duplicate SMS when SMPP returns to same MSC
Diffstat (limited to 'src/libmsc')
-rw-r--r--src/libmsc/gsm_04_11.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/libmsc/gsm_04_11.c b/src/libmsc/gsm_04_11.c
index 367cc6faf..186144ca8 100644
--- a/src/libmsc/gsm_04_11.c
+++ b/src/libmsc/gsm_04_11.c
@@ -272,9 +272,12 @@ int gsm411_mn_send(struct gsm411_smr_inst *inst, int msg_type,
static int gsm340_rx_sms_submit(struct gsm_trans *trans, struct gsm_sms *gsms)
{
- if (db_sms_store(gsms) != 0) {
- LOG_TRANS(trans, LOGL_ERROR, "Failed to store SMS in Database\n");
- return GSM411_RP_CAUSE_MO_NET_OUT_OF_ORDER;
+ if (!gsms->smpp.ongoing) {
+ LOG_TRANS(trans, LOGL_NOTICE, "SMS Store %llu\n", gsms->id);
+ if (db_sms_store(gsms) != 0) {
+ LOG_TRANS(trans, LOGL_ERROR, "Failed to store SMS in Database\n");
+ return GSM411_RP_CAUSE_MO_NET_OUT_OF_ORDER;
+ }
}
/* dispatch a signal to tell higher level about it */
send_signal(S_SMS_SUBMITTED, NULL, gsms, 0);
@@ -424,10 +427,17 @@ static int sms_route_mt_sms(struct gsm_trans *trans, struct gsm_sms *gsms)
* delivery of the SMS.
*/
if (smpp_route_smpp_first()) {
+ /* In case the ESME returns the SMS to this MSC, another entry for this SMS will be created (as usual
+ * for incoming SMPP requests). However, this code path soon also adds a DB entry, which would create
+ * duplicate entries, which would send the SMS twice. Avoid that by marking as SMPP ongoing to skip db */
+ gsms->smpp.ongoing = true;
+
rc = smpp_try_deliver(gsms, msc_a);
- if (rc == GSM411_RP_CAUSE_MO_NUM_UNASSIGNED)
+ if (rc == GSM411_RP_CAUSE_MO_NUM_UNASSIGNED) {
/* unknown subscriber, try local */
+ gsms->smpp.ongoing = false;
goto try_local;
+ }
if (rc < 0) {
LOG_TRANS(trans, LOGL_ERROR, "SMS delivery error: %d\n", rc);
rc = GSM411_RP_CAUSE_MO_TEMP_FAIL;