|  | @@ -148,6 +148,8 @@ static void send_ping_locked(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                               grpc_chttp2_ping_type ping_type,
 | 
	
		
			
				|  |  |                               grpc_closure *on_initiate,
 | 
	
		
			
				|  |  |                               grpc_closure *on_complete);
 | 
	
		
			
				|  |  | +static void retry_initiate_ping_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
		
			
				|  |  | +                                       grpc_error *error);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define DEFAULT_MIN_TIME_BETWEEN_PINGS_MS 0
 | 
	
		
			
				|  |  |  #define DEFAULT_MAX_PINGS_BETWEEN_DATA 3
 | 
	
	
		
			
				|  | @@ -273,6 +275,8 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |    grpc_closure_init(&t->destructive_reclaimer_locked,
 | 
	
		
			
				|  |  |                      destructive_reclaimer_locked, t,
 | 
	
		
			
				|  |  |                      grpc_combiner_scheduler(t->combiner, false));
 | 
	
		
			
				|  |  | +  grpc_closure_init(&t->retry_initiate_ping_locked, retry_initiate_ping_locked,
 | 
	
		
			
				|  |  | +                    t, grpc_combiner_scheduler(t->combiner, false));
 | 
	
		
			
				|  |  |    grpc_closure_init(&t->start_bdp_ping_locked, start_bdp_ping_locked, t,
 | 
	
		
			
				|  |  |                      grpc_combiner_scheduler(t->combiner, false));
 | 
	
		
			
				|  |  |    grpc_closure_init(&t->finish_bdp_ping_locked, finish_bdp_ping_locked, t,
 | 
	
	
		
			
				|  | @@ -482,6 +486,7 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    t->ping_state.pings_before_data_required =
 | 
	
		
			
				|  |  |        t->ping_policy.max_pings_without_data;
 | 
	
		
			
				|  |  | +  t->ping_state.is_delayed_ping_timer_set = false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /** Start client-side keepalive pings */
 | 
	
		
			
				|  |  |    if (t->is_client) {
 | 
	
	
		
			
				|  | @@ -1407,6 +1412,13 @@ static void send_ping_locked(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +static void retry_initiate_ping_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
		
			
				|  |  | +                                       grpc_error *error) {
 | 
	
		
			
				|  |  | +  grpc_chttp2_transport *t = tp;
 | 
	
		
			
				|  |  | +  t->ping_state.is_delayed_ping_timer_set = false;
 | 
	
		
			
				|  |  | +  grpc_chttp2_initiate_write(exec_ctx, t, false, "retry_send_ping");
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void grpc_chttp2_ack_ping(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                            uint64_t id) {
 | 
	
		
			
				|  |  |    grpc_chttp2_ping_queue *pq =
 | 
	
	
		
			
				|  | @@ -2185,9 +2197,7 @@ static void finish_keepalive_ping_locked(grpc_exec_ctx *exec_ctx, void *arg,
 | 
	
		
			
				|  |  |        grpc_timer_init(
 | 
	
		
			
				|  |  |            exec_ctx, &t->keepalive_ping_timer,
 | 
	
		
			
				|  |  |            gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), t->keepalive_time),
 | 
	
		
			
				|  |  | -          grpc_closure_create(init_keepalive_ping_locked, t,
 | 
	
		
			
				|  |  | -                              grpc_combiner_scheduler(t->combiner, false)),
 | 
	
		
			
				|  |  | -          gpr_now(GPR_CLOCK_MONOTONIC));
 | 
	
		
			
				|  |  | +          &t->init_keepalive_ping_locked, gpr_now(GPR_CLOCK_MONOTONIC));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "keepalive ping end");
 |