Skip to content
Snippets Groups Projects

Do not stick to the last used server address when a new DNS lookup is done, REF 15378

Merged Iryna Antsyferova requested to merge fix_resolved_server_selection into asterisk_rdkb
1 file
+ 2
44
Compare changes
  • Side-by-side
  • Inline
@@ -162,48 +162,6 @@ static int pjsip_server_addresses_cmp(pjsip_server_addresses *addr1, pjsip_serve
@@ -162,48 +162,6 @@ static int pjsip_server_addresses_cmp(pjsip_server_addresses *addr1, pjsip_serve
return 0;
return 0;
}
}
/*! \brief update the tracked pjsip_server_addresses with new resolve
* Note: The tracked and new resolved server addresses must same, but maybe in different order.
* The order of resolved addresses may be round-shifted, to make the current using server address
* always be the first entry.
*/
static void pjsip_server_addresses_track_update(struct host_track_entry *host, pjsip_server_addresses *addrs)
{
int c, i;
char buffer[512];
// Get the index of current server address in the new address table
for (c = 0; c < addrs->count; c++) {
if (!pjsip_server_addresses_entry_cmp(&host->addresses, host->cur_addr, addrs, c))
break;
}
// The current server address is the first entry in the new table
if (c == 0) {
pj_memcpy(&host->addresses, addrs, sizeof(*addrs));
host->cur_addr = 0;
pj_sockaddr_print(&host->addresses.entry[0].addr, buffer, sizeof(buffer), 3);
for (i = 0; i < addrs->count; i++) {
pj_sockaddr_print(&host->addresses.entry[i].addr, buffer, sizeof(buffer), 3);
ast_debug(5, "host track '%s': address[%d] = '%s'\n", host->target.host, i, buffer);
}
return;
}
// Re-order the new table, to make sure the current server address is the first entry
for (i = 0; i < addrs->count; i++) {
pj_memcpy(&host->addresses.entry[i], &addrs->entry[c], sizeof(addrs->entry[0]));
if (++c >= addrs->count)
c = 0;
pj_sockaddr_print(&host->addresses.entry[i].addr, buffer, sizeof(buffer), 3);
ast_debug(5, "host track '%s': address[%d] = '%s'\n", host->target.host, i, buffer);
}
pj_memcpy(addrs, &host->addresses, sizeof(*addrs));
host->cur_addr = 0;
}
static pjsip_server_addresses *get_cached_host_addrs(const pjsip_host_info *target)
static pjsip_server_addresses *get_cached_host_addrs(const pjsip_host_info *target)
{
{
pjsip_server_addresses *cached_addrs = NULL;
pjsip_server_addresses *cached_addrs = NULL;
@@ -279,8 +237,8 @@ static void sip_resolve_target_track(struct sip_resolve *resolve)
@@ -279,8 +237,8 @@ static void sip_resolve_target_track(struct sip_resolve *resolve)
break;
break;
}
}
// The new addresses are same as tracked, but maybe in different order
pj_memcpy(&host->addresses, addresses, sizeof(*addresses));
pjsip_server_addresses_track_update(host, addresses);
host->cur_addr = 0;
host->expiry = resolve->ttl + time(NULL);
host->expiry = resolve->ttl + time(NULL);
ast_debug(5, "host track '%s' (%s): record updated, to be expired at %s\n", host->target.host,
ast_debug(5, "host track '%s' (%s): record updated, to be expired at %s\n", host->target.host,
Loading