2016-01-14 21:03:23 -08:00
|
|
|
/* Copyright (c) 2008, 2011, 2012, 2013, 2014, 2016 The Board of Trustees of The Leland Stanford
|
2011-12-06 22:33:49 -08:00
|
|
|
* Junior University
|
|
|
|
|
*
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*
|
2016-04-10 14:39:12 -07:00
|
|
|
* Copyright (c) 2008-2015 Nicira, Inc.
|
2011-12-06 22:33:49 -08:00
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at:
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* 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 License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef OPENFLOW_COMMON_H
|
|
|
|
|
#define OPENFLOW_COMMON_H 1
|
|
|
|
|
|
2014-11-12 15:06:02 +01:00
|
|
|
#include <openvswitch/types.h>
|
2011-12-06 22:33:49 -08:00
|
|
|
|
|
|
|
|
#ifdef SWIG
|
|
|
|
|
#define OFP_ASSERT(EXPR) /* SWIG can't handle OFP_ASSERT. */
|
|
|
|
|
#elif !defined(__cplusplus)
|
|
|
|
|
/* Build-time assertion for use in a declaration context. */
|
|
|
|
|
#define OFP_ASSERT(EXPR) \
|
|
|
|
|
extern int (*build_assert(void))[ sizeof(struct { \
|
|
|
|
|
unsigned int build_assert_failed : (EXPR) ? 1 : -1; })]
|
2017-09-12 15:43:03 -07:00
|
|
|
#elif __cplusplus >= 201103L
|
2017-07-31 13:31:43 -07:00
|
|
|
#define OFP_ASSERT(EXPR) static_assert(EXPR, "assertion failed")
|
2017-09-12 15:43:03 -07:00
|
|
|
#else /* __cplusplus < 201103L */
|
|
|
|
|
#include <boost/static_assert.hpp>
|
|
|
|
|
#define OFP_ASSERT BOOST_STATIC_ASSERT
|
|
|
|
|
#endif /* __cplusplus < 201103L */
|
2011-12-06 22:33:49 -08:00
|
|
|
|
|
|
|
|
/* Version number:
|
|
|
|
|
* Non-experimental versions released: 0x01 0x02
|
|
|
|
|
* Experimental versions released: 0x81 -- 0x99
|
|
|
|
|
*/
|
|
|
|
|
/* The most significant bit being set in the version field indicates an
|
|
|
|
|
* experimental OpenFlow version.
|
|
|
|
|
*/
|
2012-07-30 11:02:59 +09:00
|
|
|
enum ofp_version {
|
|
|
|
|
OFP10_VERSION = 0x01,
|
|
|
|
|
OFP11_VERSION = 0x02,
|
|
|
|
|
OFP12_VERSION = 0x03,
|
2014-03-03 15:22:32 +02:00
|
|
|
OFP13_VERSION = 0x04,
|
2014-05-07 13:42:24 -07:00
|
|
|
OFP14_VERSION = 0x05,
|
2016-04-10 14:39:12 -07:00
|
|
|
OFP15_VERSION = 0x06,
|
|
|
|
|
OFP16_VERSION = 0x07
|
2012-07-30 11:02:59 +09:00
|
|
|
};
|
2011-12-06 22:33:49 -08:00
|
|
|
|
2013-06-24 13:49:40 -07:00
|
|
|
/* Vendor (aka experimenter) IDs.
|
|
|
|
|
*
|
|
|
|
|
* These are used in various places in OpenFlow to identify an extension
|
|
|
|
|
* defined by some vendor, as opposed to a standardized part of the core
|
|
|
|
|
* OpenFlow protocol.
|
|
|
|
|
*
|
|
|
|
|
* Vendor IDs whose top 8 bits are 0 hold an Ethernet OUI in their low 24 bits.
|
|
|
|
|
* The Open Networking Foundation assigns vendor IDs whose top 8 bits are
|
|
|
|
|
* nonzero.
|
|
|
|
|
*
|
|
|
|
|
* A few vendor IDs are special:
|
|
|
|
|
*
|
|
|
|
|
* - OF_VENDOR_ID is not a real vendor ID and does not appear in the
|
|
|
|
|
* OpenFlow protocol itself. It can occasionally be useful within Open
|
|
|
|
|
* vSwitch to identify a standardized part of OpenFlow.
|
|
|
|
|
*
|
|
|
|
|
* - ONF_VENDOR_ID is being used within the ONF "extensibility" working
|
|
|
|
|
* group to identify extensions being proposed for standardization.
|
2014-08-11 14:31:29 -07:00
|
|
|
*
|
|
|
|
|
* The list is sorted numerically.
|
2013-06-24 13:49:40 -07:00
|
|
|
*/
|
|
|
|
|
#define OF_VENDOR_ID 0
|
2014-08-11 14:31:29 -07:00
|
|
|
#define HPL_VENDOR_ID 0x000004EA /* HP Labs. */
|
2015-09-30 15:44:53 +09:00
|
|
|
#define NTR_VENDOR_ID 0x0000154d /* Netronome. */
|
|
|
|
|
#define NTR_COMPAT_VENDOR_ID 0x00001540 /* Incorrect value used in v2.4. */
|
2013-06-24 13:49:40 -07:00
|
|
|
#define NX_VENDOR_ID 0x00002320 /* Nicira. */
|
|
|
|
|
#define ONF_VENDOR_ID 0x4f4e4600 /* Open Networking Foundation. */
|
2016-05-05 09:46:01 +01:00
|
|
|
#define INTEL_VENDOR_ID 0x0000AA01 /* Intel */
|
2013-06-24 13:49:40 -07:00
|
|
|
|
2011-12-06 22:33:49 -08:00
|
|
|
#define OFP_MAX_TABLE_NAME_LEN 32
|
|
|
|
|
|
2013-08-30 17:26:56 -07:00
|
|
|
#define OFP_OLD_PORT 6633
|
|
|
|
|
#define OFP_PORT 6653
|
2011-12-06 22:33:49 -08:00
|
|
|
|
2012-12-03 12:37:56 +02:00
|
|
|
#define OFP_DEFAULT_MISS_SEND_LEN 128
|
|
|
|
|
|
|
|
|
|
/* Values below this cutoff are 802.3 packets and the two bytes
|
|
|
|
|
* following MAC addresses are used as a frame length. Otherwise, the
|
|
|
|
|
* two bytes are used as the Ethernet type.
|
|
|
|
|
*/
|
|
|
|
|
#define OFP_DL_TYPE_ETH2_CUTOFF 0x0600
|
|
|
|
|
|
|
|
|
|
/* Value of dl_type to indicate that the frame does not include an
|
|
|
|
|
* Ethernet type.
|
|
|
|
|
*/
|
|
|
|
|
#define OFP_DL_TYPE_NOT_ETH_TYPE 0x05ff
|
|
|
|
|
|
|
|
|
|
/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry
|
|
|
|
|
* is permanent. */
|
|
|
|
|
#define OFP_FLOW_PERMANENT 0
|
|
|
|
|
|
|
|
|
|
/* By default, choose a priority in the middle. */
|
|
|
|
|
#define OFP_DEFAULT_PRIORITY 0x8000
|
|
|
|
|
|
|
|
|
|
|
2012-02-15 16:33:04 -08:00
|
|
|
/* Header on all OpenFlow packets. */
|
|
|
|
|
struct ofp_header {
|
|
|
|
|
uint8_t version; /* An OpenFlow version number, e.g. OFP10_VERSION. */
|
|
|
|
|
uint8_t type; /* One of the OFPT_ constants. */
|
|
|
|
|
ovs_be16 length; /* Length including this ofp_header. */
|
|
|
|
|
ovs_be32 xid; /* Transaction id associated with this packet.
|
|
|
|
|
Replies use the same id as was in the request
|
|
|
|
|
to facilitate pairing. */
|
|
|
|
|
};
|
|
|
|
|
OFP_ASSERT(sizeof(struct ofp_header) == 8);
|
|
|
|
|
|
2012-12-03 12:37:56 +02:00
|
|
|
/* OFPT_ERROR: Error message (datapath -> controller). */
|
|
|
|
|
struct ofp_error_msg {
|
|
|
|
|
ovs_be16 type;
|
|
|
|
|
ovs_be16 code;
|
|
|
|
|
uint8_t data[0]; /* Variable-length data. Interpreted based
|
|
|
|
|
on the type and code. */
|
|
|
|
|
};
|
|
|
|
|
OFP_ASSERT(sizeof(struct ofp_error_msg) == 4);
|
|
|
|
|
|
|
|
|
|
enum ofp_config_flags {
|
|
|
|
|
/* Handling of IP fragments. */
|
|
|
|
|
OFPC_FRAG_NORMAL = 0, /* No special handling for fragments. */
|
|
|
|
|
OFPC_FRAG_DROP = 1, /* Drop fragments. */
|
|
|
|
|
OFPC_FRAG_REASM = 2, /* Reassemble (only if OFPC_IP_REASM set). */
|
|
|
|
|
OFPC_FRAG_NX_MATCH = 3, /* Make first fragments available for matching. */
|
|
|
|
|
OFPC_FRAG_MASK = 3,
|
|
|
|
|
|
|
|
|
|
/* OFPC_INVALID_TTL_TO_CONTROLLER is deprecated in OpenFlow 1.3 */
|
|
|
|
|
|
|
|
|
|
/* TTL processing - applicable for IP and MPLS packets. */
|
|
|
|
|
OFPC_INVALID_TTL_TO_CONTROLLER = 1 << 2, /* Send packets with invalid TTL
|
|
|
|
|
to the controller. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Switch configuration. */
|
|
|
|
|
struct ofp_switch_config {
|
|
|
|
|
ovs_be16 flags; /* OFPC_* flags. */
|
|
|
|
|
ovs_be16 miss_send_len; /* Max bytes of new flow that datapath should
|
|
|
|
|
send to the controller. */
|
|
|
|
|
};
|
|
|
|
|
OFP_ASSERT(sizeof(struct ofp_switch_config) == 4);
|
|
|
|
|
|
|
|
|
|
|
2012-02-15 16:33:04 -08:00
|
|
|
/* Common flags to indicate behavior of the physical port. These flags are
|
|
|
|
|
* used in ofp_port to describe the current configuration. They are used in
|
|
|
|
|
* the ofp_port_mod message to configure the port's behavior.
|
|
|
|
|
*/
|
|
|
|
|
enum ofp_port_config {
|
|
|
|
|
OFPPC_PORT_DOWN = 1 << 0, /* Port is administratively down. */
|
|
|
|
|
|
|
|
|
|
OFPPC_NO_RECV = 1 << 2, /* Drop all packets received by port. */
|
|
|
|
|
OFPPC_NO_FWD = 1 << 5, /* Drop packets forwarded to port. */
|
|
|
|
|
OFPPC_NO_PACKET_IN = 1 << 6 /* Do not send packet-in msgs for port. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Common current state of the physical port. These are not configurable from
|
|
|
|
|
* the controller.
|
|
|
|
|
*/
|
|
|
|
|
enum ofp_port_state {
|
|
|
|
|
OFPPS_LINK_DOWN = 1 << 0, /* No physical link present. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Common features of physical ports available in a datapath. */
|
|
|
|
|
enum ofp_port_features {
|
|
|
|
|
OFPPF_10MB_HD = 1 << 0, /* 10 Mb half-duplex rate support. */
|
|
|
|
|
OFPPF_10MB_FD = 1 << 1, /* 10 Mb full-duplex rate support. */
|
|
|
|
|
OFPPF_100MB_HD = 1 << 2, /* 100 Mb half-duplex rate support. */
|
|
|
|
|
OFPPF_100MB_FD = 1 << 3, /* 100 Mb full-duplex rate support. */
|
|
|
|
|
OFPPF_1GB_HD = 1 << 4, /* 1 Gb half-duplex rate support. */
|
|
|
|
|
OFPPF_1GB_FD = 1 << 5, /* 1 Gb full-duplex rate support. */
|
|
|
|
|
OFPPF_10GB_FD = 1 << 6, /* 10 Gb full-duplex rate support. */
|
|
|
|
|
};
|
|
|
|
|
|
2015-12-29 06:44:16 -08:00
|
|
|
/* Generic OpenFlow property header, as used by various messages in OF1.3+, and
|
|
|
|
|
* especially in OF1.4.
|
|
|
|
|
*
|
|
|
|
|
* The OpenFlow specs prefer to define a new structure with a specialized name
|
|
|
|
|
* each time this property structure comes up: struct
|
|
|
|
|
* ofp_port_desc_prop_header, struct ofp_controller_status_prop_header, struct
|
|
|
|
|
* ofp_table_mod_prop_header, and more. They're all the same, so it's easier
|
|
|
|
|
* to unify them.
|
|
|
|
|
*/
|
|
|
|
|
struct ofp_prop_header {
|
|
|
|
|
ovs_be16 type;
|
|
|
|
|
ovs_be16 len;
|
2016-02-16 15:33:42 -08:00
|
|
|
/* Followed by:
|
|
|
|
|
* - 'len - 4' bytes of payload.
|
|
|
|
|
* - PAD_SIZE(len, 8) bytes of zeros. */
|
2015-12-29 06:44:16 -08:00
|
|
|
};
|
|
|
|
|
OFP_ASSERT(sizeof(struct ofp_prop_header) == 4);
|
|
|
|
|
|
|
|
|
|
/* Generic OpenFlow experimenter property header.
|
|
|
|
|
*
|
|
|
|
|
* Again the OpenFlow specs define this over and over again and it's easier to
|
|
|
|
|
* unify them. */
|
|
|
|
|
struct ofp_prop_experimenter {
|
|
|
|
|
ovs_be16 type; /* Generally 0xffff (in one case 0xfffe). */
|
|
|
|
|
ovs_be16 len; /* 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. */
|
2016-02-16 15:33:42 -08:00
|
|
|
/* Followed by:
|
|
|
|
|
* - 'len - 12' bytes of payload.
|
|
|
|
|
* - PAD_SIZE(len, 8) bytes of zeros. */
|
2015-12-29 06:44:16 -08:00
|
|
|
};
|
|
|
|
|
OFP_ASSERT(sizeof(struct ofp_prop_experimenter) == 12);
|
|
|
|
|
|
2012-02-15 16:33:04 -08:00
|
|
|
/* Switch features. */
|
|
|
|
|
struct ofp_switch_features {
|
|
|
|
|
ovs_be64 datapath_id; /* Datapath unique ID. The lower 48-bits are for
|
|
|
|
|
a MAC address, while the upper 16-bits are
|
|
|
|
|
implementer-defined. */
|
|
|
|
|
|
|
|
|
|
ovs_be32 n_buffers; /* Max packets buffered at once. */
|
|
|
|
|
|
|
|
|
|
uint8_t n_tables; /* Number of tables supported by datapath. */
|
2012-11-27 17:44:22 +02:00
|
|
|
uint8_t auxiliary_id; /* OF 1.3: Identify auxiliary connections */
|
|
|
|
|
uint8_t pad[2]; /* Align to 64-bits. */
|
2012-02-15 16:33:04 -08:00
|
|
|
|
|
|
|
|
/* Features. */
|
2012-03-30 11:30:01 +09:00
|
|
|
ovs_be32 capabilities; /* OFPC_*, OFPC10_*, OFPC11_*, OFPC12_*. */
|
2012-11-27 17:44:22 +02:00
|
|
|
ovs_be32 actions; /* Bitmap of supported "ofp_action_type"s.
|
|
|
|
|
* DEPRECATED in OpenFlow 1.1 */
|
2012-02-15 16:33:04 -08:00
|
|
|
|
|
|
|
|
/* Followed by an array of struct ofp10_phy_port or struct ofp11_port
|
2012-11-27 17:44:22 +02:00
|
|
|
* structures. The number is inferred from header.length.
|
|
|
|
|
* REMOVED in OpenFlow 1.3 */
|
2012-02-15 16:33:04 -08:00
|
|
|
};
|
2012-07-19 23:23:17 -07:00
|
|
|
OFP_ASSERT(sizeof(struct ofp_switch_features) == 24);
|
2012-02-15 16:33:04 -08:00
|
|
|
|
|
|
|
|
/* Common capabilities supported by the datapath (struct ofp_switch_features,
|
|
|
|
|
* member capabilities). */
|
|
|
|
|
enum ofp_capabilities {
|
|
|
|
|
OFPC_FLOW_STATS = 1 << 0, /* Flow statistics. */
|
|
|
|
|
OFPC_TABLE_STATS = 1 << 1, /* Table statistics. */
|
|
|
|
|
OFPC_PORT_STATS = 1 << 2, /* Port statistics. */
|
|
|
|
|
OFPC_IP_REASM = 1 << 5, /* Can reassemble IP fragments. */
|
|
|
|
|
OFPC_QUEUE_STATS = 1 << 6, /* Queue statistics. */
|
|
|
|
|
OFPC_ARP_MATCH_IP = 1 << 7 /* Match IP addresses in ARP
|
|
|
|
|
pkts. */
|
|
|
|
|
};
|
|
|
|
|
|
2012-03-30 11:29:58 +09:00
|
|
|
/* Why is this packet being sent to the controller? */
|
|
|
|
|
enum ofp_packet_in_reason {
|
openflow: Better abstract handling of packet-in messages.
Packet-in messages have been a bit of a mess. First, their abstraction
in the form of struct ofputil_packet_in has some fields that are used
in a clear way for incoming and outgoing packet-ins, and others
(packet_len, total_len, buffer_id) have have confusing meanings or
usage pattern depending on their direction.
Second, it's very confusing how a packet-in has both a reason (OFPR_*)
and a miss type (OFPROTO_PACKET_IN_*) and how those add up to the
actual reason that is used "on the wire" for each OpenFlow version (and
even whether the packet-in is sent at all!).
Finally, there's all kind of low-level detail randomly scattered between
connmgr, ofproto-dpif-xlate, and ofp-util.
This commit attempts to clear up some of the confusion. It simplifies
the struct ofputil_packet_in abstraction by removing the members that
didn't have a clear and consistent meaning between incoming and outgoing
packet-ins. It gets rid of OFPROTO_PACKET_IN_*, instead adding a couple
of nonstandard OFPR_* reasons that add up to what OFPROTO_PACKET_IN_*
was meant to say (in what I hope is a clearer way). And it consolidates
the tricky parts into ofp-util, where I hope it will be easier to
understand all in one place.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Jarno Rajahalme <jarno@ovn.org>
2016-01-20 09:57:16 -08:00
|
|
|
/* Standard reasons. */
|
2012-03-30 11:29:58 +09:00
|
|
|
OFPR_NO_MATCH, /* No matching flow. */
|
|
|
|
|
OFPR_ACTION, /* Action explicitly output to controller. */
|
2014-11-12 16:29:59 -08:00
|
|
|
OFPR_INVALID_TTL, /* Packet has invalid TTL. */
|
|
|
|
|
OFPR_ACTION_SET, /* Output to controller in action set */
|
|
|
|
|
OFPR_GROUP, /* Output to controller in group bucket */
|
|
|
|
|
OFPR_PACKET_OUT, /* Output to controller in packet-out */
|
2016-01-14 21:03:23 -08:00
|
|
|
|
|
|
|
|
#define OFPR10_BITS \
|
|
|
|
|
((1u << OFPR_NO_MATCH) | (1u << OFPR_ACTION) | (1u << OFPR_INVALID_TTL))
|
2017-04-17 14:11:29 -07:00
|
|
|
|
|
|
|
|
/* From OF1.4+, OFPR_ACTION is split into four more descriptive reasons,
|
|
|
|
|
* OFPR_APPLY_ACTION, OFPR_ACTION_SET, OFPR_GROUP, and OFPR_PACKET_OUT.
|
|
|
|
|
* OFPR_APPLY_ACTION shares the same number as OFPR_ACTION. */
|
|
|
|
|
#define OFPR14_ACTION_BITS \
|
|
|
|
|
((1u << OFPR_ACTION_SET) | (1u << OFPR_GROUP) | (1u << OFPR_PACKET_OUT))
|
2016-01-14 21:03:23 -08:00
|
|
|
#define OFPR14_BITS \
|
2017-04-17 14:11:29 -07:00
|
|
|
(OFPR10_BITS | OFPR14_ACTION_BITS)
|
2016-01-14 21:03:23 -08:00
|
|
|
|
openflow: Better abstract handling of packet-in messages.
Packet-in messages have been a bit of a mess. First, their abstraction
in the form of struct ofputil_packet_in has some fields that are used
in a clear way for incoming and outgoing packet-ins, and others
(packet_len, total_len, buffer_id) have have confusing meanings or
usage pattern depending on their direction.
Second, it's very confusing how a packet-in has both a reason (OFPR_*)
and a miss type (OFPROTO_PACKET_IN_*) and how those add up to the
actual reason that is used "on the wire" for each OpenFlow version (and
even whether the packet-in is sent at all!).
Finally, there's all kind of low-level detail randomly scattered between
connmgr, ofproto-dpif-xlate, and ofp-util.
This commit attempts to clear up some of the confusion. It simplifies
the struct ofputil_packet_in abstraction by removing the members that
didn't have a clear and consistent meaning between incoming and outgoing
packet-ins. It gets rid of OFPROTO_PACKET_IN_*, instead adding a couple
of nonstandard OFPR_* reasons that add up to what OFPROTO_PACKET_IN_*
was meant to say (in what I hope is a clearer way). And it consolidates
the tricky parts into ofp-util, where I hope it will be easier to
understand all in one place.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Jarno Rajahalme <jarno@ovn.org>
2016-01-20 09:57:16 -08:00
|
|
|
/* Nonstandard reason--not exposed via OpenFlow. */
|
|
|
|
|
OFPR_EXPLICIT_MISS,
|
|
|
|
|
OFPR_IMPLICIT_MISS,
|
|
|
|
|
|
2012-03-30 11:29:58 +09:00
|
|
|
OFPR_N_REASONS
|
|
|
|
|
};
|
|
|
|
|
|
2012-07-03 23:01:59 -07:00
|
|
|
enum ofp_flow_mod_command {
|
|
|
|
|
OFPFC_ADD, /* New flow. */
|
|
|
|
|
OFPFC_MODIFY, /* Modify all matching flows. */
|
|
|
|
|
OFPFC_MODIFY_STRICT, /* Modify entry strictly matching wildcards */
|
|
|
|
|
OFPFC_DELETE, /* Delete all matching flows. */
|
|
|
|
|
OFPFC_DELETE_STRICT /* Strictly match wildcards and priority. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum ofp_flow_mod_flags {
|
|
|
|
|
OFPFF_SEND_FLOW_REM = 1 << 0, /* Send flow removed message when flow
|
|
|
|
|
* expires or is deleted. */
|
|
|
|
|
OFPFF_CHECK_OVERLAP = 1 << 1, /* Check for overlapping entries first. */
|
|
|
|
|
};
|
|
|
|
|
|
2012-03-30 11:29:58 +09:00
|
|
|
/* Why was this flow removed? */
|
|
|
|
|
enum ofp_flow_removed_reason {
|
|
|
|
|
OFPRR_IDLE_TIMEOUT, /* Flow idle time exceeded idle_timeout. */
|
|
|
|
|
OFPRR_HARD_TIMEOUT, /* Time exceeded hard_timeout. */
|
2012-03-30 11:30:00 +09:00
|
|
|
OFPRR_DELETE, /* Evicted by a DELETE flow mod. */
|
2012-07-03 14:23:10 -07:00
|
|
|
OFPRR_GROUP_DELETE, /* Group was removed. */
|
2013-06-20 17:26:18 +03:00
|
|
|
OFPRR_METER_DELETE, /* Meter was removed. */
|
2013-06-27 01:39:48 +03:00
|
|
|
OFPRR_EVICTION, /* Switch eviction to free resources. */
|
2015-06-12 16:12:56 -07:00
|
|
|
|
2016-01-14 21:03:23 -08:00
|
|
|
#define OFPRR10_BITS \
|
|
|
|
|
((1u << OFPRR_IDLE_TIMEOUT) | \
|
|
|
|
|
(1u << OFPRR_HARD_TIMEOUT) | \
|
|
|
|
|
(1u << OFPRR_DELETE))
|
2017-07-07 21:19:28 -07:00
|
|
|
#define OFPRR13_BITS \
|
2016-01-14 21:03:23 -08:00
|
|
|
(OFPRR10_BITS | \
|
2017-07-07 21:19:28 -07:00
|
|
|
(1u << OFPRR_GROUP_DELETE))
|
|
|
|
|
#define OFPRR14_BITS \
|
|
|
|
|
(OFPRR13_BITS | \
|
2016-01-14 21:03:23 -08:00
|
|
|
(1u << OFPRR_METER_DELETE) | \
|
|
|
|
|
(1u << OFPRR_EVICTION))
|
|
|
|
|
|
2015-06-12 16:12:56 -07:00
|
|
|
OVS_OFPRR_NONE /* OVS internal_use only, keep last!. */
|
2012-03-30 11:29:58 +09:00
|
|
|
};
|
|
|
|
|
|
2012-02-15 16:33:04 -08:00
|
|
|
/* What changed about the physical port */
|
|
|
|
|
enum ofp_port_reason {
|
|
|
|
|
OFPPR_ADD, /* The port was added. */
|
|
|
|
|
OFPPR_DELETE, /* The port was removed. */
|
2015-11-30 16:52:47 +05:30
|
|
|
OFPPR_MODIFY, /* Some attribute of the port has changed. */
|
2016-01-14 21:03:23 -08:00
|
|
|
|
|
|
|
|
#define OFPPR_BITS ((1u << OFPPR_ADD) | \
|
|
|
|
|
(1u << OFPPR_DELETE) | \
|
|
|
|
|
(1u << OFPPR_MODIFY))
|
|
|
|
|
|
2015-11-30 16:52:47 +05:30
|
|
|
OFPPR_N_REASONS /* Denotes number of reasons. */
|
2012-02-15 16:33:04 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* A physical port has changed in the datapath */
|
|
|
|
|
struct ofp_port_status {
|
|
|
|
|
uint8_t reason; /* One of OFPPR_*. */
|
|
|
|
|
uint8_t pad[7]; /* Align to 64-bits. */
|
2014-05-12 18:15:28 -07:00
|
|
|
/* Followed by struct ofp10_phy_port, struct ofp11_port, or struct
|
|
|
|
|
* ofp14_port. */
|
2012-02-15 16:33:04 -08:00
|
|
|
};
|
2012-07-19 23:23:17 -07:00
|
|
|
OFP_ASSERT(sizeof(struct ofp_port_status) == 8);
|
2012-05-02 16:35:49 -07:00
|
|
|
|
2012-12-03 12:37:56 +02:00
|
|
|
enum ofp_stats_reply_flags {
|
|
|
|
|
OFPSF_REPLY_MORE = 1 << 0 /* More replies to follow. */
|
|
|
|
|
};
|
|
|
|
|
|
2012-06-27 21:13:13 -07:00
|
|
|
#define DESC_STR_LEN 256
|
|
|
|
|
#define SERIAL_NUM_LEN 32
|
|
|
|
|
/* Body of reply to OFPST_DESC request. Each entry is a NULL-terminated ASCII
|
|
|
|
|
* string. */
|
|
|
|
|
struct ofp_desc_stats {
|
|
|
|
|
char mfr_desc[DESC_STR_LEN]; /* Manufacturer description. */
|
|
|
|
|
char hw_desc[DESC_STR_LEN]; /* Hardware description. */
|
|
|
|
|
char sw_desc[DESC_STR_LEN]; /* Software description. */
|
|
|
|
|
char serial_num[SERIAL_NUM_LEN]; /* Serial number. */
|
|
|
|
|
char dp_desc[DESC_STR_LEN]; /* Human readable description of
|
|
|
|
|
the datapath. */
|
|
|
|
|
};
|
|
|
|
|
OFP_ASSERT(sizeof(struct ofp_desc_stats) == 1056);
|
|
|
|
|
|
|
|
|
|
/* Reply to OFPST_AGGREGATE request. */
|
|
|
|
|
struct ofp_aggregate_stats_reply {
|
|
|
|
|
ovs_32aligned_be64 packet_count; /* Number of packets in flows. */
|
|
|
|
|
ovs_32aligned_be64 byte_count; /* Number of bytes in flows. */
|
|
|
|
|
ovs_be32 flow_count; /* Number of flows. */
|
|
|
|
|
uint8_t pad[4]; /* Align to 64 bits. */
|
|
|
|
|
};
|
|
|
|
|
OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24);
|
|
|
|
|
|
2012-03-30 11:30:00 +09:00
|
|
|
/* The match type indicates the match structure (set of fields that compose the
|
|
|
|
|
* match) in use. The match type is placed in the type field at the beginning
|
|
|
|
|
* of all match structures. The "OpenFlow Extensible Match" type corresponds
|
|
|
|
|
* to OXM TLV format described below and must be supported by all OpenFlow
|
|
|
|
|
* switches. Extensions that define other match types may be published on the
|
|
|
|
|
* ONF wiki. Support for extensions is optional.
|
|
|
|
|
*/
|
|
|
|
|
enum ofp_match_type {
|
|
|
|
|
OFPMT_STANDARD = 0, /* The match fields defined in the ofp11_match
|
|
|
|
|
structure apply */
|
2012-03-30 11:30:01 +09:00
|
|
|
OFPMT_OXM = 1, /* OpenFlow Extensible Match */
|
2012-03-30 11:30:00 +09:00
|
|
|
};
|
|
|
|
|
|
2012-06-12 00:27:35 -07:00
|
|
|
/* Group numbering. Groups can use any number up to OFPG_MAX. */
|
|
|
|
|
enum ofp_group {
|
|
|
|
|
/* Last usable group number. */
|
|
|
|
|
OFPG_MAX = 0xffffff00,
|
|
|
|
|
|
|
|
|
|
/* Fake groups. */
|
|
|
|
|
OFPG_ALL = 0xfffffffc, /* All groups, for group delete commands. */
|
|
|
|
|
OFPG_ANY = 0xffffffff /* Wildcard, for flow stats requests. */
|
|
|
|
|
};
|
|
|
|
|
|
2013-10-30 18:17:12 +09:00
|
|
|
/* Group configuration flags */
|
|
|
|
|
enum ofp_group_capabilities {
|
|
|
|
|
OFPGFC_SELECT_WEIGHT = 1 << 0, /* Support weight for select groups */
|
|
|
|
|
OFPGFC_SELECT_LIVENESS = 1 << 1, /* Support liveness for select groups */
|
|
|
|
|
OFPGFC_CHAINING = 1 << 2, /* Support chaining groups */
|
|
|
|
|
OFPGFC_CHAINING_CHECKS = 1 << 3, /* Check chaining for loops and delete */
|
|
|
|
|
};
|
|
|
|
|
|
2012-11-04 22:04:55 -08:00
|
|
|
enum ofp_hello_elem_type {
|
|
|
|
|
OFPHET_VERSIONBITMAP = 1, /* Bitmap of version supported. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Common header for all Hello Elements */
|
|
|
|
|
struct ofp_hello_elem_header {
|
|
|
|
|
ovs_be16 type; /* One of OFPHET_*. */
|
|
|
|
|
ovs_be16 length; /* Length in bytes of this element. */
|
|
|
|
|
};
|
|
|
|
|
OFP_ASSERT(sizeof(struct ofp_hello_elem_header) == 4);
|
|
|
|
|
|
2013-11-12 16:45:50 +09:00
|
|
|
/* Table numbering. Tables can use any number up to OFPT_MAX. */
|
|
|
|
|
enum ofp_table {
|
|
|
|
|
/* Last usable table number. */
|
|
|
|
|
OFPTT_MAX = 0xfe,
|
|
|
|
|
|
|
|
|
|
/* Fake tables. */
|
|
|
|
|
OFPTT_ALL = 0xff /* Wildcard table used for table config,
|
|
|
|
|
flow stats and flow deletes. */
|
|
|
|
|
};
|
|
|
|
|
|
2013-11-12 16:45:51 +09:00
|
|
|
enum ofp_table_config {
|
2013-11-26 16:34:23 +09:00
|
|
|
/* OpenFlow 1.1 and 1.2 defined this field as shown.
|
|
|
|
|
* OpenFlow 1.3 and later mark this field as deprecated, but have not
|
|
|
|
|
* reused it for any new purpose. */
|
|
|
|
|
OFPTC11_TABLE_MISS_CONTROLLER = 0 << 0, /* Send to controller. */
|
|
|
|
|
OFPTC11_TABLE_MISS_CONTINUE = 1 << 0, /* Go to next table, like OF1.0. */
|
|
|
|
|
OFPTC11_TABLE_MISS_DROP = 2 << 0, /* Drop the packet. */
|
|
|
|
|
OFPTC11_TABLE_MISS_MASK = 3 << 0,
|
|
|
|
|
|
|
|
|
|
/* OpenFlow 1.4. */
|
|
|
|
|
OFPTC14_EVICTION = 1 << 2, /* Allow table to evict flows. */
|
|
|
|
|
OFPTC14_VACANCY_EVENTS = 1 << 3, /* Enable vacancy events. */
|
2013-11-12 16:45:51 +09:00
|
|
|
};
|
|
|
|
|
|
2017-04-25 16:29:59 +00:00
|
|
|
/* Header and packet type name spaces. */
|
|
|
|
|
enum ofp_header_type_namespaces {
|
|
|
|
|
OFPHTN_ONF = 0, /* ONF namespace. */
|
|
|
|
|
OFPHTN_ETHERTYPE = 1, /* ns_type is an Ethertype. */
|
|
|
|
|
OFPHTN_IP_PROTO = 2, /* ns_type is a IP protocol number. */
|
|
|
|
|
OFPHTN_UDP_TCP_PORT = 3, /* ns_type is a TCP or UDP port. */
|
|
|
|
|
OFPHTN_IPV4_OPTION = 4, /* ns_type is an IPv4 option number. */
|
OF support and translation of generic encap and decap
This commit adds support for the OpenFlow actions generic encap
and decap (as specified in ONF EXT-382) to the OVS control plane.
CLI syntax for encap action with properties:
encap(<header>)
encap(<header>(<prop>=<value>,<tlv>(<class>,<type>,<value>),...))
For example:
encap(ethernet)
encap(nsh(md_type=1))
encap(nsh(md_type=2,tlv(0x1000,10,0x12345678),tlv(0x2000,20,0xfedcba9876543210)))
CLI syntax for decap action:
decap()
decap(packet_type(ns=<pt_ns>,type=<pt_type>))
For example:
decap()
decap(packet_type(ns=0,type=0xfffe))
decap(packet_type(ns=1,type=0x894f))
The first header supported for encap and decap is "ethernet" to convert
packets between packet_type (1,Ethertype) and (0,0).
This commit also implements a skeleton for the translation of generic
encap and decap actions in ofproto-dpif and adds support to encap and
decap an Ethernet header.
In general translation of encap commits pending actions and then rewrites
struct flow in accordance with the new packet type and header. In the
case of encap(ethernet) it suffices to change the packet type from
(1, Ethertype) to (0,0) and set the dl_type accordingly. A new
pending_encap flag in xlate ctx is set to mark that an corresponding
datapath encap action must be triggered at the next commit. In the
case of encap(ethernet) ofproto generetas a push_eth action.
The general case for translation of decap() is to emit a datapath action
to decap the current outermost header and then recirculate the packet
to reparse the inner headers. In the special case of an Ethernet packet,
decap() just changes the packet type from (0,0) to (1, dl_type) without
a need to recirculate. The emission of the pop_eth action for the
datapath is postponed to the next commit.
Hence encap(ethernet) and decap() on an Ethernet packet are OF octions
that only incur a cost in the dataplane when a modifed packet is
actually committed, e.g. because it is sent out. They can freely be
used for normalizing the packet type in the OF pipeline without
degrading performance.
Signed-off-by: Jan Scheurich <jan.scheurich@ericsson.com>
Signed-off-by: Yi Yang <yi.y.yang@intel.com>
Signed-off-by: Zoltan Balogh <zoltan.balogh@ericsson.com>
Co-authored-by: Zoltan Balogh <zoltan.balogh@ericsson.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
2017-08-02 16:04:12 +08:00
|
|
|
OFPHTN_N_TYPES
|
2017-04-25 16:29:59 +00:00
|
|
|
};
|
|
|
|
|
|
2011-12-06 22:33:49 -08:00
|
|
|
#endif /* openflow/openflow-common.h */
|