| 
					
				 | 
			
			
				@@ -25,6 +25,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <stdbool.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "FreeRTOS.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "task.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "semphr.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "wolfssh_test.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "cli.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "CLI_Commands.h" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -55,9 +56,9 @@ typedef struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     WOLFSSH* ssh; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     SOCKET_T fd; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     word32 id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    char nonBlock; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } thread_ctx_t; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static const bool nonBlock = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifndef EXAMPLE_HIGHWATER_MARK 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     #define EXAMPLE_HIGHWATER_MARK 0x3FFF8000 /* 1GB - 32kB */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -138,7 +139,7 @@ static void *server_worker(void* vArgs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_level_t user_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     wolfSSH_SetUserAuthCtx(threadCtx->ssh, &user_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!threadCtx->nonBlock) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!nonBlock) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ret = wolfSSH_accept(threadCtx->ssh); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ret = NonBlockSSH_accept(threadCtx->ssh); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -159,11 +160,29 @@ static void *server_worker(void* vArgs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 uint8_t buf[EXAMPLE_BUFFER_SZ]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 int rxSz = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 do { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (nonBlock) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        SOCKET_T sockfd; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        int select_ret = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        sockfd = (SOCKET_T)wolfSSH_get_fd(threadCtx->ssh); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        select_ret = tcp_select(sockfd, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (!sSettings.sSSH.SSHEnable || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            (select_ret != WS_SELECT_RECV_READY && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            select_ret != WS_SELECT_ERROR_READY && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            select_ret != WS_SELECT_TIMEOUT)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     rxSz = wolfSSH_stream_read(threadCtx->ssh, buf, sizeof(buf)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (rxSz <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         rxSz = wolfSSH_get_error(threadCtx->ssh); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } while (rxSz == WS_WANT_READ || rxSz == WS_WANT_WRITE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } while ((rxSz == WS_WANT_READ || rxSz == WS_WANT_WRITE) && sSettings.sSSH.SSHEnable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!sSettings.sSSH.SSHEnable) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stop = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (rxSz > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     cli_getchar(cli_state, buf[0], true);    // TODO handle rxSz > 1 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -300,7 +319,6 @@ static void ssh_server(void *arg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     word32 threadCount = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const char multipleConnections = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     char useEcc = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    char nonBlock = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (wolfSSH_Init() != WS_SUCCESS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         printf("Couldn't initialize wolfSSH.\n"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -376,7 +394,6 @@ static void ssh_server(void *arg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             threadCtx->ssh = ssh; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             threadCtx->fd = clientFd; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             threadCtx->id = threadCount++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            threadCtx->nonBlock = nonBlock; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifndef SINGLE_THREADED 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ThreadStart(server_worker, threadCtx, &thread); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -413,9 +430,4 @@ void ssh_server_init(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void ssh_server_restart(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (unsigned i = 0; i < array_len(cli_states); ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (cli_states[i].state != STATE_UNUSED && cli_states[i].send == cli_send) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            wolfSSH_shutdown(cli_states[i].num_connect); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |