/*
 * Copyright 2017-present Open Networking Foundation
 *
 * 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 java_package = "org.onosproject.grpc.nb.net.packet";

package nb.net.packet;

import "net/packet/PacketRequestProto.proto";
import "net/packet/PacketProcessorProto.proto";
import "net/packet/PacketProcessorEntryProto.proto";
import "net/packet/OutboundPacketProto.proto";
import "core/ApplicationIdProto.proto";
import "net/flow/TrafficSelectorProto.proto";

message addProcessorRequest {
    .net.packet.PacketProcessorProto packet_processor = 1;
    int32 priority = 2;
}

message addProcessorReply {
}

message removeProcessorRequest {
    .net.packet.PacketProcessorProto packet_processor = 1;
}

message removeProcessorReply {
}

message getProcessorsRequest {
}

message getProcessorsReply {
    repeated .net.packet.PacketProcessorEntryProto packetProcessor_entry = 1;
}

message requestPacketsRequest {
    .net.flow.TrafficSelectorProto traffic_selector = 1;
    int32 priority = 2;
    .core.ApplicationIdProto application_id = 3;
}

message requestPacketsReply {
}

message cancelPacketsRequest {
    .net.flow.TrafficSelectorProto traffic_selector = 1;
    int32 priority = 2;
    .core.ApplicationIdProto application_id = 3;
}

message cancelPacketsReply {
}

message getRequestsRequest {
}

message getRequestsReply {
    repeated .net.packet.PacketRequestProto packet_request = 1;
}

message emitRequest {
    .net.packet.OutboundPacketProto outbound_packet = 1;
}

message emitReply {
}

service DeviceService {
    rpc addProcessor(addProcessorRequest) returns (addProcessorReply) {}
    rpc removeProcessor(removeProcessorRequest) returns (removeProcessorReply) {}
    rpc getProcessors(getProcessorsRequest) returns (getProcessorsReply) {}
    rpc requestPackets(requestPacketsRequest) returns (requestPacketsReply) {}
    rpc cancelPackets(cancelPacketsRequest) returns (cancelPacketsReply) {}
    rpc getRequests(getRequestsRequest) returns (getRequestsReply) {}
    rpc emit(emitRequest) returns (emitReply) {}
}