FreeCalypso > hg > themwi-system-sw
annotate sip-out/disconnect.c @ 235:bd493b21f215
libnumdb2: port check_nanp.c
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Mon, 14 Aug 2023 13:57:10 -0800 | 
| parents | e54b0a9e322f | 
| children | 
| 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> | 
| 109 
9b87894704eb
sip-in: first step toward final call clearing
 Mychaela Falconia <falcon@freecalypso.org> parents: 
108diff
changeset | 7 #include <sys/time.h> | 
| 64 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include <netinet/in.h> | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 #include <stdio.h> | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 #include <stdint.h> | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 #include <stdlib.h> | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 #include <string.h> | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 #include <strings.h> | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 #include <syslog.h> | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 #include "../include/mncc.h" | 
| 83 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 16 #include "../include/gsm48_const.h" | 
| 154 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 17 #include "../include/out_routes.h" | 
| 64 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 #include "call.h" | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 | 
| 154 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 20 extern unsigned sip_linger_timeout; | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 21 | 
| 64 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 void | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 disconnect_mncc(call, cause_loc, cause_val) | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 struct call *call; | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 { | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 struct gsm_mncc msg; | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 | 
| 154 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 28 if (!call->mncc) | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 29 return; | 
| 64 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 switch (call->mncc_state) { | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 case MNCC_STATE_DISCONNECT: | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 case MNCC_STATE_RELEASE: | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 return; | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 } | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 bzero(&msg, sizeof(struct gsm_mncc)); | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 msg.msg_type = MNCC_DISC_REQ; | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 msg.callref = call->mncc_callref; | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 mncc_set_cause(&msg, cause_loc, cause_val); | 
| 154 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 39 send_mncc_to_sock(call->mncc, &msg, sizeof(struct gsm_mncc)); | 
| 64 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 call->mncc_state = MNCC_STATE_DISCONNECT; | 
| 
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 | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 void | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 disconnect_tmgw(call) | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 struct call *call; | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 { | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 switch (call->mgw_state) { | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 case MGW_STATE_NO_EXIST: | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 case MGW_STATE_DELETING: | 
| 154 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 50 case MGW_STATE_MDCX_IBT: | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 51 case MGW_STATE_MDCX_CONN: | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 52 case MGW_STATE_MDCX_HOLD: | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 53 case MGW_STATE_MDCX_RETR: | 
| 128 
5685412bd6aa
sip-in: pass DTMF start & stop to themwi-mgw
 Mychaela Falconia <falcon@freecalypso.org> parents: 
109diff
changeset | 54 case MGW_STATE_DTMF_OP: | 
| 64 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 return; | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 case MGW_STATE_ALLOCATED: | 
| 154 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 57 case MGW_STATE_IBT_CONN: | 
| 64 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 case MGW_STATE_COMPLETE: | 
| 141 
e499e8db8b82
sip-in: handle call hold and retrieve
 Mychaela Falconia <falcon@freecalypso.org> parents: 
128diff
changeset | 59 case MGW_STATE_HELD: | 
| 64 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 tmgw_send_dlcx(call); | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 return; | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 default: | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 syslog(LOG_CRIT, | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 "FATAL: invalid MGW state 0x%x in disconnect_tmgw()", | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 call->mgw_state); | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 exit(1); | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 } | 
| 
1f863c63f96b
sip-in: beginning of disconnect handling
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 } | 
| 83 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 69 | 
| 154 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 70 void | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 71 disconnect_sip(call) | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 72 struct call *call; | 
| 83 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 73 { | 
| 154 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 74 if (!call->sip_call_exists) | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 75 return; | 
| 83 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 76 switch (call->sip_state) { | 
| 154 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 77 case SIP_STATE_INV_SENT: | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 78 call->sip_state = SIP_STATE_ACCEPT_100; | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 79 sip_mark_end_time(call, sip_linger_timeout); | 
| 83 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 80 break; | 
| 154 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 81 case SIP_STATE_100_RCVD: | 
| 
e54b0a9e322f
beginning of themwi-sip-out
 Mychaela Falconia <falcon@freecalypso.org> parents: 
141diff
changeset | 82 initiate_sip_cancel(call); | 
| 83 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 83 break; | 
| 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 84 case SIP_STATE_CONNECTED: | 
| 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 85 initiate_bye(call); | 
| 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 86 break; | 
| 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 87 } | 
| 
3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
 Mychaela Falconia <falcon@freecalypso.org> parents: 
66diff
changeset | 88 } | 
