summaryrefslogtreecommitdiff
path: root/main/rtp_engine.c
diff options
context:
space:
mode:
authorKevin Harwell <kharwell@digium.com>2014-12-09 20:03:22 +0000
committerKevin Harwell <kharwell@digium.com>2014-12-09 20:03:22 +0000
commitc17cef1c383e34128cb8e3b3bdd573bad72caf75 (patch)
treeaef28a09f1ad12ac64fb07f71aaf9d0a60cff879 /main/rtp_engine.c
parent7844266e2183b018690a0b54c0b72c47419d75fe (diff)
Direct Media calls within private network sometimes get one way audio
When endpoints with direct_media enabled, behind a firewall (Asterisk on a separate network) and were bridged sometimes Asterisk would send the ip address of the firewall in the sdp to one of the phones in the reinvite resulting in one way audio. When sending the reinvite Asterisk will retrieve the media address from the associated rtp instance, but if frames were being read this can be overwritten with another address (in this case the firewall's). This patch ensures that Asterisk uses the original device address when using direct media. ASTERISK-24563 Reported by: Steve Pitts Review: https://reviewboard.asterisk.org/r/4216/ ........ Merged revisions 429195 from http://svn.asterisk.org/svn/asterisk/branches/12 ........ Merged revisions 429196 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@429197 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/rtp_engine.c')
-rw-r--r--main/rtp_engine.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/main/rtp_engine.c b/main/rtp_engine.c
index 747c95bb0..977e47c57 100644
--- a/main/rtp_engine.c
+++ b/main/rtp_engine.c
@@ -170,8 +170,10 @@ struct ast_rtp_instance {
int properties[AST_RTP_PROPERTY_MAX];
/*! Address that we are expecting RTP to come in to */
struct ast_sockaddr local_address;
+ /*! The original source address */
+ struct ast_sockaddr requested_target_address;
/*! Address that we are sending RTP to */
- struct ast_sockaddr remote_address;
+ struct ast_sockaddr incoming_source_address;
/*! Instance that we are bridged to if doing remote or local bridging */
struct ast_rtp_instance *bridged;
/*! Payload and packetization information */
@@ -467,20 +469,28 @@ int ast_rtp_instance_set_local_address(struct ast_rtp_instance *instance,
return 0;
}
-int ast_rtp_instance_set_remote_address(struct ast_rtp_instance *instance,
- const struct ast_sockaddr *address)
+int ast_rtp_instance_set_incoming_source_address(struct ast_rtp_instance *instance,
+ const struct ast_sockaddr *address)
{
- ast_sockaddr_copy(&instance->remote_address, address);
+ ast_sockaddr_copy(&instance->incoming_source_address, address);
/* moo */
if (instance->engine->remote_address_set) {
- instance->engine->remote_address_set(instance, &instance->remote_address);
+ instance->engine->remote_address_set(instance, &instance->incoming_source_address);
}
return 0;
}
+int ast_rtp_instance_set_requested_target_address(struct ast_rtp_instance *instance,
+ const struct ast_sockaddr *address)
+{
+ ast_sockaddr_copy(&instance->requested_target_address, address);
+
+ return ast_rtp_instance_set_incoming_source_address(instance, address);
+}
+
int ast_rtp_instance_get_and_cmp_local_address(struct ast_rtp_instance *instance,
struct ast_sockaddr *address)
{
@@ -498,21 +508,27 @@ void ast_rtp_instance_get_local_address(struct ast_rtp_instance *instance,
ast_sockaddr_copy(address, &instance->local_address);
}
-int ast_rtp_instance_get_and_cmp_remote_address(struct ast_rtp_instance *instance,
+int ast_rtp_instance_get_and_cmp_requested_target_address(struct ast_rtp_instance *instance,
struct ast_sockaddr *address)
{
- if (ast_sockaddr_cmp(address, &instance->remote_address) != 0) {
- ast_sockaddr_copy(address, &instance->remote_address);
+ if (ast_sockaddr_cmp(address, &instance->requested_target_address) != 0) {
+ ast_sockaddr_copy(address, &instance->requested_target_address);
return 1;
}
return 0;
}
-void ast_rtp_instance_get_remote_address(struct ast_rtp_instance *instance,
- struct ast_sockaddr *address)
+void ast_rtp_instance_get_incoming_source_address(struct ast_rtp_instance *instance,
+ struct ast_sockaddr *address)
+{
+ ast_sockaddr_copy(address, &instance->incoming_source_address);
+}
+
+void ast_rtp_instance_get_requested_target_address(struct ast_rtp_instance *instance,
+ struct ast_sockaddr *address)
{
- ast_sockaddr_copy(address, &instance->remote_address);
+ ast_sockaddr_copy(address, &instance->requested_target_address);
}
void ast_rtp_instance_set_extended_prop(struct ast_rtp_instance *instance, int property, void *value)