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 6fece294cc..8c76bb6f12 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 @@ -403,8 +403,8 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha /**************************************************************************/ if (check_arg_count(argc, 2)) { - cli_ss7_show_general(stream); - return FTDM_SUCCESS; + stream->write_function(stream, "Unknown \"xmlshow\" command\n"); + goto handle_cli_error; } c++; /**************************************************************************/ @@ -3071,7 +3071,7 @@ static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[6144]; int x = 0x00; int idx = 0x00; int len = 0x00; @@ -3105,6 +3105,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED))) { len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n", g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].name); if(ftmod_m2ua_ssta_req(STMWDLSAP,x,&cfm)) { stream->write_function(stream," Request to Trillium SCTP layer failed \n"); @@ -3164,17 +3165,17 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) } } - if(ftmod_m2ua_ssta_req(STMWSCTSAP,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_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); - len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); - len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); - len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); - len = len + sprintf(buf + len, "\n"); - } + if(ftmod_m2ua_ssta_req(STMWSCTSAP,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_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); + len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); + len = len + sprintf(buf + len, "\n"); + } len = len + sprintf(buf + len, "\n"); } @@ -3199,7 +3200,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char* m2ua_profile_name) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int idx = 0x00; int found = 0x00; @@ -3234,6 +3235,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n", m2ua_profile_name); if(ftmod_m2ua_ssta_req(STMWDLSAP,x,&cfm)) { stream->write_function(stream," Request to Trillium SCTP layer failed \n"); @@ -3248,7 +3250,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, "\n"); } - if(ftmod_m2ua_ssta_req(STMWCLUSTER,x,&cfm)) { + if(ftmod_m2ua_ssta_req(STMWCLUSTER, g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].clusterId, &cfm)) { stream->write_function(stream," Request to Trillium SCTP layer failed \n"); return FTDM_FAIL; } else { @@ -3323,7 +3325,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int len = 0x00; SbMgmt cfm; @@ -3402,8 +3404,14 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) } if(ftmod_sctp_ssta_req(STSBASSOC,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); - return FTDM_FAIL; + if(LCM_REASON_INVALID_PAR_VAL == cfm.cfm.reason){ + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " SCT_ASSOC_STATE_CLOSED \n"); + len = len + sprintf(buf + len, "\n"); + }else{ + 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); @@ -3535,7 +3543,7 @@ int get_assoc_resp_buf(char* buf,SbMgmt* cfm) static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char* sctp_profile_name) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int len = 0x00; SbMgmt cfm; @@ -3586,8 +3594,15 @@ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char } if(ftmod_sctp_ssta_req(STSBASSOC,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); - return FTDM_FAIL; + /* it means assoc id not yet allocated */ + if(LCM_REASON_INVALID_PAR_VAL == cfm.cfm.reason){ + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " SCT_ASSOC_STATE_CLOSED \n"); + len = len + sprintf(buf + len, "\n"); + }else{ + 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); @@ -3613,7 +3628,7 @@ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int len = 0x00; NwMgmt cfm; @@ -3674,7 +3689,7 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* nif_profile_name) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int found = 0x00; int len = 0x00; @@ -3737,7 +3752,7 @@ static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, char* m2ua_profile_name) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int found = 0x00; int len = 0x00; 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 0639165e97..a5ff80a636 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 @@ -51,7 +51,7 @@ static int ftmod_sctp_config(int id); static ftdm_status_t ftmod_sctp_sap_config(int id); static ftdm_status_t ftmod_sctp_tsap_config(int id); static int ftmod_m2ua_gen_config(void); -static int ftmod_m2ua_sctsap_config(int m2ua_inf_id, int sctp_id); +static int ftmod_m2ua_sctsap_config(int sct_sap_id, int sctp_id); static int ftmod_m2ua_peer_config(int id); static int ftmod_m2ua_peer_config1(int m2ua_inf_id, int peer_id); static int ftmod_m2ua_cluster_config(int idx); @@ -782,6 +782,14 @@ static int ftmod_m2ua_peer_config(int id) sng_m2ua_cluster_cfg_t* clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; sng_m2ua_peer_cfg_t* peer = NULL; + if((clust->flags & SNGSS7_CONFIGURED)){ + ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_peer_config: Cluster [%s] is already configured \n", clust->name); + return 0x00; + } + + /*NOTE : SCTSAP is based on per source address , so if we have same Cluster / peer shared across many then + * we dont have do configuration for each time */ + /* loop through peer list from cluster to configure SCTSAP */ for(x = 0; x < clust->numOfPeers;x++){ @@ -800,13 +808,18 @@ static int ftmod_m2ua_peer_config(int id) ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_peer_config1: M2UA Peer configuration for M2UA Intf Id[%d] config SUCCESS \n", id); } + clust->sct_sap_id = id; + /* set configured flag for cluster and peer */ + clust->flags |= SNGSS7_CONFIGURED; + peer->flags |= SNGSS7_CONFIGURED; } return 0x0;; } -static int ftmod_m2ua_sctsap_config(int m2ua_inf_id, int sctp_id) + +static int ftmod_m2ua_sctsap_config(int sct_sap_id, int sctp_id) { int i; Pst pst; @@ -836,7 +849,7 @@ static int ftmod_m2ua_sctsap_config(int m2ua_inf_id, int sctp_id) cfg.t.cfg.s.sctSapCfg.reConfig.selector = 0; /* service user SAP ID */ - cfg.t.cfg.s.sctSapCfg.suId = m2ua_inf_id; + cfg.t.cfg.s.sctSapCfg.suId = sct_sap_id; /* service provider ID */ cfg.t.cfg.s.sctSapCfg.spId = sctp_id; /* source port number */ @@ -1275,7 +1288,7 @@ int ftmod_ss7_m2ua_start(void){ 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].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); @@ -1296,9 +1309,16 @@ int ftmod_ss7_m2ua_start(void){ static int ftmod_open_endpoint(int id) { + int ret = 0x00; Pst pst; MwMgmt cntrl; sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; + sng_m2ua_cluster_cfg_t* clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; + + if(clust->flags & SNGSS7_M2UA_EP_OPENED) { + ftdm_log (FTDM_LOG_INFO ," END-POINT already opened\n"); + return ret; + } memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); @@ -1324,7 +1344,12 @@ static int ftmod_open_endpoint(int id) cntrl.t.cntrl.action = AMWENDPOPEN; cntrl.t.cntrl.s.suId = m2ua->id; /* M2UA sct sap Id */ - return (sng_cntrl_m2ua (&pst, &cntrl)); + + if(0 == (ret = sng_cntrl_m2ua (&pst, &cntrl))){ + clust->flags |= SNGSS7_M2UA_EP_OPENED; + } + return ret; + } /***********************************************************************************************************************/ @@ -1400,9 +1425,17 @@ static int ftmod_sctp_tucl_tsap_bind(int id) static int ftmod_m2ua_sctp_sctsap_bind(int id) { + int ret = 0x00; Pst pst; MwMgmt cntrl; sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; + sng_m2ua_cluster_cfg_t* clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; + + if(clust->flags & SNGSS7_ACTIVE) { + ftdm_log (FTDM_LOG_INFO ," SCT-SAP is already enabled\n"); + return ret; + } + memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); @@ -1427,8 +1460,10 @@ static int ftmod_m2ua_sctp_sctsap_bind(int id) cntrl.t.cntrl.action = ABND; cntrl.t.cntrl.s.suId = m2ua->id; - return (sng_cntrl_m2ua (&pst, &cntrl)); - + if(0 == (ret = sng_cntrl_m2ua (&pst, &cntrl))){ + clust->flags |= SNGSS7_ACTIVE; + } + return ret; } /***********************************************************************************************************************/ static int ftmod_nif_m2ua_dlsap_bind(int id) @@ -1668,7 +1703,8 @@ int ftmod_m2ua_ssta_req(int elemt, int id, MwMgmt* cfm) case STMWSCTSAP: { m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; - ssta.t.ssta.id.suId = m2ua->id ; /* lower sap Id */ + clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; + ssta.t.ssta.id.suId = clust->sct_sap_id ; /* lower sap Id */ break; } case STMWDLSAP: 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 2b44426102..8e22e47b97 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 @@ -96,6 +96,7 @@ typedef struct sng_m2ua_cluster_cfg{ char name[MAX_NAME_LEN]; uint32_t flags; uint32_t id; /* ID */ + uint32_t sct_sap_id; /* Internal - sct_sap_id */ uint8_t trfMode; /* Traffic mode. This parameter defines the mode in which this m2ua cluster is supposed to work */ uint8_t loadShareAlgo; /* This parameter defines the M2UA load share algorithm which is used to distribute the traffic */ uint16_t numOfPeers; /* idx to m2ua_peer profile */ 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 63e146c029..0e52f88710 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 @@ -767,9 +767,10 @@ typedef enum { SNGSS7_M2UA_PRESENT = (1 << 18), SNGSS7_M2UA_STARTED = (1 << 19), + SNGSS7_M2UA_EP_OPENED = (1 << 20), - SNGSS7_NIF_PRESENT = (1 << 20), - SNGSS7_NIF_STARTED = (1 << 21), + SNGSS7_NIF_PRESENT = (1 << 21), + SNGSS7_NIF_STARTED = (1 << 22), } sng_task_flag_t; /******************************************************************************/