Merge "res_fax: gateway sends T.38 request to both endpoints if V.21 detected" into 16
This commit is contained in:
commit
635affeac5
|
@ -2921,6 +2921,9 @@ static int fax_gateway_start(struct fax_gateway *gateway, struct ast_fax_session
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* if we start gateway we don't need v21 detection sessions any more */
|
||||
destroy_v21_sessions(gateway);
|
||||
|
||||
/* create the FAX session */
|
||||
if (!(s = fax_session_new(details, chan, gateway->s, gateway->token))) {
|
||||
gateway->token = NULL;
|
||||
|
@ -2962,7 +2965,7 @@ static int fax_gateway_start(struct fax_gateway *gateway, struct ast_fax_session
|
|||
}
|
||||
|
||||
/*! \pre chan is locked on entry */
|
||||
static struct ast_frame *fax_gateway_request_t38(struct fax_gateway *gateway, struct ast_channel *chan, struct ast_frame *f)
|
||||
static struct ast_frame *fax_gateway_request_t38(struct fax_gateway *gateway, struct ast_channel *chan)
|
||||
{
|
||||
struct ast_frame *fp;
|
||||
struct ast_control_t38_parameters t38_parameters = {
|
||||
|
@ -2981,7 +2984,7 @@ static struct ast_frame *fax_gateway_request_t38(struct fax_gateway *gateway, st
|
|||
if (!details) {
|
||||
ast_log(LOG_ERROR, "no FAX session details found on chan %s for T.38 gateway session, odd\n", ast_channel_name(chan));
|
||||
ast_framehook_detach(chan, gateway->framehook);
|
||||
return f;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
t38_parameters_fax_to_ast(&t38_parameters, &details->our_t38_parameters);
|
||||
|
@ -2989,7 +2992,7 @@ static struct ast_frame *fax_gateway_request_t38(struct fax_gateway *gateway, st
|
|||
|
||||
if (!(fp = ast_frisolate(&control_frame))) {
|
||||
ast_log(LOG_ERROR, "error generating T.38 request control frame on chan %s for T.38 gateway session\n", ast_channel_name(chan));
|
||||
return f;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gateway->t38_state = T38_STATE_NEGOTIATING;
|
||||
|
@ -3018,17 +3021,40 @@ static struct ast_frame *fax_gateway_detect_v21(struct fax_gateway *gateway, str
|
|||
|
||||
if (gateway->detected_v21) {
|
||||
enum ast_t38_state state_other;
|
||||
enum ast_t38_state state_active;
|
||||
struct ast_frame *fp;
|
||||
|
||||
destroy_v21_sessions(gateway);
|
||||
|
||||
ast_channel_unlock(chan);
|
||||
state_active = ast_channel_get_t38_state(active);
|
||||
state_other = ast_channel_get_t38_state(other);
|
||||
ast_channel_lock(chan);
|
||||
if (state_other == T38_STATE_UNKNOWN) {
|
||||
ast_debug(1, "detected v21 preamble from %s\n", ast_channel_name(active));
|
||||
return fax_gateway_request_t38(gateway, chan, f);
|
||||
|
||||
ast_debug(1, "detected v21 preamble from %s\n", ast_channel_name(active));
|
||||
|
||||
if (state_active == T38_STATE_UNKNOWN || state_other == T38_STATE_UNKNOWN) {
|
||||
if (!(fp = fax_gateway_request_t38(gateway, chan))) {
|
||||
return f;
|
||||
}
|
||||
/* May be called endpoint is improperly configured to rely on the calling endpoint
|
||||
* to initiate T.38 re-INVITEs, send T.38 negotiation request to called endpoint */
|
||||
if (state_active == T38_STATE_UNKNOWN) {
|
||||
ast_debug(1, "sending T.38 negotiation request to %s\n", ast_channel_name(active));
|
||||
if (active == chan) {
|
||||
ast_channel_unlock(chan);
|
||||
}
|
||||
ast_write(active, fp);
|
||||
if (active == chan) {
|
||||
ast_channel_lock(chan);
|
||||
}
|
||||
}
|
||||
if (state_other == T38_STATE_UNKNOWN) {
|
||||
ast_debug(1, "sending T.38 negotiation request to %s\n", ast_channel_name(other));
|
||||
return fp;
|
||||
}
|
||||
} else {
|
||||
ast_debug(1, "detected v21 preamble on %s, but %s does not support T.38 for T.38 gateway session\n", ast_channel_name(active), ast_channel_name(other));
|
||||
ast_debug(1, "neither %s nor %s support T.38 for T.38 gateway session\n", ast_channel_name(active), ast_channel_name(other));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3190,7 +3216,7 @@ static struct ast_frame *fax_gateway_detect_t38(struct fax_gateway *gateway, str
|
|||
ast_channel_lock(chan);
|
||||
if (state_other == T38_STATE_UNKNOWN) {
|
||||
gateway->t38_state = T38_STATE_UNAVAILABLE;
|
||||
} else {
|
||||
} else if (state_other != T38_STATE_NEGOTIATING) {
|
||||
ast_framehook_detach(chan, details->gateway_id);
|
||||
details->gateway_id = -1;
|
||||
|
||||
|
|
Loading…
Reference in New Issue