2010-05-27 13:14:05 -07:00
|
|
|
|
/*
|
2016-01-14 21:03:23 -08:00
|
|
|
|
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
|
2010-05-27 13:14:05 -07: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.
|
|
|
|
|
*/
|
|
|
|
|
|
2016-04-04 21:32:09 -04:00
|
|
|
|
#ifndef OPENVSWITCH_OFP_UTIL_H
|
|
|
|
|
#define OPENVSWITCH_OFP_UTIL_H 1
|
2010-05-27 13:14:05 -07:00
|
|
|
|
|
2010-06-17 15:04:12 -07:00
|
|
|
|
#include <stdbool.h>
|
2010-05-27 13:14:05 -07:00
|
|
|
|
#include <stddef.h>
|
|
|
|
|
#include <stdint.h>
|
2016-04-04 21:32:07 -04:00
|
|
|
|
#include "openvswitch/flow.h"
|
2016-03-25 14:10:21 -07:00
|
|
|
|
#include "openvswitch/list.h"
|
2016-04-04 21:32:06 -04:00
|
|
|
|
#include "openvswitch/match.h"
|
2016-04-04 21:32:07 -04:00
|
|
|
|
#include "openvswitch/meta-flow.h"
|
2016-04-04 21:32:09 -04:00
|
|
|
|
#include "openvswitch/netdev.h"
|
2015-03-20 13:50:30 +09:00
|
|
|
|
#include "openflow/netronome-ext.h"
|
2010-11-17 10:06:37 -08:00
|
|
|
|
#include "openflow/nicira-ext.h"
|
2016-07-29 16:52:04 -07:00
|
|
|
|
#include "openvswitch/ofp-msgs.h"
|
2016-04-04 21:32:09 -04:00
|
|
|
|
#include "openvswitch/ofpbuf.h"
|
2010-11-16 11:00:25 -08:00
|
|
|
|
#include "openvswitch/types.h"
|
2016-04-04 21:32:08 -04:00
|
|
|
|
#include "openvswitch/type-props.h"
|
2016-04-04 21:32:09 -04:00
|
|
|
|
#include "openvswitch/uuid.h"
|
2010-05-27 13:14:05 -07:00
|
|
|
|
|
|
|
|
|
struct ofpbuf;
|
2013-10-16 16:16:03 -07:00
|
|
|
|
union ofp_action;
|
2013-10-24 13:19:29 -07:00
|
|
|
|
struct ofpact_set_field;
|
2010-05-27 13:14:05 -07:00
|
|
|
|
|
2011-08-16 15:26:18 -07:00
|
|
|
|
/* Port numbers. */
|
2013-06-19 16:58:44 -07:00
|
|
|
|
enum ofperr ofputil_port_from_ofp11(ovs_be32 ofp11_port,
|
|
|
|
|
ofp_port_t *ofp10_port);
|
|
|
|
|
ovs_be32 ofputil_port_to_ofp11(ofp_port_t ofp10_port);
|
2012-02-14 17:08:03 -08:00
|
|
|
|
|
2013-06-19 16:58:44 -07:00
|
|
|
|
bool ofputil_port_from_string(const char *, ofp_port_t *portp);
|
|
|
|
|
void ofputil_format_port(ofp_port_t port, struct ds *);
|
2013-06-24 13:18:46 -07:00
|
|
|
|
void ofputil_port_to_string(ofp_port_t, char namebuf[OFP_MAX_PORT_NAME_LEN],
|
|
|
|
|
size_t bufsize);
|
2010-12-06 10:20:20 -08:00
|
|
|
|
|
2013-09-01 18:30:17 -07:00
|
|
|
|
/* Group numbers. */
|
|
|
|
|
enum { MAX_GROUP_NAME_LEN = INT_STRLEN(uint32_t) };
|
|
|
|
|
bool ofputil_group_from_string(const char *, uint32_t *group_id);
|
|
|
|
|
void ofputil_format_group(uint32_t group_id, struct ds *);
|
|
|
|
|
void ofputil_group_to_string(uint32_t group_id,
|
|
|
|
|
char namebuf[MAX_GROUP_NAME_LEN + 1],
|
|
|
|
|
size_t bufsize);
|
|
|
|
|
|
2012-05-21 21:51:03 -07:00
|
|
|
|
/* Converting OFPFW10_NW_SRC_MASK and OFPFW10_NW_DST_MASK wildcard bit counts
|
|
|
|
|
* to and from IP bitmasks. */
|
2010-11-22 10:09:18 -08:00
|
|
|
|
ovs_be32 ofputil_wcbits_to_netmask(int wcbits);
|
|
|
|
|
int ofputil_netmask_to_wcbits(ovs_be32 netmask);
|
|
|
|
|
|
2012-02-10 13:30:23 -08:00
|
|
|
|
/* Protocols.
|
2012-11-15 21:01:13 -08:00
|
|
|
|
*
|
|
|
|
|
* A "protocol" is an OpenFlow version plus, for some OpenFlow versions,
|
|
|
|
|
* a bit extra about the flow match format in use.
|
2012-02-10 13:30:23 -08:00
|
|
|
|
*
|
|
|
|
|
* These are arranged from most portable to least portable, or alternatively
|
2012-11-15 21:01:13 -08:00
|
|
|
|
* from least powerful to most powerful. Protocols earlier on the list are
|
|
|
|
|
* more likely to be understood for the purpose of making requests, but
|
|
|
|
|
* protocol later on the list are more likely to accurately describe a flow
|
|
|
|
|
* within a switch.
|
2012-02-10 13:30:23 -08:00
|
|
|
|
*
|
|
|
|
|
* On any given OpenFlow connection, a single protocol is in effect at any
|
|
|
|
|
* given time. These values use separate bits only because that makes it easy
|
|
|
|
|
* to test whether a particular protocol is within a given set of protocols and
|
|
|
|
|
* to implement set union and intersection.
|
|
|
|
|
*/
|
|
|
|
|
enum ofputil_protocol {
|
2012-11-15 21:01:13 -08:00
|
|
|
|
/* OpenFlow 1.0 protocols.
|
|
|
|
|
*
|
|
|
|
|
* The "STD" protocols use the standard OpenFlow 1.0 flow format.
|
|
|
|
|
* The "NXM" protocols use the Nicira Extensible Match (NXM) flow format.
|
|
|
|
|
*
|
|
|
|
|
* The protocols with "TID" mean that the nx_flow_mod_table_id Nicira
|
|
|
|
|
* extension has been enabled. The other protocols have it disabled.
|
|
|
|
|
*/
|
2012-11-19 09:49:13 -08:00
|
|
|
|
#define OFPUTIL_P_NONE 0
|
2012-11-15 21:01:13 -08:00
|
|
|
|
OFPUTIL_P_OF10_STD = 1 << 0,
|
|
|
|
|
OFPUTIL_P_OF10_STD_TID = 1 << 1,
|
|
|
|
|
OFPUTIL_P_OF10_NXM = 1 << 2,
|
|
|
|
|
OFPUTIL_P_OF10_NXM_TID = 1 << 3,
|
|
|
|
|
#define OFPUTIL_P_OF10_STD_ANY (OFPUTIL_P_OF10_STD | OFPUTIL_P_OF10_STD_TID)
|
|
|
|
|
#define OFPUTIL_P_OF10_NXM_ANY (OFPUTIL_P_OF10_NXM | OFPUTIL_P_OF10_NXM_TID)
|
2013-10-23 12:52:57 -07:00
|
|
|
|
#define OFPUTIL_P_OF10_ANY (OFPUTIL_P_OF10_STD_ANY | OFPUTIL_P_OF10_NXM_ANY)
|
2012-02-10 13:30:23 -08:00
|
|
|
|
|
2013-07-08 14:48:05 -07:00
|
|
|
|
/* OpenFlow 1.1 protocol.
|
|
|
|
|
*
|
|
|
|
|
* We only support the standard OpenFlow 1.1 flow format.
|
|
|
|
|
*
|
|
|
|
|
* OpenFlow 1.1 always operates with an equivalent of the
|
|
|
|
|
* nx_flow_mod_table_id Nicira extension enabled, so there is no "TID"
|
|
|
|
|
* variant. */
|
|
|
|
|
OFPUTIL_P_OF11_STD = 1 << 4,
|
|
|
|
|
|
2012-11-27 17:44:22 +02:00
|
|
|
|
/* OpenFlow 1.2+ protocols (only one variant each).
|
2012-11-15 21:01:13 -08:00
|
|
|
|
*
|
2012-11-27 17:44:22 +02:00
|
|
|
|
* These use the standard OpenFlow Extensible Match (OXM) flow format.
|
2012-11-15 21:01:13 -08:00
|
|
|
|
*
|
2012-11-27 17:44:22 +02:00
|
|
|
|
* OpenFlow 1.2+ always operates with an equivalent of the
|
2012-11-15 21:01:13 -08:00
|
|
|
|
* nx_flow_mod_table_id Nicira extension enabled, so there is no "TID"
|
|
|
|
|
* variant. */
|
2013-07-08 14:48:05 -07:00
|
|
|
|
OFPUTIL_P_OF12_OXM = 1 << 5,
|
|
|
|
|
OFPUTIL_P_OF13_OXM = 1 << 6,
|
2014-03-03 15:22:32 +02:00
|
|
|
|
OFPUTIL_P_OF14_OXM = 1 << 7,
|
2014-05-07 13:42:24 -07:00
|
|
|
|
OFPUTIL_P_OF15_OXM = 1 << 8,
|
2016-04-10 14:39:12 -07:00
|
|
|
|
OFPUTIL_P_OF16_OXM = 1 << 9,
|
2014-05-07 13:42:24 -07:00
|
|
|
|
#define OFPUTIL_P_ANY_OXM (OFPUTIL_P_OF12_OXM | \
|
|
|
|
|
OFPUTIL_P_OF13_OXM | \
|
|
|
|
|
OFPUTIL_P_OF14_OXM | \
|
2016-04-10 14:39:12 -07:00
|
|
|
|
OFPUTIL_P_OF15_OXM | \
|
|
|
|
|
OFPUTIL_P_OF16_OXM)
|
2012-07-22 21:14:41 -07:00
|
|
|
|
|
2013-08-20 18:41:45 -07:00
|
|
|
|
#define OFPUTIL_P_NXM_OF11_UP (OFPUTIL_P_OF10_NXM_ANY | OFPUTIL_P_OF11_STD | \
|
|
|
|
|
OFPUTIL_P_ANY_OXM)
|
|
|
|
|
|
|
|
|
|
#define OFPUTIL_P_NXM_OXM_ANY (OFPUTIL_P_OF10_NXM_ANY | OFPUTIL_P_ANY_OXM)
|
|
|
|
|
|
|
|
|
|
#define OFPUTIL_P_OF11_UP (OFPUTIL_P_OF11_STD | OFPUTIL_P_ANY_OXM)
|
|
|
|
|
|
2014-05-07 13:46:39 -07:00
|
|
|
|
#define OFPUTIL_P_OF12_UP (OFPUTIL_P_OF12_OXM | OFPUTIL_P_OF13_UP)
|
|
|
|
|
#define OFPUTIL_P_OF13_UP (OFPUTIL_P_OF13_OXM | OFPUTIL_P_OF14_UP)
|
2014-05-07 13:42:24 -07:00
|
|
|
|
#define OFPUTIL_P_OF14_UP (OFPUTIL_P_OF14_OXM | OFPUTIL_P_OF15_UP)
|
2016-04-10 14:39:12 -07:00
|
|
|
|
#define OFPUTIL_P_OF15_UP (OFPUTIL_P_OF15_OXM | OFPUTIL_P_OF16_UP)
|
|
|
|
|
#define OFPUTIL_P_OF16_UP OFPUTIL_P_OF16_OXM
|
2014-03-03 15:22:32 +02:00
|
|
|
|
|
2012-02-10 13:30:23 -08:00
|
|
|
|
/* All protocols. */
|
2016-04-10 14:39:12 -07:00
|
|
|
|
#define OFPUTIL_P_ANY ((1 << 10) - 1)
|
2012-02-10 13:30:23 -08:00
|
|
|
|
|
|
|
|
|
/* Protocols in which a specific table may be specified in flow_mods. */
|
2012-11-15 22:36:15 -08:00
|
|
|
|
#define OFPUTIL_P_TID (OFPUTIL_P_OF10_STD_TID | \
|
|
|
|
|
OFPUTIL_P_OF10_NXM_TID | \
|
2013-07-08 14:48:05 -07:00
|
|
|
|
OFPUTIL_P_OF11_STD | \
|
2012-11-28 21:41:05 -08:00
|
|
|
|
OFPUTIL_P_ANY_OXM)
|
2012-02-10 13:30:23 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Protocols to use for flow dumps, from most to least preferred. */
|
|
|
|
|
extern enum ofputil_protocol ofputil_flow_dump_protocols[];
|
|
|
|
|
extern size_t ofputil_n_flow_dump_protocols;
|
|
|
|
|
|
2012-11-28 21:33:04 -08:00
|
|
|
|
enum ofputil_protocol ofputil_protocol_from_ofp_version(enum ofp_version);
|
2012-11-28 21:41:05 -08:00
|
|
|
|
enum ofputil_protocol ofputil_protocols_from_ofp_version(enum ofp_version);
|
|
|
|
|
enum ofp_version ofputil_protocol_to_ofp_version(enum ofputil_protocol);
|
2012-02-15 16:33:04 -08:00
|
|
|
|
|
2012-02-10 13:30:23 -08:00
|
|
|
|
bool ofputil_protocol_is_valid(enum ofputil_protocol);
|
|
|
|
|
enum ofputil_protocol ofputil_protocol_set_tid(enum ofputil_protocol,
|
|
|
|
|
bool enable);
|
|
|
|
|
enum ofputil_protocol ofputil_protocol_to_base(enum ofputil_protocol);
|
|
|
|
|
enum ofputil_protocol ofputil_protocol_set_base(
|
|
|
|
|
enum ofputil_protocol cur, enum ofputil_protocol new_base);
|
|
|
|
|
|
|
|
|
|
const char *ofputil_protocol_to_string(enum ofputil_protocol);
|
|
|
|
|
char *ofputil_protocols_to_string(enum ofputil_protocol);
|
|
|
|
|
enum ofputil_protocol ofputil_protocols_from_string(const char *);
|
|
|
|
|
|
2012-11-04 21:40:54 -08:00
|
|
|
|
void ofputil_format_version(struct ds *, enum ofp_version);
|
|
|
|
|
void ofputil_format_version_name(struct ds *, enum ofp_version);
|
|
|
|
|
|
|
|
|
|
/* A bitmap of version numbers
|
|
|
|
|
*
|
|
|
|
|
* Bit offsets correspond to ofp_version numbers which in turn correspond to
|
2014-11-11 16:42:24 -08:00
|
|
|
|
* wire-protocol numbers for OpenFlow versions, e.g. (1u << OFP11_VERSION)
|
|
|
|
|
* is the mask for OpenFlow 1.1. If the bit for a version is set then it is
|
2012-11-04 21:40:54 -08:00
|
|
|
|
* allowed, otherwise it is disallowed. */
|
|
|
|
|
|
|
|
|
|
void ofputil_format_version_bitmap(struct ds *msg, uint32_t bitmap);
|
|
|
|
|
void ofputil_format_version_bitmap_names(struct ds *msg, uint32_t bitmap);
|
|
|
|
|
|
2014-05-09 18:18:17 -07:00
|
|
|
|
enum ofp_version ofputil_version_from_string(const char *s);
|
|
|
|
|
|
2012-11-28 21:41:05 -08:00
|
|
|
|
uint32_t ofputil_protocols_to_version_bitmap(enum ofputil_protocol);
|
|
|
|
|
enum ofputil_protocol ofputil_protocols_from_version_bitmap(uint32_t bitmap);
|
|
|
|
|
|
Enable OpenFlow 1.0, 1.1, 1.2, and 1.3 by default.
The Open vSwitch software switch now supports all the required features of
OpenFlow 1.0 through 1.3, with one known trivial exception[*]. Enable them
by default in ovs-vswitchd.
For now, ovs-ofctl only enables OpenFlow 1.0 by default. This is
because ovs-ofctl implements command such as "add-flow" as raw
OpenFlow requests, but those requests have subtly different semantics
in different OpenFlow versions. For example:
- In OpenFlow 1.0, a "mod-flow" operation that does not find any
existing flow to modify adds a new flow.
- In OpenFlow 1.1, a "mod-flow" operation that does not find any
existing flow to modify adds a new flow, but only if the
mod-flow did not match on the flow cookie.
- In OpenFlow 1.2 and a later, a "mod-flow" operation never adds a
new flow.
[*] OpenFlow 1.1, but not any earlier or later version of OpenFlow,
requires support for VLANs introduced by Ethertype 0x88a8, but Open
vSwitch does not support this Ethertype.
Signed-off-by: Ben Pfaff <blp@nicira.com>
Reviewed-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
2014-04-30 06:54:09 -07:00
|
|
|
|
/* Bitmaps of OpenFlow versions that Open vSwitch supports, and that it enables
|
|
|
|
|
* by default. When Open vSwitch has experimental or incomplete support for
|
|
|
|
|
* newer versions of OpenFlow, those versions should not be supported by
|
|
|
|
|
* default and thus should be omitted from the latter bitmap. */
|
|
|
|
|
#define OFPUTIL_SUPPORTED_VERSIONS ((1u << OFP10_VERSION) | \
|
|
|
|
|
(1u << OFP11_VERSION) | \
|
|
|
|
|
(1u << OFP12_VERSION) | \
|
|
|
|
|
(1u << OFP13_VERSION))
|
|
|
|
|
#define OFPUTIL_DEFAULT_VERSIONS OFPUTIL_SUPPORTED_VERSIONS
|
2012-11-04 21:40:54 -08:00
|
|
|
|
|
|
|
|
|
enum ofputil_protocol ofputil_protocols_from_string(const char *s);
|
|
|
|
|
|
|
|
|
|
const char *ofputil_version_to_string(enum ofp_version ofp_version);
|
|
|
|
|
uint32_t ofputil_versions_from_string(const char *s);
|
2012-11-19 14:59:30 +09:00
|
|
|
|
uint32_t ofputil_versions_from_strings(char ** const s, size_t count);
|
2012-11-04 21:40:54 -08:00
|
|
|
|
|
2012-11-04 22:04:55 -08:00
|
|
|
|
bool ofputil_decode_hello(const struct ofp_header *,
|
|
|
|
|
uint32_t *allowed_versions);
|
|
|
|
|
struct ofpbuf *ofputil_encode_hello(uint32_t version_bitmap);
|
|
|
|
|
|
2012-02-10 13:30:23 -08:00
|
|
|
|
struct ofpbuf *ofputil_encode_set_protocol(enum ofputil_protocol current,
|
|
|
|
|
enum ofputil_protocol want,
|
|
|
|
|
enum ofputil_protocol *next);
|
|
|
|
|
|
|
|
|
|
/* nx_flow_format */
|
|
|
|
|
struct ofpbuf *ofputil_encode_nx_set_flow_format(enum nx_flow_format);
|
|
|
|
|
enum ofputil_protocol ofputil_nx_flow_format_to_protocol(enum nx_flow_format);
|
|
|
|
|
bool ofputil_nx_flow_format_is_valid(enum nx_flow_format);
|
|
|
|
|
const char *ofputil_nx_flow_format_to_string(enum nx_flow_format);
|
|
|
|
|
|
2012-05-21 21:51:03 -07:00
|
|
|
|
/* Work with ofp10_match. */
|
|
|
|
|
void ofputil_wildcard_from_ofpfw10(uint32_t ofpfw, struct flow_wildcards *);
|
2012-08-07 15:28:18 -07:00
|
|
|
|
void ofputil_match_from_ofp10_match(const struct ofp10_match *,
|
|
|
|
|
struct match *);
|
|
|
|
|
void ofputil_normalize_match(struct match *);
|
|
|
|
|
void ofputil_normalize_match_quiet(struct match *);
|
|
|
|
|
void ofputil_match_to_ofp10_match(const struct match *, struct ofp10_match *);
|
2010-11-10 14:39:54 -08:00
|
|
|
|
|
2012-06-09 15:49:16 -07:00
|
|
|
|
/* Work with ofp11_match. */
|
2016-04-19 18:36:04 -07:00
|
|
|
|
enum ofperr ofputil_pull_ofp11_match(struct ofpbuf *, const struct tun_table *,
|
|
|
|
|
struct match *,
|
2012-08-08 06:49:36 +09:00
|
|
|
|
uint16_t *padded_match_len);
|
2015-03-20 13:50:30 +09:00
|
|
|
|
enum ofperr ofputil_pull_ofp11_mask(struct ofpbuf *, struct match *,
|
|
|
|
|
struct mf_bitmap *bm);
|
2012-08-07 15:28:18 -07:00
|
|
|
|
enum ofperr ofputil_match_from_ofp11_match(const struct ofp11_match *,
|
|
|
|
|
struct match *);
|
2013-07-08 14:48:05 -07:00
|
|
|
|
int ofputil_put_ofp11_match(struct ofpbuf *, const struct match *,
|
|
|
|
|
enum ofputil_protocol);
|
2012-08-07 15:28:18 -07:00
|
|
|
|
void ofputil_match_to_ofp11_match(const struct match *, struct ofp11_match *);
|
2013-07-08 14:48:05 -07:00
|
|
|
|
int ofputil_match_typical_len(enum ofputil_protocol);
|
2012-06-09 15:49:16 -07:00
|
|
|
|
|
2011-01-23 18:44:44 -08:00
|
|
|
|
/* dl_type translation between OpenFlow and 'struct flow' format. */
|
|
|
|
|
ovs_be16 ofputil_dl_type_to_openflow(ovs_be16 flow_dl_type);
|
|
|
|
|
ovs_be16 ofputil_dl_type_from_openflow(ovs_be16 ofp_dl_type);
|
|
|
|
|
|
2011-12-09 15:48:26 -08:00
|
|
|
|
/* PACKET_IN. */
|
|
|
|
|
bool ofputil_packet_in_format_is_valid(enum nx_packet_in_format);
|
|
|
|
|
int ofputil_packet_in_format_from_string(const char *);
|
|
|
|
|
const char *ofputil_packet_in_format_to_string(enum nx_packet_in_format);
|
2012-10-04 11:41:16 +09:00
|
|
|
|
struct ofpbuf *ofputil_make_set_packet_in_format(enum ofp_version,
|
|
|
|
|
enum nx_packet_in_format);
|
2011-12-09 15:48:26 -08:00
|
|
|
|
|
2011-05-12 09:58:01 -07:00
|
|
|
|
/* NXT_FLOW_MOD_TABLE_ID extension. */
|
|
|
|
|
struct ofpbuf *ofputil_make_flow_mod_table_id(bool flow_mod_table_id);
|
|
|
|
|
|
2013-08-26 16:23:50 -07:00
|
|
|
|
/* Protocol-independent flow_mod flags. */
|
|
|
|
|
enum ofputil_flow_mod_flags {
|
2013-09-12 00:56:53 +03:00
|
|
|
|
/* Flags that are maintained with a flow as part of its state.
|
|
|
|
|
*
|
|
|
|
|
* (OFPUTIL_FF_EMERG would be here too, if OVS supported it.) */
|
2013-08-26 16:23:50 -07:00
|
|
|
|
OFPUTIL_FF_SEND_FLOW_REM = 1 << 0, /* All versions. */
|
2013-09-12 00:56:53 +03:00
|
|
|
|
OFPUTIL_FF_NO_PKT_COUNTS = 1 << 1, /* OpenFlow 1.3+. */
|
|
|
|
|
OFPUTIL_FF_NO_BYT_COUNTS = 1 << 2, /* OpenFlow 1.3+. */
|
|
|
|
|
|
2015-11-28 11:55:58 -08:00
|
|
|
|
/* These flags primarily affects flow_mod behavior. They are not
|
|
|
|
|
* particularly useful as part of flow state. We include them in flow
|
|
|
|
|
* state only because OpenFlow implies that they should be. */
|
2013-09-12 00:56:53 +03:00
|
|
|
|
OFPUTIL_FF_CHECK_OVERLAP = 1 << 3, /* All versions. */
|
2015-11-28 11:55:58 -08:00
|
|
|
|
OFPUTIL_FF_RESET_COUNTS = 1 << 4, /* OpenFlow 1.2+. */
|
|
|
|
|
|
|
|
|
|
/* Not supported by OVS. */
|
|
|
|
|
OFPUTIL_FF_EMERG = 1 << 5, /* OpenFlow 1.0 only. */
|
|
|
|
|
|
|
|
|
|
/* The set of flags maintained as part of a flow table entry. */
|
|
|
|
|
#define OFPUTIL_FF_STATE (OFPUTIL_FF_SEND_FLOW_REM \
|
|
|
|
|
| OFPUTIL_FF_NO_PKT_COUNTS \
|
|
|
|
|
| OFPUTIL_FF_NO_BYT_COUNTS \
|
|
|
|
|
| OFPUTIL_FF_CHECK_OVERLAP \
|
|
|
|
|
| OFPUTIL_FF_RESET_COUNTS)
|
2014-03-05 15:27:31 -08:00
|
|
|
|
|
|
|
|
|
/* Flags that are only set by OVS for its internal use. Cannot be set via
|
|
|
|
|
* OpenFlow. */
|
|
|
|
|
OFPUTIL_FF_HIDDEN_FIELDS = 1 << 6, /* Allow hidden match fields to be
|
|
|
|
|
set or modified. */
|
|
|
|
|
OFPUTIL_FF_NO_READONLY = 1 << 7, /* Allow rules within read only tables
|
|
|
|
|
to be modified */
|
2013-08-26 16:23:50 -07:00
|
|
|
|
};
|
|
|
|
|
|
2012-03-24 01:02:26 -07:00
|
|
|
|
/* Protocol-independent flow_mod.
|
|
|
|
|
*
|
|
|
|
|
* The handling of cookies across multiple versions of OpenFlow is a bit
|
2013-04-17 13:02:15 -07:00
|
|
|
|
* confusing. See DESIGN for the details. */
|
2011-08-08 14:46:38 -07:00
|
|
|
|
struct ofputil_flow_mod {
|
2014-12-15 14:10:38 +01:00
|
|
|
|
struct ovs_list list_node; /* For queuing flow_mods. */
|
2013-07-11 17:17:00 -07:00
|
|
|
|
|
2012-08-07 15:28:18 -07:00
|
|
|
|
struct match match;
|
2014-10-30 11:40:07 -07:00
|
|
|
|
int priority;
|
2013-04-17 13:02:15 -07:00
|
|
|
|
|
|
|
|
|
/* Cookie matching. The flow_mod affects only flows that have cookies that
|
|
|
|
|
* bitwise match 'cookie' bits in positions where 'cookie_mask has 1-bits.
|
|
|
|
|
*
|
|
|
|
|
* 'cookie_mask' should be zero for OFPFC_ADD flow_mods. */
|
2012-03-24 01:02:26 -07:00
|
|
|
|
ovs_be64 cookie; /* Cookie bits to match. */
|
|
|
|
|
ovs_be64 cookie_mask; /* 1-bit in each 'cookie' bit to match. */
|
2013-04-17 13:02:15 -07:00
|
|
|
|
|
|
|
|
|
/* Cookie changes.
|
|
|
|
|
*
|
|
|
|
|
* OFPFC_ADD uses 'new_cookie' as the new flow's cookie. 'new_cookie'
|
|
|
|
|
* should not be UINT64_MAX.
|
|
|
|
|
*
|
|
|
|
|
* OFPFC_MODIFY and OFPFC_MODIFY_STRICT have two cases:
|
|
|
|
|
*
|
|
|
|
|
* - If one or more matching flows exist and 'modify_cookie' is true,
|
|
|
|
|
* then the flow_mod changes the existing flows' cookies to
|
|
|
|
|
* 'new_cookie'. 'new_cookie' should not be UINT64_MAX.
|
|
|
|
|
*
|
|
|
|
|
* - If no matching flow exists, 'new_cookie' is not UINT64_MAX, and
|
|
|
|
|
* 'cookie_mask' is 0, then the flow_mod adds a new flow with
|
|
|
|
|
* 'new_cookie' as its cookie.
|
|
|
|
|
*/
|
|
|
|
|
ovs_be64 new_cookie; /* New cookie to install or UINT64_MAX. */
|
|
|
|
|
bool modify_cookie; /* Set cookie of existing flow to 'new_cookie'? */
|
|
|
|
|
|
2011-05-12 09:58:01 -07:00
|
|
|
|
uint8_t table_id;
|
2010-12-07 12:45:24 -08:00
|
|
|
|
uint16_t command;
|
|
|
|
|
uint16_t idle_timeout;
|
|
|
|
|
uint16_t hard_timeout;
|
|
|
|
|
uint32_t buffer_id;
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t out_port;
|
2013-09-01 18:30:17 -07:00
|
|
|
|
uint32_t out_group;
|
2013-08-26 16:23:50 -07:00
|
|
|
|
enum ofputil_flow_mod_flags flags;
|
2014-11-07 18:18:48 +05:30
|
|
|
|
uint16_t importance; /* Eviction precedence. */
|
2014-04-29 15:50:38 -07:00
|
|
|
|
struct ofpact *ofpacts; /* Series of "struct ofpact"s. */
|
|
|
|
|
size_t ofpacts_len; /* Length of ofpacts, in bytes. */
|
2010-12-07 12:45:24 -08:00
|
|
|
|
};
|
|
|
|
|
|
2012-01-12 15:48:19 -08:00
|
|
|
|
enum ofperr ofputil_decode_flow_mod(struct ofputil_flow_mod *,
|
|
|
|
|
const struct ofp_header *,
|
2012-07-03 22:17:14 -07:00
|
|
|
|
enum ofputil_protocol,
|
2016-04-19 18:36:04 -07:00
|
|
|
|
const struct tun_table *,
|
2013-11-01 21:45:28 -07:00
|
|
|
|
struct ofpbuf *ofpacts,
|
|
|
|
|
ofp_port_t max_port,
|
|
|
|
|
uint8_t max_table);
|
2011-08-08 14:46:38 -07:00
|
|
|
|
struct ofpbuf *ofputil_encode_flow_mod(const struct ofputil_flow_mod *,
|
2012-02-10 13:30:23 -08:00
|
|
|
|
enum ofputil_protocol);
|
|
|
|
|
|
|
|
|
|
/* Flow stats or aggregate stats request, independent of protocol. */
|
2011-08-08 14:48:48 -07:00
|
|
|
|
struct ofputil_flow_stats_request {
|
2010-12-07 12:45:24 -08:00
|
|
|
|
bool aggregate; /* Aggregate results? */
|
2012-08-07 15:28:18 -07:00
|
|
|
|
struct match match;
|
2011-12-23 12:23:24 -08:00
|
|
|
|
ovs_be64 cookie;
|
|
|
|
|
ovs_be64 cookie_mask;
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t out_port;
|
2013-09-01 18:30:17 -07:00
|
|
|
|
uint32_t out_group;
|
2010-12-07 12:45:24 -08:00
|
|
|
|
uint8_t table_id;
|
|
|
|
|
};
|
|
|
|
|
|
2012-01-12 15:48:19 -08:00
|
|
|
|
enum ofperr ofputil_decode_flow_stats_request(
|
2016-04-19 18:36:04 -07:00
|
|
|
|
struct ofputil_flow_stats_request *, const struct ofp_header *,
|
|
|
|
|
const struct tun_table *);
|
2010-12-07 12:45:24 -08:00
|
|
|
|
struct ofpbuf *ofputil_encode_flow_stats_request(
|
2012-02-10 13:30:23 -08:00
|
|
|
|
const struct ofputil_flow_stats_request *, enum ofputil_protocol);
|
2010-12-07 12:45:24 -08:00
|
|
|
|
|
2012-02-10 13:30:23 -08:00
|
|
|
|
/* Flow stats reply, independent of protocol. */
|
2011-03-10 15:02:05 -08:00
|
|
|
|
struct ofputil_flow_stats {
|
2012-08-07 15:28:18 -07:00
|
|
|
|
struct match match;
|
2011-03-10 15:02:05 -08:00
|
|
|
|
ovs_be64 cookie;
|
|
|
|
|
uint8_t table_id;
|
2012-08-07 15:28:18 -07:00
|
|
|
|
uint16_t priority;
|
2011-03-10 15:02:05 -08:00
|
|
|
|
uint16_t idle_timeout;
|
|
|
|
|
uint16_t hard_timeout;
|
2013-12-13 14:17:13 +01:00
|
|
|
|
uint32_t duration_sec;
|
|
|
|
|
uint32_t duration_nsec;
|
2012-02-07 10:13:52 -08:00
|
|
|
|
int idle_age; /* Seconds since last packet, -1 if unknown. */
|
|
|
|
|
int hard_age; /* Seconds since last change, -1 if unknown. */
|
2011-05-27 15:16:08 -07:00
|
|
|
|
uint64_t packet_count; /* Packet count, UINT64_MAX if unknown. */
|
|
|
|
|
uint64_t byte_count; /* Byte count, UINT64_MAX if unknown. */
|
2014-04-29 15:50:38 -07:00
|
|
|
|
const struct ofpact *ofpacts;
|
2012-07-03 22:17:14 -07:00
|
|
|
|
size_t ofpacts_len;
|
2013-08-26 16:23:50 -07:00
|
|
|
|
enum ofputil_flow_mod_flags flags;
|
2014-11-07 18:18:48 +05:30
|
|
|
|
uint16_t importance; /* Eviction precedence. */
|
2011-03-10 15:02:05 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int ofputil_decode_flow_stats_reply(struct ofputil_flow_stats *,
|
2012-02-07 10:13:52 -08:00
|
|
|
|
struct ofpbuf *msg,
|
2012-07-03 22:17:14 -07:00
|
|
|
|
bool flow_age_extension,
|
|
|
|
|
struct ofpbuf *ofpacts);
|
2011-05-31 16:55:02 -07:00
|
|
|
|
void ofputil_append_flow_stats_reply(const struct ofputil_flow_stats *,
|
2016-04-19 18:36:04 -07:00
|
|
|
|
struct ovs_list *replies,
|
|
|
|
|
const struct tun_table *);
|
2011-03-10 15:02:05 -08:00
|
|
|
|
|
2012-02-10 13:30:23 -08:00
|
|
|
|
/* Aggregate stats reply, independent of protocol. */
|
2011-05-26 16:02:56 -07:00
|
|
|
|
struct ofputil_aggregate_stats {
|
2011-05-27 15:16:08 -07:00
|
|
|
|
uint64_t packet_count; /* Packet count, UINT64_MAX if unknown. */
|
|
|
|
|
uint64_t byte_count; /* Byte count, UINT64_MAX if unknown. */
|
2011-05-26 16:02:56 -07:00
|
|
|
|
uint32_t flow_count;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ofpbuf *ofputil_encode_aggregate_stats_reply(
|
|
|
|
|
const struct ofputil_aggregate_stats *stats,
|
2012-07-19 23:23:17 -07:00
|
|
|
|
const struct ofp_header *request);
|
|
|
|
|
enum ofperr ofputil_decode_aggregate_stats_reply(
|
|
|
|
|
struct ofputil_aggregate_stats *,
|
|
|
|
|
const struct ofp_header *reply);
|
2011-05-26 16:02:56 -07:00
|
|
|
|
|
2012-02-10 13:30:23 -08:00
|
|
|
|
/* Flow removed message, independent of protocol. */
|
2010-12-09 10:31:49 -08:00
|
|
|
|
struct ofputil_flow_removed {
|
2012-08-07 15:28:18 -07:00
|
|
|
|
struct match match;
|
2010-12-09 10:31:49 -08:00
|
|
|
|
ovs_be64 cookie;
|
2013-12-13 14:17:13 +01:00
|
|
|
|
uint16_t priority;
|
2010-12-09 10:31:49 -08:00
|
|
|
|
uint8_t reason; /* One of OFPRR_*. */
|
2012-10-01 16:51:49 +09:00
|
|
|
|
uint8_t table_id; /* 255 if message didn't include table ID. */
|
2010-12-09 10:31:49 -08:00
|
|
|
|
uint32_t duration_sec;
|
|
|
|
|
uint32_t duration_nsec;
|
|
|
|
|
uint16_t idle_timeout;
|
2012-08-09 11:01:48 -07:00
|
|
|
|
uint16_t hard_timeout;
|
2011-05-27 15:16:08 -07:00
|
|
|
|
uint64_t packet_count; /* Packet count, UINT64_MAX if unknown. */
|
|
|
|
|
uint64_t byte_count; /* Byte count, UINT64_MAX if unknown. */
|
2010-12-09 10:31:49 -08:00
|
|
|
|
};
|
|
|
|
|
|
2012-01-12 15:48:19 -08:00
|
|
|
|
enum ofperr ofputil_decode_flow_removed(struct ofputil_flow_removed *,
|
|
|
|
|
const struct ofp_header *);
|
2011-03-15 09:49:14 -07:00
|
|
|
|
struct ofpbuf *ofputil_encode_flow_removed(const struct ofputil_flow_removed *,
|
2012-02-10 13:30:23 -08:00
|
|
|
|
enum ofputil_protocol);
|
2010-12-09 10:31:49 -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
|
|
|
|
/* Abstract packet-in message.
|
|
|
|
|
*
|
|
|
|
|
* This omits the 'total_len' and 'buffer_id' fields, which we handle
|
|
|
|
|
* differently for encoding and decoding.*/
|
2011-03-22 09:13:02 -07:00
|
|
|
|
struct ofputil_packet_in {
|
2013-10-22 16:38:46 -07:00
|
|
|
|
/* Packet data and metadata.
|
|
|
|
|
*
|
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
|
|
|
|
* On encoding, the full packet should be supplied, but depending on its
|
|
|
|
|
* other parameters ofputil_encode_packet_in() might send only the first
|
|
|
|
|
* part of the packet.
|
2013-10-22 16:38:46 -07: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
|
|
|
|
* On decoding, the 'len' bytes in 'packet' might only be the first part of
|
|
|
|
|
* the original packet. ofputil_decode_packet_in() reports the full
|
|
|
|
|
* original length of the packet using its 'total_len' output parameter. */
|
2016-02-17 13:14:26 -08:00
|
|
|
|
void *packet; /* The packet. */
|
2016-02-17 00:31:11 -08:00
|
|
|
|
size_t packet_len; /* Length of 'packet' in bytes. */
|
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
|
|
|
|
|
|
|
|
|
/* Input port and other metadata for packet. */
|
|
|
|
|
struct match flow_metadata;
|
2012-01-04 16:40:13 -08:00
|
|
|
|
|
2013-10-22 16:38:46 -07:00
|
|
|
|
/* Reason that the packet-in is being sent. */
|
|
|
|
|
enum ofp_packet_in_reason reason; /* One of OFPR_*. */
|
|
|
|
|
|
|
|
|
|
/* Information about the OpenFlow flow that triggered the packet-in.
|
|
|
|
|
*
|
|
|
|
|
* A packet-in triggered by a flow table miss has no associated flow. In
|
2013-10-22 16:57:46 -07:00
|
|
|
|
* that case, 'cookie' is UINT64_MAX. */
|
2013-10-22 16:38:46 -07:00
|
|
|
|
uint8_t table_id; /* OpenFlow table ID. */
|
|
|
|
|
ovs_be64 cookie; /* Flow's cookie. */
|
2016-02-19 15:53:26 -08:00
|
|
|
|
|
|
|
|
|
/* Arbitrary user-provided data. */
|
|
|
|
|
uint8_t *userdata;
|
|
|
|
|
size_t userdata_len;
|
2011-03-22 09:13:02 -07:00
|
|
|
|
};
|
|
|
|
|
|
Implement serializing the state of packet traversal in "continuations".
One purpose of OpenFlow packet-in messages is to allow a controller to
interpose on the path of a packet through the flow tables. If, for
example, the controller needs to modify a packet in some way that the
switch doesn't directly support, the controller should be able to
program the switch to send it the packet, then modify the packet and
send it back to the switch to continue through the flow table.
That's the theory. In practice, this doesn't work with any but the
simplest flow tables. Packet-in messages simply don't include enough
context to allow the flow table traversal to continue. For example:
* Via "resubmit" actions, an Open vSwitch packet can have an
effective "call stack", but a packet-in can't describe it, and
so it would be lost.
* A packet-in can't preserve the stack used by NXAST_PUSH and
NXAST_POP actions.
* A packet-in can't preserve the OpenFlow 1.1+ action set.
* A packet-in can't preserve the state of Open vSwitch mirroring
or connection tracking.
This commit introduces a solution called "continuations". A continuation
is the state of a packet's traversal through OpenFlow flow tables. A
"controller" action with the "pause" flag, which is newly implemented in
this commit, generates a continuation and sends it to the OpenFlow
controller in a packet-in asynchronous message (only NXT_PACKET_IN2
supports continuations, so the controller must configure them with
NXT_SET_PACKET_IN_FORMAT). The controller processes the packet-in,
possibly modifying some of its data, and sends it back to the switch with
an NXT_RESUME request, which causes flow table traversal to continue. In
principle, a single packet can be paused and resumed multiple times.
Another way to look at it is:
- "pause" is an extension of the existing OFPAT_CONTROLLER
action. It sends the packet to the controller, with full
pipeline context (some of which is switch implementation
dependent, and may thus vary from switch to switch).
- A continuation is an extension of OFPT_PACKET_IN, allowing for
implementation dependent metadata.
- NXT_RESUME is an extension of OFPT_PACKET_OUT, with the
semantics that the pipeline processing is continued with the
original translation context from where it was left at the time
it was paused.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Jarno Rajahalme <jarno@ovn.org>
2016-02-19 16:10:06 -08:00
|
|
|
|
void ofputil_packet_in_destroy(struct ofputil_packet_in *);
|
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
|
|
|
|
|
Implement serializing the state of packet traversal in "continuations".
One purpose of OpenFlow packet-in messages is to allow a controller to
interpose on the path of a packet through the flow tables. If, for
example, the controller needs to modify a packet in some way that the
switch doesn't directly support, the controller should be able to
program the switch to send it the packet, then modify the packet and
send it back to the switch to continue through the flow table.
That's the theory. In practice, this doesn't work with any but the
simplest flow tables. Packet-in messages simply don't include enough
context to allow the flow table traversal to continue. For example:
* Via "resubmit" actions, an Open vSwitch packet can have an
effective "call stack", but a packet-in can't describe it, and
so it would be lost.
* A packet-in can't preserve the stack used by NXAST_PUSH and
NXAST_POP actions.
* A packet-in can't preserve the OpenFlow 1.1+ action set.
* A packet-in can't preserve the state of Open vSwitch mirroring
or connection tracking.
This commit introduces a solution called "continuations". A continuation
is the state of a packet's traversal through OpenFlow flow tables. A
"controller" action with the "pause" flag, which is newly implemented in
this commit, generates a continuation and sends it to the OpenFlow
controller in a packet-in asynchronous message (only NXT_PACKET_IN2
supports continuations, so the controller must configure them with
NXT_SET_PACKET_IN_FORMAT). The controller processes the packet-in,
possibly modifying some of its data, and sends it back to the switch with
an NXT_RESUME request, which causes flow table traversal to continue. In
principle, a single packet can be paused and resumed multiple times.
Another way to look at it is:
- "pause" is an extension of the existing OFPAT_CONTROLLER
action. It sends the packet to the controller, with full
pipeline context (some of which is switch implementation
dependent, and may thus vary from switch to switch).
- A continuation is an extension of OFPT_PACKET_IN, allowing for
implementation dependent metadata.
- NXT_RESUME is an extension of OFPT_PACKET_OUT, with the
semantics that the pipeline processing is continued with the
original translation context from where it was left at the time
it was paused.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Jarno Rajahalme <jarno@ovn.org>
2016-02-19 16:10:06 -08:00
|
|
|
|
enum ofperr ofputil_decode_packet_in(const struct ofp_header *, bool loose,
|
2016-04-19 18:36:04 -07:00
|
|
|
|
const struct tun_table *,
|
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
|
|
|
|
struct ofputil_packet_in *,
|
Implement serializing the state of packet traversal in "continuations".
One purpose of OpenFlow packet-in messages is to allow a controller to
interpose on the path of a packet through the flow tables. If, for
example, the controller needs to modify a packet in some way that the
switch doesn't directly support, the controller should be able to
program the switch to send it the packet, then modify the packet and
send it back to the switch to continue through the flow table.
That's the theory. In practice, this doesn't work with any but the
simplest flow tables. Packet-in messages simply don't include enough
context to allow the flow table traversal to continue. For example:
* Via "resubmit" actions, an Open vSwitch packet can have an
effective "call stack", but a packet-in can't describe it, and
so it would be lost.
* A packet-in can't preserve the stack used by NXAST_PUSH and
NXAST_POP actions.
* A packet-in can't preserve the OpenFlow 1.1+ action set.
* A packet-in can't preserve the state of Open vSwitch mirroring
or connection tracking.
This commit introduces a solution called "continuations". A continuation
is the state of a packet's traversal through OpenFlow flow tables. A
"controller" action with the "pause" flag, which is newly implemented in
this commit, generates a continuation and sends it to the OpenFlow
controller in a packet-in asynchronous message (only NXT_PACKET_IN2
supports continuations, so the controller must configure them with
NXT_SET_PACKET_IN_FORMAT). The controller processes the packet-in,
possibly modifying some of its data, and sends it back to the switch with
an NXT_RESUME request, which causes flow table traversal to continue. In
principle, a single packet can be paused and resumed multiple times.
Another way to look at it is:
- "pause" is an extension of the existing OFPAT_CONTROLLER
action. It sends the packet to the controller, with full
pipeline context (some of which is switch implementation
dependent, and may thus vary from switch to switch).
- A continuation is an extension of OFPT_PACKET_IN, allowing for
implementation dependent metadata.
- NXT_RESUME is an extension of OFPT_PACKET_OUT, with the
semantics that the pipeline processing is continued with the
original translation context from where it was left at the time
it was paused.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Jarno Rajahalme <jarno@ovn.org>
2016-02-19 16:10:06 -08:00
|
|
|
|
size_t *total_len, uint32_t *buffer_id,
|
|
|
|
|
struct ofpbuf *continuation);
|
|
|
|
|
|
|
|
|
|
struct ofpbuf *ofputil_encode_resume(const struct ofputil_packet_in *pin,
|
|
|
|
|
const struct ofpbuf *continuation,
|
|
|
|
|
enum ofputil_protocol);
|
2011-03-22 09:13:02 -07:00
|
|
|
|
|
2013-04-16 15:13:21 -07:00
|
|
|
|
enum { OFPUTIL_PACKET_IN_REASON_BUFSIZE = INT_STRLEN(int) + 1 };
|
|
|
|
|
const char *ofputil_packet_in_reason_to_string(enum ofp_packet_in_reason,
|
|
|
|
|
char *reasonbuf,
|
|
|
|
|
size_t bufsize);
|
2012-02-07 14:46:34 -08:00
|
|
|
|
bool ofputil_packet_in_reason_from_string(const char *,
|
|
|
|
|
enum ofp_packet_in_reason *);
|
|
|
|
|
|
Implement serializing the state of packet traversal in "continuations".
One purpose of OpenFlow packet-in messages is to allow a controller to
interpose on the path of a packet through the flow tables. If, for
example, the controller needs to modify a packet in some way that the
switch doesn't directly support, the controller should be able to
program the switch to send it the packet, then modify the packet and
send it back to the switch to continue through the flow table.
That's the theory. In practice, this doesn't work with any but the
simplest flow tables. Packet-in messages simply don't include enough
context to allow the flow table traversal to continue. For example:
* Via "resubmit" actions, an Open vSwitch packet can have an
effective "call stack", but a packet-in can't describe it, and
so it would be lost.
* A packet-in can't preserve the stack used by NXAST_PUSH and
NXAST_POP actions.
* A packet-in can't preserve the OpenFlow 1.1+ action set.
* A packet-in can't preserve the state of Open vSwitch mirroring
or connection tracking.
This commit introduces a solution called "continuations". A continuation
is the state of a packet's traversal through OpenFlow flow tables. A
"controller" action with the "pause" flag, which is newly implemented in
this commit, generates a continuation and sends it to the OpenFlow
controller in a packet-in asynchronous message (only NXT_PACKET_IN2
supports continuations, so the controller must configure them with
NXT_SET_PACKET_IN_FORMAT). The controller processes the packet-in,
possibly modifying some of its data, and sends it back to the switch with
an NXT_RESUME request, which causes flow table traversal to continue. In
principle, a single packet can be paused and resumed multiple times.
Another way to look at it is:
- "pause" is an extension of the existing OFPAT_CONTROLLER
action. It sends the packet to the controller, with full
pipeline context (some of which is switch implementation
dependent, and may thus vary from switch to switch).
- A continuation is an extension of OFPT_PACKET_IN, allowing for
implementation dependent metadata.
- NXT_RESUME is an extension of OFPT_PACKET_OUT, with the
semantics that the pipeline processing is continued with the
original translation context from where it was left at the time
it was paused.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Jarno Rajahalme <jarno@ovn.org>
2016-02-19 16:10:06 -08:00
|
|
|
|
/* A packet-in message, including continuation data. The format of
|
|
|
|
|
* continuation data is subject to change and thus it is supposed to be opaque
|
|
|
|
|
* to any process other than ovs-vswitchd. Therefore, only ovs-vswitchd should
|
|
|
|
|
* use ofputil_packet_in_private and the functions that operate on it. */
|
|
|
|
|
struct ofputil_packet_in_private {
|
|
|
|
|
struct ofputil_packet_in public;
|
|
|
|
|
|
|
|
|
|
/* NXCPT_BRIDGE. */
|
|
|
|
|
struct uuid bridge;
|
|
|
|
|
|
|
|
|
|
/* NXCPT_STACK. */
|
|
|
|
|
union mf_subvalue *stack;
|
|
|
|
|
size_t n_stack;
|
|
|
|
|
|
|
|
|
|
/* NXCPT_MIRRORS. */
|
|
|
|
|
uint32_t mirrors;
|
|
|
|
|
|
|
|
|
|
/* NXCPT_CONNTRACKED. */
|
|
|
|
|
bool conntracked;
|
|
|
|
|
|
|
|
|
|
/* NXCPT_ACTIONS. */
|
|
|
|
|
struct ofpact *actions;
|
|
|
|
|
size_t actions_len;
|
|
|
|
|
|
|
|
|
|
/* NXCPT_ACTION_SET. */
|
|
|
|
|
struct ofpact *action_set;
|
|
|
|
|
size_t action_set_len;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ofpbuf *ofputil_encode_packet_in_private(
|
|
|
|
|
const struct ofputil_packet_in_private *,
|
|
|
|
|
enum ofputil_protocol protocol,
|
2016-08-30 10:20:51 -07:00
|
|
|
|
enum nx_packet_in_format);
|
Implement serializing the state of packet traversal in "continuations".
One purpose of OpenFlow packet-in messages is to allow a controller to
interpose on the path of a packet through the flow tables. If, for
example, the controller needs to modify a packet in some way that the
switch doesn't directly support, the controller should be able to
program the switch to send it the packet, then modify the packet and
send it back to the switch to continue through the flow table.
That's the theory. In practice, this doesn't work with any but the
simplest flow tables. Packet-in messages simply don't include enough
context to allow the flow table traversal to continue. For example:
* Via "resubmit" actions, an Open vSwitch packet can have an
effective "call stack", but a packet-in can't describe it, and
so it would be lost.
* A packet-in can't preserve the stack used by NXAST_PUSH and
NXAST_POP actions.
* A packet-in can't preserve the OpenFlow 1.1+ action set.
* A packet-in can't preserve the state of Open vSwitch mirroring
or connection tracking.
This commit introduces a solution called "continuations". A continuation
is the state of a packet's traversal through OpenFlow flow tables. A
"controller" action with the "pause" flag, which is newly implemented in
this commit, generates a continuation and sends it to the OpenFlow
controller in a packet-in asynchronous message (only NXT_PACKET_IN2
supports continuations, so the controller must configure them with
NXT_SET_PACKET_IN_FORMAT). The controller processes the packet-in,
possibly modifying some of its data, and sends it back to the switch with
an NXT_RESUME request, which causes flow table traversal to continue. In
principle, a single packet can be paused and resumed multiple times.
Another way to look at it is:
- "pause" is an extension of the existing OFPAT_CONTROLLER
action. It sends the packet to the controller, with full
pipeline context (some of which is switch implementation
dependent, and may thus vary from switch to switch).
- A continuation is an extension of OFPT_PACKET_IN, allowing for
implementation dependent metadata.
- NXT_RESUME is an extension of OFPT_PACKET_OUT, with the
semantics that the pipeline processing is continued with the
original translation context from where it was left at the time
it was paused.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Jarno Rajahalme <jarno@ovn.org>
2016-02-19 16:10:06 -08:00
|
|
|
|
|
|
|
|
|
enum ofperr ofputil_decode_packet_in_private(
|
|
|
|
|
const struct ofp_header *, bool loose,
|
2016-04-19 18:36:04 -07:00
|
|
|
|
const struct tun_table *,
|
Implement serializing the state of packet traversal in "continuations".
One purpose of OpenFlow packet-in messages is to allow a controller to
interpose on the path of a packet through the flow tables. If, for
example, the controller needs to modify a packet in some way that the
switch doesn't directly support, the controller should be able to
program the switch to send it the packet, then modify the packet and
send it back to the switch to continue through the flow table.
That's the theory. In practice, this doesn't work with any but the
simplest flow tables. Packet-in messages simply don't include enough
context to allow the flow table traversal to continue. For example:
* Via "resubmit" actions, an Open vSwitch packet can have an
effective "call stack", but a packet-in can't describe it, and
so it would be lost.
* A packet-in can't preserve the stack used by NXAST_PUSH and
NXAST_POP actions.
* A packet-in can't preserve the OpenFlow 1.1+ action set.
* A packet-in can't preserve the state of Open vSwitch mirroring
or connection tracking.
This commit introduces a solution called "continuations". A continuation
is the state of a packet's traversal through OpenFlow flow tables. A
"controller" action with the "pause" flag, which is newly implemented in
this commit, generates a continuation and sends it to the OpenFlow
controller in a packet-in asynchronous message (only NXT_PACKET_IN2
supports continuations, so the controller must configure them with
NXT_SET_PACKET_IN_FORMAT). The controller processes the packet-in,
possibly modifying some of its data, and sends it back to the switch with
an NXT_RESUME request, which causes flow table traversal to continue. In
principle, a single packet can be paused and resumed multiple times.
Another way to look at it is:
- "pause" is an extension of the existing OFPAT_CONTROLLER
action. It sends the packet to the controller, with full
pipeline context (some of which is switch implementation
dependent, and may thus vary from switch to switch).
- A continuation is an extension of OFPT_PACKET_IN, allowing for
implementation dependent metadata.
- NXT_RESUME is an extension of OFPT_PACKET_OUT, with the
semantics that the pipeline processing is continued with the
original translation context from where it was left at the time
it was paused.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Jarno Rajahalme <jarno@ovn.org>
2016-02-19 16:10:06 -08:00
|
|
|
|
struct ofputil_packet_in_private *,
|
|
|
|
|
size_t *total_len, uint32_t *buffer_id);
|
|
|
|
|
|
|
|
|
|
void ofputil_packet_in_private_destroy(struct ofputil_packet_in_private *);
|
|
|
|
|
|
2012-05-07 12:30:54 -07:00
|
|
|
|
/* Abstract packet-out message.
|
|
|
|
|
*
|
|
|
|
|
* ofputil_decode_packet_out() will ensure that 'in_port' is a physical port
|
|
|
|
|
* (OFPP_MAX or less) or one of OFPP_LOCAL, OFPP_NONE, or OFPP_CONTROLLER. */
|
2012-02-06 14:17:49 -08:00
|
|
|
|
struct ofputil_packet_out {
|
|
|
|
|
const void *packet; /* Packet data, if buffer_id == UINT32_MAX. */
|
|
|
|
|
size_t packet_len; /* Length of packet data in bytes. */
|
|
|
|
|
uint32_t buffer_id; /* Buffer id or UINT32_MAX if no buffer. */
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t in_port; /* Packet's input port. */
|
2012-07-03 22:17:14 -07:00
|
|
|
|
struct ofpact *ofpacts; /* Actions. */
|
|
|
|
|
size_t ofpacts_len; /* Size of ofpacts in bytes. */
|
2012-02-06 14:17:49 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum ofperr ofputil_decode_packet_out(struct ofputil_packet_out *,
|
2012-07-19 23:23:17 -07:00
|
|
|
|
const struct ofp_header *,
|
2012-07-03 22:17:14 -07:00
|
|
|
|
struct ofpbuf *ofpacts);
|
2012-08-08 12:19:57 +09:00
|
|
|
|
struct ofpbuf *ofputil_encode_packet_out(const struct ofputil_packet_out *,
|
|
|
|
|
enum ofputil_protocol protocol);
|
2012-02-06 14:17:49 -08:00
|
|
|
|
|
2015-12-21 15:39:10 -08:00
|
|
|
|
enum ofputil_frag_handling {
|
|
|
|
|
OFPUTIL_FRAG_NORMAL = OFPC_FRAG_NORMAL, /* No special handling. */
|
|
|
|
|
OFPUTIL_FRAG_DROP = OFPC_FRAG_DROP, /* Drop fragments. */
|
|
|
|
|
OFPUTIL_FRAG_REASM = OFPC_FRAG_REASM, /* Reassemble (if supported). */
|
|
|
|
|
OFPUTIL_FRAG_NX_MATCH = OFPC_FRAG_NX_MATCH /* Match on frag bits. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const char *ofputil_frag_handling_to_string(enum ofputil_frag_handling);
|
|
|
|
|
bool ofputil_frag_handling_from_string(const char *,
|
|
|
|
|
enum ofputil_frag_handling *);
|
|
|
|
|
|
|
|
|
|
/* Abstract struct ofp_switch_config. */
|
|
|
|
|
struct ofputil_switch_config {
|
|
|
|
|
/* Fragment handling. */
|
|
|
|
|
enum ofputil_frag_handling frag;
|
|
|
|
|
|
|
|
|
|
/* 0: Do not send packet to controller when decrementing invalid IP TTL.
|
|
|
|
|
* 1: Do send packet to controller when decrementing invalid IP TTL.
|
|
|
|
|
* -1: Unspecified (only OpenFlow 1.1 and 1.2 support this setting. */
|
|
|
|
|
int invalid_ttl_to_controller;
|
|
|
|
|
|
|
|
|
|
/* Maximum bytes of packet to send to controller on miss. */
|
|
|
|
|
uint16_t miss_send_len;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void ofputil_decode_get_config_reply(const struct ofp_header *,
|
|
|
|
|
struct ofputil_switch_config *);
|
|
|
|
|
struct ofpbuf *ofputil_encode_get_config_reply(
|
|
|
|
|
const struct ofp_header *request, const struct ofputil_switch_config *);
|
|
|
|
|
|
|
|
|
|
enum ofperr ofputil_decode_set_config(const struct ofp_header *,
|
|
|
|
|
struct ofputil_switch_config *);
|
|
|
|
|
struct ofpbuf *ofputil_encode_set_config(
|
|
|
|
|
const struct ofputil_switch_config *, enum ofp_version);
|
|
|
|
|
|
2012-02-15 16:33:04 -08:00
|
|
|
|
enum ofputil_port_config {
|
|
|
|
|
/* OpenFlow 1.0 and 1.1 share these values for these port config bits. */
|
|
|
|
|
OFPUTIL_PC_PORT_DOWN = 1 << 0, /* Port is administratively down. */
|
|
|
|
|
OFPUTIL_PC_NO_RECV = 1 << 2, /* Drop all packets received by port. */
|
|
|
|
|
OFPUTIL_PC_NO_FWD = 1 << 5, /* Drop packets forwarded to port. */
|
|
|
|
|
OFPUTIL_PC_NO_PACKET_IN = 1 << 6, /* No send packet-in msgs for port. */
|
|
|
|
|
/* OpenFlow 1.0 only. */
|
|
|
|
|
OFPUTIL_PC_NO_STP = 1 << 1, /* No 802.1D spanning tree for port. */
|
|
|
|
|
OFPUTIL_PC_NO_RECV_STP = 1 << 3, /* Drop received 802.1D STP packets. */
|
|
|
|
|
OFPUTIL_PC_NO_FLOOD = 1 << 4, /* Do not include port when flooding. */
|
|
|
|
|
/* There are no OpenFlow 1.1-only bits. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum ofputil_port_state {
|
|
|
|
|
/* OpenFlow 1.0 and 1.1 share this values for these port state bits. */
|
|
|
|
|
OFPUTIL_PS_LINK_DOWN = 1 << 0, /* No physical link present. */
|
|
|
|
|
/* OpenFlow 1.1 only. */
|
|
|
|
|
OFPUTIL_PS_BLOCKED = 1 << 1, /* Port is blocked */
|
|
|
|
|
OFPUTIL_PS_LIVE = 1 << 2, /* Live for Fast Failover Group. */
|
|
|
|
|
/* OpenFlow 1.0 only. */
|
|
|
|
|
OFPUTIL_PS_STP_LISTEN = 0 << 8, /* Not learning or relaying frames. */
|
|
|
|
|
OFPUTIL_PS_STP_LEARN = 1 << 8, /* Learning but not relaying frames. */
|
|
|
|
|
OFPUTIL_PS_STP_FORWARD = 2 << 8, /* Learning and relaying frames. */
|
|
|
|
|
OFPUTIL_PS_STP_BLOCK = 3 << 8, /* Not part of spanning tree. */
|
|
|
|
|
OFPUTIL_PS_STP_MASK = 3 << 8 /* Bit mask for OFPPS10_STP_* values. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Abstract ofp10_phy_port or ofp11_port. */
|
|
|
|
|
struct ofputil_phy_port {
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t port_no;
|
2015-08-28 14:55:11 -07:00
|
|
|
|
struct eth_addr hw_addr;
|
2012-02-15 16:33:04 -08:00
|
|
|
|
char name[OFP_MAX_PORT_NAME_LEN];
|
|
|
|
|
enum ofputil_port_config config;
|
|
|
|
|
enum ofputil_port_state state;
|
|
|
|
|
|
|
|
|
|
/* NETDEV_F_* feature bitmasks. */
|
|
|
|
|
enum netdev_features curr; /* Current features. */
|
|
|
|
|
enum netdev_features advertised; /* Features advertised by the port. */
|
|
|
|
|
enum netdev_features supported; /* Features supported by the port. */
|
|
|
|
|
enum netdev_features peer; /* Features advertised by peer. */
|
|
|
|
|
|
|
|
|
|
/* Speed. */
|
|
|
|
|
uint32_t curr_speed; /* Current speed, in kbps. */
|
|
|
|
|
uint32_t max_speed; /* Maximum supported speed, in kbps. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum ofputil_capabilities {
|
2012-11-27 17:44:22 +02:00
|
|
|
|
/* OpenFlow 1.0, 1.1, 1.2, and 1.3 share these capability values. */
|
2012-02-15 16:33:04 -08:00
|
|
|
|
OFPUTIL_C_FLOW_STATS = 1 << 0, /* Flow statistics. */
|
|
|
|
|
OFPUTIL_C_TABLE_STATS = 1 << 1, /* Table statistics. */
|
|
|
|
|
OFPUTIL_C_PORT_STATS = 1 << 2, /* Port statistics. */
|
|
|
|
|
OFPUTIL_C_IP_REASM = 1 << 5, /* Can reassemble IP fragments. */
|
|
|
|
|
OFPUTIL_C_QUEUE_STATS = 1 << 6, /* Queue statistics. */
|
2012-07-30 11:03:03 +09:00
|
|
|
|
|
|
|
|
|
/* OpenFlow 1.0 and 1.1 share this capability. */
|
2012-02-15 16:33:04 -08:00
|
|
|
|
OFPUTIL_C_ARP_MATCH_IP = 1 << 7, /* Match IP addresses in ARP pkts. */
|
|
|
|
|
|
|
|
|
|
/* OpenFlow 1.0 only. */
|
|
|
|
|
OFPUTIL_C_STP = 1 << 3, /* 802.1d spanning tree. */
|
|
|
|
|
|
2012-11-27 17:44:22 +02:00
|
|
|
|
/* OpenFlow 1.1, 1.2, and 1.3 share this capability. */
|
2012-02-15 16:33:04 -08:00
|
|
|
|
OFPUTIL_C_GROUP_STATS = 1 << 4, /* Group statistics. */
|
2012-07-30 11:03:03 +09:00
|
|
|
|
|
2012-11-27 17:44:22 +02:00
|
|
|
|
/* OpenFlow 1.2 and 1.3 share this capability */
|
2012-07-30 11:03:03 +09:00
|
|
|
|
OFPUTIL_C_PORT_BLOCKED = 1 << 8, /* Switch will block looping ports */
|
2012-02-15 16:33:04 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Abstract ofp_switch_features. */
|
|
|
|
|
struct ofputil_switch_features {
|
|
|
|
|
uint64_t datapath_id; /* Datapath unique ID. */
|
|
|
|
|
uint32_t 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; /* Identify auxiliary connections */
|
2012-02-15 16:33:04 -08:00
|
|
|
|
enum ofputil_capabilities capabilities;
|
2014-08-11 10:57:03 -07:00
|
|
|
|
uint64_t ofpacts; /* Bitmap of OFPACT_* bits. */
|
2012-02-15 16:33:04 -08:00
|
|
|
|
};
|
|
|
|
|
|
2016-01-20 16:33:13 -08:00
|
|
|
|
enum ofperr ofputil_pull_switch_features(struct ofpbuf *,
|
|
|
|
|
struct ofputil_switch_features *);
|
2012-02-15 16:33:04 -08:00
|
|
|
|
|
|
|
|
|
struct ofpbuf *ofputil_encode_switch_features(
|
|
|
|
|
const struct ofputil_switch_features *, enum ofputil_protocol,
|
|
|
|
|
ovs_be32 xid);
|
|
|
|
|
void ofputil_put_switch_features_port(const struct ofputil_phy_port *,
|
|
|
|
|
struct ofpbuf *);
|
2014-05-08 21:20:22 -07:00
|
|
|
|
bool ofputil_switch_features_has_ports(struct ofpbuf *b);
|
2012-02-15 16:33:04 -08:00
|
|
|
|
|
2012-05-04 14:42:04 -07:00
|
|
|
|
/* phy_port helper functions. */
|
2012-07-30 11:02:59 +09:00
|
|
|
|
int ofputil_pull_phy_port(enum ofp_version ofp_version, struct ofpbuf *,
|
2012-05-04 14:42:04 -07:00
|
|
|
|
struct ofputil_phy_port *);
|
|
|
|
|
|
2012-02-15 16:33:04 -08:00
|
|
|
|
/* Abstract ofp_port_status. */
|
|
|
|
|
struct ofputil_port_status {
|
|
|
|
|
enum ofp_port_reason reason;
|
|
|
|
|
struct ofputil_phy_port desc;
|
|
|
|
|
};
|
|
|
|
|
|
2012-07-19 23:23:17 -07:00
|
|
|
|
enum ofperr ofputil_decode_port_status(const struct ofp_header *,
|
2012-02-15 16:33:04 -08:00
|
|
|
|
struct ofputil_port_status *);
|
|
|
|
|
struct ofpbuf *ofputil_encode_port_status(const struct ofputil_port_status *,
|
|
|
|
|
enum ofputil_protocol);
|
|
|
|
|
|
|
|
|
|
/* Abstract ofp_port_mod. */
|
|
|
|
|
struct ofputil_port_mod {
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t port_no;
|
2015-08-28 14:55:11 -07:00
|
|
|
|
struct eth_addr hw_addr;
|
2012-02-15 16:33:04 -08:00
|
|
|
|
enum ofputil_port_config config;
|
|
|
|
|
enum ofputil_port_config mask;
|
|
|
|
|
enum netdev_features advertise;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum ofperr ofputil_decode_port_mod(const struct ofp_header *,
|
2014-05-09 08:57:31 -07:00
|
|
|
|
struct ofputil_port_mod *, bool loose);
|
2012-02-15 16:33:04 -08:00
|
|
|
|
struct ofpbuf *ofputil_encode_port_mod(const struct ofputil_port_mod *,
|
|
|
|
|
enum ofputil_protocol);
|
2012-02-15 14:23:38 -08:00
|
|
|
|
|
2014-08-11 11:31:45 -07:00
|
|
|
|
/* Abstract version of OFPTC11_TABLE_MISS_*.
|
|
|
|
|
*
|
|
|
|
|
* OpenFlow 1.0 always sends packets that miss to the next flow table, or to
|
|
|
|
|
* the controller if they miss in the last flow table.
|
|
|
|
|
*
|
|
|
|
|
* OpenFlow 1.1 and 1.2 can configure table miss behavior via a "table-mod"
|
|
|
|
|
* that specifies "send to controller", "miss", or "drop".
|
|
|
|
|
*
|
|
|
|
|
* OpenFlow 1.3 and later never sends packets that miss to the controller.
|
|
|
|
|
*/
|
|
|
|
|
enum ofputil_table_miss {
|
|
|
|
|
/* Protocol-specific default behavior. On OpenFlow 1.0 through 1.2
|
|
|
|
|
* connections, the packet is sent to the controller, and on OpenFlow 1.3
|
|
|
|
|
* and later connections, the packet is dropped.
|
|
|
|
|
*
|
|
|
|
|
* This is also used as a result of decoding OpenFlow 1.3+ "config" values
|
|
|
|
|
* in table-mods, to indicate that no table-miss was specified. */
|
|
|
|
|
OFPUTIL_TABLE_MISS_DEFAULT, /* Protocol default behavior. */
|
|
|
|
|
|
|
|
|
|
/* These constants have the same meanings as those in OpenFlow with the
|
|
|
|
|
* same names. */
|
|
|
|
|
OFPUTIL_TABLE_MISS_CONTROLLER, /* Send to controller. */
|
|
|
|
|
OFPUTIL_TABLE_MISS_CONTINUE, /* Go to next table. */
|
|
|
|
|
OFPUTIL_TABLE_MISS_DROP, /* Drop the packet. */
|
|
|
|
|
};
|
|
|
|
|
|
2015-07-02 20:33:08 -07:00
|
|
|
|
/* Abstract version of OFPTC14_EVICTION.
|
|
|
|
|
*
|
|
|
|
|
* OpenFlow 1.0 through 1.3 don't know anything about eviction, so decoding a
|
|
|
|
|
* message for one of these protocols always yields
|
|
|
|
|
* OFPUTIL_TABLE_EVICTION_DEFAULT. */
|
|
|
|
|
enum ofputil_table_eviction {
|
|
|
|
|
OFPUTIL_TABLE_EVICTION_DEFAULT, /* No value. */
|
|
|
|
|
OFPUTIL_TABLE_EVICTION_ON, /* Enable eviction. */
|
|
|
|
|
OFPUTIL_TABLE_EVICTION_OFF /* Disable eviction. */
|
|
|
|
|
};
|
2014-08-11 11:31:45 -07:00
|
|
|
|
|
2015-11-24 17:49:42 +05:30
|
|
|
|
/* Abstract version of OFPTC14_VACANCY_EVENTS.
|
|
|
|
|
*
|
|
|
|
|
* OpenFlow 1.0 through 1.3 don't know anything about vacancy events, so
|
|
|
|
|
* decoding a message for one of these protocols always yields
|
|
|
|
|
* OFPUTIL_TABLE_VACANCY_DEFAULT. */
|
|
|
|
|
enum ofputil_table_vacancy {
|
|
|
|
|
OFPUTIL_TABLE_VACANCY_DEFAULT, /* No value. */
|
|
|
|
|
OFPUTIL_TABLE_VACANCY_ON, /* Enable vacancy events. */
|
|
|
|
|
OFPUTIL_TABLE_VACANCY_OFF /* Disable vacancy events. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Abstract version of OFPTMPT_VACANCY.
|
|
|
|
|
*
|
|
|
|
|
* Openflow 1.4+ defines vacancy events.
|
|
|
|
|
* The fields vacancy_down and vacancy_up are the threshold for generating
|
|
|
|
|
* vacancy events that should be configured on the flow table, expressed as
|
|
|
|
|
* a percent.
|
|
|
|
|
* The vacancy field is only used when this property in included in a
|
|
|
|
|
* OFPMP_TABLE_DESC multipart reply or a OFPT_TABLE_STATUS message and
|
|
|
|
|
* represent the current vacancy of the table, expressed as a percent. In
|
|
|
|
|
* OFP_TABLE_MOD requests, this field must be set to 0 */
|
|
|
|
|
struct ofputil_table_mod_prop_vacancy {
|
|
|
|
|
uint8_t vacancy_down; /* Vacancy threshold when space decreases (%). */
|
|
|
|
|
uint8_t vacancy_up; /* Vacancy threshold when space increases (%). */
|
|
|
|
|
uint8_t vacancy; /* Current vacancy (%). */
|
|
|
|
|
};
|
|
|
|
|
|
2013-09-07 03:02:32 -07:00
|
|
|
|
/* Abstract ofp_table_mod. */
|
|
|
|
|
struct ofputil_table_mod {
|
|
|
|
|
uint8_t table_id; /* ID of the table, 0xff indicates all tables. */
|
2015-07-02 20:33:08 -07:00
|
|
|
|
|
|
|
|
|
/* OpenFlow 1.1 and 1.2 only. For other versions, ignored on encoding,
|
|
|
|
|
* decoded to OFPUTIL_TABLE_MISS_DEFAULT. */
|
|
|
|
|
enum ofputil_table_miss miss;
|
|
|
|
|
|
|
|
|
|
/* OpenFlow 1.4+ only. For other versions, ignored on encoding, decoded to
|
|
|
|
|
* OFPUTIL_TABLE_EVICTION_DEFAULT. */
|
|
|
|
|
enum ofputil_table_eviction eviction;
|
|
|
|
|
|
|
|
|
|
/* OpenFlow 1.4+ only and optional even there; UINT32_MAX indicates
|
|
|
|
|
* absence. For other versions, ignored on encoding, decoded to
|
|
|
|
|
* UINT32_MAX.*/
|
|
|
|
|
uint32_t eviction_flags; /* OFPTMPEF14_*. */
|
2015-11-24 17:49:42 +05:30
|
|
|
|
|
|
|
|
|
/* OpenFlow 1.4+ only. For other versions, ignored on encoding, decoded to
|
|
|
|
|
* OFPUTIL_TABLE_VACANCY_DEFAULT. */
|
|
|
|
|
enum ofputil_table_vacancy vacancy;
|
|
|
|
|
|
|
|
|
|
/* Openflow 1.4+ only. Defines threshold values of vacancy expressed as
|
|
|
|
|
* percent, value of current vacancy is set to zero for table-mod.
|
|
|
|
|
* For other versions, ignored on encoding, all values decoded to
|
|
|
|
|
* zero. */
|
|
|
|
|
struct ofputil_table_mod_prop_vacancy table_vacancy;
|
2013-09-07 03:02:32 -07:00
|
|
|
|
};
|
|
|
|
|
|
2015-07-02 20:35:44 -07:00
|
|
|
|
/* Abstract ofp14_table_desc. */
|
|
|
|
|
struct ofputil_table_desc {
|
|
|
|
|
uint8_t table_id; /* ID of the table. */
|
|
|
|
|
enum ofputil_table_eviction eviction;
|
|
|
|
|
uint32_t eviction_flags; /* UINT32_MAX if not present. */
|
2015-11-24 17:49:42 +05:30
|
|
|
|
enum ofputil_table_vacancy vacancy;
|
|
|
|
|
struct ofputil_table_mod_prop_vacancy table_vacancy;
|
2015-07-02 20:35:44 -07:00
|
|
|
|
};
|
|
|
|
|
|
2013-09-07 03:02:32 -07:00
|
|
|
|
enum ofperr ofputil_decode_table_mod(const struct ofp_header *,
|
|
|
|
|
struct ofputil_table_mod *);
|
|
|
|
|
struct ofpbuf *ofputil_encode_table_mod(const struct ofputil_table_mod *,
|
|
|
|
|
enum ofputil_protocol);
|
|
|
|
|
|
2015-07-02 20:33:08 -07:00
|
|
|
|
/* Abstract ofp_table_features.
|
|
|
|
|
*
|
|
|
|
|
* This is used for all versions of OpenFlow, even though ofp_table_features
|
|
|
|
|
* was only introduced in OpenFlow 1.3, because earlier versions of OpenFlow
|
|
|
|
|
* include support for a subset of ofp_table_features through OFPST_TABLE (aka
|
|
|
|
|
* OFPMP_TABLE). */
|
2014-03-23 23:20:04 -07:00
|
|
|
|
struct ofputil_table_features {
|
|
|
|
|
uint8_t table_id; /* Identifier of table. Lower numbered tables
|
|
|
|
|
are consulted first. */
|
|
|
|
|
char name[OFP_MAX_TABLE_NAME_LEN];
|
|
|
|
|
ovs_be64 metadata_match; /* Bits of metadata table can match. */
|
|
|
|
|
ovs_be64 metadata_write; /* Bits of metadata table can write. */
|
|
|
|
|
uint32_t max_entries; /* Max number of entries supported. */
|
|
|
|
|
|
2015-07-02 20:33:08 -07:00
|
|
|
|
/* Flags.
|
|
|
|
|
*
|
|
|
|
|
* 'miss_config' is relevant for OpenFlow 1.1 and 1.2 only, because those
|
|
|
|
|
* versions include OFPTC_MISS_* flags in OFPST_TABLE. For other versions,
|
|
|
|
|
* it is decoded to OFPUTIL_TABLE_MISS_DEFAULT and ignored for encoding.
|
|
|
|
|
*
|
|
|
|
|
* 'supports_eviction' and 'supports_vacancy_events' are relevant only for
|
|
|
|
|
* OpenFlow 1.4 and later only. For OF1.4, they are boolean: 1 if
|
|
|
|
|
* supported, otherwise 0. For other versions, they are decoded as -1 and
|
|
|
|
|
* ignored for encoding.
|
|
|
|
|
*
|
2016-10-30 13:15:38 +00:00
|
|
|
|
* See the section "OFPTC_* Table Configuration" in DESIGN.rst for more
|
2015-07-02 20:33:08 -07:00
|
|
|
|
* details of how OpenFlow has changed in this area.
|
|
|
|
|
*/
|
|
|
|
|
enum ofputil_table_miss miss_config; /* OF1.1 and 1.2 only. */
|
|
|
|
|
int supports_eviction; /* OF1.4+ only. */
|
|
|
|
|
int supports_vacancy_events; /* OF1.4+ only. */
|
|
|
|
|
|
2014-03-23 23:20:04 -07:00
|
|
|
|
/* Table features related to instructions. There are two instances:
|
|
|
|
|
*
|
|
|
|
|
* - 'miss' reports features available in the table miss flow.
|
|
|
|
|
*
|
|
|
|
|
* - 'nonmiss' reports features available in other flows. */
|
|
|
|
|
struct ofputil_table_instruction_features {
|
|
|
|
|
/* Tables that "goto-table" may jump to. */
|
|
|
|
|
unsigned long int next[BITMAP_N_LONGS(255)];
|
|
|
|
|
|
|
|
|
|
/* Bitmap of OVSINST_* for supported instructions. */
|
|
|
|
|
uint32_t instructions;
|
|
|
|
|
|
|
|
|
|
/* Table features related to actions. There are two instances:
|
|
|
|
|
*
|
|
|
|
|
* - 'write' reports features available in a "write_actions"
|
|
|
|
|
* instruction.
|
|
|
|
|
*
|
|
|
|
|
* - 'apply' reports features available in an "apply_actions"
|
|
|
|
|
* instruction. */
|
|
|
|
|
struct ofputil_table_action_features {
|
2014-08-11 10:57:03 -07:00
|
|
|
|
uint64_t ofpacts; /* Bitmap of supported OFPACT_*. */
|
2014-07-26 12:15:26 -07:00
|
|
|
|
struct mf_bitmap set_fields; /* Fields for "set-field". */
|
2014-03-23 23:20:04 -07:00
|
|
|
|
} write, apply;
|
|
|
|
|
} nonmiss, miss;
|
|
|
|
|
|
|
|
|
|
/* MFF_* bitmaps.
|
|
|
|
|
*
|
|
|
|
|
* For any given field the following combinations are valid:
|
|
|
|
|
*
|
|
|
|
|
* - match=0, wildcard=0, mask=0: Flows in this table cannot match on
|
|
|
|
|
* this field.
|
|
|
|
|
*
|
|
|
|
|
* - match=1, wildcard=0, mask=0: Flows in this table must match on all
|
|
|
|
|
* the bits in this field.
|
|
|
|
|
*
|
|
|
|
|
* - match=1, wildcard=1, mask=0: Flows in this table must either match
|
|
|
|
|
* on all the bits in the field or wildcard the field entirely.
|
|
|
|
|
*
|
|
|
|
|
* - match=1, wildcard=1, mask=1: Flows in this table may arbitrarily
|
|
|
|
|
* mask this field (as special cases, they may match on all the bits
|
|
|
|
|
* or wildcard it entirely).
|
|
|
|
|
*
|
|
|
|
|
* Other combinations do not make sense.
|
|
|
|
|
*/
|
2014-07-26 12:15:26 -07:00
|
|
|
|
struct mf_bitmap match; /* Fields that may be matched. */
|
|
|
|
|
struct mf_bitmap mask; /* Subset of 'match' that may have masks. */
|
|
|
|
|
struct mf_bitmap wildcard; /* Subset of 'match' that may be wildcarded. */
|
2014-03-23 23:20:04 -07:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int ofputil_decode_table_features(struct ofpbuf *,
|
|
|
|
|
struct ofputil_table_features *, bool loose);
|
2015-07-02 20:35:44 -07:00
|
|
|
|
|
|
|
|
|
int ofputil_decode_table_desc(struct ofpbuf *,
|
|
|
|
|
struct ofputil_table_desc *,
|
|
|
|
|
enum ofp_version);
|
|
|
|
|
|
2014-08-11 12:42:35 -07:00
|
|
|
|
struct ofpbuf *ofputil_encode_table_features_request(enum ofp_version);
|
|
|
|
|
|
2015-07-02 20:35:44 -07:00
|
|
|
|
struct ofpbuf *ofputil_encode_table_desc_request(enum ofp_version);
|
|
|
|
|
|
2014-03-23 23:20:04 -07:00
|
|
|
|
void ofputil_append_table_features_reply(
|
2014-12-15 14:10:38 +01:00
|
|
|
|
const struct ofputil_table_features *tf, struct ovs_list *replies);
|
2014-03-23 23:20:04 -07:00
|
|
|
|
|
2015-07-02 20:35:44 -07:00
|
|
|
|
void ofputil_append_table_desc_reply(const struct ofputil_table_desc *td,
|
|
|
|
|
struct ovs_list *replies,
|
|
|
|
|
enum ofp_version);
|
|
|
|
|
|
2013-06-27 12:10:42 +03:00
|
|
|
|
/* Meter band configuration for all supported band types. */
|
2013-06-20 17:26:18 +03:00
|
|
|
|
struct ofputil_meter_band {
|
|
|
|
|
uint16_t type;
|
2013-06-27 12:10:42 +03:00
|
|
|
|
uint8_t prec_level; /* Non-zero if type == OFPMBT_DSCP_REMARK. */
|
2013-06-20 17:26:18 +03:00
|
|
|
|
uint32_t rate;
|
|
|
|
|
uint32_t burst_size;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ofputil_meter_band_stats {
|
|
|
|
|
uint64_t packet_count;
|
|
|
|
|
uint64_t byte_count;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ofputil_meter_config {
|
|
|
|
|
uint32_t meter_id;
|
|
|
|
|
uint16_t flags;
|
|
|
|
|
uint16_t n_bands;
|
|
|
|
|
struct ofputil_meter_band *bands;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Abstract ofp_meter_mod. */
|
|
|
|
|
struct ofputil_meter_mod {
|
|
|
|
|
uint16_t command;
|
|
|
|
|
struct ofputil_meter_config meter;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ofputil_meter_stats {
|
|
|
|
|
uint32_t meter_id;
|
|
|
|
|
uint32_t flow_count;
|
|
|
|
|
uint64_t packet_in_count;
|
|
|
|
|
uint64_t byte_in_count;
|
|
|
|
|
uint32_t duration_sec;
|
|
|
|
|
uint32_t duration_nsec;
|
|
|
|
|
uint16_t n_bands;
|
2013-06-27 12:10:42 +03:00
|
|
|
|
struct ofputil_meter_band_stats *bands;
|
2013-06-20 17:26:18 +03:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ofputil_meter_features {
|
2013-06-27 12:10:42 +03:00
|
|
|
|
uint32_t max_meters; /* Maximum number of meters. */
|
|
|
|
|
uint32_t band_types; /* Can support max 32 band types. */
|
|
|
|
|
uint32_t capabilities; /* Supported flags. */
|
2013-06-20 17:26:18 +03:00
|
|
|
|
uint8_t max_bands;
|
|
|
|
|
uint8_t max_color;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum ofperr ofputil_decode_meter_mod(const struct ofp_header *,
|
|
|
|
|
struct ofputil_meter_mod *,
|
2013-06-27 12:10:42 +03:00
|
|
|
|
struct ofpbuf *bands);
|
|
|
|
|
struct ofpbuf *ofputil_encode_meter_mod(enum ofp_version,
|
2013-06-20 17:26:18 +03:00
|
|
|
|
const struct ofputil_meter_mod *);
|
|
|
|
|
|
|
|
|
|
void ofputil_decode_meter_features(const struct ofp_header *,
|
|
|
|
|
struct ofputil_meter_features *);
|
|
|
|
|
struct ofpbuf *ofputil_encode_meter_features_reply(const struct
|
|
|
|
|
ofputil_meter_features *,
|
|
|
|
|
const struct ofp_header *
|
|
|
|
|
request);
|
|
|
|
|
void ofputil_decode_meter_request(const struct ofp_header *,
|
|
|
|
|
uint32_t *meter_id);
|
|
|
|
|
|
2014-12-15 14:10:38 +01:00
|
|
|
|
void ofputil_append_meter_config(struct ovs_list *replies,
|
2013-06-27 12:10:42 +03:00
|
|
|
|
const struct ofputil_meter_config *);
|
2013-06-20 17:26:18 +03:00
|
|
|
|
|
2014-12-15 14:10:38 +01:00
|
|
|
|
void ofputil_append_meter_stats(struct ovs_list *replies,
|
2013-06-27 12:10:42 +03:00
|
|
|
|
const struct ofputil_meter_stats *);
|
2013-06-20 17:26:18 +03:00
|
|
|
|
|
|
|
|
|
enum ofputil_meter_request_type {
|
|
|
|
|
OFPUTIL_METER_FEATURES,
|
|
|
|
|
OFPUTIL_METER_CONFIG,
|
|
|
|
|
OFPUTIL_METER_STATS
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ofpbuf *ofputil_encode_meter_request(enum ofp_version,
|
|
|
|
|
enum ofputil_meter_request_type,
|
|
|
|
|
uint32_t meter_id);
|
|
|
|
|
|
2013-06-27 12:10:42 +03:00
|
|
|
|
int ofputil_decode_meter_stats(struct ofpbuf *,
|
|
|
|
|
struct ofputil_meter_stats *,
|
2013-06-20 17:26:18 +03:00
|
|
|
|
struct ofpbuf *bands);
|
|
|
|
|
|
2013-06-27 12:10:42 +03:00
|
|
|
|
int ofputil_decode_meter_config(struct ofpbuf *,
|
|
|
|
|
struct ofputil_meter_config *,
|
2013-06-20 17:26:18 +03:00
|
|
|
|
struct ofpbuf *bands);
|
|
|
|
|
|
2013-06-27 12:10:42 +03:00
|
|
|
|
/* Type for meter_id in ofproto provider interface, UINT32_MAX if invalid. */
|
2013-06-20 17:26:18 +03:00
|
|
|
|
typedef struct { uint32_t uint32; } ofproto_meter_id;
|
|
|
|
|
|
2012-12-28 18:28:49 +02:00
|
|
|
|
/* Abstract ofp_role_request and reply. */
|
|
|
|
|
struct ofputil_role_request {
|
2013-02-11 23:55:31 -08:00
|
|
|
|
enum ofp12_controller_role role;
|
2012-12-28 18:28:49 +02:00
|
|
|
|
bool have_generation_id;
|
|
|
|
|
uint64_t generation_id;
|
|
|
|
|
};
|
|
|
|
|
|
2013-10-22 11:40:03 +03:00
|
|
|
|
struct ofputil_role_status {
|
|
|
|
|
enum ofp12_controller_role role;
|
|
|
|
|
enum ofp14_controller_role_reason reason;
|
|
|
|
|
uint64_t generation_id;
|
|
|
|
|
};
|
|
|
|
|
|
2012-12-28 18:28:49 +02:00
|
|
|
|
enum ofperr ofputil_decode_role_message(const struct ofp_header *,
|
|
|
|
|
struct ofputil_role_request *);
|
|
|
|
|
struct ofpbuf *ofputil_encode_role_reply(const struct ofp_header *,
|
2013-02-11 23:55:31 -08:00
|
|
|
|
const struct ofputil_role_request *);
|
2012-12-28 18:28:49 +02:00
|
|
|
|
|
2013-10-22 11:40:03 +03:00
|
|
|
|
struct ofpbuf *ofputil_encode_role_status(
|
|
|
|
|
const struct ofputil_role_status *status,
|
|
|
|
|
enum ofputil_protocol protocol);
|
|
|
|
|
|
|
|
|
|
enum ofperr ofputil_decode_role_status(const struct ofp_header *oh,
|
|
|
|
|
struct ofputil_role_status *rs);
|
2014-08-11 10:57:03 -07:00
|
|
|
|
|
2014-08-11 11:31:45 -07:00
|
|
|
|
/* Abstract table stats.
|
|
|
|
|
*
|
|
|
|
|
* This corresponds to the OpenFlow 1.3 table statistics structure, which only
|
|
|
|
|
* includes actual statistics. In earlier versions of OpenFlow, several
|
|
|
|
|
* members describe table features, so this structure has to be paired with
|
|
|
|
|
* struct ofputil_table_features to get all information. */
|
|
|
|
|
struct ofputil_table_stats {
|
|
|
|
|
uint8_t table_id; /* Identifier of table. */
|
2014-08-11 10:57:03 -07:00
|
|
|
|
uint32_t active_count; /* Number of active entries. */
|
|
|
|
|
uint64_t lookup_count; /* Number of packets looked up in table. */
|
|
|
|
|
uint64_t matched_count; /* Number of packets that hit table. */
|
|
|
|
|
};
|
2012-09-11 21:47:27 -07:00
|
|
|
|
|
2014-08-11 11:31:45 -07:00
|
|
|
|
struct ofpbuf *ofputil_encode_table_stats_reply(const struct ofp_header *rq);
|
2015-07-02 20:35:44 -07:00
|
|
|
|
|
|
|
|
|
struct ofpbuf *ofputil_encode_table_desc_reply(const struct ofp_header *rq);
|
|
|
|
|
|
2014-08-11 11:31:45 -07:00
|
|
|
|
void ofputil_append_table_stats_reply(struct ofpbuf *reply,
|
|
|
|
|
const struct ofputil_table_stats *,
|
|
|
|
|
const struct ofputil_table_features *);
|
|
|
|
|
|
|
|
|
|
int ofputil_decode_table_stats_reply(struct ofpbuf *reply,
|
|
|
|
|
struct ofputil_table_stats *,
|
|
|
|
|
struct ofputil_table_features *);
|
2012-09-11 21:47:27 -07:00
|
|
|
|
|
2013-10-24 15:54:03 -07:00
|
|
|
|
/* Queue configuration request. */
|
|
|
|
|
struct ofpbuf *ofputil_encode_queue_get_config_request(enum ofp_version,
|
2016-01-18 16:00:05 -08:00
|
|
|
|
ofp_port_t port,
|
|
|
|
|
uint32_t queue);
|
2013-10-24 15:54:03 -07:00
|
|
|
|
enum ofperr ofputil_decode_queue_get_config_request(const struct ofp_header *,
|
2016-01-18 16:00:05 -08:00
|
|
|
|
ofp_port_t *port,
|
|
|
|
|
uint32_t *queue);
|
2013-10-24 15:54:03 -07:00
|
|
|
|
|
|
|
|
|
/* Queue configuration reply. */
|
|
|
|
|
struct ofputil_queue_config {
|
2016-01-07 08:57:44 -08:00
|
|
|
|
ofp_port_t port;
|
2016-01-18 16:00:05 -08:00
|
|
|
|
uint32_t queue;
|
2013-10-24 15:54:03 -07:00
|
|
|
|
|
|
|
|
|
/* Each of these optional values is expressed in tenths of a percent.
|
|
|
|
|
* Values greater than 1000 indicate that the feature is disabled.
|
|
|
|
|
* UINT16_MAX indicates that the value is omitted. */
|
|
|
|
|
uint16_t min_rate;
|
|
|
|
|
uint16_t max_rate;
|
|
|
|
|
};
|
|
|
|
|
|
2016-01-18 16:00:05 -08:00
|
|
|
|
void ofputil_start_queue_get_config_reply(const struct ofp_header *request,
|
|
|
|
|
struct ovs_list *replies);
|
2013-10-24 15:54:03 -07:00
|
|
|
|
void ofputil_append_queue_get_config_reply(
|
2016-01-18 16:00:05 -08:00
|
|
|
|
const struct ofputil_queue_config *, struct ovs_list *replies);
|
2013-10-24 15:54:03 -07:00
|
|
|
|
|
|
|
|
|
int ofputil_pull_queue_get_config_reply(struct ofpbuf *reply,
|
|
|
|
|
struct ofputil_queue_config *);
|
|
|
|
|
|
|
|
|
|
|
2012-07-12 14:18:05 -07:00
|
|
|
|
/* Abstract nx_flow_monitor_request. */
|
|
|
|
|
struct ofputil_flow_monitor_request {
|
|
|
|
|
uint32_t id;
|
|
|
|
|
enum nx_flow_monitor_flags flags;
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t out_port;
|
2012-07-12 14:18:05 -07:00
|
|
|
|
uint8_t table_id;
|
2012-08-07 15:28:18 -07:00
|
|
|
|
struct match match;
|
2012-07-12 14:18:05 -07:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int ofputil_decode_flow_monitor_request(struct ofputil_flow_monitor_request *,
|
|
|
|
|
struct ofpbuf *msg);
|
|
|
|
|
void ofputil_append_flow_monitor_request(
|
|
|
|
|
const struct ofputil_flow_monitor_request *, struct ofpbuf *msg);
|
|
|
|
|
|
|
|
|
|
/* Abstract nx_flow_update. */
|
|
|
|
|
struct ofputil_flow_update {
|
|
|
|
|
enum nx_flow_update_event event;
|
|
|
|
|
|
|
|
|
|
/* Used only for NXFME_ADDED, NXFME_DELETED, NXFME_MODIFIED. */
|
|
|
|
|
enum ofp_flow_removed_reason reason;
|
|
|
|
|
uint16_t idle_timeout;
|
|
|
|
|
uint16_t hard_timeout;
|
|
|
|
|
uint8_t table_id;
|
2013-12-13 14:17:13 +01:00
|
|
|
|
uint16_t priority;
|
2012-07-12 14:18:05 -07:00
|
|
|
|
ovs_be64 cookie;
|
2012-08-07 15:28:18 -07:00
|
|
|
|
struct match *match;
|
2014-04-29 15:50:38 -07:00
|
|
|
|
const struct ofpact *ofpacts;
|
2012-07-12 14:18:05 -07:00
|
|
|
|
size_t ofpacts_len;
|
|
|
|
|
|
|
|
|
|
/* Used only for NXFME_ABBREV. */
|
|
|
|
|
ovs_be32 xid;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int ofputil_decode_flow_update(struct ofputil_flow_update *,
|
|
|
|
|
struct ofpbuf *msg, struct ofpbuf *ofpacts);
|
2014-12-15 14:10:38 +01:00
|
|
|
|
void ofputil_start_flow_update(struct ovs_list *replies);
|
2012-07-12 14:18:05 -07:00
|
|
|
|
void ofputil_append_flow_update(const struct ofputil_flow_update *,
|
2014-12-15 14:10:38 +01:00
|
|
|
|
struct ovs_list *replies);
|
2012-07-12 14:18:05 -07:00
|
|
|
|
|
|
|
|
|
/* Abstract nx_flow_monitor_cancel. */
|
|
|
|
|
uint32_t ofputil_decode_flow_monitor_cancel(const struct ofp_header *);
|
|
|
|
|
struct ofpbuf *ofputil_encode_flow_monitor_cancel(uint32_t id);
|
|
|
|
|
|
2014-05-07 23:18:46 -07:00
|
|
|
|
/* Port desc stats requests and replies. */
|
|
|
|
|
enum ofperr ofputil_decode_port_desc_stats_request(const struct ofp_header *,
|
|
|
|
|
ofp_port_t *portp);
|
|
|
|
|
struct ofpbuf *ofputil_encode_port_desc_stats_request(
|
|
|
|
|
enum ofp_version ofp_version, ofp_port_t);
|
|
|
|
|
|
2014-05-07 15:11:28 -07:00
|
|
|
|
void ofputil_append_port_desc_stats_reply(const struct ofputil_phy_port *pp,
|
2014-12-15 14:10:38 +01:00
|
|
|
|
struct ovs_list *replies);
|
2012-05-04 14:42:04 -07:00
|
|
|
|
|
2012-07-19 23:23:17 -07:00
|
|
|
|
/* Encoding simple OpenFlow messages. */
|
2012-08-01 16:01:50 +09:00
|
|
|
|
struct ofpbuf *make_echo_request(enum ofp_version);
|
2010-05-27 13:14:05 -07:00
|
|
|
|
struct ofpbuf *make_echo_reply(const struct ofp_header *rq);
|
Implement new fragment handling policy.
Until now, OVS has handled IP fragments more awkwardly than necessary. It
has not been possible to match on L4 headers, even in fragments with offset
0 where they are actually present. This means that there was no way to
implement ACLs that treat, say, different TCP ports differently, on
fragmented traffic; instead, all decisions for fragment forwarding had to
be made on the basis of L2 and L3 headers alone.
This commit improves the situation significantly. It is still not possible
to match on L4 headers in fragments with nonzero offset, because that
information is simply not present in such fragments, but this commit adds
the ability to match on L4 headers for fragments with zero offset. This
means that it becomes possible to implement ACLs that drop such "first
fragments" on the basis of L4 headers. In practice, that effectively
blocks even fragmented traffic on an L4 basis, because the receiving IP
stack cannot reassemble a full packet when the first fragment is missing.
This commit works by adding a new "fragment type" to the kernel flow match
and making it available through OpenFlow as a new NXM field named
NXM_NX_IP_FRAG. Because OpenFlow 1.0 explicitly says that the L4 fields
are always 0 for IP fragments, it adds a new OpenFlow fragment handling
mode that fills in the L4 fields for "first fragments". It also enhances
ovs-ofctl to allow users to configure this new fragment handling mode and
to parse the new field.
Signed-off-by: Ben Pfaff <blp@nicira.com>
Bug #7557.
2011-10-19 21:33:44 -07:00
|
|
|
|
|
2012-08-01 16:01:47 +09:00
|
|
|
|
struct ofpbuf *ofputil_encode_barrier_request(enum ofp_version);
|
2010-12-07 16:57:12 -08:00
|
|
|
|
|
|
|
|
|
/* Actions. */
|
|
|
|
|
|
2011-03-29 14:42:20 -07:00
|
|
|
|
bool action_outputs_to_port(const union ofp_action *, ovs_be16 port);
|
2010-11-08 10:43:19 -08:00
|
|
|
|
|
2012-01-12 15:48:19 -08:00
|
|
|
|
enum ofperr ofputil_pull_actions(struct ofpbuf *, unsigned int actions_len,
|
|
|
|
|
union ofp_action **, size_t *);
|
2011-05-26 16:49:10 -07:00
|
|
|
|
|
|
|
|
|
bool ofputil_actions_equal(const union ofp_action *a, size_t n_a,
|
|
|
|
|
const union ofp_action *b, size_t n_b);
|
|
|
|
|
union ofp_action *ofputil_actions_clone(const union ofp_action *, size_t n);
|
2010-08-20 10:29:03 -07:00
|
|
|
|
|
2011-08-17 13:39:02 -07:00
|
|
|
|
/* Handy utility for parsing flows and actions. */
|
|
|
|
|
bool ofputil_parse_key_value(char **stringp, char **keyp, char **valuep);
|
|
|
|
|
|
2012-10-06 19:39:49 +09:00
|
|
|
|
struct ofputil_port_stats {
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t port_no;
|
2012-10-06 19:39:49 +09:00
|
|
|
|
struct netdev_stats stats;
|
2013-05-30 12:49:59 -07:00
|
|
|
|
uint32_t duration_sec; /* UINT32_MAX if unknown. */
|
|
|
|
|
uint32_t duration_nsec;
|
2012-10-06 19:39:49 +09:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ofpbuf *ofputil_encode_dump_ports_request(enum ofp_version ofp_version,
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t port);
|
2014-12-15 14:10:38 +01:00
|
|
|
|
void ofputil_append_port_stat(struct ovs_list *replies,
|
2012-10-06 19:39:49 +09:00
|
|
|
|
const struct ofputil_port_stats *ops);
|
|
|
|
|
size_t ofputil_count_port_stats(const struct ofp_header *);
|
|
|
|
|
int ofputil_decode_port_stats(struct ofputil_port_stats *, struct ofpbuf *msg);
|
|
|
|
|
enum ofperr ofputil_decode_port_stats_request(const struct ofp_header *request,
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t *ofp10_port);
|
2012-10-12 13:03:04 +09:00
|
|
|
|
|
ipfix: Add support for exporting ipfix statistics.
It is meaningful for user to check the stats of IPFIX.
Using IPFIX stats, user can know how much flows the system
can support. It is also can be used for performance check
of IPFIX.
IPFIX stats is added for per IPFIX exporter. If bridge IPFIX is
enabled on the bridge, the whole bridge will have one exporter.
For flow IPFIX, the system keeps per id (column in
Flow_Sample_Collector_Set) per exporter.
1) Add 'ovs-ofctl dump-ipfix-bridge SWITCH' to export IPFIX stats of
the bridge which enable bridge IPFIX. The output format:
NXST_IPFIX_BRIDGE reply (xid=0x2):
bridge ipfix: flows=0, current flows=0, sampled pkts=0, \
ipv4 ok=0, ipv6 ok=0, tx pkts=0
pkts errs=0, ipv4 errs=0, ipv6 errs=0, tx errs=0
2) Add 'ovs-ofctl dump-ipfix-flow SWITCH' to export IPFIX stats of
the bridge which enable flow IPFIX. The output format:
NXST_IPFIX_FLOW reply (xid=0x2): 2 ids
id 1: flows=4, current flows=4, sampled pkts=14, ipv4 ok=13, \
ipv6 ok=0, tx pkts=0
pkts errs=0, ipv4 errs=0, ipv6 errs=0, tx errs=0
id 2: flows=0, current flows=0, sampled pkts=0, ipv4 ok=0, \
ipv6 ok=0, tx pkts=0
pkts errs=0, ipv4 errs=0, ipv6 errs=0, tx errs=0
flows: the number of total flow records, including those exported.
current flows: the number of current flow records cached.
sampled pkts: Successfully sampled packet count.
ipv4 ok: successfully sampled IPv4 flow packet count.
ipv6 ok: Successfully sampled IPv6 flow packet count.
tx pkts: the count of IPFIX exported packets sent to the collector(s).
pkts errs: count of packets failed when sampling, maybe not supported or other error.
ipv4 errs: Count of IPV4 flow packet in the error packets.
ipv6 errs: Count of IPV6 flow packet in the error packets.
tx errs: the count of IPFIX exported packets failed when sending to the collector(s).
Signed-off-by: Benli Ye <daniely@vmware.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
2016-06-13 14:44:09 -07:00
|
|
|
|
struct ofputil_ipfix_stats {
|
|
|
|
|
uint32_t collector_set_id; /* Used only for flow-based IPFIX statistics. */
|
|
|
|
|
uint64_t total_flows; /* Totabl flows of this IPFIX exporter. */
|
|
|
|
|
uint64_t current_flows; /* Current flows of this IPFIX exporter. */
|
|
|
|
|
uint64_t pkts; /* Successfully sampled packets. */
|
|
|
|
|
uint64_t ipv4_pkts; /* Successfully sampled IPV4 packets. */
|
|
|
|
|
uint64_t ipv6_pkts; /* Successfully sampled IPV6 packets. */
|
|
|
|
|
uint64_t error_pkts; /* Error packets when sampling. */
|
|
|
|
|
uint64_t ipv4_error_pkts; /* Error IPV4 packets when sampling. */
|
|
|
|
|
uint64_t ipv6_error_pkts; /* Error IPV6 packets when sampling. */
|
|
|
|
|
uint64_t tx_pkts; /* TX IPFIX packets. */
|
|
|
|
|
uint64_t tx_errors; /* IPFIX packets TX errors. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void ofputil_append_ipfix_stat(struct ovs_list *replies,
|
|
|
|
|
const struct ofputil_ipfix_stats *ois);
|
|
|
|
|
size_t ofputil_count_ipfix_stats(const struct ofp_header *);
|
|
|
|
|
int ofputil_pull_ipfix_stats(struct ofputil_ipfix_stats *, struct ofpbuf *msg);
|
|
|
|
|
|
2012-10-12 13:03:04 +09:00
|
|
|
|
struct ofputil_queue_stats_request {
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t port_no; /* OFPP_ANY means "all ports". */
|
2012-10-12 13:03:04 +09:00
|
|
|
|
uint32_t queue_id;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum ofperr
|
|
|
|
|
ofputil_decode_queue_stats_request(const struct ofp_header *request,
|
|
|
|
|
struct ofputil_queue_stats_request *oqsr);
|
|
|
|
|
struct ofpbuf *
|
|
|
|
|
ofputil_encode_queue_stats_request(enum ofp_version ofp_version,
|
|
|
|
|
const struct ofputil_queue_stats_request *oqsr);
|
|
|
|
|
|
|
|
|
|
struct ofputil_queue_stats {
|
2013-06-19 16:58:44 -07:00
|
|
|
|
ofp_port_t port_no;
|
2012-10-12 13:03:04 +09:00
|
|
|
|
uint32_t queue_id;
|
2013-07-17 15:56:22 -07:00
|
|
|
|
|
|
|
|
|
/* Values of unsupported statistics are set to all-1-bits (UINT64_MAX). */
|
|
|
|
|
uint64_t tx_bytes;
|
|
|
|
|
uint64_t tx_packets;
|
|
|
|
|
uint64_t tx_errors;
|
|
|
|
|
|
|
|
|
|
/* UINT32_MAX if unknown. */
|
|
|
|
|
uint32_t duration_sec;
|
|
|
|
|
uint32_t duration_nsec;
|
2012-10-12 13:03:04 +09:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
size_t ofputil_count_queue_stats(const struct ofp_header *);
|
|
|
|
|
int ofputil_decode_queue_stats(struct ofputil_queue_stats *qs, struct ofpbuf *msg);
|
2014-12-15 14:10:38 +01:00
|
|
|
|
void ofputil_append_queue_stat(struct ovs_list *replies,
|
2012-10-12 13:03:04 +09:00
|
|
|
|
const struct ofputil_queue_stats *oqs);
|
|
|
|
|
|
2014-05-22 10:47:13 +00:00
|
|
|
|
struct bucket_counter {
|
|
|
|
|
uint64_t packet_count; /* Number of packets processed by bucket. */
|
|
|
|
|
uint64_t byte_count; /* Number of bytes processed by bucket. */
|
|
|
|
|
};
|
|
|
|
|
|
2013-09-01 18:30:17 -07:00
|
|
|
|
/* Bucket for use in groups. */
|
|
|
|
|
struct ofputil_bucket {
|
2014-12-15 14:10:38 +01:00
|
|
|
|
struct ovs_list list_node;
|
2013-09-01 18:30:17 -07:00
|
|
|
|
uint16_t weight; /* Relative weight, for "select" groups. */
|
|
|
|
|
ofp_port_t watch_port; /* Port whose state affects whether this bucket
|
|
|
|
|
* is live. Only required for fast failover
|
|
|
|
|
* groups. */
|
|
|
|
|
uint32_t watch_group; /* Group whose state affects whether this
|
|
|
|
|
* bucket is live. Only required for fast
|
|
|
|
|
* failover groups. */
|
2014-11-11 12:39:19 +09:00
|
|
|
|
uint32_t bucket_id; /* Bucket Id used to identify bucket*/
|
2013-09-01 18:30:17 -07:00
|
|
|
|
struct ofpact *ofpacts; /* Series of "struct ofpact"s. */
|
|
|
|
|
size_t ofpacts_len; /* Length of ofpacts, in bytes. */
|
2014-05-22 10:47:13 +00:00
|
|
|
|
|
|
|
|
|
struct bucket_counter stats;
|
2013-09-01 18:30:17 -07:00
|
|
|
|
};
|
|
|
|
|
|
2015-03-20 13:50:30 +09:00
|
|
|
|
/* Protocol-independent group_mod. */
|
|
|
|
|
struct ofputil_group_props {
|
|
|
|
|
/* NTR selection method */
|
|
|
|
|
char selection_method[NTR_MAX_SELECTION_METHOD_LEN];
|
|
|
|
|
uint64_t selection_method_param;
|
|
|
|
|
struct field_array fields;
|
|
|
|
|
};
|
|
|
|
|
|
2013-09-01 18:30:17 -07:00
|
|
|
|
/* Protocol-independent group_mod. */
|
|
|
|
|
struct ofputil_group_mod {
|
2014-11-11 12:39:19 +09:00
|
|
|
|
uint16_t command; /* One of OFPGC15_*. */
|
2013-09-01 18:30:17 -07:00
|
|
|
|
uint8_t type; /* One of OFPGT11_*. */
|
|
|
|
|
uint32_t group_id; /* Group identifier. */
|
2014-11-11 12:39:19 +09:00
|
|
|
|
uint32_t command_bucket_id; /* Bucket Id used as part of
|
|
|
|
|
* OFPGC15_INSERT_BUCKET and
|
|
|
|
|
* OFPGC15_REMOVE_BUCKET commands
|
|
|
|
|
* execution.*/
|
2014-12-15 14:10:38 +01:00
|
|
|
|
struct ovs_list buckets; /* Contains "struct ofputil_bucket"s. */
|
2015-03-20 13:50:30 +09:00
|
|
|
|
struct ofputil_group_props props; /* Group properties. */
|
2013-09-01 18:30:17 -07:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Group stats reply, independent of protocol. */
|
|
|
|
|
struct ofputil_group_stats {
|
|
|
|
|
uint32_t group_id; /* Group identifier. */
|
|
|
|
|
uint32_t ref_count;
|
|
|
|
|
uint64_t packet_count; /* Packet count, UINT64_MAX if unknown. */
|
|
|
|
|
uint64_t byte_count; /* Byte count, UINT64_MAX if unknown. */
|
|
|
|
|
uint32_t duration_sec; /* UINT32_MAX if unknown. */
|
|
|
|
|
uint32_t duration_nsec;
|
|
|
|
|
uint32_t n_buckets;
|
2013-09-05 14:19:13 +09:00
|
|
|
|
struct bucket_counter *bucket_stats;
|
2013-09-01 18:30:17 -07:00
|
|
|
|
};
|
|
|
|
|
|
2013-11-04 21:14:53 -08:00
|
|
|
|
/* Group features reply, independent of protocol.
|
|
|
|
|
*
|
|
|
|
|
* Only OF1.2 and later support group features replies. */
|
2013-09-01 18:30:17 -07:00
|
|
|
|
struct ofputil_group_features {
|
|
|
|
|
uint32_t types; /* Bitmap of OFPGT_* values supported. */
|
|
|
|
|
uint32_t capabilities; /* Bitmap of OFPGFC12_* capability supported. */
|
|
|
|
|
uint32_t max_groups[4]; /* Maximum number of groups for each type. */
|
2014-08-11 10:57:03 -07:00
|
|
|
|
uint64_t ofpacts[4]; /* Bitmaps of supported OFPACT_* */
|
2013-09-01 18:30:17 -07:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Group desc reply, independent of protocol. */
|
|
|
|
|
struct ofputil_group_desc {
|
|
|
|
|
uint8_t type; /* One of OFPGT_*. */
|
|
|
|
|
uint32_t group_id; /* Group identifier. */
|
2014-12-15 14:10:38 +01:00
|
|
|
|
struct ovs_list buckets; /* Contains "struct ofputil_bucket"s. */
|
2015-03-20 13:50:30 +09:00
|
|
|
|
struct ofputil_group_props props; /* Group properties. */
|
2013-09-01 18:30:17 -07:00
|
|
|
|
};
|
|
|
|
|
|
2016-07-29 16:52:04 -07:00
|
|
|
|
void ofputil_group_properties_destroy(struct ofputil_group_props *);
|
|
|
|
|
void ofputil_group_properties_copy(struct ofputil_group_props *to,
|
|
|
|
|
const struct ofputil_group_props *from);
|
2014-12-15 14:10:38 +01:00
|
|
|
|
void ofputil_bucket_list_destroy(struct ovs_list *buckets);
|
|
|
|
|
void ofputil_bucket_clone_list(struct ovs_list *dest,
|
|
|
|
|
const struct ovs_list *src,
|
2014-11-12 15:24:10 +09:00
|
|
|
|
const struct ofputil_bucket *);
|
2014-12-15 14:10:38 +01:00
|
|
|
|
struct ofputil_bucket *ofputil_bucket_find(const struct ovs_list *,
|
2014-11-12 15:24:10 +09:00
|
|
|
|
uint32_t bucket_id);
|
2014-12-15 14:10:38 +01:00
|
|
|
|
bool ofputil_bucket_check_duplicate_id(const struct ovs_list *);
|
|
|
|
|
struct ofputil_bucket *ofputil_bucket_list_front(const struct ovs_list *);
|
|
|
|
|
struct ofputil_bucket *ofputil_bucket_list_back(const struct ovs_list *);
|
2013-09-01 18:30:17 -07:00
|
|
|
|
|
2013-10-30 18:17:10 +09:00
|
|
|
|
static inline bool
|
|
|
|
|
ofputil_bucket_has_liveness(const struct ofputil_bucket *bucket)
|
|
|
|
|
{
|
|
|
|
|
return (bucket->watch_port != OFPP_ANY ||
|
|
|
|
|
bucket->watch_group != OFPG_ANY);
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-01 18:30:17 -07:00
|
|
|
|
struct ofpbuf *ofputil_encode_group_stats_request(enum ofp_version,
|
|
|
|
|
uint32_t group_id);
|
|
|
|
|
enum ofperr ofputil_decode_group_stats_request(
|
|
|
|
|
const struct ofp_header *request, uint32_t *group_id);
|
2014-12-15 14:10:38 +01:00
|
|
|
|
void ofputil_append_group_stats(struct ovs_list *replies,
|
2013-09-01 18:30:17 -07:00
|
|
|
|
const struct ofputil_group_stats *);
|
|
|
|
|
struct ofpbuf *ofputil_encode_group_features_request(enum ofp_version);
|
|
|
|
|
struct ofpbuf *ofputil_encode_group_features_reply(
|
|
|
|
|
const struct ofputil_group_features *, const struct ofp_header *request);
|
|
|
|
|
void ofputil_decode_group_features_reply(const struct ofp_header *,
|
|
|
|
|
struct ofputil_group_features *);
|
2015-03-20 13:50:30 +09:00
|
|
|
|
void ofputil_uninit_group_mod(struct ofputil_group_mod *gm);
|
2013-09-01 18:30:17 -07:00
|
|
|
|
struct ofpbuf *ofputil_encode_group_mod(enum ofp_version ofp_version,
|
|
|
|
|
const struct ofputil_group_mod *gm);
|
|
|
|
|
|
|
|
|
|
enum ofperr ofputil_decode_group_mod(const struct ofp_header *,
|
|
|
|
|
struct ofputil_group_mod *);
|
|
|
|
|
|
|
|
|
|
int ofputil_decode_group_stats_reply(struct ofpbuf *,
|
|
|
|
|
struct ofputil_group_stats *);
|
|
|
|
|
|
2015-03-20 13:50:30 +09:00
|
|
|
|
void ofputil_uninit_group_desc(struct ofputil_group_desc *gd);
|
2014-05-07 23:49:00 -07:00
|
|
|
|
uint32_t ofputil_decode_group_desc_request(const struct ofp_header *);
|
|
|
|
|
struct ofpbuf *ofputil_encode_group_desc_request(enum ofp_version,
|
|
|
|
|
uint32_t group_id);
|
|
|
|
|
|
2013-09-01 18:30:17 -07:00
|
|
|
|
int ofputil_decode_group_desc_reply(struct ofputil_group_desc *,
|
2013-10-17 10:15:08 +09:00
|
|
|
|
struct ofpbuf *, enum ofp_version);
|
2013-09-01 18:30:17 -07:00
|
|
|
|
|
|
|
|
|
void ofputil_append_group_desc_reply(const struct ofputil_group_desc *,
|
2015-01-27 17:12:34 +09:00
|
|
|
|
const struct ovs_list *buckets,
|
2014-12-15 14:10:38 +01:00
|
|
|
|
struct ovs_list *replies);
|
2013-09-01 18:30:17 -07:00
|
|
|
|
|
2014-05-02 09:54:27 +03:00
|
|
|
|
struct ofputil_bundle_ctrl_msg {
|
|
|
|
|
uint32_t bundle_id;
|
|
|
|
|
uint16_t type;
|
|
|
|
|
uint16_t flags;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ofputil_bundle_add_msg {
|
|
|
|
|
uint32_t bundle_id;
|
|
|
|
|
uint16_t flags;
|
|
|
|
|
const struct ofp_header *msg;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum ofperr ofputil_decode_bundle_ctrl(const struct ofp_header *,
|
|
|
|
|
struct ofputil_bundle_ctrl_msg *);
|
|
|
|
|
|
2015-06-05 14:03:12 -07:00
|
|
|
|
struct ofpbuf *ofputil_encode_bundle_ctrl_request(enum ofp_version,
|
|
|
|
|
struct ofputil_bundle_ctrl_msg *);
|
2014-05-02 09:54:27 +03:00
|
|
|
|
struct ofpbuf *ofputil_encode_bundle_ctrl_reply(const struct ofp_header *,
|
|
|
|
|
struct ofputil_bundle_ctrl_msg *);
|
|
|
|
|
|
|
|
|
|
struct ofpbuf *ofputil_encode_bundle_add(enum ofp_version ofp_version,
|
|
|
|
|
struct ofputil_bundle_add_msg *msg);
|
|
|
|
|
|
|
|
|
|
enum ofperr ofputil_decode_bundle_add(const struct ofp_header *,
|
2015-06-01 18:07:39 -07:00
|
|
|
|
struct ofputil_bundle_add_msg *,
|
|
|
|
|
enum ofptype *type);
|
openflow: Table maintenance commands for Geneve options.
In order to work with Geneve options, we need to maintain a mapping
table between an option (defined by <class, type, length>) and
an NXM field that can be operated on for the purposes of matches,
actions, etc. This mapping must be explicitly specified by the
user.
Conceptually, this table could be communicated using either OpenFlow
or OVSDB. Using OVSDB requires less code and definition of extensions
than OpenFlow but introduces the possibility that mapping table
updates and flow modifications are desynchronized from each other.
This is dangerous because the mapping table signifcantly impacts the
way that flows using Geneve options are installed and processed by
OVS. Therefore, the mapping table is maintained using OpenFlow commands
instead, which opens the possibility of using synchronization between
table changes and flow modifications through barriers, bundles, etc.
There are two primary groups of OpenFlow messages that are introduced
as Nicira extensions: modification commands (add, delete, clear mappings)
and table status request/reply to dump the current table along with switch
information.
Note that mappings should not be changed while they are in active use by
a flow. The result of doing so is undefined.
This only adds the OpenFlow infrastructure but doesn't actually
do anything with the information yet after the messages have been
decoded.
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2015-06-02 15:11:00 -07:00
|
|
|
|
|
2016-09-14 16:51:27 -07:00
|
|
|
|
/* Bundle message as produced by ofp-parse. */
|
2016-07-29 16:52:04 -07:00
|
|
|
|
struct ofputil_bundle_msg {
|
|
|
|
|
enum ofptype type;
|
|
|
|
|
union {
|
|
|
|
|
struct ofputil_flow_mod fm;
|
|
|
|
|
struct ofputil_group_mod gm;
|
2016-09-14 16:51:27 -07:00
|
|
|
|
struct ofputil_packet_out po;
|
2016-07-29 16:52:04 -07:00
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2016-09-14 16:51:27 -07:00
|
|
|
|
void ofputil_encode_bundle_msgs(const struct ofputil_bundle_msg *bms,
|
|
|
|
|
size_t n_bms, struct ovs_list *requests,
|
2016-07-29 16:52:04 -07:00
|
|
|
|
enum ofputil_protocol);
|
2016-09-14 16:51:27 -07:00
|
|
|
|
void ofputil_free_bundle_msgs(struct ofputil_bundle_msg *bms, size_t n_bms);
|
2016-07-29 16:52:04 -07:00
|
|
|
|
|
2015-12-16 02:47:50 +08:00
|
|
|
|
struct ofputil_tlv_map {
|
openflow: Table maintenance commands for Geneve options.
In order to work with Geneve options, we need to maintain a mapping
table between an option (defined by <class, type, length>) and
an NXM field that can be operated on for the purposes of matches,
actions, etc. This mapping must be explicitly specified by the
user.
Conceptually, this table could be communicated using either OpenFlow
or OVSDB. Using OVSDB requires less code and definition of extensions
than OpenFlow but introduces the possibility that mapping table
updates and flow modifications are desynchronized from each other.
This is dangerous because the mapping table signifcantly impacts the
way that flows using Geneve options are installed and processed by
OVS. Therefore, the mapping table is maintained using OpenFlow commands
instead, which opens the possibility of using synchronization between
table changes and flow modifications through barriers, bundles, etc.
There are two primary groups of OpenFlow messages that are introduced
as Nicira extensions: modification commands (add, delete, clear mappings)
and table status request/reply to dump the current table along with switch
information.
Note that mappings should not be changed while they are in active use by
a flow. The result of doing so is undefined.
This only adds the OpenFlow infrastructure but doesn't actually
do anything with the information yet after the messages have been
decoded.
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2015-06-02 15:11:00 -07:00
|
|
|
|
struct ovs_list list_node;
|
|
|
|
|
|
|
|
|
|
uint16_t option_class;
|
|
|
|
|
uint8_t option_type;
|
|
|
|
|
uint8_t option_len;
|
|
|
|
|
uint16_t index;
|
|
|
|
|
};
|
|
|
|
|
|
2015-12-16 02:47:50 +08:00
|
|
|
|
struct ofputil_tlv_table_mod {
|
openflow: Table maintenance commands for Geneve options.
In order to work with Geneve options, we need to maintain a mapping
table between an option (defined by <class, type, length>) and
an NXM field that can be operated on for the purposes of matches,
actions, etc. This mapping must be explicitly specified by the
user.
Conceptually, this table could be communicated using either OpenFlow
or OVSDB. Using OVSDB requires less code and definition of extensions
than OpenFlow but introduces the possibility that mapping table
updates and flow modifications are desynchronized from each other.
This is dangerous because the mapping table signifcantly impacts the
way that flows using Geneve options are installed and processed by
OVS. Therefore, the mapping table is maintained using OpenFlow commands
instead, which opens the possibility of using synchronization between
table changes and flow modifications through barriers, bundles, etc.
There are two primary groups of OpenFlow messages that are introduced
as Nicira extensions: modification commands (add, delete, clear mappings)
and table status request/reply to dump the current table along with switch
information.
Note that mappings should not be changed while they are in active use by
a flow. The result of doing so is undefined.
This only adds the OpenFlow infrastructure but doesn't actually
do anything with the information yet after the messages have been
decoded.
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2015-06-02 15:11:00 -07:00
|
|
|
|
uint16_t command;
|
2015-12-16 02:47:50 +08:00
|
|
|
|
struct ovs_list mappings; /* Contains "struct ofputil_tlv_map"s. */
|
openflow: Table maintenance commands for Geneve options.
In order to work with Geneve options, we need to maintain a mapping
table between an option (defined by <class, type, length>) and
an NXM field that can be operated on for the purposes of matches,
actions, etc. This mapping must be explicitly specified by the
user.
Conceptually, this table could be communicated using either OpenFlow
or OVSDB. Using OVSDB requires less code and definition of extensions
than OpenFlow but introduces the possibility that mapping table
updates and flow modifications are desynchronized from each other.
This is dangerous because the mapping table signifcantly impacts the
way that flows using Geneve options are installed and processed by
OVS. Therefore, the mapping table is maintained using OpenFlow commands
instead, which opens the possibility of using synchronization between
table changes and flow modifications through barriers, bundles, etc.
There are two primary groups of OpenFlow messages that are introduced
as Nicira extensions: modification commands (add, delete, clear mappings)
and table status request/reply to dump the current table along with switch
information.
Note that mappings should not be changed while they are in active use by
a flow. The result of doing so is undefined.
This only adds the OpenFlow infrastructure but doesn't actually
do anything with the information yet after the messages have been
decoded.
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2015-06-02 15:11:00 -07:00
|
|
|
|
};
|
|
|
|
|
|
2015-12-16 02:47:50 +08:00
|
|
|
|
struct ofputil_tlv_table_reply {
|
openflow: Table maintenance commands for Geneve options.
In order to work with Geneve options, we need to maintain a mapping
table between an option (defined by <class, type, length>) and
an NXM field that can be operated on for the purposes of matches,
actions, etc. This mapping must be explicitly specified by the
user.
Conceptually, this table could be communicated using either OpenFlow
or OVSDB. Using OVSDB requires less code and definition of extensions
than OpenFlow but introduces the possibility that mapping table
updates and flow modifications are desynchronized from each other.
This is dangerous because the mapping table signifcantly impacts the
way that flows using Geneve options are installed and processed by
OVS. Therefore, the mapping table is maintained using OpenFlow commands
instead, which opens the possibility of using synchronization between
table changes and flow modifications through barriers, bundles, etc.
There are two primary groups of OpenFlow messages that are introduced
as Nicira extensions: modification commands (add, delete, clear mappings)
and table status request/reply to dump the current table along with switch
information.
Note that mappings should not be changed while they are in active use by
a flow. The result of doing so is undefined.
This only adds the OpenFlow infrastructure but doesn't actually
do anything with the information yet after the messages have been
decoded.
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2015-06-02 15:11:00 -07:00
|
|
|
|
uint32_t max_option_space;
|
|
|
|
|
uint16_t max_fields;
|
2015-12-16 02:47:50 +08:00
|
|
|
|
struct ovs_list mappings; /* Contains "struct ofputil_tlv_map"s. */
|
openflow: Table maintenance commands for Geneve options.
In order to work with Geneve options, we need to maintain a mapping
table between an option (defined by <class, type, length>) and
an NXM field that can be operated on for the purposes of matches,
actions, etc. This mapping must be explicitly specified by the
user.
Conceptually, this table could be communicated using either OpenFlow
or OVSDB. Using OVSDB requires less code and definition of extensions
than OpenFlow but introduces the possibility that mapping table
updates and flow modifications are desynchronized from each other.
This is dangerous because the mapping table signifcantly impacts the
way that flows using Geneve options are installed and processed by
OVS. Therefore, the mapping table is maintained using OpenFlow commands
instead, which opens the possibility of using synchronization between
table changes and flow modifications through barriers, bundles, etc.
There are two primary groups of OpenFlow messages that are introduced
as Nicira extensions: modification commands (add, delete, clear mappings)
and table status request/reply to dump the current table along with switch
information.
Note that mappings should not be changed while they are in active use by
a flow. The result of doing so is undefined.
This only adds the OpenFlow infrastructure but doesn't actually
do anything with the information yet after the messages have been
decoded.
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2015-06-02 15:11:00 -07:00
|
|
|
|
};
|
|
|
|
|
|
2015-12-16 02:47:50 +08:00
|
|
|
|
struct ofpbuf *ofputil_encode_tlv_table_mod(enum ofp_version ofp_version,
|
|
|
|
|
struct ofputil_tlv_table_mod *);
|
|
|
|
|
enum ofperr ofputil_decode_tlv_table_mod(const struct ofp_header *,
|
|
|
|
|
struct ofputil_tlv_table_mod *);
|
|
|
|
|
struct ofpbuf *ofputil_encode_tlv_table_reply(const struct ofp_header *,
|
|
|
|
|
struct ofputil_tlv_table_reply *);
|
|
|
|
|
enum ofperr ofputil_decode_tlv_table_reply(const struct ofp_header *,
|
|
|
|
|
struct ofputil_tlv_table_reply *);
|
|
|
|
|
void ofputil_uninit_tlv_table(struct ovs_list *mappings);
|
openflow: Table maintenance commands for Geneve options.
In order to work with Geneve options, we need to maintain a mapping
table between an option (defined by <class, type, length>) and
an NXM field that can be operated on for the purposes of matches,
actions, etc. This mapping must be explicitly specified by the
user.
Conceptually, this table could be communicated using either OpenFlow
or OVSDB. Using OVSDB requires less code and definition of extensions
than OpenFlow but introduces the possibility that mapping table
updates and flow modifications are desynchronized from each other.
This is dangerous because the mapping table signifcantly impacts the
way that flows using Geneve options are installed and processed by
OVS. Therefore, the mapping table is maintained using OpenFlow commands
instead, which opens the possibility of using synchronization between
table changes and flow modifications through barriers, bundles, etc.
There are two primary groups of OpenFlow messages that are introduced
as Nicira extensions: modification commands (add, delete, clear mappings)
and table status request/reply to dump the current table along with switch
information.
Note that mappings should not be changed while they are in active use by
a flow. The result of doing so is undefined.
This only adds the OpenFlow infrastructure but doesn't actually
do anything with the information yet after the messages have been
decoded.
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2015-06-02 15:11:00 -07:00
|
|
|
|
|
ofproto: Implement OF1.4 Set/Get asynchronous configuration messages.
This patch adds support for Openflow1.4 set/get asynchronous configuration
messages. OpenVSwitch already supports set/get asynchronous configuration
messages for Openflow1.3. In this patch OFPT_SET_ASYNC_CONFIG message
allows the controllers to set the configuration for OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD in addition to the Openflow1.3
messages. In a OFPT_SET_ASYNC, only the properties that shall be changed
need to be included, properties that are omitted from the message are
unchanged.
The OFPT_GET_ASYNC_CONFIG is used to query the asynchronous configuration
of switch. In a OFPT_GET_ASYNC_REPLY message, all properties must be
included.
According to Openflow1.4 the initial configuration shall be:
- In the “master” or “equal” role, enable all OFPT_PACKET_IN messages,
except those with reason OFPR_INVALID_TTL, enable all OFPT_PORT_STATUS
and OFPT_FLOW_REMOVED messages, and disable all OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
- In the “slave” role, enable all OFPT_PORT_STATUS messages and disable
all OFPT_PACKET_IN, OFPT_FLOW_REMOVED, OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
Signed-off-by: Niti Rohilla <niti.rohilla@tcs.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
2015-07-23 17:05:44 +05:30
|
|
|
|
enum ofputil_async_msg_type {
|
2016-01-08 14:49:32 -08:00
|
|
|
|
/* Standard asynchronous messages. */
|
ofproto: Implement OF1.4 Set/Get asynchronous configuration messages.
This patch adds support for Openflow1.4 set/get asynchronous configuration
messages. OpenVSwitch already supports set/get asynchronous configuration
messages for Openflow1.3. In this patch OFPT_SET_ASYNC_CONFIG message
allows the controllers to set the configuration for OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD in addition to the Openflow1.3
messages. In a OFPT_SET_ASYNC, only the properties that shall be changed
need to be included, properties that are omitted from the message are
unchanged.
The OFPT_GET_ASYNC_CONFIG is used to query the asynchronous configuration
of switch. In a OFPT_GET_ASYNC_REPLY message, all properties must be
included.
According to Openflow1.4 the initial configuration shall be:
- In the “master” or “equal” role, enable all OFPT_PACKET_IN messages,
except those with reason OFPR_INVALID_TTL, enable all OFPT_PORT_STATUS
and OFPT_FLOW_REMOVED messages, and disable all OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
- In the “slave” role, enable all OFPT_PORT_STATUS messages and disable
all OFPT_PACKET_IN, OFPT_FLOW_REMOVED, OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
Signed-off-by: Niti Rohilla <niti.rohilla@tcs.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
2015-07-23 17:05:44 +05:30
|
|
|
|
OAM_PACKET_IN, /* OFPT_PACKET_IN or NXT_PACKET_IN. */
|
|
|
|
|
OAM_PORT_STATUS, /* OFPT_PORT_STATUS. */
|
2016-01-07 12:03:28 -08:00
|
|
|
|
OAM_FLOW_REMOVED, /* OFPT_FLOW_REMOVED or NXT_FLOW_REMOVED. */
|
ofproto: Implement OF1.4 Set/Get asynchronous configuration messages.
This patch adds support for Openflow1.4 set/get asynchronous configuration
messages. OpenVSwitch already supports set/get asynchronous configuration
messages for Openflow1.3. In this patch OFPT_SET_ASYNC_CONFIG message
allows the controllers to set the configuration for OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD in addition to the Openflow1.3
messages. In a OFPT_SET_ASYNC, only the properties that shall be changed
need to be included, properties that are omitted from the message are
unchanged.
The OFPT_GET_ASYNC_CONFIG is used to query the asynchronous configuration
of switch. In a OFPT_GET_ASYNC_REPLY message, all properties must be
included.
According to Openflow1.4 the initial configuration shall be:
- In the “master” or “equal” role, enable all OFPT_PACKET_IN messages,
except those with reason OFPR_INVALID_TTL, enable all OFPT_PORT_STATUS
and OFPT_FLOW_REMOVED messages, and disable all OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
- In the “slave” role, enable all OFPT_PORT_STATUS messages and disable
all OFPT_PACKET_IN, OFPT_FLOW_REMOVED, OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
Signed-off-by: Niti Rohilla <niti.rohilla@tcs.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
2015-07-23 17:05:44 +05:30
|
|
|
|
OAM_ROLE_STATUS, /* OFPT_ROLE_STATUS. */
|
|
|
|
|
OAM_TABLE_STATUS, /* OFPT_TABLE_STATUS. */
|
|
|
|
|
OAM_REQUESTFORWARD, /* OFPT_REQUESTFORWARD. */
|
2016-01-08 14:49:32 -08:00
|
|
|
|
|
|
|
|
|
/* Extension asynchronous messages (none yet--coming soon!). */
|
|
|
|
|
#define OAM_EXTENSIONS 0 /* Bitmap of all extensions. */
|
|
|
|
|
|
ofproto: Implement OF1.4 Set/Get asynchronous configuration messages.
This patch adds support for Openflow1.4 set/get asynchronous configuration
messages. OpenVSwitch already supports set/get asynchronous configuration
messages for Openflow1.3. In this patch OFPT_SET_ASYNC_CONFIG message
allows the controllers to set the configuration for OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD in addition to the Openflow1.3
messages. In a OFPT_SET_ASYNC, only the properties that shall be changed
need to be included, properties that are omitted from the message are
unchanged.
The OFPT_GET_ASYNC_CONFIG is used to query the asynchronous configuration
of switch. In a OFPT_GET_ASYNC_REPLY message, all properties must be
included.
According to Openflow1.4 the initial configuration shall be:
- In the “master” or “equal” role, enable all OFPT_PACKET_IN messages,
except those with reason OFPR_INVALID_TTL, enable all OFPT_PORT_STATUS
and OFPT_FLOW_REMOVED messages, and disable all OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
- In the “slave” role, enable all OFPT_PORT_STATUS messages and disable
all OFPT_PACKET_IN, OFPT_FLOW_REMOVED, OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
Signed-off-by: Niti Rohilla <niti.rohilla@tcs.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
2015-07-23 17:05:44 +05:30
|
|
|
|
OAM_N_TYPES
|
|
|
|
|
};
|
2016-01-07 12:04:56 -08:00
|
|
|
|
const char *ofputil_async_msg_type_to_string(enum ofputil_async_msg_type);
|
ofproto: Implement OF1.4 Set/Get asynchronous configuration messages.
This patch adds support for Openflow1.4 set/get asynchronous configuration
messages. OpenVSwitch already supports set/get asynchronous configuration
messages for Openflow1.3. In this patch OFPT_SET_ASYNC_CONFIG message
allows the controllers to set the configuration for OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD in addition to the Openflow1.3
messages. In a OFPT_SET_ASYNC, only the properties that shall be changed
need to be included, properties that are omitted from the message are
unchanged.
The OFPT_GET_ASYNC_CONFIG is used to query the asynchronous configuration
of switch. In a OFPT_GET_ASYNC_REPLY message, all properties must be
included.
According to Openflow1.4 the initial configuration shall be:
- In the “master” or “equal” role, enable all OFPT_PACKET_IN messages,
except those with reason OFPR_INVALID_TTL, enable all OFPT_PORT_STATUS
and OFPT_FLOW_REMOVED messages, and disable all OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
- In the “slave” role, enable all OFPT_PORT_STATUS messages and disable
all OFPT_PACKET_IN, OFPT_FLOW_REMOVED, OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
Signed-off-by: Niti Rohilla <niti.rohilla@tcs.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
2015-07-23 17:05:44 +05:30
|
|
|
|
|
2016-01-14 21:03:23 -08:00
|
|
|
|
struct ofputil_async_cfg {
|
|
|
|
|
uint32_t master[OAM_N_TYPES];
|
|
|
|
|
uint32_t slave[OAM_N_TYPES];
|
|
|
|
|
};
|
|
|
|
|
#define OFPUTIL_ASYNC_CFG_INIT (struct ofputil_async_cfg) { .master[0] = 0 }
|
|
|
|
|
|
ofproto: Implement OF1.4 Set/Get asynchronous configuration messages.
This patch adds support for Openflow1.4 set/get asynchronous configuration
messages. OpenVSwitch already supports set/get asynchronous configuration
messages for Openflow1.3. In this patch OFPT_SET_ASYNC_CONFIG message
allows the controllers to set the configuration for OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD in addition to the Openflow1.3
messages. In a OFPT_SET_ASYNC, only the properties that shall be changed
need to be included, properties that are omitted from the message are
unchanged.
The OFPT_GET_ASYNC_CONFIG is used to query the asynchronous configuration
of switch. In a OFPT_GET_ASYNC_REPLY message, all properties must be
included.
According to Openflow1.4 the initial configuration shall be:
- In the “master” or “equal” role, enable all OFPT_PACKET_IN messages,
except those with reason OFPR_INVALID_TTL, enable all OFPT_PORT_STATUS
and OFPT_FLOW_REMOVED messages, and disable all OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
- In the “slave” role, enable all OFPT_PORT_STATUS messages and disable
all OFPT_PACKET_IN, OFPT_FLOW_REMOVED, OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
Signed-off-by: Niti Rohilla <niti.rohilla@tcs.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
2015-07-23 17:05:44 +05:30
|
|
|
|
enum ofperr ofputil_decode_set_async_config(const struct ofp_header *,
|
2016-01-14 21:03:23 -08:00
|
|
|
|
bool loose,
|
2016-01-18 16:00:34 -08:00
|
|
|
|
const struct ofputil_async_cfg *,
|
2016-01-14 21:03:23 -08:00
|
|
|
|
struct ofputil_async_cfg *);
|
|
|
|
|
|
2016-01-08 14:49:32 -08:00
|
|
|
|
struct ofpbuf *ofputil_encode_get_async_reply(
|
2016-01-14 21:03:23 -08:00
|
|
|
|
const struct ofp_header *, const struct ofputil_async_cfg *);
|
2016-01-08 14:49:32 -08:00
|
|
|
|
struct ofpbuf *ofputil_encode_set_async_config(
|
|
|
|
|
const struct ofputil_async_cfg *, uint32_t oams, enum ofp_version);
|
ofproto: Implement OF1.4 Set/Get asynchronous configuration messages.
This patch adds support for Openflow1.4 set/get asynchronous configuration
messages. OpenVSwitch already supports set/get asynchronous configuration
messages for Openflow1.3. In this patch OFPT_SET_ASYNC_CONFIG message
allows the controllers to set the configuration for OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD in addition to the Openflow1.3
messages. In a OFPT_SET_ASYNC, only the properties that shall be changed
need to be included, properties that are omitted from the message are
unchanged.
The OFPT_GET_ASYNC_CONFIG is used to query the asynchronous configuration
of switch. In a OFPT_GET_ASYNC_REPLY message, all properties must be
included.
According to Openflow1.4 the initial configuration shall be:
- In the “master” or “equal” role, enable all OFPT_PACKET_IN messages,
except those with reason OFPR_INVALID_TTL, enable all OFPT_PORT_STATUS
and OFPT_FLOW_REMOVED messages, and disable all OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
- In the “slave” role, enable all OFPT_PORT_STATUS messages and disable
all OFPT_PACKET_IN, OFPT_FLOW_REMOVED, OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
Signed-off-by: Niti Rohilla <niti.rohilla@tcs.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
2015-07-23 17:05:44 +05:30
|
|
|
|
|
2016-01-14 21:03:23 -08:00
|
|
|
|
struct ofputil_async_cfg ofputil_async_cfg_default(enum ofp_version);
|
ofproto: Implement OF1.4 Set/Get asynchronous configuration messages.
This patch adds support for Openflow1.4 set/get asynchronous configuration
messages. OpenVSwitch already supports set/get asynchronous configuration
messages for Openflow1.3. In this patch OFPT_SET_ASYNC_CONFIG message
allows the controllers to set the configuration for OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD in addition to the Openflow1.3
messages. In a OFPT_SET_ASYNC, only the properties that shall be changed
need to be included, properties that are omitted from the message are
unchanged.
The OFPT_GET_ASYNC_CONFIG is used to query the asynchronous configuration
of switch. In a OFPT_GET_ASYNC_REPLY message, all properties must be
included.
According to Openflow1.4 the initial configuration shall be:
- In the “master” or “equal” role, enable all OFPT_PACKET_IN messages,
except those with reason OFPR_INVALID_TTL, enable all OFPT_PORT_STATUS
and OFPT_FLOW_REMOVED messages, and disable all OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
- In the “slave” role, enable all OFPT_PORT_STATUS messages and disable
all OFPT_PACKET_IN, OFPT_FLOW_REMOVED, OFPT_ROLE_STATUS,
OFPT_TABLE_STATUS and OFPT_REQUESTFORWARD messages.
Signed-off-by: Niti Rohilla <niti.rohilla@tcs.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
2015-07-23 17:05:44 +05:30
|
|
|
|
|
2015-09-09 17:33:42 +05:30
|
|
|
|
struct ofputil_requestforward {
|
|
|
|
|
ovs_be32 xid;
|
|
|
|
|
enum ofp14_requestforward_reason reason;
|
|
|
|
|
union {
|
|
|
|
|
/* reason == OFPRFR_METER_MOD. */
|
|
|
|
|
struct {
|
2015-09-10 10:00:41 -07:00
|
|
|
|
struct ofputil_meter_mod *meter_mod;
|
2015-09-09 17:33:42 +05:30
|
|
|
|
struct ofpbuf bands;
|
|
|
|
|
};
|
2015-09-10 10:00:41 -07:00
|
|
|
|
|
|
|
|
|
/* reason == OFPRFR_GROUP_MOD. */
|
|
|
|
|
struct ofputil_group_mod *group_mod;
|
2015-09-09 17:33:42 +05:30
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ofpbuf *ofputil_encode_requestforward(
|
|
|
|
|
const struct ofputil_requestforward *, enum ofputil_protocol);
|
|
|
|
|
enum ofperr ofputil_decode_requestforward(const struct ofp_header *,
|
|
|
|
|
struct ofputil_requestforward *);
|
|
|
|
|
void ofputil_destroy_requestforward(struct ofputil_requestforward *);
|
|
|
|
|
|
2016-02-18 15:54:26 +05:30
|
|
|
|
/* Abstract ofp14_table_status. */
|
|
|
|
|
struct ofputil_table_status {
|
|
|
|
|
enum ofp14_table_reason reason; /* One of OFPTR_*. */
|
|
|
|
|
struct ofputil_table_desc desc; /* New table config. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum ofperr ofputil_decode_table_status(const struct ofp_header *oh,
|
|
|
|
|
struct ofputil_table_status *ts);
|
|
|
|
|
|
|
|
|
|
struct ofpbuf *
|
|
|
|
|
ofputil_encode_table_status(const struct ofputil_table_status *ts,
|
|
|
|
|
enum ofputil_protocol protocol);
|
2010-05-27 13:14:05 -07:00
|
|
|
|
#endif /* ofp-util.h */
|