Channel Callbacks (Open Conf and Open Fail)

1. Add channel open callback APIs to support two client callback
   functions, Channel Open Conf and Fail.
pull/713/head
John Safranek 2024-01-31 14:29:16 -08:00
parent 91a545fa15
commit bb0809ceca
4 changed files with 39 additions and 0 deletions

View File

@ -7859,6 +7859,12 @@ static int DoChannelOpenConf(WOLFSSH* ssh,
ret = ChannelUpdatePeer(channel, peerChannelId, ret = ChannelUpdatePeer(channel, peerChannelId,
peerInitialWindowSz, peerMaxPacketSz); peerInitialWindowSz, peerMaxPacketSz);
if (ret == WS_SUCCESS) {
if (ssh->ctx->channelOpenConfCb != NULL) {
ret = ssh->ctx->channelOpenConfCb(channel, ssh->channelOpenCtx);
}
}
if (ret == WS_SUCCESS) { if (ret == WS_SUCCESS) {
ssh->serverState = SERVER_CHANNEL_OPEN_DONE; ssh->serverState = SERVER_CHANNEL_OPEN_DONE;
ssh->defaultPeerChannelId = peerChannelId; ssh->defaultPeerChannelId = peerChannelId;
@ -7872,6 +7878,7 @@ static int DoChannelOpenConf(WOLFSSH* ssh,
static int DoChannelOpenFail(WOLFSSH* ssh, static int DoChannelOpenFail(WOLFSSH* ssh,
byte* buf, word32 len, word32* idx) byte* buf, word32 len, word32* idx)
{ {
WOLFSSH_CHANNEL* channel = NULL;
char desc[80]; char desc[80];
word32 begin, channelId, reasonId, descSz, langSz; word32 begin, channelId, reasonId, descSz, langSz;
int ret = WS_SUCCESS; int ret = WS_SUCCESS;
@ -7905,6 +7912,19 @@ static int DoChannelOpenFail(WOLFSSH* ssh,
WLOG(WS_LOG_INFO, "description: %s", desc); WLOG(WS_LOG_INFO, "description: %s", desc);
} }
if (ssh->ctx->channelOpenFailCb != NULL) {
channel = ChannelFind(ssh, channelId, WS_CHANNEL_ID_SELF);
if (channel != NULL) {
ret = ssh->ctx->channelOpenFailCb(channel, ssh->channelOpenCtx);
}
else {
ret = WS_INVALID_CHANID;
}
}
}
if (ret == WS_SUCCESS) {
ret = ChannelRemove(ssh, channelId, WS_CHANNEL_ID_SELF); ret = ChannelRemove(ssh, channelId, WS_CHANNEL_ID_SELF);
} }

View File

@ -3062,6 +3062,21 @@ int wolfSSH_CTX_SetChannelOpenCb(WOLFSSH_CTX* ctx, WS_CallbackChannelOpen cb)
} }
int wolfSSH_CTX_SetChannelOpenRespCb(WOLFSSH_CTX* ctx,
WS_CallbackChannelOpen confCb, WS_CallbackChannelOpen failCb)
{
int ret = WS_SSH_CTX_NULL_E;
if (ctx != NULL) {
ctx->channelOpenConfCb = confCb;
ctx->channelOpenFailCb = failCb;
ret = WS_SUCCESS;
}
return ret;
}
int wolfSSH_SetChannelOpenCtx(WOLFSSH* ssh, void* ctx) int wolfSSH_SetChannelOpenCtx(WOLFSSH* ssh, void* ctx)
{ {
int ret = WS_SSH_NULL_E; int ret = WS_SSH_NULL_E;

View File

@ -499,6 +499,8 @@ struct WOLFSSH_CTX {
WS_CallbackReqSuccess reqSuccessCb; /* Global Request Success Callback */ WS_CallbackReqSuccess reqSuccessCb; /* Global Request Success Callback */
WS_CallbackReqSuccess reqFailureCb; /* Global Request Failure Callback */ WS_CallbackReqSuccess reqFailureCb; /* Global Request Failure Callback */
WS_CallbackChannelOpen channelOpenCb; WS_CallbackChannelOpen channelOpenCb;
WS_CallbackChannelOpen channelOpenConfCb;
WS_CallbackChannelOpen channelOpenFailCb;
#ifdef WOLFSSH_SCP #ifdef WOLFSSH_SCP
WS_CallbackScpRecv scpRecvCb; /* SCP receive callback */ WS_CallbackScpRecv scpRecvCb; /* SCP receive callback */
WS_CallbackScpSend scpSendCb; /* SCP send callback */ WS_CallbackScpSend scpSendCb; /* SCP send callback */

View File

@ -214,6 +214,8 @@ WOLFSSH_API int wolfSSH_ChannelGetEof(WOLFSSH_CHANNEL*);
typedef int (*WS_CallbackChannelOpen)(WOLFSSH_CHANNEL* channel, void* ctx); typedef int (*WS_CallbackChannelOpen)(WOLFSSH_CHANNEL* channel, void* ctx);
WOLFSSH_API int wolfSSH_CTX_SetChannelOpenCb(WOLFSSH_CTX* ctx, WOLFSSH_API int wolfSSH_CTX_SetChannelOpenCb(WOLFSSH_CTX* ctx,
WS_CallbackChannelOpen cb); WS_CallbackChannelOpen cb);
WOLFSSH_API int wolfSSH_CTX_SetChannelOpenRespCb(WOLFSSH_CTX* ctx,
WS_CallbackChannelOpen confCb, WS_CallbackChannelOpen failCb);
WOLFSSH_API int wolfSSH_SetChannelOpenCtx(WOLFSSH* ssh, void* ctx); WOLFSSH_API int wolfSSH_SetChannelOpenCtx(WOLFSSH* ssh, void* ctx);
WOLFSSH_API void* wolfSSH_GetChannelOpenCtx(WOLFSSH* ssh); WOLFSSH_API void* wolfSSH_GetChannelOpenCtx(WOLFSSH* ssh);