* [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 a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox