comparison mtctest/sig_handler.c @ 139:c731ec342ba0

mtctest: rework MNCC_RTP_CONNECT sending for hold/retrieve and CW
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 07 Oct 2022 23:25:38 -0800
parents 0967f67c6ac3
children c8e9b295e88f
comparison
equal deleted inserted replaced
138:0967f67c6ac3 139:c731ec342ba0
165 ack.callref = 1; 165 ack.callref = 1;
166 send_mncc_to_gsm(&ack, sizeof(struct gsm_mncc)); 166 send_mncc_to_gsm(&ack, sizeof(struct gsm_mncc));
167 } 167 }
168 168
169 static void 169 static void
170 send_rtp_connect()
171 {
172 struct gsm_mncc_rtp rtp;
173
174 printf("Sending MNCC_RTP_CONNECT\n");
175 bzero(&rtp, sizeof(struct gsm_mncc_rtp));
176 rtp.msg_type = MNCC_RTP_CONNECT;
177 rtp.callref = 1;
178 bcopy(&dummy_rtp_endp, &rtp.addr, sizeof(struct sockaddr_storage));
179 send_mncc_to_gsm(&rtp, sizeof(struct gsm_mncc_rtp));
180 }
181
182 static void
170 handle_signaling_msg(msg, msglen) 183 handle_signaling_msg(msg, msglen)
171 struct gsm_mncc *msg; 184 struct gsm_mncc *msg;
172 unsigned msglen; 185 unsigned msglen;
173 { 186 {
174 if (msglen != sizeof(struct gsm_mncc)) { 187 if (msglen != sizeof(struct gsm_mncc)) {
185 } 198 }
186 switch (msg->msg_type) { 199 switch (msg->msg_type) {
187 case MNCC_SETUP_CNF: 200 case MNCC_SETUP_CNF:
188 printf("MNCC_SETUP_CNF: call is answered\n"); 201 printf("MNCC_SETUP_CNF: call is answered\n");
189 print_fields(msg); 202 print_fields(msg);
203 send_rtp_connect();
190 send_connect_ack(); 204 send_connect_ack();
191 return; 205 return;
192 case MNCC_CALL_CONF_IND: 206 case MNCC_CALL_CONF_IND:
193 printf("MNCC_CALL_CONF_IND: call is confirmed\n"); 207 printf("MNCC_CALL_CONF_IND: call is confirmed\n");
194 print_fields(msg); 208 print_fields(msg);
246 msg->msg_type = MNCC_HOLD_CNF; 260 msg->msg_type = MNCC_HOLD_CNF;
247 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc)); 261 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc));
248 return; 262 return;
249 case MNCC_RETRIEVE_IND: 263 case MNCC_RETRIEVE_IND:
250 printf("MNCC_RETRIEVE_IND: MS requests call retrieve\n"); 264 printf("MNCC_RETRIEVE_IND: MS requests call retrieve\n");
265 send_rtp_connect();
251 msg->msg_type = MNCC_RETRIEVE_CNF; 266 msg->msg_type = MNCC_RETRIEVE_CNF;
252 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc)); 267 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc));
253 return; 268 return;
254 case MNCC_USERINFO_IND: 269 case MNCC_USERINFO_IND:
255 printf("MNCC_USERINFO_IND: user-user info\n"); 270 printf("MNCC_USERINFO_IND: user-user info\n");
269 exit(0); 284 exit(0);
270 } 285 }
271 } 286 }
272 287
273 static void 288 static void
274 handle_rtp_create(msg, msglen) 289 handle_rtp_msg(msg, msglen)
275 struct gsm_mncc_rtp *msg; 290 struct gsm_mncc_rtp *msg;
276 unsigned msglen; 291 unsigned msglen;
277 { 292 {
278 if (msglen != sizeof(struct gsm_mncc_rtp)) { 293 if (msglen != sizeof(struct gsm_mncc_rtp)) {
279 fprintf(stderr, 294 fprintf(stderr,
285 fprintf(stderr, 300 fprintf(stderr,
286 "error: Rx MNCC message type 0x%x has unexpected callref 0x%x\n", 301 "error: Rx MNCC message type 0x%x has unexpected callref 0x%x\n",
287 msg->msg_type, msg->callref); 302 msg->msg_type, msg->callref);
288 exit(1); 303 exit(1);
289 } 304 }
290 printf("MNCC_RTP_CREATE: RTP info from MSC\n"); 305 switch (msg->msg_type) {
291 printf("payload_type=0x%x payload_msg_type=0x%x\n", msg->payload_type, 306 case MNCC_RTP_CREATE:
292 msg->payload_msg_type); 307 printf("MNCC_RTP_CREATE: RTP info from MSC\n");
293 printf("Responding with MNCC_RTP_CONNECT (dummy RTP endpoint)\n"); 308 printf("payload_type=0x%x payload_msg_type=0x%x\n",
294 msg->msg_type = MNCC_RTP_CONNECT; 309 msg->payload_type, msg->payload_msg_type);
295 bcopy(&dummy_rtp_endp, &msg->addr, sizeof(struct sockaddr_storage)); 310 return;
296 send_mncc_to_gsm(msg, sizeof(struct gsm_mncc_rtp)); 311 case MNCC_RTP_CONNECT:
312 printf("MNCC_RTP_CONNECT: error response\n");
313 return;
314 case MNCC_RTP_FREE:
315 printf("MNCC_RTP_FREE: bogon\n");
316 return;
317 }
297 } 318 }
298 319
299 void 320 void
300 msg_from_mncc(msg, msglen) 321 msg_from_mncc(msg, msglen)
301 union mncc_msg *msg; 322 union mncc_msg *msg;
318 case MNCC_REL_CNF: 339 case MNCC_REL_CNF:
319 case MNCC_REJ_IND: 340 case MNCC_REJ_IND:
320 handle_signaling_msg(msg, msglen); 341 handle_signaling_msg(msg, msglen);
321 return; 342 return;
322 case MNCC_RTP_CREATE: 343 case MNCC_RTP_CREATE:
323 handle_rtp_create(msg, msglen); 344 case MNCC_RTP_CONNECT:
345 case MNCC_RTP_FREE:
346 handle_rtp_msg(msg, msglen);
324 return; 347 return;
325 default: 348 default:
326 fprintf(stderr, 349 fprintf(stderr,
327 "error: received unexpected MNCC message type 0x%x\n", 350 "error: received unexpected MNCC message type 0x%x\n",
328 msg->msg_type); 351 msg->msg_type);