// 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 4
#version 5
#version 6

// LACP Convergence Status set in of_bsn_lacp_convergence_notif message
enum of_bsn_lacp_convergence_status(wire_type=uint8_t, complete=False) {
    LACP_SUCCESS = 0,
    LACP_TIMEDOUT = 1,
    LACP_OUT_OF_SYNC = 2,
};

struct of_bsn_set_lacp_request : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 41;
    uint8_t enabled;
    pad(3);
    of_port_no_t port_no;
    uint16_t actor_sys_priority;
    of_mac_addr_t actor_sys_mac;
    uint16_t actor_port_priority;
    uint16_t actor_port_num;
    uint16_t actor_key;
};

struct of_bsn_set_lacp_reply : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 42;
    uint32_t status;
    of_port_no_t port_no;
};

struct of_bsn_lacp_convergence_notif : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 43;
    uint8_t convergence_status;
    pad(3);
    of_port_no_t port_no;

    uint16_t actor_sys_priority;
    of_mac_addr_t actor_sys_mac;
    uint16_t actor_port_priority;
    uint16_t actor_port_num;
    uint16_t actor_key;

    uint16_t partner_sys_priority;
    of_mac_addr_t partner_sys_mac;
    uint16_t partner_port_priority;
    uint16_t partner_port_num;
    uint16_t partner_key;
};

struct of_bsn_lacp_stats_request : of_bsn_stats_request {
    uint8_t version;
    uint8_t type == 18;
    uint16_t length;
    uint32_t xid;
    uint16_t stats_type == 0xffff;
    enum ofp_stats_request_flags flags;
    pad(4);
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 1;
};

struct of_bsn_lacp_stats_entry {
    of_port_no_t port_no;
    uint16_t actor_sys_priority;
    of_mac_addr_t actor_sys_mac;
    uint16_t actor_port_priority;
    uint16_t actor_port_num;
    uint16_t actor_key;
    uint8_t convergence_status;
    pad(1);
    uint16_t partner_sys_priority;
    of_mac_addr_t partner_sys_mac;
    uint16_t partner_port_priority;
    uint16_t partner_port_num;
    uint16_t partner_key;
    pad(2);
};

struct of_bsn_lacp_stats_reply : of_bsn_stats_reply {
    uint8_t version;
    uint8_t type == 19;
    uint16_t length;
    uint32_t xid;
    uint16_t stats_type == 0xffff;
    enum ofp_stats_reply_flags flags;
    pad(4);
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 1;
    list(of_bsn_lacp_stats_entry_t) entries;
};
