Commit b3864d1a94a8be8aa5c900e1ba97c9fb209ee410

Con Kolivas 2012-11-15T09:18:58

Support for fractional diffs and the classic just-below-1 share all FFs diff target.

diff --git a/cgminer.c b/cgminer.c
index baa380c..cdf15a9 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -5078,17 +5078,27 @@ static void gen_hash(unsigned char *data, unsigned char *hash, int len)
  * 0x00000000ffff0000000000000000000000000000000000000000000000000000
  * so we use a big endian 64 bit unsigned integer centred on the 5th byte to
  * cover a huge range of difficulty targets, though not all 256 bits' worth */
-static void set_work_target(struct work *work, int diff)
+static void set_work_target(struct work *work, double diff)
 {
 	unsigned char rtarget[32], target[32];
+	double d64;
 	uint64_t *data64, h64;
 
-	h64 = diffone;
-	h64 /= (uint64_t)diff;
-	memset(rtarget, 0, 32);
-	data64 = (uint64_t *)(rtarget + 4);
-	*data64 = htobe64(h64);
-	swab256(target, rtarget);
+	d64 = diffone;
+	d64 /= diff;
+	h64 = d64;
+
+	if (h64) {
+		memset(rtarget, 0, 32);
+		data64 = (uint64_t *)(rtarget + 4);
+		*data64 = htobe64(h64);
+		swab256(target, rtarget);
+	} else {
+		/* Support for the classic all FFs just-below-1 diff */
+		memset(target, 0xff, 28);
+		memset(&target[28], 0, 4);
+	}
+
 	if (opt_debug) {
 		char *htarget = bin2hex(target, 32);
 
diff --git a/miner.h b/miner.h
index 2b52eaa..6e33152 100644
--- a/miner.h
+++ b/miner.h
@@ -821,7 +821,7 @@ struct stratum_work {
 	bool clean;
 
 	int merkles;
-	int diff;
+	double diff;
 };
 
 #define RECVSIZE 8192
@@ -966,7 +966,7 @@ struct work {
 	char 		job_id[64];
 	char		nonce2[64];
 	char		ntime[16];
-	int		sdiff;
+	double		sdiff;
 
 	bool		gbt;
 	char		gbt_coinbase[512];
diff --git a/util.c b/util.c
index 072c5ce..d5c2e54 100644
--- a/util.c
+++ b/util.c
@@ -1131,17 +1131,17 @@ static bool parse_notify(struct pool *pool, json_t *val)
 
 static bool parse_diff(struct pool *pool, json_t *val)
 {
-	int diff;
+	double diff;
 
-	diff = json_integer_value(json_array_get(val, 0));
-	if (diff < 1)
+	diff = json_number_value(json_array_get(val, 0));
+	if (diff == 0)
 		return false;
 
 	mutex_lock(&pool->pool_lock);
 	pool->swork.diff = diff;
 	mutex_unlock(&pool->pool_lock);
 
-	applog(LOG_DEBUG, "Pool %d difficulty set to %d", pool->pool_no, diff);
+	applog(LOG_DEBUG, "Pool %d difficulty set to %f", pool->pool_no, diff);
 
 	return true;
 }
@@ -1266,24 +1266,20 @@ bool auth_stratum(struct pool *pool)
 	sprintf(s, "{\"id\": %d, \"method\": \"mining.authorize\", \"params\": [\"%s\", \"%s\"]}",
 		swork_id++, pool->rpc_user, pool->rpc_pass);
 
-	/* Parse all data prior sending auth request */
-	while (sock_full(pool, false)) {
+	if (!stratum_send(pool, s, strlen(s)))
+		goto out;
+
+	/* Parse all data in the queue and anything left should be auth */
+	while (42) {
 		sret = recv_line(pool);
-		if (!parse_method(pool, sret)) {
-			clear_sock(pool);
-			applog(LOG_INFO, "Failed to parse stratum buffer");
+		if (!sret)
+			goto out;
+		if (parse_method(pool, sret))
 			free(sret);
-			return ret;
-		}
-		free(sret);
+		else
+			break;
 	}
 
-	if (!stratum_send(pool, s, strlen(s)))
-		goto out;
-
-	sret = recv_line(pool);
-	if (!sret)
-		goto out;
 	val = JSON_LOADS(sret, &err);
 	free(sret);
 	res_val = json_object_get(val, "result");