comparison 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
comparison
equal deleted inserted replaced
94:2c22b40408fb 95:f280328e7e2e
20 mdcx_operation(ep, req, resp) 20 mdcx_operation(ep, req, resp)
21 struct endpoint *ep; 21 struct endpoint *ep;
22 struct tmgw_ctrl_req *req; 22 struct tmgw_ctrl_req *req;
23 struct tmgw_ctrl_resp *resp; 23 struct tmgw_ctrl_resp *resp;
24 { 24 {
25 int rc;
26
25 if (req->setup_mask & TMGW_CTRL_MASK_GSM_CONN) { 27 if (req->setup_mask & TMGW_CTRL_MASK_GSM_CONN) {
26 if (ep->ep_type != TMGW_EP_TYPE_GATEWAY) { 28 if (ep->ep_type != TMGW_EP_TYPE_GATEWAY) {
27 resp->res = TMGW_RESP_ERR_PROT; 29 resp->res = TMGW_RESP_ERR_PROT;
28 return(-1); 30 return(-1);
29 } 31 }
30 if (req->gsm_addr.ss_family != AF_INET) { 32 if (req->gsm_addr.ss_family != AF_INET) {
33 resp->res = TMGW_RESP_ERR_PARAM;
34 return(-1);
35 }
36 if (req->gsm_payload_type > 0x7F) {
31 resp->res = TMGW_RESP_ERR_PARAM; 37 resp->res = TMGW_RESP_ERR_PARAM;
32 return(-1); 38 return(-1);
33 } 39 }
34 switch (req->gsm_payload_msg_type) { 40 switch (req->gsm_payload_msg_type) {
35 case GSM_TCHF_FRAME: 41 case GSM_TCHF_FRAME:
39 case GSM_TCH_FRAME_AMR: 45 case GSM_TCH_FRAME_AMR:
40 resp->res = TMGW_RESP_ERR_NOTSUP; 46 resp->res = TMGW_RESP_ERR_NOTSUP;
41 return(-1); 47 return(-1);
42 default: 48 default:
43 resp->res = TMGW_RESP_ERR_PARAM; 49 resp->res = TMGW_RESP_ERR_PARAM;
50 return(-1);
51 }
52 if (ep->gsm_payload_msg_type &&
53 ep->gsm_payload_msg_type != req->gsm_payload_msg_type) {
54 resp->res = TMGW_RESP_ERR_PROT;
44 return(-1); 55 return(-1);
45 } 56 }
46 bcopy(&req->gsm_addr, &ep->rtp_gsm.remote_addr, 57 bcopy(&req->gsm_addr, &ep->rtp_gsm.remote_addr,
47 sizeof(struct sockaddr_in)); 58 sizeof(struct sockaddr_in));
48 ep->gsm_payload_type = req->gsm_payload_type; 59 ep->gsm_payload_type = req->gsm_payload_type;
74 ep->rtp_gsm.remote_addr.sin_family != AF_INET || 85 ep->rtp_gsm.remote_addr.sin_family != AF_INET ||
75 ep->rtp_pstn.remote_addr.sin_family != AF_INET) { 86 ep->rtp_pstn.remote_addr.sin_family != AF_INET) {
76 resp->res = TMGW_RESP_ERR_PROT; 87 resp->res = TMGW_RESP_ERR_PROT;
77 return(-1); 88 return(-1);
78 } 89 }
90 if ((req->fwd_mode & TMGW_FWD_ENABLE_PSTN2GSM) &&
91 !(ep->fwd_mode & TMGW_FWD_ENABLE_PSTN2GSM)) {
92 rc = pstn2gsm_init(ep);
93 if (rc != TMGW_RESP_OK) {
94 resp->res = rc;
95 return(-1);
96 }
97 }
79 ep->fwd_mode = req->fwd_mode; 98 ep->fwd_mode = req->fwd_mode;
80 } 99 }
81 return(0); 100 return(0);
82 } 101 }
83 102