// 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_DEDUPLICATION 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_DEDUPLICATION 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.

struct ofp_bsn_set_deduplication {
    uint8_t version;
    uint8_t type;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter;    // OF_EXPERIMENTER_ID_BSN
    uint32_t subtype;         // 11
    uint8_t enabled;
    uint8_t pad;
    uint16_t idle_timeout;
    uint16_t hard_timeout;
    uint16_t priority;
    uint64_t cookie;
};
