Hi Kevin, Yes there is interest for this patch please provide the documentation to enable it to be submitted. We hope the Kannel maintainers will include this useful patch.
thanks ---------------------------------------------------------------------- Date: Tue, 2 Jul 2013 13:27:44 -0500 From: "Porter, Kelvin" <kelvin.por...@h3net.com> To: "devel@kannel.org" <devel@kannel.org> Subject: Add receiver based smsc-route to opensmppbox Message-ID: <73e6bc00a0e3dc4fb8b924269261d52d2e042b8...@mail1.hypercube-llc.com> Content-Type: text/plain; charset="us-ascii" Hi, I am faced with a need to do receiver-based routing to different SMSC connections within a opensmppbox and bearerbox configuration. I have a large number of numbers that need to be routed and they do not share a common prefix. I have not seen a way to do this using existing functionality. I have developed the following enhancement to opensmppbox. I have added "receiver-shortcode" to the group "smsc-route". "receiver-shortcode" enables the user to specify that a message should be assigned to a smsc-id based upon the _receiver_ of a message; not the _sender_. The receiver-based routing takes higher precedence than the sender "shortcode" or "smsbox-id" or combination. I did not implement a combination logic; although I could consider it, if it was desired.... I have included the patch below. If there is interest in incorporating it, then I can develop a patch for the documentation, as well. Please share any feedback. Thank you. Regards, Kelvin R. Porter Index: gw/opensmppbox-cfg.def =================================================================== --- gw/opensmppbox-cfg.def (revision 72) +++ gw/opensmppbox-cfg.def (working copy) @@ -86,4 +86,5 @@ OCTSTR(smsc-id) OCTSTR(smsbox-id) OCTSTR(shortcode) + OCTSTR(receiver-shortcode) ) Index: gw/opensmppbox.c =================================================================== --- gw/opensmppbox.c (revision 72) +++ gw/opensmppbox.c (working copy) @@ -116,6 +116,7 @@ static long smpp_dest_addr_ton = -1; static long smpp_dest_addr_npi = -1; +static Dict *smsc_by_receiver = NULL; static Dict *smsc_by_smsbox_id = NULL; static Dict *smsc_by_sender = NULL; static Dict *smsc_by_sender_smsbox_id = NULL; @@ -1784,10 +1785,17 @@ if (msg->sms.smsc_id != NULL) return msg->sms.smsc_id; - os = octstr_format("%s:%s", octstr_get_cstr(msg->sms.sender), - octstr_get_cstr(box->boxc_id)); + char *receiver = octstr_get_cstr(msg->sms.receiver); + if ( (receiver) && (strlen(receiver) > 0) ) { + smsc_id = dict_get(smsc_by_receiver, msg->sms.receiver); + os = octstr_format("receiver:%s", receiver); + }; - smsc_id = dict_get(smsc_by_sender_smsbox_id, os); + if (!smsc_id) { + os = octstr_format("%s:%s", octstr_get_cstr(msg->sms.sender), + octstr_get_cstr(box->boxc_id)); + smsc_id = dict_get(smsc_by_sender_smsbox_id, os); + }; if (!smsc_id) smsc_id = dict_get(smsc_by_sender, msg->sms.sender); if (!smsc_id) @@ -2251,14 +2259,15 @@ { CfgGroup *grp; List *list, *items; - Octstr *smsc_id, *boxc_ids, *shortcodes; + Octstr *smsc_id, *boxc_ids, *shortcodes, *receiver_shortcodes; int i, j; + smsc_by_receiver = dict_create(1000, (void(*)(void *)) + octstr_destroy); smsc_by_smsbox_id = dict_create(30, (void(*)(void *)) octstr_destroy); smsc_by_sender = dict_create(50, (void(*)(void *)) octstr_destroy); smsc_by_sender_smsbox_id = dict_create(50, (void(*)(void *)) octstr_destroy); - smsc_id = boxc_ids = shortcodes = NULL; + smsc_id = boxc_ids = shortcodes = receiver_shortcodes = NULL; list = items = NULL; list = cfg_get_multi_group(cfg, octstr_imm("smsc-route")); @@ -2281,7 +2290,26 @@ */ boxc_ids = cfg_get(grp, octstr_imm("smsbox-id")); shortcodes = cfg_get(grp, octstr_imm("shortcode")); + receiver_shortcodes = cfg_get(grp, octstr_imm("receiver-shortcode")); + /* Consider the receiver options: receiver-shortcode. */ + { + /* receiver-shortcode applies to all MTs from all smscs */ + items = octstr_split(receiver_shortcodes, octstr_imm(";")); + for (i = 0; i < gwlist_len(items); i++) { + Octstr *item = gwlist_get(items, i); + octstr_strip_blanks(item); + + debug("opensmppbox",0,"Adding smsc routing to id <%s> for receiver no <%s>", + octstr_get_cstr(smsc_id), octstr_get_cstr(item)); + + if (!dict_put_once(smsc_by_receiver, item, octstr_duplicate(smsc_id))) + panic(0, "Routing for receiver no <%s> already exists!", + octstr_get_cstr(item)); + } + gwlist_destroy(items, octstr_destroy_item); + }; + /* consider now the 3 possibilities: */ if (boxc_ids && !shortcodes) { /* smsbox-id only, so all MT traffic */ @@ -2311,7 +2339,7 @@ octstr_get_cstr(smsc_id), octstr_get_cstr(item)); if (!dict_put_once(smsc_by_sender, item, octstr_duplicate(smsc_id))) - panic(0, "Routing for receiver no <%s> already exists!", + panic(0, "Routing for sender no <%s> already + exists!", octstr_get_cstr(item)); } gwlist_destroy(items, octstr_destroy_item); @@ -2354,6 +2382,9 @@ static void destroy_smsc_routes(void) { + dict_destroy(smsc_by_receiver); + smsc_by_receiver = NULL; + dict_destroy(smsc_by_smsbox_id); smsc_by_smsbox_id = NULL;