Hi,

   Wierd because I sent it as an attachment.

Kind Regards,

-----Original Message-----
From: Alexander Malysh [mailto:malys...@googlemail.com] On Behalf Of Alexander Malysh
Sent: Tuesday, September 14, 2010 6:44 PM
To: Michael Zervakis
Cc: devel@kannel.org; aguerri...@kannel.org
Subject: Re: [PATCH] fix bug #529 (sms-resend-* ignored for concatenated messages)



could you please send your patch as attachment ?



Thanks,

Alexander Malysh



Am 14.09.2010 um 16:09 schrieb Michael Zervakis:



>

> Hi,

>

> I moved smscconn_uuid to struct split_parts. Please check.

>

> BR,

>

> -----Original Message-----

> From: Alexander Malysh [mailto:malys...@googlemail.com] On Behalf Of Alexander Malysh

> Sent: Tuesday, September 14, 2010 1:02 AM

> To: Michael Zervakis

> Cc: devel@kannel.org; aguerri...@kannel.org

> Subject: Re: [PATCH] fix bug #529 (sms-resend-* ignored for concatenated messages)

>

>

> Hi Michael,

>

>

> you don't have to alter Msg struct. Just add smscconn_uuid to struct split_parts in gw/msg.h.

>

>

> Thanks,

>

> Alexander Malysh

>

>

> Am 13.09.2010 um 21:31 schrieb Michael Zervakis:

>

>

> >

>

> >

>

> > Hi,

>

> >

>

> > I forgot to mention that msg->msg_ConnId uuid is not saved in store since it's useless because if the process restarts the whole Msg will be resend. At least this solution will apply sms-resend-* directives for long sms.

>

> >

>

> > BR,

>

> >

>

> > -----Original Message-----

>

> > From: Alejandro Guerrieri [mailto:aguerri...@kannel.org]

>

> > Sent: Monday, September 13, 2010 8:25 PM

>

> > To: Alexander Malysh

>

> > Cc: Michael Zervakis; malys...@googlemail.com; devel@kannel.org

>

> > Subject: Re: [PATCH] fix bug #529 (sms-resend-* ignored for concatenated messages)

>

> >

>

> >

>

> > The uuid would be different each time you start the service right?

>

> >

>

> >

>

> > What would happen if Kannel is restarted and there were pending parts to send? The new uuid wouldn't match with the pending segments.

>

> >

>

> >

>

> > Regards,

>

> >

>

> > --

>

> >

>

> > Alejandro Guerrieri

>

> >

>

> > aguerri...@kannel.org

>

> >

>

> >

>

> >

>

> >

>

> > On 13/09/2010, at 19:16, Alexander Malysh wrote:

>

> >

>

> >

>

> > > Hi,

>

> >

>

> > >

>

> >

>

> > > great idea to use uuid to uniquely identify smscconn. we can use this for http admin as well.

>

> >

>

> > >

>

> >

>

> > > Thanks,

>

> >

>

> > > Alexander Malysh

>

> >

>

> > >

>

> >

>

> > > Am 13.09.2010 um 19:04 schrieb Michael Zervakis:

>

> >

>

> > >

>

> >

>

> > >> Hi,

>

> >

>

> > >>

>

> >

>

> > >> I figured out that we can use the same mechanism as in Msg struct to uniquelly identify each SMSCconn. In the attached patch the smscconn struct was modified to include a uuid_t field and Msg struct to store the smscconn uuid_t if we get a temporary error. Smsc_rout2 was also modified to respect msg->msg_ConnId if set.

>

> >

>

> > >>

>

> >

>

> > >> SMSC-A -> splits (2 parts) -> 1 part sent OK -> 2 part get temp. error -> write the conn->uuid_t and put it into global queue for resend -> router reads msg->msg_ConnId and sends failed part via same connection (if still active)

>

> >

>

> > >>

>

> >

>

> > >>

>

> >

>

> > >> -----Original Message-----

>

> >

>

> > >> From: Alexander Malysh [mailto:malys...@googlemail.com] On Behalf Of Alexander Malysh

>

> >

>

> > >> Sent: Sunday, September 12, 2010 1:06 PM

>

> >

>

> > >> To: Michael Zervakis

>

> >

>

> > >> Cc: devel@kannel.org; pon...@appcell.net

>

> >

>

> > >> Subject: Re: [PATCH] fix bug #529 (sms-resend-* ignored for concatenated messages)

>

> >

>

> > >>

>

> >

>

> > >>

>

> >

>

> > >> Hi,

>

> >

>

> > >>

>

> >

>

> > >>

>

> >

>

> > >> as I already wrote, this patch is not enough. Please see ML wy...

>

> >

>

> > >>

>

> >

>

> > >>

>

> >

>

> > >> Thanks,

>

> >

>

> > >>

>

> >

>

> > >> Alexander Malysh

>

> >

>

> > >>

>

> >

>

> > >>

>

> >

>

> > >>

>

> >

>

> > >> Am 09.09.2010 um 19:04 schrieb Michael Zervakis:

>

> >

>

> > >>

>

> >

>

> > >>

>

> >

>

> > >>> Hi,

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> This patch is a possible solution fog Bug #529. The Msg definition was modified so we can store the conn->id originally selected by router.

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> SMSC-A -> splits (2 parts) -> 1 part sent OK -> 2 part get temp. error -> write the conn->id and put it into global queue for resend -> router reads msg->sms.msg_ConnId and sends failed part via same connection (if still active)

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> Regards,

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> From: devel-boun...@kannel.org [mailto:devel-boun...@kannel.org] On Behalf Of Konstantin Vayner

>

> >

>

> > >>

>

> >

>

> > >>> Sent: Thursday, December 17, 2009 12:28 PM

>

> >

>

> > >>

>

> >

>

> > >>> To: Alexander Malysh

>

> >

>

> > >>

>

> >

>

> > >>> Cc: devel@kannel.org

>

> >

>

> > >>

>

> >

>

> > >>> Subject: Re: [PATCH] fix bug #529 (sms-resend-* ignored for concatenated messages)

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> why remembering smsc-id in sms.smsc_id is not enough?

>

> >

>

> > >>

>

> >

>

> > >>> how does smsbox remember routing when i submit a message with predefined smsc id from http (sendsms) ?

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> On Thu, Dec 17, 2009 at 12:10 PM, Alexander Malysh <amal...@kannel.org> wrote:

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> Am 17.12.2009 um 10:43 schrieb Konstantin Vayner:

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> so the best option would be to requeue the part via same smsc, right ?

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> yes, but it's not easy todo. You have to remember SMSC pointer not only SMSC-name/id and then teach all routing parts

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> to respect it...

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> cause requeueing all parts may also get extra messages to the handset despite it not being able to reconstruct (not to mention the extra money ;) )

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> On Thu, Dec 17, 2009 at 11:33 AM, Alexander Malysh <amal...@kannel.org> wrote:

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> Hi,

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> unfortunately this will not work as expected (the rule is: _all_ parts if multipart message have to be send via the same SMSC)...

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> example:

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> SMSC-A -> splits (2 parts) -> 1 part sent OK -> 2 part get temp. error -> you put it into global queue for resend -> 2 part sent via SMSC-B -> handset rejects it

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> We have only two possibility here:

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> 1) if temp error occurs put the _whole_ message into resend queue and resend then _all_ parts (very easy todo)

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> 2) remember smsc which was used for first parts and resend it via the same smsc (complicated but save money :) )

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> Thanks,

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> Alexander Malysh

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> Am 16.12.2009 um 18:17 schrieb Konstantin Vayner:

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> Bug report: http://redmine.kannel.org/issues/show/529

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> Quote from gw/bb_smscconn.c :

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> static void handle_split(SMSCConn *conn, Msg *msg, long reason)

>

> >

>

> > >>

>

> >

>

> > >>> {

>

> >

>

> > >>

>

> >

>

> > >>>  struct split_parts *split = msg->sms.split_parts;

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>  /*

>

> >

>

> > >>

>

> >

>

> > >>> * If temporarely failed, try again immediately but only if connection active.

>

> >

>

> > >>

>

> >

>

> > >>> * Because if connection is not active we will loop for ever here consuming 100% CPU

>

> >

>

> > >>

>

> >

>

> > >>> * time due to internal queue cleanup in smsc module that call bb_smscconn_failed.

>

> >

>

> > >>

>

> >

>

> > >>>   */

>

> >

>

> > >>

>

> >

>

> > >>> if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE &&

>

> >

>

> > >>

>

> >

>

> > >>>      smscconn_send(conn, msg) == 0) {

>

> >

>

> > >>

>

> >

>

> > >>> /* destroy this message because it will be duplicated in smsc module */

>

> >

>

> > >>

>

> >

>

> > >>>      msg_destroy(msg);

>

> >

>

> > >>

>

> >

>

> > >>>      return;

>

> >

>

> > >>

>

> >

>

> > >>>  }

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> (end quote)

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> So, if an smsc is alive and throws temporary error every time you try to submit such a message, we enter endless loop of attempting to resend it....

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> Suggested patch follows (also attached).

>

> >

>

> > >>

>

> >

>

> > >>> Sorry its not cvs diff - having firewall issues accessing pserver now so i ran diff vs snapshot generated yesterday

>

> >

>

> > >>

>

> >

>

> > >>> I will be able to produce a normal cvs diff tomorrow morning if it is needed

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> --- kannel-snapshot/gw/bb_smscconn.c 2009-11-15 16:12:28.000000000 +0200

>

> >

>

> > >>

>

> >

>

> > >>> +++ gateway-cvs/gw/bb_smscconn.c 2009-12-16 19:47:32.000000000 +0200

>

> >

>

> > >>

>

> >

>

> > >>> @@ -203,18 +203,6 @@

>

> >

>

> > >>

>

> >

>

> > >>>   struct split_parts *split = msg->sms.split_parts;

>

> >

>

> > >>

>

> >

>

> > >>>      /*

>

> >

>

> > >>

>

> >

>

> > >>> - * If temporarely failed, try again immediately but only if connection active.

>

> >

>

> > >>

>

> >

>

> > >>> - * Because if connection is not active we will loop for ever here consuming 100% CPU

>

> >

>

> > >>

>

> >

>

> > >>> - * time due to internal queue cleanup in smsc module that call bb_smscconn_failed.

>

> >

>

> > >>

>

> >

>

> > >>> -     */

>

> >

>

> > >>

>

> >

>

> > >>> - if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE &&

>

> >

>

> > >>

>

> >

>

> > >>> -        smscconn_send(conn, msg) == 0) {

>

> >

>

> > >>

>

> >

>

> > >>> - /* destroy this message because it will be duplicated in smsc module */

>

> >

>

> > >>

>

> >

>

> > >>> -        msg_destroy(msg);

>

> >

>

> > >>

>

> >

>

> > >>> -        return;

>

> >

>

> > >>

>

> >

>

> > >>> -    }

>

> >

>

> > >>

>

> >

>

> > >>> -   -    /*

>

> >

>

> > >>

>

> >

>

> > >>>    * if the reason is not a success and status is still success

>

> >

>

> > >>

>

> >

>

> > >>>    * then set status of a split to the reason.

>

> >

>

> > >>

>

> >

>

> > >>> * Note: reason 'malformed','discarded' or 'rejected' has higher priority!

>

> >

>

> > >>

>

> >

>

> > >>> @@ -303,7 +291,7 @@

>

> >

>

> > >>

>

> >

>

> > >>> void bb_smscconn_send_failed(SMSCConn *conn, Msg *sms, int reason, Octstr *reply)

>

> >

>

> > >>

>

> >

>

> > >>> {

>

> >

>

> > >>

>

> >

>

> > >>> -    if (sms->sms.split_parts != NULL) {

>

> >

>

> > >>

>

> >

>

> > >>> + if (reason != SMSCCONN_FAILED_TEMPORARILY && sms->sms.split_parts != NULL) {

>

> >

>

> > >>

>

> >

>

> > >>>       handle_split(conn, sms, reason);

>

> >

>

> > >>

>

> >

>

> > >>>       octstr_destroy(reply);

>

> >

>

> > >>

>

> >

>

> > >>>       return;

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> <bb_smscconn.diff>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> Index: gw/bb_smscconn.c

>

> >

>

> > >>

>

> >

>

> > >>> ===================================================================

>

> >

>

> > >>

>

> >

>

> > >>> --- gw/bb_smscconn.c  (revision 4838)

>

> >

>

> > >>

>

> >

>

> > >>> +++ gw/bb_smscconn.c  (working copy)

>

> >

>

> > >>

>

> >

>

> > >>> @@ -207,11 +207,34 @@

>

> >

>

> > >>

>

> >

>

> > >>> * Because if connection is not active we will loop for ever here consuming 100% CPU

>

> >

>

> > >>

>

> >

>

> > >>> * time due to internal queue cleanup in smsc module that call bb_smscconn_failed.

>

> >

>

> > >>

>

> >

>

> > >>>     */

>

> >

>

> > >>

>

> >

>

> > >>> - if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE &&

>

> >

>

> > >>

>

> >

>

> > >>> -        smscconn_send(conn, msg) == 0) {

>

> >

>

> > >>

>

> >

>

> > >>> + /*if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE &&

>

> >

>

> > >>

>

> >

>

> > >>> +        smscconn_send(conn, msg) == 0) { */

>

> >

>

> > >>

>

> >

>

> > >>> /* destroy this message because it will be duplicated in smsc module */

>

> >

>

> > >>

>

> >

>

> > >>> -        msg_destroy(msg);

>

> >

>

> > >>

>

> >

>

> > >>> +    /*    msg_destroy(msg);

>

> >

>

> > >>

>

> >

>

> > >>>        return;

>

> >

>

> > >>

>

> >

>

> > >>> +    }*/

>

> >

>

> > >>

>

> >

>

> > >>> +
> > >>> +

> > >>> +

>

> >

>

> > >>

>

> >

>

> > >>> + if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE)

>

> >

>

> > >>

>

> >

>

> > >>> +    {

>

> >

>

> > >>

>

> >

>

> > >>> + if (sms_resend_retry >= 0 && msg->sms.resend_try >= sms_resend_retry) /*check how many times the split message has been sent */

>

> >

>

> > >>

>

> >

>

> > >>> +       {

>

> >

>

> > >>> + warning(0, "SMPP[%s] :Maximum retries for message [%s] exceeded resend %ld times, discarding it!", octstr_get_cstr(conn->id), octstr_get_cstr(msg->sms.msgdata),msg->sms.resend_try);

>

> >

>

> > >>

>

> >

>

> > >>> +          handle_split(conn, msg, SMSCCONN_FAILED_DISCARDED);

>

> >

>

> > >>> +          /* msg_destroy(msg); */

>

> >

>

> > >>

>

> >

>

> > >>> +          return;

>

> >

>

> > >>

>

> >

>

> > >>> +       }

>

> >

>

> > >>

>

> >

>

> > >>> + > > >>> + warning(0, "SMPP[%s] :Split message failed temporarily sending back to sms_router", octstr_get_cstr(conn->id));

>

> >

>

> > >>

>

> >

>

> > >>> + > > >>> + msg->sms.resend_try = (msg->sms.resend_try > 0 ? msg->sms.resend_try + 1 : 1);

>

> >

>

> > >>

>

> >

>

> > >>> + debug("bb.sms.splits", 0, "SMPP[%s] :Resend counter of message set to %ld", octstr_get_cstr(conn->id),msg->sms.resend_try);

>

> >

>

> > >>

>

> >

>

> > >>> +       time(&msg->sms.resend_time);

>

> >

>

> > >>

>

> >

>

> > >>> +       msg->sms.msg_ConnId = octstr_duplicate(conn->id);

>

> >

>

> > >>> + > > >>> + gwlist_produce(outgoing_sms, msg); /* write it back to global queue */

>

> >

>

> > >>

>

> >

>

> > >>> +       return;

>

> >

>

> > >>

>

> >

>

> > >>>    }

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>    /*

>

> >

>

> > >>

>

> >

>

> > >>> @@ -1229,6 +1252,28 @@

>

> >

>

> > >>

>

> >

>

> > >>>    bp_load = bo_load = queue_length = 0;

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>>    conn = NULL;

>

> >

>

> > >>

>

> >

>

> > >>> + /* if msg was a failed part then route to the defined SMSC connection */

>

> >

>

> > >>

>

> >

>

> > >>> +    if (msg->sms.msg_ConnId != NULL)

>

> >

>

> > >>

>

> >

>

> > >>> +    {

> > >>> +       for (i=0; i < gwlist_len(smsc_list); i++)

>

> >

>

> > >>

>

> >

>

> > >>> +       {

>

> >

>

> > >>

>

> >

>

> > >>> +          conn = gwlist_get(smsc_list,  i);

>

> >

>

> > >>

>

> >

>

> > >>> +          smscconn_info(conn, &info);

>

> >

>

> > >>

>

> >

>

> > >>> +          queue_length += (info.queued > 0 ? info.queued : 0);

>

> >

>

> > >>

>

> >

>

> > >>> +
> > >>> +          if(octstr_compare(msg->sms.msg_ConnId, conn->id) == 0)

>

> >

>

> > >>

>

> >

>

> > >>> +          {

>

> >

>

> > >>> + if((smscconn_usable(conn,msg) != -1) && (info.status == SMSCCONN_ACTIVE && info.queued < max_queue))

>

> >

>

> > >>

>

> >

>

> > >>> +             {

>

> >

>

> > >>

>

> >

>

> > >>> +                best_preferred = conn;

>

> >

>

> > >>> + debug("bb.sms",0,"Message with pre-set connection to SMSC[%s] found",octstr_get_cstr(msg->sms.msg_ConnId));

>

> >

>

> > >>

>

> >

>

> > >>> +                continue;

>

> >

>

> > >>

>

> >

>

> > >>> +             }

>

> >

>

> > >>

>

> >

>

> > >>> +          }

>

> >

>

> > >>

>

> >

>

> > >>> +       }

>

> >

>

> > >>

>

> >

>

> > >>> +    }

>

> >

>

> > >>

>

> >

>

> > >>> +    else

>

> >

>

> > >>

>

> >

>

> > >>> +    {

>

> >

>

> > >>

>

> >

>

> > >>>    for (i=0; i < gwlist_len(smsc_list); i++) {

>

> >

>

> > >>

>

> >

>

> > >>>    conn = gwlist_get(smsc_list,  (i+s) % gwlist_len(smsc_list));

>

> >

>

> > >>

>

> >

>

> > >>>

>

> >

>

> > >>

>

> >

>

> > >>> @@ -1265,6 +1310,8 @@

>

> >

>

> > >>

>

> >

>

> > >>>        bo_load = info.load;

>

> >

>

> > >>

>

> >

>

> > >>>    }

>

> >

>

> > >>

>

> >

>

> > >>>    }

>

> >

>

> > >>

>

> >

>

> > >>> +    }

>

> >

>

> > >>

>

> >

>

> > >>> +

> > >>>    queue_length += gwlist_len(outgoing_sms);

>

> >

>

> > >>

>

> >

>

> > >>>    if (max_outgoing_sms_qlength > 0 && !resend &&

>

> >

>

> > >>

>

> >

>

> > >>> queue_length > gwlist_len(smsc_list) * max_outgoing_sms_qlength) {

>

> >

>

> > >>

>

> >

>

> > >>> Index: gw/msg-decl.h

>

> >

>

> > >>

>

> >

>

> > >>> ===================================================================

>

> >

>

> > >>

>

> >

>

> > >>> --- gw/msg-decl.h     (revision 4838)

>

> >

>

> > >>

>

> >

>

> > >>> +++ gw/msg-decl.h     (working copy)

>

> >

>

> > >>

>

> >

>

> > >>> @@ -85,6 +85,7 @@

>

> >

>

> > >>

>

> >

>

> > >>>        OCTSTR(msgdata)

>

> >

>

> > >>

>

> >

>

> > >>>        INTEGER(time)

>

> >

>

> > >>

>

> >

>

> > >>>        OCTSTR(smsc_id)

>

> >

>

> > >>

>

> >

>

> > >>> + OCTSTR(msg_ConnId); /* field required to reroute concatenated Msg parts via the same SMSC connection. Bug 529*/

>

> >

>

> > >>

>

> >

>

> > >>>        OCTSTR(smsc_number)

>

> >

>

> > >>

>

> >

>

> > >>>        OCTSTR(foreign_id)

>

> >

>

> > >>

>

> >

>

> > >>>        OCTSTR(service)

>

> >

>

> > >>

>

> >

>

> > >>

>

> >

>

> > >> Index: bb_smscconn.c

>

> >

>

> > >> ===================================================================

>

> >

>

> > >> --- bb_smscconn.c    (revision 4843)

>

> >

>

> > >> +++ bb_smscconn.c    (working copy)

>

> >

>

> > >> @@ -201,17 +201,46 @@

>

> >

>

> > >> static void handle_split(SMSCConn *conn, Msg *msg, long reason)

>

> >

>

> > >> {

>

> >

>

> > >>    struct split_parts *split = msg->sms.split_parts;

>

> >

>

> > >> +    char id[UUID_STR_LEN + 1];

>

> >

>

> > >>

>

> >

>

> > >> +
> > >>    /*

>

> >

>

> > >> * If temporarely failed, try again immediately but only if connection active.

>

> >

>

> > >> * Because if connection is not active we will loop for ever here consuming 100% CPU

>

> >

>

> > >> * time due to internal queue cleanup in smsc module that call bb_smscconn_failed.

>

> >

>

> > >>     */

>

> >

>

> > >> - if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE &&

>

> >

>

> > >> -        smscconn_send(conn, msg) == 0) {

>

> >

>

> > >> + /*if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE &&

>

> >

>

> > >> +        smscconn_send(conn, msg) == 0) { */

>

> >

>

> > >> /* destroy this message because it will be duplicated in smsc module */

>

> >

>

> > >> -        msg_destroy(msg);

>

> >

>

> > >> +    /*    msg_destroy(msg);

>

> >

>

> > >>        return;

>

> >

>

> > >> +    }*/

>

> >

>

> > >> + > > >> + > > >> + if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE)

>

> >

>

> > >> +    {

>

> >

>

> > >> + if (sms_resend_retry >= 0 && msg->sms.resend_try >= sms_resend_retry) /*check how many times the split message has been sent */

>

> >

>

> > >> +       {

>

> > >> +          uuid_unparse(msg->sms.id, id);

>

> >

>

> > >> + warning(0, "SMPP[%s] :Maximum retries for message [%s] exceeded resend %ld times, discarding it!", octstr_get_cstr(conn->id), id, msg->sms.resend_try);

>

> >

>

> > >> +          handle_split(conn, msg, SMSCCONN_FAILED_DISCARDED);

>

> > >> +          return;

>

> >

>

> > >> +       }

>

> >

>

> > >> + > > >> +
> > >> +       uuid_unparse(msg->sms.id, id);

>

> >

>

> > >> + warning(0, "SMPP[%s] :Split message [%s] failed temporary sending it to sms_router but with fixed connection", octstr_get_cstr(conn->id), id);

>

> > >> + > > >> + msg->sms.resend_try = (msg->sms.resend_try > 0 ? msg->sms.resend_try + 1 : 1); /* inc its retries */

>

> >

>

> > >> + debug("bb.sms.splits", 0, "SMPP[%s] :Resend counter of message [%s] set to %ld", octstr_get_cstr(conn->id), id, msg->sms.resend_try);

>

> >

>

> > >> + time(&msg->sms.resend_time); /* take resend time - this will be used in sms_router */

>

> >

>

> > >> + > > >> +
> > >> +       if(uuid_is_null(msg->msg_ConnId) == 1)

>

> >

>

> > >> +         uuid_copy(msg->msg_ConnId, conn->smscconn_uuid);

>

> >

>

> > >> + > > >> + gwlist_produce(outgoing_sms, msg); /* send it back to global queue */

>

> >

>

> > >> +       return;

>

> >

>

> > >>    }

>

> >

>

> > >>

>

> >

>

> > >>    /*

>

> >

>

> > >> @@ -1187,8 +1216,8 @@

>

> >

>

> > >>    long bp_load, bo_load;

>

> >

>

> > >>    int i, s, ret, bad_found, full_found;

>

> >

>

> > >>    long max_queue, queue_length;

>

> >

>

> > >> -    char *uf;

>

> >

>

> > >> -

>

> >

>

> > >> +    char *uf, id[UUID_STR_LEN + 1];

>

> >

>

> > >> +
> > >>    /* XXX handle ack here? */

>

> >

>

> > >>    if (msg_type(msg) != sms) {

>

> >

>

> > >> error(0, "Attempt to route non SMS message through smsc2_rout!");

>

> >

>

> > >> @@ -1229,6 +1258,29 @@

>

> >

>

> > >>    bp_load = bo_load = queue_length = 0;

>

> >

>

> > >>

>

> >

>

> > >>    conn = NULL;

>

> >

>

> > >> + /*if msg was a split and failed temporary then use stored connection */

>

> >

>

> > >> +    if(uuid_is_null(msg->msg_ConnId) != 1)

>

> >

>

> > >> + {
> > >> +       for (i=0; i < gwlist_len(smsc_list); i++)

>

> >

>

> > >> +       {

>

> >

>

> > >> +          conn = gwlist_get(smsc_list,  i);

>

> >

>

> > >> +          smscconn_info(conn, &info);

>

> >

>

> > >> +          queue_length += (info.queued > 0 ? info.queued : 0);

>

> >

>

> > >> + > > >> + if(uuid_compare(msg->msg_ConnId, conn->smscconn_uuid) == 0)

>

> >

>

> > >> +          {

>

> > >> + if((smscconn_usable(conn,msg) != -1) && (info.status == SMSCCONN_ACTIVE && info.queued < max_queue))

>

> >

>

> > >> +             {

>

> >

>

> > >> +                best_preferred = conn;

>

> > >> +                uuid_unparse(msg->sms.id, id);

>

> >

>

> > >> + debug("bb.sms",0,"Message [%s] with pre-set connection found", id);

>

> >

>

> > >> +                continue;

>

> >

>

> > >> +             }

>

> >

>

> > >> +          }

>

> >

>

> > >> +       }

>

> >

>

> > >> +    }

>

> >

>

> > >> +    else

>

> >

>

> > >> +    {

>

> >

>

> > >>    for (i=0; i < gwlist_len(smsc_list); i++) {

>

> >

>

> > >>    conn = gwlist_get(smsc_list,  (i+s) % gwlist_len(smsc_list));

>

> >

>

> > >>

>

> >

>

> > >> @@ -1265,6 +1317,8 @@

>

> >

>

> > >>        bo_load = info.load;

>

> >

>

> > >>    }

>

> >

>

> > >>    }

>

> >

>

> > >> +    }

>

> >

>

> > >> +
> > >>    queue_length += gwlist_len(outgoing_sms);

>

> >

>

> > >>    if (max_outgoing_sms_qlength > 0 && !resend &&

>

> >

>

> > >> queue_length > gwlist_len(smsc_list) * max_outgoing_sms_qlength) {

>

> >

>

> > >> Index: msg.c

>

> >

>

> > >> ===================================================================

>

> >

>

> > >> --- msg.c      (revision 4843)

>

> >

>

> > >> +++ msg.c      (working copy)

>

> >

>

> > >> @@ -98,6 +98,7 @@

>

> >

>

> > >>    msg = gw_malloc_trace(sizeof(Msg), file, line, func);

>

> >

>

> > >>

>

> >

>

> > >>    msg->type = type;

>

> >

>

> > >> +    uuid_clear(msg->msg_ConnId);

>

> >

>

> > >> #define INTEGER(name) p->name = MSG_PARAM_UNDEFINED;

>

> >

>

> > >> #define OCTSTR(name) p->name = NULL;

>

> >

>

> > >> #define UUID(name) uuid_generate(p->name);

>

> >

>

> > >> @@ -113,7 +114,7 @@

>

> >

>

> > >>    Msg *new;

>

> >

>

> > >>

>

> >

>

> > >>    new = msg_create(msg->type);

>

> >

>

> > >> -

>

> >

>

> > >> +    uuid_copy(new->msg_ConnId, msg->msg_ConnId);

>

> >

>

> > >> #define INTEGER(name) p->name = q->name;

>

> >

>

> > >> #define OCTSTR(name) \

>

> >

>

> > >>    if (q->name == NULL) p->name = NULL; \

>

> >

>

> > >> Index: msg.h

>

> >

>

> > >> ===================================================================

>

> >

>

> > >> --- msg.h      (revision 4843)

>

> >

>

> > >> +++ msg.h      (working copy)

>

> >

>

> > >> @@ -78,7 +78,7 @@

>

> >

>

> > >>

>

> >

>

> > >> typedef struct {

>

> >

>

> > >>    enum msg_type type;

>

> >

>

> > >> -

>

> >

>

> > >> + uuid_t msg_ConnId;
> > >>    #define INTEGER(name) long name;

>

> >

>

> > >>    #define OCTSTR(name) Octstr *name;

>

> >

>

> > >>    #define UUID(name) uuid_t name;

>

> >

>

> > >> Index: smscconn.c

>

> >

>

> > >> ===================================================================

>

> >

>

> > >> --- smscconn.c (revision 4843)

>

> >

>

> > >> +++ smscconn.c (working copy)

>

> >

>

> > >> @@ -157,13 +157,16 @@

>

> >

>

> > >>    Octstr *denied_prefix_regex;

>

> >

>

> > >>    Octstr *preferred_prefix_regex;

>

> >

>

> > >>    Octstr *tmp;

>

> >

>

> > >> -

>

> >

>

> > >> +    char id[UUID_STR_LEN + 1];

>

> >

>

> > >> +
> > >>    if (grp == NULL)

>

> >

>

> > >>    return NULL;

>

> >

>

> > >>

>

> >

>

> > >>    conn = gw_malloc(sizeof(*conn));

>

> >

>

> > >>    memset(conn, 0, sizeof(*conn));

>

> >

>

> > >>

>

> >

>

> > >> +    uuid_generate(conn->smscconn_uuid);

>

> >

>

> > >> +
> > >>    conn->why_killed = SMSCCONN_ALIVE;

>

> >

>

> > >>    conn->status = SMSCCONN_CONNECTING;

>

> >

>

> > >>    conn->connect_time = -1;

>

> >

>

> > >> @@ -295,7 +298,10 @@

>

> >

>

> > >>    gw_assert(conn->send_msg != NULL);

>

> >

>

> > >>

>

> >

>

> > >>    bb_smscconn_ready(conn);

>

> >

>

> > >> -

>

> >

>

> > >> +
> > >> +    uuid_unparse(conn->smscconn_uuid, id);

>

> >

>

> > >> + debug("smscconn",0,"Adding smsc connection [%s] with id [%s]", octstr_get_cstr(conn->id), id);

>

> >

>

> > >> +
> > >>    return conn;

>

> >

>

> > >> }

>

> >

>

> > >>

>

> >

>

> > >> Index: smscconn_p.h

>

> >

>

> > >> ===================================================================

>

> >

>

> > >> --- smscconn_p.h     (revision 4843)

>

> >

>

> > >> +++ smscconn_p.h     (working copy)

>

> >

>

> > >> @@ -146,6 +146,8 @@

>

> >

>

> > >> #include "smscconn.h"

>

> >

>

> > >>

>

> >

>

> > >> struct smscconn {

>

> >

>

> > >> + /* variable added in order to uniquely identify each smsc connection */

>

> >

>

> > >> +    uuid_t smscconn_uuid;

>

> >

>

> > >>    /* variables set by appropriate SMSCConn driver */

>

> >

>

> > >>    smscconn_status_t status;           /* see smscconn.h */

>

> >

>

> > >>    int   load;             /* load factor, 0 = no load */

>

> >

>

> > >

>

> >

>

> > >

>

> >

>

> >

>

>

> Index: gw/bb_smscconn.c

> ===================================================================

> --- gw/bb_smscconn.c  (revision 4843)

> +++ gw/bb_smscconn.c  (working copy)

> @@ -201,17 +201,46 @@

> static void handle_split(SMSCConn *conn, Msg *msg, long reason)

> {

>     struct split_parts *split = msg->sms.split_parts;

> +    char id[UUID_STR_LEN + 1];

>

> +
>     /*

> * If temporarely failed, try again immediately but only if connection active.

> * Because if connection is not active we will loop for ever here consuming 100% CPU

> * time due to internal queue cleanup in smsc module that call bb_smscconn_failed.

>      */

> - if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE &&

> -        smscconn_send(conn, msg) == 0) {

> + /*if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE &&

> +        smscconn_send(conn, msg) == 0) { */

> /* destroy this message because it will be duplicated in smsc module */

> -        msg_destroy(msg);

> +    /*    msg_destroy(msg);

>         return;

> +    }*/

> + > + > + if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == SMSCCONN_ACTIVE)

> +    {

> + if (sms_resend_retry >= 0 && msg->sms.resend_try >= sms_resend_retry)

> + {
> +          uuid_unparse(msg->sms.id, id);

> + warning(0, "SMSC [%s]: Maximum retries for message [%s] exceeded resend %ld times, discarding it!", octstr_get_cstr(conn->id), id, msg->sms.resend_try);

> + handle_split(conn, msg, SMSCCONN_FAILED_DISCARDED);
> +          return;

> +       }

> + > +
> +       uuid_unparse(msg->sms.id, id);

> + warning(0, "SMSC [%s]: Split message [%s] failed temporary appending smsc uuid", octstr_get_cstr(conn->id), id); > + > + msg->sms.resend_try = (msg->sms.resend_try > 0 ? msg->sms.resend_try + 1 : 1);

> + debug("bb.sms.splits", 0, "SMSC[%s]: Resend counter of message [%s] set to %ld", octstr_get_cstr(conn->id), id, msg->sms.resend_try);

> +       time(&msg->sms.resend_time);

> + > +
> +       if(uuid_is_null(split->msg_ConnId) == 1)

> +         uuid_copy(split->msg_ConnId, conn->smscconn_uuid);

> + > + gwlist_produce(outgoing_sms, msg); /* send it back to global queue */

> +       return;

>     }

>

>     /*

> @@ -1187,8 +1216,9 @@

>     long bp_load, bo_load;

>     int i, s, ret, bad_found, full_found;

>     long max_queue, queue_length;

> -    char *uf;

> -

> +    char *uf, id[UUID_STR_LEN + 1];

> +    struct split_parts *split = msg->sms.split_parts;

> +
>     /* XXX handle ack here? */

>     if (msg_type(msg) != sms) {

>         error(0, "Attempt to route non SMS message through smsc2_rout!");

> @@ -1229,6 +1259,32 @@

>     bp_load = bo_load = queue_length = 0;

>

>     conn = NULL;

> + /* if msg was a split and failed temporary then use last known connection */

> +    if(split != NULL)

> + {
> +       if(uuid_is_null(split->msg_ConnId) != 1)

> + {
> +          for (i=0; i < gwlist_len(smsc_list); i++)

> +          {

> +             conn = gwlist_get(smsc_list,  i);

> +             smscconn_info(conn, &info);

> +             queue_length += (info.queued > 0 ? info.queued : 0);

> + > + if(uuid_compare(split->msg_ConnId, conn->smscconn_uuid) == 0)

> + { > + if((smscconn_usable(conn,msg) != -1) && (info.status == SMSCCONN_ACTIVE && info.queued < max_queue))

> +                {

> + best_preferred = conn;
> +                   uuid_unparse(msg->sms.id, id);

> + debug("bb.sms",0,"Message [%s] with pre-set smsc uuid found", id);

> +                   continue; /* break; */

> +                }

> + }
> +          }

> +       }

> +    }

> +    else

> +    {

>     for (i=0; i < gwlist_len(smsc_list); i++) {

>     conn = gwlist_get(smsc_list,  (i+s) % gwlist_len(smsc_list));

>

> @@ -1265,6 +1321,8 @@

>         bo_load = info.load;

>     }

>     }

> +    }

> +
>     queue_length += gwlist_len(outgoing_sms);

>     if (max_outgoing_sms_qlength > 0 && !resend &&

> queue_length > gwlist_len(smsc_list) * max_outgoing_sms_qlength) {

> Index: gw/msg.h

> ===================================================================

> --- gw/msg.h    (revision 4843)

> +++ gw/msg.h    (working copy)

> @@ -85,12 +85,14 @@

>     #define VOID(name) void *name;

>     #define MSG(type, stmt) struct type stmt type;

>     #include "msg-decl.h"

> +
> } Msg;

>

> struct split_parts {

>     Msg *orig;

>     Counter *parts_left;

>     long status;

> +    uuid_t msg_ConnId;

> };

>

> /* enums for Msg fields */

> Index: gw/smscconn.c

> ===================================================================

> --- gw/smscconn.c     (revision 4843)

> +++ gw/smscconn.c     (working copy)

> @@ -157,13 +157,16 @@

>     Octstr *denied_prefix_regex;

>     Octstr *preferred_prefix_regex;

>     Octstr *tmp;

> -

> +    char id[UUID_STR_LEN + 1];

> +
>     if (grp == NULL)

>     return NULL;

>

>     conn = gw_malloc(sizeof(*conn));

>     memset(conn, 0, sizeof(*conn));

>

> +    uuid_generate(conn->smscconn_uuid);

> +
>     conn->why_killed = SMSCCONN_ALIVE;

>     conn->status = SMSCCONN_CONNECTING;

>     conn->connect_time = -1;

> @@ -295,7 +298,10 @@

>     gw_assert(conn->send_msg != NULL);

>

>     bb_smscconn_ready(conn);

> -

> +
> +    uuid_unparse(conn->smscconn_uuid, id);

> + debug("smscconn",0,"Adding smsc connection [%s] with uuid [%s]", octstr_get_cstr(conn->id), id);

> +
>     return conn;

> }

>

> Index: gw/smscconn_p.h

> ===================================================================

> --- gw/smscconn_p.h   (revision 4843)

> +++ gw/smscconn_p.h   (working copy)

> @@ -146,6 +146,8 @@

> #include "smscconn.h"

>

> struct smscconn {

> + /* variable added in order to uniquely identify each smsc connection */

> +    uuid_t smscconn_uuid;

>     /* variables set by appropriate SMSCConn driver */

>     smscconn_status_t status;           /* see smscconn.h */

>     int   load;             /* load factor, 0 = no load */




Index: gw/bb_smscconn.c
===================================================================
--- gw/bb_smscconn.c    (revision 4843)
+++ gw/bb_smscconn.c    (working copy)
@@ -201,17 +201,46 @@
 static void handle_split(SMSCConn *conn, Msg *msg, long reason)
 {
     struct split_parts *split = msg->sms.split_parts;
+    char id[UUID_STR_LEN + 1];
     
+    
     /*
      * If temporarely failed, try again immediately but only if connection 
active.
      * Because if connection is not active we will loop for ever here 
consuming 100% CPU
      * time due to internal queue cleanup in smsc module that call 
bb_smscconn_failed.
      */
-    if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == 
SMSCCONN_ACTIVE &&
-        smscconn_send(conn, msg) == 0) {
+    /*if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == 
SMSCCONN_ACTIVE &&
+        smscconn_send(conn, msg) == 0) { */
         /* destroy this message because it will be duplicated in smsc module */
-        msg_destroy(msg);
+    /*    msg_destroy(msg);
         return;
+    }*/
+        
+    
+    if (reason == SMSCCONN_FAILED_TEMPORARILY && smscconn_status(conn) == 
SMSCCONN_ACTIVE)
+    {
+       if (sms_resend_retry >= 0 && msg->sms.resend_try >= sms_resend_retry)
+       {  
+          uuid_unparse(msg->sms.id, id);
+          warning(0, "SMSC [%s]: Maximum retries for message [%s] exceeded 
resend %ld times, discarding it!", octstr_get_cstr(conn->id), id, 
msg->sms.resend_try); 
+          handle_split(conn, msg, SMSCCONN_FAILED_DISCARDED);  
+          return;
+       }
+                    
+        
+       uuid_unparse(msg->sms.id, id);
+       warning(0, "SMSC [%s]: Split message [%s] failed temporary appending 
smsc uuid", octstr_get_cstr(conn->id), id);  
+       
+       msg->sms.resend_try = (msg->sms.resend_try > 0 ? msg->sms.resend_try + 
1 : 1);
+       debug("bb.sms.splits", 0, "SMSC[%s]: Resend counter of message [%s] set 
to %ld", octstr_get_cstr(conn->id), id, msg->sms.resend_try);
+       time(&msg->sms.resend_time); 
+              
+        
+       if(uuid_is_null(split->msg_ConnId) == 1)
+         uuid_copy(split->msg_ConnId, conn->smscconn_uuid);
+       
+       gwlist_produce(outgoing_sms, msg); /* send it back to global queue */ 
+       return;
     }
     
     /*
@@ -1187,8 +1216,9 @@
     long bp_load, bo_load;
     int i, s, ret, bad_found, full_found;
     long max_queue, queue_length;
-    char *uf;
-
+    char *uf, id[UUID_STR_LEN + 1];
+    struct split_parts *split = msg->sms.split_parts;
+    
     /* XXX handle ack here? */
     if (msg_type(msg) != sms) {
         error(0, "Attempt to route non SMS message through smsc2_rout!");
@@ -1229,6 +1259,32 @@
     bp_load = bo_load = queue_length = 0;
 
     conn = NULL;
+    /* if msg was a split and failed temporary then use last known connection 
*/
+    if(split != NULL)
+    {    
+       if(uuid_is_null(split->msg_ConnId) != 1)
+       {    
+          for (i=0; i < gwlist_len(smsc_list); i++)
+          {
+             conn = gwlist_get(smsc_list,  i);
+             smscconn_info(conn, &info);
+             queue_length += (info.queued > 0 ? info.queued : 0); 
+          
+             if(uuid_compare(split->msg_ConnId, conn->smscconn_uuid) == 0)
+             {  
+                if((smscconn_usable(conn,msg) != -1) && (info.status == 
SMSCCONN_ACTIVE && info.queued < max_queue))
+                {
+                   best_preferred = conn;  
+                   uuid_unparse(msg->sms.id, id);
+                   debug("bb.sms",0,"Message [%s] with pre-set smsc uuid 
found", id);
+                   continue; /* break; */ 
+                } 
+             }  
+          } 
+       } 
+    } 
+    else
+    {
     for (i=0; i < gwlist_len(smsc_list); i++) {
        conn = gwlist_get(smsc_list,  (i+s) % gwlist_len(smsc_list));
 
@@ -1265,6 +1321,8 @@
            bo_load = info.load;
        }
     }
+    }
+    
     queue_length += gwlist_len(outgoing_sms);
     if (max_outgoing_sms_qlength > 0 && !resend &&
          queue_length > gwlist_len(smsc_list) * max_outgoing_sms_qlength) {
Index: gw/msg.h
===================================================================
--- gw/msg.h    (revision 4843)
+++ gw/msg.h    (working copy)
@@ -85,12 +85,14 @@
        #define VOID(name) void *name;
        #define MSG(type, stmt) struct type stmt type;
        #include "msg-decl.h"
+    
 } Msg;
 
 struct split_parts {
     Msg *orig;
     Counter *parts_left;
     long status;
+    uuid_t msg_ConnId;
 };
 
 /* enums for Msg fields */
Index: gw/smscconn.c
===================================================================
--- gw/smscconn.c       (revision 4843)
+++ gw/smscconn.c       (working copy)
@@ -157,13 +157,16 @@
     Octstr *denied_prefix_regex;
     Octstr *preferred_prefix_regex;
     Octstr *tmp;
-
+    char id[UUID_STR_LEN + 1];
+        
     if (grp == NULL)
        return NULL;
 
     conn = gw_malloc(sizeof(*conn));
     memset(conn, 0, sizeof(*conn));
 
+    uuid_generate(conn->smscconn_uuid);
+            
     conn->why_killed = SMSCCONN_ALIVE;
     conn->status = SMSCCONN_CONNECTING;
     conn->connect_time = -1;
@@ -295,7 +298,10 @@
     gw_assert(conn->send_msg != NULL);
 
     bb_smscconn_ready(conn);
-
+    
+    uuid_unparse(conn->smscconn_uuid, id);
+    debug("smscconn",0,"Adding smsc connection [%s] with uuid [%s]", 
octstr_get_cstr(conn->id), id);
+    
     return conn;
 }
 
Index: gw/smscconn_p.h
===================================================================
--- gw/smscconn_p.h     (revision 4843)
+++ gw/smscconn_p.h     (working copy)
@@ -146,6 +146,8 @@
 #include "smscconn.h"
 
 struct smscconn {
+    /* variable added in order to uniquely identify each smsc connection */ 
+    uuid_t smscconn_uuid;
     /* variables set by appropriate SMSCConn driver */
     smscconn_status_t status;          /* see smscconn.h */
     int        load;           /* load factor, 0 = no load */

Reply via email to