blob: 07f246e269fc8d793c9fd6448b8fcdf8e7e3f9f7 [file] [log] [blame]
// 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.
//
// Also derived from the OpenFlow header files which have these copyrights:
// Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
// Copyright (c) 2011, 2012 Open Networking Foundation
#version 2
enum macro_definitions {
OFP_MAX_TABLE_NAME_LEN = 32,
OFP_MAX_PORT_NAME_LEN = 16,
OFP_TCP_PORT = 6653,
OFP_SSL_PORT = 6653,
OFP_ETH_ALEN = 6,
OFP_DEFAULT_MISS_SEND_LEN = 128,
OFPFW_ICMP_TYPE = 0x40,
OFPFW_ICMP_CODE = 0x80,
OFP_DL_TYPE_ETH2_CUTOFF = 0x600,
OFP_DL_TYPE_NOT_ETH_TYPE = 0x5ff,
OFP_VLAN_NONE = 0,
OFPMT_STANDARD_LENGTH = 88,
OFP_FLOW_PERMANENT = 0,
OFP_DEFAULT_PRIORITY = 0x8000,
DESC_STR_LEN = 256,
SERIAL_NUM_LEN = 32,
OFPQ_ALL = 0xffffffff,
OFPQ_MIN_RATE_UNCFG = 0xffff,
};
enum ofp_port(wire_type=uint32_t) {
OFPP_MAX = 0xffffff00,
OFPP_IN_PORT = 0xfffffff8,
OFPP_TABLE = 0xfffffff9,
OFPP_NORMAL = 0xfffffffa,
OFPP_FLOOD = 0xfffffffb,
OFPP_ALL = 0xfffffffc,
OFPP_CONTROLLER = 0xfffffffd,
OFPP_LOCAL = 0xfffffffe,
OFPP_ANY = 0xffffffff,
};
enum ofp_type(wire_type=uint8_t) {
OFPT_HELLO = 0,
OFPT_ERROR = 1,
OFPT_ECHO_REQUEST = 2,
OFPT_ECHO_REPLY = 3,
OFPT_EXPERIMENTER = 4,
OFPT_FEATURES_REQUEST = 5,
OFPT_FEATURES_REPLY = 6,
OFPT_GET_CONFIG_REQUEST = 7,
OFPT_GET_CONFIG_REPLY = 8,
OFPT_SET_CONFIG = 9,
OFPT_PACKET_IN = 10,
OFPT_FLOW_REMOVED = 11,
OFPT_PORT_STATUS = 12,
OFPT_PACKET_OUT = 13,
OFPT_FLOW_MOD = 14,
OFPT_GROUP_MOD = 15,
OFPT_PORT_MOD = 16,
OFPT_TABLE_MOD = 17,
OFPT_STATS_REQUEST = 18,
OFPT_STATS_REPLY = 19,
OFPT_BARRIER_REQUEST = 20,
OFPT_BARRIER_REPLY = 21,
OFPT_QUEUE_GET_CONFIG_REQUEST = 22,
OFPT_QUEUE_GET_CONFIG_REPLY = 23,
};
enum ofp_config_flags(wire_type=uint16_t, bitmask=True) {
OFPC_FRAG_NORMAL = 0,
OFPC_FRAG_DROP = 1,
OFPC_FRAG_REASM = 2,
OFPC_FRAG_MASK(virtual=True) = 3,
OFPC_INVALID_TTL_TO_CONTROLLER = 4,
};
enum ofp_table_config(wire_type=uint32_t, bitmask=True) {
OFPTC_TABLE_MISS_CONTROLLER = 0,
OFPTC_TABLE_MISS_CONTINUE = 1,
OFPTC_TABLE_MISS_DROP = 2,
OFPTC_TABLE_MISS_MASK(virtual=True) = 3,
};
enum ofp_capabilities(wire_type=uint32_t, bitmask=True) {
OFPC_FLOW_STATS = 0x1,
OFPC_TABLE_STATS = 0x2,
OFPC_PORT_STATS = 0x4,
OFPC_GROUP_STATS = 0x8,
OFPC_IP_REASM = 0x20,
OFPC_QUEUE_STATS = 0x40,
OFPC_ARP_MATCH_IP = 0x80,
};
enum ofp_port_config(wire_type=uint32_t, bitmask=True) {
OFPPC_PORT_DOWN = 0x1,
OFPPC_NO_RECV = 0x4,
OFPPC_NO_FWD = 0x20,
OFPPC_NO_PACKET_IN = 0x40,
OFPPC_BSN_MIRROR_DEST = 0x80000000,
};
enum ofp_port_state(wire_type=uint32_t, bitmask=True) {
OFPPS_LINK_DOWN = 0x1,
OFPPS_BLOCKED = 0x2,
OFPPS_LIVE = 0x4,
};
enum ofp_port_features(wire_type=uint32_t, bitmask=True) {
OFPPF_10MB_HD = 0x1,
OFPPF_10MB_FD = 0x2,
OFPPF_100MB_HD = 0x4,
OFPPF_100MB_FD = 0x8,
OFPPF_1GB_HD = 0x10,
OFPPF_1GB_FD = 0x20,
OFPPF_10GB_FD = 0x40,
OFPPF_40GB_FD = 0x80,
OFPPF_100GB_FD = 0x100,
OFPPF_1TB_FD = 0x200,
OFPPF_OTHER = 0x400,
OFPPF_COPPER = 0x800,
OFPPF_FIBER = 0x1000,
OFPPF_AUTONEG = 0x2000,
OFPPF_PAUSE = 0x4000,
OFPPF_PAUSE_ASYM = 0x8000,
};
enum ofp_port_reason(wire_type=uint8_t) {
OFPPR_ADD = 0,
OFPPR_DELETE = 1,
OFPPR_MODIFY = 2,
};
enum ofp_packet_in_reason(wire_type=uint8_t) {
OFPR_NO_MATCH = 0,
OFPR_ACTION = 1,
};
enum ofp_action_type(wire_type=uint16_t) {
OFPAT_OUTPUT = 0,
OFPAT_SET_VLAN_VID = 1,
OFPAT_SET_VLAN_PCP = 2,
OFPAT_SET_DL_SRC = 3,
OFPAT_SET_DL_DST = 4,
OFPAT_SET_NW_SRC = 5,
OFPAT_SET_NW_DST = 6,
OFPAT_SET_NW_TOS = 7,
OFPAT_SET_NW_ECN = 8,
OFPAT_SET_TP_SRC = 9,
OFPAT_SET_TP_DST = 10,
OFPAT_COPY_TTL_OUT = 11,
OFPAT_COPY_TTL_IN = 12,
OFPAT_SET_MPLS_LABEL = 13,
OFPAT_SET_MPLS_TC = 14,
OFPAT_SET_MPLS_TTL = 15,
OFPAT_DEC_MPLS_TTL = 16,
OFPAT_PUSH_VLAN = 17,
OFPAT_POP_VLAN = 18,
OFPAT_PUSH_MPLS = 19,
OFPAT_POP_MPLS = 20,
OFPAT_SET_QUEUE = 21,
OFPAT_GROUP = 22,
OFPAT_SET_NW_TTL = 23,
OFPAT_DEC_NW_TTL = 24,
OFPAT_EXPERIMENTER = 0xffff,
};
enum ofp_flow_mod_command(wire_type=uint8_t) {
OFPFC_ADD = 0,
OFPFC_MODIFY = 1,
OFPFC_MODIFY_STRICT = 2,
OFPFC_DELETE = 3,
OFPFC_DELETE_STRICT = 4,
};
enum ofp_group_mod_command(wire_type=uint16_t) {
OFPGC_ADD = 0,
OFPGC_MODIFY = 1,
OFPGC_DELETE = 2,
};
enum ofp_flow_wildcards(wire_type=uint32_t, bitmask=True) {
OFPFW_IN_PORT = 0x1,
OFPFW_DL_VLAN = 0x2,
OFPFW_DL_VLAN_PCP = 0x4,
OFPFW_DL_TYPE = 0x8,
OFPFW_NW_TOS = 0x10,
OFPFW_NW_PROTO = 0x20,
OFPFW_TP_SRC = 0x40,
OFPFW_TP_DST = 0x80,
OFPFW_MPLS_LABEL = 0x100,
OFPFW_MPLS_TC = 0x200,
OFPFW_ALL(virtual=True) = 0x3ff,
};
enum ofp_vlan_id(wire_type=uint16_t) {
OFPVID_ANY = 0xfffe,
OFPVID_NONE = 0xffff,
};
enum ofp_match_type(wire_type=uint16_t) {
OFPMT_STANDARD = 0,
};
enum ofp_instruction_type(wire_type=uint16_t, bitmask=True) {
OFPIT_GOTO_TABLE = 0x1,
OFPIT_WRITE_METADATA = 0x2,
OFPIT_WRITE_ACTIONS = 0x3,
OFPIT_APPLY_ACTIONS = 0x4,
OFPIT_CLEAR_ACTIONS = 0x5,
OFPIT_EXPERIMENTER = 0xffff,
};
enum ofp_flow_mod_flags(wire_type=uint16_t, bitmask=True) {
OFPFF_SEND_FLOW_REM = 0x1,
OFPFF_CHECK_OVERLAP = 0x2,
};
enum ofp_group(wire_type=uint32_t, complete=False) {
OFPG_MAX = 0xffffff00,
OFPG_ALL = 0xfffffffc,
OFPG_ANY = 0xffffffff,
};
enum ofp_group_type(wire_type=uint8_t) {
OFPGT_ALL = 0,
OFPGT_SELECT = 1,
OFPGT_INDIRECT = 2,
OFPGT_FF = 3,
};
enum ofp_flow_removed_reason(wire_type=uint8_t) {
OFPRR_IDLE_TIMEOUT = 0,
OFPRR_HARD_TIMEOUT = 1,
OFPRR_DELETE = 2,
OFPRR_GROUP_DELETE = 3,
};
enum ofp_error_type(wire_type=uint16_t) {
OFPET_HELLO_FAILED = 0,
OFPET_BAD_REQUEST = 1,
OFPET_BAD_ACTION = 2,
OFPET_BAD_INSTRUCTION = 3,
OFPET_BAD_MATCH = 4,
OFPET_FLOW_MOD_FAILED = 5,
OFPET_GROUP_MOD_FAILED = 6,
OFPET_PORT_MOD_FAILED = 7,
OFPET_TABLE_MOD_FAILED = 8,
OFPET_QUEUE_OP_FAILED = 9,
OFPET_SWITCH_CONFIG_FAILED = 10,
};
enum ofp_hello_failed_code(wire_type=uint16_t) {
OFPHFC_INCOMPATIBLE = 0,
OFPHFC_EPERM = 1,
};
enum ofp_bad_request_code(wire_type=uint16_t) {
OFPBRC_BAD_VERSION = 0,
OFPBRC_BAD_TYPE = 1,
OFPBRC_BAD_STAT = 2,
OFPBRC_BAD_EXPERIMENTER = 3,
OFPBRC_BAD_SUBTYPE = 4,
OFPBRC_EPERM = 5,
OFPBRC_BAD_LEN = 6,
OFPBRC_BUFFER_EMPTY = 7,
OFPBRC_BUFFER_UNKNOWN = 8,
OFPBRC_BAD_TABLE_ID = 9,
};
enum ofp_bad_action_code(wire_type=uint16_t) {
OFPBAC_BAD_TYPE = 0,
OFPBAC_BAD_LEN = 1,
OFPBAC_BAD_EXPERIMENTER = 2,
OFPBAC_BAD_EXPERIMENTER_TYPE = 3,
OFPBAC_BAD_OUT_PORT = 4,
OFPBAC_BAD_ARGUMENT = 5,
OFPBAC_EPERM = 6,
OFPBAC_TOO_MANY = 7,
OFPBAC_BAD_QUEUE = 8,
OFPBAC_BAD_OUT_GROUP = 9,
OFPBAC_MATCH_INCONSISTENT = 10,
OFPBAC_UNSUPPORTED_ORDER = 11,
OFPBAC_BAD_TAG = 12,
};
enum ofp_bad_instruction_code(wire_type=uint16_t) {
OFPBIC_UNKNOWN_INST = 0,
OFPBIC_UNSUP_INST = 1,
OFPBIC_BAD_TABLE_ID = 2,
OFPBIC_UNSUP_METADATA = 3,
OFPBIC_UNSUP_METADATA_MASK = 4,
OFPBIC_UNSUP_EXP_INST = 5,
};
enum ofp_bad_match_code(wire_type=uint16_t) {
OFPBMC_BAD_TYPE = 0,
OFPBMC_BAD_LEN = 1,
OFPBMC_BAD_TAG = 2,
OFPBMC_BAD_DL_ADDR_MASK = 3,
OFPBMC_BAD_NW_ADDR_MASK = 4,
OFPBMC_BAD_WILDCARDS = 5,
OFPBMC_BAD_FIELD = 6,
OFPBMC_BAD_VALUE = 7,
};
enum ofp_flow_mod_failed_code(wire_type=uint16_t) {
OFPFMFC_UNKNOWN = 0,
OFPFMFC_TABLE_FULL = 1,
OFPFMFC_BAD_TABLE_ID = 2,
OFPFMFC_OVERLAP = 3,
OFPFMFC_EPERM = 4,
OFPFMFC_BAD_TIMEOUT = 5,
OFPFMFC_BAD_COMMAND = 6,
};
enum ofp_group_mod_failed_code(wire_type=uint16_t) {
OFPGMFC_GROUP_EXISTS = 0,
OFPGMFC_INVALID_GROUP = 1,
OFPGMFC_WEIGHT_UNSUPPORTED = 2,
OFPGMFC_OUT_OF_GROUPS = 3,
OFPGMFC_OUT_OF_BUCKETS = 4,
OFPGMFC_CHAINING_UNSUPPORTED = 5,
OFPGMFC_WATCH_UNSUPPORTED = 6,
OFPGMFC_LOOP = 7,
OFPGMFC_UNKNOWN_GROUP = 8,
};
enum ofp_port_mod_failed_code(wire_type=uint16_t) {
OFPPMFC_BAD_PORT = 0,
OFPPMFC_BAD_HW_ADDR = 1,
OFPPMFC_BAD_CONFIG = 2,
OFPPMFC_BAD_ADVERTISE = 3,
};
enum ofp_table_mod_failed_code(wire_type=uint16_t) {
OFPTMFC_BAD_TABLE = 0,
OFPTMFC_BAD_CONFIG = 1,
};
enum ofp_queue_op_failed_code(wire_type=uint16_t) {
OFPQOFC_BAD_PORT = 0,
OFPQOFC_BAD_QUEUE = 1,
OFPQOFC_EPERM = 2,
};
enum ofp_switch_config_failed_code(wire_type=uint16_t) {
OFPSCFC_BAD_FLAGS = 0,
OFPSCFC_BAD_LEN = 1,
};
enum ofp_stats_type(wire_type=uint16_t) {
OFPST_DESC = 0,
OFPST_FLOW = 1,
OFPST_AGGREGATE = 2,
OFPST_TABLE = 3,
OFPST_PORT = 4,
OFPST_QUEUE = 5,
OFPST_GROUP = 6,
OFPST_GROUP_DESC = 7,
OFPST_EXPERIMENTER = 0xffff,
};
// none defined
enum ofp_stats_request_flags(wire_type=uint16_t, bitmask=True) {
};
enum ofp_stats_reply_flags(wire_type=uint16_t, bitmask=True) {
OFPSF_REPLY_MORE = 0x1,
};
enum ofp_queue_properties(wire_type=uint16_t) {
OFPQT_NONE = 0,
OFPQT_MIN_RATE = 1,
};
/* XXX rename to of_message */
struct of_header {
uint8_t version;
uint8_t type == ?;
uint16_t length;
uint32_t xid;
};
struct of_hello : of_header {
uint8_t version;
uint8_t type == 0;
uint16_t length;
uint32_t xid;
};
struct of_echo_request : of_header {
uint8_t version;
uint8_t type == 2;
uint16_t length;
uint32_t xid;
of_octets_t data;
};
struct of_echo_reply : of_header {
uint8_t version;
uint8_t type == 3;
uint16_t length;
uint32_t xid;
of_octets_t data;
};
struct of_experimenter : of_header {
uint8_t version;
uint8_t type == 4;
uint16_t length;
uint32_t xid;
uint32_t experimenter == ?;
of_octets_t data;
};
struct of_barrier_request : of_header {
uint8_t version;
uint8_t type == 20;
uint16_t length;
uint32_t xid;
};
struct of_barrier_reply : of_header {
uint8_t version;
uint8_t type == 21;
uint16_t length;
uint32_t xid;
};
struct of_get_config_request : of_header {
uint8_t version;
uint8_t type == 7;
uint16_t length;
uint32_t xid;
};
struct of_get_config_reply : of_header {
uint8_t version;
uint8_t type == 8;
uint16_t length;
uint32_t xid;
enum ofp_config_flags flags;
uint16_t miss_send_len;
};
struct of_set_config : of_header {
uint8_t version;
uint8_t type == 9;
uint16_t length;
uint32_t xid;
enum ofp_config_flags flags;
uint16_t miss_send_len;
};
struct of_table_mod : of_header {
uint8_t version;
uint8_t type == 17;
uint16_t length;
uint32_t xid;
uint8_t table_id;
pad(3);
uint32_t config;
};
struct of_port_desc {
of_port_no_t port_no;
pad(4);
of_mac_addr_t hw_addr;
pad(2);
of_port_name_t name;
enum ofp_port_config config;
enum ofp_port_state state;
enum ofp_port_features curr;
enum ofp_port_features advertised;
enum ofp_port_features supported;
enum ofp_port_features peer;
uint32_t curr_speed;
uint32_t max_speed;
};
struct of_features_request : of_header {
uint8_t version;
uint8_t type == 5;
uint16_t length;
uint32_t xid;
};
struct of_features_reply : of_header {
uint8_t version;
uint8_t type == 6;
uint16_t length;
uint32_t xid;
uint64_t datapath_id;
uint32_t n_buffers;
uint8_t n_tables;
pad(3);
enum ofp_capabilities capabilities;
uint32_t reserved;
list(of_port_desc_t) ports;
};
struct of_port_status : of_header {
uint8_t version;
uint8_t type == 12;
uint16_t length;
uint32_t xid;
enum ofp_port_reason reason;
pad(7);
of_port_desc_t desc;
};
struct of_port_mod : of_header {
uint8_t version;
uint8_t type == 16;
uint16_t length;
uint32_t xid;
of_port_no_t port_no;
pad(4);
of_mac_addr_t hw_addr;
pad(2);
enum ofp_port_config config;
enum ofp_port_config mask;
uint32_t advertise;
pad(4);
};
struct of_packet_in : of_header {
uint8_t version;
uint8_t type == 10;
uint16_t length;
uint32_t xid;
uint32_t buffer_id;
of_port_no_t in_port;
of_port_no_t in_phy_port;
uint16_t total_len;
uint8_t reason;
uint8_t table_id;
of_octets_t data;
};
struct of_action_output : of_action {
uint16_t type == 0;
uint16_t len;
of_port_no_t port;
uint16_t max_len;
pad(6);
};
struct of_action_set_vlan_vid : of_action {
uint16_t type == 1;
uint16_t len;
uint16_t vlan_vid;
pad(2);
};
struct of_action_set_vlan_pcp : of_action {
uint16_t type == 2;
uint16_t len;
uint8_t vlan_pcp;
pad(3);
};
struct of_action_set_dl_src : of_action {
uint16_t type == 3;
uint16_t len;
of_mac_addr_t dl_addr;
pad(6);
};
struct of_action_set_dl_dst : of_action {
uint16_t type == 4;
uint16_t len;
of_mac_addr_t dl_addr;
pad(6);
};
struct of_action_set_nw_src : of_action {
uint16_t type == 5;
uint16_t len;
uint32_t nw_addr;
};
struct of_action_set_nw_dst : of_action {
uint16_t type == 6;
uint16_t len;
uint32_t nw_addr;
};
struct of_action_set_nw_tos : of_action {
uint16_t type == 7;
uint16_t len;
uint8_t nw_tos;
pad(3);
};
struct of_action_set_nw_ecn : of_action {
uint16_t type == 8;
uint16_t len;
uint8_t nw_ecn;
pad(3);
};
struct of_action_set_tp_src : of_action {
uint16_t type == 9;
uint16_t len;
uint16_t tp_port;
pad(2);
};
struct of_action_set_tp_dst : of_action {
uint16_t type == 10;
uint16_t len;
uint16_t tp_port;
pad(2);
};
struct of_action_copy_ttl_out : of_action {
uint16_t type == 11;
uint16_t len;
pad(4);
};
struct of_action_copy_ttl_in : of_action {
uint16_t type == 12;
uint16_t len;
pad(4);
};
struct of_action_set_mpls_label : of_action {
uint16_t type == 13;
uint16_t len;
uint32_t mpls_label;
};
struct of_action_set_mpls_tc : of_action {
uint16_t type == 14;
uint16_t len;
uint8_t mpls_tc;
pad(3);
};
struct of_action_set_mpls_ttl : of_action {
uint16_t type == 15;
uint16_t len;
uint8_t mpls_ttl;
pad(3);
};
struct of_action_dec_mpls_ttl : of_action {
uint16_t type == 16;
uint16_t len;
pad(4);
};
struct of_action_push_vlan : of_action {
uint16_t type == 17;
uint16_t len;
uint16_t ethertype;
pad(2);
};
struct of_action_pop_vlan : of_action {
uint16_t type == 18;
uint16_t len;
pad(4);
};
struct of_action_push_mpls : of_action {
uint16_t type == 19;
uint16_t len;
uint16_t ethertype;
pad(2);
};
struct of_action_pop_mpls : of_action {
uint16_t type == 20;
uint16_t len;
uint16_t ethertype;
pad(2);
};
struct of_action_set_queue : of_action {
uint16_t type == 21;
uint16_t len;
uint32_t queue_id;
};
struct of_action_group : of_action {
uint16_t type == 22;
uint16_t len;
uint32_t group_id;
};
struct of_action_set_nw_ttl : of_action {
uint16_t type == 23;
uint16_t len;
uint8_t nw_ttl;
pad(3);
};
struct of_action_dec_nw_ttl : of_action {
uint16_t type == 24;
uint16_t len;
pad(4);
};
struct of_action_experimenter : of_action {
uint16_t type == 65535;
uint16_t len;
uint32_t experimenter == ?;
of_octets_t data;
};
struct of_action {
uint16_t type == ?;
uint16_t len;
pad(4);
};
struct of_packet_out : of_header {
uint8_t version;
uint8_t type == 13;
uint16_t length;
uint32_t xid;
uint32_t buffer_id;
of_port_no_t in_port;
uint16_t actions_len == length(actions);
pad(6);
list(of_action_t) actions;
of_octets_t data;
};
struct of_match_v2 {
uint16_t type == 0;
uint16_t length;
of_port_no_t in_port;
of_wc_bmap_t wildcards;
of_mac_addr_t eth_src;
of_mac_addr_t eth_src_mask;
of_mac_addr_t eth_dst;
of_mac_addr_t eth_dst_mask;
uint16_t vlan_vid;
uint8_t vlan_pcp;
pad(1);
uint16_t eth_type;
uint8_t ip_dscp;
uint8_t ip_proto;
of_ipv4_t ipv4_src;
of_ipv4_t ipv4_src_mask;
of_ipv4_t ipv4_dst;
of_ipv4_t ipv4_dst_mask;
uint16_t tcp_src;
uint16_t tcp_dst;
uint32_t mpls_label;
uint8_t mpls_tc;
pad(3);
uint64_t metadata;
uint64_t metadata_mask;
};
struct of_instruction {
uint16_t type == ?;
uint16_t len;
pad(4);
};
struct of_instruction_goto_table : of_instruction {
uint16_t type == 1;
uint16_t len;
uint8_t table_id;
pad(3);
};
struct of_instruction_write_metadata : of_instruction {
uint16_t type == 2;
uint16_t len;
pad(4);
uint64_t metadata;
uint64_t metadata_mask;
};
struct of_instruction_write_actions : of_instruction {
uint16_t type == 3;
uint16_t len;
pad(4);
list(of_action_t) actions;
};
struct of_instruction_apply_actions : of_instruction {
uint16_t type == 4;
uint16_t len;
pad(4);
list(of_action_t) actions;
};
struct of_instruction_clear_actions : of_instruction {
uint16_t type == 5;
uint16_t len;
pad(4);
};
struct of_instruction_experimenter : of_instruction {
uint16_t type == 65535;
uint16_t len;
uint32_t experimenter == ?;
of_octets_t data;
};
struct of_flow_mod : of_header {
uint8_t version;
uint8_t type == 14;
uint16_t length;
uint32_t xid;
uint64_t cookie;
uint64_t cookie_mask;
uint8_t table_id;
of_fm_cmd_t _command == ?;
uint16_t idle_timeout;
uint16_t hard_timeout;
uint16_t priority;
uint32_t buffer_id;
of_port_no_t out_port;
uint32_t out_group;
enum ofp_flow_mod_flags flags;
pad(2);
of_match_t match;
list(of_instruction_t) instructions;
};
struct of_flow_add : of_flow_mod {
uint8_t version;
uint8_t type == 14;
uint16_t length;
uint32_t xid;
uint64_t cookie;
uint64_t cookie_mask;
uint8_t table_id;
of_fm_cmd_t _command == 0;
uint16_t idle_timeout;
uint16_t hard_timeout;
uint16_t priority;
uint32_t buffer_id;
of_port_no_t out_port;
uint32_t out_group;
enum ofp_flow_mod_flags flags;
pad(2);
of_match_t match;
list(of_instruction_t) instructions;
};
struct of_flow_modify : of_flow_mod {
uint8_t version;
uint8_t type == 14;
uint16_t length;
uint32_t xid;
uint64_t cookie;
uint64_t cookie_mask;
uint8_t table_id;
of_fm_cmd_t _command == 1;
uint16_t idle_timeout;
uint16_t hard_timeout;
uint16_t priority;
uint32_t buffer_id;
of_port_no_t out_port;
uint32_t out_group;
enum ofp_flow_mod_flags flags;
pad(2);
of_match_t match;
list(of_instruction_t) instructions;
};
struct of_flow_modify_strict : of_flow_mod {
uint8_t version;
uint8_t type == 14;
uint16_t length;
uint32_t xid;
uint64_t cookie;
uint64_t cookie_mask;
uint8_t table_id;
of_fm_cmd_t _command == 2;
uint16_t idle_timeout;
uint16_t hard_timeout;
uint16_t priority;
uint32_t buffer_id;
of_port_no_t out_port;
uint32_t out_group;
enum ofp_flow_mod_flags flags;
pad(2);
of_match_t match;
list(of_instruction_t) instructions;
};
struct of_flow_delete : of_flow_mod {
uint8_t version;
uint8_t type == 14;
uint16_t length;
uint32_t xid;
uint64_t cookie;
uint64_t cookie_mask;
uint8_t table_id;
of_fm_cmd_t _command == 3;
uint16_t idle_timeout;
uint16_t hard_timeout;
uint16_t priority;
uint32_t buffer_id;
of_port_no_t out_port;
uint32_t out_group;
enum ofp_flow_mod_flags flags;
pad(2);
of_match_t match;
list(of_instruction_t) instructions;
};
struct of_flow_delete_strict : of_flow_mod {
uint8_t version;
uint8_t type == 14;
uint16_t length;
uint32_t xid;
uint64_t cookie;
uint64_t cookie_mask;
uint8_t table_id;
of_fm_cmd_t _command == 4;
uint16_t idle_timeout;
uint16_t hard_timeout;
uint16_t priority;
uint32_t buffer_id;
of_port_no_t out_port;
uint32_t out_group;
enum ofp_flow_mod_flags flags;
pad(2);
of_match_t match;
list(of_instruction_t) instructions;
};
struct of_bucket {
uint16_t len;
uint16_t weight;
of_port_no_t watch_port;
uint32_t watch_group;
pad(4);
list(of_action_t) actions;
};
struct of_group_mod : of_header {
uint8_t version;
uint8_t type == 15;
uint16_t length;
uint32_t xid;
enum ofp_group_mod_command command == ?;
enum ofp_group_type group_type;
pad(1);
uint32_t group_id;
list(of_bucket_t) buckets;
};
struct of_group_add : of_group_mod {
uint8_t version;
uint8_t type == 15;
uint16_t length;
uint32_t xid;
enum ofp_group_mod_command command == 0;
enum ofp_group_type group_type;
pad(1);
uint32_t group_id;
list(of_bucket_t) buckets;
};
struct of_group_modify : of_group_mod {
uint8_t version;
uint8_t type == 15;
uint16_t length;
uint32_t xid;
enum ofp_group_mod_command command == 1;
enum ofp_group_type group_type;
pad(1);
uint32_t group_id;
list(of_bucket_t) buckets;
};
struct of_group_delete : of_group_mod {
uint8_t version;
uint8_t type == 15;
uint16_t length;
uint32_t xid;
enum ofp_group_mod_command command == 2;
enum ofp_group_type group_type;
pad(1);
uint32_t group_id;
list(of_bucket_t) buckets;
};
struct of_flow_removed : of_header {
uint8_t version;
uint8_t type == 11;
uint16_t length;
uint32_t xid;
uint64_t cookie;
uint16_t priority;
enum ofp_flow_removed_reason reason;
uint8_t table_id;
uint32_t duration_sec;
uint32_t duration_nsec;
uint16_t idle_timeout;
pad(2);
uint64_t packet_count;
uint64_t byte_count;
of_match_t match;
};
struct of_error_msg : of_header {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == ?;
};
struct of_hello_failed_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 0;
enum ofp_hello_failed_code code;
of_octets_t data;
};
struct of_bad_request_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 1;
enum ofp_bad_request_code code;
of_octets_t data;
};
struct of_bad_action_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 2;
enum ofp_bad_action_code code;
of_octets_t data;
};
struct of_bad_instruction_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 3;
enum ofp_bad_instruction_code code;
of_octets_t data;
};
struct of_bad_match_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 4;
enum ofp_bad_match_code code;
of_octets_t data;
};
struct of_flow_mod_failed_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 5;
enum ofp_flow_mod_failed_code code;
of_octets_t data;
};
struct of_group_mod_failed_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 6;
enum ofp_group_mod_failed_code code;
of_octets_t data;
};
struct of_port_mod_failed_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 7;
enum ofp_port_mod_failed_code code;
of_octets_t data;
};
struct of_table_mod_failed_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 8;
enum ofp_table_mod_failed_code code;
of_octets_t data;
};
struct of_queue_op_failed_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 9;
enum ofp_queue_op_failed_code code;
of_octets_t data;
};
struct of_switch_config_failed_error_msg : of_error_msg {
uint8_t version;
uint8_t type == 1;
uint16_t length;
uint32_t xid;
uint16_t err_type == 10;
enum ofp_switch_config_failed_code code;
of_octets_t data;
};
// STATS ENTRIES: flow, table, port, group, group_desc
struct of_flow_stats_entry {
uint16_t length;
uint8_t table_id;
pad(1);
uint32_t duration_sec;
uint32_t duration_nsec;
uint16_t priority;
uint16_t idle_timeout;
uint16_t hard_timeout;
pad(6);
uint64_t cookie;
uint64_t packet_count;
uint64_t byte_count;
of_match_t match;
list(of_instruction_t) instructions;
};
struct of_table_stats_entry {
uint8_t table_id;
pad(7);
of_table_name_t name;
of_wc_bmap_t wildcards;
of_match_bmap_t match;
uint32_t instructions;
uint32_t write_actions;
uint32_t apply_actions;
uint32_t config;
uint32_t max_entries;
uint32_t active_count;
uint64_t lookup_count;
uint64_t matched_count;
};
struct of_port_stats_entry {
of_port_no_t port_no;
pad(4);
uint64_t rx_packets;
uint64_t tx_packets;
uint64_t rx_bytes;
uint64_t tx_bytes;
uint64_t rx_dropped;
uint64_t tx_dropped;
uint64_t rx_errors;
uint64_t tx_errors;
uint64_t rx_frame_err;
uint64_t rx_over_err;
uint64_t rx_crc_err;
uint64_t collisions;
};
struct of_queue_stats_entry {
of_port_no_t port_no;
uint32_t queue_id;
uint64_t tx_bytes;
uint64_t tx_packets;
uint64_t tx_errors;
};
struct of_bucket_counter {
uint64_t packet_count;
uint64_t byte_count;
};
struct of_group_stats_entry {
uint16_t length;
pad(2);
uint32_t group_id;
uint32_t ref_count;
pad(4);
uint64_t packet_count;
uint64_t byte_count;
list(of_bucket_counter_t) bucket_stats;
};
struct of_group_desc_stats_entry {
uint16_t length;
enum ofp_group_type group_type;
pad(1);
uint32_t group_id;
list(of_bucket_t) buckets;
};
// STATS: Desc, flow, agg, table, port, queue, group, group_desc, experi
struct of_stats_request : of_header {
uint8_t version;
uint8_t type == 18;
uint16_t length;
uint32_t xid;
uint16_t stats_type == ?;
enum ofp_stats_request_flags flags;
pad(4);
};
struct of_stats_reply : of_header {
uint8_t version;
uint8_t type == 19;
uint16_t length;
uint32_t xid;
uint16_t stats_type == ?;
enum ofp_stats_reply_flags flags;
pad(4);
};
struct of_desc_stats_request : of_stats_request {
uint8_t version;
uint8_t type == 18;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 0;
enum ofp_stats_request_flags flags;
pad(4);
};
struct of_desc_stats_reply : of_stats_reply {
uint8_t version;
uint8_t type == 19;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 0;
enum ofp_stats_reply_flags flags;
pad(4);
of_desc_str_t mfr_desc;
of_desc_str_t hw_desc;
of_desc_str_t sw_desc;
of_serial_num_t serial_num;
of_desc_str_t dp_desc;
};
struct of_flow_stats_request : of_stats_request {
uint8_t version;
uint8_t type == 18;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 1;
enum ofp_stats_request_flags flags;
pad(4);
uint8_t table_id;
pad(3);
of_port_no_t out_port;
uint32_t out_group;
pad(4);
uint64_t cookie;
uint64_t cookie_mask;
of_match_t match;
};
struct of_flow_stats_reply : of_stats_reply {
uint8_t version;
uint8_t type == 19;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 1;
enum ofp_stats_reply_flags flags;
pad(4);
list(of_flow_stats_entry_t) entries;
};
struct of_aggregate_stats_request : of_stats_request {
uint8_t version;
uint8_t type == 18;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 2;
enum ofp_stats_request_flags flags;
pad(4);
uint8_t table_id;
pad(3);
of_port_no_t out_port;
uint32_t out_group;
pad(4);
uint64_t cookie;
uint64_t cookie_mask;
of_match_t match;
};
struct of_aggregate_stats_reply : of_stats_reply {
uint8_t version;
uint8_t type == 19;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 2;
enum ofp_stats_reply_flags flags;
pad(4);
uint64_t packet_count;
uint64_t byte_count;
uint32_t flow_count;
pad(4);
};
struct of_table_stats_request : of_stats_request {
uint8_t version;
uint8_t type == 18;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 3;
enum ofp_stats_request_flags flags;
pad(4);
};
struct of_table_stats_reply : of_stats_reply {
uint8_t version;
uint8_t type == 19;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 3;
enum ofp_stats_reply_flags flags;
pad(4);
list(of_table_stats_entry_t) entries;
};
struct of_port_stats_request : of_stats_request {
uint8_t version;
uint8_t type == 18;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 4;
enum ofp_stats_request_flags flags;
pad(4);
of_port_no_t port_no;
pad(4);
};
struct of_port_stats_reply : of_stats_reply {
uint8_t version;
uint8_t type == 19;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 4;
enum ofp_stats_reply_flags flags;
pad(4);
list(of_port_stats_entry_t) entries;
};
struct of_queue_stats_request : of_stats_request {
uint8_t version;
uint8_t type == 18;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 5;
enum ofp_stats_request_flags flags;
pad(4);
of_port_no_t port_no;
uint32_t queue_id;
};
struct of_queue_stats_reply : of_stats_reply {
uint8_t version;
uint8_t type == 19;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 5;
enum ofp_stats_reply_flags flags;
pad(4);
list(of_queue_stats_entry_t) entries;
};
struct of_group_stats_request : of_stats_request {
uint8_t version;
uint8_t type == 18;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 6;
enum ofp_stats_request_flags flags;
pad(4);
uint32_t group_id;
pad(4);
};
struct of_group_stats_reply : of_stats_reply {
uint8_t version;
uint8_t type == 19;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 6;
enum ofp_stats_reply_flags flags;
pad(4);
list(of_group_stats_entry_t) entries;
};
struct of_group_desc_stats_request : of_stats_request {
uint8_t version;
uint8_t type == 18;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 7;
enum ofp_stats_request_flags flags;
pad(4);
};
struct of_group_desc_stats_reply : of_stats_reply {
uint8_t version;
uint8_t type == 19;
uint16_t length;
uint32_t xid;
uint16_t stats_type == 7;
enum ofp_stats_reply_flags flags;
pad(4);
list(of_group_desc_stats_entry_t) entries;
};
struct of_experimenter_stats_request : of_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 == ?;
pad(4);
of_octets_t data;
};
struct of_experimenter_stats_reply : of_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 == ?;
pad(4);
of_octets_t data;
};
// END OF STATS OBJECTS
struct of_queue_prop {
uint16_t type == ?;
uint16_t len;
pad(4);
};
struct of_queue_prop_min_rate : of_queue_prop {
uint16_t type == 1;
uint16_t len;
pad(4);
uint16_t rate;
pad(6);
};
struct of_packet_queue {
uint32_t queue_id;
uint16_t len;
pad(2);
list(of_queue_prop_t) properties;
};
struct of_queue_get_config_request : of_header {
uint8_t version;
uint8_t type == 22;
uint16_t length;
uint32_t xid;
of_port_no_t port;
pad(4);
};
struct of_queue_get_config_reply : of_header {
uint8_t version;
uint8_t type == 23;
uint16_t length;
uint32_t xid;
of_port_no_t port;
pad(4);
list(of_packet_queue_t) queues;
};