MT#55283 change reserve_port semantics

Change-Id: I162fbf8f167b1c47e060128dcb4f8773c8fbf3a7
pull/1910/head
Richard Fuchs 3 months ago
parent 3c6108e072
commit 1b7077152f

@ -682,11 +682,18 @@ int is_local_endpoint(const struct intf_address *addr, unsigned int port) {
/**
* This function just (globally) reserves a port number, it doesn't provide any binding/unbinding.
* Returns list link if successful, or NULL if failed.
*/
static void reserve_port(struct port_pool *pp, ports_list *link) {
t_queue_unlink(&pp->free_ports_q, link);
unsigned int port = GPOINTER_TO_UINT(link->data);
static ports_list *reserve_port(struct port_pool *pp, unsigned int port) {
if (port < pp->min || port > pp->max)
return NULL;
LOCK(&pp->free_list_lock);
__auto_type list = free_ports_link(pp, port);
if (!list)
return NULL;
t_queue_unlink(&pp->free_ports_q, list);
free_ports_link(pp, port) = NULL;
return list;
}
/**
* This function just releases reserved port number, it doesn't provide any binding/unbinding.
@ -840,11 +847,9 @@ static void __interface_append(struct intf_config *ifa, sockfamily_t *fam, bool
unsigned int port = GPOINTER_TO_UINT(l->data);
if (port > 65535)
continue;
ports_list *ll = spec->port_pool.free_ports[port];
if (ll) {
reserve_port(&spec->port_pool, ll);
__auto_type ll = reserve_port(&spec->port_pool, port);
if (ll)
t_list_free(ll);
}
}
t_hash_table_insert(__intf_spec_addr_type_hash, &spec->local_address, spec);
@ -928,13 +933,9 @@ void interfaces_exclude_port(endpoint_t *e) {
if (e->port < pp->min || e->port > pp->max)
continue;
mutex_lock(&pp->free_list_lock);
__auto_type ll = free_ports_link(pp, e->port);
if (ll) {
reserve_port(pp, ll);
__auto_type ll = reserve_port(pp, e->port);
if (ll)
t_list_free(ll);
}
mutex_unlock(&pp->free_list_lock);
}
}
@ -1103,18 +1104,15 @@ int __get_consecutive_ports(socket_port_q *out, unsigned int num_ports, unsigned
/* specifically requested port */
if (wanted_start_port > 0) {
ilog(LOG_DEBUG, "A specific port value is requested, wanted_start_port: '%d'", wanted_start_port);
mutex_lock(&pp->free_list_lock);
port_link = free_ports_link(pp, wanted_start_port);
port_link = reserve_port(pp, wanted_start_port);
if (!port_link) {
/* if engaged already, just select any other (so default logic) */
ilog(LOG_WARN, "This requested port has been already engaged, can't take it.");
wanted_start_port = 0; /* take what is proposed by FIFO instead */
} else {
/* we got the port, and we are sure it wasn't engaged */
reserve_port(pp, port_link);
port = wanted_start_port;
}
mutex_unlock(&pp->free_list_lock);
}
/* make sure we have ports to be used */
@ -1184,9 +1182,7 @@ new_cycle:
{
additional_port++;
mutex_lock(&pp->free_list_lock);
__auto_type add_link = additional_port <= pp->max ? free_ports_link(pp, additional_port) : NULL;
mutex_unlock(&pp->free_list_lock);
__auto_type add_link = reserve_port(pp, additional_port);
if (!add_link) {
/* return port for RTP back and try again */
@ -1202,9 +1198,6 @@ new_cycle:
}
/* engage this port right away */
reserve_port(pp, add_link);
mutex_unlock(&pp->free_list_lock);
/* track for which additional ports, we have to open sockets */
t_queue_push_tail_link(&ports_to_engage, add_link);
}

Loading…
Cancel
Save