Hi,

I will add the documentation next week.  I am on vacation the remainder of this 
week.

Regards,

Kelvin R. Porter

Sent from my iPhone

On Jul 3, 2013, at 5:44 AM, "hbil...@ecommunicate.biz" 
<hbil...@ecommunicate.biz> wrote:

> 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;
> 
> 

Reply via email to