@@ -92,8 +92,11 @@ typedef struct {
9292} thread_ctx_t ;
9393
9494
95- #ifndef DEFAULT_HIGHWATER_MARK
96- #define DEFAULT_HIGHWATER_MARK 0
95+ #ifndef EXAMPLE_HIGHWATER_MARK
96+ #define EXAMPLE_HIGHWATER_MARK 0x3FFF8000 /* 1GB - 32kB */
97+ #endif
98+ #ifndef EXAMPLE_BUFFER_SZ
99+ #define EXAMPLE_BUFFER_SZ 4096
97100#endif
98101
99102
@@ -284,23 +287,54 @@ static THREAD_RETURN CYASSL_THREAD server_worker(void* vArgs)
284287 WOLFSSH * ssh = (WOLFSSH * )vArgs ;
285288 SOCKET_T clientFd = wolfSSH_get_fd (ssh );
286289
287- uint8_t buf [4096 ];
288- int bufSz ;
289-
290290 if (wolfSSH_accept (ssh ) == WS_SUCCESS ) {
291-
292- while (1 ) {
293- bufSz = wolfSSH_stream_read (ssh , buf , sizeof (buf ));
294- if (bufSz > 0 ) {
295- wolfSSH_stream_send (ssh , buf , bufSz );
296- if (find_char (0x03 , buf , bufSz ))
297- break ;
298- }
299- else {
300- printf ("wolfSSH_stream_read returned %d\n" , bufSz );
301- break ;
291+ uint8_t * buf = NULL ;
292+ uint8_t * tmpBuf ;
293+ int bufSz , backlogSz = 0 , rxSz , txSz , stop = 0 , txSum ;
294+
295+ do {
296+ bufSz = EXAMPLE_BUFFER_SZ + backlogSz ;
297+
298+ tmpBuf = realloc (buf , bufSz );
299+ if (tmpBuf == NULL )
300+ stop = 1 ;
301+ else
302+ buf = tmpBuf ;
303+
304+ if (!stop ) {
305+ rxSz = wolfSSH_stream_read (ssh ,
306+ buf + backlogSz ,
307+ EXAMPLE_BUFFER_SZ );
308+ if (rxSz > 0 ) {
309+ backlogSz += rxSz ;
310+ txSum = 0 ;
311+ txSz = 0 ;
312+
313+ while (backlogSz != txSum && txSz >= 0 && !stop ) {
314+ txSz = wolfSSH_stream_send (ssh ,
315+ buf + txSum ,
316+ backlogSz - txSum );
317+
318+ if (txSz > 0 ) {
319+ if (find_char (0x03 , buf + txSum , txSz ))
320+ stop = 1 ;
321+ else
322+ txSum += txSz ;
323+ }
324+ else if (txSz != WS_REKEYING )
325+ stop = 1 ;
326+ }
327+
328+ if (txSum < backlogSz )
329+ memmove (buf , buf + txSum , backlogSz - txSum );
330+ backlogSz -= txSum ;
331+ }
332+ else
333+ stop = 1 ;
302334 }
303- }
335+ } while (!stop );
336+
337+ free (buf );
304338 }
305339 close (clientFd );
306340 wolfSSH_free (ssh );
@@ -592,29 +626,12 @@ static int wsUserAuth(uint8_t authType,
592626}
593627
594628
595- static int wsHighwater (uint8_t side , void * ctx )
596- {
597- if (ctx ) {
598- WOLFSSH * ssh = (WOLFSSH * )ctx ;
599- uint32_t highwaterMark = wolfSSH_GetHighwater (ssh );
600-
601- printf ("HIGHWATER ALERT: (%u) %s\n" , highwaterMark ,
602- (side == WOLFSSH_HWSIDE_RECEIVE ) ? "receive" : "transmit" );
603- highwaterMark *= 2 ;
604- printf (" Doubling the highwater mark to %u.\n" , highwaterMark );
605- wolfSSH_SetHighwater (ssh , highwaterMark );
606- }
607-
608- return 0 ;
609- }
610-
611-
612629int main (void )
613630{
614631 WOLFSSH_CTX * ctx = NULL ;
615632 PwMapList pwMapList ;
616633 SOCKET_T listenFd = 0 ;
617- uint32_t defaultHighwater = DEFAULT_HIGHWATER_MARK ;
634+ uint32_t defaultHighwater = EXAMPLE_HIGHWATER_MARK ;
618635
619636 #ifdef DEBUG_WOLFSSH
620637 wolfSSH_Debugging_ON ();
@@ -633,8 +650,6 @@ int main(void)
633650
634651 memset (& pwMapList , 0 , sizeof (pwMapList ));
635652 wolfSSH_SetUserAuth (ctx , wsUserAuth );
636- if (defaultHighwater > 0 )
637- wolfSSH_SetHighwaterCb (ctx , defaultHighwater , wsHighwater );
638653
639654 {
640655 uint8_t buf [SCRATCH_BUFFER_SIZE ];
@@ -678,8 +693,10 @@ int main(void)
678693 }
679694 wolfSSH_SetUserAuthCtx (ssh , & pwMapList );
680695 /* Use the session object for its own highwater callback ctx */
681- if (defaultHighwater > 0 )
696+ if (defaultHighwater > 0 ) {
682697 wolfSSH_SetHighwaterCtx (ssh , (void * )ssh );
698+ wolfSSH_SetHighwater (ssh , defaultHighwater );
699+ }
683700
684701 if (listen (listenFd , 5 ) != 0 )
685702 err_sys ("tcp listen failed" );
0 commit comments