Implement Wakeup

This commit is contained in:
Florian Märkl 2019-08-16 22:32:41 +02:00
commit 4fadc02947
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
9 changed files with 132 additions and 8 deletions

View file

@ -35,13 +35,15 @@ extern "C" {
typedef enum chiaki_discovery_cmd_t
{
CHIAKI_DISCOVERY_CMD_SRCH
CHIAKI_DISCOVERY_CMD_SRCH,
CHIAKI_DISCOVERY_CMD_WAKEUP
} ChiakiDiscoveryCmd;
typedef struct chiaki_discovery_packet_t
{
ChiakiDiscoveryCmd cmd;
char *protocol_version;
uint64_t user_credential; // for wakeup, this is just the regist key interpreted as hex
} ChiakiDiscoveryPacket;
typedef enum chiaki_discovery_host_state_t

View file

@ -26,6 +26,7 @@
#include <netdb.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <arpa/inet.h>
const char *chiaki_discovery_host_state_string(ChiakiDiscoveryHostState state)
@ -49,6 +50,16 @@ CHIAKI_EXPORT int chiaki_discovery_packet_fmt(char *buf, size_t buf_size, Chiaki
case CHIAKI_DISCOVERY_CMD_SRCH:
return snprintf(buf, buf_size, "SRCH * HTTP/1.1\ndevice-discovery-protocol-version:%s\n",
version_str);
case CHIAKI_DISCOVERY_CMD_WAKEUP:
return snprintf(buf, buf_size,
"WAKEUP * HTTP/1.1\n"
"client-type:vr\n"
"auth-type:R\n"
"model:w\n"
"app-type:r\n"
"user-credential:%llu\n"
"device-discovery-protocol-version:%s\n",
(unsigned long long)packet->user_credential, version_str);
default:
return -1;
}
@ -169,7 +180,10 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_send(ChiakiDiscovery *discovery,
ssize_t rc = sendto(discovery->socket, buf, (size_t)len + 1, 0, addr, addr_size);
if(rc < 0)
{
CHIAKI_LOGE(discovery->log, "Discovery failed to send: %s", strerror(errno));
return CHIAKI_ERR_NETWORK;
}
return CHIAKI_ERR_SUCCESS;
}

View file

@ -346,7 +346,7 @@ static int regist_search_connect(ChiakiRegist *regist, struct addrinfo *addrinfo
}
in_addr_t ip = ((struct sockaddr_in *)send_addr)->sin_addr.s_addr;
((struct sockaddr_in *)send_addr)->sin_addr.s_addr = INADDR_ANY;
((struct sockaddr_in *)send_addr)->sin_addr.s_addr = htonl(INADDR_ANY);
r = bind(sock, send_addr, *send_addr_len);
((struct sockaddr_in *)send_addr)->sin_addr.s_addr = ip;
if(r < 0)