CF_CNG_PLC,
CF_ATTENDED_TRANSFER,
CF_LAZY_ATTENDED_TRANSFER,
+ CF_SIGNAL_DATA,
+ CF_SIMPLIFY,
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
CF_FLAG_MAX
} switch_channel_flag_t;
switch_assert(tech_pvt->rtp_session != NULL);
tech_pvt->read_frame.datalen = 0;
+
+ if (sofia_test_flag(tech_pvt, TFLAG_SIMPLIFY) && sofia_test_flag(tech_pvt, TFLAG_GOT_ACK)) {
+ sofia_glue_tech_simplify(tech_pvt);
+ sofia_clear_flag(tech_pvt, TFLAG_SIMPLIFY);
+ }
+
while (sofia_test_flag(tech_pvt, TFLAG_IO) && tech_pvt->read_frame.datalen == 0) {
tech_pvt->read_frame.flags = SFF_NONE;
case SWITCH_MESSAGE_INDICATE_BRIDGE:
{
sofia_glue_tech_track(tech_pvt->profile, session);
-
- sofia_glue_tech_simplify(tech_pvt);
+
+ sofia_set_flag(tech_pvt, TFLAG_SIMPLIFY);
+
if (switch_rtp_ready(tech_pvt->rtp_session)) {
const char *val;
TFLAG_NOHUP,
TFLAG_NOSDP_REINVITE,
TFLAG_NAT,
- TFLAG_USEME,
+ TFLAG_SIMPLIFY,
TFLAG_SIP_HOLD,
TFLAG_INB_NOMEDIA,
TFLAG_LATE_NEGOTIATION,
TFLAG_3PCC_INVITE,
TFLAG_NOREPLY,
TFLAG_LIBERAL_DTMF,
+ TFLAG_GOT_ACK,
/* No new flags below this line */
TFLAG_MAX
} TFLAGS;
extract_header_vars(profile, sip, session, nh);
sofia_glue_tech_track(tech_pvt->profile, session);
+ sofia_set_flag(tech_pvt, TFLAG_GOT_ACK);
}
}
case nua_r_ack:
if ((enum nua_callstate) ss_state == nua_callstate_ready && channel && session && tech_pvt) {
- sofia_glue_tech_simplify(tech_pvt);
+ sofia_set_flag(tech_pvt, TFLAG_SIMPLIFY);
}
char via_space[2048];
char branch[16] = "";
+ sofia_clear_flag(tech_pvt, TFLAG_GOT_ACK);
+
sofia_glue_get_addr(de->data->e_msg, network_ip, sizeof(network_ip), &network_port);
switch_stun_random_string(branch, sizeof(branch) - 1, "0123456789abcdef");
switch_core_session_t *other_session = NULL, *inbound_session = NULL;
uint8_t did_simplify = 0;
- if (!switch_channel_test_flag(tech_pvt->channel, CF_ANSWERED)) {
+ if (!switch_channel_test_flag(tech_pvt->channel, CF_ANSWERED) || switch_channel_test_flag(tech_pvt->channel, CF_SIMPLIFY)) {
return;
}
+
+
if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE))
&& (other_session = switch_core_session_locate(uuid))) {
&& strcmp(network_addr_a, switch_str_nil(tech_pvt->profile->extsipip))) {
switch_core_session_message_t *msg;
-
+
switch_log_printf(SWITCH_CHANNEL_ID_LOG, __FILE__, __SWITCH_FUNC__, __LINE__, switch_channel_get_uuid(inbound_channel),
SWITCH_LOG_NOTICE, "Will simplify channel [%s]\n", switch_channel_get_name(inbound_channel));
-
+
msg = switch_core_session_alloc(inbound_session, sizeof(*msg));
MESSAGE_STAMP_FFL(msg);
msg->message_id = SWITCH_MESSAGE_INDICATE_SIMPLIFY;
did_simplify = 1;
sofia_glue_tech_track(tech_pvt->profile, inbound_session);
+
+ switch_channel_set_flag(inbound_channel, CF_SIMPLIFY);
+
}
}
void *data;
switch_core_session_message_t msg = { 0 };
int i = 0;
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+
+
+ if (switch_channel_test_flag(channel, CF_SIGNAL_DATA)) {
+ return SWITCH_STATUS_FALSE;
+ }
+
+ switch_channel_set_flag(channel, CF_SIGNAL_DATA);
msg.message_id = SWITCH_MESSAGE_INDICATE_SIGNAL_DATA;
msg.from = __FILE__;
}
+ switch_channel_clear_flag(channel, CF_SIGNAL_DATA);
+
return i ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;
}