FreeCalypso > hg > sipout-test-utils
comparison librtpalloc/rtp_alloc_simple.c @ 0:35c0d9f03c0a
beginning with sipout-test-voice,
a copy of sip-manual-out from themwi-system-sw
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sun, 03 Mar 2024 23:20:19 -0800 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:35c0d9f03c0a |
|---|---|
| 1 /* | |
| 2 * The library function implemented in this C module provides a | |
| 3 * simple interface for obtaining a single RTP endpoint from | |
| 4 * themwi-rtp-mgr. | |
| 5 */ | |
| 6 | |
| 7 #include <sys/types.h> | |
| 8 #include <sys/socket.h> | |
| 9 #include <sys/un.h> | |
| 10 #include <stdio.h> | |
| 11 #include <stdint.h> | |
| 12 #include <stdlib.h> | |
| 13 #include <string.h> | |
| 14 #include <strings.h> | |
| 15 #include "../include/tmgw_const.h" | |
| 16 #include "../include/rtp_alloc.h" | |
| 17 #include "rtpmgr_resp.h" | |
| 18 #include "rtp_alloc_simple.h" | |
| 19 | |
| 20 static char ctrl_socket_pathname[] = "/var/gsm/rtp_alloc_socket"; | |
| 21 | |
| 22 static void | |
| 23 close_fds(resp) | |
| 24 struct rtp_alloc_resp_wrap *resp; | |
| 25 { | |
| 26 unsigned n; | |
| 27 | |
| 28 for (n = 0; n < resp->num_fd; n++) | |
| 29 close(resp->fd_buf[n]); | |
| 30 } | |
| 31 | |
| 32 rtp_alloc_simple(ep_type, out) | |
| 33 int ep_type; | |
| 34 struct rtp_alloc_simple *out; | |
| 35 { | |
| 36 struct sockaddr_un sa; | |
| 37 unsigned sa_len; | |
| 38 int ctrl_fd, rc; | |
| 39 struct rtp_alloc_req req; | |
| 40 struct rtp_alloc_resp_wrap resp; | |
| 41 unsigned expect_num_fd; | |
| 42 | |
| 43 switch (ep_type) { | |
| 44 case TMGW_EP_TYPE_GSM_ONLY: | |
| 45 case TMGW_EP_TYPE_PSTN_ONLY: | |
| 46 expect_num_fd = 2; | |
| 47 break; | |
| 48 case TMGW_EP_TYPE_GATEWAY: | |
| 49 expect_num_fd = 4; | |
| 50 break; | |
| 51 default: | |
| 52 fprintf(stderr, | |
| 53 "rtp_alloc_simple() error: unknown EP type %d\n", | |
| 54 ep_type); | |
| 55 return(-1); | |
| 56 } | |
| 57 ctrl_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0); | |
| 58 if (ctrl_fd < 0) { | |
| 59 perror("socket(AF_UNIX, SOCK_SEQPACKET, 0)"); | |
| 60 return(-1); | |
| 61 } | |
| 62 fill_sockaddr_un(ctrl_socket_pathname, &sa, &sa_len); | |
| 63 rc = connect(ctrl_fd, (struct sockaddr *) &sa, sa_len); | |
| 64 if (rc < 0) { | |
| 65 perror(ctrl_socket_pathname); | |
| 66 close(ctrl_fd); | |
| 67 return(-1); | |
| 68 } | |
| 69 bzero(&req, sizeof req); | |
| 70 req.ep_type = ep_type; | |
| 71 rc = send(ctrl_fd, &req, sizeof req, 0); | |
| 72 if (rc < 0) { | |
| 73 perror("send to RTP allocator socket"); | |
| 74 close(ctrl_fd); | |
| 75 return(-1); | |
| 76 } | |
| 77 rc = collect_rtpmgr_resp(ctrl_fd, 0, &resp); | |
| 78 if (rc < 0) { | |
| 79 perror("recvmsg from RTP allocator socket"); | |
| 80 close(ctrl_fd); | |
| 81 return(-1); | |
| 82 } | |
| 83 close(ctrl_fd); | |
| 84 if (resp.resp_len != sizeof(struct rtp_alloc_resp)) { | |
| 85 fprintf(stderr, | |
| 86 "error: response packet from themwi-rtp-mgr has wrong length (%u bytes)\n", | |
| 87 resp.resp_len); | |
| 88 close_fds(&resp); | |
| 89 return(-1); | |
| 90 } | |
| 91 if (resp.resp.res != RTP_ALLOC_OK) { | |
| 92 fprintf(stderr, "themwi-rtp-mgr returned error %u\n", | |
| 93 resp.resp.res); | |
| 94 close_fds(&resp); | |
| 95 return(-1); | |
| 96 } | |
| 97 if (resp.num_fd != expect_num_fd) { | |
| 98 fprintf(stderr, | |
| 99 "error: themwi-rtp-mgr returned %u descriptors instead of expected %u\n", | |
| 100 resp.num_fd, expect_num_fd); | |
| 101 close_fds(&resp); | |
| 102 return(-1); | |
| 103 } | |
| 104 switch (ep_type) { | |
| 105 case TMGW_EP_TYPE_GSM_ONLY: | |
| 106 out->gsm_rtp_fd = resp.fd_buf[0]; | |
| 107 out->gsm_rtcp_fd = resp.fd_buf[1]; | |
| 108 break; | |
| 109 case TMGW_EP_TYPE_PSTN_ONLY: | |
| 110 out->pstn_rtp_fd = resp.fd_buf[0]; | |
| 111 out->pstn_rtcp_fd = resp.fd_buf[1]; | |
| 112 break; | |
| 113 case TMGW_EP_TYPE_GATEWAY: | |
| 114 out->gsm_rtp_fd = resp.fd_buf[0]; | |
| 115 out->gsm_rtcp_fd = resp.fd_buf[1]; | |
| 116 out->pstn_rtp_fd = resp.fd_buf[2]; | |
| 117 out->pstn_rtcp_fd = resp.fd_buf[3]; | |
| 118 } | |
| 119 bcopy(&resp.resp.gsm_addr, &out->gsm_addr, | |
| 120 sizeof(struct sockaddr_storage)); | |
| 121 bcopy(&resp.resp.pstn_addr, &out->pstn_addr, | |
| 122 sizeof(struct sockaddr_storage)); | |
| 123 return(0); | |
| 124 } |
