From 73b878a85a3d023a855ca623d71950486d26cfbb Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 25 Dec 2010 00:33:40 +0100 Subject: [PATCH] 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. --- openbsc/include/openbsc/db.h | 2 +- openbsc/src/db.c | 8 +++++--- openbsc/src/vty_interface_layer3.c | 3 ++- 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 +#include #include #include @@ -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;