]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
adding SCTP status CLI command
authorkapil <kgupta@sangoma.com>
Mon, 4 Jun 2012 17:22:26 +0000 (22:52 +0530)
committerkapil <kgupta@sangoma.com>
Mon, 4 Jun 2012 17:22:26 +0000 (22:52 +0530)
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h

index df872b260ccd7fc3451fabbedf0bdfcc4800c42c..cfcfafac7be1953dd6be2a1b83c5112713c80aed 100644 (file)
@@ -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 <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;
@@ -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 = "<?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:
index 39e9bba65855f3edbc13393443913fc9294aef69..9730bc2df22a8ade50b4ca9bd72016972d1053a7 100644 (file)
@@ -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(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)) {
@@ -1156,12 +1170,15 @@ int ftmod_ss7_m2ua_start(void){
                                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;
@@ -1169,11 +1186,14 @@ int ftmod_ss7_m2ua_start(void){
                                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);
@@ -1188,12 +1208,15 @@ int ftmod_ss7_m2ua_start(void){
                                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");
@@ -1202,44 +1225,101 @@ int ftmod_ss7_m2ua_start(void){
                                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));
 }
 
 /***********************************************************************************************************************/
@@ -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
index a988b9c8db1e657bad90c413e0d3f2b53774097a..a14db631892cac71ab5666bb088c47f99f12833c 100644 (file)
@@ -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__*/
index 9d47a33dbb46f7568cca4c011c435224bf7c469e..a3785cc01dca6e31f7b63a692d8c75162f001284 100644 (file)
@@ -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; k<m2ua_peer_iface->numDestAddr; 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;
 }
index fc6a6e61b5e252282ba3b861df69d02b7e3b8eab..90fb3e5b7f5022a480a4ee8332915891e9667009 100644 (file)
@@ -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;
 /******************************************************************************/