diff sip-in/mgw_ops.c @ 151:0ecbc3dc8f93

sip-in: split mgw_resp.c from mgw_ops.c
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 11 Oct 2022 15:58:42 -0800
parents e499e8db8b82
children
line wrap: on
line diff
--- a/sip-in/mgw_ops.c	Tue Oct 11 14:10:29 2022 -0800
+++ b/sip-in/mgw_ops.c	Tue Oct 11 15:58:42 2022 -0800
@@ -13,8 +13,6 @@
 #include <string.h>
 #include <strings.h>
 #include <syslog.h>
-#include "../include/gsm48_const.h"
-#include "../include/mncc.h"
 #include "../include/tmgw_ctrl.h"
 #include "../include/tmgw_const.h"
 #include "call.h"
@@ -171,271 +169,3 @@
 	call->mgw_xact = TMGW_CTRL_OP_DTMF_STOP;
 	call->mgw_xact_id = req.transact_ref;
 }
-
-static void
-handle_crcx_fail(call, msg)
-	struct call *call;
-	struct tmgw_ctrl_resp *msg;
-{
-	call->overall_state = OVERALL_STATE_TEARDOWN;
-	strcpy(call->invite_fail, "503 Gateway resource allocation failure");
-	signal_invite_error(call);
-}
-
-static void
-crcx_response(call, msg)
-	struct call *call;
-	struct tmgw_ctrl_resp *msg;
-{
-	if (msg->res == TMGW_RESP_OK) {
-		call->mgw_state = MGW_STATE_ALLOCATED;
-		call->mgw_ep_id = msg->ep_id;
-		bcopy(&msg->gsm_addr, &call->gsm_rtp_tmgw,
-			sizeof(struct sockaddr_storage));
-		bcopy(&msg->pstn_addr, &call->pstn_rtp_local,
-			sizeof(struct sockaddr_in));
-		switch (call->overall_state) {
-		case OVERALL_STATE_CRCX:
-			proceed_with_call_setup(call);
-			return;
-		case OVERALL_STATE_TEARDOWN:
-			tmgw_send_dlcx(call);
-			return;
-		default:
-		bad_state:
-			syslog(LOG_CRIT,
-			"FATAL: invalid overall state 0x%x on CRCX response",
-				call->overall_state);
-			exit(1);
-		}
-	} else {
-		switch (call->overall_state) {
-		case OVERALL_STATE_CRCX:
-			handle_crcx_fail(call, msg);
-			return;
-		case OVERALL_STATE_TEARDOWN:
-			transition_dead_sip(call);
-			return;
-		default:
-			goto bad_state;
-		}
-	}
-}
-
-static void
-handle_mdcx_connect_fail(call, msg)
-	struct call *call;
-	struct tmgw_ctrl_resp *msg;
-{
-	call->overall_state = OVERALL_STATE_TEARDOWN;
-	switch (msg->res) {
-	case TMGW_RESP_ERR_RSRC:
-		disconnect_mncc(call, GSM48_CAUSE_LOC_PRN_S_LU,
-				GSM48_CC_CAUSE_RESOURCE_UNAVAIL);
-		strcpy(call->invite_fail,
-			"503 Gateway resource allocation failure");
-		break;
-	case TMGW_RESP_ERR_NOTSUP:
-		disconnect_mncc(call, GSM48_CAUSE_LOC_PRN_S_LU,
-				GSM48_CC_CAUSE_BEARER_CA_UNAVAIL);
-		strcpy(call->invite_fail, "502 Gateway internal error");
-		break;
-	default:
-		disconnect_mncc(call, GSM48_CAUSE_LOC_PRN_S_LU,
-				GSM48_CC_CAUSE_PROTO_ERR);
-		strcpy(call->invite_fail, "502 Gateway internal error");
-	}
-	signal_invite_error(call);
-}
-
-static void
-mdcx_connect_response(call, msg)
-	struct call *call;
-	struct tmgw_ctrl_resp *msg;
-{
-	if (msg->res == TMGW_RESP_OK) {
-		call->mgw_state = MGW_STATE_COMPLETE;
-		switch (call->overall_state) {
-		case OVERALL_STATE_ANSWERED:
-			signal_invite_200(call);
-			return;
-		case OVERALL_STATE_TEARDOWN:
-			tmgw_send_dlcx(call);
-			return;
-		default:
-		bad_state:
-			syslog(LOG_CRIT,
-			"FATAL: invalid overall state 0x%x on MDCX response",
-				call->overall_state);
-			exit(1);
-		}
-	} else {
-		tmgw_send_dlcx(call);
-		switch (call->overall_state) {
-		case OVERALL_STATE_ANSWERED:
-			handle_mdcx_connect_fail(call, msg);
-			return;
-		case OVERALL_STATE_TEARDOWN:
-			return;
-		default:
-			goto bad_state;
-		}
-	}
-}
-
-static struct gsm_mncc_cause mgw_hold_retrieve_error = {
-	.coding		= GSM48_CAUSE_CODING_GSM,
-	.location	= GSM48_CAUSE_LOC_PRN_S_LU,
-	.value		= GSM48_CC_CAUSE_NETWORK_OOO,
-};
-
-static void
-mdcx_hold_response(call, msg)
-	struct call *call;
-	struct tmgw_ctrl_resp *msg;
-{
-	if (call->overall_state == OVERALL_STATE_TEARDOWN) {
-		tmgw_send_dlcx(call);
-		return;
-	}
-	if (msg->res == TMGW_RESP_OK) {
-		call->mgw_state = MGW_STATE_HELD;
-		mncc_send_hold_ack(call);
-	} else {
-		call->overall_state = OVERALL_STATE_TEARDOWN;
-		tmgw_send_dlcx(call);
-		disconnect_mncc(call, GSM48_CAUSE_LOC_PRN_S_LU,
-				GSM48_CC_CAUSE_NETWORK_OOO);
-		disconnect_sip(call, &mgw_hold_retrieve_error);
-	}
-}
-
-static void
-mdcx_retrieve_response(call, msg)
-	struct call *call;
-	struct tmgw_ctrl_resp *msg;
-{
-	if (call->overall_state == OVERALL_STATE_TEARDOWN) {
-		tmgw_send_dlcx(call);
-		return;
-	}
-	if (msg->res == TMGW_RESP_OK) {
-		call->mgw_state = MGW_STATE_COMPLETE;
-		mncc_send_retrieve_ack(call);
-	} else {
-		call->overall_state = OVERALL_STATE_TEARDOWN;
-		tmgw_send_dlcx(call);
-		disconnect_mncc(call, GSM48_CAUSE_LOC_PRN_S_LU,
-				GSM48_CC_CAUSE_NETWORK_OOO);
-		disconnect_sip(call, &mgw_hold_retrieve_error);
-	}
-}
-
-static void
-mdcx_response(call, msg)
-	struct call *call;
-	struct tmgw_ctrl_resp *msg;
-{
-	switch (call->mgw_state) {
-	case MGW_STATE_CONNECTING:
-		mdcx_connect_response(call, msg);
-		return;
-	case MGW_STATE_HOLD_OP:
-		mdcx_hold_response(call, msg);
-		return;
-	case MGW_STATE_RETRIEVE_OP:
-		mdcx_retrieve_response(call, msg);
-		return;
-	default:
-		syslog(LOG_CRIT,
-			"FATAL: invalid MGW state 0x%x on MDCX response",
-			call->mgw_state);
-		exit(1);
-	}
-}
-
-static void
-dlcx_response(call, msg)
-	struct call *call;
-	struct tmgw_ctrl_resp *msg;
-{
-	if (msg->res != TMGW_RESP_OK) {
-		syslog(LOG_CRIT, "FATAL: TMGW DLCX failed with code 0x%x",
-			msg->res);
-		exit(1);
-	}
-	call->mgw_state = MGW_STATE_NO_EXIST;
-	transition_dead_sip(call);
-}
-
-static void
-dtmf_start_response(call, msg)
-	struct call *call;
-	struct tmgw_ctrl_resp *msg;
-{
-	if (call->overall_state == OVERALL_STATE_TEARDOWN) {
-		tmgw_send_dlcx(call);
-		return;
-	}
-	if (msg->res == TMGW_RESP_OK)
-		mncc_dtmf_start_ok(call);
-	else
-		mncc_dtmf_start_err(call);
-	if (call->dtmf_pending_stop)
-		tmgw_send_dtmf_stop(call);
-	else
-		call->mgw_state = MGW_STATE_COMPLETE;
-}
-
-static void
-dtmf_stop_response(call, msg)
-	struct call *call;
-	struct tmgw_ctrl_resp *msg;
-{
-	if (call->overall_state == OVERALL_STATE_TEARDOWN) {
-		tmgw_send_dlcx(call);
-		return;
-	}
-	mncc_dtmf_stop_ok(call);
-	call->mgw_state = MGW_STATE_COMPLETE;
-	call->dtmf_pending_stop = 0;
-}
-
-void
-process_tmgw_response(msg)
-	struct tmgw_ctrl_resp *msg;
-{
-	struct call *call;
-	unsigned opc;
-
-	call = find_call_with_mgw_xact(msg->transact_ref);
-	if (!call) {
-		syslog(LOG_CRIT,
-		"FATAL: response from TMGW xact 0x%x does not match any call",
-			msg->transact_ref);
-		exit(1);
-	}
-	opc = call->mgw_xact;
-	call->mgw_xact = 0;
-	switch (opc) {
-	case TMGW_CTRL_OP_CRCX:
-		crcx_response(call, msg);
-		return;
-	case TMGW_CTRL_OP_MDCX:
-		mdcx_response(call, msg);
-		return;
-	case TMGW_CTRL_OP_DLCX:
-		dlcx_response(call, msg);
-		return;
-	case TMGW_CTRL_OP_DTMF_START:
-		dtmf_start_response(call, msg);
-		return;
-	case TMGW_CTRL_OP_DTMF_STOP:
-		dtmf_stop_response(call, msg);
-		return;
-	default:
-		syslog(LOG_CRIT,
-			"FATAL: invalid opcode 0x%x in call->msg_xact", opc);
-		exit(1);
-	}
-}