From abde70a8d9425cfcdc16edaf9e8267c4ce3bc8fb Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Mon, 9 Feb 2015 16:27:25 +1100 Subject: [PATCH] Store the id and subid of the proxy in use by each client, submitting the value with its shares to the generator --- src/stratifier.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/stratifier.c b/src/stratifier.c index bf819694..c0b44a86 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -272,6 +272,9 @@ struct stratum_instance { int64_t suggest_diff; /* Stratum client suggested diff */ double best_diff; /* Best share found by this instance */ + + int proxyid; /* Which proxy this is bound to in proxy mode */ + int subproxyid; /* Which subproxy */ }; struct share { @@ -285,6 +288,7 @@ typedef struct share share_t; struct proxy_base { UT_hash_handle hh; int id; + int subid; double diff; @@ -2021,12 +2025,19 @@ static void __fill_enonce1data(const workbase_t *wb, stratum_instance_t *client) * When the proxy space is less than 32 bits to work with, we look for an * unused enonce1 value and reject clients instead if there is no space left. * Needs to be entered with client holding a ref count. */ -static bool new_enonce1(stratum_instance_t *client) +static bool new_enonce1(sdata_t *sdata, stratum_instance_t *client) { - sdata_t *sdata = client->ckp->data; int enonce1varlen, i; bool ret = false; + if (!sdata->proxy) + return false; + + mutex_lock(&sdata->proxy_lock); + client->proxyid = sdata->proxy->id; + client->subproxyid = sdata->proxy->subid; + mutex_unlock(&sdata->proxy_lock); + /* Extract the enonce1varlen from the current workbase which may be * a different workbase to when we __fill_enonce1data but the value * will not change and this avoids grabbing recursive locks */ @@ -2134,7 +2145,7 @@ static json_t *parse_subscribe(stratum_instance_t *client, const int64_t client_ client->useragent = ckzalloc(1); if (!old_match) { /* Create a new extranonce1 based on a uint64_t pointer */ - if (!new_enonce1(client)) { + if (!new_enonce1(sdata, client)) { stratum_send_message(sdata, client, "Pool full of clients"); client->reject = 2; return json_string("proxy full"); @@ -2977,9 +2988,10 @@ static void submit_share(stratum_instance_t *client, const int64_t jobid, const char *msg; sprintf(enonce2, "%s%s", client->enonce1var, nonce2); - JSON_CPACK(json_msg, "{sisssssssIsi}", "jobid", jobid, "nonce2", enonce2, + JSON_CPACK(json_msg, "{sisssssssIsisisi}", "jobid", jobid, "nonce2", enonce2, "ntime", ntime, "nonce", nonce, "client_id", client->id, - "msg_id", msg_id); + "msg_id", msg_id, "proxy", client->proxyid, + "subproxy", client->subproxyid); msg = json_dumps(json_msg, 0); json_decref(json_msg); send_generator(ckp, msg, GEN_LAX);