aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-12-25 00:33:40 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-12-25 21:39:04 +0100
commit73b878a85a3d023a855ca623d71950486d26cfbb (patch)
tree1ce894177924f9d989dbe403c346c291a487a7d8
parent812dad0ff7e34499ae7c28cbed51e0a86da98846 (diff)
db: Introduce a limit in delivery attempts for the SMS search
We do not want to attempt submitting SMS that has failed for too many times. The failure could be due RF failure or due a bug in the message handling.
-rw-r--r--openbsc/include/openbsc/db.h2
-rw-r--r--openbsc/src/db.c8
-rw-r--r--openbsc/src/vty_interface_layer3.c3
3 files changed, 8 insertions, 5 deletions
diff --git a/openbsc/include/openbsc/db.h b/openbsc/include/openbsc/db.h
index 3b705194c..5949f9c8c 100644
--- a/openbsc/include/openbsc/db.h
+++ b/openbsc/include/openbsc/db.h
@@ -65,7 +65,7 @@ int db_sync_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple,
int db_sms_store(struct gsm_sms *sms);
struct gsm_sms *db_sms_get(struct gsm_network *net, unsigned long long id);
struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, unsigned long long min_id);
-struct gsm_sms *db_sms_get_unsent_by_subscr(struct gsm_network *net, unsigned long long min_subscr_id);
+struct gsm_sms *db_sms_get_unsent_by_subscr(struct gsm_network *net, unsigned long long min_subscr_id, unsigned int failed);
struct gsm_sms *db_sms_get_unsent_for_subscr(struct gsm_subscriber *subscr);
int db_sms_mark_sent(struct gsm_sms *sms);
int db_sms_inc_deliver_attempts(struct gsm_sms *sms);
diff --git a/openbsc/src/db.c b/openbsc/src/db.c
index bb72fd80f..fd5dd8105 100644
--- a/openbsc/src/db.c
+++ b/openbsc/src/db.c
@@ -1114,7 +1114,9 @@ struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, unsigned long long mi
return sms;
}
-struct gsm_sms *db_sms_get_unsent_by_subscr(struct gsm_network *net, unsigned long long min_subscr_id)
+struct gsm_sms *db_sms_get_unsent_by_subscr(struct gsm_network *net,
+ unsigned long long min_subscr_id,
+ unsigned int failed)
{
dbi_result result;
struct gsm_sms *sms;
@@ -1124,9 +1126,9 @@ struct gsm_sms *db_sms_get_unsent_by_subscr(struct gsm_network *net, unsigned lo
"FROM SMS JOIN Subscriber ON "
"SMS.receiver_id = Subscriber.id "
"WHERE SMS.receiver_id >= %llu AND SMS.sent IS NULL "
- "AND Subscriber.lac > 0 "
+ "AND Subscriber.lac > 0 AND SMS.deliver_attempts < %u "
"ORDER BY SMS.receiver_id, SMS.id LIMIT 1",
- min_subscr_id);
+ min_subscr_id, failed);
if (!result)
return NULL;
diff --git a/openbsc/src/vty_interface_layer3.c b/openbsc/src/vty_interface_layer3.c
index a9444ba2c..f1e537183 100644
--- a/openbsc/src/vty_interface_layer3.c
+++ b/openbsc/src/vty_interface_layer3.c
@@ -20,6 +20,7 @@
*/
#include <stdlib.h>
+#include <limits.h>
#include <unistd.h>
#include <sys/types.h>
@@ -125,7 +126,7 @@ DEFUN(sms_send_pend,
int id = 0;
while (1) {
- sms = db_sms_get_unsent_by_subscr(gsmnet, id);
+ sms = db_sms_get_unsent_by_subscr(gsmnet, id, UINT_MAX);
if (!sms)
break;