提交 2f950634 authored 作者: Anthony Minessale's avatar Anthony Minessale

fix sip auto_simplify

上级 09c3fba2
...@@ -1114,6 +1114,8 @@ typedef enum { ...@@ -1114,6 +1114,8 @@ typedef enum {
CF_CNG_PLC, CF_CNG_PLC,
CF_ATTENDED_TRANSFER, CF_ATTENDED_TRANSFER,
CF_LAZY_ATTENDED_TRANSFER, CF_LAZY_ATTENDED_TRANSFER,
CF_SIGNAL_DATA,
CF_SIMPLIFY,
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */ /* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
CF_FLAG_MAX CF_FLAG_MAX
} switch_channel_flag_t; } switch_channel_flag_t;
......
...@@ -968,6 +968,12 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f ...@@ -968,6 +968,12 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
switch_assert(tech_pvt->rtp_session != NULL); switch_assert(tech_pvt->rtp_session != NULL);
tech_pvt->read_frame.datalen = 0; 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) { while (sofia_test_flag(tech_pvt, TFLAG_IO) && tech_pvt->read_frame.datalen == 0) {
tech_pvt->read_frame.flags = SFF_NONE; tech_pvt->read_frame.flags = SFF_NONE;
...@@ -1518,8 +1524,9 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi ...@@ -1518,8 +1524,9 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
case SWITCH_MESSAGE_INDICATE_BRIDGE: case SWITCH_MESSAGE_INDICATE_BRIDGE:
{ {
sofia_glue_tech_track(tech_pvt->profile, session); 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)) { if (switch_rtp_ready(tech_pvt->rtp_session)) {
const char *val; const char *val;
......
...@@ -288,7 +288,7 @@ typedef enum { ...@@ -288,7 +288,7 @@ typedef enum {
TFLAG_NOHUP, TFLAG_NOHUP,
TFLAG_NOSDP_REINVITE, TFLAG_NOSDP_REINVITE,
TFLAG_NAT, TFLAG_NAT,
TFLAG_USEME, TFLAG_SIMPLIFY,
TFLAG_SIP_HOLD, TFLAG_SIP_HOLD,
TFLAG_INB_NOMEDIA, TFLAG_INB_NOMEDIA,
TFLAG_LATE_NEGOTIATION, TFLAG_LATE_NEGOTIATION,
...@@ -313,6 +313,7 @@ typedef enum { ...@@ -313,6 +313,7 @@ typedef enum {
TFLAG_3PCC_INVITE, TFLAG_3PCC_INVITE,
TFLAG_NOREPLY, TFLAG_NOREPLY,
TFLAG_LIBERAL_DTMF, TFLAG_LIBERAL_DTMF,
TFLAG_GOT_ACK,
/* No new flags below this line */ /* No new flags below this line */
TFLAG_MAX TFLAG_MAX
} TFLAGS; } TFLAGS;
......
...@@ -945,6 +945,7 @@ static void our_sofia_event_callback(nua_event_t event, ...@@ -945,6 +945,7 @@ static void our_sofia_event_callback(nua_event_t event,
extract_header_vars(profile, sip, session, nh); extract_header_vars(profile, sip, session, nh);
sofia_glue_tech_track(tech_pvt->profile, session); sofia_glue_tech_track(tech_pvt->profile, session);
sofia_set_flag(tech_pvt, TFLAG_GOT_ACK);
} }
} }
case nua_r_ack: case nua_r_ack:
...@@ -5827,7 +5828,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, ...@@ -5827,7 +5828,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
if ((enum nua_callstate) ss_state == nua_callstate_ready && channel && session && tech_pvt) { 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);
} }
...@@ -6804,6 +6805,8 @@ void sofia_handle_sip_i_reinvite(switch_core_session_t *session, ...@@ -6804,6 +6805,8 @@ void sofia_handle_sip_i_reinvite(switch_core_session_t *session,
char via_space[2048]; char via_space[2048];
char branch[16] = ""; 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); 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_stun_random_string(branch, sizeof(branch) - 1, "0123456789abcdef");
......
...@@ -6352,10 +6352,12 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt) ...@@ -6352,10 +6352,12 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt)
switch_core_session_t *other_session = NULL, *inbound_session = NULL; switch_core_session_t *other_session = NULL, *inbound_session = NULL;
uint8_t did_simplify = 0; 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; return;
} }
if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE))
&& (other_session = switch_core_session_locate(uuid))) { && (other_session = switch_core_session_locate(uuid))) {
...@@ -6382,10 +6384,10 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt) ...@@ -6382,10 +6384,10 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt)
&& strcmp(network_addr_a, switch_str_nil(tech_pvt->profile->extsipip))) { && strcmp(network_addr_a, switch_str_nil(tech_pvt->profile->extsipip))) {
switch_core_session_message_t *msg; 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_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)); SWITCH_LOG_NOTICE, "Will simplify channel [%s]\n", switch_channel_get_name(inbound_channel));
msg = switch_core_session_alloc(inbound_session, sizeof(*msg)); msg = switch_core_session_alloc(inbound_session, sizeof(*msg));
MESSAGE_STAMP_FFL(msg); MESSAGE_STAMP_FFL(msg);
msg->message_id = SWITCH_MESSAGE_INDICATE_SIMPLIFY; msg->message_id = SWITCH_MESSAGE_INDICATE_SIMPLIFY;
...@@ -6395,6 +6397,9 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt) ...@@ -6395,6 +6397,9 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt)
did_simplify = 1; did_simplify = 1;
sofia_glue_tech_track(tech_pvt->profile, inbound_session); sofia_glue_tech_track(tech_pvt->profile, inbound_session);
switch_channel_set_flag(inbound_channel, CF_SIMPLIFY);
} }
} }
......
...@@ -716,6 +716,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_signal_data(switch_core_ses ...@@ -716,6 +716,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_signal_data(switch_core_ses
void *data; void *data;
switch_core_session_message_t msg = { 0 }; switch_core_session_message_t msg = { 0 };
int i = 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.message_id = SWITCH_MESSAGE_INDICATE_SIGNAL_DATA;
msg.from = __FILE__; msg.from = __FILE__;
...@@ -730,6 +738,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_signal_data(switch_core_ses ...@@ -730,6 +738,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_signal_data(switch_core_ses
} }
switch_channel_clear_flag(channel, CF_SIGNAL_DATA);
return i ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; return i ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论