From 718ebe04b6f8f3caac0600781a03cfdeb067cf65 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Feb 2018 15:01:32 +0200 Subject: [PATCH] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_include.h | 4 ++- iguana/exchanges/LP_network.c | 31 ++++++++++++++++----- iguana/exchanges/LP_peers.c | 46 ++++++++++++++++++-------------- iguana/exchanges/LP_signatures.c | 2 +- 5 files changed, 56 insertions(+), 29 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 8df4c6f77..3db38bf3f 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -761,7 +761,7 @@ jpg(srcfile, destfile, power2=7, password, data="", required, ind=0)\n\ } if ( jint(argjson,"ispaired") != 0 ) { - retstr = LP_psock(&psock,myipaddr,1,jint(argjson,"cmdchannel")); + retstr = LP_psock(&psock,myipaddr,1,jint(argjson,"cmdchannel"),jbits256(argjson,"mypub")); //printf("LP_commands.(%s)\n",retstr); return(retstr); } diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index e881f883e..3bf578f72 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -361,9 +361,10 @@ struct LP_address struct LP_peerinfo { UT_hash_handle hh; + bits256 pubkey; uint64_t ip_port; uint32_t recvtime,numrecv,ipbits,errortime,errors,numpeers,needping,lasttime,connected,lastutxos,lastpeers,diduquery,good,sessionid; - int32_t pushsock,subsock,isLP; + int32_t pushsock,subsock,isLP,pairsock; uint16_t port,netid; char ipaddr[64]; }; @@ -544,6 +545,7 @@ int32_t LP_listunspent_both(char *symbol,char *coinaddr,int32_t fullflag); uint16_t LP_randpeer(char *destip); void LP_tradebot_pauseall(); void LP_portfolio_reset(); +struct LP_pubkey_info *LP_pubkeyadd(bits256 pubkey); uint32_t LP_atomic_locktime(char *base,char *rel); struct LP_pubkey_info *LP_pubkeyfind(bits256 pubkey); char *issue_LP_psock(char *destip,uint16_t destport,int32_t ispaired,int32_t cmdchannel); diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 4e627c8ab..a6a5b3dc5 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -621,9 +621,9 @@ int32_t LP_psockmark(char *publicaddr) return(retval); } -char *_LP_psock_create(int32_t *pullsockp,int32_t *pubsockp,char *ipaddr,uint16_t publicport,uint16_t subport,int32_t ispaired,int32_t cmdchannel) +char *_LP_psock_create(int32_t *pullsockp,int32_t *pubsockp,char *ipaddr,uint16_t publicport,uint16_t subport,int32_t ispaired,int32_t cmdchannel,bits256 pubkey) { - int32_t pullsock,pubsock,arg; char pushaddr[128],subaddr[128]; cJSON *retjson = 0; + int32_t i,pullsock,pubsock,arg; struct LP_pubkey_info *pubp; char pushaddr[128],subaddr[128]; cJSON *retjson = 0; pullsock = pubsock = -1; *pullsockp = *pubsockp = -1; nanomsg_transportname(1,pushaddr,ipaddr,publicport); @@ -647,6 +647,25 @@ char *_LP_psock_create(int32_t *pullsockp,int32_t *pubsockp,char *ipaddr,uint16_ nanomsg_transportname(0,pushaddr,ipaddr,publicport); nanomsg_transportname(0,subaddr,ipaddr,subport); LP_psockadd(ispaired,pullsock,publicport,pubsock,subport,subaddr,pushaddr,cmdchannel); + if ( IAMLP != 0 && bits256_nonz(pubkey) != 0 ) + { + char str[65]; + if ( (pubp= LP_pubkeyadd(pubkey)) != 0 ) + { + if ( pubp->pairsock > 0 ) + { + printf("warning %s already has pairsock.%d, mark for purge\n",bits256_str(str,pubkey),pubp->pairsock); + for (i=0; ipairsock ) + { + PSOCKS[i].lasttime = (uint32_t)time(NULL) - PSOCK_KEEPALIVE - 1; + break; + } + } + printf("pairsock for %s <- %d\n",bits256_str(str,pubkey),pubp->pairsock); + pubp->pairsock = pullsock; + } + } retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); jaddstr(retjson,"LPipaddr",ipaddr); @@ -671,7 +690,7 @@ char *_LP_psock_create(int32_t *pullsockp,int32_t *pubsockp,char *ipaddr,uint16_ return(0); } -char *LP_psock(int32_t *pubsockp,char *ipaddr,int32_t ispaired,int32_t cmdchannel) +char *LP_psock(int32_t *pubsockp,char *ipaddr,int32_t ispaired,int32_t cmdchannel,bits256 pubkey) { char *retstr=0; uint16_t i,publicport,subport,maxport; int32_t pullsock=-1; *pubsockp = -1; @@ -693,7 +712,7 @@ char *LP_psock(int32_t *pubsockp,char *ipaddr,int32_t ispaired,int32_t cmdchanne publicport = MIN_PSOCK_PORT+1; if ( cmdchannel == 0 && subport <= publicport ) subport = publicport + 1; - if ( (retstr= _LP_psock_create(&pullsock,pubsockp,ipaddr,publicport,subport,ispaired,cmdchannel)) != 0 ) + if ( (retstr= _LP_psock_create(&pullsock,pubsockp,ipaddr,publicport,subport,ispaired,cmdchannel,pubkey)) != 0 ) { //printf("LP_psock returns.(%s)\n",retstr); return(retstr); @@ -722,8 +741,8 @@ char *LP_psock(int32_t *pubsockp,char *ipaddr,int32_t ispaired,int32_t cmdchanne char *issue_LP_psock(char *destip,uint16_t destport,int32_t ispaired,int32_t cmdchannel) { - char url[512],*retstr; - sprintf(url,"http://%s:%u/api/stats/psock?ispaired=%d&cmdchannel=%d",destip,destport-1,ispaired,cmdchannel); + char str[65],url[512],*retstr; + sprintf(url,"http://%s:%u/api/stats/psock?ispaired=%d&cmdchannel=%d&mypub=%s",destip,destport-1,ispaired,cmdchannel,bits256_str(str,G.LP_mypub25519)); //return(LP_issue_curl("psock",destip,destport,url)); retstr = issue_curlt(url,LP_HTTP_TIMEOUT*3); printf("issue_LP_psock got (%s) from %s\n",retstr,url); diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 8d83e46b0..89a36938e 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -56,6 +56,21 @@ char *LP_peers() return(jprint(peersjson,1)); } +void LP_cmdchannel(struct LP_peerinfo *peer) +{ + char connectaddr[128],publicaddr[128],*retstr; int32_t pubsock; uint16_t cmdport; + if ( strcmp(G.USERPASS,"1d8b27b21efabcd96571cd56f91a40fb9aa4cc623d273c63bf9223dc6f8cd81f") == 0 ) + return; + if ( (cmdport= LP_psock_get(connectaddr,publicaddr,1,1,peer->ipaddr)) != 0 ) + { + if ( (retstr= _LP_psock_create(&peer->pairsock,&pubsock,peer->ipaddr,cmdport,cmdport,1,1,G.LP_mypub25519)) != 0 ) + { + printf("cmdchannel created %s\n",retstr); + free(retstr); + } + } else printf("error getting cmdchannel with %s\n",peer->ipaddr); +} + struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char *ipaddr,uint16_t port,uint16_t pushport,uint16_t subport,int32_t isLP,uint32_t sessionid,uint16_t netid) { uint32_t ipbits; int32_t valid,pushsock,subsock,timeout; char checkip[64],pushaddr[64],subaddr[64]; struct LP_peerinfo *peer = 0; @@ -79,6 +94,8 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char if ( (peer->isLP= isLP) != 0 ) LP_numactive_LP++; } + if ( IAMLP == 0 && peer->pairsock == 0 ) + LP_cmdchannel(peer); /*if ( numpeers > peer->numpeers ) peer->numpeers = numpeers; if ( numutxos > peer->numutxos ) @@ -117,8 +134,6 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_MAXTTL,&timeout,sizeof(timeout)); timeout = 100; nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - //maxsize = 2 * 1024 * 1024; - //nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDBUF,&maxsize,sizeof(maxsize)); printf("connected to push.(%s) pushsock.%d valid.%d | ",pushaddr,pushsock,valid); peer->connected = (uint32_t)time(NULL); peer->pushsock = pushsock; @@ -128,12 +143,9 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); nanomsg_transportname(0,subaddr,peer->ipaddr,subport); - //nanomsg_transportname2(0,subaddr2,peer->ipaddr,subport); valid = 0; if ( nn_connect(subsock,subaddr) >= 0 ) valid++; - //if ( nn_connect(subsock,subaddr2) >= 0 ) - // valid++; if ( valid > 0 ) { peer->subsock = subsock; @@ -165,19 +177,8 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char printf("_LPaddpeer %s -> numpeers.%d mypubsock.%d other.(%d)\n",ipaddr,mypeer->numpeers,mypubsock,isLP); } else peer->numpeers = 1; // will become mypeer portable_mutex_unlock(&LP_peermutex); - if ( IAMLP == 0 ) - { - char connectaddr[128],publicaddr[128],*retstr; int32_t pullsock,pubsock; uint16_t cmdport; - if ( (cmdport= LP_psock_get(connectaddr,publicaddr,1,1,peer->ipaddr)) != 0 ) - { - printf("call _LP_psock_create\n"); - if ( (retstr= _LP_psock_create(&pullsock,&pubsock,peer->ipaddr,cmdport,cmdport,1,1)) != 0 ) - { - printf("cmdchannel! %s\n",retstr); - free(retstr); - } - } else printf("error getting cmdchannel with %s\n",peer->ipaddr); - } + if ( IAMLP == 0 && peer->pairsock == 0 ) + LP_cmdchannel(peer); } else printf("%s invalid pushsock.%d or subsock.%d\n",peer->ipaddr,peer->pushsock,peer->subsock); } } else printf("LP_addpeer: checkip.(%s) vs (%s)\n",checkip,ipaddr); @@ -230,13 +231,18 @@ void LP_closepeers() return(bussock); }*/ -void LP_peer_recv(char *ipaddr,int32_t ismine) +void LP_peer_recv(char *ipaddr,int32_t ismine,struct LP_pubkey_info *pubp) { struct LP_peerinfo *peer; if ( (peer= LP_peerfind((uint32_t)calc_ipbits(ipaddr),RPC_port)) != 0 ) { peer->numrecv++; - //if ( ismine != 0 ) + if ( ismine != 0 && (bits256_nonz(peer->pubkey) == 0 || pubp->pairsock <= 0) ) + { + peer->pubkey = pubp->pubkey; + pubp->pairsock = peer->pairsock; + char str[65]; printf("set pubkey for %s <- %s, pairsock.%d\n",ipaddr,bits256_str(str,pubp->pubkey),pubp->pairsock); + } peer->recvtime = (uint32_t)time(NULL); } } diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 296c9c5ee..aec6acc69 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -561,7 +561,7 @@ char *LP_notify_recv(cJSON *argjson) if ( (ipaddr= jstr(argjson,"isLP")) != 0 ) { //printf("notify got isLP %s %d\n",ipaddr,jint(argjson,"ismine")); - LP_peer_recv(ipaddr,jint(argjson,"ismine")); + LP_peer_recv(ipaddr,jint(argjson,"ismine"),pubp); if ( IAMLP != 0 && G.LP_IAMLP == 0 && strcmp(ipaddr,LP_myipaddr) == 0 ) { if ( bits256_cmp(pub,G.LP_mypub25519) != 0 )