@@ -112,13 +112,15 @@ static struct peer *new_peer(struct daemon *daemon,
112112 const struct crypto_state * cs ,
113113 const u8 * their_features ,
114114 enum is_websocket is_websocket ,
115+ struct timemono connect_starttime ,
115116 struct io_conn * conn STEALS ,
116117 int * fd_for_subd )
117118{
118119 struct peer * peer = tal (daemon , struct peer );
119120
120121 peer -> daemon = daemon ;
121122 peer -> id = * id ;
123+ peer -> connect_starttime = connect_starttime ;
122124 peer -> counter = daemon -> connection_counter ++ ;
123125 peer -> cs = * cs ;
124126 peer -> subds = tal_arr (peer , struct subd * , 0 );
@@ -258,11 +260,12 @@ static void reset_reconnect_timer(struct peer *peer)
258260
259261void send_disconnected (struct daemon * daemon ,
260262 const struct node_id * id ,
261- u64 connectd_counter )
263+ u64 connectd_counter ,
264+ struct timemono starttime )
262265{
263266 /* lightningd: it's gone */
264267 daemon_conn_send (daemon -> master ,
265- take (towire_connectd_peer_disconnected (NULL , id , connectd_counter )));
268+ take (towire_connectd_peer_disconnected (NULL , id , connectd_counter , time_to_nsec ( timemono_since ( starttime )) )));
266269
267270 /* Tell gossipd to stop asking this peer gossip queries */
268271 daemon_conn_send (daemon -> gossipd ,
@@ -282,6 +285,7 @@ struct io_plan *peer_connected(struct io_conn *conn,
282285 struct crypto_state * cs ,
283286 const u8 * their_features TAKES ,
284287 enum is_websocket is_websocket ,
288+ struct timemono starttime ,
285289 bool incoming )
286290{
287291 u8 * msg ;
@@ -294,11 +298,13 @@ struct io_plan *peer_connected(struct io_conn *conn,
294298 const char * connect_reason ;
295299 u64 connect_time_nsec ;
296300 u64 prev_connectd_counter ;
301+ struct timemono prev_connect_start ;
297302
298303 /* We remove any previous connection immediately, on the assumption it's dead */
299304 oldpeer = peer_htable_get (daemon -> peers , id );
300305 if (oldpeer ) {
301306 prev_connectd_counter = oldpeer -> counter ;
307+ prev_connect_start = oldpeer -> connect_starttime ;
302308 destroy_peer_immediately (oldpeer );
303309 }
304310
@@ -320,7 +326,8 @@ struct io_plan *peer_connected(struct io_conn *conn,
320326 if (unsup != -1 ) {
321327 /* We were going to send a reconnect message, but not now! */
322328 if (oldpeer )
323- send_disconnected (daemon , id , prev_connectd_counter );
329+ send_disconnected (daemon , id , prev_connectd_counter ,
330+ prev_connect_start );
324331 status_peer_unusual (id , "Unsupported feature %u" , unsup );
325332 msg = towire_warningfmt (NULL , NULL , "Unsupported feature %u" ,
326333 unsup );
@@ -331,7 +338,8 @@ struct io_plan *peer_connected(struct io_conn *conn,
331338 if (!feature_check_depends (their_features , & depender , & missing )) {
332339 /* We were going to send a reconnect message, but not now! */
333340 if (oldpeer )
334- send_disconnected (daemon , id , prev_connectd_counter );
341+ send_disconnected (daemon , id , prev_connectd_counter ,
342+ prev_connect_start );
335343 status_peer_unusual (id , "Feature %zu requires feature %zu" ,
336344 depender , missing );
337345 msg = towire_warningfmt (NULL , NULL ,
@@ -374,13 +382,14 @@ struct io_plan *peer_connected(struct io_conn *conn,
374382 }
375383
376384 /* This contains the per-peer state info; gossipd fills in pps->gs */
377- peer = new_peer (daemon , id , cs , their_features , is_websocket , conn ,
385+ peer = new_peer (daemon , id , cs , their_features , is_websocket , starttime , conn ,
378386 & subd_fd );
379387 /* Only takes over conn if it succeeds. */
380388 if (!peer ) {
381389 /* We were going to send a reconnect message, but not now! */
382390 if (oldpeer )
383- send_disconnected (daemon , id , prev_connectd_counter );
391+ send_disconnected (daemon , id , prev_connectd_counter ,
392+ prev_connect_start );
384393 return io_close (conn );
385394 }
386395
@@ -398,7 +407,8 @@ struct io_plan *peer_connected(struct io_conn *conn,
398407 prev_connectd_counter ,
399408 peer -> counter ,
400409 addr , remote_addr ,
401- incoming , their_features );
410+ incoming , their_features ,
411+ time_to_nsec (timemono_since (prev_connect_start )));
402412 } else {
403413 /* Tell gossipd about new peer */
404414 msg = towire_gossipd_new_peer (NULL , id , option_gossip_queries );
@@ -438,13 +448,15 @@ static struct io_plan *handshake_in_success(struct io_conn *conn,
438448 struct crypto_state * cs ,
439449 struct oneshot * timeout ,
440450 enum is_websocket is_websocket ,
451+ struct timemono starttime ,
441452 struct daemon * daemon )
442453{
443454 struct node_id id ;
444455 node_id_from_pubkey (& id , id_key );
445456 status_peer_debug (& id , "Connect IN" );
446457 return peer_exchange_initmsg (conn , daemon , daemon -> our_features ,
447- cs , & id , addr , timeout , is_websocket , true);
458+ cs , & id , addr , timeout , is_websocket ,
459+ starttime , true);
448460}
449461
450462/*~ If the timer goes off, we simply free everything, which hangs up. */
@@ -730,6 +742,7 @@ static struct io_plan *handshake_out_success(struct io_conn *conn,
730742 struct crypto_state * cs ,
731743 struct oneshot * timeout ,
732744 enum is_websocket is_websocket ,
745+ struct timemono starttime ,
733746 struct connecting * connect )
734747{
735748 struct node_id id ;
@@ -739,7 +752,8 @@ static struct io_plan *handshake_out_success(struct io_conn *conn,
739752 status_peer_debug (& id , "Connect OUT" );
740753 return peer_exchange_initmsg (conn , connect -> daemon ,
741754 connect -> daemon -> our_features ,
742- cs , & id , addr , timeout , is_websocket , false);
755+ cs , & id , addr , timeout , is_websocket ,
756+ starttime , false);
743757}
744758
745759struct io_plan * connection_out (struct io_conn * conn , struct connecting * connect )
0 commit comments