@@ -1362,6 +1362,12 @@ static int sftp_worker(thread_ctx_t* threadCtx)
13621362 break ;
13631363 }
13641364 if (ret != WS_SUCCESS && ret != WS_CHAN_RXD ) {
1365+ if (ret == WS_WANT_WRITE ) {
1366+ /* recall wolfSSH_worker here because is likely our custom
1367+ * highwater callback that returned up a WS_WANT_WRITE */
1368+ ret = wolfSSH_worker (ssh , NULL );
1369+ continue ; /* continue on if our send got a want write */
1370+ }
13651371 /* If not successful and no channel data, leave. */
13661372 break ;
13671373 }
@@ -2428,6 +2434,7 @@ static void ShowUsage(void)
24282434 "to use\n" );
24292435 printf (" -m <list> set the comma separated list of mac algos to use\n" );
24302436 printf (" -b <num> test user auth would block\n" );
2437+ printf (" -H set test highwater callback\n" );
24312438}
24322439
24332440
@@ -2452,6 +2459,36 @@ static INLINE void SignalTcpReady(tcp_ready* ready, word16 port)
24522459 WOLFSSL_RETURN_FROM_THREAD(0); \
24532460} while(0)
24542461
2462+
2463+ static byte wantwrite = 0 ; /*flag to return want write on first highwater call*/
2464+ static int my_highwaterCb (byte dir , void * ctx )
2465+ {
2466+ int ret = WS_SUCCESS ;
2467+
2468+ WOLFSSH_UNUSED (dir );
2469+
2470+ printf ("my_highwaterCb called\n" );
2471+ if (ctx ) {
2472+ WOLFSSH * ssh = (WOLFSSH * )ctx ;
2473+
2474+ printf ("HIGHWATER MARK: (%u) %s" , wolfSSH_GetHighwater (ssh ),
2475+ (dir == WOLFSSH_HWSIDE_RECEIVE ) ? "receive\n" : "transmit\n" );
2476+ if (dir == WOLFSSH_HWSIDE_RECEIVE ) {
2477+ if (!wantwrite ) {
2478+ ret = WS_WANT_WRITE ;
2479+ wantwrite = 1 ;
2480+ printf ("Forcing a want write on first highwater callback\n" );
2481+ }
2482+ else {
2483+ ret = wolfSSH_TriggerKeyExchange (ssh );
2484+ }
2485+ }
2486+
2487+ }
2488+
2489+ return ret ;
2490+ }
2491+
24552492THREAD_RETURN WOLFSSH_THREAD echoserver_test (void * args )
24562493{
24572494 func_args * serverArgs = (func_args * )args ;
@@ -2466,6 +2503,7 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
24662503 StrList * keyboardList = NULL ;
24672504 WS_UserAuthData_Keyboard kbAuthData ;
24682505 WS_SOCKET_T listenFd = WOLFSSH_SOCKET_INVALID ;
2506+ int useCustomHighWaterCb = 0 ;
24692507 word32 defaultHighwater = EXAMPLE_HIGHWATER_MARK ;
24702508 word32 threadCount = 0 ;
24712509 const char * keyList = NULL ;
@@ -2498,7 +2536,7 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
24982536 kbAuthData .promptCount = 0 ;
24992537
25002538 if (argc > 0 ) {
2501- const char * optlist = "?1a:d:efEp:R:Ni:j:i:I:J:K:P:k:b:x:m:c:s:" ;
2539+ const char * optlist = "?1a:d:efEp:R:Ni:j:i:I:J:K:P:k:b:x:m:c:s:H " ;
25022540 myoptind = 0 ;
25032541 while ((ch = mygetopt (argc , argv , optlist )) != -1 ) {
25042542 switch (ch ) {
@@ -2608,6 +2646,10 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
26082646 #endif
26092647 break ;
26102648
2649+ case 'H' :
2650+ useCustomHighWaterCb = 1 ;
2651+ break ;
2652+
26112653 default :
26122654 ShowUsage ();
26132655 serverArgs -> return_code = MY_EX_USAGE ;
@@ -2968,18 +3010,32 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
29683010 WFREE (threadCtx , NULL , 0 );
29693011 ES_ERROR ("Couldn't allocate SSH data.\n" );
29703012 }
3013+
29713014 #ifdef WOLFSSH_STATIC_MEMORY
29723015 wolfSSH_MemoryConnPrintStats (heap );
29733016 #endif
29743017 wolfSSH_SetUserAuthCtx (ssh , & pwMapList );
29753018 wolfSSH_SetKeyingCompletionCbCtx (ssh , (void * )ssh );
29763019 wolfSSH_SetKeyboardAuthCtx (ssh , & kbAuthData );
3020+
3021+
29773022 /* Use the session object for its own highwater callback ctx */
29783023 if (defaultHighwater > 0 ) {
29793024 wolfSSH_SetHighwaterCtx (ssh , (void * )ssh );
29803025 wolfSSH_SetHighwater (ssh , defaultHighwater );
29813026 }
29823027
3028+ if (useCustomHighWaterCb ) {
3029+ if (defaultHighwater == EXAMPLE_HIGHWATER_MARK ) {
3030+ defaultHighwater = 2000 ; /* lower the highwater mark to hit the
3031+ * callback sooner */
3032+ }
3033+ printf ("Registering highwater callback that returns want write\n" );
3034+ wolfSSH_SetHighwaterCb (ctx , defaultHighwater , my_highwaterCb );
3035+ wolfSSH_SetHighwaterCtx (ssh , (void * )ssh );
3036+ wolfSSH_SetHighwater (ssh , defaultHighwater );
3037+ }
3038+
29833039 #ifdef WOLFSSH_SFTP
29843040 if (SetDefaultSftpPath (ssh , defaultSftpPath ) != 0 ) {
29853041 ES_ERROR ("Couldn't store default sftp path.\n" );
0 commit comments