[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: Aris Adamantiadis <aris@xxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Fri, 4 Mar 2016 10:46:03 +0100
- To: libssh@xxxxxxxxxx
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; >> }
Re: [PATCH] Add request_denied and unimplemented_packet callbacks on server side | Andreas Schneider <asn@xxxxxxxxxxxxxx> |