// Copyright 2013, Big Switch Networks, Inc.
//
// LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
// the following special exception:
//
// LOXI Exception
//
// As a special exception to the terms of the EPL, you may distribute libraries
// generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
// that copyright and licensing notices generated by LoxiGen are not altered or removed
// from the LoxiGen Libraries and the notice provided below is (i) included in
// the LoxiGen Libraries, if distributed in source code form and (ii) included in any
// documentation for the LoxiGen Libraries, if distributed in binary form.
//
// Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
//
// You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
// a copy of the EPL at:
//
// http://www.eclipse.org/legal/epl-v10.html
//
// 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
// EPL for the specific language governing permissions and limitations
// under the EPL.

#version any

// This extension enables the switch to send only one packet-in for a given flow.
// The goal is to reduce the load on the controller, particularly in the case of
// large UDP streams.
//
// When this extension is enabled (by sending the bsn_set_pktin_suppression message
// described below with enabled=1) the switch will install an exact-match drop
// flow for each packet-in. This flow has the idle_timeout, hard_timeout,
// priority, and cookie fields set to the values given in the
// bsn_set_pktin_suppression message.
//
// This extension does not affect packet-ins caused by an output to
// OFPP_CONTROLLER.
//
// When this extension is enabled the switch may still send multiple packet-ins
// for the same flow.
//
// This extension keeps its configuration across controller disconnects. When a
// controller that is aware of this extension connects to a switch it should send
// a DELETE flow-mod with the cookie field set to ensure that it receives
// packet-ins for ongoing flows.
//
// The flows installed by this extension are not automatically deleted when the
// extension is disabled. Similarly other configuration changes (cookie, etc) do
// not affect already-installed flows.
//
// The switch should reject the message if both 'hard_timeout' and 'idle_timeout'
// are zero, since the suppression flows would never expire.

struct of_bsn_set_pktin_suppression_request : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 11;
    uint8_t enabled;
    pad(1);
    uint16_t idle_timeout;
    uint16_t hard_timeout;
    uint16_t priority;
    uint64_t cookie;
};

struct of_bsn_set_pktin_suppression_reply : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 25;
    uint32_t status; // 0 means success
};
