FreeCalypso > hg > themwi-system-sw
comparison mgw/dlcx.c @ 32:b3f74df7b808
beginning of themwi-mgw
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sat, 09 Jul 2022 22:51:44 -0800 |
| parents | |
| children | 020ba624bdd8 |
comparison
equal
deleted
inserted
replaced
| 31:08d7794cdd0a | 32:b3f74df7b808 |
|---|---|
| 1 /* | |
| 2 * In this module we implement our DLCX operation. | |
| 3 */ | |
| 4 | |
| 5 #include <sys/types.h> | |
| 6 #include <sys/socket.h> | |
| 7 #include <netinet/in.h> | |
| 8 #include <stdio.h> | |
| 9 #include <stdlib.h> | |
| 10 #include <string.h> | |
| 11 #include <strings.h> | |
| 12 #include <syslog.h> | |
| 13 #include <unistd.h> | |
| 14 #include "../include/tmgw_ctrl.h" | |
| 15 #include "../include/tmgw_const.h" | |
| 16 #include "struct.h" | |
| 17 #include "select.h" | |
| 18 | |
| 19 extern struct endpoint *find_ep_by_id(); | |
| 20 | |
| 21 static struct endpoint *delq; | |
| 22 | |
| 23 static void | |
| 24 put_on_delq(ep) | |
| 25 struct endpoint *ep; | |
| 26 { | |
| 27 ep->next = delq; | |
| 28 delq = ep; | |
| 29 } | |
| 30 | |
| 31 void | |
| 32 process_dlcx(conn, req, resp) | |
| 33 struct ctrl_conn *conn; | |
| 34 struct tmgw_ctrl_req *req; | |
| 35 struct tmgw_ctrl_resp *resp; | |
| 36 { | |
| 37 struct endpoint *ep, **epp; | |
| 38 | |
| 39 for (epp = &conn->endp_list; ep = *epp; epp = &ep->next) | |
| 40 if (ep->ep_id == req->ep_id) | |
| 41 break; | |
| 42 if (!ep) { | |
| 43 resp->res = TMGW_RESP_ERR_PROT; | |
| 44 return; | |
| 45 } | |
| 46 syslog(LOG_INFO, "DLCX endpoint id %u", ep->ep_id); | |
| 47 *epp = ep->next; | |
| 48 put_on_delq(ep); | |
| 49 resp->res = TMGW_RESP_OK; | |
| 50 } | |
| 51 | |
| 52 void | |
| 53 dlcx_all_on_conn(conn) | |
| 54 struct ctrl_conn *conn; | |
| 55 { | |
| 56 struct endpoint *ep, *np; | |
| 57 | |
| 58 for (ep = conn->endp_list; ep; ep = np) { | |
| 59 np = ep->next; | |
| 60 put_on_delq(ep); | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 void | |
| 65 free_rtp_end(roe) | |
| 66 struct rtp_one_end *roe; | |
| 67 { | |
| 68 close(roe->rtp_fd); | |
| 69 close(roe->rtcp_fd); | |
| 70 FD_CLR(roe->rtp_fd, &select_for_read); | |
| 71 FD_CLR(roe->rtcp_fd, &select_for_read); | |
| 72 } | |
| 73 | |
| 74 void | |
| 75 free_deleted_endpoints() | |
| 76 { | |
| 77 struct endpoint *ep, *np; | |
| 78 | |
| 79 for (ep = delq; ep; ep = np) { | |
| 80 np = ep->next; | |
| 81 if (ep->ep_type & TMGW_EP_HAS_GSM_SOCK) | |
| 82 free_rtp_end(&ep->rtp_gsm); | |
| 83 if (ep->ep_type & TMGW_EP_HAS_PSTN_SOCK) | |
| 84 free_rtp_end(&ep->rtp_pstn); | |
| 85 free(ep); | |
| 86 } | |
| 87 delq = 0; | |
| 88 } |
