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