@@ -1362,6 +1362,12 @@ static int sftp_worker(thread_ctx_t* threadCtx)
1362
1362
break ;
1363
1363
}
1364
1364
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
+ }
1365
1371
/* If not successful and no channel data, leave. */
1366
1372
break ;
1367
1373
}
@@ -2428,6 +2434,7 @@ static void ShowUsage(void)
2428
2434
"to use\n" );
2429
2435
printf (" -m <list> set the comma separated list of mac algos to use\n" );
2430
2436
printf (" -b <num> test user auth would block\n" );
2437
+ printf (" -H set test highwater callback\n" );
2431
2438
}
2432
2439
2433
2440
@@ -2452,6 +2459,36 @@ static INLINE void SignalTcpReady(tcp_ready* ready, word16 port)
2452
2459
WOLFSSL_RETURN_FROM_THREAD(0); \
2453
2460
} while(0)
2454
2461
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
+
2455
2492
THREAD_RETURN WOLFSSH_THREAD echoserver_test (void * args )
2456
2493
{
2457
2494
func_args * serverArgs = (func_args * )args ;
@@ -2466,6 +2503,7 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
2466
2503
StrList * keyboardList = NULL ;
2467
2504
WS_UserAuthData_Keyboard kbAuthData ;
2468
2505
WS_SOCKET_T listenFd = WOLFSSH_SOCKET_INVALID ;
2506
+ int useCustomHighWaterCb = 0 ;
2469
2507
word32 defaultHighwater = EXAMPLE_HIGHWATER_MARK ;
2470
2508
word32 threadCount = 0 ;
2471
2509
const char * keyList = NULL ;
@@ -2498,7 +2536,7 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
2498
2536
kbAuthData .promptCount = 0 ;
2499
2537
2500
2538
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 " ;
2502
2540
myoptind = 0 ;
2503
2541
while ((ch = mygetopt (argc , argv , optlist )) != -1 ) {
2504
2542
switch (ch ) {
@@ -2608,6 +2646,10 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
2608
2646
#endif
2609
2647
break ;
2610
2648
2649
+ case 'H' :
2650
+ useCustomHighWaterCb = 1 ;
2651
+ break ;
2652
+
2611
2653
default :
2612
2654
ShowUsage ();
2613
2655
serverArgs -> return_code = MY_EX_USAGE ;
@@ -2968,18 +3010,32 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
2968
3010
WFREE (threadCtx , NULL , 0 );
2969
3011
ES_ERROR ("Couldn't allocate SSH data.\n" );
2970
3012
}
3013
+
2971
3014
#ifdef WOLFSSH_STATIC_MEMORY
2972
3015
wolfSSH_MemoryConnPrintStats (heap );
2973
3016
#endif
2974
3017
wolfSSH_SetUserAuthCtx (ssh , & pwMapList );
2975
3018
wolfSSH_SetKeyingCompletionCbCtx (ssh , (void * )ssh );
2976
3019
wolfSSH_SetKeyboardAuthCtx (ssh , & kbAuthData );
3020
+
3021
+
2977
3022
/* Use the session object for its own highwater callback ctx */
2978
3023
if (defaultHighwater > 0 ) {
2979
3024
wolfSSH_SetHighwaterCtx (ssh , (void * )ssh );
2980
3025
wolfSSH_SetHighwater (ssh , defaultHighwater );
2981
3026
}
2982
3027
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
+
2983
3039
#ifdef WOLFSSH_SFTP
2984
3040
if (SetDefaultSftpPath (ssh , defaultSftpPath ) != 0 ) {
2985
3041
ES_ERROR ("Couldn't store default sftp path.\n" );
0 commit comments