From 076d9fbe67ef4282d528ade20fe79fb69f7045e4 Mon Sep 17 00:00:00 2001
From: kapil <kgupta@sangoma.com>
Date: Wed, 30 May 2012 07:45:59 +0530
Subject: [PATCH] M2UA xml configuration parsing code

---
 .../ftmod_sangoma_ss7_m2ua.h                  |   2 +-
 .../ftmod_sangoma_ss7_m2ua_xml.c              | 106 +++++++++++-------
 .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c |  32 ++++--
 3 files changed, 86 insertions(+), 54 deletions(-)

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 1dc9a1f944..db13a1635b 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
@@ -114,7 +114,7 @@ int ftmod_ss7_parse_nif_interfaces(ftdm_conf_node_t *nif_interfaces);
 int ftmod_ss7_parse_m2ua_interfaces(ftdm_conf_node_t *m2ua_interfaces);
 int ftmod_ss7_parse_m2ua_peer_interfaces(ftdm_conf_node_t *m2ua_peer_interfaces);
 int ftmod_ss7_parse_m2ua_clust_interfaces(ftdm_conf_node_t *m2ua_clust_interfaces);
-ftdm_status_t ftmod_m3ua_parse_sctp_links(ftdm_conf_node_t *node);
+int ftmod_ss7_parse_sctp_links(ftdm_conf_node_t *node);
 uint32_t iptoul(const char *ip);
 
 int ftmod_ss7_m2ua_start(void);
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 70af479482..333f616628 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
@@ -52,7 +52,7 @@ static int ftmod_ss7_fill_in_m2ua_interface(sng_m2ua_cfg_t *m2ua_iface);
 static int ftmod_ss7_fill_in_m2ua_peer_interface(sng_m2ua_peer_cfg_t *m2ua_peer_face);
 static int ftmod_ss7_fill_in_m2ua_clust_interface(sng_m2ua_cluster_cfg_t *m2ua_cluster_face);
 
-static ftdm_status_t ftmod_m3ua_parse_sctp_link(ftdm_conf_node_t *node);
+static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node);
 
 /******************************************************************************/
 int ftmod_ss7_parse_nif_interfaces(ftdm_conf_node_t *nif_interfaces)
@@ -95,6 +95,11 @@ static int ftmod_ss7_parse_nif_interface(ftdm_conf_node_t *nif_interface)
 	/* initalize the nif intf and isap structure */
 	memset(&sng_nif, 0x0, sizeof(sng_nif));
 
+	if(!nif_interface){
+		SS7_ERROR("ftmod_ss7_parse_nif_interface: Null XML Node pointer \n");
+		return FTDM_FAIL;
+	}
+
 	/* confirm that we are looking at an nif_interface */
 	if (strcasecmp(nif_interface->name, "sng_nif_interface")) {
 		SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"nif_interface\"!\n",nif_interface->name);
@@ -118,16 +123,16 @@ static int ftmod_ss7_parse_nif_interface(ftdm_conf_node_t *nif_interface)
 			sng_nif.id = atoi(parm->val);
 			SS7_DEBUG("Found an nif id = %d\n", sng_nif.id);
 		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "m2uaLnkNmb")) {
+		} else if (!strcasecmp(parm->var, "m2ua_link_nmb")) {
 		/**********************************************************************/
 			sng_nif.m2uaLnkNmb = atoi(parm->val);
-			SS7_DEBUG("Found an nif m2uaLnkNmb = %d\n", sng_nif.m2uaLnkNmb);
+			SS7_DEBUG("Found an nif m2ua_link_nmb = %d\n", sng_nif.m2uaLnkNmb);
 		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "mtp2LnkNmb")) {
+		} else if (!strcasecmp(parm->var, "mtp2_link_nmb")) {
 		/**********************************************************************/
 			sng_nif.mtp2LnkNmb=atoi(parm->val);
 
-			SS7_DEBUG("Found an nif mtp2LnkNmb = %d\n", sng_nif.mtp2LnkNmb);
+			SS7_DEBUG("Found an nif mtp2_link_nmb = %d\n", sng_nif.mtp2LnkNmb);
 		/**********************************************************************/
 		} else {
 		/**********************************************************************/
@@ -204,6 +209,11 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface)
 	/* initalize the m2ua intf */
 	memset(&sng_m2ua, 0x0, sizeof(sng_m2ua));
 
+	if(!m2ua_interface){
+		SS7_ERROR("ftmod_ss7_parse_m2ua_interface: Null XML Node pointer \n");
+		return FTDM_FAIL;
+	}
+
 	/* confirm that we are looking at an nif_interface */
 	if (strcasecmp(m2ua_interface->name, "sng_m2ua_interface")) {
 		SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_interface\"!\n",m2ua_interface->name);
@@ -227,7 +237,7 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface)
 			sng_m2ua.id = atoi(parm->val);
 			SS7_DEBUG("Found an m2ua id = %d\n", sng_m2ua.id);
 		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "nodeType")) {
+		} else if (!strcasecmp(parm->var, "node_type")) {
 			/**********************************************************************/
 			if(!strcasecmp(parm->val, "SGP")){
 				sng_m2ua.nodeType = SNG_M2UA_NODE_TYPE_SGP;
@@ -238,25 +248,25 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface)
 				SS7_ERROR("Found an invalid NodeType Parameter Value[%s]\n", parm->val);
 				return FTDM_FAIL;
 			}
-			SS7_DEBUG("Found an nif nodeType = %d\n", sng_m2ua.nodeType);
+			SS7_DEBUG("Found an nif node_type = %d\n", sng_m2ua.nodeType);
 			/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "sctpId")) {
+		} else if (!strcasecmp(parm->var, "sctp_id")) {
 		/**********************************************************************/
 			sng_m2ua.sctpId=atoi(parm->val);
 
-			SS7_DEBUG("Found an m2ua sctpId = %d\n", sng_m2ua.sctpId);
+			SS7_DEBUG("Found an m2ua sctp_id = %d\n", sng_m2ua.sctpId);
 		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "peerdId")) {
+		} else if (!strcasecmp(parm->var, "peerd_id")) {
 		/**********************************************************************/
 			sng_m2ua.peerdId=atoi(parm->val);
 
-			SS7_DEBUG("Found an m2ua peerdId = %d\n", sng_m2ua.peerdId);
+			SS7_DEBUG("Found an m2ua peerd_id = %d\n", sng_m2ua.peerdId);
 		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "clusterId")) {
+		} else if (!strcasecmp(parm->var, "cluster_id")) {
 		/**********************************************************************/
 			sng_m2ua.clusterId=atoi(parm->val);
 
-			SS7_DEBUG("Found an m2ua clusterId = %d\n", sng_m2ua.clusterId);
+			SS7_DEBUG("Found an m2ua cluster_id = %d\n", sng_m2ua.clusterId);
 		/**********************************************************************/
 		} else {
 		/**********************************************************************/
@@ -335,6 +345,11 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter
 	/* initalize the m2ua intf */
 	memset(&sng_m2ua_peer, 0x0, sizeof(sng_m2ua_peer));
 
+	if(!m2ua_peer_interface){
+		SS7_ERROR("ftmod_ss7_parse_m2ua_peer_interface: Null XML Node pointer \n");
+		return FTDM_FAIL;
+	}
+
 	/* confirm that we are looking at an m2ua_peer_interface */
 	if (strcasecmp(m2ua_peer_interface->name, "sng_m2ua_peer_interface")) {
 		SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_peer_interface\"!\n",m2ua_peer_interface->name);
@@ -358,7 +373,7 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter
 			sng_m2ua_peer.id = atoi(parm->val);
 			SS7_DEBUG("Found an sng_m2ua_peer id = %d\n", sng_m2ua_peer.id);
 		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "aspIdFlag")) {
+		} else if (!strcasecmp(parm->var, "asp_id_flag")) {
 			/**********************************************************************/
 			if(!strcasecmp(parm->val, "TRUE")){
 				sng_m2ua_peer.aspIdFlag = 0x01;
@@ -370,13 +385,19 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter
 			}
 			SS7_DEBUG("Found an sng_m2ua_peer aspIdFlag = %d\n", sng_m2ua_peer.aspIdFlag);
 			/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "selfAspId")) {
+		} else if (!strcasecmp(parm->var, "self_asp_id")) {
 		/**********************************************************************/
 			sng_m2ua_peer.selfAspId=atoi(parm->val);
 
-			SS7_DEBUG("Found an sng_m2ua_peer selfAspId = %d\n", sng_m2ua_peer.selfAspId);
+			SS7_DEBUG("Found an sng_m2ua_peer self_asp_id = %d\n", sng_m2ua_peer.selfAspId);
 		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "DestAddr")) {
+		} else if (!strcasecmp(parm->var, "sctp_id")) {
+		/**********************************************************************/
+			sng_m2ua_peer.sctpId = atoi(parm->val);
+
+			SS7_DEBUG("Found an sng_m2ua_peer sctp_id = %d\n", sng_m2ua_peer.sctpId);
+		/**********************************************************************/
+		} else if (!strcasecmp(parm->var, "dest_addr")) {
 		/**********************************************************************/
 			if (sng_m2ua_peer.numDestAddr < SCT_MAX_NET_ADDRS) {
                                 sng_m2ua_peer.destAddrList[sng_m2ua_peer.numDestAddr] = iptoul (parm->val);
@@ -386,17 +407,11 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter
                                 SS7_ERROR("sng_m2ua_peer - too many dest address configured. dropping %s \n", parm->val);
                         }
 		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "locOutStrms")) {
+		} else if (!strcasecmp(parm->var, "loc_out_strms")) {
 		/**********************************************************************/
 			sng_m2ua_peer.locOutStrms=atoi(parm->val);
 
-			SS7_DEBUG("Found an sng_m2ua_peer locOutStrms = %d\n", sng_m2ua_peer.locOutStrms);
-		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "sctpId")) {
-		/**********************************************************************/
-			sng_m2ua_peer.sctpId=atoi(parm->val);
-
-			SS7_DEBUG("Found an sng_m2ua_peer sctpId = %d\n", sng_m2ua_peer.sctpId);
+			SS7_DEBUG("Found an sng_m2ua_peer loc_out_strms = %d\n", sng_m2ua_peer.locOutStrms);
 		/**********************************************************************/
 		} else {
 		/**********************************************************************/
@@ -481,6 +496,11 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i
 	/* initalize the m2ua_cluster_interface */
 	memset(&sng_m2ua_cluster, 0x0, sizeof(sng_m2ua_cluster));
 
+	if (!m2ua_cluster_interface){
+		SS7_ERROR("ftmod_ss7_parse_m2ua_clust_interface - NULL XML Node pointer \n");
+		return FTDM_FAIL;
+	}
+
 	/* confirm that we are looking at an m2ua_cluster_interface */
 	if (strcasecmp(m2ua_cluster_interface->name, "sng_m2ua_cluster_interface")) {
 		SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_cluster_interface\"!\n",m2ua_cluster_interface->name);
@@ -504,13 +524,13 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i
 			sng_m2ua_cluster.id = atoi(parm->val);
 			SS7_DEBUG("Found an sng_m2ua_cluster id = %d\n", sng_m2ua_cluster.id);
 		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "trfMode")) {
+		} else if (!strcasecmp(parm->var, "trf_mode")) {
 			/**********************************************************************/
-			if(!strcasecmp(parm->val, "LOADSHARE")){
+			if(!strcasecmp(parm->val, "loadshare")){
 				sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_LOADSHARE;
-			} else if(!strcasecmp(parm->val, "OVERRIDE")){
+			} else if(!strcasecmp(parm->val, "override")){
 				sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_OVERRIDE;
-			} else if(!strcasecmp(parm->val, "BROADCAST")){
+			} else if(!strcasecmp(parm->val, "broadcast")){
 				sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_BROADCAST;
 			} else {
 				SS7_ERROR("Found an invalid trfMode Parameter Value[%s]..adding default one[ANY]\n", parm->val);
@@ -518,13 +538,13 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i
 			}
 			SS7_DEBUG("Found an sng_m2ua_cluster.trfMode  = %d\n", sng_m2ua_cluster.trfMode);
 			/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "loadShareAlgo")) {
+		} else if (!strcasecmp(parm->var, "load_share_algo")) {
 		/**********************************************************************/
-			if(!strcasecmp(parm->val, "Round_Robin")){
+			if(!strcasecmp(parm->val, "roundrobin")){
 				sng_m2ua_cluster.loadShareAlgo = SNG_M2UA_LOAD_SHARE_ALGO_RR;
-			} else if(!strcasecmp(parm->val, "Link_Specified")){
+			} else if(!strcasecmp(parm->val, "linkspecified")){
 				sng_m2ua_cluster.loadShareAlgo = SNG_M2UA_LOAD_SHARE_ALGO_LS;
-			} else if(!strcasecmp(parm->val, "Customer_Specified")){
+			} else if(!strcasecmp(parm->val, "customerspecified")){
 				sng_m2ua_cluster.loadShareAlgo = SNG_M2UA_LOAD_SHARE_ALGO_CS;
 			} else {
 				SS7_ERROR("Found an invalid loadShareAlgo Parameter Value[%s]\n", parm->val);
@@ -533,7 +553,7 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i
 
 			SS7_DEBUG("Found an sng_m2ua_cluster.loadShareAlgo = %d\n", sng_m2ua_cluster.loadShareAlgo);
 		/**********************************************************************/
-		} else if (!strcasecmp(parm->var, "peerId")) {
+		} else if (!strcasecmp(parm->var, "peer_id")) {
 			/**********************************************************************/
 			if(sng_m2ua_cluster.numOfPeers < MW_MAX_NUM_OF_PEER) {
 				sng_m2ua_cluster.peerIdLst[sng_m2ua_cluster.numOfPeers] = atoi(parm->val);
@@ -586,7 +606,7 @@ static int ftmod_ss7_fill_in_m2ua_clust_interface(sng_m2ua_cluster_cfg_t *m2ua_c
 }
 
 /******************************************************************************/
-ftdm_status_t ftmod_m3ua_parse_sctp_links(ftdm_conf_node_t *node)
+int ftmod_ss7_parse_sctp_links(ftdm_conf_node_t *node)
 {
 	ftdm_conf_node_t	*node_sctp_link = NULL;
 
@@ -601,7 +621,7 @@ ftdm_status_t ftmod_m3ua_parse_sctp_links(ftdm_conf_node_t *node)
 	}
 
 	for (node_sctp_link = node->child; node_sctp_link != NULL; node_sctp_link = node_sctp_link->next) {
-		if (ftmod_m3ua_parse_sctp_link(node_sctp_link) != FTDM_SUCCESS) {
+		if (ftmod_ss7_parse_sctp_link(node_sctp_link) != FTDM_SUCCESS) {
 			SS7_ERROR("SCTP - Failed to parse <node_sctp_link>. \n");
 			return FTDM_FAIL;
 		}
@@ -611,14 +631,16 @@ ftdm_status_t ftmod_m3ua_parse_sctp_links(ftdm_conf_node_t *node)
 }
 
 /******************************************************************************/
-static ftdm_status_t ftmod_m3ua_parse_sctp_link(ftdm_conf_node_t *node)
+static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node)
 {
 	ftdm_conf_parameter_t	*param = NULL;
 	int					num_params = 0;
 	int 					i=0;
 
-	if (!node)
+	if (!node){
+		SS7_ERROR("SCTP - NULL XML Node pointer \n");
 		return FTDM_FAIL;
+	}
 
 	param = node->parameters;
 	num_params = node->n_parameters;
@@ -637,17 +659,17 @@ static ftdm_status_t ftmod_m3ua_parse_sctp_link(ftdm_conf_node_t *node)
 		if (!strcasecmp(param->var, "name")) {
 			int n_strlen = strlen(param->val);
 			strncpy((char*)t_link.name, param->val, (n_strlen>MAX_NAME_LEN)?MAX_NAME_LEN:n_strlen);
-			SS7_DEBUG("SCTP - Parsing <sctp_link> with name = %s\n", param->val);
+			SS7_DEBUG("SCTP - Parsing <sng_sctp_interface> with name = %s\n", param->val);
 		}
 		else if (!strcasecmp(param->var, "id")) {
 			t_link.id = atoi(param->val);
-			SS7_DEBUG("SCTP - Parsing <sctp_link> with id = %s\n", param->val);
+			SS7_DEBUG("SCTP - Parsing <sng_sctp_interface> with id = %s\n", param->val);
 		}
-		else if (!strcasecmp(param->var, "srcAddr")) {
+		else if (!strcasecmp(param->var, "src_addr")) {
 			if (t_link.numSrcAddr < SCT_MAX_NET_ADDRS) {
 				t_link.srcAddrList[t_link.numSrcAddr+1] = iptoul (param->val);
 				t_link.numSrcAddr++;
-				SS7_DEBUG("SCTP - Parsing <sctp_link> with source IP Address = %s\n", param->val);
+				SS7_DEBUG("SCTP - Parsing <sng_sctp_interface> with source IP Address = %s\n", param->val);
 			} else {
 				SS7_ERROR("SCTP - too many source address configured. dropping %s \n", param->val);
 			}
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
index 32ebdc52b9..4b51bfc0e7 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
@@ -510,15 +510,6 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup)
 		return FTDM_FAIL;
 	}
 
-	if (ftmod_ss7_parse_mtp_linksets(mtp_linksets)) {
-		SS7_ERROR("Failed to parse \"mtp_linksets\"!\n");
-		return FTDM_FAIL;
-	}
-
-	if (ftmod_ss7_parse_mtp_routes(mtp_routes)) {	
-		SS7_ERROR("Failed to parse \"mtp_routes\"!\n");
-		return FTDM_FAIL;
-	}
 
 	switch(g_ftdm_operating_mode)
 	{
@@ -529,6 +520,16 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup)
 					return FTDM_FAIL;
 				}
 
+				if (ftmod_ss7_parse_mtp_linksets(mtp_linksets)) {
+					SS7_ERROR("Failed to parse \"mtp_linksets\"!\n");
+					return FTDM_FAIL;
+				}
+
+				if (ftmod_ss7_parse_mtp_routes(mtp_routes)) {	
+					SS7_ERROR("Failed to parse \"mtp_routes\"!\n");
+					return FTDM_FAIL;
+				}
+
 				if (isup_interfaces && ftmod_ss7_parse_isup_interfaces(isup_interfaces)) {
 					SS7_ERROR("Failed to parse \"isup_interfaces\"!\n");
 					return FTDM_FAIL;
@@ -542,11 +543,20 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup)
 			}
 		case SNG_SS7_OPR_MODE_M2UA_SG: 
 			{
-				if (ftmod_m3ua_parse_sctp_links(sctp_ifaces) != FTDM_SUCCESS) {
+				if (ftmod_ss7_parse_mtp_linksets(mtp_linksets)) {
+					SS7_ERROR("Failed to parse \"mtp_linksets\"!\n");
+					return FTDM_FAIL;
+				}
+
+				if (ftmod_ss7_parse_mtp_routes(mtp_routes)) {	
+					SS7_ERROR("Failed to parse \"mtp_routes\"!\n");
+					return FTDM_FAIL;
+				}
+
+				if (ftmod_ss7_parse_sctp_links(sctp_ifaces) != FTDM_SUCCESS) {
 					SS7_ERROR("Failed to parse <sctp_links>!\n");
 					return FTDM_FAIL;
 				}
-				SS7_INFO("Finished ftmod_m3ua_parse_sctp_links!\n");
 
 				if (nif_ifaces && ftmod_ss7_parse_nif_interfaces(nif_ifaces)) {
 					SS7_ERROR("Failed to parse \"nif_ifaces\"!\n");