FreeCalypso > hg > themwi-system-sw
annotate mgw/ctrl_prot.c @ 275:def9f6e4f49e default tip
doc/Use-outside-USA: Fake-NANP-numbers article is here
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Mon, 27 Nov 2023 21:49:19 -0800 | 
| parents | f062c32a5116 | 
| children | 
| 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 control socket protocol. | 
| 
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> | 
| 127 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
38diff
changeset | 7 #include <sys/time.h> | 
| 32 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include <netinet/in.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 #include <stdio.h> | 
| 38 
020ba624bdd8
mgw source: #include <stdlib.h> in files using tmgw_ctrl.h
 Mychaela Falconia <falcon@freecalypso.org> parents: 
34diff
changeset | 10 #include <stdint.h> | 
| 32 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 #include <stdlib.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 #include <string.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 #include <strings.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 #include <syslog.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 #include <unistd.h> | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 #include "../include/tmgw_ctrl.h" | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 #include "struct.h" | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 #include "select.h" | 
| 
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 struct endpoint * | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 find_ep_by_id(conn, id) | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 struct ctrl_conn *conn; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 unsigned id; | 
| 
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 struct endpoint *ep; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 for (ep = conn->endp_list; ep; ep = ep->next) | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 if (ep->ep_id == id) | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 return ep; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 return 0; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 } | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 void | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 ctrl_message_handler(fd, conn) | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 struct ctrl_conn *conn; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 struct tmgw_ctrl_req req; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 struct tmgw_ctrl_resp resp; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 int rc; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 rc = recv(fd, &req, sizeof req, 0); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 if (rc < sizeof req) { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 syslog(LOG_INFO, "ctrl connection closing %s active endpoints", | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 conn->endp_list ? "with" : "without"); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 close(fd); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 FD_CLR(fd, &select_for_read); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 dlcx_all_on_conn(conn); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 free(conn); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 return; | 
| 
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 bzero(&resp, sizeof resp); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 resp.transact_ref = req.transact_ref; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 switch (req.opcode) { | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 case TMGW_CTRL_OP_CRCX: | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 process_crcx(conn, &req, &resp); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 break; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 case TMGW_CTRL_OP_MDCX: | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 process_mdcx(conn, &req, &resp); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 break; | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 case TMGW_CTRL_OP_DLCX: | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 process_dlcx(conn, &req, &resp); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 break; | 
| 127 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
38diff
changeset | 63 case TMGW_CTRL_OP_DTMF_START: | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
38diff
changeset | 64 process_dtmf_start(conn, &req, &resp); | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
38diff
changeset | 65 break; | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
38diff
changeset | 66 case TMGW_CTRL_OP_DTMF_STOP: | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
38diff
changeset | 67 process_dtmf_stop(conn, &req, &resp); | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
38diff
changeset | 68 break; | 
| 32 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 default: | 
| 34 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 Mychaela Falconia <falcon@freecalypso.org> parents: 
32diff
changeset | 70 resp.res = TMGW_RESP_ERR_OPCODE; | 
| 32 
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 send(fd, &resp, sizeof resp, 0); | 
| 
b3f74df7b808
beginning of themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 } | 
