FreeCalypso > hg > themwi-system-sw
annotate sip-in/disconnect.c @ 91:fd23e2747b45
sip-in: add sip-udp-retrans configuration setting
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Fri, 23 Sep 2022 19:05:08 -0800 |
| parents | 3e3fbf44f9d7 |
| children | 0d6435808bcd |
| rev | line source |
|---|---|
|
64
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * In this module we implement call disconnection and clearing procedures. |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 */ |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 #include <sys/types.h> |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <sys/socket.h> |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <netinet/in.h> |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdio.h> |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <stdint.h> |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <stdlib.h> |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <string.h> |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include <strings.h> |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include <syslog.h> |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include "../include/mncc.h" |
|
83
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
15 #include "../include/gsm48_const.h" |
|
64
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 #include "call.h" |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 void |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 disconnect_mncc(call, cause_loc, cause_val) |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 struct call *call; |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 { |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 struct gsm_mncc msg; |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 switch (call->mncc_state) { |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 case MNCC_STATE_NO_EXIST: |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 case MNCC_STATE_DISCONNECT: |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 case MNCC_STATE_RELEASE: |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 return; |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 } |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 bzero(&msg, sizeof(struct gsm_mncc)); |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 msg.msg_type = MNCC_DISC_REQ; |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 msg.callref = call->mncc_callref; |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 mncc_set_cause(&msg, cause_loc, cause_val); |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 send_mncc_to_gsm(&msg, sizeof(struct gsm_mncc)); |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 call->mncc_state = MNCC_STATE_DISCONNECT; |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 } |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 void |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 disconnect_tmgw(call) |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 struct call *call; |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 { |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 switch (call->mgw_state) { |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 case MGW_STATE_NO_EXIST: |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 case MGW_STATE_CONNECTING: |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 case MGW_STATE_DELETING: |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 return; |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 case MGW_STATE_ALLOCATED: |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 case MGW_STATE_COMPLETE: |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 tmgw_send_dlcx(call); |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 return; |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 default: |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 syslog(LOG_CRIT, |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 "FATAL: invalid MGW state 0x%x in disconnect_tmgw()", |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 call->mgw_state); |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 exit(1); |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 } |
|
1f863c63f96b
sip-in: beginning of disconnect handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 } |
|
83
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
58 |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
59 static char * |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
60 cause_to_invite_err(cause) |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
61 struct gsm_mncc_cause *cause; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
62 { |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
63 switch (cause->value) { |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
64 case GSM48_CC_CAUSE_CALL_REJECTED: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
65 return "403 Call rejected"; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
66 case GSM48_CC_CAUSE_UNASSIGNED_NR: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
67 return "404 Unassigned number"; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
68 case GSM48_CC_CAUSE_USER_NOTRESPOND: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
69 return "480 User not responding"; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
70 case GSM48_CC_CAUSE_RESOURCE_UNAVAIL: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
71 return "503 GSM network resource unavailable"; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
72 case GSM48_CC_CAUSE_TEMP_FAILURE: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
73 return "503 Temporary failure"; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
74 case GSM48_CC_CAUSE_SWITCH_CONG: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
75 return "503 Switch congestion at MSC"; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
76 case GSM48_CC_CAUSE_USER_BUSY: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
77 return "486 User busy"; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
78 case GSM48_CC_CAUSE_DEST_OOO: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
79 return "502 Destination out of order"; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
80 case GSM48_CC_CAUSE_NETWORK_OOO: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
81 return "503 Network out of order"; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
82 default: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
83 return "480 Unavailable (unspecified)"; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
84 } |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
85 } |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
86 |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
87 void |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
88 disconnect_sip(call, cause) |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
89 struct call *call; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
90 struct gsm_mncc_cause *cause; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
91 { |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
92 switch (call->sip_state) { |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
93 case SIP_STATE_INVITE_PROC: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
94 case SIP_STATE_RINGING: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
95 case SIP_STATE_RINGING_PRACK: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
96 strcpy(call->invite_fail, cause_to_invite_err(cause)); |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
97 signal_invite_error(call); |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
98 break; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
99 case SIP_STATE_INVITE_200: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
100 /* have to wait for SIP ACK, then send BYE */ |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
101 break; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
102 case SIP_STATE_CONNECTED: |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
103 initiate_bye(call); |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
104 break; |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
105 } |
|
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
66
diff
changeset
|
106 } |
