Fixed suspend/resume feature

This commit is contained in:
Andreas Eversberg 2022-09-17 15:00:11 +02:00
parent e6aa538562
commit 42f4e4a243
1 changed files with 38 additions and 1 deletions

View File

@ -1064,6 +1064,8 @@ void suspend_ind(call_t *call, uint32_t pid, struct l3_msg *l3m)
osmo_cc_add_ie_notify(msg, OSMO_CC_NOTIFY_USER_SUSPENDED); osmo_cc_add_ie_notify(msg, OSMO_CC_NOTIFY_USER_SUSPENDED);
new_state(call, ISDN_STATE_SUSPENDED); new_state(call, ISDN_STATE_SUSPENDED);
memcpy(call->park_callid, callid, len);
call->park_len = len;
#warning use clock to send empty packets/holdmusic #warning use clock to send empty packets/holdmusic
/* send message to osmo-cc */ /* send message to osmo-cc */
@ -1107,11 +1109,12 @@ void resume_ind(isdn_t *isdn_ep, uint32_t pid, struct l3_msg *l3m)
/* process given callref */ /* process given callref */
if (!call) { if (!call) {
PDEBUG(DDSS1, DEBUG_NOTICE, "No parked call found with given park ID, rejecting.\n");
rc = -85; rc = -85;
no_channel: no_channel:
PDEBUG(DDSS1, DEBUG_INFO, "RESUME-REJECT REQUEST (pid = 0x%x)\n", pid); PDEBUG(DDSS1, DEBUG_INFO, "RESUME-REJECT REQUEST (pid = 0x%x)\n", pid);
l3m = create_l3msg(); l3m = create_l3msg();
enc_ie_cause(l3m, call->isdn_ep->serving_location, -rc); enc_ie_cause(l3m, isdn_ep->serving_location, -rc);
isdn_ep->ml3->to_layer3(isdn_ep->ml3, MT_RESUME_REJECT, pid, l3m); isdn_ep->ml3->to_layer3(isdn_ep->ml3, MT_RESUME_REJECT, pid, l3m);
return; return;
} }
@ -1324,6 +1327,8 @@ void mt_free(call_t *call)
case ISDN_STATE_OUT_SETUP: case ISDN_STATE_OUT_SETUP:
msg = osmo_cc_new_msg(OSMO_CC_MSG_REJ_IND); msg = osmo_cc_new_msg(OSMO_CC_MSG_REJ_IND);
break; break;
case ISDN_STATE_SUSPENDED:
return;
default: default:
msg = osmo_cc_new_msg(OSMO_CC_MSG_REL_IND); msg = osmo_cc_new_msg(OSMO_CC_MSG_REL_IND);
} }
@ -2359,6 +2364,30 @@ void rel_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_RELEASE, call->l3_pid, l3m); call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_RELEASE, call->l3_pid, l3m);
} }
/* special case where call is suspended */
void disc_rel_suspended(call_t *call, osmo_cc_msg_t *msg)
{
uint8_t location, isdn_cause, socket_cause;
uint16_t sip_cause;
int rc;
rc = osmo_cc_get_ie_cause(msg, 0, &location, &isdn_cause, &sip_cause, &socket_cause);
if (rc < 0)
isdn_cause = OSMO_CC_ISDN_CAUSE_NORM_CALL_CLEAR;
msg = osmo_cc_new_msg((msg->type == OSMO_CC_MSG_REL_REQ) ? OSMO_CC_MSG_REL_CNF : OSMO_CC_MSG_REL_IND);
/* cause */
osmo_cc_add_ie_cause(msg, call->isdn_ep->serving_location, isdn_cause, 0, 0);
/* send message to osmo-cc */
osmo_cc_ll_msg(&call->isdn_ep->cc_ep, call->cc_callref, msg);
/* terminate call */
new_state(call, ISDN_STATE_IDLE);
call_destroy(call);
}
void cc_message(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg) void cc_message(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg)
{ {
isdn_t *isdn_ep = ep->priv; isdn_t *isdn_ep = ep->priv;
@ -2470,6 +2499,10 @@ void cc_message(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg)
break; break;
case OSMO_CC_MSG_DISC_REQ: /* call has been disconnected */ case OSMO_CC_MSG_DISC_REQ: /* call has been disconnected */
osmo_cc_helper_audio_negotiate(msg, &call->cc_session, &call->codec); osmo_cc_helper_audio_negotiate(msg, &call->cc_session, &call->codec);
if (call->state == ISDN_STATE_SUSPENDED) {
disc_rel_suspended(call, msg);
break;
}
if (call->state != ISDN_STATE_IN_SETUP if (call->state != ISDN_STATE_IN_SETUP
&& call->state != ISDN_STATE_IN_OVERLAP && call->state != ISDN_STATE_IN_OVERLAP
&& call->state != ISDN_STATE_IN_PROCEEDING && call->state != ISDN_STATE_IN_PROCEEDING
@ -2485,6 +2518,10 @@ void cc_message(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg)
disc_req(call, call->l3_pid, msg); disc_req(call, call->l3_pid, msg);
break; break;
case OSMO_CC_MSG_REL_REQ: /* release isdn port */ case OSMO_CC_MSG_REL_REQ: /* release isdn port */
if (call->state == ISDN_STATE_SUSPENDED) {
disc_rel_suspended(call, msg);
break;
}
rel_req(call, call->l3_pid, msg); rel_req(call, call->l3_pid, msg);
break; break;
default: default: