summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/sdp_options.c3
-rw-r--r--main/sdp_private.h6
-rw-r--r--main/sdp_state.c27
3 files changed, 20 insertions, 16 deletions
diff --git a/main/sdp_options.c b/main/sdp_options.c
index 9b57e189f..ab8fb2973 100644
--- a/main/sdp_options.c
+++ b/main/sdp_options.c
@@ -55,12 +55,11 @@ type ast_sdp_options_get_##field(const struct ast_sdp_options *options) \
} \
DEFINE_STRINGFIELD_GETTERS_SETTERS_FOR(media_address, 0);
+DEFINE_STRINGFIELD_GETTERS_SETTERS_FOR(interface_address, 0);
DEFINE_STRINGFIELD_GETTERS_SETTERS_FOR(sdpowner, 0);
DEFINE_STRINGFIELD_GETTERS_SETTERS_FOR(sdpsession, 0);
DEFINE_STRINGFIELD_GETTERS_SETTERS_FOR(rtp_engine, 0);
-DEFINE_GETTERS_SETTERS_FOR(unsigned int, bind_rtp_to_media_address);
-DEFINE_GETTERS_SETTERS_FOR(unsigned int, bind_udptl_to_media_address);
DEFINE_GETTERS_SETTERS_FOR(unsigned int, rtp_symmetric);
DEFINE_GETTERS_SETTERS_FOR(unsigned int, udptl_symmetric);
DEFINE_GETTERS_SETTERS_FOR(enum ast_t38_ec_modes, udptl_error_correction);
diff --git a/main/sdp_private.h b/main/sdp_private.h
index c90a57485..a0b63df03 100644
--- a/main/sdp_private.h
+++ b/main/sdp_private.h
@@ -24,8 +24,10 @@
struct ast_sdp_options {
AST_DECLARE_STRING_FIELDS(
- /*! Optional media address to use in SDP */
+ /*! Media address to use in SDP */
AST_STRING_FIELD(media_address);
+ /*! Optional address of the interface media should use. */
+ AST_STRING_FIELD(interface_address);
/*! SDP origin username */
AST_STRING_FIELD(sdpowner);
/*! SDP session name */
@@ -34,8 +36,6 @@ struct ast_sdp_options {
AST_STRING_FIELD(rtp_engine);
);
struct {
- unsigned int bind_rtp_to_media_address:1;
- unsigned int bind_udptl_to_media_address:1;
unsigned int rtp_symmetric:1;
unsigned int udptl_symmetric:1;
unsigned int rtp_ipv6:1;
diff --git a/main/sdp_state.c b/main/sdp_state.c
index 3a87a81e2..0da93e4ac 100644
--- a/main/sdp_state.c
+++ b/main/sdp_state.c
@@ -150,13 +150,15 @@ static struct ast_rtp_instance *create_rtp(const struct ast_sdp_options *options
{
struct ast_rtp_instance *rtp;
struct ast_rtp_engine_ice *ice;
- struct ast_sockaddr temp_media_address;
static struct ast_sockaddr address_rtp;
- struct ast_sockaddr *media_address = &address_rtp;
+ struct ast_sockaddr *media_address = &address_rtp;
- if (options->bind_rtp_to_media_address && !ast_strlen_zero(options->media_address)) {
- ast_sockaddr_parse(&temp_media_address, options->media_address, 0);
- media_address = &temp_media_address;
+ if (!ast_strlen_zero(options->interface_address)) {
+ if (!ast_sockaddr_parse(&address_rtp, options->interface_address, 0)) {
+ ast_log(LOG_ERROR, "Attempted to bind RTP to invalid media address: %s\n",
+ options->interface_address);
+ return NULL;
+ }
} else {
if (ast_check_ipv6()) {
ast_sockaddr_parse(&address_rtp, "::", 0);
@@ -165,7 +167,8 @@ static struct ast_rtp_instance *create_rtp(const struct ast_sdp_options *options
}
}
- if (!(rtp = ast_rtp_instance_new(options->rtp_engine, sched, media_address, NULL))) {
+ rtp = ast_rtp_instance_new(options->rtp_engine, sched, media_address, NULL);
+ if (!rtp) {
ast_log(LOG_ERROR, "Unable to create RTP instance using RTP engine '%s'\n",
options->rtp_engine);
return NULL;
@@ -204,13 +207,15 @@ static struct ast_rtp_instance *create_rtp(const struct ast_sdp_options *options
static struct sdp_state_udptl *create_udptl(const struct ast_sdp_options *options)
{
struct sdp_state_udptl *udptl;
- struct ast_sockaddr temp_media_address;
static struct ast_sockaddr address_udptl;
- struct ast_sockaddr *media_address = &address_udptl;
+ struct ast_sockaddr *media_address = &address_udptl;
- if (options->bind_udptl_to_media_address && !ast_strlen_zero(options->media_address)) {
- ast_sockaddr_parse(&temp_media_address, options->media_address, 0);
- media_address = &temp_media_address;
+ if (!ast_strlen_zero(options->interface_address)) {
+ if (!ast_sockaddr_parse(&address_udptl, options->interface_address, 0)) {
+ ast_log(LOG_ERROR, "Attempted to bind UDPTL to invalid media address: %s\n",
+ options->interface_address);
+ return NULL;
+ }
} else {
if (ast_check_ipv6()) {
ast_sockaddr_parse(&address_udptl, "::", 0);