// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.tracing.controller;

using zx;

/// The maximum number of providers supported.
const uint32 MAX_NUM_PROVIDERS = 100;

/// The maximum length of a provider's name.
const uint32 MAX_PROVIDER_NAME_LENGTH = 100;

/// The maximum number of categories supported.
const uint32 MAX_NUM_CATEGORIES = 100;

/// The maximum length of a category name.
const uint32 MAX_CATEGORY_NAME_LENGTH = 100;

/// The maximum length of a category description.
const uint32 MAX_CATEGORY_DESCRIPTION_LENGTH = 400;

/// The maximum length of an alert name.
const uint32 MAX_ALERT_NAME_LENGTH = 14;

/// The state of the tracing session.
/// A "session" is everything between `Initialize` and `Terminate`.
enum SessionState {
    /// The tracing system is ready for a new session.
    /// There can be only one session at a time.
    READY = 1;
    /// A new tracing session has been initialized.
    INITIALIZED = 2;
    /// Tracing is in the midst of starting.
    STARTING = 3;
    /// Tracing has started.
    STARTED = 4;
    /// Tracing is in the midst of being stopped.
    STOPPING = 5;
    /// Tracing has fully stopped.
    STOPPED = 6;
    /// Tracing is in the midst of being terminated.
    /// Once the system has completely terminated the session it goes back
    /// to the READY state.
    TERMINATING = 7;
};

/// The controller interface used by the trace tool to initialize/start/stop/terminate tracing.
///
/// The trace controller may lightly validate the structure of
/// trace records as it copies them from trace buffers into the output.
/// In particular, it may verify the size of each record header to ensure
/// that the framing of trace records in the data stream is maintained.
///
/// The trace controller does not validate the contents of the trace records
/// themselves.  For example, it does not try to check argument lengths in
/// events.  This ensures that the trace format can be extended without needing
/// to modify the trace controller.
[Discoverable]
protocol Controller {
    /// Requests to initialize tracing with the specified `config`.
    ///
    /// A bad request will terminate the connection.
    ///
    /// The trace controller emits trace data to `output` as a sequence of
    /// binary formatted trace records.  Traces obtained from different providers
    /// are delimited by metadata records within the stream.
    InitializeTracing(TraceConfig config, zx.handle:SOCKET output);

    /// Requests to terminate tracing.
    ///
    /// If tracing has not yet stopped it is stopped first.
    /// If `options.write_results` is true, then the trace controller
    /// continues to transfer any remaining data to the output socket
    /// until finished, then closes the output.
    TerminateTracing(TerminateOptions options) -> (TerminateResult result);

    /// Requests to start tracing with the specified `options`.
    ///
    /// If tracing has already started then the request is ignored,
    /// except to send back an error code.
    ///
    /// The trace controller acknowledges the request when all
    /// registered providers have been started or after
    /// `TraceConfig.start_timeout_milliseconds` milliseconds.
    /// One useful reason for the has-started acknowledgement is that the
    /// trace program can start a program to trace knowing that all the
    /// providers are started.
    StartTracing(StartOptions options) -> () error StartErrorCode;

    /// Requests to stop tracing.
    ///
    /// If tracing has already stopped then this does nothing.
    /// Returning a result lets callers know when it's ok to, for example,
    /// start tracing again.
    StopTracing(StopOptions options) -> ();

    /// Return the set of registered providers.
    GetProviders() -> (vector<ProviderInfo>:MAX_NUM_PROVIDERS providers);

    // Gets the known categories.
    GetKnownCategories() -> (vector<KnownCategory>:MAX_NUM_CATEGORIES categories);

    /// Event sent when the session state changes.
    -> OnSessionStateChange(SessionState state);

    /// Returns the next alert when it arrives.
    WatchAlert() -> (string:MAX_ALERT_NAME_LENGTH alert_name);
};

// This is a copy of provider.fidl:BufferingMode.
enum BufferingMode : uint8 {
    ONESHOT = 0;
    CIRCULAR = 1;
    STREAMING = 2;
};

// Individual providers can be tuned with this.
table ProviderSpec {
    1: string:MAX_PROVIDER_NAME_LENGTH name;
    2: uint32 buffer_size_megabytes_hint;
};

/// Provides options for the trace.
table TraceConfig {
    /// The trace categories to record, or an empty array for all.
    1: vector<string:MAX_CATEGORY_NAME_LENGTH>:MAX_NUM_CATEGORIES categories;

    /// Suggested size of trace buffer which each provider should receive.
    // TODO(fxbug.dev/7932): Default to 4.
    2: uint32 buffer_size_megabytes_hint;

    /// Acknowledge start request after at most `start_timeout_milliseconds`.
    // TODO(fxbug.dev/7932): Default to 5000.
    3: uint64 start_timeout_milliseconds;

    // TODO(fxbug.dev/7932), TODO(fxbug.dev/7810): Default to BufferingMode.ONESHOT.
    4: BufferingMode buffering_mode;

    /// Overrides for particular providers.
    5: vector<ProviderSpec>:MAX_NUM_PROVIDERS provider_specs;
};

/// Terminate options.
table TerminateOptions {
    /// If true then write trace results.
    /// If false then discard trace results.
    1: bool write_results;
};

/// Result of a terminate request.
table TerminateResult {
    // TODO(dje): Provider stats.
};

/// Choices for clearing/retaining trace buffer contents at Start.
/// A brief summary of buffer contents:
/// The trace buffer is divided into two main pieces: durable and
/// non-durable.
/// The durable portion contains things like the string and thread data for
/// their respective references (trace_encoded_string_ref_t and
/// trace_encoded_thread_ref_t). The non-durable portion contains the rest of
/// the trace data like events); this is the portion that, for example, is
/// discarded in circular buffering mode when the (non-durable) buffer fills.
enum BufferDisposition : uint8 {
    /// Clear the entire buffer, including durable buffer contents.
    /// N.B. If this is done mid-session, then string and thread references
    /// from prior to this point will become invalid - the underlying data
    /// will be gone. To prevent this save buffer contents before clearing.
    ///
    /// This is typically used when buffer contents were saved after the
    /// preceding Stop.
    CLEAR_ALL = 1;

    /// Clear the non-durable portion of the buffer, retaining the durable
    /// portion.
    ///
    /// This is typically used when buffer contents were not saved after the
    /// preceding Stop and the current contents are to be discarded.
    CLEAR_NONDURABLE = 2;

    /// Retain buffer contents. New trace data is added whether the previous
    /// trace run left off.
    ///
    /// This is typically used when buffer contents were not saved after the
    /// preceding Stop and the current contents are to be retained.
    RETAIN = 3;
};

/// Error codes from Start operations.
enum StartErrorCode {
    /// Tracing hasn't been initialized, not ready to start.
    NOT_INITIALIZED = 1;
    /// Tracing has already been started.
    ALREADY_STARTED = 2;
    /// Tracing is currently being stopped.
    STOPPING = 3;
    /// Tracing is currently being terminated.
    TERMINATING = 4;
};

/// Additional options to control trace data collection.
table StartOptions {
    /// Whether and how to clear the buffer when starting data collection.
    /// This allows, for example, multiple Start/Stop trace runs to be
    /// collected in the same buffer.
    ///
    /// If the preceding `Stop()` request had `save_after_stopped=true`
    /// then this value is overridden to CLEAR_ENTIRE_BUFFER to avoid
    /// duplicate data being saved.
    1: BufferDisposition buffer_disposition;

    /// The trace categories to add to the initial set provided in
    /// `TraceConfig`. If the combined number of categories goes over the
    /// limit then the extra categories past the limit are discarded.
    2: vector<string:MAX_CATEGORY_NAME_LENGTH>:MAX_NUM_CATEGORIES
           additional_categories;
};

/// Additional options to control stopping of a trace.
table StopOptions {
    /// If true then write all collected data after tracing has stopped.
    /// This is useful in situations where one wants to clear the buffer
    /// before starting the next trace, without having to first terminate the
    /// trace and start a new one.
    1: bool write_results;
};

/// Result of `GetKnownCategories`.
struct KnownCategory {
    // Category name.
    string:MAX_CATEGORY_NAME_LENGTH name;
    // Category description.
    string:MAX_CATEGORY_DESCRIPTION_LENGTH description;
};

/// Result of `GetProviders`.
table ProviderInfo {
    /// The provider's ID, assigned by trace-manager.
    1: uint32 id;

    /// The provider's pid.
    2: zx.koid pid;

    /// The name of the provider.
    3: string:MAX_PROVIDER_NAME_LENGTH name;
};
