diff mgw/mdcx.c @ 95:f280328e7e2e

themwi-mgw: initial implementation of PSTN to GSM forwarding
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 25 Sep 2022 19:17:44 -0800
parents 020ba624bdd8
children 738be11ac432
line wrap: on
line diff
--- a/mgw/mdcx.c	Sat Sep 24 15:14:50 2022 -0800
+++ b/mgw/mdcx.c	Sun Sep 25 19:17:44 2022 -0800
@@ -22,6 +22,8 @@
 	struct tmgw_ctrl_req *req;
 	struct tmgw_ctrl_resp *resp;
 {
+	int rc;
+
 	if (req->setup_mask & TMGW_CTRL_MASK_GSM_CONN) {
 		if (ep->ep_type != TMGW_EP_TYPE_GATEWAY) {
 			resp->res = TMGW_RESP_ERR_PROT;
@@ -31,6 +33,10 @@
 			resp->res = TMGW_RESP_ERR_PARAM;
 			return(-1);
 		}
+		if (req->gsm_payload_type > 0x7F) {
+			resp->res = TMGW_RESP_ERR_PARAM;
+			return(-1);
+		}
 		switch (req->gsm_payload_msg_type) {
 		case GSM_TCHF_FRAME:
 			break;
@@ -43,6 +49,11 @@
 			resp->res = TMGW_RESP_ERR_PARAM;
 			return(-1);
 		}
+		if (ep->gsm_payload_msg_type &&
+		    ep->gsm_payload_msg_type != req->gsm_payload_msg_type) {
+			resp->res = TMGW_RESP_ERR_PROT;
+			return(-1);
+		}
 		bcopy(&req->gsm_addr, &ep->rtp_gsm.remote_addr,
 			sizeof(struct sockaddr_in));
 		ep->gsm_payload_type = req->gsm_payload_type;
@@ -76,6 +87,14 @@
 			resp->res = TMGW_RESP_ERR_PROT;
 			return(-1);
 		}
+		if ((req->fwd_mode & TMGW_FWD_ENABLE_PSTN2GSM) &&
+		    !(ep->fwd_mode & TMGW_FWD_ENABLE_PSTN2GSM)) {
+			rc = pstn2gsm_init(ep);
+			if (rc != TMGW_RESP_OK) {
+				resp->res = rc;
+				return(-1);
+			}
+		}
 		ep->fwd_mode = req->fwd_mode;
 	}
 	return(0);