FreeCalypso > hg > themwi-system-sw
annotate mgw/crcx.c @ 156:0bacca1f2f7b
sip-out: handle all INVITE responses, except errors
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Wed, 12 Oct 2022 07:13:55 -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 CRCX 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> | 
| 
127
 
f062c32a5116
mgw: implement DTMF
 
Mychaela Falconia <falcon@freecalypso.org> 
parents: 
99 
diff
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 <arpa/inet.h> | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
10 #include <stdio.h> | 
| 
38
 
020ba624bdd8
mgw source: #include <stdlib.h> in files using tmgw_ctrl.h
 
Mychaela Falconia <falcon@freecalypso.org> 
parents: 
34 
diff
changeset
 | 
11 #include <stdint.h> | 
| 
32
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
12 #include <stdlib.h> | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
13 #include <string.h> | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
14 #include <strings.h> | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
15 #include <syslog.h> | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
16 #include <unistd.h> | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
17 #include "../include/tmgw_ctrl.h" | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
18 #include "../include/tmgw_const.h" | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
19 #include "struct.h" | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
20 #include "select.h" | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
21 | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
22 extern struct endpoint *find_ep_by_id(); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
23 extern void udp_sink_rcvr(); | 
| 
 
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 extern struct bind_range_cfg bind_range_gsm, bind_range_pstn; | 
| 
 
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 static unsigned | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
28 get_new_ep_id(conn) | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
29 struct ctrl_conn *conn; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
30 { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
31 unsigned id; | 
| 
 
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 for (;;) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
34 id = conn->next_ep_id++; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
35 if (!find_ep_by_id(conn, id)) | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
36 return id; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
37 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
38 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
39 | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
40 static int | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
41 get_local_port_pair(ep, roe, brc) | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
42 struct endpoint *ep; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
43 struct rtp_one_end *roe; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
44 struct bind_range_cfg *brc; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
45 { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
46 struct sockaddr_in sin; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
47 unsigned tries, rtp_port; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
48 int rc; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
49 | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
50 sin.sin_family = AF_INET; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
51 sin.sin_addr = brc->bind_ip; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
52 for (tries = brc->port_tries; tries; tries--) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
53 rtp_port = brc->port_next; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
54 brc->port_next += 2; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
55 if (brc->port_next >= brc->port_range_end) | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
56 brc->port_next = brc->port_range_start; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
57 sin.sin_port = htons(rtp_port); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
58 roe->rtp_fd = socket(AF_INET, SOCK_DGRAM, 0); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
59 if (roe->rtp_fd < 0) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
60 syslog(LOG_CRIT, "socket(AF_INET, SOCK_DGRAM, 0): %m"); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
61 return(-1); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
62 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
63 rc = bind(roe->rtp_fd, (struct sockaddr *) &sin, sizeof sin); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
64 if (rc < 0) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
65 close(roe->rtp_fd); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
66 continue; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
67 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
68 bcopy(&sin, &roe->bound_addr, sizeof(struct sockaddr_in)); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
69 sin.sin_port = htons(rtp_port+1); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
70 roe->rtcp_fd = socket(AF_INET, SOCK_DGRAM, 0); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
71 if (roe->rtcp_fd < 0) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
72 syslog(LOG_CRIT, "socket(AF_INET, SOCK_DGRAM, 0): %m"); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
73 close(roe->rtp_fd); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
74 return(-1); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
75 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
76 rc = bind(roe->rtcp_fd, (struct sockaddr *) &sin, sizeof sin); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
77 if (rc < 0) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
78 close(roe->rtp_fd); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
79 close(roe->rtcp_fd); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
80 continue; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
81 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
82 /* all good - make the file descriptors live for select */ | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
83 update_max_fd(roe->rtp_fd); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
84 FD_SET(roe->rtp_fd, &select_for_read); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
85 select_handlers[roe->rtp_fd] = udp_sink_rcvr; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
86 select_data[roe->rtp_fd] = (void *) ep; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
87 update_max_fd(roe->rtcp_fd); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
88 FD_SET(roe->rtcp_fd, &select_for_read); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
89 select_handlers[roe->rtcp_fd] = udp_sink_rcvr; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
90 select_data[roe->rtcp_fd] = (void *) ep; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
91 return(0); | 
| 
 
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 /* couldn't find a free port pair */ | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
94 return(-1); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
95 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
96 | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
97 void | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
98 process_crcx(conn, req, resp) | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
99 struct ctrl_conn *conn; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
100 struct tmgw_ctrl_req *req; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
101 struct tmgw_ctrl_resp *resp; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
102 { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
103 struct endpoint *ep; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
104 int rc; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
105 | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
106 /* ep_id in request encodes ep_type */ | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
107 switch (req->ep_id) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
108 case TMGW_EP_TYPE_DUMMY_GSM: | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
109 case TMGW_EP_TYPE_DUMMY_PSTN: | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
110 case TMGW_EP_TYPE_GATEWAY: | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
111 break; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
112 default: | 
| 
34
 
7dae2bae56a1
themwi-mgw: implement MDCX parameter validation
 
Mychaela Falconia <falcon@freecalypso.org> 
parents: 
32 
diff
changeset
 | 
113 resp->res = TMGW_RESP_ERR_PARAM; | 
| 
32
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
114 return; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
115 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
116 ep = malloc(sizeof(struct endpoint)); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
117 if (!ep) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
118 syslog(LOG_CRIT, "malloc for endpoint: %m"); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
119 resp->res = TMGW_RESP_ERR_RSRC; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
120 return; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
121 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
122 bzero(ep, sizeof(struct endpoint)); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
123 ep->ep_type = req->ep_id; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
124 ep->ep_id = get_new_ep_id(conn); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
125 if (ep->ep_type & TMGW_EP_HAS_GSM_SOCK) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
126 rc = get_local_port_pair(ep, &ep->rtp_gsm, &bind_range_gsm); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
127 if (rc < 0) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
128 syslog(LOG_ERR, | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
129 "unable to get local port pair on GSM side"); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
130 free(ep); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
131 resp->res = TMGW_RESP_ERR_RSRC; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
132 return; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
133 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
134 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
135 if (ep->ep_type & TMGW_EP_HAS_PSTN_SOCK) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
136 rc = get_local_port_pair(ep, &ep->rtp_pstn, &bind_range_pstn); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
137 if (rc < 0) { | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
138 syslog(LOG_ERR, | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
139 "unable to get local port pair on PSTN side"); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
140 if (ep->ep_type & TMGW_EP_HAS_GSM_SOCK) | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
141 free_rtp_end(&ep->rtp_gsm); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
142 free(ep); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
143 resp->res = TMGW_RESP_ERR_RSRC; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
144 return; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
145 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
146 } | 
| 
99
 
738be11ac432
mgw internal code: simplify MDCX error handling
 
Mychaela Falconia <falcon@freecalypso.org> 
parents: 
38 
diff
changeset
 | 
147 rc = mdcx_operation(ep, req); | 
| 
 
738be11ac432
mgw internal code: simplify MDCX error handling
 
Mychaela Falconia <falcon@freecalypso.org> 
parents: 
38 
diff
changeset
 | 
148 if (rc != TMGW_RESP_OK) { | 
| 
32
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
149 if (ep->ep_type & TMGW_EP_HAS_GSM_SOCK) | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
150 free_rtp_end(&ep->rtp_gsm); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
151 if (ep->ep_type & TMGW_EP_HAS_PSTN_SOCK) | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
152 free_rtp_end(&ep->rtp_pstn); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
153 free(ep); | 
| 
99
 
738be11ac432
mgw internal code: simplify MDCX error handling
 
Mychaela Falconia <falcon@freecalypso.org> 
parents: 
38 
diff
changeset
 | 
154 resp->res = rc; | 
| 
32
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
155 return; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
156 } | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
157 /* all good - accept the new endpoint and return OK */ | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
158 ep->next = conn->endp_list; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
159 conn->endp_list = ep; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
160 resp->res = TMGW_RESP_OK; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
161 resp->ep_id = ep->ep_id; | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
162 bcopy(&ep->rtp_gsm.bound_addr, &resp->gsm_addr, | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
163 sizeof(struct sockaddr_in)); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
164 bcopy(&ep->rtp_pstn.bound_addr, &resp->pstn_addr, | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
165 sizeof(struct sockaddr_in)); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
166 syslog(LOG_INFO, "CRCX endpoint type %u id %u", ep->ep_type, ep->ep_id); | 
| 
 
b3f74df7b808
beginning of themwi-mgw
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
167 } | 
