|
|
@ -1032,17 +1032,16 @@ static proxy_t *__generate_proxy(sdata_t *sdata, const int id) |
|
|
|
|
|
|
|
|
|
|
|
proxy->id = id; |
|
|
|
proxy->id = id; |
|
|
|
HASH_ADD_INT(sdata->proxies, id, proxy); |
|
|
|
HASH_ADD_INT(sdata->proxies, id, proxy); |
|
|
|
proxy->sdata = duplicate_sdata(sdata); |
|
|
|
|
|
|
|
return proxy; |
|
|
|
return proxy; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static proxy_t *__generate_subproxy(proxy_t *proxy, const int id) |
|
|
|
static proxy_t *__generate_subproxy(sdata_t *sdata, proxy_t *proxy, const int id) |
|
|
|
{ |
|
|
|
{ |
|
|
|
proxy_t *subproxy = ckzalloc(sizeof(proxy_t)); |
|
|
|
proxy_t *subproxy = ckzalloc(sizeof(proxy_t)); |
|
|
|
|
|
|
|
|
|
|
|
subproxy->id = id; |
|
|
|
subproxy->id = id; |
|
|
|
HASH_ADD_INT(proxy->subproxies, id, subproxy); |
|
|
|
HASH_ADD_INT(proxy->subproxies, id, subproxy); |
|
|
|
subproxy->sdata = proxy->sdata; |
|
|
|
proxy->sdata = duplicate_sdata(sdata); |
|
|
|
subproxy->parent = proxy; |
|
|
|
subproxy->parent = proxy; |
|
|
|
return subproxy; |
|
|
|
return subproxy; |
|
|
|
} |
|
|
|
} |
|
|
@ -1061,13 +1060,13 @@ static proxy_t *__proxy_by_id(sdata_t *sdata, const int id) |
|
|
|
return proxy; |
|
|
|
return proxy; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static proxy_t *__subproxy_by_id(proxy_t *proxy, const int id) |
|
|
|
static proxy_t *__subproxy_by_id(sdata_t *sdata, proxy_t *proxy, const int id) |
|
|
|
{ |
|
|
|
{ |
|
|
|
proxy_t *subproxy; |
|
|
|
proxy_t *subproxy; |
|
|
|
|
|
|
|
|
|
|
|
HASH_FIND_INT(proxy->subproxies, &id, subproxy); |
|
|
|
HASH_FIND_INT(proxy->subproxies, &id, subproxy); |
|
|
|
if (!subproxy) |
|
|
|
if (!subproxy) |
|
|
|
subproxy = __generate_subproxy(proxy, id); |
|
|
|
subproxy = __generate_subproxy(sdata, proxy, id); |
|
|
|
return subproxy; |
|
|
|
return subproxy; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1088,7 +1087,7 @@ static proxy_t *subproxy_by_id(sdata_t *sdata, const int id, const int subid) |
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(&sdata->proxy_lock); |
|
|
|
mutex_lock(&sdata->proxy_lock); |
|
|
|
proxy = __proxy_by_id(sdata, id); |
|
|
|
proxy = __proxy_by_id(sdata, id); |
|
|
|
subproxy = __subproxy_by_id(proxy, subid); |
|
|
|
subproxy = __subproxy_by_id(sdata, proxy, subid); |
|
|
|
mutex_unlock(&sdata->proxy_lock); |
|
|
|
mutex_unlock(&sdata->proxy_lock); |
|
|
|
|
|
|
|
|
|
|
|
return subproxy; |
|
|
|
return subproxy; |
|
|
@ -1924,7 +1923,7 @@ static void set_proxy(sdata_t *sdata, const char *buf) |
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(&sdata->proxy_lock); |
|
|
|
mutex_lock(&sdata->proxy_lock); |
|
|
|
proxy = __proxy_by_id(sdata, id); |
|
|
|
proxy = __proxy_by_id(sdata, id); |
|
|
|
subproxy = __subproxy_by_id(proxy, subid); |
|
|
|
subproxy = __subproxy_by_id(sdata, proxy, subid); |
|
|
|
sdata->proxy = proxy; |
|
|
|
sdata->proxy = proxy; |
|
|
|
mutex_unlock(&sdata->proxy_lock); |
|
|
|
mutex_unlock(&sdata->proxy_lock); |
|
|
|
|
|
|
|
|
|
|
@ -2179,23 +2178,39 @@ static bool new_enonce1(sdata_t *sdata, stratum_instance_t *client) |
|
|
|
|
|
|
|
|
|
|
|
static void stratum_send_message(sdata_t *sdata, const stratum_instance_t *client, const char *msg); |
|
|
|
static void stratum_send_message(sdata_t *sdata, const stratum_instance_t *client, const char *msg); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Choose the stratifier data for a new client. Use the main ckp_sdata except
|
|
|
|
|
|
|
|
* in proxy mode where we find a subproxy based on the current proxy with room |
|
|
|
|
|
|
|
* for more clients. Signal the generator to recruit more subproxies if we are |
|
|
|
|
|
|
|
* running out of room. */ |
|
|
|
|
|
|
|
static sdata_t *select_sdata(const ckpool_t *ckp, sdata_t *ckp_sdata) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (!ckp->proxy || ckp->passthrough) |
|
|
|
|
|
|
|
return ckp_sdata; |
|
|
|
|
|
|
|
if (!ckp_sdata->proxy) |
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
/* FIXME: Choose a subproxy, not the parent proxy */ |
|
|
|
|
|
|
|
return ckp_sdata->proxy->sdata; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Extranonce1 must be set here. Needs to be entered with client holding a ref
|
|
|
|
/* Extranonce1 must be set here. Needs to be entered with client holding a ref
|
|
|
|
* count. */ |
|
|
|
* count. */ |
|
|
|
static json_t *parse_subscribe(stratum_instance_t *client, const int64_t client_id, const json_t *params_val) |
|
|
|
static json_t *parse_subscribe(stratum_instance_t *client, const int64_t client_id, const json_t *params_val) |
|
|
|
{ |
|
|
|
{ |
|
|
|
sdata_t *sdata = client->ckp->data; |
|
|
|
ckpool_t *ckp = client->ckp; |
|
|
|
|
|
|
|
sdata_t *sdata, *ckp_sdata = ckp->data; |
|
|
|
bool old_match = false; |
|
|
|
bool old_match = false; |
|
|
|
int arr_size; |
|
|
|
int arr_size; |
|
|
|
json_t *ret; |
|
|
|
json_t *ret; |
|
|
|
int n2len; |
|
|
|
int n2len; |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!json_is_array(params_val))) { |
|
|
|
if (unlikely(!json_is_array(params_val))) { |
|
|
|
stratum_send_message(sdata, client, "Invalid json: params not an array"); |
|
|
|
stratum_send_message(ckp_sdata, client, "Invalid json: params not an array"); |
|
|
|
return json_string("params not an array"); |
|
|
|
return json_string("params not an array"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!sdata->current_workbase)) { |
|
|
|
sdata = select_sdata(ckp, ckp_sdata); |
|
|
|
stratum_send_message(sdata, client, "Pool Initialising"); |
|
|
|
if (unlikely(!sdata || !sdata->current_workbase)) { |
|
|
|
|
|
|
|
stratum_send_message(ckp_sdata, client, "Pool Initialising"); |
|
|
|
return json_string("Initialising"); |
|
|
|
return json_string("Initialising"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|