Browse Source

Fixed another closure bug. Updated debug levels

Joseph Henry 9 years ago
parent
commit
6338a4933b
5 changed files with 71 additions and 40 deletions
  1. 51 38
      netcon/NetconEthernetTap.cpp
  2. 14 1
      netcon/NetconUtilities.cpp
  3. 2 1
      netcon/NetconUtilities.hpp
  4. 3 0
      netcon/README.md
  5. 1 0
      osdep/Phy.hpp

+ 51 - 38
netcon/NetconEthernetTap.cpp

@@ -53,7 +53,8 @@
 
 
 #define APPLICATION_POLL_FREQ 				20
 #define APPLICATION_POLL_FREQ 				20
 #define ZT_LWIP_TCP_TIMER_INTERVAL 		10
 #define ZT_LWIP_TCP_TIMER_INTERVAL 		10
-#define STATUS_TMR_INTERVAL						100 // How often we check connection statuses
+#define STATUS_TMR_INTERVAL						1000 // How often we check connection statuses
+#define DEBUG_LEVEL 									3
 
 
 namespace ZeroTier {
 namespace ZeroTier {
 
 
@@ -350,26 +351,30 @@ void NetconEthernetTap::die(int exret) {
  */
  */
 void NetconEthernetTap::closeConnection(TcpConnection *conn)
 void NetconEthernetTap::closeConnection(TcpConnection *conn)
 {
 {
-	dwr(" closeConnection(%x, %d)\n", conn->pcb, _phy.getDescriptor(conn->dataSock));
-
+	dwr(3, " closeConnection(%x, %d)\n", conn->pcb, _phy.getDescriptor(conn->dataSock));
   //lwipstack->_tcp_sent(conn->pcb, NULL);
   //lwipstack->_tcp_sent(conn->pcb, NULL);
   //lwipstack->_tcp_recv(conn->pcb, NULL);
   //lwipstack->_tcp_recv(conn->pcb, NULL);
   //lwipstack->_tcp_err(conn->pcb, NULL);
   //lwipstack->_tcp_err(conn->pcb, NULL);
   //lwipstack->_tcp_poll(conn->pcb, NULL, 0);
   //lwipstack->_tcp_poll(conn->pcb, NULL, 0);
 	//lwipstack->_tcp_arg(conn->pcb, NULL);
 	//lwipstack->_tcp_arg(conn->pcb, NULL);
-	lwipstack->_tcp_close(conn->pcb);
-	if(conn->dataSock) {
-		close(_phy.getDescriptor(conn->dataSock));
-		_phy.close(conn->dataSock,false);
+	if(lwipstack->_tcp_close(conn->pcb) != ERR_OK) {
+		dwr(3, " closeConnection(): Error while calling tcp_close()\n");
+		exit(0);
 	}
 	}
-	/* Eventually we might want to use a map here instead */
-	for(int i=0; i<tcp_connections.size(); i++) {
-		if(tcp_connections[i] == conn) {
-			tcp_connections.erase(tcp_connections.begin() + i);
-			break;
+	else {
+		if(conn->dataSock) {
+			close(_phy.getDescriptor(conn->dataSock));
+			_phy.close(conn->dataSock,false);
+		}
+		/* Eventually we might want to use a map here instead */
+		for(int i=0; i<tcp_connections.size(); i++) {
+			if(tcp_connections[i] == conn) {
+				tcp_connections.erase(tcp_connections.begin() + i);
+				delete conn;
+				break;
+			}
 		}
 		}
 	}
 	}
-	delete conn;
 }
 }
 
 
 /*
 /*
@@ -456,14 +461,14 @@ void NetconEthernetTap::threadMain()
 						}
 						}
 						else {
 						else {
 							// Here we should handle the case there there is incoming data (?)
 							// Here we should handle the case there there is incoming data (?)
-							dwr(" tap_thread(): Listening socketpair closed. Removing RPC connection (%d)\n",
+							dwr(3, " tap_thread(): Listening socketpair closed. Removing RPC connection (%d)\n",
 								_phy.getDescriptor(tcp_connections[i]->dataSock));
 								_phy.getDescriptor(tcp_connections[i]->dataSock));
 							closeConnection(tcp_connections[i]);
 							closeConnection(tcp_connections[i]);
 						}
 						}
 					}
 					}
 				}
 				}
 			}
 			}
-			//dwr(" tap_thread(): tcp_conns = %d, rpc_socks = %d\n", tcp_connections.size(), rpc_sockets.size());
+			//dwr(4, " tap_thread(): tcp_conns = %d, rpc_socks = %d\n", tcp_connections.size(), rpc_sockets.size());
 			for(size_t i=0, associated = 0; i<rpc_sockets.size(); i++, associated = 0) {
 			for(size_t i=0, associated = 0; i<rpc_sockets.size(); i++, associated = 0) {
 				for(size_t j=0; j<tcp_connections.size(); j++) {
 				for(size_t j=0; j<tcp_connections.size(); j++) {
 					if (tcp_connections[j]->rpcSock == rpc_sockets[i])
 					if (tcp_connections[j]->rpcSock == rpc_sockets[i])
@@ -476,7 +481,7 @@ void NetconEthernetTap::threadMain()
 					unsigned char tmpbuf[BUF_SZ];
 					unsigned char tmpbuf[BUF_SZ];
 					int n;
 					int n;
 					if((n = read(fd,&tmpbuf,BUF_SZ)) < 0) {
 					if((n = read(fd,&tmpbuf,BUF_SZ)) < 0) {
-						dwr(" tap_thread(): RPC close(%d)\n", _phy.getDescriptor(rpc_sockets[i]));
+						dwr(3, " tap_thread(): RPC close(%d)\n", _phy.getDescriptor(rpc_sockets[i]));
 						closeClient(rpc_sockets[i]);
 						closeClient(rpc_sockets[i]);
 					}
 					}
 					// < 0 is failure
 					// < 0 is failure
@@ -484,7 +489,7 @@ void NetconEthernetTap::threadMain()
 					// > 0 RPC data read, handle it
 					// > 0 RPC data read, handle it
 					else if (n > 0) {
 					else if (n > 0) {
 							// Handle RPC call, this is rare
 							// Handle RPC call, this is rare
-							dwr(" tap_thread(): RPC read during connection check (%d bytes)\n", n);
+							dwr(3, " tap_thread(): RPC read during connection check (%d bytes)\n", n);
 							phyOnUnixData(rpc_sockets[i],_phy.getuptr(rpc_sockets[i]),&tmpbuf,BUF_SZ);
 							phyOnUnixData(rpc_sockets[i],_phy.getuptr(rpc_sockets[i]),&tmpbuf,BUF_SZ);
 					}
 					}
 				}
 				}
@@ -519,6 +524,8 @@ void NetconEthernetTap::phyOnTcpWritable(PhySocket *sock,void **uptr) {}
 
 
 void NetconEthernetTap::phyOnUnixClose(PhySocket *sock,void **uptr)
 void NetconEthernetTap::phyOnUnixClose(PhySocket *sock,void **uptr)
 {
 {
+	dwr(1, "phyOnUnixClose(): ?\n");
+	die(0);
 	// FIXME: What do?
 	// FIXME: What do?
 }
 }
 
 
@@ -538,7 +545,7 @@ void NetconEthernetTap::phyOnFileDescriptorActivity(PhySocket *sock,void **uptr,
 		}
 		}
 	}
 	}
 	else {
 	else {
-		dwr("phyOnFileDescriptorActivity(): PhySocket not readable\n");
+		dwr(5, "phyOnFileDescriptorActivity(): PhySocket not readable\n");
 	}
 	}
 }
 }
 
 
@@ -547,10 +554,10 @@ void NetconEthernetTap::phyOnFileDescriptorActivity(PhySocket *sock,void **uptr,
  */
  */
 void NetconEthernetTap::phyOnUnixAccept(PhySocket *sockL,PhySocket *sockN,void **uptrL,void **uptrN) {
 void NetconEthernetTap::phyOnUnixAccept(PhySocket *sockL,PhySocket *sockN,void **uptrL,void **uptrN) {
 	if(find(rpc_sockets.begin(), rpc_sockets.end(), sockN) != rpc_sockets.end()){
 	if(find(rpc_sockets.begin(), rpc_sockets.end(), sockN) != rpc_sockets.end()){
-		dwr("SockN (0x%x) already exists!\n", sockN);
+		dwr(3, " phyOnUnixAccept(): SockN (0x%x) already exists!\n", sockN);
 		return;
 		return;
 	}
 	}
-	dwr("phyOnUnixAccept(): push_back( 0x%x )\n", sockN);
+	dwr(3, " phyOnUnixAccept(): push_back(0x%x)\n", sockN);
 	rpc_sockets.push_back(sockN);
 	rpc_sockets.push_back(sockN);
 }
 }
 
 
@@ -563,7 +570,7 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock,void **uptr,void *data,uns
 	switch(buf[0])
 	switch(buf[0])
 	{
 	{
 		case RPC_SOCKET:
 		case RPC_SOCKET:
-			dwr("RPC_SOCKET\n");
+			dwr(3, "RPC_SOCKET\n");
 	    struct socket_st socket_rpc;
 	    struct socket_st socket_rpc;
 			pid_t pid;
 			pid_t pid;
 			memcpy(&pid, &buf[1], sizeof(pid_t)); // PID for client RPC tracking (only for debug)
 			memcpy(&pid, &buf[1], sizeof(pid_t)); // PID for client RPC tracking (only for debug)
@@ -575,29 +582,29 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock,void **uptr,void *data,uns
 			}
 			}
 			break;
 			break;
 	  case RPC_LISTEN:
 	  case RPC_LISTEN:
-			dwr("RPC_LISTEN\n");
+			dwr(3, "RPC_LISTEN\n");
 	    struct listen_st listen_rpc;
 	    struct listen_st listen_rpc;
 	    memcpy(&listen_rpc, &buf[1], sizeof(struct listen_st));
 	    memcpy(&listen_rpc, &buf[1], sizeof(struct listen_st));
 	    handle_listen(sock, uptr, &listen_rpc);
 	    handle_listen(sock, uptr, &listen_rpc);
 			break;
 			break;
 	  case RPC_BIND:
 	  case RPC_BIND:
-			dwr("RPC_BIND\n");
+			dwr(3, "RPC_BIND\n");
 	    struct bind_st bind_rpc;
 	    struct bind_st bind_rpc;
 	    memcpy(&bind_rpc, &buf[1], sizeof(struct bind_st));
 	    memcpy(&bind_rpc, &buf[1], sizeof(struct bind_st));
 	    handle_bind(sock, uptr, &bind_rpc);
 	    handle_bind(sock, uptr, &bind_rpc);
 			break;
 			break;
   	case RPC_CONNECT:
   	case RPC_CONNECT:
-			dwr("RPC_CONNECT\n");
+			dwr(3, "RPC_CONNECT\n");
 	    struct connect_st connect_rpc;
 	    struct connect_st connect_rpc;
 	    memcpy(&connect_rpc, &buf[1], sizeof(struct connect_st));
 	    memcpy(&connect_rpc, &buf[1], sizeof(struct connect_st));
 	    handle_connect(sock, uptr, &connect_rpc);
 	    handle_connect(sock, uptr, &connect_rpc);
 			break;
 			break;
 	  case RPC_MAP:
 	  case RPC_MAP:
-			dwr("RPC_MAP\n");
+			dwr(3, "RPC_MAP\n");
 	    handle_retval(sock, uptr, buf);
 	    handle_retval(sock, uptr, buf);
 			break;
 			break;
 		case RPC_MAP_REQ:
 		case RPC_MAP_REQ:
-			dwr("RPC_MAP_REQ\n");
+			dwr(3, "RPC_MAP_REQ\n");
 			handle_map_request(sock, uptr, buf);
 			handle_map_request(sock, uptr, buf);
 			break;
 			break;
 		default:
 		default:
@@ -615,7 +622,7 @@ int NetconEthernetTap::send_return_value(TcpConnection *conn, int retval, int _e
 		if(n > 0)
 		if(n > 0)
 			conn->pending = false;
 			conn->pending = false;
 		else {
 		else {
-			dwr("Unable to send return value to the intercept. Closing connection\n");
+			dwr(" Unable to send return value to the intercept. Closing connection\n");
 			closeConnection(conn);
 			closeConnection(conn);
 		}
 		}
 		return n;
 		return n;
@@ -625,7 +632,7 @@ int NetconEthernetTap::send_return_value(TcpConnection *conn, int retval, int _e
 
 
 int NetconEthernetTap::send_return_value(int fd, int retval, int _errno = 0)
 int NetconEthernetTap::send_return_value(int fd, int retval, int _errno = 0)
 {
 {
-	dwr(" send_return_value(): fd = %d, retval = %d, errno = %d\n", fd, retval, _errno);
+	dwr(3, " send_return_value(): fd = %d, retval = %d, errno = %d\n", fd, retval, _errno);
 	int sz = sizeof(char) + sizeof(retval) + sizeof(errno);
 	int sz = sizeof(char) + sizeof(retval) + sizeof(errno);
 	char retmsg[sz];
 	char retmsg[sz];
 	memset(&retmsg, '\0', sizeof(retmsg));
 	memset(&retmsg, '\0', sizeof(retmsg));
@@ -685,7 +692,7 @@ int NetconEthernetTap::send_return_value(int fd, int retval, int _errno = 0)
  */
  */
 err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
 err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
 {
 {
-	dwr("nc_accept()\n");
+	dwr(4, "nc_accept()\n");
 	Larg *l = (Larg*)arg;
 	Larg *l = (Larg*)arg;
 	TcpConnection *conn = l->conn;
 	TcpConnection *conn = l->conn;
 	NetconEthernetTap *tap = l->tap;
 	NetconEthernetTap *tap = l->tap;
@@ -706,9 +713,9 @@ err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
 		new_tcp_conn->pcb = newpcb;
 		new_tcp_conn->pcb = newpcb;
 		new_tcp_conn->their_fd = fds[1];
 		new_tcp_conn->their_fd = fds[1];
 		tap->tcp_connections.push_back(new_tcp_conn);
 		tap->tcp_connections.push_back(new_tcp_conn);
-		dwr("socketpair = {%d, %d}\n", fds[0], fds[1]);
+		dwr(4, "socketpair = {%d, %d}\n", fds[0], fds[1]);
 		int n, send_fd = tap->_phy.getDescriptor(conn->rpcSock);
 		int n, send_fd = tap->_phy.getDescriptor(conn->rpcSock);
-		dwr("write(%d,...)\n", listening_fd);
+		dwr(4, "write(%d,...)\n", listening_fd);
 		//int n = write(listening_fd, "z", 1); // accept() in library waits for this byte
 		//int n = write(listening_fd, "z", 1); // accept() in library waits for this byte
 		if((n = send(listening_fd, "z", 1, MSG_NOSIGNAL)) < 0) {
 		if((n = send(listening_fd, "z", 1, MSG_NOSIGNAL)) < 0) {
 			dwr(" nc_accept(): Error: [send(listening_fd,...) = MSG_NOSIGNAL].\n");
 			dwr(" nc_accept(): Error: [send(listening_fd,...) = MSG_NOSIGNAL].\n");
@@ -756,6 +763,7 @@ err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
  */
  */
 err_t NetconEthernetTap::nc_recved(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
 err_t NetconEthernetTap::nc_recved(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
 {
 {
+	dwr(5, " nc_recved()\n");
 	Larg *l = (Larg*)arg;
 	Larg *l = (Larg*)arg;
 	int n;
 	int n;
   struct pbuf* q = p;
   struct pbuf* q = p;
@@ -806,6 +814,7 @@ err_t NetconEthernetTap::nc_recved(void *arg, struct tcp_pcb *tpcb, struct pbuf
  */
  */
 void NetconEthernetTap::nc_err(void *arg, err_t err)
 void NetconEthernetTap::nc_err(void *arg, err_t err)
 {
 {
+	dwr(3, "nc_err()\n");
 	Larg *l = (Larg*)arg;
 	Larg *l = (Larg*)arg;
 	if(!l->conn)
 	if(!l->conn)
 		dwr("nc_err(): Connection is NULL!\n");
 		dwr("nc_err(): Connection is NULL!\n");
@@ -913,6 +922,7 @@ err_t NetconEthernetTap::nc_poll(void* arg, struct tcp_pcb *tpcb)
  */
  */
 err_t NetconEthernetTap::nc_sent(void* arg, struct tcp_pcb *tpcb, u16_t len)
 err_t NetconEthernetTap::nc_sent(void* arg, struct tcp_pcb *tpcb, u16_t len)
 {
 {
+	dwr(5, " nc_sent()\n");
 	Larg *l = (Larg*)arg;
 	Larg *l = (Larg*)arg;
 	if(len) {
 	if(len) {
 		l->tap->_phy.setNotifyReadable(l->conn->dataSock, true);
 		l->tap->_phy.setNotifyReadable(l->conn->dataSock, true);
@@ -933,7 +943,7 @@ err_t NetconEthernetTap::nc_sent(void* arg, struct tcp_pcb *tpcb, u16_t len)
  */
  */
 err_t NetconEthernetTap::nc_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
 err_t NetconEthernetTap::nc_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
 {
 {
-	dwr("nc_connected()\n");
+	dwr(3, " nc_connected()\n");
 	Larg *l = (Larg*)arg;
 	Larg *l = (Larg*)arg;
 	l->tap->send_return_value(l->conn, ERR_OK);
 	l->tap->send_return_value(l->conn, ERR_OK);
 	return ERR_OK;
 	return ERR_OK;
@@ -951,6 +961,7 @@ err_t NetconEthernetTap::nc_connected(void *arg, struct tcp_pcb *tpcb, err_t err
 */
 */
 void NetconEthernetTap::handle_map_request(PhySocket *sock, void **uptr, unsigned char* buf)
 void NetconEthernetTap::handle_map_request(PhySocket *sock, void **uptr, unsigned char* buf)
 {
 {
+	dwr(4, " handle_map_request()\n");
 	TcpConnection *conn = (TcpConnection*)*uptr;
 	TcpConnection *conn = (TcpConnection*)*uptr;
 	int req_fd;
 	int req_fd;
 	memcpy(&req_fd, &buf[1], sizeof(req_fd));
 	memcpy(&req_fd, &buf[1], sizeof(req_fd));
@@ -976,6 +987,7 @@ void NetconEthernetTap::handle_map_request(PhySocket *sock, void **uptr, unsigne
  */
  */
 void NetconEthernetTap::handle_retval(PhySocket *sock, void **uptr, unsigned char* buf)
 void NetconEthernetTap::handle_retval(PhySocket *sock, void **uptr, unsigned char* buf)
 {
 {
+	dwr(4, " handle_retval()\n");
 	TcpConnection *conn = (TcpConnection*)*uptr;
 	TcpConnection *conn = (TcpConnection*)*uptr;
 	if(!conn->pending)
 	if(!conn->pending)
 		return;
 		return;
@@ -984,7 +996,7 @@ void NetconEthernetTap::handle_retval(PhySocket *sock, void **uptr, unsigned cha
 	memcpy(&(conn->perceived_fd), &buf[1], sizeof(int));
 	memcpy(&(conn->perceived_fd), &buf[1], sizeof(int));
 	conn->pending = false;
 	conn->pending = false;
 
 
-	dwr(" handle_retval(): CONN:%x - Mapping [our=%d -> their=%d]\n",conn,
+	dwr(4, " handle_retval(): CONN:%x - Mapping [our=%d -> their=%d]\n",conn,
 	_phy.getDescriptor(conn->dataSock), conn->perceived_fd);
 	_phy.getDescriptor(conn->dataSock), conn->perceived_fd);
 
 
 	/* Check for pre-existing connection for this socket ---
 	/* Check for pre-existing connection for this socket ---
@@ -1049,6 +1061,7 @@ void NetconEthernetTap::handle_retval(PhySocket *sock, void **uptr, unsigned cha
  */
  */
 void NetconEthernetTap::handle_bind(PhySocket *sock, void **uptr, struct bind_st *bind_rpc)
 void NetconEthernetTap::handle_bind(PhySocket *sock, void **uptr, struct bind_st *bind_rpc)
 {
 {
+	dwr(3, " handle_bind()\n");
   struct sockaddr_in *connaddr;
   struct sockaddr_in *connaddr;
   connaddr = (struct sockaddr_in *) &bind_rpc->addr;
   connaddr = (struct sockaddr_in *) &bind_rpc->addr;
   int conn_port = lwipstack->ntohs(connaddr->sin_port);
   int conn_port = lwipstack->ntohs(connaddr->sin_port);
@@ -1111,14 +1124,14 @@ void NetconEthernetTap::handle_bind(PhySocket *sock, void **uptr, struct bind_st
  */
  */
 void NetconEthernetTap::handle_listen(PhySocket *sock, void **uptr, struct listen_st *listen_rpc)
 void NetconEthernetTap::handle_listen(PhySocket *sock, void **uptr, struct listen_st *listen_rpc)
 {
 {
-	dwr(" handle_listen(their=%d):\n", listen_rpc->sockfd);
+	dwr(3, " handle_listen(their=%d):\n", listen_rpc->sockfd);
 	TcpConnection *conn = getConnectionByTheirFD(sock, listen_rpc->sockfd);
 	TcpConnection *conn = getConnectionByTheirFD(sock, listen_rpc->sockfd);
 	if(!conn){
 	if(!conn){
 		dwr(" handle_listen(): unable to locate connection object\n");
 		dwr(" handle_listen(): unable to locate connection object\n");
 		// ? send_return_value(conn, -1, EBADF);
 		// ? send_return_value(conn, -1, EBADF);
 		return;
 		return;
 	}
 	}
-	dwr(" handle_listen(our=%d -> their=%d)\n", _phy.getDescriptor(conn->dataSock), conn->perceived_fd);
+	dwr(3, " handle_listen(our=%d -> their=%d)\n", _phy.getDescriptor(conn->dataSock), conn->perceived_fd);
 
 
   if(conn->pcb->state == LISTEN) {
   if(conn->pcb->state == LISTEN) {
     dwr(" handle_listen(): PCB is already in listening state.\n");
     dwr(" handle_listen(): PCB is already in listening state.\n");
@@ -1189,9 +1202,7 @@ TcpConnection * NetconEthernetTap::handle_socket(PhySocket *sock, void **uptr, s
 {
 {
 	int rpc_fd = _phy.getDescriptor(sock);
 	int rpc_fd = _phy.getDescriptor(sock);
 	struct tcp_pcb *newpcb = lwipstack->tcp_new();
 	struct tcp_pcb *newpcb = lwipstack->tcp_new();
-
-	dwr(" handle_socket(): pcb=%x\n", newpcb);
-
+	dwr(3, " handle_socket(): pcb=%x\n", newpcb);
   if(newpcb != NULL) {
   if(newpcb != NULL) {
 		ZT_PHY_SOCKFD_TYPE fds[2];
 		ZT_PHY_SOCKFD_TYPE fds[2];
 		if(socketpair(PF_LOCAL, SOCK_STREAM, 0, fds) < 0) {
 		if(socketpair(PF_LOCAL, SOCK_STREAM, 0, fds) < 0) {
@@ -1260,6 +1271,7 @@ TcpConnection * NetconEthernetTap::handle_socket(PhySocket *sock, void **uptr, s
  */
  */
 void NetconEthernetTap::handle_connect(PhySocket *sock, void **uptr, struct connect_st* connect_rpc)
 void NetconEthernetTap::handle_connect(PhySocket *sock, void **uptr, struct connect_st* connect_rpc)
 {
 {
+	dwr(3, " handle_connect()\n");
 	TcpConnection *conn = (TcpConnection*)*uptr;
 	TcpConnection *conn = (TcpConnection*)*uptr;
 	struct sockaddr_in *connaddr;
 	struct sockaddr_in *connaddr;
 	connaddr = (struct sockaddr_in *) &connect_rpc->__addr;
 	connaddr = (struct sockaddr_in *) &connect_rpc->__addr;
@@ -1335,6 +1347,7 @@ void NetconEthernetTap::handle_connect(PhySocket *sock, void **uptr, struct conn
 
 
 void NetconEthernetTap::handle_write(TcpConnection *conn)
 void NetconEthernetTap::handle_write(TcpConnection *conn)
 {
 {
+	dwr(5, " handle_write()\n");
 	float max = (float)TCP_SND_BUF;
 	float max = (float)TCP_SND_BUF;
 	int r;
 	int r;
 
 

+ 14 - 1
netcon/NetconUtilities.cpp

@@ -40,15 +40,28 @@
 #ifndef _NETCON_UTILITIES_CPP
 #ifndef _NETCON_UTILITIES_CPP
 #define _NETCON_UTILITIES_CPP
 #define _NETCON_UTILITIES_CPP
 
 
+#define DEBUG_LEVEL	3
+
 namespace ZeroTier
 namespace ZeroTier
 {
 {
+	void dwr(int level, char *fmt, ... )
+	{
+		if(level > DEBUG_LEVEL)
+			return;
+		va_list ap;
+		va_start(ap, fmt);
+		vfprintf(stderr, fmt, ap);
+		fflush(stderr);
+		va_end(ap);
+	}
+
 	void dwr(char *fmt, ... )
 	void dwr(char *fmt, ... )
 	{
 	{
 		va_list ap;
 		va_list ap;
 		va_start(ap, fmt);
 		va_start(ap, fmt);
 		vfprintf(stderr, fmt, ap);
 		vfprintf(stderr, fmt, ap);
 		fflush(stderr);
 		fflush(stderr);
-		va_end(ap);	
+		va_end(ap);
 	}
 	}
 
 
 	void clearscreen()
 	void clearscreen()

+ 2 - 1
netcon/NetconUtilities.hpp

@@ -31,7 +31,8 @@
 
 
 namespace ZeroTier
 namespace ZeroTier
 {
 {
-  void dwr(char *str, ... );
+  void dwr(int level, char *fmt, ... );
+  void dwr(char *fmt, ... );
   void clearscreen();
   void clearscreen();
   void gotoxy(int x,int y);
   void gotoxy(int x,int y);
   void get_path_from_pid(char* dest, int pid);
   void get_path_from_pid(char* dest, int pid);

+ 3 - 0
netcon/README.md

@@ -157,5 +157,8 @@ To Test:
 	32/64-bit systems
 	32/64-bit systems
 
 
 
 
+### Alpha Unaddressed bug log
+
+ - Possible CPU max-out during sshd kill or multiple ssh connect/disconnects
 
 
 
 

+ 1 - 0
osdep/Phy.hpp

@@ -814,6 +814,7 @@ public:
 
 
 		tv.tv_sec = (long)(timeout / 1000);
 		tv.tv_sec = (long)(timeout / 1000);
 		tv.tv_usec = (long)((timeout % 1000) * 1000);
 		tv.tv_usec = (long)((timeout % 1000) * 1000);
+		//fprintf(stderr, "Phy.poll()\n");
 		if (::select((int)_nfds + 1,&rfds,&wfds,&efds,(timeout > 0) ? &tv : (struct timeval *)0) <= 0)
 		if (::select((int)_nfds + 1,&rfds,&wfds,&efds,(timeout > 0) ? &tv : (struct timeval *)0) <= 0)
 			return;
 			return;