FreeCalypso > hg > themwi-system-sw
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 |