static grpc_error *init_settings_frame_parser(
    grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing) {
  if (transport_parsing->incoming_stream_id != 0) {
    return GRPC_ERROR_CREATE("Settings frame received for grpc_chttp2_stream");
  }

  grpc_error *err = grpc_chttp2_settings_parser_begin_frame(
      &transport_parsing->simple.settings,
      transport_parsing->incoming_frame_size,
      transport_parsing->incoming_frame_flags, transport_parsing->settings);
  if (err != GRPC_ERROR_NONE) {
    return err;
  }
  if (transport_parsing->incoming_frame_flags & GRPC_CHTTP2_FLAG_ACK) {
    transport_parsing->settings_ack_received = 1;
    grpc_chttp2_hptbl_set_max_bytes(
        &transport_parsing->hpack_parser.table,
        transport_parsing
            ->last_sent_settings[GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE]);
    transport_parsing->max_frame_size =
        transport_parsing
            ->last_sent_settings[GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE];
  }
  transport_parsing->parser = grpc_chttp2_settings_parser_parse;
  transport_parsing->parser_data = &transport_parsing->simple.settings;
  return GRPC_ERROR_NONE;
}
Exemple #2
0
static grpc_error *init_settings_frame_parser(grpc_exec_ctx *exec_ctx,
                                              grpc_chttp2_transport *t) {
  if (t->incoming_stream_id != 0) {
    return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
        "Settings frame received for grpc_chttp2_stream");
  }

  grpc_error *err = grpc_chttp2_settings_parser_begin_frame(
      &t->simple.settings, t->incoming_frame_size, t->incoming_frame_flags,
      t->settings[GRPC_PEER_SETTINGS]);
  if (err != GRPC_ERROR_NONE) {
    return err;
  }
  if (t->incoming_frame_flags & GRPC_CHTTP2_FLAG_ACK) {
    memcpy(t->settings[GRPC_ACKED_SETTINGS], t->settings[GRPC_SENT_SETTINGS],
           GRPC_CHTTP2_NUM_SETTINGS * sizeof(uint32_t));
    grpc_chttp2_hptbl_set_max_bytes(
        exec_ctx, &t->hpack_parser.table,
        t->settings[GRPC_ACKED_SETTINGS]
                   [GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE]);
    t->sent_local_settings = 0;
  }
  t->parser = grpc_chttp2_settings_parser_parse;
  t->parser_data = &t->simple.settings;
  return GRPC_ERROR_NONE;
}
Exemple #3
0
static int init_settings_frame_parser(
    grpc_chttp2_transport_parsing *transport_parsing) {
    int ok;

    if (transport_parsing->incoming_stream_id != 0) {
        gpr_log(GPR_ERROR, "settings frame received for grpc_chttp2_stream %d",
                transport_parsing->incoming_stream_id);
        return 0;
    }

    ok = GRPC_CHTTP2_PARSE_OK == grpc_chttp2_settings_parser_begin_frame(
             &transport_parsing->simple.settings,
             transport_parsing->incoming_frame_size,
             transport_parsing->incoming_frame_flags,
             transport_parsing->settings);
    if (!ok) {
        return 0;
    }
    if (transport_parsing->incoming_frame_flags & GRPC_CHTTP2_FLAG_ACK) {
        transport_parsing->settings_ack_received = 1;
    }
    transport_parsing->parser = grpc_chttp2_settings_parser_parse;
    transport_parsing->parser_data = &transport_parsing->simple.settings;
    return ok;
}