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

enum ofp_bsn_port_counter(wire_type=uint8_t, complete=False, stable=True) {
  OFP_BSN_PORT_COUNTER_RX_BYTES = 0,
  OFP_BSN_PORT_COUNTER_RX_PACKETS_UNICAST = 1,
  OFP_BSN_PORT_COUNTER_RX_PACKETS_BROADCAST = 2,
  OFP_BSN_PORT_COUNTER_RX_PACKETS_MULTICAST = 3,
  OFP_BSN_PORT_COUNTER_RX_DROPPED = 4,
  OFP_BSN_PORT_COUNTER_RX_ERRORS = 5,
  OFP_BSN_PORT_COUNTER_TX_BYTES = 6,
  OFP_BSN_PORT_COUNTER_TX_PACKETS_UNICAST = 7,
  OFP_BSN_PORT_COUNTER_TX_PACKETS_BROADCAST = 8,
  OFP_BSN_PORT_COUNTER_TX_PACKETS_MULTICAST = 9,
  OFP_BSN_PORT_COUNTER_TX_DROPPED = 10,
  OFP_BSN_PORT_COUNTER_TX_ERRORS = 11,
  OFP_BSN_PORT_COUNTER_RX_RUNTS = 12,
  OFP_BSN_PORT_COUNTER_RX_GIANTS = 13,
  OFP_BSN_PORT_COUNTER_RX_CRC_ERRORS = 14,
  OFP_BSN_PORT_COUNTER_RX_ALIGNMENT_ERRORS = 15,
  OFP_BSN_PORT_COUNTER_RX_SYMBOL_ERRORS = 16,
  OFP_BSN_PORT_COUNTER_RX_PAUSE_INPUT = 17,
  OFP_BSN_PORT_COUNTER_TX_COLLISIONS = 18,
  OFP_BSN_PORT_COUNTER_TX_LATE_COLLISIONS = 19,
  OFP_BSN_PORT_COUNTER_TX_DEFERRED = 20,
  OFP_BSN_PORT_COUNTER_TX_PAUSE_OUTPUT = 21,
  OFP_BSN_PORT_COUNTER_RX_PACKETS = 22,
  OFP_BSN_PORT_COUNTER_TX_PACKETS = 23,
  OFP_BSN_PORT_COUNTER_RX_LENGTH_ERRORS = 24,
  OFP_BSN_PORT_COUNTER_RX_OVERFLOW_ERRORS = 25,
  OFP_BSN_PORT_COUNTER_TX_CARRIER_ERRORS = 26,
  OFP_BSN_PORT_COUNTER_RX_PACKETS_BAD_VLAN = 27,
  OFP_BSN_PORT_COUNTER_LINK_UP = 28,
  OFP_BSN_PORT_COUNTER_LINK_DOWN = 29,
  OFP_BSN_PORT_COUNTER_RX_PFC_CONTROL_FRAME = 30,
  OFP_BSN_PORT_COUNTER_TX_PFC_CONTROL_FRAME = 31,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_0 = 32,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_1 = 33,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_2 = 34,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_3 = 35,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_4 = 36,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_5 = 37,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_6 = 38,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_7 = 39,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_0 = 40,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_1 = 41,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_2 = 42,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_3 = 43,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_4 = 44,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_5 = 45,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_6 = 46,
  OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_7 = 47,
  OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_0 = 48,
  OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_1 = 49,
  OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_2 = 50,
  OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_3 = 51,
  OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_4 = 52,
  OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_5 = 53,
  OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_6 = 54,
  OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_7 = 55,
};

struct of_bsn_port_counter_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 == 8;
    of_port_no_t port_no;
};

struct of_bsn_port_counter_stats_entry {
    uint16_t length;
    pad(2);
    of_port_no_t port_no;
    list(of_uint64_t) values;
};

struct of_bsn_port_counter_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 == 8;
    list(of_bsn_port_counter_stats_entry_t) entries;
};
