Skip to content

Commit f581927

Browse files
add test case for want write return from highwater callback
1 parent df157e8 commit f581927

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

Diff for: examples/echoserver/echoserver.c

+57-1
Original file line numberDiff line numberDiff line change
@@ -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+
24552492
THREAD_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");

Diff for: scripts/sftp.test

+15
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,21 @@ if [ $RESULT -ne 0 ]; then
105105
exit 1
106106
fi
107107

108+
# Test want write return from highwater callback
109+
echo "Test want write return from highwater callback"
110+
./examples/echoserver/echoserver -H -N -1 -R $ready_file &
111+
server_pid=$!
112+
create_port
113+
./examples/sftpclient/wolfsftp -N -u jill -P upthehill -p $port -g -r $PWD/README.md-2 -l $PWD/README.md
114+
RESULT=$?
115+
remove_ready_file
116+
rm -f $PWD/README.md-2
117+
if [ $RESULT -ne 0 ]; then
118+
echo -e "\n\nfailed to connect"
119+
do_cleanup
120+
exit 1
121+
fi
122+
108123
# Test of setting directory
109124
if [ $nonblockingOnly = 0 ]; then
110125
echo "Test of setting directory"

0 commit comments

Comments
 (0)