diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index df872b260c..cfcfafac7b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -119,6 +119,9 @@ static ftdm_status_t cli_ss7_show_all_channels_of_span(ftdm_stream_handle_t *str static ftdm_status_t cli_ss7_show_span_by_id(ftdm_stream_handle_t *stream, char *span_id); static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream); static ftdm_status_t cli_ss7_show_all_spans_detail(ftdm_stream_handle_t *stream); +static ftdm_status_t handle_show_sctp(ftdm_stream_handle_t *stream); +static ftdm_status_t handle_show_m2ua(ftdm_stream_handle_t *stream); +int get_assoc_resp_buf(char* buf,SbMgmt* cfm); /******************************************************************************/ /* FUNCTIONS ******************************************************************/ @@ -383,6 +386,15 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha } else if (!strcasecmp(argv[c], "procid")) { /**********************************************************************/ handle_show_procId(stream); + + /**********************************************************************/ + } else if (!strcasecmp(argv[c], "m2ua")) { + /**********************************************************************/ + handle_show_m2ua(stream); + /**********************************************************************/ + } else if (!strcasecmp(argv[c], "sctp")) { + /**********************************************************************/ + handle_show_sctp(stream); /**********************************************************************/ } else { /**********************************************************************/ @@ -831,6 +843,13 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftdm ss7 show relay\n"); stream->write_function(stream, "\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 M2UA status:\n"); + stream->write_function(stream, "ftdm ss7 show sctp \n"); + stream->write_function(stream, "ftdm ss7 show sctp \n"); + stream->write_function(stream, "ftdm ss7 show m2ua \n"); + stream->write_function(stream, "ftdm ss7 show m2ua \n"); + stream->write_function(stream, "\n"); + stream->write_function(stream, "\n"); return FTDM_SUCCESS; @@ -2717,20 +2736,22 @@ static ftdm_status_t cli_ss7_show_general(ftdm_stream_handle_t *stream) stream->write_function(stream, "MTP2 status: \n"); cli_ss7_show_all_mtp2link(stream); - stream->write_function(stream, "\nMTP3 status: \n"); - cli_ss7_show_all_mtp3link(stream); + if(SNG_SS7_OPR_MODE_M2UA_SG != g_ftdm_operating_mode){ + stream->write_function(stream, "\nMTP3 status: \n"); + cli_ss7_show_all_mtp3link(stream); - stream->write_function(stream, "\nMTP3 linkset status: \n"); - cli_ss7_show_all_linkset(stream); + stream->write_function(stream, "\nMTP3 linkset status: \n"); + cli_ss7_show_all_linkset(stream); #if 0 - stream->write_function(stream, "\nMTP3 link route status: \n"); + stream->write_function(stream, "\nMTP3 link route status: \n"); - stream->write_function(stream, "\nISUP status: \n"); + stream->write_function(stream, "\nISUP status: \n"); #endif - stream->write_function(stream, "\nRelay status: \n"); - cli_ss7_show_all_relay(stream); + stream->write_function(stream, "\nRelay status: \n"); + cli_ss7_show_all_relay(stream); + } return FTDM_SUCCESS; } @@ -2947,6 +2968,224 @@ static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream return FTDM_FAIL; } +/******************************************************************************/ +static ftdm_status_t handle_show_m2ua(ftdm_stream_handle_t *stream) +{ + /*char* xmlhdr = "";*/ + + /*iterate through all the m2ua links and prints all information */ + + return FTDM_FAIL; + +} +/******************************************************************************/ +static ftdm_status_t handle_show_sctp(ftdm_stream_handle_t *stream) +{ + char* xmlhdr = (char*)""; + char buf[2048]; + int x = 0x00; + int len = 0x00; + SbMgmt cfm; + + memset((U8 *)&cfm, 0, sizeof(SbMgmt)); + memset(&buf[0], 0, sizeof(buf)); + + len = len + sprintf(buf + len, "%s\n", xmlhdr); + len = len + sprintf(buf + len, "\n"); + + if(ftmod_sctp_ssta_req(STSBGEN, 0x00, &cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbAssoc); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbEndp); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbLocalAddr); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbPeerAddr); + len = len + sprintf(buf + len, "\n"); + } + +#ifdef LSB12 + if(ftmod_sctp_ssta_req(STSBTMR, 0x00, &cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.lifetimeTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.ackDelayTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.cookieTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.keyTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.freezeTmr); +#ifdef LSB4 + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.bundleTmr); +#endif + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.t1InitTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.t2ShutdownTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.hbeat); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.t3rtx); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.tIntTmr); + } + +#endif + + + /*iterate through all the sctp links and prints all information */ + x = 1; + while(x\n"); + + if(ftmod_sctp_ssta_req(STSBSCTSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_SAP_STATE(cfm.t.ssta.s.sapSta.hlSt)); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_PROTO_SWITCH(cfm.t.ssta.s.sapSta.swtch)); + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_sctp_ssta_req(STSBTSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_SAP_STATE(cfm.t.ssta.s.sapSta.hlSt)); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_PROTO_SWITCH(cfm.t.ssta.s.sapSta.swtch)); + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_sctp_ssta_req(STSBASSOC,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + get_assoc_resp_buf(buf + len, &cfm); + len = len + sprintf(buf + len, "\n"); + } + + /* TODO - STSBDTA */ + + len = len + sprintf(buf + len, "\n"); + } + x++; + } + + len = len + sprintf(buf + len, "\n"); + stream->write_function(stream,"\n%s\n",buf); + + return FTDM_FAIL; +} + +int get_assoc_resp_buf(char* buf,SbMgmt* cfm) +{ + int len = 0x00; + int idx = 0x00; + char *asciiAddr; + CmInetIpAddr ip; + + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.assocId); + len = len + sprintf(buf + len, " %s \n", PRNT_SCTP_ASSOC_STATE(cfm->t.ssta.s.assocSta.assocState)); + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.dstPort); + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.srcPort); + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.dstNAddrLst.nmb); + for(idx =0; idx < cfm->t.ssta.s.assocSta.dstNAddrLst.nmb; idx++) + { + len = len + sprintf(buf + len, " \n"); + len = len + sprintf(buf + len, " %s \n", PRNT_CM_ADDR_TYPE(cfm->t.ssta.s.assocSta.dstNAddrLst.nAddr[idx].type)); + if(cfm->t.ssta.s.assocSta.dstNAddrLst.nAddr[idx].type == CM_IPV4ADDR_TYPE) + { + ip = ntohl(cfm->t.ssta.s.assocSta.dstNAddrLst.nAddr[idx].u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(buf + len, " %s \n",asciiAddr); + } + else + { + len = len + sprintf(buf + len, " %s \n", cfm->t.ssta.s.assocSta.dstNAddrLst.nAddr[idx].u.ipv6NetAddr); + } + len = len + sprintf(buf + len, " \n"); + } + + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.srcNAddrLst.nmb); + for(idx =0; idx < cfm->t.ssta.s.assocSta.srcNAddrLst.nmb; idx++) + { + len = len + sprintf(buf + len, " \n"); + len = len + sprintf(buf + len, " %s \n", PRNT_CM_ADDR_TYPE(cfm->t.ssta.s.assocSta.srcNAddrLst.nAddr[idx].type)); + if(cfm->t.ssta.s.assocSta.srcNAddrLst.nAddr[idx].type == CM_IPV4ADDR_TYPE) + { + ip = ntohl(cfm->t.ssta.s.assocSta.srcNAddrLst.nAddr[idx].u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(buf + len, " %s \n", asciiAddr); + } + else + { + len = len + sprintf(buf + len, " %s \n", cfm->t.ssta.s.assocSta.srcNAddrLst.nAddr[idx].u.ipv6NetAddr); + } + len = len + sprintf(buf + len, " \n"); + } + + len = len + sprintf(buf + len, "\n %s \n", PRNT_CM_ADDR_TYPE(cfm->t.ssta.s.assocSta.priNAddr.type)); + + if(cfm->t.ssta.s.assocSta.priNAddr.type == CM_IPV4ADDR_TYPE) + { + ip = ntohl(cfm->t.ssta.s.assocSta.priNAddr.u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(buf + len, " %s \n",asciiAddr); + } + else + { + len = len + sprintf(buf + len, " %s \n", cfm->t.ssta.s.assocSta.priNAddr.u.ipv6NetAddr); + } + +#ifdef LSB11 + /* TODO - this flag is not enable as of now.. so later on will convert below prints to XML tags */ + len = len + sprintf(buf + len, " The number of unsent datagrams : %d\n", cfm->t.ssta.s.assocSta.nmbUnsentDgms); + len = len + sprintf(buf + len, " The number of unack datagrams : %d\n", cfm->t.ssta.s.assocSta.nmbUnackDgms); + len = len + sprintf(buf + len, " The number of undelivered datagrams : %d\n", cfm->t.ssta.s.assocSta.nmbUndelDgms); + len = len + sprintf(buf + len, " The number of retransmissions count : %d\n", cfm->t.ssta.s.assocSta.rtxCnt); + len = len + sprintf(buf + len, " The receive window size is: %d\n\n", cfm->t.ssta.s.assocSta.SctWinSize); + for(idx =0; idx < LSB_MAX_TMRS ; idx++) + { + len = len + sprintf(buf + len, " %d) Timer state is %d\n", idx, cfm->t.ssta.s.assocSta.tmr[idx].state); + len = len + sprintf(buf + len, " %d) Timer value is %d\n", idx, cfm->t.ssta.s.assocSta.tmr[idx].tmrVal); + len = len + sprintf(buf + len, " %d) No of paths is %d\n", idx, cfm->t.ssta.s.assocSta.tmr[idx].numPaths); + for(idx1 =0; idx1 < cfm->t.ssta.s.assocSta.tmr[idx].numPaths; idx1++) + { + if( cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].localAddr.type == CM_IPV4ADDR_TYPE) + { + len = len + sprintf(buf + len, " %d) the local Addr is %d\n", idx1, + cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].localAddr.u.ipv4NetAddr); + } + else + { + len = len + sprintf(buf + len, " %d) the local Addr is %s\n", idx1, + cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].localAddr.u.ipv6NetAddr); + } + + if( cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].peerAddr.type == CM_IPV4ADDR_TYPE) + { + len = len + sprintf(buf + len, " %d) the peer Addr is %d\n", idx1, + cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].peerAddr.u.ipv4NetAddr); + } + else + { + len = len + sprintf(buf + len, " %d) the peer Addr is %s\n", idx1, + cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].peerAddr.u.ipv6NetAddr); + } + } /* Loop for paths */ + } /* Loop for timers */ +#endif + + return len; +} + +/******************************************************************************/ + /******************************************************************************/ /* For Emacs: * Local Variables: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index 39e9bba658..9730bc2df2 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -60,6 +60,7 @@ static int ftmod_nif_dlsap_config(int idx); static int ftmod_sctp_tucl_tsap_bind(int idx); static int ftmod_m2ua_sctp_sctsap_bind(int idx); static int ftmod_open_endpoint(int idx); +static int ftmod_init_sctp_assoc(int peer_id); static int ftmod_nif_m2ua_dlsap_bind(int id); static int ftmod_nif_mtp2_dlsap_bind(int id); static int ftmod_m2ua_enable_debug(void); @@ -76,13 +77,18 @@ ftdm_status_t sng_m2ua_cfg(void); /******************************************************************************/ void ftmod_ss7_m2ua_free() { - ftmod_ss7_m2ua_shutdown(); - ftmod_ss7_sctp_shutdown(); - ftmod_ss7_tucl_shutdown(); - - sng_isup_free_m2ua(); - sng_isup_free_sctp(); - sng_isup_free_tucl(); + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_M2UA_STARTED)) { + ftmod_ss7_m2ua_shutdown(); + sng_isup_free_m2ua(); + } + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SCTP_STARTED)) { + ftmod_ss7_sctp_shutdown(); + sng_isup_free_sctp(); + } + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_TUCL_STARTED)) { + ftmod_ss7_tucl_shutdown(); + sng_isup_free_tucl(); + } } /******************************************************************************/ static int ftmod_ss7_tucl_shutdown() @@ -186,6 +192,12 @@ ftdm_status_t ftmod_ss7_m2ua_cfg(void) return FTDM_FAIL; } + /* SET STARTED FLAGS */ + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_NIF_STARTED); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_M2UA_STARTED); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SCTP_STARTED); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_TUCL_STARTED); + return FTDM_SUCCESS; } @@ -1145,8 +1157,10 @@ int ftmod_ss7_m2ua_start(void){ ftmod_tucl_enable_debug(); /***********************************************************************************************************************/ - for (x=1; g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].id !=0; x++) { - if (!(g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags & SNGSS7_CONFIGURED)) { + x = 1; + while(xid; /* M2UA sct sap Id */ + cntrl.t.cntrl.action = AMWENDPOPEN; + cntrl.t.cntrl.s.suId = m2ua->id; /* M2UA sct sap Id */ - return (sng_cntrl_m2ua (&pst, &cntrl)); + return (sng_cntrl_m2ua (&pst, &cntrl)); +} +/***********************************************************************************************************************/ +static int ftmod_init_sctp_assoc(int peer_id) +{ + + Pst pst; + MwMgmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTMW; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STMWPEER; /* General */ + cntrl.hdr.transId = 1; /* transaction identifier */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + + cntrl.t.cntrl.action = AMWESTABLISH; + /*cntrl.t.cntrl.s.suId = 1;*/ + + cntrl.t.cntrl.s.peerId = (MwPeerId) peer_id; + + return (sng_cntrl_m2ua (&pst, &cntrl)); } /***********************************************************************************************************************/ @@ -1474,3 +1554,132 @@ static int ftmod_tucl_enable_debug() return (sng_cntrl_tucl (&pst, &cntrl)); } /***********************************************************************************************************************/ + +/***********************************************************************************************************************/ +int ftmod_sctp_ssta_req(int elemt, int id, SbMgmt* cfm) +{ + SbMgmt ssta; + Pst pst; + sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id]; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&ssta, 0, sizeof(SbMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTSB; + + /* prepare header */ + ssta.hdr.msgType = TSSTA; /* message type */ + ssta.hdr.entId.ent = ENTSB; /* entity */ + ssta.hdr.entId.inst = 0; /* instance */ + ssta.hdr.elmId.elmnt = elemt; /* STSBGEN */ /* Others are STSBTSAP, STSBSCTSAP, STSBASSOC, STSBDTA, STSBTMR */ + ssta.hdr.transId = 1; /* transaction identifier */ + + ssta.hdr.response.selector = 0; + ssta.hdr.response.prior = PRIOR0; + ssta.hdr.response.route = RTESPEC; + ssta.hdr.response.mem.region = S_REG; + ssta.hdr.response.mem.pool = S_POOL; + + if((ssta.hdr.elmId.elmnt == STSBSCTSAP) || (ssta.hdr.elmId.elmnt == STSBTSAP)) + { + ssta.t.ssta.sapId = k->id; /* SapId */ + } + if(ssta.hdr.elmId.elmnt == STSBASSOC) + { + ssta.t.ssta.s.assocSta.assocId = 0; /* association id */ + } + return(sng_sta_sctp(&pst,&ssta,cfm)); +} + +#if 0 +int ftmod_m2ua_ssta_req(int elemt) +{ + MwMgmt ssta; + MwMgmt cfm; + Pst pst; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&ssta, 0, sizeof(MwMgmt)); + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + ssta.hdr.msgType = TSSTA; /* message type */ + ssta.hdr.entId.ent = ENTMW; /* entity */ + ssta.hdr.entId.inst = 0; /* instance */ + ssta.hdr.elmId.elmnt = elemt; /*STMWGEN */ /* Others are STMWSCTSAP, STMWCLUSTER, STMWPEER,STMWSID, STMWDLSAP */ + ssta.hdr.transId = 1; /* transaction identifier */ + + ssta.hdr.response.selector = 0; + ssta.hdr.response.prior = PRIOR0; + ssta.hdr.response.route = RTESPEC; + ssta.hdr.response.mem.region = S_REG; + ssta.hdr.response.mem.pool = S_POOL; + + switch(ssta.hdr.elmId.elmnt) + { + case STMWSCTSAP: + { + ssta.t.ssta.id.suId = 0 ; /* lower sap Id */ + break; + } + case STMWDLSAP: + { + ssta.t.ssta.id.lnkNmb = 0 ; /* upper sap Id */ + break; + } + case STMWPEER: + { + ssta.t.ssta.id.peerId = 1 ; /* peer Id */ + break; + } + case STMWCLUSTER: + { + ssta.t.ssta.id.clusterId = 1 ; /* cluster Id */ + break; + } + default: + break; + } + + return(sng_sta_m2ua(&pst,&ssta,&cfm)); +} + +int ftmod_nif_ssta_req(int elemt) +{ + NwMgmt ssta; + NwMgmt cfm; + Pst pst; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&ssta, 0, sizeof(NwMgmt)); + memset((U8 *)&cfm, 0, sizeof(NwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTNW; + + /* prepare header */ + ssta.hdr.msgType = TSSTA; /* message type */ + ssta.hdr.entId.ent = ENTNW; /* entity */ + ssta.hdr.entId.inst = 0; /* instance */ + + ssta.hdr.response.selector = 0; + ssta.hdr.response.prior = PRIOR0; + ssta.hdr.response.route = RTESPEC; + ssta.hdr.response.mem.region = S_REG; + ssta.hdr.response.mem.pool = S_POOL; + + if(ssta.hdr.elmId.elmnt == STNWDLSAP) + { + ssta.t.ssta.suId = 0; /* Lower sapId */ + } + + return(sng_sta_nif(&pst,&ssta,&cfm)); +} +#endif diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index a988b9c8db..a14db63189 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -75,6 +75,7 @@ typedef struct sng_m2ua_peer_cfg{ uint16_t sctpId; /* idx to sctp profile */ uint32_t destAddrList[SCT_MAX_NET_ADDRS+1]; /* Destination adddress list */ uint16_t locOutStrms; /*Number of outgoing streams supported by this association*/ + int init_sctp_assoc; /* flag to tell if we need to initiate SCTP association */ }sng_m2ua_peer_cfg_t; typedef enum{ @@ -103,10 +104,10 @@ typedef struct sng_m2ua_cluster_cfg{ }sng_m2ua_cluster_cfg_t; typedef struct sng_m2ua_gbl_cfg{ - sng_nif_cfg_t nif[MW_MAX_NUM_OF_INTF]; - sng_m2ua_cfg_t m2ua[MW_MAX_NUM_OF_INTF]; - sng_m2ua_peer_cfg_t m2ua_peer[MW_MAX_NUM_OF_PEER]; - sng_m2ua_cluster_cfg_t m2ua_clus[MW_MAX_NUM_OF_CLUSTER]; + sng_nif_cfg_t nif[MW_MAX_NUM_OF_INTF+1]; + sng_m2ua_cfg_t m2ua[MW_MAX_NUM_OF_INTF+1]; + sng_m2ua_peer_cfg_t m2ua_peer[MW_MAX_NUM_OF_PEER+1]; + sng_m2ua_cluster_cfg_t m2ua_clus[MW_MAX_NUM_OF_CLUSTER+1]; }sng_m2ua_gbl_cfg_t; /* m2ua xml parsing APIs */ @@ -122,5 +123,11 @@ void ftmod_ss7_m2ua_free(void); ftdm_status_t ftmod_ss7_m2ua_cfg(void); +int ftmod_sctp_ssta_req(int elemt, int id, SbMgmt* cfm); +#if 0 +int ftmod_m2ua_ssta_req(int elemt); +int ftmod_nif_ssta_req(int elemt); +#endif + #endif /*__FTMOD_SNG_SS7_M2UA_H__*/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index 9d47a33dbb..a3785cc01d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -165,6 +165,8 @@ static int ftmod_ss7_fill_in_nif_interface(sng_nif_cfg_t *nif_iface) g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[i].m2uaLnkNmb = nif_iface->m2uaLnkNmb; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[i].mtp2LnkNmb = nif_iface->mtp2LnkNmb; + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_NIF_PRESENT); + return 0; } @@ -300,6 +302,7 @@ static int ftmod_ss7_fill_in_m2ua_interface(sng_m2ua_cfg_t *m2ua_iface) g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].sctpId = m2ua_iface->sctpId; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].peerId = m2ua_iface->peerId; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].clusterId = m2ua_iface->clusterId; + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_M2UA_PRESENT); return 0; } @@ -413,6 +416,19 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter SS7_DEBUG("Found an sng_m2ua_peer loc_out_strms = %d\n", sng_m2ua_peer.locOutStrms); /**********************************************************************/ + } else if (!strcasecmp(parm->var, "init_sctp_assoc")) { + /**********************************************************************/ + if(!strcasecmp(parm->val, "TRUE")){ + sng_m2ua_peer.init_sctp_assoc = 0x01; + } else if(!strcasecmp(parm->val, "FALSE")){ + sng_m2ua_peer.init_sctp_assoc = 0x00; + } else { + SS7_ERROR("Found an invalid init_sctp_assoc Parameter Value[%s]\n", parm->val); + return FTDM_FAIL; + } + + SS7_DEBUG("Found an sng_m2ua_peer init_sctp_assoc = %d\n", sng_m2ua_peer.init_sctp_assoc); + /**********************************************************************/ } else { /**********************************************************************/ SS7_ERROR("Found an invalid parameter %s!\n", parm->var); @@ -447,6 +463,7 @@ static int ftmod_ss7_fill_in_m2ua_peer_interface(sng_m2ua_peer_cfg_t *m2ua_peer_ g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].locOutStrms = m2ua_peer_iface->locOutStrms; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].numDestAddr = m2ua_peer_iface->numDestAddr; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].sctpId = m2ua_peer_iface->sctpId; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].init_sctp_assoc = m2ua_peer_iface->init_sctp_assoc; for (k=0; knumDestAddr; k++) { g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].destAddrList[k] = m2ua_peer_iface->destAddrList[k]; } @@ -687,6 +704,8 @@ static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node) for (i=1; i<=t_link.numSrcAddr; i++) { g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].srcAddrList[i] = t_link.srcAddrList[i]; } + + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SCTP_PRESENT); return FTDM_SUCCESS; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index fc6a6e61b5..90fb3e5b7f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -758,6 +758,19 @@ typedef enum { SNGSS7_CC_PRESENT = (1 << 12), SNGSS7_CC_STARTED = (1 << 13), + + SNGSS7_TUCL_PRESENT = (1 << 14), + SNGSS7_TUCL_STARTED = (1 << 15), + + SNGSS7_SCTP_PRESENT = (1 << 16), + SNGSS7_SCTP_STARTED = (1 << 17), + + SNGSS7_M2UA_PRESENT = (1 << 18), + SNGSS7_M2UA_STARTED = (1 << 19), + + SNGSS7_NIF_PRESENT = (1 << 20), + SNGSS7_NIF_STARTED = (1 << 21), + } sng_task_flag_t; /******************************************************************************/