annotate sip-in/mncc_sock.c @ 124:7e04d28fae8b

sip-in: default use-100rel to no BulkVS servers act badly when we send a reliable 180 Ringing response to an incoming call, even though they advertise 100rel support in the Supported header in the INVITE packet, and we probably won't be implementing 100rel for outbound because doing per-the-spec PRACK as a UAC is just too burdensome. Therefore, we need to consider 100rel extension as not-really-supported in themwi-system-sw.
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 01 Oct 2022 15:54:50 -0800
parents 245dc4837b56
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
2 * In this module we implement our connection to the MNCC daemon's
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
3 * mtcall socket.
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 */
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <sys/types.h>
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <sys/socket.h>
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <sys/un.h>
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <stdio.h>
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdint.h>
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include <stdlib.h>
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include <syslog.h>
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include "../include/mncc.h"
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
15 static char mtcall_socket_pathname[] = "/var/gsm/mtcall_socket";
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
17 int gsm_socket, gsm_is_connected;
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
19 connect_gsm_mtcall()
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 {
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 struct sockaddr_un sa;
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 unsigned sa_len;
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 int rc;
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
25 if (gsm_is_connected)
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
26 return(0);
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
27 gsm_socket = socket(AF_UNIX, SOCK_SEQPACKET, 0);
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
28 if (gsm_socket < 0) {
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 syslog(LOG_CRIT, "socket(AF_UNIX, SOCK_SEQPACKET, 0): %m");
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 return(-1);
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 }
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
32 fill_sockaddr_un(mtcall_socket_pathname, &sa, &sa_len);
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
33 rc = connect(gsm_socket, (struct sockaddr *) &sa, sa_len);
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 if (rc < 0) {
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
35 syslog(LOG_ERR, "connect to %s: %m", mtcall_socket_pathname);
57
d61d0136f6a5 sip-in INVITE processing: return "GSM service is offline" indication
Mychaela Falconia <falcon@freecalypso.org>
parents: 56
diff changeset
36 close(gsm_socket);
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 return(-1);
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 }
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
39 update_max_fd(gsm_socket);
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
40 gsm_is_connected = 1;
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 return(0);
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 }
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 void
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
45 gsm_socket_select()
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 {
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 union mncc_msg msg;
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 int rc;
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
50 rc = recv(gsm_socket, &msg, sizeof msg, 0);
105
9213ec8b434b sip-in: handle themwi-mncc shutdown without terminating
Mychaela Falconia <falcon@freecalypso.org>
parents: 63
diff changeset
51 if (rc <= 0) {
9213ec8b434b sip-in: handle themwi-mncc shutdown without terminating
Mychaela Falconia <falcon@freecalypso.org>
parents: 63
diff changeset
52 syslog(LOG_ERR, "mtcall socket disconnected");
106
245dc4837b56 sip-in: fix bugs in last commit
Mychaela Falconia <falcon@freecalypso.org>
parents: 105
diff changeset
53 close(gsm_socket);
245dc4837b56 sip-in: fix bugs in last commit
Mychaela Falconia <falcon@freecalypso.org>
parents: 105
diff changeset
54 gsm_is_connected = 0;
105
9213ec8b434b sip-in: handle themwi-mncc shutdown without terminating
Mychaela Falconia <falcon@freecalypso.org>
parents: 63
diff changeset
55 shutdown_gsm_conn();
106
245dc4837b56 sip-in: fix bugs in last commit
Mychaela Falconia <falcon@freecalypso.org>
parents: 105
diff changeset
56 return;
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 }
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 if (rc < 4) {
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
59 syslog(LOG_CRIT, "short read from mtcall socket: %d bytes", rc);
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 exit(1);
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 }
63
e5aee661e3b2 sip-in: beginning to handle incoming MNCC messages from themwi-mncc
Mychaela Falconia <falcon@freecalypso.org>
parents: 57
diff changeset
62 msg_from_mncc(&msg, rc);
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 }
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 send_mncc_to_gsm(msg, msglen)
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 union mncc_msg *msg;
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 unsigned msglen;
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 {
56
7005d5c535e8 sip-in: mtcall socket connection implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 15
diff changeset
69 return send(gsm_socket, msg, msglen, 0);
15
ccc5ab6d8388 first version of themwi-mncc for ThemWi2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 }