/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford * Junior University * Copyright (c) 2011, 2012 Open Networking Foundation * * We are making the OpenFlow specification and associated documentation * (Software) available for public use and benefit with the expectation * that others will use, modify and enhance the Software and contribute * those enhancements back to the community. However, since we would * like to make the Software available for broadest use, with as few * restrictions as possible permission is hereby granted, free of * charge, to any person obtaining a copy of this Software to deal in * the Software under the copyrights without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * The name and trademarks of copyright holder(s) may NOT be used in * advertising or publicity pertaining to the Software or any * derivatives without specific, written prior permission. */ /* OpenFlow: protocol between controller and datapath. */ #ifndef OPENFLOW_14_H #define OPENFLOW_14_H 1 #include "openflow/openflow-1.3.h" /* * OpenFlow 1.4 is more extensible by using TLV structures */ /* Common header for all async config Properties */ struct ofp14_async_config_prop_header { ovs_be16 type; /* One of OFPACPT_*. */ ovs_be16 length; /* Length in bytes of this property. */ }; OFP_ASSERT(sizeof(struct ofp14_async_config_prop_header) == 4); /* Asynchronous message configuration. * OFPT_GET_ASYNC_REPLY or OFPT_SET_ASYNC. */ struct ofp14_async_config { struct ofp_header header; /* Async config Property list - 0 or more */ struct ofp14_async_config_prop_header properties[0]; }; OFP_ASSERT(sizeof(struct ofp14_async_config) == 8); /* Async Config property types. * Low order bit cleared indicates a property for the slave role. * Low order bit set indicates a property for the master/equal role. */ enum ofp14_async_config_prop_type { OFPACPT_PACKET_IN_SLAVE = 0, /* Packet-in mask for slave. */ OFPACPT_PACKET_IN_MASTER = 1, /* Packet-in mask for master. */ OFPACPT_PORT_STATUS_SLAVE = 2, /* Port-status mask for slave. */ OFPACPT_PORT_STATUS_MASTER = 3, /* Port-status mask for master. */ OFPACPT_FLOW_REMOVED_SLAVE = 4, /* Flow removed mask for slave. */ OFPACPT_FLOW_REMOVED_MASTER = 5, /* Flow removed mask for master. */ OFPACPT_ROLE_STATUS_SLAVE = 6, /* Role status mask for slave. */ OFPACPT_ROLE_STATUS_MASTER = 7, /* Role status mask for master. */ OFPACPT_TABLE_STATUS_SLAVE = 8, /* Table status mask for slave. */ OFPACPT_TABLE_STATUS_MASTER = 9, /* Table status mask for master. */ OFPACPT_REQUESTFORWARD_SLAVE = 10, /* RequestForward mask for slave. */ OFPACPT_REQUESTFORWARD_MASTER = 11, /* RequestForward mask for master. */ OFPTFPT_EXPERIMENTER_SLAVE = 0xFFFE, /* Experimenter for slave. */ OFPTFPT_EXPERIMENTER_MASTER = 0xFFFF, /* Experimenter for master. */ }; /* Various reason based properties */ struct ofp14_async_config_prop_reasons { /* 'type' is one of OFPACPT_PACKET_IN_*, OFPACPT_PORT_STATUS_*, * OFPACPT_FLOW_REMOVED_*, OFPACPT_ROLE_STATUS_*, * OFPACPT_TABLE_STATUS_*, OFPACPT_REQUESTFORWARD_*. */ ovs_be16 type; ovs_be16 length; /* Length in bytes of this property. */ ovs_be32 mask; /* Bitmasks of reason values. */ }; OFP_ASSERT(sizeof(struct ofp14_async_config_prop_reasons) == 8); /* Experimenter async config property */ struct ofp14_async_config_prop_experimenter { ovs_be16 type; /* One of OFPTFPT_EXPERIMENTER_SLAVE, OFPTFPT_EXPERIMENTER_MASTER. */ ovs_be16 length; /* Length in bytes of this property. */ ovs_be32 experimenter; /* Experimenter ID which takes the same form as in struct ofp_experimenter_header. */ ovs_be32 exp_type; /* Experimenter defined. */ /* Followed by: * - Exactly (length - 12) bytes containing the experimenter data, then * - Exactly (length + 7)/8*8 - (length) (between 0 and 7) * bytes of all-zero bytes */ }; OFP_ASSERT(sizeof(struct ofp14_async_config_prop_experimenter) == 12); /* Common header for all Role Properties */ struct ofp14_role_prop_header { ovs_be16 type; /* One of OFPRPT_*. */ ovs_be16 length; /* Length in bytes of this property. */ }; OFP_ASSERT(sizeof(struct ofp14_role_prop_header) == 4); /* Role status event message. */ struct ofp14_role_status { ovs_be32 role; /* One of OFPCR_ROLE_*. */ uint8_t reason; /* One of OFPCRR_*. */ uint8_t pad[3]; /* Align to 64 bits. */ ovs_be64 generation_id; /* Master Election Generation Id */ /* Followed by a list of struct ofp14_role_prop_header */ }; OFP_ASSERT(sizeof(struct ofp14_role_status) == 16); /* What changed about the controller role */ enum ofp14_controller_role_reason { OFPCRR_MASTER_REQUEST = 0, /* Another controller asked to be master. */ OFPCRR_CONFIG = 1, /* Configuration changed on the switch. */ OFPCRR_EXPERIMENTER = 2, /* Experimenter data changed. */ }; /* Role property types. */ enum ofp14_role_prop_type { OFPRPT_EXPERIMENTER = 0xFFFF, /* Experimenter property. */ }; /* Experimenter role property */ struct ofp14_role_prop_experimenter { ovs_be16 type; /* One of OFPRPT_EXPERIMENTER. */ ovs_be16 length; /* Length in bytes of this property. */ ovs_be32 experimenter; /* Experimenter ID which takes the same form as in struct ofp_experimenter_header. */ ovs_be32 exp_type; /* Experimenter defined. */ /* Followed by: * - Exactly (length - 12) bytes containing the experimenter data, then * - Exactly (length + 7)/8*8 - (length) (between 0 and 7) * bytes of all-zero bytes */ }; OFP_ASSERT(sizeof(struct ofp14_role_prop_experimenter) == 12); /* Bundle control message types */ enum ofp14_bundle_ctrl_type { OFPBCT_OPEN_REQUEST = 0, OFPBCT_OPEN_REPLY = 1, OFPBCT_CLOSE_REQUEST = 2, OFPBCT_CLOSE_REPLY = 3, OFPBCT_COMMIT_REQUEST = 4, OFPBCT_COMMIT_REPLY = 5, OFPBCT_DISCARD_REQUEST = 6, OFPBCT_DISCARD_REPLY = 7, }; /* Bundle configuration flags. */ enum ofp14_bundle_flags { OFPBF_ATOMIC = 1 << 0, /* Execute atomically. */ OFPBF_ORDERED = 1 << 1, /* Execute in specified order. */ }; /* Message structure for OFPT_BUNDLE_CONTROL and OFPT_BUNDLE_ADD_MESSAGE. */ struct ofp14_bundle_ctrl_msg { ovs_be32 bundle_id; /* Identify the bundle. */ ovs_be16 type; /* OFPT_BUNDLE_CONTROL: one of OFPBCT_*. * OFPT_BUNDLE_ADD_MESSAGE: not used. */ ovs_be16 flags; /* Bitmap of OFPBF_* flags. */ /* Followed by: * - For OFPT_BUNDLE_ADD_MESSAGE only, an encapsulated OpenFlow message, * beginning with an ofp_header whose xid is identical to this message's * outer xid. * - For OFPT_BUNDLE_ADD_MESSAGE only, and only if at least one property is * present, 0 to 7 bytes of padding to align on a 64-bit boundary. * - Zero or more properties (see struct ofp14_bundle_prop_header). */ }; OFP_ASSERT(sizeof(struct ofp14_bundle_ctrl_msg) == 8); #endif /* openflow/openflow-1.4.h */