Added support for connecting the hub to an upstream master hub (slave mode).
This commit is contained in:
parent
a7898779cb
commit
51fba8a7a1
@ -841,6 +841,15 @@ struct hub_info* hub_start_service(struct hub_config* config)
|
||||
|
||||
// Start the hub command sub-system
|
||||
hub->commands = command_initialize(hub);
|
||||
|
||||
#ifdef LINK_SUPPORT
|
||||
if (*config->hub_link_connect)
|
||||
{
|
||||
link_connect_uri(hub, config->hub_link_connect);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
return hub;
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "uhub.h"
|
||||
|
||||
#ifdef LINK_SUPPORT
|
||||
static int link_send_support(struct hub_link* link);
|
||||
|
||||
static void link_net_event(struct net_connection* con, int event, void *arg)
|
||||
{
|
||||
@ -56,7 +57,8 @@ static void link_net_event(struct net_connection* con, int event, void *arg)
|
||||
|
||||
void link_disconnect(struct hub_link* link)
|
||||
{
|
||||
net_con_close(link->connection);
|
||||
if (link->connection)
|
||||
net_con_close(link->connection);
|
||||
link->connection = NULL;
|
||||
|
||||
ioq_send_destroy(link->send_queue);
|
||||
@ -96,22 +98,92 @@ struct hub_link* link_create(struct hub_info* hub, struct net_connection* con, s
|
||||
return link;
|
||||
}
|
||||
|
||||
struct hub_link* link_connect(struct hub_info* hub, const char* address)
|
||||
static void link_connect_callback(struct net_connect_handle* handle, enum net_connect_status status, struct net_connection* con, void* ptr)
|
||||
{
|
||||
struct hub_link* link = link_create_internal(hub);
|
||||
struct hub_link* link = (struct hub_link*) ptr;
|
||||
link->connect_job = NULL;
|
||||
|
||||
// FIXME - no IPv6 support, no DNS resolution, no failover addresses etc.
|
||||
int sd = net_socket_create(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
if (sd == -1)
|
||||
LOG_DEBUG("link_connect_callback()");
|
||||
|
||||
switch (status)
|
||||
{
|
||||
hub_free(link);
|
||||
case net_connect_status_ok:
|
||||
link->connection = con;
|
||||
net_con_reinitialize(link->connection, link_net_event, link, NET_EVENT_READ);
|
||||
// FIXME: send handshake here
|
||||
link_send_support(link);
|
||||
break;
|
||||
|
||||
case net_connect_status_host_not_found:
|
||||
case net_connect_status_no_address:
|
||||
case net_connect_status_dns_error:
|
||||
case net_connect_status_refused:
|
||||
case net_connect_status_unreachable:
|
||||
case net_connect_status_timeout:
|
||||
case net_connect_status_socket_error:
|
||||
// FIXME: Unable to connect - start timer and re-try connection establishment!
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
struct link_address
|
||||
{
|
||||
char host[256];
|
||||
uint16_t port;
|
||||
};
|
||||
|
||||
static int link_parse_address(const char* arg, struct link_address* addr)
|
||||
{
|
||||
int port;
|
||||
char* split;
|
||||
|
||||
memset(addr, 0, sizeof(struct link_address));
|
||||
|
||||
/* Split hostname and port (if possible) */
|
||||
split = strrchr(arg, ':');
|
||||
if (split == 0 || strlen(split) < 2 || strlen(split) > 6)
|
||||
return 0;
|
||||
|
||||
/* Ensure port number is valid */
|
||||
port = strtol(split+1, NULL, 10);
|
||||
if (port <= 0 || port > 65535)
|
||||
return 0;
|
||||
|
||||
memcpy(addr->host, arg, &split[0] - &arg[0]);
|
||||
addr->port = port;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
struct hub_link* link_connect_uri(struct hub_info* hub, const char* address)
|
||||
{
|
||||
struct link_address link_address;
|
||||
if (!link_parse_address(address, &link_address))
|
||||
{
|
||||
LOG_INFO("Invalid master hub link address");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
link->connection = net_con_create();
|
||||
net_con_initialize(link->connection, sd, link_net_event, link, 0);
|
||||
return link_connect(hub, link_address.host, link_address.port);
|
||||
}
|
||||
|
||||
|
||||
struct hub_link* link_connect(struct hub_info* hub, const char* address, uint16_t port)
|
||||
{
|
||||
struct hub_link* link = link_create_internal(hub);
|
||||
|
||||
LOG_DEBUG("Connecting to master link at %s:%d...", address, port);
|
||||
|
||||
link->mode = link_mode_client;
|
||||
link->connect_job = net_con_connect(address, port, link_connect_callback, link);
|
||||
if (!link->connect_job)
|
||||
{
|
||||
// FIXME: Immediate failure!
|
||||
LOG_DEBUG("Error connecting to master hub link.");
|
||||
link_disconnect(link);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return link;
|
||||
}
|
||||
|
||||
@ -433,4 +505,4 @@ int link_handle_read(struct hub_link* link)
|
||||
}
|
||||
|
||||
|
||||
#endif /* LINK_SUPPORT */
|
||||
#endif /* LINK_SUPPORT */
|
||||
|
@ -32,6 +32,7 @@ struct hub_link
|
||||
struct ioq_send* send_queue;
|
||||
struct ioq_recv* recv_queue;
|
||||
struct net_connection* connection; /** Connection data */
|
||||
struct net_connect_handle* connect_job; /** Only used when establishing a connection in client mode */
|
||||
struct hub_info* hub;
|
||||
int flags;
|
||||
};
|
||||
@ -44,7 +45,8 @@ extern struct hub_link* link_create(struct hub_info* hub, struct net_connection*
|
||||
/**
|
||||
* Connect this hub to an upstream server (act as a link client).
|
||||
*/
|
||||
extern struct hub_link* link_connect(struct hub_info* hub, const char* address);
|
||||
extern struct hub_link* link_connect(struct hub_info* hub, const char* address, uint16_t port);
|
||||
extern struct hub_link* link_connect_uri(struct hub_info* hub, const char* address);
|
||||
|
||||
/**
|
||||
* Disconnect a link connection.
|
||||
|
Loading…
Reference in New Issue
Block a user