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 ******************************************************************/
} 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 {
/**********************************************************************/
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 <sctp_profile_name>\n");
+ stream->write_function(stream, "ftdm ss7 show m2ua \n");
+ stream->write_function(stream, "ftdm ss7 show m2ua <m2ua_profile_name>\n");
+ stream->write_function(stream, "\n");
+
stream->write_function(stream, "\n");
return FTDM_SUCCESS;
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;
}
return FTDM_FAIL;
}
+/******************************************************************************/
+static ftdm_status_t handle_show_m2ua(ftdm_stream_handle_t *stream)
+{
+ /*char* xmlhdr = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";*/
+
+ /*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*)"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
+ 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, "<sctp_profiles>\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, "<sctp_gen>\n");
+ len = len + sprintf(buf + len, "<mem_size> %d </mem_size>\n",cfm.t.ssta.s.genSta.memSize);
+ len = len + sprintf(buf + len, " <allocated_mem_size> %d </allocated_mem_size>\n",cfm.t.ssta.s.genSta.memAlloc);
+ len = len + sprintf(buf + len, " <num_of_open_assoc> %d </num_of_open_assoc>\n",cfm.t.ssta.s.genSta.nmbAssoc);
+ len = len + sprintf(buf + len, " <num_of_open_end_points> %d </num_of_open_end_points>\n",cfm.t.ssta.s.genSta.nmbEndp);
+ len = len + sprintf(buf + len, " <num_of_lcl_addr_in_use> %d </num_of_lcl_addr_in_use>\n",cfm.t.ssta.s.genSta.nmbLocalAddr);
+ len = len + sprintf(buf + len, " <num_of_rmt_addr_in_use> %d </num_of_rmt_addr_in_use>\n",cfm.t.ssta.s.genSta.nmbPeerAddr);
+ len = len + sprintf(buf + len, "</sctp_gen>\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, "<sctp_timers>\n");
+
+ len = len + sprintf(buf + len, "<life_time_timer_val> %d </life_time_timer_val>\n", cfm.t.ssta.s.tmrSta.lifetimeTmr);
+ len = len + sprintf(buf + len, "<ack_delay_timer_val> %d </ack_delay_timer_val>\n", cfm.t.ssta.s.tmrSta.ackDelayTmr);
+ len = len + sprintf(buf + len, "<cookie_timer_val> %d </cookie_timer_val>\n", cfm.t.ssta.s.tmrSta.cookieTmr);
+ len = len + sprintf(buf + len, "<key_timer_val> %d </key_timer_val>\n", cfm.t.ssta.s.tmrSta.keyTmr);
+ len = len + sprintf(buf + len, "<freeze_timer_val> %d </freeze_timer_val> \n", cfm.t.ssta.s.tmrSta.freezeTmr);
+#ifdef LSB4
+ len = len + sprintf(buf + len, "<bundle_timer_val> %d </bundle_timer_val> \n", cfm.t.ssta.s.tmrSta.bundleTmr);
+#endif
+ len = len + sprintf(buf + len, "<t1_init_timer_val> %d </t1_init_timer_val> \n", cfm.t.ssta.s.tmrSta.t1InitTmr);
+ len = len + sprintf(buf + len, "<t2_shutdown_timer_val> %d </t2_shutdown_timer_val> \n", cfm.t.ssta.s.tmrSta.t2ShutdownTmr);
+ len = len + sprintf(buf + len, "<round_trip_timer_val> %d </round_trip_timer_val> \n", cfm.t.ssta.s.tmrSta.hbeat);
+ len = len + sprintf(buf + len, "<t3_rtx_timer_val> %d </t3_rtx_timer_val> \n", cfm.t.ssta.s.tmrSta.t3rtx);
+ len = len + sprintf(buf + len, "<bind_retry_timer_val> %d </bind_retry_timer_val> \n", cfm.t.ssta.s.tmrSta.tIntTmr);
+ }
+
+#endif
+
+
+ /*iterate through all the sctp links and prints all information */
+ x = 1;
+ while(x<MAX_SCTP_LINK){
+ if((g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].id !=0) &&
+ (!(g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags & SNGSS7_CONFIGURED))) {
+
+ len = len + sprintf(buf + len, "<sctp_profile>\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, "<sctp_sap>\n");
+ len = len + sprintf(buf + len," <state> %s </state>\n", PRNT_SCTP_SAP_STATE(cfm.t.ssta.s.sapSta.hlSt));
+ len = len + sprintf(buf + len," <switch> %s </switch>\n", PRNT_SCTP_PROTO_SWITCH(cfm.t.ssta.s.sapSta.swtch));
+ len = len + sprintf(buf + len, "</sctp_sap>\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, "<sctp_transport_sap>\n");
+ len = len + sprintf(buf + len," <state> %s </state>\n", PRNT_SCTP_SAP_STATE(cfm.t.ssta.s.sapSta.hlSt));
+ len = len + sprintf(buf + len," <switch> %s </switch>\n", PRNT_SCTP_PROTO_SWITCH(cfm.t.ssta.s.sapSta.swtch));
+ len = len + sprintf(buf + len, "</sctp_transport_sap>\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, "<sctp_association>\n");
+ len = len + get_assoc_resp_buf(buf + len, &cfm);
+ len = len + sprintf(buf + len, "</sctp_association>\n");
+ }
+
+ /* TODO - STSBDTA */
+
+ len = len + sprintf(buf + len, "</sctp_profile>\n");
+ }
+ x++;
+ }
+
+ len = len + sprintf(buf + len, "</sctp_profiles>\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, " <assoc_id> %d </assoc_id>\n", cfm->t.ssta.s.assocSta.assocId);
+ len = len + sprintf(buf + len, " <assoc_status> %s </assoc_status>\n", PRNT_SCTP_ASSOC_STATE(cfm->t.ssta.s.assocSta.assocState));
+ len = len + sprintf(buf + len, " <assoc_dst_port> %d </assoc_dst_port>\n", cfm->t.ssta.s.assocSta.dstPort);
+ len = len + sprintf(buf + len, " <assoc_src_port> %d </assoc_src_port>\n", cfm->t.ssta.s.assocSta.srcPort);
+ len = len + sprintf(buf + len, " <nmb_dst_addr> %d </nmb_dst_addr>\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, " <dst_addr_list> \n");
+ len = len + sprintf(buf + len, " <dst_addr_type> %s </dst_addr_type>\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, " <dst_addr> %s </dst_addr>\n",asciiAddr);
+ }
+ else
+ {
+ len = len + sprintf(buf + len, " <dst_addr> %s </dst_addr> \n", cfm->t.ssta.s.assocSta.dstNAddrLst.nAddr[idx].u.ipv6NetAddr);
+ }
+ len = len + sprintf(buf + len, " </dst_addr_list> \n");
+ }
+
+ len = len + sprintf(buf + len, " <nmb_src_addr> %d </nmb_src_addr> \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, " <src_addr_list> \n");
+ len = len + sprintf(buf + len, " <src_addr_type> %s </src_addr_type>\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, " <src_addr> %s </src_addr>\n", asciiAddr);
+ }
+ else
+ {
+ len = len + sprintf(buf + len, " <src_addr> %s </src_addr>\n", cfm->t.ssta.s.assocSta.srcNAddrLst.nAddr[idx].u.ipv6NetAddr);
+ }
+ len = len + sprintf(buf + len, " </src_addr_list> \n");
+ }
+
+ len = len + sprintf(buf + len, "\n <primary_addr_type> %s </primary_addr_type>\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, " <primary_addr> %s </primary_addr>\n",asciiAddr);
+ }
+ else
+ {
+ len = len + sprintf(buf + len, " <primary_addr> %s </primary_addr>\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:
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);
/******************************************************************************/
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()
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;
}
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(x<MAX_SCTP_LINK){
+ if((g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].id !=0) &&
+ (!(g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags & SNGSS7_CONFIGURED))) {
/* Send a control request to bind the TSAP between SCTP and TUCL */
if(ftmod_sctp_tucl_tsap_bind(x)) {
ftdm_log (FTDM_LOG_INFO ,"\nControl request to bind TSAP[%d] of SCTP and TUCL: OK\n", x);
}
}
+ x++;
}
/***********************************************************************************************************************/
/* Send a control request to bind the SCTSAP between SCTP and M2UA */
- for (x=1; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0; x++) {
- if (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED)) {
+ x = 1;
+ while(x<MW_MAX_NUM_OF_INTF){
+ if((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0) &&
+ (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED))) {
if(ftmod_m2ua_sctp_sctsap_bind(x)) {
ftdm_log (FTDM_LOG_ERROR ,"Control request to bind SCTSAP[%d] of M2UA and SCTP : NOT OK\n", x);
return 1;
ftdm_log (FTDM_LOG_INFO ,"Control request to bind SCTSAP[%d] of M2UA and SCTP: OK\n", x);
}
}
- }/* END - M2UA Interfaces for loop*/
+ x++;
+ }/* END - M2UA Interfaces while loop*/
/***********************************************************************************************************************/
- for (x=1; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].id !=0; x++) {
- if (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].flags & SNGSS7_CONFIGURED)) {
+ x = 1;
+ while(x<MW_MAX_NUM_OF_INTF){
+ if ((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].id !=0) &&
+ (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].flags & SNGSS7_CONFIGURED))) {
/* Send a control request to bind the DLSAP between NIF, M2UA and MTP-2 */
if(ftmod_nif_m2ua_dlsap_bind(x)) {
ftdm_log (FTDM_LOG_ERROR ,"Control request to bind DLSAP[%d] between NIF and M2UA: NOT OK\n", x);
ftdm_log (FTDM_LOG_INFO ,"Control request to bind DLSAP[%d] between NIF and MTP2 : OK\n", x);
}
}
+ x++;
}/* END - NIF Interfaces for loop*/
/***********************************************************************************************************************/
- for (x=1; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0; x++) {
- if (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED)) {
+ x = 1;
+ while(x<MW_MAX_NUM_OF_INTF){
+ if ((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0) &&
+ (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED))) {
/* Send a control request to open endpoint */
if(ftmod_open_endpoint(x)) {
ftdm_log (FTDM_LOG_ERROR ,"ftmod_open_endpoint FAIL \n");
ftdm_log (FTDM_LOG_INFO ,"ftmod_open_endpoint SUCCESS \n");
}
}
+ x++;
+ }
+
+/***********************************************************************************************************************/
+ sleep(2);
+
+ x = 1;
+ while (x < (MW_MAX_NUM_OF_PEER)) {
+ if ((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].id !=0) &&
+ (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].flags & SNGSS7_CONFIGURED)) &&
+ (g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].init_sctp_assoc)) {
+ if(ftmod_init_sctp_assoc(x)) {
+ ftdm_log (FTDM_LOG_ERROR ,"ftmod_init_sctp_assoc FAIL for peerId[%d] \n", x);
+ return 1;
+ }else {
+ ftdm_log (FTDM_LOG_INFO ,"ftmod_init_sctp_assoc SUCCESS for peerId[%d] \n", x);
+ }
+ }
+ x++;
}
+
+
+
return 0;
}
/***********************************************************************************************************************/
static int ftmod_open_endpoint(int id)
{
- Pst pst;
- MwMgmt cntrl;
- sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id];
+ Pst pst;
+ MwMgmt cntrl;
+ sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id];
- memset((U8 *)&pst, 0, sizeof(Pst));
- memset((U8 *)&cntrl, 0, sizeof(MwMgmt));
+ memset((U8 *)&pst, 0, sizeof(Pst));
+ memset((U8 *)&cntrl, 0, sizeof(MwMgmt));
- smPstInit(&pst);
+ smPstInit(&pst);
- pst.dstEnt = ENTMW;
+ 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 = STMWSCTSAP; /* General */
- cntrl.hdr.transId = 1; /* transaction identifier */
+ /* prepare header */
+ cntrl.hdr.msgType = TCNTRL; /* message type */
+ cntrl.hdr.entId.ent = ENTMW; /* entity */
+ cntrl.hdr.entId.inst = 0; /* instance */
+ cntrl.hdr.elmId.elmnt = STMWSCTSAP; /* 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.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 = AMWENDPOPEN;
- cntrl.t.cntrl.s.suId = m2ua->id; /* 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));
}
/***********************************************************************************************************************/
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
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{
}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 */
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__*/
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;
}
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;
}
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);
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; k<m2ua_peer_iface->numDestAddr; k++) {
g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].destAddrList[k] = m2ua_peer_iface->destAddrList[k];
}
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;
}
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;
/******************************************************************************/