|  | @@ -61,7 +61,7 @@ typedef struct {
 | 
	
		
			
				|  |  |      #define EXAMPLE_HIGHWATER_MARK 0x3FFF8000 /* 1GB - 32kB */
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  #ifndef EXAMPLE_BUFFER_SZ
 | 
	
		
			
				|  |  | -    #define EXAMPLE_BUFFER_SZ 4096
 | 
	
		
			
				|  |  | +    #define EXAMPLE_BUFFER_SZ 256
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  #define SCRATCH_BUFFER_SZ 1200
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -167,77 +167,23 @@ static void *server_worker(void* vArgs)
 | 
	
		
			
				|  |  |          cli_states[threadCtx->fd].state = STATE_NORMAL;
 | 
	
		
			
				|  |  |          cli_states[threadCtx->fd].send = cli_send;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        byte* buf = NULL;
 | 
	
		
			
				|  |  | -        byte* tmpBuf;
 | 
	
		
			
				|  |  | -        int bufSz, backlogSz = 0, rxSz, txSz, stop = 0, txSum;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        bool stop = false;
 | 
	
		
			
				|  |  |          do {
 | 
	
		
			
				|  |  | -            bufSz = EXAMPLE_BUFFER_SZ + backlogSz;
 | 
	
		
			
				|  |  | +            uint8_t buf[EXAMPLE_BUFFER_SZ];
 | 
	
		
			
				|  |  | +            int rxSz = 0;
 | 
	
		
			
				|  |  | +            do {
 | 
	
		
			
				|  |  | +                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);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            tmpBuf = (byte*)realloc(buf, bufSz);
 | 
	
		
			
				|  |  | -            if (tmpBuf == NULL)
 | 
	
		
			
				|  |  | +            if (rxSz > 0) {
 | 
	
		
			
				|  |  | +                cli_getchar(cli_states + threadCtx->fd, buf[0]);    // TODO handle rxSz > 1
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  |                  stop = 1;
 | 
	
		
			
				|  |  | -            else
 | 
	
		
			
				|  |  | -                buf = tmpBuf;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (!stop) {
 | 
	
		
			
				|  |  | -                do {
 | 
	
		
			
				|  |  | -                    rxSz = wolfSSH_stream_read(threadCtx->ssh,
 | 
	
		
			
				|  |  | -                                               buf + backlogSz,
 | 
	
		
			
				|  |  | -                                               EXAMPLE_BUFFER_SZ);
 | 
	
		
			
				|  |  | -                    if (rxSz <= 0)
 | 
	
		
			
				|  |  | -                        rxSz = wolfSSH_get_error(threadCtx->ssh);
 | 
	
		
			
				|  |  | -                } while (rxSz == WS_WANT_READ || rxSz == WS_WANT_WRITE);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                if (rxSz > 0) {
 | 
	
		
			
				|  |  | -                    cli_getchar(cli_states + threadCtx->fd, buf[backlogSz]);    // TODO handle rxSz > 1
 | 
	
		
			
				|  |  | -                    backlogSz += rxSz;
 | 
	
		
			
				|  |  | -                    txSum = 0;
 | 
	
		
			
				|  |  | -                    txSz = 0;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    //wolfSSH_stream_send(threadCtx->ssh, "loh", 3);
 | 
	
		
			
				|  |  | -                    while (backlogSz != txSum && txSz >= 0 && !stop) {
 | 
	
		
			
				|  |  | -                        txSz = wolfSSH_stream_send(threadCtx->ssh,
 | 
	
		
			
				|  |  | -                                                   buf + txSum,
 | 
	
		
			
				|  |  | -                                                   backlogSz - txSum);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                        if (txSz > 0) {
 | 
	
		
			
				|  |  | -                            byte c;
 | 
	
		
			
				|  |  | -                            const byte matches[] = { 0x03, 0x05, 0x06, 0x00 };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                            c = find_char(matches, buf + txSum, txSz);
 | 
	
		
			
				|  |  | -                            switch (c) {
 | 
	
		
			
				|  |  | -                                case 0x03:
 | 
	
		
			
				|  |  | -                                    stop = 1;
 | 
	
		
			
				|  |  | -                                    break;
 | 
	
		
			
				|  |  | -                                case 0x06:
 | 
	
		
			
				|  |  | -                                    if (wolfSSH_TriggerKeyExchange(threadCtx->ssh)
 | 
	
		
			
				|  |  | -                                            != WS_SUCCESS)
 | 
	
		
			
				|  |  | -                                        stop = 1;
 | 
	
		
			
				|  |  | -                                    break;
 | 
	
		
			
				|  |  | -                                    /*
 | 
	
		
			
				|  |  | -                                case 0x05:
 | 
	
		
			
				|  |  | -                                    if (dump_stats(threadCtx) <= 0)
 | 
	
		
			
				|  |  | -                                        stop = 1;
 | 
	
		
			
				|  |  | -                                    break;
 | 
	
		
			
				|  |  | -                                    */
 | 
	
		
			
				|  |  | -                            }
 | 
	
		
			
				|  |  | -                            txSum += txSz;
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                        else if (txSz != WS_REKEYING)
 | 
	
		
			
				|  |  | -                            stop = 1;
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    if (txSum < backlogSz)
 | 
	
		
			
				|  |  | -                        memmove(buf, buf + txSum, backlogSz - txSum);
 | 
	
		
			
				|  |  | -                    backlogSz -= txSum;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                else
 | 
	
		
			
				|  |  | -                    stop = 1;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          } while (!stop);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        free(buf);
 | 
	
		
			
				|  |  |      } else if (ret == WS_SCP_COMPLETE) {
 | 
	
		
			
				|  |  |          printf("scp file transfer completed\n");
 | 
	
		
			
				|  |  |      } else if (ret == WS_SFTP_COMPLETE) {
 | 
	
	
		
			
				|  | @@ -727,5 +673,5 @@ static void ssh_server(void *arg)
 | 
	
		
			
				|  |  |  void ssh_server_init(void)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      vRegisterCLICommands();
 | 
	
		
			
				|  |  | -    xTaskCreate(ssh_server, ( char * ) "ssh_server", 16*configMINIMAL_STACK_SIZE , NULL, tskIDLE_PRIORITY + 1, NULL);
 | 
	
		
			
				|  |  | +    xTaskCreate(ssh_server, ( char * ) "ssh_server", 16*configMINIMAL_STACK_SIZE + EXAMPLE_BUFFER_SZ, NULL, tskIDLE_PRIORITY + 1, NULL);
 | 
	
		
			
				|  |  |  }
 |