// Copyright 2022 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
syntax = "proto3";

package pw.transfer;

option java_package = "pw.transfer";
option java_outer_classname = "ConfigProtos";

message TransferAction {
  enum ProtocolVersion {
    option allow_alias = true;
    UNKNOWN_VERSION = 0;
    V1 = 1;
    V2 = 2;
    LATEST = 2;
  }

  // As transfers are always client initiated, TransferType is from the client's
  // perspective.
  enum TransferType {
    UNKNOWN = 0;
    WRITE_TO_SERVER = 1;
    READ_FROM_SERVER = 2;
  }

  // Transfer resource ID to use for this transfer.
  uint32 resource_id = 1;

  // Path to the file that data should be read from or written to (depending on
  // transfer_type). When reading from the server, this is the path the file
  // is written to. When writing to the server, this is the path to the file
  // that should be read from.
  string file_path = 2;

  // Whether to write to the server, or read from it.
  TransferType transfer_type = 3;

  // Expected final status of transfer operation.
  //
  // TODO(b/241456982): This should be a pw.protobuf.StatusCode, but importing
  // other Pigweed protos doesn't work in Bazel.
  uint32 expected_status = 4;

  // Protocol version to initiate the transfer with.
  ProtocolVersion protocol_version = 5;
}

// Configuration for the integration test client.
message ClientConfig {
  // The sequence of transfer actions to perform during the lifetime of this
  // client configuration.
  repeated TransferAction transfer_actions = 1;

  // The maximum number of times this client will attempt to send a packet
  // before the transfer aborts due to a lack of response.
  uint32 max_retries = 2;

  // The maximum time this client will wait for a response to the first
  // packet sent to the pw_transfer server before attempting to retry. Extending
  // this can help work around cases where transfer initialization takes a long
  // time.
  //
  // Note: This parameter is only supported on Java transfer clients.
  // TODO(tpudlik): google.protobuf.Duration?
  uint32 initial_chunk_timeout_ms = 3;

  // The maximum amount of time this client will wait for a response to a sent
  // packet before attempting to re-send the packet.
  //
  // TODO(tpudlik): google.protobuf.Duration?
  uint32 chunk_timeout_ms = 4;

  // Cumulative maximum number of times to retry over the course of the transfer
  // before giving up.
  uint32 max_lifetime_retries = 5;
}

// Stacks of paths to use when doing transfers. Each new initiated transfer
// on this resource gets the next file path in the stack. Once the stack is
// exhausted, new transfers on this resource fail as though this resource is
// unregistered.
message ServerResourceLocations {
  // When a client reads from this server, this stack is used to determine which
  // file path to read data from.
  repeated string source_paths = 3;

  // When a client writes to this server, this stack is used to determine which
  // file path to write data to.
  repeated string destination_paths = 4;

  // If source_paths is exhausted or empty, this source path can be reused
  // as a fallback indefinitely.
  string default_source_path = 5;

  // If destination_paths is exhausted or empty, this destination path can be
  // reused as a fallback indefinitely.
  string default_destination_path = 6;
}

// Configuration for the integration test server.
message ServerConfig {
  // A mapping of transfer resource ID to files to read from or write to.
  map<uint32, ServerResourceLocations> resources = 1;

  // Size of the chunk buffer used by this server's transfer thread, in bytes.
  uint32 chunk_size_bytes = 2;

  // Window size, in bytes.
  uint32 pending_bytes = 3;

  // TODO(tpudlik): google.protobuf.Duration?
  uint32 chunk_timeout_seconds = 4;
  uint32 transfer_service_retries = 5;
  uint32 extend_window_divisor = 6;
}

// Configuration for the HdlcPacketizer proxy filter.
message HdlcPacketizerConfig {}

// Configuration for the DataDropper proxy filter.
message DataDropperConfig {
  // Rate at which to drop data
  float rate = 1;

  // Seed to use for the rand number generator used for determining
  // when data is dropped.
  int64 seed = 2;
}

// Configuration for the KeepDropQueue proxy filter.
message KeepDropQueueConfig {
  // A KeepDropQueue filter will alternate between keeping packets and dropping
  // chunks of data based on a keep/drop queue provided during its creation. The
  // queue is looped over unless a negative element is found. A negative number
  // is effectively the same as a value of infinity.
  //
  // This filter is typically most pratical when used with a packetizer so data
  // can be dropped as distinct packets.
  //
  // Examples:
  //
  //   keep_drop_queue = [3, 2]:
  //     Keeps 3 packets,
  //     Drops 2 packets,
  //     Keeps 3 packets,
  //     Drops 2 packets,
  //     ... [loops indefinitely]
  //
  //   keep_drop_queue = [5, 99, 1, -1]:
  //     Keeps 5 packets,
  //     Drops 99 packets,
  //     Keeps 1 packet,
  //     Drops all further packets.
  repeated int32 keep_drop_queue = 1;
}

// Configuration for the RateLimiter proxy filter.
message RateLimiterConfig {
  // Rate limit, in bytes/sec.
  float rate = 1;
}

// Configuration for the DataTransposer proxy filter.
message DataTransposerConfig {
  // Rate at which to transpose data.  Probability of transposition
  // between 0.0 and 1.0.
  float rate = 1;

  // Maximum time a chunk of data will be held for Transposition.  After this
  // time has elapsed, the packet is sent in order.
  float timeout = 2;

  // Seed to use for the rand number generator used for determining
  // when data is transposed.
  int64 seed = 3;
}

// Configuration for the ServerFailure proxy filter.
message ServerFailureConfig {
  // A list of numbers of packets to send before dropping all subsequent
  // packets until a TRANSFER_START packet is seen.  This process is
  // repeated for each element in packets_before_failure.  After that list
  // is exhausted, ServerFailure will send all packets.
  repeated uint32 packets_before_failure = 1;
}

// Configuration for the WindowPacketDropper proxy filter.
message WindowPacketDropperConfig {
  // The nth packet of every window to drop.
  uint32 window_packet_to_drop = 1;
}

// Configuration for a single stage in the proxy filter stack.
message FilterConfig {
  oneof filter {
    HdlcPacketizerConfig hdlc_packetizer = 1;
    DataDropperConfig data_dropper = 2;
    RateLimiterConfig rate_limiter = 3;
    DataTransposerConfig data_transposer = 4;
    ServerFailureConfig server_failure = 5;
    KeepDropQueueConfig keep_drop_queue = 6;
    WindowPacketDropperConfig window_packet_dropper = 7;
  }
}

message ProxyConfig {
  // Filters are listed in order of execution.  I.e. the first filter listed
  // will get the received data first then pass it on the the second listed
  // filter. That process repeats until the last filter send the data to the
  // other side of the proxy.
  repeated FilterConfig client_filter_stack = 1;
  repeated FilterConfig server_filter_stack = 2;
}
