/*
 * Copyright 2019 AT&T Intellectual Property
 * Copyright 2019 Nokia
 *
 * 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.
 */

/*
 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
 * platform project (RICP).
 */


syntax = "proto3";
package entities;
import "cell.proto";
import "gnb.proto";
import "enb.proto";
option go_package = "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib/entities";

message Cells{
    Cell.Type type = 1;
    oneof list{
        ServedCellInfoList served_cell_infos = 2;
        ServedNRCellList served_nr_cells = 3;
    }
}

message ServedCellInfoList{
    repeated ServedCellInfo served_cells = 1;
}

message ServedNRCellList{
    repeated ServedNRCell served_cells = 1;
}
