// Copyright (c) 2011 Arista Networks, Inc.  All rights reserved.
// Use of this source code is governed by the Apache License 2.0
// that can be found in the COPYING file.
//
// This Google Protocol Buffer schema contains the message
// that are used for Lanz streaming.
//

syntax = "proto2";

option go_package = "proto";

package LanzProtobuf;

message ConfigRecord {
   required uint64 timestamp = 1;    // Time of change in configuration in micro-seconds (UTC)
   required uint32 lanzVersion = 2;  // LANZ feature version
   required uint32 numOfPorts = 3;   // Num of ports in the switch
   required uint32 segmentSize = 4;  // Segement size
   required uint32 maxQueueSize = 5; // Maximum queue size in segments
   message PortConfigRecord {
      required string intfName = 1;      // Name of the port
      required uint32 switchId = 2;      // Id of the chip on a multi-chip system
      required uint32 portId = 3;        // Id of the port
      required bool internalPort = 4;    // 'True' if it's an internal port
      required uint32 highThreshold = 5; // Higher threshold
      required uint32 lowThreshold = 6;  // Lower threshold
   }
   repeated PortConfigRecord portConfigRecord = 6; // Lanz config details of each port
   optional uint32 globalUsageHighThreshold = 7;   // High threshold for global usage monitoring
   optional uint32 globalUsageLowThreshold = 8;    // Low threshold for global usage monitoring
   optional bool globalUsageReportingEnabled = 9;  // Global buffer reporting enabled
}

message GlobalBufferUsageRecord {
   enum EntryType {
      LOW = 1;
      UPDATE = 2;
      HIGH = 3;
   }
   optional EntryType entryType = 1;
   optional uint64 timestamp = 2;    // Time of entry in micro-seconds (UTC)
   optional uint32 bufferSize = 3;   // Size of global buffer
   optional uint32 duration = 4;     // duration of buffer usage between high and low
}

message CongestionRecord {
   required uint64 timestamp = 1;  // Time of congestion in micro-seconds (UTC)
   required string intfName = 2;   // Name of the port
   required uint32 switchId = 3;   // Id of the chip on a multi-chip system
   required uint32 portId = 4;     // Id of the port
   required uint32 queueSize = 5;  // Queue size in segments at time of congestion
   enum EntryType {
      START = 1;
      UPDATE = 2;
      END = 3;
   }
   optional EntryType entryType = 6;    // Type of entry
   optional uint32 trafficClass = 7;    // Traffic Class
   optional uint64 timeOfMaxQLen = 8;   // Time of max q len since congestion start
   optional uint32 txLatency = 9;       // Transmit latency
   optional uint32 qDropCount = 10;     // Queue drop count
   optional string fabricPeerIntfName = 11; // Name of the fabric port's peer
}

message ErrorRecord {
   required uint64 timestamp = 1;    // Time of event in micro-seconds (UTC)
   required string errorMessage = 2; // Text message
}

message LanzRecord {
   optional ConfigRecord configRecord = 1;
   optional CongestionRecord congestionRecord = 2;
   optional ErrorRecord errorRecord = 3;
   optional GlobalBufferUsageRecord globalBufferUsageRecord = 4;
}
