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

// Retrieve a list of configured controller connections and their status.
// When auxiliary connections are used there may be multiple connections
// to the same controller. All connections to a given controller will
// share the same role (so there may be multiple master connections in
// the list).

// The URIs are of the form tcp://1.2.3.4:6553

#version 4
#version 5
#version 6

enum ofp_bsn_controller_connection_state(wire_type=uint8_t) {
    OFP_BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED = 0,
    OFP_BSN_CONTROLLER_CONNECTION_STATE_CONNECTED = 1,
};

struct of_bsn_controller_connections_request : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 56;
};

struct of_bsn_controller_connection {
    enum ofp_bsn_controller_connection_state state;
    uint8_t auxiliary_id;
    pad(2);
    enum ofp_controller_role role;
    of_desc_str_t uri;
};

struct of_bsn_controller_connections_reply : of_bsn_header {
    uint8_t version;
    uint8_t type == 4;
    uint16_t length;
    uint32_t xid;
    uint32_t experimenter == 0x5c16c7;
    uint32_t subtype == 57;
    list(of_bsn_controller_connection_t) connections;
};
