diff options
author | Fredrik Gustafsson <[email protected]> | 2012-12-19 11:54:09 +0100 |
---|---|---|
committer | Fredrik Gustafsson <[email protected]> | 2012-12-19 11:54:09 +0100 |
commit | b5bfeb6de3a2a79c9581d779112d1cc192225dbd (patch) | |
tree | 3151cdb378e62a3d05f849492ce6c84382355cd3 /lib/ssh/src/ssh_connection_handler.erl | |
parent | 3bd2ba0060f9bcb0d3bddd74a4a5763e520a533f (diff) | |
parent | c228ceb941e26a04317bd2f66a2ee64687f0f869 (diff) | |
download | otp-b5bfeb6de3a2a79c9581d779112d1cc192225dbd.tar.gz otp-b5bfeb6de3a2a79c9581d779112d1cc192225dbd.tar.bz2 otp-b5bfeb6de3a2a79c9581d779112d1cc192225dbd.zip |
Merge branch 'fredrik/ssh/rekeying'
* fredrik/ssh/rekeying:
ssh_basic_SUITE rekey test modifications
Modifications to idle_time testcase
Added test for rekeying
Added doc for rekey_limit option
Renegotiating every hour and every gb sent, can be decreased with option {rekey_limit, integer()}
Diffstat (limited to 'lib/ssh/src/ssh_connection_handler.erl')
-rw-r--r-- | lib/ssh/src/ssh_connection_handler.erl | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index b79e8530b7..88b45111ff 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -35,7 +35,8 @@ -export([start_link/4, send/2, renegotiate/1, send_event/2, connection_info/3, - peer_address/1]). + peer_address/1, + renegotiate_data/1]). %% gen_fsm callbacks -export([hello/2, kexinit/2, key_exchange/2, new_keys/2, @@ -85,6 +86,8 @@ send(ConnectionHandler, Data) -> renegotiate(ConnectionHandler) -> send_all_state_event(ConnectionHandler, renegotiate). +renegotiate_data(ConnectionHandler) -> + send_all_state_event(ConnectionHandler, data_size). connection_info(ConnectionHandler, From, Options) -> send_all_state_event(ConnectionHandler, {info, From, Options}). @@ -500,7 +503,22 @@ handle_event(renegotiate, StateName, State) -> handle_event({info, From, Options}, StateName, #state{ssh_params = Ssh} = State) -> spawn(?MODULE, ssh_info_handler, [Options, Ssh, From]), {next_state, StateName, State}; - +handle_event(data_size, connected, #state{ssh_params = Ssh0} = State) -> + Sent = inet:getstat(State#state.socket, [send_oct]), + MaxSent = proplists:get_value(rekey_limit, State#state.opts, 1024000000), + case Sent >= MaxSent of + true -> + {KeyInitMsg, SshPacket, Ssh} = ssh_transport:key_exchange_init_msg(Ssh0), + send_msg(SshPacket, State), + {next_state, connected, + next_packet(State#state{ssh_params = Ssh, + key_exchange_init_msg = KeyInitMsg, + renegotiate = true})}; + _ -> + {next_state, connected, next_packet(State)} + end; +handle_event(data_size, StateName, State) -> + {next_state, StateName, State}; handle_event({unknown, Data}, StateName, State) -> Msg = #ssh_msg_unimplemented{sequence = Data}, send_msg(Msg, State), |