FreeCalypso > hg > themwi-system-sw
annotate mgw/mdcx.c @ 76:21276f045026
sip-in: validate To header prior to tag addition
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Tue, 20 Sep 2022 16:40:07 -0800 | 
| parents | 020ba624bdd8 | 
| children | f280328e7e2e | 
| rev | line source | 
|---|---|
| 32 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 * In this module we implement our MDCX operation. | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 */ | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 #include <sys/types.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 #include <sys/socket.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 #include <netinet/in.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include <stdio.h> | 
| 38 
020ba624bdd8
mgw source: #include <stdlib.h> in files using tmgw_ctrl.h
 Mychaela Falconia <falcon@freecalypso.org> parents: 
34diff
changeset | 9 #include <stdint.h> | 
| 32 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 #include <stdlib.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 #include <string.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 #include <strings.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 #include <syslog.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 #include "../include/tmgw_ctrl.h" | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 #include "../include/tmgw_const.h" | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 #include "struct.h" | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 extern struct endpoint *find_ep_by_id(); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 mdcx_operation(ep, req, resp) | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 struct endpoint *ep; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 struct tmgw_ctrl_req *req; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 struct tmgw_ctrl_resp *resp; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 if (req->setup_mask & TMGW_CTRL_MASK_GSM_CONN) { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 if (ep->ep_type != TMGW_EP_TYPE_GATEWAY) { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 resp->res = TMGW_RESP_ERR_PROT; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 return(-1); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 } | 
| 34 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 30 if (req->gsm_addr.ss_family != AF_INET) { | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 31 resp->res = TMGW_RESP_ERR_PARAM; | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 32 return(-1); | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 33 } | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 34 switch (req->gsm_payload_msg_type) { | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 35 case GSM_TCHF_FRAME: | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 36 break; | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 37 case GSM_TCHF_FRAME_EFR: | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 38 case GSM_TCHH_FRAME: | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 39 case GSM_TCH_FRAME_AMR: | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 40 resp->res = TMGW_RESP_ERR_NOTSUP; | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 41 return(-1); | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 42 default: | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 43 resp->res = TMGW_RESP_ERR_PARAM; | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 44 return(-1); | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 45 } | 
| 32 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 bcopy(&req->gsm_addr, &ep->rtp_gsm.remote_addr, | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 sizeof(struct sockaddr_in)); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 ep->gsm_payload_type = req->gsm_payload_type; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 ep->gsm_payload_msg_type = req->gsm_payload_msg_type; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 } | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 if (req->setup_mask & TMGW_CTRL_MASK_PSTN_CONN) { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 if (ep->ep_type != TMGW_EP_TYPE_GATEWAY) { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 resp->res = TMGW_RESP_ERR_PROT; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 return(-1); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 } | 
| 34 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 56 if (req->pstn_addr.ss_family != AF_INET) { | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 57 resp->res = TMGW_RESP_ERR_PARAM; | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 58 return(-1); | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 59 } | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 60 switch (req->pstn_payload_type) { | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 61 case PSTN_CODEC_PCMU: | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 62 case PSTN_CODEC_PCMA: | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 63 break; | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 64 default: | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 65 resp->res = TMGW_RESP_ERR_PARAM; | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 66 return(-1); | 
| 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 67 } | 
| 32 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 bcopy(&req->pstn_addr, &ep->rtp_pstn.remote_addr, | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 sizeof(struct sockaddr_in)); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 70 ep->pstn_payload_type = req->pstn_payload_type; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 } | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 72 if (req->setup_mask & TMGW_CTRL_MASK_FWD_MODE) { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 if (ep->ep_type != TMGW_EP_TYPE_GATEWAY || | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 ep->rtp_gsm.remote_addr.sin_family != AF_INET || | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 ep->rtp_pstn.remote_addr.sin_family != AF_INET) { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 76 resp->res = TMGW_RESP_ERR_PROT; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 77 return(-1); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 } | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 ep->fwd_mode = req->fwd_mode; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 } | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 return(0); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 } | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 void | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 85 process_mdcx(conn, req, resp) | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 86 struct ctrl_conn *conn; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 87 struct tmgw_ctrl_req *req; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 88 struct tmgw_ctrl_resp *resp; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 89 { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 struct endpoint *ep; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 91 int rc; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 92 | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 93 ep = find_ep_by_id(conn, req->ep_id); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 94 if (!ep) { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 95 resp->res = TMGW_RESP_ERR_PROT; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 96 return; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 97 } | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 98 rc = mdcx_operation(ep, req, resp); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 99 if (rc == 0) | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 100 resp->res = TMGW_RESP_OK; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 101 } | 
