summaryrefslogtreecommitdiffstats
path: root/xmrstak/net/jpsock.cpp
diff options
context:
space:
mode:
authorpsychocrypt <psychocrypt@users.noreply.github.com>2017-11-16 12:12:40 +0100
committerGitHub <noreply@github.com>2017-11-16 12:12:40 +0100
commit1dc874c542a23c36dd65ea0f5b9cb65e3c3a572a (patch)
treebbebd1f9969dbd09283fba5cb3ef9fc170dc0400 /xmrstak/net/jpsock.cpp
parent2c3a3484757f242cf20b8e2ca2d89cfe01f64888 (diff)
parent41eb0ad64e6d003368ccf8f3212f190a829aae10 (diff)
downloadxmr-stak-1dc874c542a23c36dd65ea0f5b9cb65e3c3a572a.zip
xmr-stak-1dc874c542a23c36dd65ea0f5b9cb65e3c3a572a.tar.gz
Merge pull request #115 from fireice-uk/topic-net-ext
Network extensions
Diffstat (limited to 'xmrstak/net/jpsock.cpp')
-rw-r--r--xmrstak/net/jpsock.cpp79
1 files changed, 72 insertions, 7 deletions
diff --git a/xmrstak/net/jpsock.cpp b/xmrstak/net/jpsock.cpp
index cb586d2..5769448 100644
--- a/xmrstak/net/jpsock.cpp
+++ b/xmrstak/net/jpsock.cpp
@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <assert.h>
+#include <algorithm>
#include "jpsock.hpp"
#include "socks.hpp"
@@ -33,9 +34,6 @@
#include "xmrstak/misc/jext.hpp"
#include "xmrstak/version.hpp"
-
-#define AGENTID_STR XMR_STAK_NAME "/" XMR_STAK_VERSION
-
using namespace rapidjson;
struct jpsock::call_rsp
@@ -366,10 +364,11 @@ bool jpsock::process_pool_job(const opq_json_val* params)
if (!params->val->IsObject())
return set_socket_error("PARSE error: Job error 1");
- const Value * blob, *jobid, *target;
+ const Value *blob, *jobid, *target, *motd;
jobid = GetObjectMember(*params->val, "job_id");
blob = GetObjectMember(*params->val, "blob");
target = GetObjectMember(*params->val, "target");
+ motd = GetObjectMember(*params->val, "motd");
if (jobid == nullptr || blob == nullptr || target == nullptr ||
!jobid->IsString() || !blob->IsString() || !target->IsString())
@@ -415,6 +414,19 @@ bool jpsock::process_pool_job(const opq_json_val* params)
else
return set_socket_error("PARSE error: Job error 5");
+ if(motd != nullptr && motd->IsString() && (motd->GetStringLength() & 0x01) == 0)
+ {
+ std::unique_lock<std::mutex>(motd_mutex);
+ if(motd->GetStringLength() > 0)
+ {
+ pool_motd.resize(motd->GetStringLength()/2 + 1);
+ if(!hex2bin(motd->GetString(), motd->GetStringLength(), (unsigned char*)&pool_motd.front()))
+ pool_motd.clear();
+ }
+ else
+ pool_motd.clear();
+ }
+
iJobDiff = t64_to_diff(oPoolJob.iTarget);
executor::inst()->push_event(ex_event(oPoolJob, pool_id));
@@ -426,6 +438,7 @@ bool jpsock::process_pool_job(const opq_json_val* params)
bool jpsock::connect(std::string& sConnectError)
{
+ ext_algo = ext_backend = ext_hashcount = ext_motd = false;
bHaveSocketError = false;
sSocketError.clear();
iJobDiff = 0;
@@ -527,6 +540,7 @@ bool jpsock::cmd_login()
const Value* id = GetObjectMember(*oResult.val, "id");
const Value* job = GetObjectMember(*oResult.val, "job");
+ const Value* ext = GetObjectMember(*oResult.val, "extensions");
if (id == nullptr || job == nullptr || !id->IsString())
{
@@ -545,6 +559,29 @@ bool jpsock::cmd_login()
memset(sMinerId, 0, sizeof(sMinerId));
memcpy(sMinerId, id->GetString(), id->GetStringLength());
+ if(ext != nullptr && ext->IsArray())
+ {
+ for(size_t i=0; i < ext->Size(); i++)
+ {
+ const Value& jextname = ext->GetArray()[i];
+
+ if(!jextname.IsString())
+ continue;
+
+ std::string tmp(jextname.GetString());
+ std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
+
+ if(tmp == "algo")
+ ext_algo = true;
+ else if(tmp == "backend")
+ ext_backend = true;
+ else if(tmp == "hashcount")
+ ext_hashcount = true;
+ else if(tmp == "motd")
+ ext_motd = true;
+ }
+ }
+
opq_json_val v(job);
if(!process_pool_job(&v))
{
@@ -558,20 +595,33 @@ bool jpsock::cmd_login()
return true;
}
-bool jpsock::cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bResult)
+bool jpsock::cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bResult, xmrstak::iBackend* bend, bool algo_full_cn)
{
char cmd_buffer[1024];
char sNonce[9];
char sResult[65];
+ /*Extensions*/
+ char sAlgo[64] = {0};
+ char sBackend[64] = {0};
+ char sHashcount[64] = {0};
+ if(ext_backend)
+ snprintf(sBackend, sizeof(sBackend), ",\"backend\":\"%s\"", xmrstak::iBackend::getName(bend->backendType));
+
+ if(ext_hashcount)
+ snprintf(sHashcount, sizeof(sHashcount), ",\"hashcount\":%llu", int_port(bend->iHashCount.load(std::memory_order_relaxed)));
+
+ if(ext_algo)
+ snprintf(sAlgo, sizeof(sAlgo), ",\"algo\":\"%s\"", algo_full_cn ? "cryptonight" : "cryptonight-lite");
+
bin2hex((unsigned char*)&iNonce, 4, sNonce);
sNonce[8] = '\0';
bin2hex(bResult, 32, sResult);
sResult[64] = '\0';
- snprintf(cmd_buffer, sizeof(cmd_buffer), "{\"method\":\"submit\",\"params\":{\"id\":\"%s\",\"job_id\":\"%s\",\"nonce\":\"%s\",\"result\":\"%s\"},\"id\":1}\n",
- sMinerId, sJobId, sNonce, sResult);
+ snprintf(cmd_buffer, sizeof(cmd_buffer), "{\"method\":\"submit\",\"params\":{\"id\":\"%s\",\"job_id\":\"%s\",\"nonce\":\"%s\",\"result\":\"%s\"%s%s%s},\"id\":1}\n",
+ sMinerId, sJobId, sNonce, sResult, sBackend, sHashcount, sAlgo);
opq_json_val oResult(nullptr);
return cmd_ret_wait(cmd_buffer, oResult);
@@ -594,6 +644,21 @@ bool jpsock::get_current_job(pool_job& job)
return true;
}
+bool jpsock::get_pool_motd(std::string& strin)
+{
+ if(!ext_motd)
+ return false;
+
+ std::unique_lock<std::mutex>(motd_mutex);
+ if(pool_motd.size() > 0)
+ {
+ strin.assign(pool_motd);
+ return true;
+ }
+
+ return false;
+}
+
inline unsigned char hf_hex2bin(char c, bool &err)
{
if (c >= '0' && c <= '9')
OpenPOWER on IntegriCloud