annotate sip-in/call_clear.c @ 111:7a4d4b8d5f04

sip-in call clearing: unlink and free implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 28 Sep 2022 18:45:16 -0800
parents c1c94b7fc2e2
children bfc97065bf51
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
109
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * In this module we implement final clearing of calls, i.e., freeing
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * of struct call, and all preliminary steps that need to happen
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * toward this ultimate end state.
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 */
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <sys/types.h>
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <sys/socket.h>
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <sys/time.h>
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <netinet/in.h>
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include <stdio.h>
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include <stdint.h>
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include <stdlib.h>
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include <string.h>
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 #include <strings.h>
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 #include <syslog.h>
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 #include "call.h"
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 extern struct call *call_list;
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 extern struct timeval cur_event_time;
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 void
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 sip_mark_end_time(call, linger)
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 struct call *call;
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 unsigned linger;
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 {
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 call->sip_clear_time = cur_event_time.tv_sec + linger;
9b87894704eb sip-in: first step toward final call clearing
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 }
110
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
29
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
30 void
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
31 transition_dead_sip(call)
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
32 struct call *call;
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
33 {
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
34 if (call->overall_state != OVERALL_STATE_TEARDOWN)
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
35 return;
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
36 if (call->sip_state != SIP_STATE_ENDED &&
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
37 call->sip_state != SIP_STATE_MSG_SIZE_ERR)
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
38 return;
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
39 if (call->mncc_state != MNCC_STATE_NO_EXIST)
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
40 return;
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
41 if (call->mgw_state != MGW_STATE_NO_EXIST)
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
42 return;
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
43 if (call->mgw_xact)
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
44 return;
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
45 call->overall_state = OVERALL_STATE_DEAD_SIP;
c1c94b7fc2e2 sip-in call clearing: DEAD_SIP transition implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 109
diff changeset
46 }
111
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
47
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
48 void
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
49 clear_dead_sip_calls()
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
50 {
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
51 struct call *call, **pp;
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
52
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
53 for (pp = &call_list; *pp; ) {
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
54 call = *pp;
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
55 if (call->overall_state == OVERALL_STATE_DEAD_SIP &&
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
56 call->sip_clear_time >= cur_event_time.tv_sec) {
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
57 *pp = call->next;
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
58 free(call);
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
59 continue;
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
60 }
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
61 pp = &call->next;
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
62 }
7a4d4b8d5f04 sip-in call clearing: unlink and free implemented
Mychaela Falconia <falcon@freecalypso.org>
parents: 110
diff changeset
63 }