// Copyright 2018-2024 Open Networking Foundation (ONF) and the ONF Contributors
//
// 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:
//
//     http://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";

option go_package = "github.com/opencord/bbsim/api/bbsim";

package bbsim;

import "voltha_protos/openolt.proto";
import "voltha_protos/tech_profile.proto";
// Models

message PONPort {
    int32 ID = 1;
    string OperState = 2;
    string InternalState = 3;
    uint64 PacketCount = 4;
    // ONU ID are reported by VOLTHA in the ActivateOnu call
    repeated PonAllocatedResources AllocatedOnuIds = 5;
    // these are the stored resource IDs as reported via OMCI
    repeated PonAllocatedResources AllocatedGemPorts = 6;
    repeated PonAllocatedResources AllocatedAllocIds = 7;
    string Technology = 8;
}

message PonAllocatedResources {
    string SerialNumber = 1;
    int32 Id = 2;
}

message NNIPort {
    int32 ID = 1;
    string OperState = 2;
}

message Olt {
    int32 ID = 1;
    string SerialNumber = 2;
    string OperState = 3;
    string InternalState = 4;
    string IP = 7;
    repeated NNIPort NNIPorts = 5;
    repeated PONPort PONPorts = 6;
    int32 NniDhcpTrapVid = 8;
}

message OltAllocatedResourceType {
    enum Type {
        UNKNOWN = 0;
        ALLOC_ID = 1;
        GEM_PORT = 2;
    }
    Type type = 1;
}

message OltAllocatedResource {
    string Type = 1;
    uint32 PonPortId = 2;
    uint32 OnuId = 3;
    uint32 PortNo = 4;
    int32 ResourceId = 5;
    uint64 FlowId = 6;
}

message OltAllocatedResources {
    repeated OltAllocatedResource resources = 1;
}

message ONU {
    int32 ID = 1;
    string SerialNumber = 2;
    string OperState = 3;
    string InternalState = 4;
    int32 PonPortID = 5;
    string HwAddress = 8 [deprecated = true];
    int32 PortNo = 9 [deprecated = true];
    repeated Service services = 10 [deprecated = true];
    int32 ImageSoftwareExpectedSections = 11;
    int32 ImageSoftwareReceivedSections = 12;
    int32 ActiveImageEntityId = 13;
    int32 CommittedImageEntityId = 14;
    repeated UNI unis = 15;
}

enum UniType{
    ETH = 0;
    POTS = 1;
}

message UNI {
    int32 ID = 1;
    int32 OnuID = 2;
    string OnuSn = 3;
    uint32 MeID = 4;
    string OperState = 5;
    int32 PortNo = 6;
    repeated Service services = 7;
    UniType Type = 8;
}

message Service {
    string Name = 1;
    string HwAddress = 2;
    string OnuSn = 3;
    int32 STag = 4;
    int32 CTag = 5;
    bool NeedsEapol = 6;
    bool NeedsDhcp = 7;
    bool NeedsIgmp = 8;
    int32 GemPort = 9;
    string EapolState = 10;
    string DhcpState = 11;
    string InternalState = 12;
    string IGMPState = 13;
    uint32 UniId = 14;
    int32 UniTagMatch = 15;
    uint32 UsCTagPriority = 16; //Upstream
    uint32 UsSTagPriority = 17; //Upstream
    uint32 DsCTagPriority = 18; //Downstream
    uint32 DsSTagPriority = 19; //Downstream
    bool NeedsPPPoE = 20;
    bool ConfigureMacAddress = 21;
    bool EnableMacLearning = 22;
}

message ONUTrafficSchedulers {
    tech_profile.TrafficSchedulers traffSchedulers = 1;
}

message ONUs {
    repeated ONU items = 1;
}

message Services {
    repeated Service items = 1;
}

message UNIs {
    repeated UNI items = 1;
}

// Inputs

message ONURequest {
    string SerialNumber = 1;
}

message PONRequest {
    uint32 PonPortId = 1;
}

message UNIRequest {
    string OnuSerialNumber = 1;
    string UniID = 2;
}

// Alarms

message AlarmType {
    // These types correspond to the messages permitted in the oneof
    // in AlarmIndication in the openolt protos
    enum Types {
        LOS = 0; // LOS is an OLT alarm for an entire PON
        DYING_GASP = 1;
        ONU_ALARM = 2;
        ONU_STARTUP_FAILURE = 3;
        ONU_SIGNAL_DEGRADE = 4;
        ONU_DRIFT_OF_WINDOW = 5;
        ONU_LOSS_OF_OMCI_CHANNEL = 6;
        ONU_SIGNALS_FAILURE = 7;
        ONU_TRANSMISSION_INTERFERENCE_WARNING = 8;
        ONU_ACTIVATION_FAILURE = 9;
        ONU_PROCESSING_ERROR = 10;
        ONU_LOSS_OF_KEY_SYNC_FAILURE = 11;
        ONU_ITU_PON_STATS = 12;

        // These break out ONU_ALARM, which is a single message, but
        // includes statuses for these six alarms.
        ONU_ALARM_LOS = 13;
        ONU_ALARM_LOB = 14;
        ONU_ALARM_LOPC_MISS = 15;
        ONU_ALARM_LOPC_MIC_ERROR = 16;
        ONU_ALARM_LOFI = 17;
        ONU_ALARM_LOAMI = 18;
    }
}

message AlarmParameter {
    string Key = 1;
    string Value = 2;
}

// ONUAlarmRequest includes fields common to every Onu alarm,
// plus an optional list of AlarmParameter list that can be used
// to set additional fields in alarms that support them.
message ONUAlarmRequest {
    string AlarmType = 1; // name of alarm to raise
    string SerialNumber = 2; // serial number of ONU
    string Status = 3; // status of Alarm
    repeated AlarmParameter Parameters = 4; // optional list of additional parameters
}

// OLT alarm request
message OLTAlarmRequest {
    uint32 InterfaceID = 1; // Switch Interface Id
    string InterfaceType = 2; // PON or NNI Type
    string Status = 3; // Interface Operstatus
}

// Utils

message VersionNumber {
    string version = 1;
    string buildTime = 2;
    string commitHash = 3;
    string gitStatus = 4;
}

message LogLevel {
    string level = 1;
    bool caller = 2;
}

message Response {
    int32 status_code = 1;
    string message = 2;
}

enum SubActionTypes {
    JOIN = 0;
    LEAVE = 1;
    JOINV3 = 2;
}

message IgmpRequest {
    string OnuSerialNumber = 1;
    int32 UniID = 2;
    SubActionTypes SubActionVal = 3;
    string GroupAddress = 4;
    int32 VLAN = 5;
}

message Flows {
    uint32 flow_count = 1;
    repeated openolt.Flow flows = 2;
}

message Timeout {
    uint32 delay = 1;
}

message Empty {
}

service BBSim {
    // Get BBSim version
    rpc Version (Empty) returns (VersionNumber) {
    }
    // Set BBSim log level
    rpc SetLogLevel (LogLevel) returns (LogLevel) {
    }

    // Get current status of OLT
    rpc GetOlt (Empty) returns (Olt) {
    }

    rpc GetOltAllocatedResources (OltAllocatedResourceType) returns (OltAllocatedResources) {
    }

    // Poweron OLT
    rpc PoweronOlt (Empty) returns (Response) {
    }
    // Shutdown OLT
    rpc ShutdownOlt (Empty) returns (Response) {
    }
    // Reboot OLT
    rpc RebootOlt (Empty) returns (Response) {
    }
    // Closes the Openolt gRPC server
    rpc StopgRPCServer (Empty) returns (Response) {
    }
    // Start the Openolt gRPC server
    rpc StartgRPCServer (Empty) returns (Response) {
    }
    // Restart the Openolt gRPC server after the given timeout
    rpc RestartgRPCServer (Timeout) returns (Response) {
    }

    // Get status of an ONU by serial number
    rpc GetONU (ONURequest) returns (ONU) {
    }
    // Get status of all ONUs
    rpc GetONUs (Empty) returns (ONUs) {
    }

    // Get all the Services by Uni ID
    rpc GetServices (UNIRequest) returns (Services) {
    }

    // Get all the UNIs of an ONU by serial number
    rpc GetOnuUnis (ONURequest) returns (UNIs) {
    }

    // Shutdown an ONU by serial number
    rpc ShutdownONU (ONURequest) returns (Response) {
    }
    // Shutdown all ONUs in OLT
    rpc ShutdownAllONUs (Empty) returns (Response) {
    }
    // Shutdown all ONUs under a PON by pon-port-ID
    rpc ShutdownONUsOnPON (PONRequest) returns (Response) {
    }

    // Poweron an ONU by serial number 
    rpc PoweronONU (ONURequest) returns (Response) {
    }
    // Poweron all ONUs in OLT
    rpc PoweronAllONUs (Empty) returns (Response) {
    }
    // Poweron all ONUs under a PON by pon-port-ID
    rpc PoweronONUsOnPON (PONRequest) returns (Response) {
    }

    // Restart EAPOL for ONU
    rpc RestartEapol (UNIRequest) returns (Response) {
    }
    // Restart DHCP for ONU
    rpc RestartDhcp (UNIRequest) returns (Response) {
    }
    // Send ONU alarm indication
    rpc SetOnuAlarmIndication (ONUAlarmRequest) returns (Response) {
    }
    // Send OLT alarm indication for Interface type NNI or PON
    rpc SetOltAlarmIndication (OLTAlarmRequest) returns (Response) {
    }
    // Get all flows or ONU specific flows
    rpc GetFlows (ONURequest) returns (Flows) {
    }
    // Change IGMP state
    rpc ChangeIgmpState (IgmpRequest) returns (Response) {
    }
    // Get Traffic scheduler information for ONU
    rpc GetOnuTrafficSchedulers (ONURequest) returns (ONUTrafficSchedulers) {
    }
    //Return all the UNIs for all the ONUs
    rpc GetUnis (Empty) returns (UNIs) {
    }

    //Invalidate the MDS counter for the ONU
    rpc InvalidateMds (ONURequest) returns (Response) {
    }
}
