FreeCalypso > hg > themwi-system-sw
comparison mncc/intswitch.c @ 28:660126bd5f59
themwi-mncc: fix one bug, add debug syslog output
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 28 Jun 2022 21:47:04 -0800 |
parents | 52e801b5ebb1 |
children |
comparison
equal
deleted
inserted
replaced
27:c6572f4c31d2 | 28:660126bd5f59 |
---|---|
14 #include "../include/mncc.h" | 14 #include "../include/mncc.h" |
15 #include "../include/gsm48_const.h" | 15 #include "../include/gsm48_const.h" |
16 #include "struct.h" | 16 #include "struct.h" |
17 #include "gsm_call.h" | 17 #include "gsm_call.h" |
18 | 18 |
19 extern char *mncc_msg_name(); | |
20 | |
19 void | 21 void |
20 internal_switch_mo_setup(call, msg) | 22 internal_switch_mo_setup(call, msg) |
21 struct gsm_call *call; | 23 struct gsm_call *call; |
22 struct gsm_mncc *msg; | 24 struct gsm_mncc *msg; |
23 { | 25 { |
24 struct gsm_call *mt; | 26 struct gsm_call *mt; |
25 struct gsm_mncc callproc; | 27 struct gsm_mncc callproc; |
26 | 28 |
27 if (!(msg->fields & MNCC_F_BEARER_CAP)) { | 29 if (!(msg->fields & MNCC_F_BEARER_CAP)) { |
30 syslog(LOG_ERR, "rejecting intsw call 0x%x: no bearer cap", | |
31 msg->callref); | |
28 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, | 32 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, |
29 GSM48_CC_CAUSE_INVAL_MAND_INF); | 33 GSM48_CC_CAUSE_INVAL_MAND_INF); |
30 call->gc_flag = 1; | 34 call->gc_flag = 1; |
31 return; | 35 return; |
32 } | 36 } |
33 /* same speech-only restriction as in OsmoMSC's mncc_builtin */ | 37 /* same speech-only restriction as in OsmoMSC's mncc_builtin */ |
34 if (msg->bearer_cap.transfer != GSM48_BCAP_ITCAP_SPEECH || | 38 if (msg->bearer_cap.transfer != GSM48_BCAP_ITCAP_SPEECH || |
35 msg->bearer_cap.mode != GSM48_BCAP_TMOD_CIRCUIT) { | 39 msg->bearer_cap.mode != GSM48_BCAP_TMOD_CIRCUIT) { |
40 syslog(LOG_ERR, "rejecting intsw call 0x%x: bad bearer cap", | |
41 msg->callref); | |
36 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, | 42 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, |
37 GSM48_CC_CAUSE_BEARER_CA_UNAVAIL); | 43 GSM48_CC_CAUSE_BEARER_CA_UNAVAIL); |
38 call->gc_flag = 1; | 44 call->gc_flag = 1; |
39 return; | 45 return; |
40 } | 46 } |
41 mt = create_new_mt_call(); | 47 mt = create_new_mt_call(); |
42 if (!mt) { | 48 if (!mt) { |
49 syslog(LOG_ERR, | |
50 "rejecting intsw call 0x%x: no memory for MT call", | |
51 msg->callref); | |
43 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, | 52 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, |
44 GSM48_CC_CAUSE_RESOURCE_UNAVAIL); | 53 GSM48_CC_CAUSE_RESOURCE_UNAVAIL); |
45 call->gc_flag = 1; | 54 call->gc_flag = 1; |
46 return; | 55 return; |
47 } | 56 } |
57 syslog(LOG_DEBUG, "intsw: MO=0x%x MT=0x%x", call->callref, mt->callref); | |
48 call->other_leg = mt; | 58 call->other_leg = mt; |
49 mt->other_leg = call; | 59 mt->other_leg = call; |
50 /* send call proceeding */ | 60 /* send call proceeding */ |
51 bzero(&callproc, sizeof(struct gsm_mncc)); | 61 bzero(&callproc, sizeof(struct gsm_mncc)); |
52 callproc.msg_type = MNCC_CALL_PROC_REQ; | 62 callproc.msg_type = MNCC_CALL_PROC_REQ; |
71 bzero(&ack, sizeof(struct gsm_mncc)); | 81 bzero(&ack, sizeof(struct gsm_mncc)); |
72 ack.msg_type = MNCC_SETUP_COMPL_REQ; | 82 ack.msg_type = MNCC_SETUP_COMPL_REQ; |
73 ack.callref = call->callref; | 83 ack.callref = call->callref; |
74 send_mncc_to_gsm(&ack, sizeof(struct gsm_mncc)); | 84 send_mncc_to_gsm(&ack, sizeof(struct gsm_mncc)); |
75 /* do we have the far end? */ | 85 /* do we have the far end? */ |
76 if (!call->other_leg) | 86 if (!call->other_leg) { |
77 return; | 87 syslog(LOG_ERR, "intsw: missing other leg for MNCC_SETUP_CNF"); |
88 return; | |
89 } | |
90 syslog(LOG_DEBUG, "MNCC_SETUP_CNF from 0x%x to 0x%x", call->callref, | |
91 call->other_leg->callref); | |
78 msg->msg_type = MNCC_SETUP_RSP; | 92 msg->msg_type = MNCC_SETUP_RSP; |
79 msg->callref = call->other_leg->callref; | 93 msg->callref = call->other_leg->callref; |
80 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc)); | 94 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc)); |
81 /* bridge TCH */ | 95 /* bridge TCH */ |
82 bzero(&bridge, sizeof(struct gsm_mncc_bridge)); | 96 bzero(&bridge, sizeof(struct gsm_mncc_bridge)); |
91 struct gsm_call *call; | 105 struct gsm_call *call; |
92 struct gsm_mncc *msg; | 106 struct gsm_mncc *msg; |
93 uint32_t new_msg_type; | 107 uint32_t new_msg_type; |
94 { | 108 { |
95 if (!call->other_leg) { | 109 if (!call->other_leg) { |
110 syslog(LOG_ERR, "intsw: missing other leg for msg forwarding"); | |
96 /* drop it like OsmoMSC's mncc_builtin does */ | 111 /* drop it like OsmoMSC's mncc_builtin does */ |
97 return; | 112 return; |
98 } | 113 } |
99 msg->msg_type = new_msg_type; | 114 msg->msg_type = new_msg_type; |
100 msg->callref = call->other_leg->callref; | 115 msg->callref = call->other_leg->callref; |
111 /* release on near end */ | 126 /* release on near end */ |
112 msg->msg_type = MNCC_REL_REQ; | 127 msg->msg_type = MNCC_REL_REQ; |
113 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc)); | 128 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc)); |
114 /* disconnect on far end */ | 129 /* disconnect on far end */ |
115 remote = call->other_leg; | 130 remote = call->other_leg; |
116 if (!remote) | 131 if (!remote) { |
117 return; | 132 syslog(LOG_ERR, "intsw: missing other leg for MNCC_DISC_IND"); |
133 return; | |
134 } | |
135 syslog(LOG_DEBUG, "MNCC_DISC_IND from 0x%x to 0x%x", call->callref, | |
136 remote->callref); | |
118 msg->msg_type = MNCC_DISC_REQ; | 137 msg->msg_type = MNCC_DISC_REQ; |
119 msg->callref = remote->callref; | 138 msg->callref = remote->callref; |
120 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc)); | 139 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc)); |
121 /* sever the end-to-end association */ | 140 /* sever the end-to-end association */ |
122 call->other_leg = 0; | 141 call->other_leg = 0; |
135 /* free the near end */ | 154 /* free the near end */ |
136 call->gc_flag = 1; | 155 call->gc_flag = 1; |
137 /* if no remote, nothing more to do */ | 156 /* if no remote, nothing more to do */ |
138 if (!remote) | 157 if (!remote) |
139 return; | 158 return; |
159 syslog(LOG_DEBUG, "release with remote: from 0x%x to 0x%x", | |
160 call->callref, remote->callref); | |
140 /* send them a release request */ | 161 /* send them a release request */ |
141 msg->msg_type = MNCC_REL_REQ; | 162 msg->msg_type = MNCC_REL_REQ; |
142 msg->callref = remote->callref; | 163 msg->callref = remote->callref; |
143 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc)); | 164 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc)); |
144 /* sever the end-to-end association */ | 165 /* sever the end-to-end association */ |
204 return; | 225 return; |
205 case MNCC_REL_CNF: | 226 case MNCC_REL_CNF: |
206 call->gc_flag = 1; | 227 call->gc_flag = 1; |
207 return; | 228 return; |
208 default: | 229 default: |
209 syslog(LOG_ERR, | 230 syslog(LOG_ERR, "%s unhandled for internal switch", |
210 "MNCC message type 0x%x unhandled for internal switch", | 231 mncc_msg_name(msg->msg_type)); |
211 msg->msg_type); | 232 } |
212 } | 233 } |
213 } |