chan_ss7: patch for overlapping cic codes with 2 redundant signaling links

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks!
I had the same issue in South Africa, but eventually got the network on the 
remote end to set up different CIC ranges to work around the issue in 
chan_ss7. It's good to have a fix for chan_ss7 that resolves this.

--Greg
----- Original Message ----- 
From: "Robert Verspuy" <robert@xxxxxxxxxxxxxx>
To: <asterisk-ss7 at lists.digium.com>
Sent: Wednesday, March 24, 2010 11:18 AM
Subject: chan_ss7: patch for overlapping cic codes with 2 
redundant signaling links


> All,
>
> Here in the Netherlands we have a SS7 connection with the biggest local
> telco.
> This local telco has 2 redundant networks, and uses different point
> codes for signaling and the audio streams.
>
> we have 6 E1's connected on one server.
> port 1 -> network A, with signaling link
> port 2 -> network B, with signaling link
> port 3 -> network A
> port 4 -> network B
> port 5 -> network A
> port 6 -> network B
>
> The signaling link on network A is connected to point code 123 (just an
> example, I'm not using the real point codes)
> The signaling link on network B is connected to point code 124
>
> Through both networks we receive calls from point code 201 and 202.
> But this can be received through signaling link from network A or from
> network B.
>
> In the chan_ss7 source (l4isup.c) there is a function called find_pvt.
> This function gets the signaling link and cic code as argument, and
> returns the pvt from the ciclist.
> But when I receive a call for a cic on network B, through the signaling
> link from network A, this will not work, because the incorrect pvt will
> be selected.
>
> With the patch (see below) I've changed the source a bit, to take into
> account the originating point code.
> The patch below is for version 1.2.1. and I use these changes since
> December 2008, it's fully stable, and the server processed more then
> 2.000.000 calls since.
> Having a quick look at the source of 1.3, it appears that these changes
> can be patched without any problems into this version too.
>
> So besides placing this patch in this mailing list,
> is there a contact person / location where I can deliver this patch?
>
> With kind regards,
> Robert Verspuy
>
> --- l4isup.c.orig    2010-03-24 09:12:46.000000000 +0100
> +++ l4isup.c    2010-03-24 09:00:43.000000000 +0100
> @@ -474,6 +474,28 @@
>    return NULL;
>  }
>
> +static struct ss7_chan* find_pvt_with_pc(struct link* slink, int cic,
> int pc)
> +{
> +  struct linkset* ls;
> +  int lsi;
> +
> +  ls = slink->linkset;
> +  if (ls->dpc == pc) {
> +    if (ls->cic_list[cic])
> +      return ls->cic_list[cic];
> +    for (lsi = 0; lsi < n_linksets; lsi++)
> +      if (is_combined_linkset(ls, &linksets[lsi]))
> +        if (linksets[lsi].cic_list[cic])
> +          return linksets[lsi].cic_list[cic];
> +  } else {
> +    for (lsi = 0; lsi < n_linksets; lsi++)
> +      if (is_combined_linkset(ls, &linksets[lsi]))
> +        if (linksets[lsi].dpc == pc)
> +          if (linksets[lsi].cic_list[cic])
> +            return linksets[lsi].cic_list[cic];
> +  }
> +  return NULL;
> +}
>
>  /* This function must be called with the global lock mutex held. */
>  static void remove_from_idlelist(struct ss7_chan *pvt) {
> @@ -2669,7 +2691,8 @@
>      return;
>    }
>    lock_global();
> -  pvt = find_pvt(slink, cic);
> +//  pvt = find_pvt(slink, cic);
> +  pvt = find_pvt_with_pc(slink, cic, inmsg->opc);
>    ast_log(LOG_DEBUG, "Process circuit message %s, CIC=%d, state=%d,
> reset_done=%d\n", isupmsg(inmsg->typ), cic, pvt->state, pvt->reset_done);
>    if(!pvt->equipped) {
>      ast_log(LOG_ERROR, "Received CIC=%d for not equipped circuit
> (typ=%s), link '%s'.\n", cic, isupmsg(inmsg->typ), slink->name);
> @@ -2743,7 +2766,8 @@
>      return;
>    }
>    lock_global();
> -  pvt = find_pvt(slink, cic);
> +//  pvt = find_pvt(slink, cic);
> +  pvt = find_pvt_with_pc(slink, cic, inmsg->opc);
>    if(!(pvt->equipped || (inmsg->typ == ISUP_CGA) || (inmsg->typ ==
> ISUP_CUA) || (inmsg->typ == ISUP_GRA))) {
>      ast_log(LOG_ERROR, "Received CIC=%d for not equipped circuit
> (typ=%s), link '%s'.\n", cic, isupmsg(inmsg->typ), slink->name);
>      unlock_global();
> @@ -4616,7 +4640,8 @@
>      unlock_global();
>      return;
>    }
> -  pvt = find_pvt(linkset->links[0], cic);
> +//  pvt = find_pvt(linkset->links[0], cic);
> +  pvt = find_pvt_with_pc(linkset->links[0], cic, isup_msg.opc);
>    ast_log(LOG_DEBUG, "Got ISUP event, typ=%s, cic=%d, dpc=%d,
> linkset=%s, pvt=0x%08lx, pvt.eq=%d \n", isupmsg(isup_msg.typ), cic, dpc,
> linkset->name, (unsigned long int) pvt, pvt ? pvt->equipped : -1);
>    unlock_global();
>
> @@ -4665,7 +4690,8 @@
>      /* Q.764 (2.9.5): Discard invalid message.*/
>      ast_log(LOG_NOTICE, "ISUP decoding error, message discarded.
> (typ=%d)\n", isup_msg.typ);
>    } else {
> -    struct ss7_chan* pvt = find_pvt(event->isup.slink, isup_msg.cic);
> +//    struct ss7_chan* pvt = find_pvt(event->isup.slink, isup_msg.cic);
> +    struct ss7_chan* pvt = find_pvt_with_pc(event->isup.slink,
> isup_msg.cic, isup_msg.opc);
>      if (pvt) {
>        if(pvt->equipped)
>      process_isup_message(pvt->link, &isup_msg);
>
>
> -- 
> *Exa-Omicron*
> Patroonsweg 10
> 3892 DB Zeewolde
> Tel.: 088-OMICRON (66 427 66)
> http://www.exa-omicron.nl
>
> -- 
> _____________________________________________________________________
> -- Bandwidth and Colocation Provided by http://www.api-digital.com --
>
> asterisk-ss7 mailing list
> To UNSUBSCRIBE or update options visit:
>   http://lists.digium.com/mailman/listinfo/asterisk-ss7
> 




[Index of Archives]     [Asterisk App Development]     [PJ SIP]     [Gnu Gatekeeper]     [IETF Sipping]     [Info Cyrus]     [ALSA User]     [Fedora Linux Users]     [Linux SCTP]     [DCCP]     [Gimp]     [Yosemite Backpacking]     [Deep Creek Hot Springs]     [Yosemite Campsites]     [ISDN Cause Codes]     [Asterisk Books]

  Powered by Linux