|  | @@ -52,7 +52,6 @@
 | 
	
		
			
				|  |  |  #include "src/core/transport/transport_impl.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define DEFAULT_WINDOW 65535
 | 
	
		
			
				|  |  | -#define GRPC_CHTTP2_STREAM_LOOKAHEAD DEFAULT_WINDOW
 | 
	
		
			
				|  |  |  #define DEFAULT_CONNECTION_WINDOW_TARGET (1024 * 1024)
 | 
	
		
			
				|  |  |  #define MAX_WINDOW 0x7fffffffu
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -245,6 +244,7 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |    t->global.is_client = is_client;
 | 
	
		
			
				|  |  |    t->writing.outgoing_window = DEFAULT_WINDOW;
 | 
	
		
			
				|  |  |    t->parsing.incoming_window = DEFAULT_WINDOW;
 | 
	
		
			
				|  |  | +  t->global.stream_lookahead = DEFAULT_WINDOW;
 | 
	
		
			
				|  |  |    t->global.connection_window_target = DEFAULT_CONNECTION_WINDOW_TARGET;
 | 
	
		
			
				|  |  |    t->global.ping_counter = 1;
 | 
	
		
			
				|  |  |    t->global.pings.next = t->global.pings.prev = &t->global.pings;
 | 
	
	
		
			
				|  | @@ -338,6 +338,18 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |            t->global.next_stream_id =
 | 
	
		
			
				|  |  |                (gpr_uint32)channel_args->args[i].value.integer;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +      } else if (0 == strcmp(channel_args->args[i].key,
 | 
	
		
			
				|  |  | +                             GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES)) {
 | 
	
		
			
				|  |  | +        if (channel_args->args[i].type != GRPC_ARG_INTEGER) {
 | 
	
		
			
				|  |  | +          gpr_log(GPR_ERROR, "%s: must be an integer",
 | 
	
		
			
				|  |  | +                  GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES);
 | 
	
		
			
				|  |  | +        } else if (channel_args->args[i].value.integer <= 5) {
 | 
	
		
			
				|  |  | +          gpr_log(GPR_ERROR, "%s: must be at least 5",
 | 
	
		
			
				|  |  | +                  GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          t->global.stream_lookahead =
 | 
	
		
			
				|  |  | +              (gpr_uint32)channel_args->args[i].value.integer;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |        } else if (0 == strcmp(channel_args->args[i].key,
 | 
	
		
			
				|  |  |                               GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER)) {
 | 
	
		
			
				|  |  |          if (channel_args->args[i].type != GRPC_ARG_INTEGER) {
 | 
	
	
		
			
				|  | @@ -1404,8 +1416,8 @@ static void incoming_byte_stream_update_flow_control(
 | 
	
		
			
				|  |  |    gpr_uint32 max_recv_bytes;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* clamp max recv hint to an allowable size */
 | 
	
		
			
				|  |  | -  if (max_size_hint >= GPR_UINT32_MAX - GRPC_CHTTP2_STREAM_LOOKAHEAD) {
 | 
	
		
			
				|  |  | -    max_recv_bytes = GPR_UINT32_MAX - GRPC_CHTTP2_STREAM_LOOKAHEAD;
 | 
	
		
			
				|  |  | +  if (max_size_hint >= GPR_UINT32_MAX - transport_global->stream_lookahead) {
 | 
	
		
			
				|  |  | +    max_recv_bytes = GPR_UINT32_MAX - transport_global->stream_lookahead;
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      max_recv_bytes = (gpr_uint32)max_size_hint;
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -1418,8 +1430,9 @@ static void incoming_byte_stream_update_flow_control(
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* add some small lookahead to keep pipelines flowing */
 | 
	
		
			
				|  |  | -  GPR_ASSERT(max_recv_bytes <= GPR_UINT32_MAX - GRPC_CHTTP2_STREAM_LOOKAHEAD);
 | 
	
		
			
				|  |  | -  max_recv_bytes += GRPC_CHTTP2_STREAM_LOOKAHEAD;
 | 
	
		
			
				|  |  | +  GPR_ASSERT(max_recv_bytes <=
 | 
	
		
			
				|  |  | +             GPR_UINT32_MAX - transport_global->stream_lookahead);
 | 
	
		
			
				|  |  | +  max_recv_bytes += transport_global->stream_lookahead;
 | 
	
		
			
				|  |  |    if (stream_global->max_recv_bytes < max_recv_bytes) {
 | 
	
		
			
				|  |  |      gpr_uint32 add_max_recv_bytes =
 | 
	
		
			
				|  |  |          max_recv_bytes - stream_global->max_recv_bytes;
 |