diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2019-11-18 07:08:16 +0100 |
---|---|---|
committer | Neels Hofmeyr <neels@hofmeyr.de> | 2019-11-18 15:46:33 +0100 |
commit | 792d805613758441c039859bed53378a2378ca8b (patch) | |
tree | 2584e20b07441069cdb9c0b66a34f1f0419b5528 | |
parent | b3248667280f026fc2cbf6e931ff1f713c74f995 (diff) |
Fix duplicate SMS when SMPP returns to same MSC
Change-Id: I8c9b61dc05bda6f2b09cbc1890de1f2702f7abc8
-rw-r--r-- | include/osmocom/msc/gsm_data.h | 1 | ||||
-rw-r--r-- | src/libmsc/gsm_04_11.c | 18 |
2 files changed, 15 insertions, 4 deletions
diff --git a/include/osmocom/msc/gsm_data.h b/include/osmocom/msc/gsm_data.h index 11b6e8237..788a328a3 100644 --- a/include/osmocom/msc/gsm_data.h +++ b/include/osmocom/msc/gsm_data.h @@ -292,6 +292,7 @@ struct gsm_sms { } gsm411; struct { + bool ongoing; struct osmo_esme *esme; uint32_t sequence_nr; int transaction_mode; 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; |