summaryrefslogtreecommitdiffstats
path: root/xmrstak/net
diff options
context:
space:
mode:
Diffstat (limited to 'xmrstak/net')
-rw-r--r--xmrstak/net/jpsock.cpp59
-rw-r--r--xmrstak/net/jpsock.hpp8
-rw-r--r--xmrstak/net/msgstruct.hpp5
-rw-r--r--xmrstak/net/socket.cpp26
-rw-r--r--xmrstak/net/socket.hpp4
-rw-r--r--xmrstak/net/socks.hpp3
6 files changed, 85 insertions, 20 deletions
diff --git a/xmrstak/net/jpsock.cpp b/xmrstak/net/jpsock.cpp
index 7ee09e7..95bcc9c 100644
--- a/xmrstak/net/jpsock.cpp
+++ b/xmrstak/net/jpsock.cpp
@@ -24,6 +24,7 @@
#include <stdarg.h>
#include <assert.h>
#include <algorithm>
+#include <chrono>
#include "jpsock.hpp"
#include "socks.hpp"
@@ -92,8 +93,8 @@ struct jpsock::opq_json_val
opq_json_val(const Value* val) : val(val) {}
};
-jpsock::jpsock(size_t id, const char* sAddr, const char* sLogin, const char* sPassword, double pool_weight, bool dev_pool, bool tls, const char* tls_fp, bool nicehash) :
- net_addr(sAddr), usr_login(sLogin), usr_pass(sPassword), tls_fp(tls_fp), pool_id(id), pool_weight(pool_weight), pool(dev_pool), nicehash(nicehash),
+jpsock::jpsock(size_t id, const char* sAddr, const char* sLogin, const char* sRigId, const char* sPassword, double pool_weight, bool dev_pool, bool tls, const char* tls_fp, bool nicehash) :
+ net_addr(sAddr), usr_login(sLogin), usr_rigid(sRigId), usr_pass(sPassword), tls_fp(tls_fp), pool_id(id), pool_weight(pool_weight), pool(dev_pool), nicehash(nicehash),
connect_time(0), connect_attempts(0), disconnect_time(0), quiet_close(false)
{
sock_init();
@@ -133,6 +134,7 @@ jpsock::~jpsock()
std::string&& jpsock::get_call_error()
{
+ call_error = false;
return std::move(prv->oCallRsp.sCallErr);
}
@@ -189,11 +191,25 @@ bool jpsock::set_socket_error_strerr(const char* a, int res)
void jpsock::jpsock_thread()
{
jpsock_thd_main();
+
+ if(!bHaveSocketError)
+ set_socket_error("Socket closed.");
+
executor::inst()->push_event(ex_event(std::move(sSocketError), quiet_close, pool_id));
- // If a call is wating, send an error to end it
- bool bCallWaiting = false;
std::unique_lock<std::mutex> mlock(call_mutex);
+ bool bWait = prv->oCallRsp.pCallData != nullptr;
+
+ // If a call is waiting, wait a little bit before blowing it out of the water
+ if(bWait)
+ {
+ mlock.unlock();
+ std::this_thread::sleep_for(std::chrono::milliseconds(500));
+ mlock.lock();
+ }
+
+ // If the call is still there send an error to end it
+ bool bCallWaiting = false;
if(prv->oCallRsp.pCallData != nullptr)
{
prv->oCallRsp.bHaveResponse = true;
@@ -348,6 +364,7 @@ bool jpsock::process_line(char* line, size_t len)
{
prv->oCallRsp.pCallData = nullptr;
prv->oCallRsp.sCallErr.assign(sError, iErrorLn);
+ call_error = true;
}
else
prv->oCallRsp.pCallData->CopyFrom(*mt, prv->callAllocator);
@@ -440,6 +457,7 @@ bool jpsock::connect(std::string& sConnectError)
{
ext_algo = ext_backend = ext_hashcount = ext_motd = false;
bHaveSocketError = false;
+ call_error = false;
sSocketError.clear();
iJobDiff = 0;
connect_attempts++;
@@ -523,8 +541,8 @@ bool jpsock::cmd_login()
{
char cmd_buffer[1024];
- snprintf(cmd_buffer, sizeof(cmd_buffer), "{\"method\":\"login\",\"params\":{\"login\":\"%s\",\"pass\":\"%s\",\"agent\":\"%s\"},\"id\":1}\n",
- usr_login.c_str(), usr_pass.c_str(), get_version_str().c_str());
+ snprintf(cmd_buffer, sizeof(cmd_buffer), "{\"method\":\"login\",\"params\":{\"login\":\"%s\",\"pass\":\"%s\",\"rigid\":\"%s\",\"agent\":\"%s\"},\"id\":1}\n",
+ usr_login.c_str(), usr_pass.c_str(), usr_rigid.c_str(), get_version_str().c_str());
opq_json_val oResult(nullptr);
@@ -596,7 +614,7 @@ bool jpsock::cmd_login()
return true;
}
-bool jpsock::cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bResult, xmrstak::iBackend* bend, bool algo_full_cn)
+bool jpsock::cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bResult, const char* backend_name, uint64_t backend_hashcount, uint64_t total_hashcount, xmrstak_algo algo)
{
char cmd_buffer[1024];
char sNonce[9];
@@ -604,16 +622,35 @@ bool jpsock::cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bRes
/*Extensions*/
char sAlgo[64] = {0};
char sBackend[64] = {0};
- char sHashcount[64] = {0};
+ char sHashcount[128] = {0};
if(ext_backend)
- snprintf(sBackend, sizeof(sBackend), ",\"backend\":\"%s\"", xmrstak::iBackend::getName(bend->backendType));
+ snprintf(sBackend, sizeof(sBackend), ",\"backend\":\"%s\"", backend_name);
if(ext_hashcount)
- snprintf(sHashcount, sizeof(sHashcount), ",\"hashcount\":%llu", int_port(bend->iHashCount.load(std::memory_order_relaxed)));
+ snprintf(sHashcount, sizeof(sHashcount), ",\"hashcount\":%llu,\"hashcount_total\":%llu", int_port(backend_hashcount), int_port(total_hashcount));
if(ext_algo)
- snprintf(sAlgo, sizeof(sAlgo), ",\"algo\":\"%s\"", algo_full_cn ? "cryptonight" : "cryptonight-lite");
+ {
+ const char* algo_name;
+ switch(algo)
+ {
+ case cryptonight:
+ algo_name = "cryptonight";
+ break;
+ case cryptonight_lite:
+ algo_name = "cryptonight-lite";
+ break;
+ case cryptonight_monero:
+ algo_name = "cryptonight-monero";
+ break;
+ default:
+ algo_name = "unknown";
+ break;
+ }
+
+ snprintf(sAlgo, sizeof(sAlgo), ",\"algo\":\"%s\"", algo_name);
+ }
bin2hex((unsigned char*)&iNonce, 4, sNonce);
sNonce[8] = '\0';
diff --git a/xmrstak/net/jpsock.hpp b/xmrstak/net/jpsock.hpp
index 9d276b7..2ddeeee 100644
--- a/xmrstak/net/jpsock.hpp
+++ b/xmrstak/net/jpsock.hpp
@@ -2,6 +2,7 @@
#include "xmrstak/backend/iBackend.hpp"
#include "msgstruct.hpp"
+#include "xmrstak/jconf.hpp"
#include <mutex>
#include <atomic>
@@ -27,14 +28,14 @@ class base_socket;
class jpsock
{
public:
- jpsock(size_t id, const char* sAddr, const char* sLogin, const char* sPassword, double pool_weight, bool dev_pool, bool tls, const char* tls_fp, bool nicehash);
+ jpsock(size_t id, const char* sAddr, const char* sLogin, const char* sRigId, const char* sPassword, double pool_weight, bool dev_pool, bool tls, const char* tls_fp, bool nicehash);
~jpsock();
bool connect(std::string& sConnectError);
void disconnect(bool quiet = false);
bool cmd_login();
- bool cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bResult, xmrstak::iBackend* bend, bool algo_full_cn);
+ bool cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bResult, const char* backend_name, uint64_t backend_hashcount, uint64_t total_hashcount, xmrstak_algo algo);
static bool hex2bin(const char* in, unsigned int len, unsigned char* out);
static void bin2hex(const unsigned char* in, unsigned int len, char* out);
@@ -62,6 +63,7 @@ public:
bool get_pool_motd(std::string& strin);
std::string&& get_call_error();
+ bool have_call_error() { return call_error; }
bool have_sock_error() { return bHaveSocketError; }
inline static uint64_t t32_to_t64(uint32_t t) { return 0xFFFFFFFFFFFFFFFFULL / (0xFFFFFFFFULL / ((uint64_t)t)); }
@@ -82,6 +84,7 @@ public:
private:
std::string net_addr;
std::string usr_login;
+ std::string usr_rigid;
std::string usr_pass;
std::string tls_fp;
@@ -105,6 +108,7 @@ private:
std::atomic<bool> bRunning;
std::atomic<bool> bLoggedIn;
std::atomic<bool> quiet_close;
+ std::atomic<bool> call_error;
uint8_t* bJsonRecvMem;
uint8_t* bJsonParseMem;
diff --git a/xmrstak/net/msgstruct.hpp b/xmrstak/net/msgstruct.hpp
index a5affc8..8c4bdbe 100644
--- a/xmrstak/net/msgstruct.hpp
+++ b/xmrstak/net/msgstruct.hpp
@@ -66,8 +66,9 @@ struct sock_err
// Unlike socket errors, GPU errors are read-only strings
struct gpu_res_err
{
+ size_t idx; // GPU index
const char* error_str;
- gpu_res_err(const char* error_str) : error_str(error_str) {}
+ gpu_res_err(const char* error_str, size_t idx) : error_str(error_str), idx(idx) {}
};
enum ex_event_name { EV_INVALID_VAL, EV_SOCK_READY, EV_SOCK_ERROR, EV_GPU_RES_ERROR,
@@ -99,7 +100,7 @@ struct ex_event
};
ex_event() { iName = EV_INVALID_VAL; iPoolId = 0;}
- ex_event(const char* gpu_err, size_t id) : iName(EV_GPU_RES_ERROR), iPoolId(id), oGpuError(gpu_err) {}
+ ex_event(const char* gpu_err, size_t gpu_idx, size_t id) : iName(EV_GPU_RES_ERROR), iPoolId(id), oGpuError(gpu_err, gpu_idx) {}
ex_event(std::string&& err, bool silent, size_t id) : iName(EV_SOCK_ERROR), iPoolId(id), oSocketError(std::move(err), silent) { }
ex_event(job_result dat, size_t id) : iName(EV_MINER_HAVE_RESULT), iPoolId(id), oJobResult(dat) {}
ex_event(pool_job dat, size_t id) : iName(EV_POOL_HAVE_JOB), iPoolId(id), oPoolJob(dat) {}
diff --git a/xmrstak/net/socket.cpp b/xmrstak/net/socket.cpp
index e19d1d4..7c58a8e 100644
--- a/xmrstak/net/socket.cpp
+++ b/xmrstak/net/socket.cpp
@@ -48,6 +48,7 @@ bool plain_socket::set_hostname(const char* sAddr)
char sAddrMb[256];
char *sTmp, *sPort;
+ sock_closed = false;
size_t ln = strlen(sAddr);
if (ln >= sizeof(sAddrMb))
return pCallback->set_socket_error("CONNECT error: Pool address overflow.");
@@ -117,11 +118,16 @@ bool plain_socket::set_hostname(const char* sAddr)
return pCallback->set_socket_error_strerr("CONNECT error: Socket creation failed ");
}
+ int flag = 1;
+ /* If it fails, it fails, we won't loose too much sleep over it */
+ setsockopt(hSocket, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));
+
return true;
}
bool plain_socket::connect()
{
+ sock_closed = false;
int ret = ::connect(hSocket, pSockAddr->ai_addr, (int)pSockAddr->ai_addrlen);
freeaddrinfo(pAddrRoot);
@@ -135,6 +141,9 @@ bool plain_socket::connect()
int plain_socket::recv(char* buf, unsigned int len)
{
+ if(sock_closed)
+ return 0;
+
int ret = ::recv(hSocket, buf, len, 0);
if(ret == 0)
@@ -167,6 +176,7 @@ void plain_socket::close(bool free)
{
if(hSocket != INVALID_SOCKET)
{
+ sock_closed = true;
sock_close(hSocket);
hSocket = INVALID_SOCKET;
}
@@ -190,7 +200,7 @@ void tls_socket::print_error()
if(jconf::inst()->TlsSecureAlgos())
pCallback->set_socket_error("Unknown TLS error. Secure TLS maybe unsupported, try setting tls_secure_algo to false.");
else
- pCallback->set_socket_error("Unknown TLS error.");
+ pCallback->set_socket_error("Unknown TLS error. You might be trying to connect to a non-TLS port.");
}
else
pCallback->set_socket_error(buf, len);
@@ -211,12 +221,13 @@ void tls_socket::init_ctx()
if(jconf::inst()->TlsSecureAlgos())
{
- SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_COMPRESSION);
+ SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1);
}
}
bool tls_socket::set_hostname(const char* sAddr)
{
+ sock_closed = false;
if(ctx == nullptr)
{
init_ctx();
@@ -233,6 +244,10 @@ bool tls_socket::set_hostname(const char* sAddr)
return false;
}
+ int flag = 1;
+ /* If it fails, it fails, we won't loose too much sleep over it */
+ setsockopt(BIO_get_fd(bio, nullptr), IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));
+
if(BIO_set_conn_hostname(bio, sAddr) != 1)
{
print_error();
@@ -248,7 +263,7 @@ bool tls_socket::set_hostname(const char* sAddr)
if(jconf::inst()->TlsSecureAlgos())
{
- if(SSL_set_cipher_list(ssl, "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4:!SHA1") != 1)
+ if(SSL_set_cipher_list(ssl, "HIGH:!aNULL:!PSK:!SRP:!MD5:!RC4:!SHA1") != 1)
{
print_error();
return false;
@@ -260,6 +275,7 @@ bool tls_socket::set_hostname(const char* sAddr)
bool tls_socket::connect()
{
+ sock_closed = false;
if(BIO_do_connect(bio) != 1)
{
print_error();
@@ -340,6 +356,9 @@ bool tls_socket::connect()
int tls_socket::recv(char* buf, unsigned int len)
{
+ if(sock_closed)
+ return 0;
+
int ret = BIO_read(bio, buf, len);
if(ret == 0)
@@ -360,6 +379,7 @@ void tls_socket::close(bool free)
if(bio == nullptr || ssl == nullptr)
return;
+ sock_closed = true;
if(!free)
{
sock_close(BIO_get_fd(bio, nullptr));
diff --git a/xmrstak/net/socket.hpp b/xmrstak/net/socket.hpp
index 192a32c..b09142d 100644
--- a/xmrstak/net/socket.hpp
+++ b/xmrstak/net/socket.hpp
@@ -1,5 +1,6 @@
#pragma once
+#include <atomic>
#include "socks.hpp"
class jpsock;
@@ -12,6 +13,9 @@ public:
virtual int recv(char* buf, unsigned int len) = 0;
virtual bool send(const char* buf) = 0;
virtual void close(bool free) = 0;
+
+protected:
+ std::atomic<bool> sock_closed;
};
class plain_socket : public base_socket
diff --git a/xmrstak/net/socks.hpp b/xmrstak/net/socks.hpp
index 1d25d3a..86749e5 100644
--- a/xmrstak/net/socks.hpp
+++ b/xmrstak/net/socks.hpp
@@ -62,9 +62,8 @@ inline const char* sock_gai_strerror(int err, char* buf, size_t len)
#include <unistd.h> /* Needed for close() */
#include <errno.h>
#include <string.h>
-#if defined(__FreeBSD__)
#include <netinet/in.h> /* Needed for IPPROTO_TCP */
-#endif
+#include <netinet/tcp.h>
inline void sock_init() {}
typedef int SOCKET;
OpenPOWER on IntegriCloud