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 }