Change how we set the local and remote address.
The code will now only change the address and port. It will not overwrite any other values. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@187773 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
f52aa65700
commit
90e787d30c
|
@ -312,7 +312,9 @@ struct ast_rtp_instance *ast_rtp_instance_new(const char *engine_name, struct sc
|
|||
return NULL;
|
||||
}
|
||||
instance->engine = engine;
|
||||
memcpy(&instance->local_address, sin, sizeof(instance->local_address));
|
||||
instance->local_address.sin_family = AF_INET;
|
||||
instance->local_address.sin_addr = sin->sin_addr;
|
||||
instance->remote_address.sin_family = AF_INET;
|
||||
|
||||
ast_debug(1, "Using engine '%s' for RTP instance '%p'\n", engine->name, instance);
|
||||
|
||||
|
@ -350,20 +352,22 @@ struct ast_frame *ast_rtp_instance_read(struct ast_rtp_instance *instance, int r
|
|||
|
||||
int ast_rtp_instance_set_local_address(struct ast_rtp_instance *instance, struct sockaddr_in *address)
|
||||
{
|
||||
memcpy(&instance->local_address, address, sizeof(instance->local_address));
|
||||
instance->local_address.sin_addr = address->sin_addr;
|
||||
instance->local_address.sin_port = address->sin_port;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ast_rtp_instance_set_remote_address(struct ast_rtp_instance *instance, struct sockaddr_in *address)
|
||||
{
|
||||
if (&instance->remote_address != address) {
|
||||
memcpy(&instance->remote_address, address, sizeof(instance->remote_address));
|
||||
instance->remote_address.sin_addr = address->sin_addr;
|
||||
instance->remote_address.sin_port = address->sin_port;
|
||||
}
|
||||
|
||||
/* moo */
|
||||
|
||||
if (instance->engine->remote_address_set) {
|
||||
instance->engine->remote_address_set(instance, address);
|
||||
instance->engine->remote_address_set(instance, &instance->remote_address);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -406,13 +406,11 @@ static int ast_rtp_new(struct ast_rtp_instance *instance, struct sched_context *
|
|||
startplace = x;
|
||||
|
||||
for (;;) {
|
||||
struct sockaddr_in local_address = { 0, };
|
||||
|
||||
local_address.sin_port = htons(x);
|
||||
sin->sin_port = htons(x);
|
||||
/* Try to bind, this will tell us whether the port is available or not */
|
||||
if (!bind(rtp->s, (struct sockaddr*)&local_address, sizeof(local_address))) {
|
||||
if (!bind(rtp->s, (struct sockaddr *)sin, sizeof(*sin))) {
|
||||
ast_debug(1, "Allocated port %d for RTP instance '%p'\n", x, instance);
|
||||
ast_rtp_instance_set_local_address(instance, &local_address);
|
||||
ast_rtp_instance_set_local_address(instance, sin);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Reference in New Issue