[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] Add request_denied and unimplemented_packet callbacks on server side
[Thread Prev] | [Thread Next]
- Subject: Re: [PATCH] Add request_denied and unimplemented_packet callbacks on server side
- From: Nicolas Viennot <nicolas@xxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Wed, 6 Apr 2016 10:43:40 -0400
- To: libssh@xxxxxxxxxx
Hi Aris, Let me know if I can do anything to facilitate the review process. Thanks, Nico. On Fri, Mar 4, 2016 at 4:46 AM, Aris Adamantiadis <aris@xxxxxxxxxxxx> wrote: > Hi Andreas, Nicolas > > Let me some more time to review this patch. > > Aris > > On 2/03/16 13:21, Andreas Schneider wrote: >> On Saturday 27 February 2016 02:41:34 Nicolas Viennot wrote: >>> When dealing with keepalive packets sent from the server, the clients >>> reply. Having a callback on that reply allows measuring client latency. >>> However, clients behave differently: >>> * libssh sends an unimplemented packet reply to keepalive requests. >>> * other clients like openssh sends a request denied packet to keepalive >>> requests. >>> These callbacks allow the server to measure the latency to the clients when >>> sending keepalive requests. >> >> Looks fine for me, Aris? >> >> >>> --- >>> include/libssh/callbacks.h | 25 +++++++++++++++++++++++++ >>> src/channels.c | 5 +++++ >>> src/packet.c | 8 ++++++-- >>> 3 files changed, 36 insertions(+), 2 deletions(-) >>> >>> diff --git a/include/libssh/callbacks.h b/include/libssh/callbacks.h >>> index 20c540e..22f8b08 100644 >>> --- a/include/libssh/callbacks.h >>> +++ b/include/libssh/callbacks.h >>> @@ -296,6 +296,21 @@ typedef int (*ssh_gssapi_accept_sec_ctx_callback) >>> (ssh_session session, >>> typedef int (*ssh_gssapi_verify_mic_callback) (ssh_session session, >>> ssh_string mic, void *mic_buffer, size_t mic_buffer_size, void *userdata); >>> >>> +/** >>> + * @brief Handle a notification from the client that it received an >>> unimplemented packet. >>> + * @param session current session handler >>> + * @param seq packet sequence number >>> + * @param userdata Userdata to be passed to the callback function. >>> + */ >>> +typedef void (*ssh_client_unimplemented_packet_callback) (ssh_session >>> session, uint32_t seq, void *userdata); >>> + >>> +/** >>> + * @brief Handle an unhandled client request denied callback. >>> + * @param session current session handler >>> + * @param userdata Userdata to be passed to the callback function. >>> + */ >>> +typedef void (*ssh_client_request_denied_callback) (ssh_session >>> session, void *userdata); >>> + >>> >>> /** >>> * This structure can be used to implement a libssh server, with >>> appropriate callbacks. >>> @@ -345,6 +360,16 @@ struct ssh_server_callbacks_struct { >>> /* This function will be called when a MIC needs to be verified. >>> */ >>> ssh_gssapi_verify_mic_callback gssapi_verify_mic_function; >>> + >>> + /** This function will be called when the client notifies the server of >>> an + * unimplemented packet. >>> + */ >>> + ssh_client_unimplemented_packet_callback >>> client_unimplemented_packet_function; >>> + >>> + /** This function will be called when the client notifies the server of >>> an + * non handled deny of request. >>> + */ >>> + ssh_client_request_denied_callback client_request_denied_function; >>> }; >>> typedef struct ssh_server_callbacks_struct *ssh_server_callbacks; >>> >>> diff --git a/src/channels.c b/src/channels.c >>> index ffcb1d5..6a179f9 100644 >>> --- a/src/channels.c >>> +++ b/src/channels.c >>> @@ -2039,6 +2039,11 @@ SSH_PACKET_CALLBACK(ssh_request_denied){ >>> if(session->global_req_state != SSH_CHANNEL_REQ_STATE_PENDING){ >>> SSH_LOG(SSH_LOG_RARE, "SSH_REQUEST_DENIED received in incorrect state >>> %d", session->global_req_state); >>> + >>> + if (ssh_callbacks_exists(session->server_callbacks, >>> client_request_denied_function)){ >>> + session->server_callbacks->client_request_denied_function( >>> + session, session->server_callbacks->userdata); >>> + } >>> } else { >>> session->global_req_state=SSH_CHANNEL_REQ_STATE_DENIED; >>> } >>> diff --git a/src/packet.c b/src/packet.c >>> index 7d6957c..7b98811 100644 >>> --- a/src/packet.c >>> +++ b/src/packet.c >>> @@ -464,8 +464,7 @@ SSH_PACKET_CALLBACK(ssh_packet_unimplemented){ >>> uint32_t seq; >>> int rc; >>> >>> - (void)session; /* unused */ >>> - (void)type; >>> + (void)type; /* unused */ >>> (void)user; >>> >>> rc = ssh_buffer_unpack(packet, "d", &seq); >>> @@ -477,6 +476,11 @@ SSH_PACKET_CALLBACK(ssh_packet_unimplemented){ >>> SSH_LOG(SSH_LOG_RARE, >>> "Received SSH_MSG_UNIMPLEMENTED (sequence number %d)",seq); >>> >>> + if (ssh_callbacks_exists(session->server_callbacks, >>> client_unimplemented_packet_function)){ >>> + session->server_callbacks->client_unimplemented_packet_function( >>> + session, seq, session->server_callbacks->userdata); >>> + } >>> + >>> return SSH_PACKET_USED; >>> } > >
Archive administrator: postmaster@lists.cynapses.org