FreeCalypso > hg > themwi-system-sw
annotate mncc/outcall.c @ 274:de440a88c23a
doc/NANP-specifics: Fake-NANP-numbers article is here
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 27 Nov 2023 21:46:30 -0800 |
parents | 2ebad02adbe5 |
children |
rev | line source |
---|---|
167
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * In this module we handle routing of outbound MO calls |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * to the outcall socket provided by themwi-sip-out. |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 */ |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <sys/types.h> |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <sys/socket.h> |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <sys/un.h> |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <stdio.h> |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <stdint.h> |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <stdlib.h> |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include <string.h> |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include <strings.h> |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include <syslog.h> |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include <unistd.h> |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 #include "../include/mncc.h" |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 #include "../include/gsm48_const.h" |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 #include "struct.h" |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 extern struct socket_conn outcall_conn; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 static char outcall_socket_pathname[] = "/var/gsm/outcall_socket"; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 connect_outcall_socket() |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 { |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 struct sockaddr_un sa; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 unsigned sa_len; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 int fd, rc; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 if (outcall_conn.fd >= 0) |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 return(0); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 fd = socket(AF_UNIX, SOCK_SEQPACKET, 0); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 if (fd < 0) { |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 syslog(LOG_CRIT, "socket(AF_UNIX, SOCK_SEQPACKET, 0): %m"); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 return(-1); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 } |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 fill_sockaddr_un(outcall_socket_pathname, &sa, &sa_len); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 rc = connect(fd, (struct sockaddr *) &sa, sa_len); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 if (rc < 0) { |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 syslog(LOG_ERR, "connect to %s: %m", outcall_socket_pathname); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 close(fd); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 return(-1); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 } |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 update_max_fd(fd); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 outcall_conn.fd = fd; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 return(0); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 } |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 void |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 outbound_mo_setup(call, msg) |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 struct gsm_call *call; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 struct gsm_mncc *msg; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 { |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 int rc; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 rc = connect_outcall_socket(); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 if (rc < 0) { |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 syslog(LOG_ERR, "rejecting MO call 0x%x: outbound gateway down", |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 msg->callref); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 GSM48_CC_CAUSE_DEST_OOO); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 call->gc_flag = 1; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 return; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 } |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 call->socket = &outcall_conn; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 call->socket_ref = msg->callref; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 outcall_conn.ncalls++; |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 mncc_signal_to_socket(call, msg); |
2ebad02adbe5
themwi-mncc: route outbound calls to themwi-sip-out
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 } |