summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorAlexei Gradinari <alex2grad@gmail.com>2016-05-02 17:52:16 -0400
committerAlexei Gradinari <alex2grad@gmail.com>2016-05-03 16:43:09 -0400
commit2d17fe06c55eedb2c0429af5f13d0589cf1866d0 (patch)
tree828299aef3a1d0efb6b337f19d94de76b2a33645 /res
parent69ced86c6c1847e5c4b683e35ccd407f3eff594a (diff)
res_fax/t38_gateway: Peer V.21 session is created on wrong channel
The channel and peer V.21 sessions are created on the same channel now. The peer V.21 session should be created only on peer channel when one of channel can handle T.38. Also this patch enable debug for T.38 gateway session if global fax debug enabled. ASTERISK-25982 Change-Id: I78387156ea521a77eb0faf170179ddd37a50430e
Diffstat (limited to 'res')
-rw-r--r--res/res_fax.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/res/res_fax.c b/res/res_fax.c
index ef0e27696..8641ccea8 100644
--- a/res/res_fax.c
+++ b/res/res_fax.c
@@ -626,6 +626,8 @@ static const struct ast_datastore_info fax_datastore = {
static int fax_gateway_attach(struct ast_channel *chan, struct ast_fax_session_details *details);
static int fax_detect_attach(struct ast_channel *chan, int timeout, int flags);
static struct ast_fax_session_details *find_or_create_details(struct ast_channel *chan);
+static struct ast_fax_session *fax_v21_session_new (struct ast_channel *chan);
+
/*! \brief Copies fax detection and gateway framehooks during masquerades
*
@@ -2827,6 +2829,23 @@ static void destroy_gateway(void *data)
ao2_cleanup(gateway->peer_write_format);
}
+static struct ast_fax_session *fax_v21_session_new (struct ast_channel *chan) {
+ struct ast_fax_session_details *v21_details;
+ struct ast_fax_session *v21_session;
+
+ if (!chan || !(v21_details = session_details_new())) {
+ return NULL;
+ }
+
+ v21_details->caps = AST_FAX_TECH_V21_DETECT;
+ if (!(v21_session = fax_session_new(v21_details, chan, NULL, NULL))) {
+ ao2_ref(v21_details, -1);
+ return NULL;
+ }
+
+ return v21_session;
+}
+
/*! \brief Create a new fax gateway object.
* \param chan the channel the gateway object will be attached to
* \param details the fax session details
@@ -2835,30 +2854,16 @@ static void destroy_gateway(void *data)
static struct fax_gateway *fax_gateway_new(struct ast_channel *chan, struct ast_fax_session_details *details)
{
struct fax_gateway *gateway = ao2_alloc(sizeof(*gateway), destroy_gateway);
- struct ast_fax_session_details *v21_details;
if (!gateway) {
return NULL;
}
- if (!(v21_details = session_details_new())) {
+ if (!(gateway->chan_v21_session = fax_v21_session_new(chan))) {
+ ast_log(LOG_ERROR, "Can't create V21 session on chan %s for T.38 gateway session\n", ast_channel_name(chan));
ao2_ref(gateway, -1);
return NULL;
}
- v21_details->caps = AST_FAX_TECH_V21_DETECT;
- if (!(gateway->chan_v21_session = fax_session_new(v21_details, chan, NULL, NULL))) {
- ao2_ref(v21_details, -1);
- ao2_ref(gateway, -1);
- return NULL;
- }
-
- if (!(gateway->peer_v21_session = fax_session_new(v21_details, chan, NULL, NULL))) {
- ao2_ref(v21_details, -1);
- ao2_ref(gateway, -1);
- return NULL;
- }
- ao2_ref(v21_details, -1);
-
gateway->framehook = -1;
details->caps = AST_FAX_TECH_GATEWAY;
@@ -3352,6 +3357,11 @@ static struct ast_frame *fax_gateway_framehook(struct ast_channel *chan, struct
ast_channel_unlock(peer);
gateway->bridged = 1;
+ if (!(gateway->peer_v21_session = fax_v21_session_new(peer))) {
+ ast_log(LOG_ERROR, "Can't create V21 session on chan %s for T.38 gateway session\n", ast_channel_name(peer));
+ ast_framehook_detach(chan, gateway->framehook);
+ return f;
+ }
}
if (gateway->bridged && !ast_tvzero(gateway->timeout_start)) {
@@ -3478,6 +3488,10 @@ static int fax_gateway_attach(struct ast_channel *chan, struct ast_fax_session_d
.disable_inheritance = 1, /* Masquerade inheritance is handled through the datastore fixup */
};
+ if (global_fax_debug) {
+ details->option.debug = AST_FAX_OPTFLAG_TRUE;
+ }
+
ast_string_field_set(details, result, "SUCCESS");
ast_string_field_set(details, resultstr, "gateway operation started successfully");
ast_string_field_set(details, error, "NO_ERROR");