mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-14 10:46:51 -07:00
Prefer fixed local Port for Discovery
This commit is contained in:
parent
a0c3768edb
commit
9ab84e6054
3 changed files with 39 additions and 16 deletions
|
@ -25,6 +25,8 @@ extern "C" {
|
|||
#define CHIAKI_DISCOVERY_PROTOCOL_VERSION_PS4 "00020020"
|
||||
#define CHIAKI_DISCOVERY_PORT_PS5 9302
|
||||
#define CHIAKI_DISCOVERY_PROTOCOL_VERSION_PS5 "00030010"
|
||||
#define CHIAKI_DISCOVERY_PORT_LOCAL_MIN 9303
|
||||
#define CHIAKI_DISCOVERY_PORT_LOCAL_MAX 9319
|
||||
|
||||
typedef enum chiaki_discovery_cmd_t
|
||||
{
|
||||
|
|
|
@ -152,27 +152,48 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_init(ChiakiDiscovery *discovery,
|
|||
return CHIAKI_ERR_NETWORK;
|
||||
}
|
||||
|
||||
memset(&discovery->local_addr, 0, sizeof(discovery->local_addr));
|
||||
discovery->local_addr.sa_family = family;
|
||||
if(family == AF_INET6)
|
||||
// First try CHIAKI_DISCOVERY_PORT_LOCAL_MIN..<MAX, then 0 (random)
|
||||
uint16_t port = CHIAKI_DISCOVERY_PORT_LOCAL_MIN;
|
||||
int r;
|
||||
while(true)
|
||||
{
|
||||
memset(&discovery->local_addr, 0, sizeof(discovery->local_addr));
|
||||
discovery->local_addr.sa_family = family;
|
||||
if(family == AF_INET6)
|
||||
{
|
||||
#ifndef __SWITCH__
|
||||
struct in6_addr anyaddr = IN6ADDR_ANY_INIT;
|
||||
struct in6_addr anyaddr = IN6ADDR_ANY_INIT;
|
||||
#endif
|
||||
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&discovery->local_addr;
|
||||
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&discovery->local_addr;
|
||||
#ifndef __SWITCH__
|
||||
addr->sin6_addr = anyaddr;
|
||||
addr->sin6_addr = anyaddr;
|
||||
#endif
|
||||
addr->sin6_port = htons(0);
|
||||
}
|
||||
else // AF_INET
|
||||
{
|
||||
struct sockaddr_in *addr = (struct sockaddr_in *)&discovery->local_addr;
|
||||
addr->sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
addr->sin_port = htons(0);
|
||||
addr->sin6_port = htons(port);
|
||||
}
|
||||
else // AF_INET
|
||||
{
|
||||
struct sockaddr_in *addr = (struct sockaddr_in *)&discovery->local_addr;
|
||||
addr->sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
addr->sin_port = htons(port);
|
||||
}
|
||||
|
||||
r = bind(discovery->socket, &discovery->local_addr, sizeof(discovery->local_addr));
|
||||
if(r >= 0 || !port)
|
||||
break;
|
||||
if(port == CHIAKI_DISCOVERY_PORT_LOCAL_MAX)
|
||||
{
|
||||
port = 0;
|
||||
CHIAKI_LOGI(discovery->log, "Discovery failed to bind port %u, trying random",
|
||||
(unsigned int)port);
|
||||
}
|
||||
else
|
||||
{
|
||||
port++;
|
||||
CHIAKI_LOGI(discovery->log, "Discovery failed to bind port %u, trying one higher",
|
||||
(unsigned int)port);
|
||||
}
|
||||
}
|
||||
|
||||
int r = bind(discovery->socket, &discovery->local_addr, sizeof(discovery->local_addr));
|
||||
if(r < 0)
|
||||
{
|
||||
CHIAKI_LOGE(discovery->log, "Discovery failed to bind");
|
||||
|
|
|
@ -238,7 +238,7 @@ static void discovery_service_host_received(ChiakiDiscoveryHost *host, void *use
|
|||
if(service->hosts_count == service->options.hosts_max)
|
||||
{
|
||||
CHIAKI_LOGE(service->log, "Discovery Service received new host, but no space available");
|
||||
goto r2con;
|
||||
goto rzcon;
|
||||
}
|
||||
|
||||
CHIAKI_LOGI(service->log, "Discovery Service detected new host with id %s", host->host_id);
|
||||
|
@ -279,7 +279,7 @@ static void discovery_service_host_received(ChiakiDiscoveryHost *host, void *use
|
|||
if(change)
|
||||
discovery_service_report_state(service);
|
||||
|
||||
r2con:
|
||||
rzcon:
|
||||
chiaki_mutex_unlock(&service->state_mutex);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue