* [RFC PATCH 1/2] smsutil: add fuzzy address check for status report
@ 2010-09-21 17:12 Petteri Tikander
2010-09-21 17:12 ` [RFC PATCH 2/2] unit: add fuzzy address check to test-sms Petteri Tikander
2010-09-22 21:33 ` [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Denis Kenzior
0 siblings, 2 replies; 3+ messages in thread
From: Petteri Tikander @ 2010-09-21 17:12 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 4838 bytes --]
---
src/smsutil.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 87 insertions(+), 16 deletions(-)
diff --git a/src/smsutil.c b/src/smsutil.c
index cd0fef2..8b05c68 100644
--- a/src/smsutil.c
+++ b/src/smsutil.c
@@ -2858,35 +2858,104 @@ gboolean status_report_assembly_report(struct status_report_assembly *assembly,
unsigned int offset = status_report->status_report.mr / 32;
unsigned int bit = 1 << (status_report->status_report.mr % 32);
struct id_table_node *node = NULL;
- const char *straddr;
+ const char *r_addr, *s_addr;
+ struct sms_address addr;
GHashTable *id_table;
gpointer key, value;
gboolean delivered;
- GHashTableIter iter;
+ GHashTableIter iter_addr, iter;
gboolean pending;
int i;
unsigned char *msgid;
+ unsigned int len, r_len, s_len;
/* We ignore temporary or tempfinal status reports */
if (sr_st_to_delivered(status_report->status_report.st,
&delivered) == FALSE)
return FALSE;
- straddr = sms_address_to_string(&status_report->status_report.raddr);
- id_table = g_hash_table_lookup(assembly->assembly_table, straddr);
+ r_addr = sms_address_to_string(&status_report->status_report.raddr);
+ id_table = g_hash_table_lookup(assembly->assembly_table, r_addr);
- /* key (receiver address) does not exist in assembly */
- if (id_table == NULL)
- return FALSE;
+ /* key (receiver address) exists in assembly */
+ if (id_table != NULL) {
- g_hash_table_iter_init(&iter, id_table);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- node = value;
+ /* Found an identical address from assembly. */
+ s_addr = r_addr;
- if (node->mrs[offset] & bit)
- break;
+ g_hash_table_iter_init(&iter, id_table);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ node = value;
+
+ if (node->mrs[offset] & bit)
+ break;
- node = NULL;
+ node = NULL;
+ }
+ }
+ /*
+ * Key (receiver address) does not exist in assembly.
+ * Some networks can change address to international format,
+ * although address is sent in the national format.
+ * Handle also change from national to international format.
+ * So notify these special cases by comparing only
+ * last six digits of the assembly addresses and received address.
+ * If address contains less than six digits,
+ * compare only existing digits.
+ */
+ else {
+ g_hash_table_iter_init(&iter_addr, assembly->assembly_table);
+
+ /*
+ * Go through all addresses using 'fuzzy' address-comparation.
+ * Each address can relate to 1-n msg_ids.
+ */
+ while (g_hash_table_iter_next(&iter_addr, (gpointer) &s_addr,
+ (gpointer) &id_table)) {
+
+ /* Notify international <-> national conversions */
+ if (((r_addr[0] == '+') && (s_addr[0] != '+')) ||
+ ((r_addr[0] != '+') && (s_addr[0] == '+'))) {
+
+ r_len = strlen(r_addr);
+ s_len = strlen(s_addr);
+
+ len = MIN(6, MIN(r_len, s_len));
+
+ for (i = 0; i < len; i++) {
+ if (s_addr[s_len - i - 1] !=
+ r_addr[r_len - i - 1])
+ break;
+ }
+
+ /* Not all digits matched. */
+ if (i < len)
+ continue;
+ }
+ /* No conversions */
+ else
+ continue;
+
+ /* Address matched. Check message reference. */
+ g_hash_table_iter_init(&iter, id_table);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ node = value;
+
+ /* Address and MR matched */
+ if (node->mrs[offset] & bit)
+ break;
+
+ node = NULL;
+ }
+
+ /*
+ * Received address with MR matched with one
+ * of the stored addresses and MR, so no need
+ * to continue searching.
+ */
+ if (node)
+ break;
+ }
}
/* Unable to find a message reference belonging to this address */
@@ -2913,13 +2982,15 @@ gboolean status_report_assembly_report(struct status_report_assembly *assembly,
msgid = (unsigned char *) key;
+ sms_address_from_string(&addr, s_addr);
+
if (pending == TRUE && node->deliverable == TRUE) {
/*
* More status reports expected, and already received
* reports completed. Update backup file.
*/
sr_assembly_add_fragment_backup(assembly->imsi, node,
- &status_report->status_report.raddr,
+ &addr,
msgid);
return FALSE;
@@ -2932,14 +3003,14 @@ gboolean status_report_assembly_report(struct status_report_assembly *assembly,
memcpy(out_msgid, msgid, SMS_MSGID_LEN);
sr_assembly_remove_fragment_backup(assembly->imsi,
- &status_report->status_report.raddr,
+ &addr,
msgid);
g_hash_table_iter_remove(&iter);
if (g_hash_table_size(id_table) == 0)
g_hash_table_remove(assembly->assembly_table,
- status_report->status_report.raddr.address);
+ s_addr);
return TRUE;
}
--
1.6.3.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [RFC PATCH 2/2] unit: add fuzzy address check to test-sms
2010-09-21 17:12 [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Petteri Tikander
@ 2010-09-21 17:12 ` Petteri Tikander
2010-09-22 21:33 ` [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Denis Kenzior
1 sibling, 0 replies; 3+ messages in thread
From: Petteri Tikander @ 2010-09-21 17:12 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 3069 bytes --]
---
unit/test-sms.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 42 insertions(+), 1 deletions(-)
diff --git a/unit/test-sms.c b/unit/test-sms.c
index d7a1b4d..f0089e0 100644
--- a/unit/test-sms.c
+++ b/unit/test-sms.c
@@ -1273,8 +1273,11 @@ static void test_sr_assembly()
"940A00";
const char *sr_pdu2 = "06050D91945152991136F00160124130640A0160124130"
"450A00";
+ const char *sr_pdu3 = "0606098121436587F9019012413064A0019012413045A0"
+ "00";
struct sms sr1;
struct sms sr2;
+ struct sms sr3;
unsigned char pdu[176];
long pdu_len;
struct status_report_assembly *sra;
@@ -1285,7 +1288,7 @@ static void test_sr_assembly()
16, 17, 18, 19 };
unsigned char id[SMS_MSGID_LEN];
- /* mr 4 & mr 5 */
+ /* international address, mr 4 & mr 5 */
decode_hex_own_buf(sr_pdu1, -1, &pdu_len, 0, pdu);
g_assert(sms_decode(pdu, pdu_len, FALSE, 26, &sr1) == TRUE);
@@ -1293,6 +1296,11 @@ static void test_sr_assembly()
decode_hex_own_buf(sr_pdu2, -1, &pdu_len, 0, pdu);
g_assert(sms_decode(pdu, pdu_len, FALSE, 26, &sr2) == TRUE);
+ /* national address, mr 6 */
+
+ decode_hex_own_buf(sr_pdu3, -1, &pdu_len, 0, pdu);
+ g_assert(sms_decode(pdu, pdu_len, FALSE, 24, &sr3) == TRUE);
+
g_print("sr1 address: %s, mr: %d\n",
sms_address_to_string(&sr1.status_report.raddr),
sr1.status_report.mr);
@@ -1301,6 +1309,10 @@ static void test_sr_assembly()
sms_address_to_string(&sr2.status_report.raddr),
sr2.status_report.mr);
+ g_print("sr3 address: %s, mr: %d\n",
+ sms_address_to_string(&sr3.status_report.raddr),
+ sr3.status_report.mr);
+
sms_address_from_string(&addr, "+4915259911630");
sra = status_report_assembly_new(NULL);
@@ -1319,6 +1331,35 @@ static void test_sr_assembly()
g_assert(memcmp(id, sha1, SMS_MSGID_LEN) == 0);
g_assert(delivered == TRUE);
+
+ /*
+ * Send sms-message in the national address-format,
+ * but receive in the international address-format.
+ */
+ sms_address_from_string(&addr, "9911630");
+ status_report_assembly_add_fragment(sra, sha1, &addr, 4, time(NULL), 2);
+ status_report_assembly_add_fragment(sra, sha1, &addr, 5, time(NULL), 2);
+
+ g_assert(!status_report_assembly_report(sra, &sr1, id, &delivered));
+ g_assert(status_report_assembly_report(sra, &sr2, id, &delivered));
+
+ g_assert(memcmp(id, sha1, SMS_MSGID_LEN) == 0);
+ g_assert(delivered == TRUE);
+ g_assert(g_hash_table_size(sra->assembly_table) == 0);
+
+ /*
+ * Send sms-message in the international address-format,
+ * but receive in the national address-format.
+ */
+ sms_address_from_string(&addr, "+358123456789");
+ status_report_assembly_add_fragment(sra, sha1, &addr, 6, time(NULL), 1);
+
+ g_assert(status_report_assembly_report(sra, &sr3, id, &delivered));
+
+ g_assert(memcmp(id, sha1, SMS_MSGID_LEN) == 0);
+ g_assert(delivered == TRUE);
+ g_assert(g_hash_table_size(sra->assembly_table) == 0);
+
status_report_assembly_free(sra);
}
--
1.6.3.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [RFC PATCH 1/2] smsutil: add fuzzy address check for status report
2010-09-21 17:12 [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Petteri Tikander
2010-09-21 17:12 ` [RFC PATCH 2/2] unit: add fuzzy address check to test-sms Petteri Tikander
@ 2010-09-22 21:33 ` Denis Kenzior
1 sibling, 0 replies; 3+ messages in thread
From: Denis Kenzior @ 2010-09-22 21:33 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 386 bytes --]
On 09/21/2010 12:12 PM, Petteri Tikander wrote:
> ---
> src/smsutil.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++---------
> 1 files changed, 87 insertions(+), 16 deletions(-)
Both patches have been applied, thanks! I reflowed the first patch a
bit just to make it a little easier to follow.
I've also marked the status report task as done.
Thanks,
-Denis
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-09-22 21:33 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-21 17:12 [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Petteri Tikander
2010-09-21 17:12 ` [RFC PATCH 2/2] unit: add fuzzy address check to test-sms Petteri Tikander
2010-09-22 21:33 ` [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Denis Kenzior
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.