From patchwork Thu Apr 14 22:20:19 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: ben@skyportsystems.com X-Patchwork-Id: 610686 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from archives.nicira.com (archives.nicira.com [96.126.127.54]) by ozlabs.org (Postfix) with ESMTP id 3qmFVz0dFnz9s8d for ; Fri, 15 Apr 2016 08:20:59 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=skyportsystems.com header.i=@skyportsystems.com header.b=m2VNsnVq; dkim-atps=neutral Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id 40951109B9; Thu, 14 Apr 2016 15:20:37 -0700 (PDT) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx3v3.cudamail.com (mx3.cudamail.com [64.34.241.5]) by archives.nicira.com (Postfix) with ESMTPS id A4E5B109A7 for ; Thu, 14 Apr 2016 15:20:35 -0700 (PDT) Received: from bar6.cudamail.com (localhost [127.0.0.1]) by mx3v3.cudamail.com (Postfix) with ESMTPS id 3AD5E162147 for ; Thu, 14 Apr 2016 16:20:35 -0600 (MDT) X-ASG-Debug-ID: 1460672432-0b32370db209f30001-byXFYA Received: from mx3-pf2.cudamail.com ([192.168.14.1]) by bar6.cudamail.com with ESMTP id 9H9P4i9ZvLYBcdto (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 14 Apr 2016 16:20:32 -0600 (MDT) X-Barracuda-Envelope-From: ben@skyportsystems.com X-Barracuda-RBL-Trusted-Forwarder: 192.168.14.1 Received: from unknown (HELO mail-pf0-f179.google.com) (209.85.192.179) by mx3-pf2.cudamail.com with ESMTPS (RC4-SHA encrypted); 14 Apr 2016 22:20:31 -0000 Received-SPF: pass (mx3-pf2.cudamail.com: SPF record at _netblocks.google.com designates 209.85.192.179 as permitted sender) X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.179 Received: by mail-pf0-f179.google.com with SMTP id c20so50021151pfc.1 for ; Thu, 14 Apr 2016 15:20:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=skyportsystems.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=DTmRLy2DLdM0I+F1mPuUoPdh43cfJRADe4RUOz4N8dc=; b=m2VNsnVqXRzvjD6rwB9ugg3/CMRsriiV9zE5wdW36QnMyRNRxCzM6Jk9gEq4VfiIbd MCgkWoAQe/4xoR5EVLxcmcWna+ZsQUFhA5soWq4CkspmKKTQmxlHhQ+ehixGOsqvYitp T81Oe5t0D2z4SOHkozOy9SpRkUnq0gsP0Zwp0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=DTmRLy2DLdM0I+F1mPuUoPdh43cfJRADe4RUOz4N8dc=; b=fGHRxiSVDlGhpbp1N8W5gcmye0noHSB1MtLhE5KIGQhoVTPNar1nCdgqL/eX+kNfLc 41G2/Eryj2EwYI/ohJ6H+kkLfHcj2phBQNi3GRAru+R4cAB8sZxNTp5204LFCs7xkcTU wbEZjavZHuGt3KE0uL6td0sIFyimEMSZFnuYWcG0EYA8ZMtBB69zsXXlOviCj41aHYk1 +ffPBEkM8E+EW5/MPxpXQ0oXUlGtenrcEA8cn1N4OITZlCvH7LWUHbmYflXcho0Y7u5l MGPDy+DSy0EpvnUFerWF1kLrKlIhvupnilPE3cFvW8renKy+5n3btFA+LgHR1S/SqxLC wa+Q== X-Gm-Message-State: AOPr4FWgW1TABpTkHD4A00Yk+Fkvo4wwwCKOT+kRjnXU9pvDO10T1QhN6imFBYY6DEnGDw+9 X-Received: by 10.98.70.138 with SMTP id o10mr24696730pfi.123.1460672430542; Thu, 14 Apr 2016 15:20:30 -0700 (PDT) Received: from Arrow.corp.skyportsystems.com (67-207-112-138.static.wiline.com. [67.207.112.138]) by smtp.gmail.com with ESMTPSA id i9sm60071669pfi.95.2016.04.14.15.20.29 (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 14 Apr 2016 15:20:29 -0700 (PDT) X-CudaMail-Envelope-Sender: ben@skyportsystems.com X-Barracuda-Apparent-Source-IP: 67.207.112.138 From: ben@skyportsystems.com To: dev@openvswitch.org X-CudaMail-MID: CM-V2-413056922 X-CudaMail-DTE: 041416 X-CudaMail-Originating-IP: 209.85.192.179 Date: Thu, 14 Apr 2016 15:20:19 -0700 X-ASG-Orig-Subj: [##CM-V2-413056922##][PATCH v7 1/3] Move lib/ofp-actions.h to include/openvswitch directory Message-Id: <1771c8dea6ebf72c8746f34c85c6203e92ae89ff.1460672059.git.ben@skyportsystems.com> X-Mailer: git-send-email 2.5.4 (Apple Git-61) In-Reply-To: References: In-Reply-To: References: X-GBUdb-Analysis: 0, 209.85.192.179, Ugly c=0.385168 p=-0.285714 Source Normal X-MessageSniffer-Rules: 0-0-0-32767-c X-Barracuda-Connect: UNKNOWN[192.168.14.1] X-Barracuda-Start-Time: 1460672432 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://web.cudamail.com:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at cudamail.com X-Barracuda-Spam-Score: 1.60 X-Barracuda-Spam-Status: No, SCORE=1.60 using per-user scores of TAG_LEVEL=3.5 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=4.0 tests=BSF_RULE7568M, BSF_RULE_7582B, BSF_SC5_MJ1963, DKIM_SIGNED, NO_REAL_NAME, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28743 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_RULE7568M Custom Rule 7568M 0.50 BSF_RULE_7582B Custom Rule 7582B 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Cc: Ben Warren Subject: [ovs-dev] [PATCH v7 1/3] Move lib/ofp-actions.h to include/openvswitch directory X-BeenThere: dev@openvswitch.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dev-bounces@openvswitch.org Sender: "dev" From: Ben Warren Signed-off-by: Ben Warren --- include/openvswitch/automake.mk | 1 + include/openvswitch/ofp-actions.h | 1046 +++++++++++++++++++++++++++++++++++++ lib/automake.mk | 1 - lib/bundle.c | 10 +- lib/learn.c | 8 +- lib/learning-switch.c | 2 +- lib/multipath.c | 8 +- lib/nx-match.c | 10 +- lib/ofp-actions.c | 10 +- lib/ofp-actions.h | 1046 ------------------------------------- lib/ofp-parse.c | 12 +- lib/ofp-print.c | 4 +- lib/ofp-util.c | 2 +- ofproto/bond.c | 21 +- ofproto/bundles.c | 5 +- ofproto/connmgr.c | 9 +- ofproto/fail-open.c | 12 +- ofproto/in-band.c | 8 +- ofproto/ofproto-dpif-rid.h | 4 +- ofproto/ofproto-dpif-xlate.c | 16 +- ofproto/ofproto-dpif.c | 24 +- ofproto/ofproto-provider.h | 4 +- ofproto/ofproto.c | 9 +- ovn/controller/lflow.c | 4 +- ovn/controller/ofctrl.c | 4 +- ovn/controller/physical.c | 8 +- ovn/controller/pinctrl.c | 2 +- ovn/lib/actions.c | 6 +- ovn/lib/expr.c | 6 +- tests/test-bundle.c | 4 +- tests/test-multipath.c | 4 +- tests/test-ovn.c | 8 +- utilities/ovs-ofctl.c | 4 +- 33 files changed, 1158 insertions(+), 1164 deletions(-) create mode 100644 include/openvswitch/ofp-actions.h delete mode 100644 lib/ofp-actions.h diff --git a/include/openvswitch/automake.mk b/include/openvswitch/automake.mk index 3be6962..ae03925 100644 --- a/include/openvswitch/automake.mk +++ b/include/openvswitch/automake.mk @@ -9,6 +9,7 @@ openvswitchinclude_HEADERS = \ include/openvswitch/match.h \ include/openvswitch/meta-flow.h \ include/openvswitch/ofpbuf.h \ + include/openvswitch/ofp-actions.h \ include/openvswitch/ofp-errors.h \ include/openvswitch/ofp-msgs.h \ include/openvswitch/ofp-parse.h \ diff --git a/include/openvswitch/ofp-actions.h b/include/openvswitch/ofp-actions.h new file mode 100644 index 0000000..0608ac1 --- /dev/null +++ b/include/openvswitch/ofp-actions.h @@ -0,0 +1,1046 @@ +/* + * Copyright (c) 2012, 2013, 2014, 2015, 2016 Nicira, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OPENVSWITCH_OFP_ACTIONS_H +#define OPENVSWITCH_OFP_ACTIONS_H 1 + +#include +#include +#include "openflow/openflow.h" +#include "openflow/nicira-ext.h" +#include "openvswitch/meta-flow.h" +#include "openvswitch/ofp-util.h" +#include "openvswitch/ofp-errors.h" +#include "openvswitch/types.h" + +/* List of OVS abstracted actions. + * + * This macro is used directly only internally by this header, but the list is + * still of interest to developers. + * + * Each OFPACT invocation has the following parameters: + * + * 1. , used below in the enum definition of OFPACT_, and + * elsewhere. + * + * 2. corresponding to a structure "struct ", that must be + * defined below. This structure must be an abstract definition of the + * action. Its first member must have type "struct ofpact" and name + * "ofpact". It may be fixed length or end with a flexible array member + * (e.g. "int member[];"). + * + * 3. , which has one of two possible values: + * + * - If "struct " is fixed-length, it must be "ofpact". + * + * - If "struct " is variable-length, it must be the name of the + * flexible array member. + * + * 4. , a quoted string that gives the name of the action, for use in + * parsing actions from text. + */ +#define OFPACTS \ + /* Output. */ \ + OFPACT(OUTPUT, ofpact_output, ofpact, "output") \ + OFPACT(GROUP, ofpact_group, ofpact, "group") \ + OFPACT(CONTROLLER, ofpact_controller, userdata, "controller") \ + OFPACT(ENQUEUE, ofpact_enqueue, ofpact, "enqueue") \ + OFPACT(OUTPUT_REG, ofpact_output_reg, ofpact, "output_reg") \ + OFPACT(BUNDLE, ofpact_bundle, slaves, "bundle") \ + \ + /* Header changes. */ \ + OFPACT(SET_FIELD, ofpact_set_field, ofpact, "set_field") \ + OFPACT(SET_VLAN_VID, ofpact_vlan_vid, ofpact, "set_vlan_vid") \ + OFPACT(SET_VLAN_PCP, ofpact_vlan_pcp, ofpact, "set_vlan_pcp") \ + OFPACT(STRIP_VLAN, ofpact_null, ofpact, "strip_vlan") \ + OFPACT(PUSH_VLAN, ofpact_null, ofpact, "push_vlan") \ + OFPACT(SET_ETH_SRC, ofpact_mac, ofpact, "mod_dl_src") \ + OFPACT(SET_ETH_DST, ofpact_mac, ofpact, "mod_dl_dst") \ + OFPACT(SET_IPV4_SRC, ofpact_ipv4, ofpact, "mod_nw_src") \ + OFPACT(SET_IPV4_DST, ofpact_ipv4, ofpact, "mod_nw_dst") \ + OFPACT(SET_IP_DSCP, ofpact_dscp, ofpact, "mod_nw_tos") \ + OFPACT(SET_IP_ECN, ofpact_ecn, ofpact, "mod_nw_ecn") \ + OFPACT(SET_IP_TTL, ofpact_ip_ttl, ofpact, "mod_nw_ttl") \ + OFPACT(SET_L4_SRC_PORT, ofpact_l4_port, ofpact, "mod_tp_src") \ + OFPACT(SET_L4_DST_PORT, ofpact_l4_port, ofpact, "mod_tp_dst") \ + OFPACT(REG_MOVE, ofpact_reg_move, ofpact, "move") \ + OFPACT(STACK_PUSH, ofpact_stack, ofpact, "push") \ + OFPACT(STACK_POP, ofpact_stack, ofpact, "pop") \ + OFPACT(DEC_TTL, ofpact_cnt_ids, cnt_ids, "dec_ttl") \ + OFPACT(SET_MPLS_LABEL, ofpact_mpls_label, ofpact, "set_mpls_label") \ + OFPACT(SET_MPLS_TC, ofpact_mpls_tc, ofpact, "set_mpls_tc") \ + OFPACT(SET_MPLS_TTL, ofpact_mpls_ttl, ofpact, "set_mpls_ttl") \ + OFPACT(DEC_MPLS_TTL, ofpact_null, ofpact, "dec_mpls_ttl") \ + OFPACT(PUSH_MPLS, ofpact_push_mpls, ofpact, "push_mpls") \ + OFPACT(POP_MPLS, ofpact_pop_mpls, ofpact, "pop_mpls") \ + \ + /* Metadata. */ \ + OFPACT(SET_TUNNEL, ofpact_tunnel, ofpact, "set_tunnel") \ + OFPACT(SET_QUEUE, ofpact_queue, ofpact, "set_queue") \ + OFPACT(POP_QUEUE, ofpact_null, ofpact, "pop_queue") \ + OFPACT(FIN_TIMEOUT, ofpact_fin_timeout, ofpact, "fin_timeout") \ + \ + /* Flow table interaction. */ \ + OFPACT(RESUBMIT, ofpact_resubmit, ofpact, "resubmit") \ + OFPACT(LEARN, ofpact_learn, specs, "learn") \ + OFPACT(CONJUNCTION, ofpact_conjunction, ofpact, "conjunction") \ + \ + /* Arithmetic. */ \ + OFPACT(MULTIPATH, ofpact_multipath, ofpact, "multipath") \ + \ + /* Other. */ \ + OFPACT(NOTE, ofpact_note, data, "note") \ + OFPACT(EXIT, ofpact_null, ofpact, "exit") \ + OFPACT(SAMPLE, ofpact_sample, ofpact, "sample") \ + OFPACT(UNROLL_XLATE, ofpact_unroll_xlate, ofpact, "unroll_xlate") \ + OFPACT(CT, ofpact_conntrack, ofpact, "ct") \ + OFPACT(NAT, ofpact_nat, ofpact, "nat") \ + \ + /* Debugging actions. \ + * \ + * These are intentionally undocumented, subject to change, and \ + * only accepted if ovs-vswitchd is started with --enable-dummy. */ \ + OFPACT(DEBUG_RECIRC, ofpact_null, ofpact, "debug_recirc") \ + \ + /* Instructions. */ \ + OFPACT(METER, ofpact_meter, ofpact, "meter") \ + OFPACT(CLEAR_ACTIONS, ofpact_null, ofpact, "clear_actions") \ + OFPACT(WRITE_ACTIONS, ofpact_nest, ofpact, "write_actions") \ + OFPACT(WRITE_METADATA, ofpact_metadata, ofpact, "write_metadata") \ + OFPACT(GOTO_TABLE, ofpact_goto_table, ofpact, "goto_table") + +/* enum ofpact_type, with a member OFPACT_ for each action. */ +enum OVS_PACKED_ENUM ofpact_type { +#define OFPACT(ENUM, STRUCT, MEMBER, NAME) OFPACT_##ENUM, + OFPACTS +#undef OFPACT +}; + +/* Define N_OFPACTS to the number of types of ofpacts. */ +enum { +#define OFPACT(ENUM, STRUCT, MEMBER, NAME) + 1 + N_OFPACTS = OFPACTS +#undef OFPACT +}; + +/* Header for an action. + * + * Each action is a structure "struct ofpact_*" that begins with "struct + * ofpact", usually followed by other data that describes the action. Actions + * are padded out to a multiple of OFPACT_ALIGNTO bytes in length. + * + * The 'raw' member is special: + * + * - Most "struct ofpact"s correspond to one particular kind of OpenFlow + * action, at least in a given OpenFlow version. For example, + * OFPACT_SET_VLAN_VID corresponds to OFPAT10_SET_VLAN_VID in OpenFlow + * 1.0. + * + * For such actions, the 'raw' member is not meaningful and generally + * should be zero. + * + * - A few "struct ofpact"s correspond to multiple OpenFlow actions. For + * example, OFPACT_SET_TUNNEL can be NXAST_SET_TUNNEL or + * NXAST_SET_TUNNEL64. In these cases, if the "struct ofpact" originated + * from OpenFlow, then we want to make sure that, if it gets translated + * back to OpenFlow later, it is translated back to the same action type. + * (Otherwise, we'd violate the promise made in DESIGN, in the "Action + * Reproduction" section.) + * + * For such actions, the 'raw' member should be the "enum ofp_raw_action" + * originally extracted from the OpenFlow action. (If the action didn't + * originate from OpenFlow, then setting 'raw' to zero should be fine: + * code to translate the ofpact to OpenFlow must tolerate this case.) + */ +struct ofpact { + /* We want the space advantage of an 8-bit type here on every + * implementation, without giving up the advantage of having a useful type + * on implementations that support packed enums. */ +#ifdef HAVE_PACKED_ENUM + enum ofpact_type type; /* OFPACT_*. */ +#else + uint8_t type; /* OFPACT_* */ +#endif + + uint8_t raw; /* Original type when added, if any. */ + uint16_t len; /* Length of the action, in bytes, including + * struct ofpact, excluding padding. */ +}; +BUILD_ASSERT_DECL(sizeof(struct ofpact) == 4); + +/* Alignment. */ +#define OFPACT_ALIGNTO 8 +#define OFPACT_ALIGN(SIZE) ROUND_UP(SIZE, OFPACT_ALIGNTO) + +/* Expands to an anonymous union that contains: + * + * - MEMBERS in a nested anonymous struct. + * + * - An array as large as MEMBERS plus padding to a multiple of 8 bytes. + * + * The effect is to pad MEMBERS to a multiple of 8 bytes. */ +#define OFPACT_PADDED_MEMBERS(MEMBERS) \ + union { \ + struct { MEMBERS }; \ + uint8_t pad[OFPACT_ALIGN(sizeof(struct { MEMBERS }))]; \ + } + +/* Returns the ofpact following 'ofpact'. */ +static inline struct ofpact * +ofpact_next(const struct ofpact *ofpact) +{ + return (void *) ((uint8_t *) ofpact + OFPACT_ALIGN(ofpact->len)); +} + +struct ofpact *ofpact_next_flattened(const struct ofpact *); + +static inline struct ofpact * +ofpact_end(const struct ofpact *ofpacts, size_t ofpacts_len) +{ + return (void *) ((uint8_t *) ofpacts + ofpacts_len); +} + +/* Assigns POS to each ofpact, in turn, in the OFPACTS_LEN bytes of ofpacts + * starting at OFPACTS. */ +#define OFPACT_FOR_EACH(POS, OFPACTS, OFPACTS_LEN) \ + for ((POS) = (OFPACTS); (POS) < ofpact_end(OFPACTS, OFPACTS_LEN); \ + (POS) = ofpact_next(POS)) + +/* Assigns POS to each ofpact, in turn, in the OFPACTS_LEN bytes of ofpacts + * starting at OFPACTS. + * + * For ofpacts that contain nested ofpacts, this visits each of the inner + * ofpacts as well. */ +#define OFPACT_FOR_EACH_FLATTENED(POS, OFPACTS, OFPACTS_LEN) \ + for ((POS) = (OFPACTS); (POS) < ofpact_end(OFPACTS, OFPACTS_LEN); \ + (POS) = ofpact_next_flattened(POS)) + +/* Action structure for each OFPACT_*. */ + +/* OFPACT_STRIP_VLAN, OFPACT_POP_QUEUE, OFPACT_EXIT, OFPACT_CLEAR_ACTIONS. + * + * Used for OFPAT10_STRIP_VLAN, NXAST_POP_QUEUE, NXAST_EXIT, + * OFPAT11_POP_VLAN, OFPIT11_CLEAR_ACTIONS. + * + * Action structure for actions that do not have any extra data beyond the + * action type. */ +struct ofpact_null { + struct ofpact ofpact; +}; + +/* OFPACT_OUTPUT. + * + * Used for OFPAT10_OUTPUT. */ +struct ofpact_output { + struct ofpact ofpact; + ofp_port_t port; /* Output port. */ + uint16_t max_len; /* Max send len, for port OFPP_CONTROLLER. */ +}; + +/* OFPACT_CONTROLLER. + * + * Used for NXAST_CONTROLLER. */ +struct ofpact_controller { + OFPACT_PADDED_MEMBERS( + struct ofpact ofpact; + uint16_t max_len; /* Max length to send to controller. */ + uint16_t controller_id; /* Controller ID to send packet-in. */ + enum ofp_packet_in_reason reason; /* Reason to put in packet-in. */ + + /* If true, this action freezes packet traversal of the OpenFlow + * tables and adds a continuation to the packet-in message, that + * a controller can use to resume that traversal. */ + bool pause; + + /* Arbitrary data to include in the packet-in message (currently, + * only in NXT_PACKET_IN2). */ + uint16_t userdata_len; + ); + uint8_t userdata[0]; +}; + +/* OFPACT_ENQUEUE. + * + * Used for OFPAT10_ENQUEUE. */ +struct ofpact_enqueue { + struct ofpact ofpact; + ofp_port_t port; + uint32_t queue; +}; + +/* OFPACT_OUTPUT_REG. + * + * Used for NXAST_OUTPUT_REG. */ +struct ofpact_output_reg { + struct ofpact ofpact; + uint16_t max_len; + struct mf_subfield src; +}; + +/* Bundle slave choice algorithm to apply. + * + * In the descriptions below, 'slaves' is the list of possible slaves in the + * order they appear in the OpenFlow action. */ +enum nx_bd_algorithm { + /* Chooses the first live slave listed in the bundle. + * + * O(n_slaves) performance. */ + NX_BD_ALG_ACTIVE_BACKUP = 0, + + /* Highest Random Weight. + * + * for i in [0,n_slaves): + * weights[i] = hash(flow, i) + * slave = { slaves[i] such that weights[i] >= weights[j] for all j != i } + * + * Redistributes 1/n_slaves of traffic when a slave's liveness changes. + * O(n_slaves) performance. + * + * Uses the 'fields' and 'basis' parameters. */ + NX_BD_ALG_HRW = 1 +}; + +/* OFPACT_BUNDLE. + * + * Used for NXAST_BUNDLE. */ +struct ofpact_bundle { + struct ofpact ofpact; + + /* Slave choice algorithm to apply to hash value. */ + enum nx_bd_algorithm algorithm; + + /* What fields to hash and how. */ + enum nx_hash_fields fields; + uint16_t basis; /* Universal hash parameter. */ + + struct mf_subfield dst; + + /* Slaves for output. */ + unsigned int n_slaves; + ofp_port_t slaves[]; +}; + +/* OFPACT_SET_VLAN_VID. + * + * We keep track if vlan was present at action validation time to avoid a + * PUSH_VLAN when translating to OpenFlow 1.1+. + * + * We also keep the originating OFPUTIL action code in ofpact.compat. + * + * Used for OFPAT10_SET_VLAN_VID and OFPAT11_SET_VLAN_VID. */ +struct ofpact_vlan_vid { + struct ofpact ofpact; + uint16_t vlan_vid; /* VLAN VID in low 12 bits, 0 in other bits. */ + bool push_vlan_if_needed; /* OF 1.0 semantics if true. */ + bool flow_has_vlan; /* VLAN present at action validation time? */ +}; + +/* OFPACT_SET_VLAN_PCP. + * + * We keep track if vlan was present at action validation time to avoid a + * PUSH_VLAN when translating to OpenFlow 1.1+. + * + * We also keep the originating OFPUTIL action code in ofpact.compat. + * + * Used for OFPAT10_SET_VLAN_PCP and OFPAT11_SET_VLAN_PCP. */ +struct ofpact_vlan_pcp { + struct ofpact ofpact; + uint8_t vlan_pcp; /* VLAN PCP in low 3 bits, 0 in other bits. */ + bool push_vlan_if_needed; /* OF 1.0 semantics if true. */ + bool flow_has_vlan; /* VLAN present at action validation time? */ +}; + +/* OFPACT_SET_ETH_SRC, OFPACT_SET_ETH_DST. + * + * Used for OFPAT10_SET_DL_SRC, OFPAT10_SET_DL_DST. */ +struct ofpact_mac { + struct ofpact ofpact; + struct eth_addr mac; +}; + +/* OFPACT_SET_IPV4_SRC, OFPACT_SET_IPV4_DST. + * + * Used for OFPAT10_SET_NW_SRC, OFPAT10_SET_NW_DST. */ +struct ofpact_ipv4 { + struct ofpact ofpact; + ovs_be32 ipv4; +}; + +/* OFPACT_SET_IP_DSCP. + * + * Used for OFPAT10_SET_NW_TOS. */ +struct ofpact_dscp { + struct ofpact ofpact; + uint8_t dscp; /* DSCP in high 6 bits, rest ignored. */ +}; + +/* OFPACT_SET_IP_ECN. + * + * Used for OFPAT11_SET_NW_ECN. */ +struct ofpact_ecn { + struct ofpact ofpact; + uint8_t ecn; /* ECN in low 2 bits, rest ignored. */ +}; + +/* OFPACT_SET_IP_TTL. + * + * Used for OFPAT11_SET_NW_TTL. */ +struct ofpact_ip_ttl { + struct ofpact ofpact; + uint8_t ttl; +}; + +/* OFPACT_SET_L4_SRC_PORT, OFPACT_SET_L4_DST_PORT. + * + * Used for OFPAT10_SET_TP_SRC, OFPAT10_SET_TP_DST. */ +struct ofpact_l4_port { + struct ofpact ofpact; + uint16_t port; /* TCP, UDP or SCTP port number. */ + uint8_t flow_ip_proto; /* IP proto from corresponding match, or 0 */ +}; + +/* OFPACT_REG_MOVE. + * + * Used for NXAST_REG_MOVE. */ +struct ofpact_reg_move { + struct ofpact ofpact; + struct mf_subfield src; + struct mf_subfield dst; +}; + +/* OFPACT_STACK_PUSH. + * + * Used for NXAST_STACK_PUSH and NXAST_STACK_POP. */ +struct ofpact_stack { + struct ofpact ofpact; + struct mf_subfield subfield; +}; + +/* OFPACT_SET_FIELD. + * + * Used for NXAST_REG_LOAD and OFPAT12_SET_FIELD. */ +struct ofpact_set_field { + struct ofpact ofpact; + const struct mf_field *field; + bool flow_has_vlan; /* VLAN present at action validation time. */ + union mf_value value; + union mf_value mask; +}; + +/* OFPACT_PUSH_VLAN/MPLS/PBB + * + * Used for NXAST_PUSH_MPLS, OFPAT11_PUSH_MPLS. */ +struct ofpact_push_mpls { + struct ofpact ofpact; + ovs_be16 ethertype; +}; + +/* OFPACT_POP_MPLS + * + * Used for NXAST_POP_MPLS, OFPAT11_POP_MPLS.. */ +struct ofpact_pop_mpls { + struct ofpact ofpact; + ovs_be16 ethertype; +}; + +/* OFPACT_SET_TUNNEL. + * + * Used for NXAST_SET_TUNNEL, NXAST_SET_TUNNEL64. */ +struct ofpact_tunnel { + struct ofpact ofpact; + uint64_t tun_id; +}; + +/* OFPACT_SET_QUEUE. + * + * Used for NXAST_SET_QUEUE. */ +struct ofpact_queue { + struct ofpact ofpact; + uint32_t queue_id; +}; + +/* OFPACT_FIN_TIMEOUT. + * + * Used for NXAST_FIN_TIMEOUT. */ +struct ofpact_fin_timeout { + struct ofpact ofpact; + uint16_t fin_idle_timeout; + uint16_t fin_hard_timeout; +}; + +/* OFPACT_WRITE_METADATA. + * + * Used for NXAST_WRITE_METADATA. */ +struct ofpact_metadata { + struct ofpact ofpact; + ovs_be64 metadata; + ovs_be64 mask; +}; + +/* OFPACT_METER. + * + * Used for OFPIT13_METER. */ +struct ofpact_meter { + struct ofpact ofpact; + uint32_t meter_id; +}; + +/* OFPACT_WRITE_ACTIONS. + * + * Used for OFPIT11_WRITE_ACTIONS. */ +struct ofpact_nest { + OFPACT_PADDED_MEMBERS(struct ofpact ofpact;); + struct ofpact actions[]; +}; +BUILD_ASSERT_DECL(offsetof(struct ofpact_nest, actions) % OFPACT_ALIGNTO == 0); +BUILD_ASSERT_DECL(offsetof(struct ofpact_nest, actions) + == sizeof(struct ofpact_nest)); + +/* Bits for 'flags' in struct nx_action_conntrack. + * + * If NX_CT_F_COMMIT is set, then the connection entry is moved from the + * unconfirmed to confirmed list in the tracker. */ +enum nx_conntrack_flags { + NX_CT_F_COMMIT = 1 << 0, +}; + +/* Magic value for struct nx_action_conntrack 'recirc_table' field, to specify + * that the packet should not be recirculated. */ +#define NX_CT_RECIRC_NONE OFPTT_ALL + +#if !defined(IPPORT_FTP) +#define IPPORT_FTP 21 +#endif + +/* OFPACT_CT. + * + * Used for NXAST_CT. */ +struct ofpact_conntrack { + OFPACT_PADDED_MEMBERS( + struct ofpact ofpact; + uint16_t flags; + uint16_t zone_imm; + struct mf_subfield zone_src; + uint16_t alg; + uint8_t recirc_table; + ); + struct ofpact actions[0]; +}; +BUILD_ASSERT_DECL(offsetof(struct ofpact_conntrack, actions) + % OFPACT_ALIGNTO == 0); +BUILD_ASSERT_DECL(offsetof(struct ofpact_conntrack, actions) + == sizeof(struct ofpact_conntrack)); + +static inline size_t +ofpact_ct_get_action_len(const struct ofpact_conntrack *oc) +{ + return oc->ofpact.len - offsetof(struct ofpact_conntrack, actions); +} + +static inline size_t +ofpact_nest_get_action_len(const struct ofpact_nest *on) +{ + return on->ofpact.len - offsetof(struct ofpact_nest, actions); +} + +void ofpacts_execute_action_set(struct ofpbuf *action_list, + const struct ofpbuf *action_set); + +/* Bits for 'flags' in struct nx_action_nat. + */ +enum nx_nat_flags { + NX_NAT_F_SRC = 1 << 0, + NX_NAT_F_DST = 1 << 1, + NX_NAT_F_PERSISTENT = 1 << 2, + NX_NAT_F_PROTO_HASH = 1 << 3, + NX_NAT_F_PROTO_RANDOM = 1 << 4, +}; + +/* OFPACT_NAT. + * + * Used for NXAST_NAT. */ +struct ofpact_nat { + struct ofpact ofpact; + uint8_t range_af; /* AF_UNSPEC, AF_INET, or AF_INET6 */ + uint16_t flags; /* NX_NAT_F_* */ + struct { + struct { + uint16_t min; + uint16_t max; + } proto; + union { + struct { + ovs_be32 min; + ovs_be32 max; + } ipv4; + struct { + struct in6_addr min; + struct in6_addr max; + } ipv6; + } addr; + } range; +}; + + +/* OFPACT_RESUBMIT. + * + * Used for NXAST_RESUBMIT, NXAST_RESUBMIT_TABLE. */ +struct ofpact_resubmit { + struct ofpact ofpact; + ofp_port_t in_port; + uint8_t table_id; +}; + +/* Part of struct ofpact_learn, below. */ +struct ofpact_learn_spec { + int n_bits; /* Number of bits in source and dest. */ + + int src_type; /* One of NX_LEARN_SRC_*. */ + struct mf_subfield src; /* NX_LEARN_SRC_FIELD only. */ + union mf_subvalue src_imm; /* NX_LEARN_SRC_IMMEDIATE only. */ + + int dst_type; /* One of NX_LEARN_DST_*. */ + struct mf_subfield dst; /* NX_LEARN_DST_MATCH, NX_LEARN_DST_LOAD only. */ +}; + + +/* Bits for 'flags' in struct nx_action_learn. + * + * If NX_LEARN_F_SEND_FLOW_REM is set, then the learned flows will have their + * OFPFF_SEND_FLOW_REM flag set. + * + * If NX_LEARN_F_DELETE_LEARNED is set, then removing this action will delete + * all the flows from the learn action's 'table_id' that have the learn + * action's 'cookie'. Important points: + * + * - The deleted flows include those created by this action, those created + * by other learn actions with the same 'table_id' and 'cookie', those + * created by flow_mod requests by a controller in the specified table + * with the specified cookie, and those created through any other + * means. + * + * - If multiple flows specify "learn" actions with + * NX_LEARN_F_DELETE_LEARNED with the same 'table_id' and 'cookie', then + * no deletion occurs until all of those "learn" actions are deleted. + * + * - Deleting a flow that contains a learn action is the most obvious way + * to delete a learn action. Modifying a flow's actions, or replacing it + * by a new flow, can also delete a learn action. Finally, replacing a + * learn action with NX_LEARN_F_DELETE_LEARNED with a learn action + * without that flag also effectively deletes the learn action and can + * trigger flow deletion. + * + * NX_LEARN_F_DELETE_LEARNED was added in Open vSwitch 2.4. */ +enum nx_learn_flags { + NX_LEARN_F_SEND_FLOW_REM = 1 << 0, + NX_LEARN_F_DELETE_LEARNED = 1 << 1, +}; + +#define NX_LEARN_N_BITS_MASK 0x3ff + +#define NX_LEARN_SRC_FIELD (0 << 13) /* Copy from field. */ +#define NX_LEARN_SRC_IMMEDIATE (1 << 13) /* Copy from immediate value. */ +#define NX_LEARN_SRC_MASK (1 << 13) + +#define NX_LEARN_DST_MATCH (0 << 11) /* Add match criterion. */ +#define NX_LEARN_DST_LOAD (1 << 11) /* Add NXAST_REG_LOAD action. */ +#define NX_LEARN_DST_OUTPUT (2 << 11) /* Add OFPAT_OUTPUT action. */ +#define NX_LEARN_DST_RESERVED (3 << 11) /* Not yet defined. */ +#define NX_LEARN_DST_MASK (3 << 11) + +/* OFPACT_LEARN. + * + * Used for NXAST_LEARN. */ +struct ofpact_learn { + struct ofpact ofpact; + + uint16_t idle_timeout; /* Idle time before discarding (seconds). */ + uint16_t hard_timeout; /* Max time before discarding (seconds). */ + uint16_t priority; /* Priority level of flow entry. */ + uint8_t table_id; /* Table to insert flow entry. */ + ovs_be64 cookie; /* Cookie for new flow. */ + enum nx_learn_flags flags; /* NX_LEARN_F_*. */ + uint16_t fin_idle_timeout; /* Idle timeout after FIN, if nonzero. */ + uint16_t fin_hard_timeout; /* Hard timeout after FIN, if nonzero. */ + + unsigned int n_specs; + struct ofpact_learn_spec specs[]; +}; + +/* Multipath link choice algorithm to apply. + * + * In the descriptions below, 'n_links' is max_link + 1. */ +enum nx_mp_algorithm { + /* link = hash(flow) % n_links. + * + * Redistributes all traffic when n_links changes. O(1) performance. See + * RFC 2992. + * + * Use UINT16_MAX for max_link to get a raw hash value. */ + NX_MP_ALG_MODULO_N = 0, + + /* link = hash(flow) / (MAX_HASH / n_links). + * + * Redistributes between one-quarter and one-half of traffic when n_links + * changes. O(1) performance. See RFC 2992. + */ + NX_MP_ALG_HASH_THRESHOLD = 1, + + /* Highest Random Weight. + * + * for i in [0,n_links): + * weights[i] = hash(flow, i) + * link = { i such that weights[i] >= weights[j] for all j != i } + * + * Redistributes 1/n_links of traffic when n_links changes. O(n_links) + * performance. If n_links is greater than a threshold (currently 64, but + * subject to change), Open vSwitch will substitute another algorithm + * automatically. See RFC 2992. */ + NX_MP_ALG_HRW = 2, + + /* Iterative Hash. + * + * i = 0 + * repeat: + * i = i + 1 + * link = hash(flow, i) % arg + * while link > max_link + * + * Redistributes 1/n_links of traffic when n_links changes. O(1) + * performance when arg/max_link is bounded by a constant. + * + * Redistributes all traffic when arg changes. + * + * arg must be greater than max_link and for best performance should be no + * more than approximately max_link * 2. If arg is outside the acceptable + * range, Open vSwitch will automatically substitute the least power of 2 + * greater than max_link. + * + * This algorithm is specific to Open vSwitch. + */ + NX_MP_ALG_ITER_HASH = 3, +}; + +/* OFPACT_CONJUNCTION. + * + * Used for NXAST_CONJUNCTION. */ +struct ofpact_conjunction { + struct ofpact ofpact; + uint8_t clause; + uint8_t n_clauses; + uint32_t id; +}; + +/* OFPACT_MULTIPATH. + * + * Used for NXAST_MULTIPATH. */ +struct ofpact_multipath { + struct ofpact ofpact; + + /* What fields to hash and how. */ + enum nx_hash_fields fields; + uint16_t basis; /* Universal hash parameter. */ + + /* Multipath link choice algorithm to apply to hash value. */ + enum nx_mp_algorithm algorithm; + uint16_t max_link; /* Number of output links, minus 1. */ + uint32_t arg; /* Algorithm-specific argument. */ + + /* Where to store the result. */ + struct mf_subfield dst; +}; + +/* OFPACT_NOTE. + * + * Used for NXAST_NOTE. */ +struct ofpact_note { + struct ofpact ofpact; + size_t length; + uint8_t data[]; +}; + +/* OFPACT_SAMPLE. + * + * Used for NXAST_SAMPLE. */ +struct ofpact_sample { + struct ofpact ofpact; + uint16_t probability; // Always >0. + uint32_t collector_set_id; + uint32_t obs_domain_id; + uint32_t obs_point_id; +}; + +/* OFPACT_DEC_TTL. + * + * Used for OFPAT11_DEC_NW_TTL, NXAST_DEC_TTL and NXAST_DEC_TTL_CNT_IDS. */ +struct ofpact_cnt_ids { + struct ofpact ofpact; + + /* Controller ids. */ + unsigned int n_controllers; + uint16_t cnt_ids[]; +}; + +/* OFPACT_SET_MPLS_LABEL. + * + * Used for OFPAT11_SET_MPLS_LABEL and NXAST_SET_MPLS_LABEL */ +struct ofpact_mpls_label { + struct ofpact ofpact; + + ovs_be32 label; +}; + +/* OFPACT_SET_MPLS_TC. + * + * Used for OFPAT11_SET_MPLS_TC and NXAST_SET_MPLS_TC */ +struct ofpact_mpls_tc { + struct ofpact ofpact; + + uint8_t tc; +}; + +/* OFPACT_SET_MPLS_TTL. + * + * Used for OFPAT11_SET_MPLS_TTL and NXAST_SET_MPLS_TTL */ +struct ofpact_mpls_ttl { + struct ofpact ofpact; + + uint8_t ttl; +}; + +/* OFPACT_GOTO_TABLE + * + * Used for OFPIT11_GOTO_TABLE */ +struct ofpact_goto_table { + struct ofpact ofpact; + uint8_t table_id; +}; + +/* OFPACT_GROUP. + * + * Used for OFPAT11_GROUP. */ +struct ofpact_group { + struct ofpact ofpact; + uint32_t group_id; +}; + +/* OFPACT_UNROLL_XLATE. + * + * Used only internally. */ +struct ofpact_unroll_xlate { + struct ofpact ofpact; + + /* Metadata in xlate context, visible to controller via PACKET_INs. */ + uint8_t rule_table_id; /* 0xFF if none. */ + ovs_be64 rule_cookie; /* OVS_BE64_MAX if none. */ +}; + +/* Converting OpenFlow to ofpacts. */ +enum ofperr ofpacts_pull_openflow_actions(struct ofpbuf *openflow, + unsigned int actions_len, + enum ofp_version version, + struct ofpbuf *ofpacts); +enum ofperr ofpacts_pull_openflow_instructions(struct ofpbuf *openflow, + unsigned int instructions_len, + enum ofp_version version, + struct ofpbuf *ofpacts); +enum ofperr ofpacts_check(struct ofpact[], size_t ofpacts_len, + struct flow *, ofp_port_t max_ports, + uint8_t table_id, uint8_t n_tables, + enum ofputil_protocol *usable_protocols); +enum ofperr ofpacts_check_consistency(struct ofpact[], size_t ofpacts_len, + struct flow *, ofp_port_t max_ports, + uint8_t table_id, uint8_t n_tables, + enum ofputil_protocol usable_protocols); +enum ofperr ofpact_check_output_port(ofp_port_t port, ofp_port_t max_ports); + +/* Converting ofpacts to OpenFlow. */ +size_t ofpacts_put_openflow_actions(const struct ofpact[], size_t ofpacts_len, + struct ofpbuf *openflow, enum ofp_version); +void ofpacts_put_openflow_instructions(const struct ofpact[], + size_t ofpacts_len, + struct ofpbuf *openflow, + enum ofp_version ofp_version); + +/* Sets of supported actions. */ +ovs_be32 ofpact_bitmap_to_openflow(uint64_t ofpacts_bitmap, enum ofp_version); +uint64_t ofpact_bitmap_from_openflow(ovs_be32 ofpat_bitmap, enum ofp_version); +void ofpact_bitmap_format(uint64_t ofpacts_bitmap, struct ds *); + +/* Working with ofpacts. */ +bool ofpacts_output_to_port(const struct ofpact[], size_t ofpacts_len, + ofp_port_t port); +bool ofpacts_output_to_group(const struct ofpact[], size_t ofpacts_len, + uint32_t group_id); +bool ofpacts_equal(const struct ofpact a[], size_t a_len, + const struct ofpact b[], size_t b_len); +const struct mf_field *ofpact_get_mf_dst(const struct ofpact *ofpact); +uint32_t ofpacts_get_meter(const struct ofpact[], size_t ofpacts_len); + +/* Formatting and parsing ofpacts. */ +void ofpacts_format(const struct ofpact[], size_t ofpacts_len, struct ds *); +char *ofpacts_parse_actions(const char *, struct ofpbuf *ofpacts, + enum ofputil_protocol *usable_protocols) + OVS_WARN_UNUSED_RESULT; +char *ofpacts_parse_instructions(const char *, struct ofpbuf *ofpacts, + enum ofputil_protocol *usable_protocols) + OVS_WARN_UNUSED_RESULT; +const char *ofpact_name(enum ofpact_type); + +/* Internal use by the helpers below. */ +void ofpact_init(struct ofpact *, enum ofpact_type, size_t len); +void *ofpact_put(struct ofpbuf *, enum ofpact_type, size_t len); +void *ofpact_finish(struct ofpbuf *, struct ofpact *); + +/* For each OFPACT_ with a corresponding struct , this defines + * the following commonly useful functions: + * + * struct *ofpact_put_(struct ofpbuf *ofpacts); + * + * Appends a new 'ofpact', of length OFPACT__SIZE, to 'ofpacts', + * initializes it with ofpact_init_(), and returns it. Also sets + * 'ofpacts->header' to the returned action. + * + * After using this function to add a variable-length action, add the + * elements of the flexible array (e.g. with ofpbuf_put()), then use + * ofpact_finish() to pad the action to a multiple of OFPACT_ALIGNTO bytes + * and update its embedded length field. (Keep in mind the need to refresh + * the structure from 'ofpacts->header' after adding data to 'ofpacts'.) + * + * struct *ofpact_get_(const struct ofpact *ofpact); + * + * Returns 'ofpact' cast to "struct *". 'ofpact->type' must be + * OFPACT_. + * + * void ofpact_finish_(struct ofpbuf *ofpacts, struct **ap); + * + * Finishes composing variable-length action '*ap' (begun using + * ofpact_put_() on 'ofpacts'), by padding the action to a multiple + * of OFPACT_ALIGNTO bytes and updating its embedded length field. + * + * May reallocate 'ofpacts', and so as a convenience automatically updates + * '*ap' to point to the new location. If the caller has other pointers + * within 'ap' or 'ofpacts', it needs to update them manually. + * + * as well as the following more rarely useful definitions: + * + * void ofpact_init_(struct *ofpact); + * + * Initializes the parts of 'ofpact' that identify it as having type + * OFPACT_ and length OFPACT__SIZE and zeros the rest. + * + * _SIZE + * + * The size of the action structure. For a fixed-length action, this is + * sizeof(struct ) rounded up to a multiple of OFPACT_ALIGNTO. For + * a variable-length action, this is the offset to the variable-length + * part. + */ +#define OFPACT(ENUM, STRUCT, MEMBER, NAME) \ + BUILD_ASSERT_DECL(offsetof(struct STRUCT, ofpact) == 0); \ + \ + enum { OFPACT_##ENUM##_SIZE \ + = (offsetof(struct STRUCT, MEMBER) \ + ? offsetof(struct STRUCT, MEMBER) \ + : OFPACT_ALIGN(sizeof(struct STRUCT))) }; \ + \ + static inline struct STRUCT * \ + ofpact_get_##ENUM(const struct ofpact *ofpact) \ + { \ + ovs_assert(ofpact->type == OFPACT_##ENUM); \ + return ALIGNED_CAST(struct STRUCT *, ofpact); \ + } \ + \ + static inline struct STRUCT * \ + ofpact_put_##ENUM(struct ofpbuf *ofpacts) \ + { \ + return ofpact_put(ofpacts, OFPACT_##ENUM, \ + OFPACT_##ENUM##_SIZE); \ + } \ + \ + static inline void \ + ofpact_init_##ENUM(struct STRUCT *ofpact) \ + { \ + ofpact_init(&ofpact->ofpact, OFPACT_##ENUM, \ + OFPACT_##ENUM##_SIZE); \ + } \ + \ + static inline void \ + ofpact_finish_##ENUM(struct ofpbuf *ofpbuf, struct STRUCT **ofpactp) \ + { \ + struct ofpact *ofpact = &(*ofpactp)->ofpact; \ + ovs_assert(ofpact->type == OFPACT_##ENUM); \ + *ofpactp = ofpact_finish(ofpbuf, ofpact); \ + } +OFPACTS +#undef OFPACT + +/* Additional functions for composing ofpacts. */ +struct ofpact_set_field *ofpact_put_reg_load(struct ofpbuf *ofpacts); + +/* OpenFlow 1.1 instructions. + * The order is sorted in execution order. Not in the value of OFPIT11_xxx. + * It is enforced on parser from text string. + */ +#define OVS_INSTRUCTIONS \ + DEFINE_INST(OFPIT13_METER, \ + ofp13_instruction_meter, false, \ + "meter") \ + \ + DEFINE_INST(OFPIT11_APPLY_ACTIONS, \ + ofp11_instruction_actions, true, \ + "apply_actions") \ + \ + DEFINE_INST(OFPIT11_CLEAR_ACTIONS, \ + ofp11_instruction, false, \ + "clear_actions") \ + \ + DEFINE_INST(OFPIT11_WRITE_ACTIONS, \ + ofp11_instruction_actions, true, \ + "write_actions") \ + \ + DEFINE_INST(OFPIT11_WRITE_METADATA, \ + ofp11_instruction_write_metadata, false, \ + "write_metadata") \ + \ + DEFINE_INST(OFPIT11_GOTO_TABLE, \ + ofp11_instruction_goto_table, false, \ + "goto_table") + +enum ovs_instruction_type { +#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) OVSINST_##ENUM, + OVS_INSTRUCTIONS +#undef DEFINE_INST +}; + +enum { +#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) + 1 + N_OVS_INSTRUCTIONS = OVS_INSTRUCTIONS +#undef DEFINE_INST +}; + +const char *ovs_instruction_name_from_type(enum ovs_instruction_type type); +int ovs_instruction_type_from_name(const char *name); +enum ovs_instruction_type ovs_instruction_type_from_ofpact_type( + enum ofpact_type); +enum ofperr ovs_instruction_type_from_inst_type( + enum ovs_instruction_type *instruction_type, const uint16_t inst_type); + +ovs_be32 ovsinst_bitmap_to_openflow(uint32_t ovsinst_bitmap, enum ofp_version); +uint32_t ovsinst_bitmap_from_openflow(ovs_be32 ofpit_bitmap, + enum ofp_version); + +#endif /* ofp-actions.h */ diff --git a/lib/automake.mk b/lib/automake.mk index bc8b3f4..bc90513 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -138,7 +138,6 @@ lib_libopenvswitch_la_SOURCES = \ lib/odp-util.c \ lib/odp-util.h \ lib/ofp-actions.c \ - lib/ofp-actions.h \ lib/ofp-errors.c \ lib/ofp-msgs.c \ lib/ofp-parse.c \ diff --git a/lib/bundle.c b/lib/bundle.c index 022ac68..eaaf068 100644 --- a/lib/bundle.c +++ b/lib/bundle.c @@ -21,15 +21,15 @@ #include #include "colors.h" -#include "openvswitch/dynamic-string.h" #include "multipath.h" -#include "openvswitch/meta-flow.h" #include "nx-match.h" -#include "openvswitch/ofpbuf.h" -#include "ofp-actions.h" -#include "openvswitch/ofp-util.h" #include "openflow/nicira-ext.h" +#include "openvswitch/dynamic-string.h" +#include "openvswitch/meta-flow.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-errors.h" +#include "openvswitch/ofp-util.h" +#include "openvswitch/ofpbuf.h" #include "openvswitch/vlog.h" VLOG_DEFINE_THIS_MODULE(bundle); diff --git a/lib/learn.c b/lib/learn.c index fca49a3..33d4169 100644 --- a/lib/learn.c +++ b/lib/learn.c @@ -20,15 +20,15 @@ #include "byte-order.h" #include "colors.h" +#include "nx-match.h" +#include "openflow/openflow.h" #include "openvswitch/dynamic-string.h" #include "openvswitch/match.h" #include "openvswitch/meta-flow.h" -#include "nx-match.h" -#include "ofp-actions.h" +#include "openvswitch/ofp-actions.h" +#include "openvswitch/ofp-errors.h" #include "openvswitch/ofp-util.h" #include "openvswitch/ofpbuf.h" -#include "openflow/openflow.h" -#include "openvswitch/ofp-errors.h" #include "unaligned.h" diff --git a/lib/learning-switch.c b/lib/learning-switch.c index 0dc093a..afc1f76 100644 --- a/lib/learning-switch.c +++ b/lib/learning-switch.c @@ -29,9 +29,9 @@ #include "flow.h" #include "hmap.h" #include "mac-learning.h" -#include "ofp-actions.h" #include "ofp-print.h" #include "openflow/openflow.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-errors.h" #include "openvswitch/ofp-msgs.h" #include "openvswitch/ofp-util.h" diff --git a/lib/multipath.c b/lib/multipath.c index 21cbfb0..30bab14 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -22,12 +22,12 @@ #include #include #include "colors.h" -#include "openvswitch/dynamic-string.h" #include "nx-match.h" -#include "ofp-actions.h" -#include "openvswitch/ofp-util.h" -#include "openvswitch/ofp-errors.h" #include "openflow/nicira-ext.h" +#include "openvswitch/dynamic-string.h" +#include "openvswitch/ofp-actions.h" +#include "openvswitch/ofp-errors.h" +#include "openvswitch/ofp-util.h" #include "packets.h" /* Checks that 'mp' is valid on flow. Returns 0 if it is valid, otherwise an diff --git a/lib/nx-match.c b/lib/nx-match.c index 91f5943..3c48570 100644 --- a/lib/nx-match.c +++ b/lib/nx-match.c @@ -22,20 +22,20 @@ #include "classifier.h" #include "colors.h" -#include "openvswitch/dynamic-string.h" #include "hmap.h" +#include "openflow/nicira-ext.h" +#include "openvswitch/dynamic-string.h" #include "openvswitch/meta-flow.h" -#include "ofp-actions.h" +#include "openvswitch/ofp-actions.h" +#include "openvswitch/ofp-errors.h" #include "openvswitch/ofp-util.h" #include "openvswitch/ofpbuf.h" -#include "openflow/nicira-ext.h" +#include "openvswitch/vlog.h" #include "packets.h" #include "shash.h" #include "tun-metadata.h" #include "unaligned.h" #include "util.h" -#include "openvswitch/ofp-errors.h" -#include "openvswitch/vlog.h" VLOG_DEFINE_THIS_MODULE(nx_match); diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c index 283749e..4e2c2a3 100644 --- a/lib/ofp-actions.c +++ b/lib/ofp-actions.c @@ -17,26 +17,26 @@ #include #include -#include "ofp-actions.h" #include "bundle.h" #include "byte-order.h" #include "colors.h" #include "compiler.h" #include "dummy.h" -#include "openvswitch/dynamic-string.h" #include "hmap.h" #include "learn.h" -#include "openvswitch/meta-flow.h" #include "multipath.h" #include "nx-match.h" #include "odp-netlink.h" #include "ofp-prop.h" +#include "openvswitch/dynamic-string.h" +#include "openvswitch/meta-flow.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-util.h" +#include "openvswitch/ofp-parse.h" #include "openvswitch/ofpbuf.h" +#include "openvswitch/vlog.h" #include "unaligned.h" #include "util.h" -#include "openvswitch/ofp-parse.h" -#include "openvswitch/vlog.h" VLOG_DEFINE_THIS_MODULE(ofp_actions); diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h deleted file mode 100644 index 77c385a..0000000 --- a/lib/ofp-actions.h +++ /dev/null @@ -1,1046 +0,0 @@ -/* - * Copyright (c) 2012, 2013, 2014, 2015, 2016 Nicira, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OFP_ACTIONS_H -#define OFP_ACTIONS_H 1 - -#include -#include -#include "openvswitch/meta-flow.h" -#include "openvswitch/ofp-util.h" -#include "openflow/openflow.h" -#include "openflow/nicira-ext.h" -#include "openvswitch/ofp-errors.h" -#include "openvswitch/types.h" - -/* List of OVS abstracted actions. - * - * This macro is used directly only internally by this header, but the list is - * still of interest to developers. - * - * Each OFPACT invocation has the following parameters: - * - * 1. , used below in the enum definition of OFPACT_, and - * elsewhere. - * - * 2. corresponding to a structure "struct ", that must be - * defined below. This structure must be an abstract definition of the - * action. Its first member must have type "struct ofpact" and name - * "ofpact". It may be fixed length or end with a flexible array member - * (e.g. "int member[];"). - * - * 3. , which has one of two possible values: - * - * - If "struct " is fixed-length, it must be "ofpact". - * - * - If "struct " is variable-length, it must be the name of the - * flexible array member. - * - * 4. , a quoted string that gives the name of the action, for use in - * parsing actions from text. - */ -#define OFPACTS \ - /* Output. */ \ - OFPACT(OUTPUT, ofpact_output, ofpact, "output") \ - OFPACT(GROUP, ofpact_group, ofpact, "group") \ - OFPACT(CONTROLLER, ofpact_controller, userdata, "controller") \ - OFPACT(ENQUEUE, ofpact_enqueue, ofpact, "enqueue") \ - OFPACT(OUTPUT_REG, ofpact_output_reg, ofpact, "output_reg") \ - OFPACT(BUNDLE, ofpact_bundle, slaves, "bundle") \ - \ - /* Header changes. */ \ - OFPACT(SET_FIELD, ofpact_set_field, ofpact, "set_field") \ - OFPACT(SET_VLAN_VID, ofpact_vlan_vid, ofpact, "set_vlan_vid") \ - OFPACT(SET_VLAN_PCP, ofpact_vlan_pcp, ofpact, "set_vlan_pcp") \ - OFPACT(STRIP_VLAN, ofpact_null, ofpact, "strip_vlan") \ - OFPACT(PUSH_VLAN, ofpact_null, ofpact, "push_vlan") \ - OFPACT(SET_ETH_SRC, ofpact_mac, ofpact, "mod_dl_src") \ - OFPACT(SET_ETH_DST, ofpact_mac, ofpact, "mod_dl_dst") \ - OFPACT(SET_IPV4_SRC, ofpact_ipv4, ofpact, "mod_nw_src") \ - OFPACT(SET_IPV4_DST, ofpact_ipv4, ofpact, "mod_nw_dst") \ - OFPACT(SET_IP_DSCP, ofpact_dscp, ofpact, "mod_nw_tos") \ - OFPACT(SET_IP_ECN, ofpact_ecn, ofpact, "mod_nw_ecn") \ - OFPACT(SET_IP_TTL, ofpact_ip_ttl, ofpact, "mod_nw_ttl") \ - OFPACT(SET_L4_SRC_PORT, ofpact_l4_port, ofpact, "mod_tp_src") \ - OFPACT(SET_L4_DST_PORT, ofpact_l4_port, ofpact, "mod_tp_dst") \ - OFPACT(REG_MOVE, ofpact_reg_move, ofpact, "move") \ - OFPACT(STACK_PUSH, ofpact_stack, ofpact, "push") \ - OFPACT(STACK_POP, ofpact_stack, ofpact, "pop") \ - OFPACT(DEC_TTL, ofpact_cnt_ids, cnt_ids, "dec_ttl") \ - OFPACT(SET_MPLS_LABEL, ofpact_mpls_label, ofpact, "set_mpls_label") \ - OFPACT(SET_MPLS_TC, ofpact_mpls_tc, ofpact, "set_mpls_tc") \ - OFPACT(SET_MPLS_TTL, ofpact_mpls_ttl, ofpact, "set_mpls_ttl") \ - OFPACT(DEC_MPLS_TTL, ofpact_null, ofpact, "dec_mpls_ttl") \ - OFPACT(PUSH_MPLS, ofpact_push_mpls, ofpact, "push_mpls") \ - OFPACT(POP_MPLS, ofpact_pop_mpls, ofpact, "pop_mpls") \ - \ - /* Metadata. */ \ - OFPACT(SET_TUNNEL, ofpact_tunnel, ofpact, "set_tunnel") \ - OFPACT(SET_QUEUE, ofpact_queue, ofpact, "set_queue") \ - OFPACT(POP_QUEUE, ofpact_null, ofpact, "pop_queue") \ - OFPACT(FIN_TIMEOUT, ofpact_fin_timeout, ofpact, "fin_timeout") \ - \ - /* Flow table interaction. */ \ - OFPACT(RESUBMIT, ofpact_resubmit, ofpact, "resubmit") \ - OFPACT(LEARN, ofpact_learn, specs, "learn") \ - OFPACT(CONJUNCTION, ofpact_conjunction, ofpact, "conjunction") \ - \ - /* Arithmetic. */ \ - OFPACT(MULTIPATH, ofpact_multipath, ofpact, "multipath") \ - \ - /* Other. */ \ - OFPACT(NOTE, ofpact_note, data, "note") \ - OFPACT(EXIT, ofpact_null, ofpact, "exit") \ - OFPACT(SAMPLE, ofpact_sample, ofpact, "sample") \ - OFPACT(UNROLL_XLATE, ofpact_unroll_xlate, ofpact, "unroll_xlate") \ - OFPACT(CT, ofpact_conntrack, ofpact, "ct") \ - OFPACT(NAT, ofpact_nat, ofpact, "nat") \ - \ - /* Debugging actions. \ - * \ - * These are intentionally undocumented, subject to change, and \ - * only accepted if ovs-vswitchd is started with --enable-dummy. */ \ - OFPACT(DEBUG_RECIRC, ofpact_null, ofpact, "debug_recirc") \ - \ - /* Instructions. */ \ - OFPACT(METER, ofpact_meter, ofpact, "meter") \ - OFPACT(CLEAR_ACTIONS, ofpact_null, ofpact, "clear_actions") \ - OFPACT(WRITE_ACTIONS, ofpact_nest, ofpact, "write_actions") \ - OFPACT(WRITE_METADATA, ofpact_metadata, ofpact, "write_metadata") \ - OFPACT(GOTO_TABLE, ofpact_goto_table, ofpact, "goto_table") - -/* enum ofpact_type, with a member OFPACT_ for each action. */ -enum OVS_PACKED_ENUM ofpact_type { -#define OFPACT(ENUM, STRUCT, MEMBER, NAME) OFPACT_##ENUM, - OFPACTS -#undef OFPACT -}; - -/* Define N_OFPACTS to the number of types of ofpacts. */ -enum { -#define OFPACT(ENUM, STRUCT, MEMBER, NAME) + 1 - N_OFPACTS = OFPACTS -#undef OFPACT -}; - -/* Header for an action. - * - * Each action is a structure "struct ofpact_*" that begins with "struct - * ofpact", usually followed by other data that describes the action. Actions - * are padded out to a multiple of OFPACT_ALIGNTO bytes in length. - * - * The 'raw' member is special: - * - * - Most "struct ofpact"s correspond to one particular kind of OpenFlow - * action, at least in a given OpenFlow version. For example, - * OFPACT_SET_VLAN_VID corresponds to OFPAT10_SET_VLAN_VID in OpenFlow - * 1.0. - * - * For such actions, the 'raw' member is not meaningful and generally - * should be zero. - * - * - A few "struct ofpact"s correspond to multiple OpenFlow actions. For - * example, OFPACT_SET_TUNNEL can be NXAST_SET_TUNNEL or - * NXAST_SET_TUNNEL64. In these cases, if the "struct ofpact" originated - * from OpenFlow, then we want to make sure that, if it gets translated - * back to OpenFlow later, it is translated back to the same action type. - * (Otherwise, we'd violate the promise made in DESIGN, in the "Action - * Reproduction" section.) - * - * For such actions, the 'raw' member should be the "enum ofp_raw_action" - * originally extracted from the OpenFlow action. (If the action didn't - * originate from OpenFlow, then setting 'raw' to zero should be fine: - * code to translate the ofpact to OpenFlow must tolerate this case.) - */ -struct ofpact { - /* We want the space advantage of an 8-bit type here on every - * implementation, without giving up the advantage of having a useful type - * on implementations that support packed enums. */ -#ifdef HAVE_PACKED_ENUM - enum ofpact_type type; /* OFPACT_*. */ -#else - uint8_t type; /* OFPACT_* */ -#endif - - uint8_t raw; /* Original type when added, if any. */ - uint16_t len; /* Length of the action, in bytes, including - * struct ofpact, excluding padding. */ -}; -BUILD_ASSERT_DECL(sizeof(struct ofpact) == 4); - -/* Alignment. */ -#define OFPACT_ALIGNTO 8 -#define OFPACT_ALIGN(SIZE) ROUND_UP(SIZE, OFPACT_ALIGNTO) - -/* Expands to an anonymous union that contains: - * - * - MEMBERS in a nested anonymous struct. - * - * - An array as large as MEMBERS plus padding to a multiple of 8 bytes. - * - * The effect is to pad MEMBERS to a multiple of 8 bytes. */ -#define OFPACT_PADDED_MEMBERS(MEMBERS) \ - union { \ - struct { MEMBERS }; \ - uint8_t pad[OFPACT_ALIGN(sizeof(struct { MEMBERS }))]; \ - } - -/* Returns the ofpact following 'ofpact'. */ -static inline struct ofpact * -ofpact_next(const struct ofpact *ofpact) -{ - return (void *) ((uint8_t *) ofpact + OFPACT_ALIGN(ofpact->len)); -} - -struct ofpact *ofpact_next_flattened(const struct ofpact *); - -static inline struct ofpact * -ofpact_end(const struct ofpact *ofpacts, size_t ofpacts_len) -{ - return (void *) ((uint8_t *) ofpacts + ofpacts_len); -} - -/* Assigns POS to each ofpact, in turn, in the OFPACTS_LEN bytes of ofpacts - * starting at OFPACTS. */ -#define OFPACT_FOR_EACH(POS, OFPACTS, OFPACTS_LEN) \ - for ((POS) = (OFPACTS); (POS) < ofpact_end(OFPACTS, OFPACTS_LEN); \ - (POS) = ofpact_next(POS)) - -/* Assigns POS to each ofpact, in turn, in the OFPACTS_LEN bytes of ofpacts - * starting at OFPACTS. - * - * For ofpacts that contain nested ofpacts, this visits each of the inner - * ofpacts as well. */ -#define OFPACT_FOR_EACH_FLATTENED(POS, OFPACTS, OFPACTS_LEN) \ - for ((POS) = (OFPACTS); (POS) < ofpact_end(OFPACTS, OFPACTS_LEN); \ - (POS) = ofpact_next_flattened(POS)) - -/* Action structure for each OFPACT_*. */ - -/* OFPACT_STRIP_VLAN, OFPACT_POP_QUEUE, OFPACT_EXIT, OFPACT_CLEAR_ACTIONS. - * - * Used for OFPAT10_STRIP_VLAN, NXAST_POP_QUEUE, NXAST_EXIT, - * OFPAT11_POP_VLAN, OFPIT11_CLEAR_ACTIONS. - * - * Action structure for actions that do not have any extra data beyond the - * action type. */ -struct ofpact_null { - struct ofpact ofpact; -}; - -/* OFPACT_OUTPUT. - * - * Used for OFPAT10_OUTPUT. */ -struct ofpact_output { - struct ofpact ofpact; - ofp_port_t port; /* Output port. */ - uint16_t max_len; /* Max send len, for port OFPP_CONTROLLER. */ -}; - -/* OFPACT_CONTROLLER. - * - * Used for NXAST_CONTROLLER. */ -struct ofpact_controller { - OFPACT_PADDED_MEMBERS( - struct ofpact ofpact; - uint16_t max_len; /* Max length to send to controller. */ - uint16_t controller_id; /* Controller ID to send packet-in. */ - enum ofp_packet_in_reason reason; /* Reason to put in packet-in. */ - - /* If true, this action freezes packet traversal of the OpenFlow - * tables and adds a continuation to the packet-in message, that - * a controller can use to resume that traversal. */ - bool pause; - - /* Arbitrary data to include in the packet-in message (currently, - * only in NXT_PACKET_IN2). */ - uint16_t userdata_len; - ); - uint8_t userdata[0]; -}; - -/* OFPACT_ENQUEUE. - * - * Used for OFPAT10_ENQUEUE. */ -struct ofpact_enqueue { - struct ofpact ofpact; - ofp_port_t port; - uint32_t queue; -}; - -/* OFPACT_OUTPUT_REG. - * - * Used for NXAST_OUTPUT_REG. */ -struct ofpact_output_reg { - struct ofpact ofpact; - uint16_t max_len; - struct mf_subfield src; -}; - -/* Bundle slave choice algorithm to apply. - * - * In the descriptions below, 'slaves' is the list of possible slaves in the - * order they appear in the OpenFlow action. */ -enum nx_bd_algorithm { - /* Chooses the first live slave listed in the bundle. - * - * O(n_slaves) performance. */ - NX_BD_ALG_ACTIVE_BACKUP = 0, - - /* Highest Random Weight. - * - * for i in [0,n_slaves): - * weights[i] = hash(flow, i) - * slave = { slaves[i] such that weights[i] >= weights[j] for all j != i } - * - * Redistributes 1/n_slaves of traffic when a slave's liveness changes. - * O(n_slaves) performance. - * - * Uses the 'fields' and 'basis' parameters. */ - NX_BD_ALG_HRW = 1 -}; - -/* OFPACT_BUNDLE. - * - * Used for NXAST_BUNDLE. */ -struct ofpact_bundle { - struct ofpact ofpact; - - /* Slave choice algorithm to apply to hash value. */ - enum nx_bd_algorithm algorithm; - - /* What fields to hash and how. */ - enum nx_hash_fields fields; - uint16_t basis; /* Universal hash parameter. */ - - struct mf_subfield dst; - - /* Slaves for output. */ - unsigned int n_slaves; - ofp_port_t slaves[]; -}; - -/* OFPACT_SET_VLAN_VID. - * - * We keep track if vlan was present at action validation time to avoid a - * PUSH_VLAN when translating to OpenFlow 1.1+. - * - * We also keep the originating OFPUTIL action code in ofpact.compat. - * - * Used for OFPAT10_SET_VLAN_VID and OFPAT11_SET_VLAN_VID. */ -struct ofpact_vlan_vid { - struct ofpact ofpact; - uint16_t vlan_vid; /* VLAN VID in low 12 bits, 0 in other bits. */ - bool push_vlan_if_needed; /* OF 1.0 semantics if true. */ - bool flow_has_vlan; /* VLAN present at action validation time? */ -}; - -/* OFPACT_SET_VLAN_PCP. - * - * We keep track if vlan was present at action validation time to avoid a - * PUSH_VLAN when translating to OpenFlow 1.1+. - * - * We also keep the originating OFPUTIL action code in ofpact.compat. - * - * Used for OFPAT10_SET_VLAN_PCP and OFPAT11_SET_VLAN_PCP. */ -struct ofpact_vlan_pcp { - struct ofpact ofpact; - uint8_t vlan_pcp; /* VLAN PCP in low 3 bits, 0 in other bits. */ - bool push_vlan_if_needed; /* OF 1.0 semantics if true. */ - bool flow_has_vlan; /* VLAN present at action validation time? */ -}; - -/* OFPACT_SET_ETH_SRC, OFPACT_SET_ETH_DST. - * - * Used for OFPAT10_SET_DL_SRC, OFPAT10_SET_DL_DST. */ -struct ofpact_mac { - struct ofpact ofpact; - struct eth_addr mac; -}; - -/* OFPACT_SET_IPV4_SRC, OFPACT_SET_IPV4_DST. - * - * Used for OFPAT10_SET_NW_SRC, OFPAT10_SET_NW_DST. */ -struct ofpact_ipv4 { - struct ofpact ofpact; - ovs_be32 ipv4; -}; - -/* OFPACT_SET_IP_DSCP. - * - * Used for OFPAT10_SET_NW_TOS. */ -struct ofpact_dscp { - struct ofpact ofpact; - uint8_t dscp; /* DSCP in high 6 bits, rest ignored. */ -}; - -/* OFPACT_SET_IP_ECN. - * - * Used for OFPAT11_SET_NW_ECN. */ -struct ofpact_ecn { - struct ofpact ofpact; - uint8_t ecn; /* ECN in low 2 bits, rest ignored. */ -}; - -/* OFPACT_SET_IP_TTL. - * - * Used for OFPAT11_SET_NW_TTL. */ -struct ofpact_ip_ttl { - struct ofpact ofpact; - uint8_t ttl; -}; - -/* OFPACT_SET_L4_SRC_PORT, OFPACT_SET_L4_DST_PORT. - * - * Used for OFPAT10_SET_TP_SRC, OFPAT10_SET_TP_DST. */ -struct ofpact_l4_port { - struct ofpact ofpact; - uint16_t port; /* TCP, UDP or SCTP port number. */ - uint8_t flow_ip_proto; /* IP proto from corresponding match, or 0 */ -}; - -/* OFPACT_REG_MOVE. - * - * Used for NXAST_REG_MOVE. */ -struct ofpact_reg_move { - struct ofpact ofpact; - struct mf_subfield src; - struct mf_subfield dst; -}; - -/* OFPACT_STACK_PUSH. - * - * Used for NXAST_STACK_PUSH and NXAST_STACK_POP. */ -struct ofpact_stack { - struct ofpact ofpact; - struct mf_subfield subfield; -}; - -/* OFPACT_SET_FIELD. - * - * Used for NXAST_REG_LOAD and OFPAT12_SET_FIELD. */ -struct ofpact_set_field { - struct ofpact ofpact; - const struct mf_field *field; - bool flow_has_vlan; /* VLAN present at action validation time. */ - union mf_value value; - union mf_value mask; -}; - -/* OFPACT_PUSH_VLAN/MPLS/PBB - * - * Used for NXAST_PUSH_MPLS, OFPAT11_PUSH_MPLS. */ -struct ofpact_push_mpls { - struct ofpact ofpact; - ovs_be16 ethertype; -}; - -/* OFPACT_POP_MPLS - * - * Used for NXAST_POP_MPLS, OFPAT11_POP_MPLS.. */ -struct ofpact_pop_mpls { - struct ofpact ofpact; - ovs_be16 ethertype; -}; - -/* OFPACT_SET_TUNNEL. - * - * Used for NXAST_SET_TUNNEL, NXAST_SET_TUNNEL64. */ -struct ofpact_tunnel { - struct ofpact ofpact; - uint64_t tun_id; -}; - -/* OFPACT_SET_QUEUE. - * - * Used for NXAST_SET_QUEUE. */ -struct ofpact_queue { - struct ofpact ofpact; - uint32_t queue_id; -}; - -/* OFPACT_FIN_TIMEOUT. - * - * Used for NXAST_FIN_TIMEOUT. */ -struct ofpact_fin_timeout { - struct ofpact ofpact; - uint16_t fin_idle_timeout; - uint16_t fin_hard_timeout; -}; - -/* OFPACT_WRITE_METADATA. - * - * Used for NXAST_WRITE_METADATA. */ -struct ofpact_metadata { - struct ofpact ofpact; - ovs_be64 metadata; - ovs_be64 mask; -}; - -/* OFPACT_METER. - * - * Used for OFPIT13_METER. */ -struct ofpact_meter { - struct ofpact ofpact; - uint32_t meter_id; -}; - -/* OFPACT_WRITE_ACTIONS. - * - * Used for OFPIT11_WRITE_ACTIONS. */ -struct ofpact_nest { - OFPACT_PADDED_MEMBERS(struct ofpact ofpact;); - struct ofpact actions[]; -}; -BUILD_ASSERT_DECL(offsetof(struct ofpact_nest, actions) % OFPACT_ALIGNTO == 0); -BUILD_ASSERT_DECL(offsetof(struct ofpact_nest, actions) - == sizeof(struct ofpact_nest)); - -/* Bits for 'flags' in struct nx_action_conntrack. - * - * If NX_CT_F_COMMIT is set, then the connection entry is moved from the - * unconfirmed to confirmed list in the tracker. */ -enum nx_conntrack_flags { - NX_CT_F_COMMIT = 1 << 0, -}; - -/* Magic value for struct nx_action_conntrack 'recirc_table' field, to specify - * that the packet should not be recirculated. */ -#define NX_CT_RECIRC_NONE OFPTT_ALL - -#if !defined(IPPORT_FTP) -#define IPPORT_FTP 21 -#endif - -/* OFPACT_CT. - * - * Used for NXAST_CT. */ -struct ofpact_conntrack { - OFPACT_PADDED_MEMBERS( - struct ofpact ofpact; - uint16_t flags; - uint16_t zone_imm; - struct mf_subfield zone_src; - uint16_t alg; - uint8_t recirc_table; - ); - struct ofpact actions[0]; -}; -BUILD_ASSERT_DECL(offsetof(struct ofpact_conntrack, actions) - % OFPACT_ALIGNTO == 0); -BUILD_ASSERT_DECL(offsetof(struct ofpact_conntrack, actions) - == sizeof(struct ofpact_conntrack)); - -static inline size_t -ofpact_ct_get_action_len(const struct ofpact_conntrack *oc) -{ - return oc->ofpact.len - offsetof(struct ofpact_conntrack, actions); -} - -static inline size_t -ofpact_nest_get_action_len(const struct ofpact_nest *on) -{ - return on->ofpact.len - offsetof(struct ofpact_nest, actions); -} - -void ofpacts_execute_action_set(struct ofpbuf *action_list, - const struct ofpbuf *action_set); - -/* Bits for 'flags' in struct nx_action_nat. - */ -enum nx_nat_flags { - NX_NAT_F_SRC = 1 << 0, - NX_NAT_F_DST = 1 << 1, - NX_NAT_F_PERSISTENT = 1 << 2, - NX_NAT_F_PROTO_HASH = 1 << 3, - NX_NAT_F_PROTO_RANDOM = 1 << 4, -}; - -/* OFPACT_NAT. - * - * Used for NXAST_NAT. */ -struct ofpact_nat { - struct ofpact ofpact; - uint8_t range_af; /* AF_UNSPEC, AF_INET, or AF_INET6 */ - uint16_t flags; /* NX_NAT_F_* */ - struct { - struct { - uint16_t min; - uint16_t max; - } proto; - union { - struct { - ovs_be32 min; - ovs_be32 max; - } ipv4; - struct { - struct in6_addr min; - struct in6_addr max; - } ipv6; - } addr; - } range; -}; - - -/* OFPACT_RESUBMIT. - * - * Used for NXAST_RESUBMIT, NXAST_RESUBMIT_TABLE. */ -struct ofpact_resubmit { - struct ofpact ofpact; - ofp_port_t in_port; - uint8_t table_id; -}; - -/* Part of struct ofpact_learn, below. */ -struct ofpact_learn_spec { - int n_bits; /* Number of bits in source and dest. */ - - int src_type; /* One of NX_LEARN_SRC_*. */ - struct mf_subfield src; /* NX_LEARN_SRC_FIELD only. */ - union mf_subvalue src_imm; /* NX_LEARN_SRC_IMMEDIATE only. */ - - int dst_type; /* One of NX_LEARN_DST_*. */ - struct mf_subfield dst; /* NX_LEARN_DST_MATCH, NX_LEARN_DST_LOAD only. */ -}; - - -/* Bits for 'flags' in struct nx_action_learn. - * - * If NX_LEARN_F_SEND_FLOW_REM is set, then the learned flows will have their - * OFPFF_SEND_FLOW_REM flag set. - * - * If NX_LEARN_F_DELETE_LEARNED is set, then removing this action will delete - * all the flows from the learn action's 'table_id' that have the learn - * action's 'cookie'. Important points: - * - * - The deleted flows include those created by this action, those created - * by other learn actions with the same 'table_id' and 'cookie', those - * created by flow_mod requests by a controller in the specified table - * with the specified cookie, and those created through any other - * means. - * - * - If multiple flows specify "learn" actions with - * NX_LEARN_F_DELETE_LEARNED with the same 'table_id' and 'cookie', then - * no deletion occurs until all of those "learn" actions are deleted. - * - * - Deleting a flow that contains a learn action is the most obvious way - * to delete a learn action. Modifying a flow's actions, or replacing it - * by a new flow, can also delete a learn action. Finally, replacing a - * learn action with NX_LEARN_F_DELETE_LEARNED with a learn action - * without that flag also effectively deletes the learn action and can - * trigger flow deletion. - * - * NX_LEARN_F_DELETE_LEARNED was added in Open vSwitch 2.4. */ -enum nx_learn_flags { - NX_LEARN_F_SEND_FLOW_REM = 1 << 0, - NX_LEARN_F_DELETE_LEARNED = 1 << 1, -}; - -#define NX_LEARN_N_BITS_MASK 0x3ff - -#define NX_LEARN_SRC_FIELD (0 << 13) /* Copy from field. */ -#define NX_LEARN_SRC_IMMEDIATE (1 << 13) /* Copy from immediate value. */ -#define NX_LEARN_SRC_MASK (1 << 13) - -#define NX_LEARN_DST_MATCH (0 << 11) /* Add match criterion. */ -#define NX_LEARN_DST_LOAD (1 << 11) /* Add NXAST_REG_LOAD action. */ -#define NX_LEARN_DST_OUTPUT (2 << 11) /* Add OFPAT_OUTPUT action. */ -#define NX_LEARN_DST_RESERVED (3 << 11) /* Not yet defined. */ -#define NX_LEARN_DST_MASK (3 << 11) - -/* OFPACT_LEARN. - * - * Used for NXAST_LEARN. */ -struct ofpact_learn { - struct ofpact ofpact; - - uint16_t idle_timeout; /* Idle time before discarding (seconds). */ - uint16_t hard_timeout; /* Max time before discarding (seconds). */ - uint16_t priority; /* Priority level of flow entry. */ - uint8_t table_id; /* Table to insert flow entry. */ - ovs_be64 cookie; /* Cookie for new flow. */ - enum nx_learn_flags flags; /* NX_LEARN_F_*. */ - uint16_t fin_idle_timeout; /* Idle timeout after FIN, if nonzero. */ - uint16_t fin_hard_timeout; /* Hard timeout after FIN, if nonzero. */ - - unsigned int n_specs; - struct ofpact_learn_spec specs[]; -}; - -/* Multipath link choice algorithm to apply. - * - * In the descriptions below, 'n_links' is max_link + 1. */ -enum nx_mp_algorithm { - /* link = hash(flow) % n_links. - * - * Redistributes all traffic when n_links changes. O(1) performance. See - * RFC 2992. - * - * Use UINT16_MAX for max_link to get a raw hash value. */ - NX_MP_ALG_MODULO_N = 0, - - /* link = hash(flow) / (MAX_HASH / n_links). - * - * Redistributes between one-quarter and one-half of traffic when n_links - * changes. O(1) performance. See RFC 2992. - */ - NX_MP_ALG_HASH_THRESHOLD = 1, - - /* Highest Random Weight. - * - * for i in [0,n_links): - * weights[i] = hash(flow, i) - * link = { i such that weights[i] >= weights[j] for all j != i } - * - * Redistributes 1/n_links of traffic when n_links changes. O(n_links) - * performance. If n_links is greater than a threshold (currently 64, but - * subject to change), Open vSwitch will substitute another algorithm - * automatically. See RFC 2992. */ - NX_MP_ALG_HRW = 2, - - /* Iterative Hash. - * - * i = 0 - * repeat: - * i = i + 1 - * link = hash(flow, i) % arg - * while link > max_link - * - * Redistributes 1/n_links of traffic when n_links changes. O(1) - * performance when arg/max_link is bounded by a constant. - * - * Redistributes all traffic when arg changes. - * - * arg must be greater than max_link and for best performance should be no - * more than approximately max_link * 2. If arg is outside the acceptable - * range, Open vSwitch will automatically substitute the least power of 2 - * greater than max_link. - * - * This algorithm is specific to Open vSwitch. - */ - NX_MP_ALG_ITER_HASH = 3, -}; - -/* OFPACT_CONJUNCTION. - * - * Used for NXAST_CONJUNCTION. */ -struct ofpact_conjunction { - struct ofpact ofpact; - uint8_t clause; - uint8_t n_clauses; - uint32_t id; -}; - -/* OFPACT_MULTIPATH. - * - * Used for NXAST_MULTIPATH. */ -struct ofpact_multipath { - struct ofpact ofpact; - - /* What fields to hash and how. */ - enum nx_hash_fields fields; - uint16_t basis; /* Universal hash parameter. */ - - /* Multipath link choice algorithm to apply to hash value. */ - enum nx_mp_algorithm algorithm; - uint16_t max_link; /* Number of output links, minus 1. */ - uint32_t arg; /* Algorithm-specific argument. */ - - /* Where to store the result. */ - struct mf_subfield dst; -}; - -/* OFPACT_NOTE. - * - * Used for NXAST_NOTE. */ -struct ofpact_note { - struct ofpact ofpact; - size_t length; - uint8_t data[]; -}; - -/* OFPACT_SAMPLE. - * - * Used for NXAST_SAMPLE. */ -struct ofpact_sample { - struct ofpact ofpact; - uint16_t probability; // Always >0. - uint32_t collector_set_id; - uint32_t obs_domain_id; - uint32_t obs_point_id; -}; - -/* OFPACT_DEC_TTL. - * - * Used for OFPAT11_DEC_NW_TTL, NXAST_DEC_TTL and NXAST_DEC_TTL_CNT_IDS. */ -struct ofpact_cnt_ids { - struct ofpact ofpact; - - /* Controller ids. */ - unsigned int n_controllers; - uint16_t cnt_ids[]; -}; - -/* OFPACT_SET_MPLS_LABEL. - * - * Used for OFPAT11_SET_MPLS_LABEL and NXAST_SET_MPLS_LABEL */ -struct ofpact_mpls_label { - struct ofpact ofpact; - - ovs_be32 label; -}; - -/* OFPACT_SET_MPLS_TC. - * - * Used for OFPAT11_SET_MPLS_TC and NXAST_SET_MPLS_TC */ -struct ofpact_mpls_tc { - struct ofpact ofpact; - - uint8_t tc; -}; - -/* OFPACT_SET_MPLS_TTL. - * - * Used for OFPAT11_SET_MPLS_TTL and NXAST_SET_MPLS_TTL */ -struct ofpact_mpls_ttl { - struct ofpact ofpact; - - uint8_t ttl; -}; - -/* OFPACT_GOTO_TABLE - * - * Used for OFPIT11_GOTO_TABLE */ -struct ofpact_goto_table { - struct ofpact ofpact; - uint8_t table_id; -}; - -/* OFPACT_GROUP. - * - * Used for OFPAT11_GROUP. */ -struct ofpact_group { - struct ofpact ofpact; - uint32_t group_id; -}; - -/* OFPACT_UNROLL_XLATE. - * - * Used only internally. */ -struct ofpact_unroll_xlate { - struct ofpact ofpact; - - /* Metadata in xlate context, visible to controller via PACKET_INs. */ - uint8_t rule_table_id; /* 0xFF if none. */ - ovs_be64 rule_cookie; /* OVS_BE64_MAX if none. */ -}; - -/* Converting OpenFlow to ofpacts. */ -enum ofperr ofpacts_pull_openflow_actions(struct ofpbuf *openflow, - unsigned int actions_len, - enum ofp_version version, - struct ofpbuf *ofpacts); -enum ofperr ofpacts_pull_openflow_instructions(struct ofpbuf *openflow, - unsigned int instructions_len, - enum ofp_version version, - struct ofpbuf *ofpacts); -enum ofperr ofpacts_check(struct ofpact[], size_t ofpacts_len, - struct flow *, ofp_port_t max_ports, - uint8_t table_id, uint8_t n_tables, - enum ofputil_protocol *usable_protocols); -enum ofperr ofpacts_check_consistency(struct ofpact[], size_t ofpacts_len, - struct flow *, ofp_port_t max_ports, - uint8_t table_id, uint8_t n_tables, - enum ofputil_protocol usable_protocols); -enum ofperr ofpact_check_output_port(ofp_port_t port, ofp_port_t max_ports); - -/* Converting ofpacts to OpenFlow. */ -size_t ofpacts_put_openflow_actions(const struct ofpact[], size_t ofpacts_len, - struct ofpbuf *openflow, enum ofp_version); -void ofpacts_put_openflow_instructions(const struct ofpact[], - size_t ofpacts_len, - struct ofpbuf *openflow, - enum ofp_version ofp_version); - -/* Sets of supported actions. */ -ovs_be32 ofpact_bitmap_to_openflow(uint64_t ofpacts_bitmap, enum ofp_version); -uint64_t ofpact_bitmap_from_openflow(ovs_be32 ofpat_bitmap, enum ofp_version); -void ofpact_bitmap_format(uint64_t ofpacts_bitmap, struct ds *); - -/* Working with ofpacts. */ -bool ofpacts_output_to_port(const struct ofpact[], size_t ofpacts_len, - ofp_port_t port); -bool ofpacts_output_to_group(const struct ofpact[], size_t ofpacts_len, - uint32_t group_id); -bool ofpacts_equal(const struct ofpact a[], size_t a_len, - const struct ofpact b[], size_t b_len); -const struct mf_field *ofpact_get_mf_dst(const struct ofpact *ofpact); -uint32_t ofpacts_get_meter(const struct ofpact[], size_t ofpacts_len); - -/* Formatting and parsing ofpacts. */ -void ofpacts_format(const struct ofpact[], size_t ofpacts_len, struct ds *); -char *ofpacts_parse_actions(const char *, struct ofpbuf *ofpacts, - enum ofputil_protocol *usable_protocols) - OVS_WARN_UNUSED_RESULT; -char *ofpacts_parse_instructions(const char *, struct ofpbuf *ofpacts, - enum ofputil_protocol *usable_protocols) - OVS_WARN_UNUSED_RESULT; -const char *ofpact_name(enum ofpact_type); - -/* Internal use by the helpers below. */ -void ofpact_init(struct ofpact *, enum ofpact_type, size_t len); -void *ofpact_put(struct ofpbuf *, enum ofpact_type, size_t len); -void *ofpact_finish(struct ofpbuf *, struct ofpact *); - -/* For each OFPACT_ with a corresponding struct , this defines - * the following commonly useful functions: - * - * struct *ofpact_put_(struct ofpbuf *ofpacts); - * - * Appends a new 'ofpact', of length OFPACT__SIZE, to 'ofpacts', - * initializes it with ofpact_init_(), and returns it. Also sets - * 'ofpacts->header' to the returned action. - * - * After using this function to add a variable-length action, add the - * elements of the flexible array (e.g. with ofpbuf_put()), then use - * ofpact_finish() to pad the action to a multiple of OFPACT_ALIGNTO bytes - * and update its embedded length field. (Keep in mind the need to refresh - * the structure from 'ofpacts->header' after adding data to 'ofpacts'.) - * - * struct *ofpact_get_(const struct ofpact *ofpact); - * - * Returns 'ofpact' cast to "struct *". 'ofpact->type' must be - * OFPACT_. - * - * void ofpact_finish_(struct ofpbuf *ofpacts, struct **ap); - * - * Finishes composing variable-length action '*ap' (begun using - * ofpact_put_() on 'ofpacts'), by padding the action to a multiple - * of OFPACT_ALIGNTO bytes and updating its embedded length field. - * - * May reallocate 'ofpacts', and so as a convenience automatically updates - * '*ap' to point to the new location. If the caller has other pointers - * within 'ap' or 'ofpacts', it needs to update them manually. - * - * as well as the following more rarely useful definitions: - * - * void ofpact_init_(struct *ofpact); - * - * Initializes the parts of 'ofpact' that identify it as having type - * OFPACT_ and length OFPACT__SIZE and zeros the rest. - * - * _SIZE - * - * The size of the action structure. For a fixed-length action, this is - * sizeof(struct ) rounded up to a multiple of OFPACT_ALIGNTO. For - * a variable-length action, this is the offset to the variable-length - * part. - */ -#define OFPACT(ENUM, STRUCT, MEMBER, NAME) \ - BUILD_ASSERT_DECL(offsetof(struct STRUCT, ofpact) == 0); \ - \ - enum { OFPACT_##ENUM##_SIZE \ - = (offsetof(struct STRUCT, MEMBER) \ - ? offsetof(struct STRUCT, MEMBER) \ - : OFPACT_ALIGN(sizeof(struct STRUCT))) }; \ - \ - static inline struct STRUCT * \ - ofpact_get_##ENUM(const struct ofpact *ofpact) \ - { \ - ovs_assert(ofpact->type == OFPACT_##ENUM); \ - return ALIGNED_CAST(struct STRUCT *, ofpact); \ - } \ - \ - static inline struct STRUCT * \ - ofpact_put_##ENUM(struct ofpbuf *ofpacts) \ - { \ - return ofpact_put(ofpacts, OFPACT_##ENUM, \ - OFPACT_##ENUM##_SIZE); \ - } \ - \ - static inline void \ - ofpact_init_##ENUM(struct STRUCT *ofpact) \ - { \ - ofpact_init(&ofpact->ofpact, OFPACT_##ENUM, \ - OFPACT_##ENUM##_SIZE); \ - } \ - \ - static inline void \ - ofpact_finish_##ENUM(struct ofpbuf *ofpbuf, struct STRUCT **ofpactp) \ - { \ - struct ofpact *ofpact = &(*ofpactp)->ofpact; \ - ovs_assert(ofpact->type == OFPACT_##ENUM); \ - *ofpactp = ofpact_finish(ofpbuf, ofpact); \ - } -OFPACTS -#undef OFPACT - -/* Additional functions for composing ofpacts. */ -struct ofpact_set_field *ofpact_put_reg_load(struct ofpbuf *ofpacts); - -/* OpenFlow 1.1 instructions. - * The order is sorted in execution order. Not in the value of OFPIT11_xxx. - * It is enforced on parser from text string. - */ -#define OVS_INSTRUCTIONS \ - DEFINE_INST(OFPIT13_METER, \ - ofp13_instruction_meter, false, \ - "meter") \ - \ - DEFINE_INST(OFPIT11_APPLY_ACTIONS, \ - ofp11_instruction_actions, true, \ - "apply_actions") \ - \ - DEFINE_INST(OFPIT11_CLEAR_ACTIONS, \ - ofp11_instruction, false, \ - "clear_actions") \ - \ - DEFINE_INST(OFPIT11_WRITE_ACTIONS, \ - ofp11_instruction_actions, true, \ - "write_actions") \ - \ - DEFINE_INST(OFPIT11_WRITE_METADATA, \ - ofp11_instruction_write_metadata, false, \ - "write_metadata") \ - \ - DEFINE_INST(OFPIT11_GOTO_TABLE, \ - ofp11_instruction_goto_table, false, \ - "goto_table") - -enum ovs_instruction_type { -#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) OVSINST_##ENUM, - OVS_INSTRUCTIONS -#undef DEFINE_INST -}; - -enum { -#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) + 1 - N_OVS_INSTRUCTIONS = OVS_INSTRUCTIONS -#undef DEFINE_INST -}; - -const char *ovs_instruction_name_from_type(enum ovs_instruction_type type); -int ovs_instruction_type_from_name(const char *name); -enum ovs_instruction_type ovs_instruction_type_from_ofpact_type( - enum ofpact_type); -enum ofperr ovs_instruction_type_from_inst_type( - enum ovs_instruction_type *instruction_type, const uint16_t inst_type); - -ovs_be32 ovsinst_bitmap_to_openflow(uint32_t ovsinst_bitmap, enum ofp_version); -uint32_t ovsinst_bitmap_from_openflow(ovs_be32 ofpit_bitmap, - enum ofp_version); - -#endif /* ofp-actions.h */ diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c index e440000..71c5cdf 100644 --- a/lib/ofp-parse.c +++ b/lib/ofp-parse.c @@ -22,22 +22,22 @@ #include #include "byte-order.h" -#include "openvswitch/dynamic-string.h" #include "learn.h" -#include "openvswitch/meta-flow.h" #include "multipath.h" #include "netdev.h" #include "nx-match.h" -#include "ofp-actions.h" +#include "openflow/openflow.h" +#include "openvswitch/dynamic-string.h" +#include "openvswitch/meta-flow.h" +#include "openvswitch/ofp-actions.h" +#include "openvswitch/ofp-parse.h" #include "openvswitch/ofp-util.h" #include "openvswitch/ofpbuf.h" -#include "openflow/openflow.h" +#include "openvswitch/vconn.h" #include "ovs-thread.h" #include "packets.h" #include "simap.h" #include "socket-util.h" -#include "openvswitch/ofp-parse.h" -#include "openvswitch/vconn.h" /* Parses 'str' as an 8-bit unsigned integer into '*valuep'. * diff --git a/lib/ofp-print.c b/lib/ofp-print.c index 543a4e2..eb98ee5 100644 --- a/lib/ofp-print.c +++ b/lib/ofp-print.c @@ -35,11 +35,11 @@ #include "multipath.h" #include "netdev.h" #include "nx-match.h" -#include "ofp-actions.h" -#include "openflow/openflow.h" #include "openflow/nicira-ext.h" +#include "openflow/openflow.h" #include "openvswitch/dynamic-string.h" #include "openvswitch/meta-flow.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-errors.h" #include "openvswitch/ofp-msgs.h" #include "openvswitch/ofp-util.h" diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 91d0d6d..235abae 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -31,11 +31,11 @@ #include "netdev.h" #include "nx-match.h" #include "id-pool.h" -#include "ofp-actions.h" #include "ofp-prop.h" #include "openflow/netronome-ext.h" #include "openvswitch/dynamic-string.h" #include "openvswitch/meta-flow.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-errors.h" #include "openvswitch/ofp-msgs.h" #include "openvswitch/ofp-util.h" diff --git a/ofproto/bond.c b/ofproto/bond.c index 4cb1c83..0dbd0d2 100644 --- a/ofproto/bond.c +++ b/ofproto/bond.c @@ -23,31 +23,30 @@ #include #include -#include "openvswitch/ofp-util.h" -#include "ofp-actions.h" -#include "openvswitch/ofpbuf.h" -#include "ofproto/ofproto-provider.h" -#include "ofproto/ofproto-dpif.h" -#include "ofproto/ofproto-dpif-rid.h" #include "connectivity.h" #include "coverage.h" -#include "openvswitch/dynamic-string.h" +#include "dp-packet.h" #include "flow.h" #include "hmap.h" #include "lacp.h" -#include "openvswitch/list.h" #include "netdev.h" #include "odp-util.h" +#include "ofproto/ofproto-dpif.h" +#include "ofproto/ofproto-dpif-rid.h" +#include "ofproto/ofproto-provider.h" +#include "openvswitch/dynamic-string.h" +#include "openvswitch/list.h" +#include "openvswitch/match.h" +#include "openvswitch/ofp-actions.h" +#include "openvswitch/ofp-util.h" #include "openvswitch/ofpbuf.h" +#include "openvswitch/vlog.h" #include "packets.h" -#include "dp-packet.h" #include "poll-loop.h" #include "seq.h" -#include "openvswitch/match.h" #include "shash.h" #include "timeval.h" #include "unixctl.h" -#include "openvswitch/vlog.h" VLOG_DEFINE_THIS_MODULE(bond); diff --git a/ofproto/bundles.c b/ofproto/bundles.c index 5996c01..232cc15 100644 --- a/ofproto/bundles.c +++ b/ofproto/bundles.c @@ -18,12 +18,13 @@ #include +#include "bundles.h" #include "coverage.h" #include "fail-open.h" #include "in-band.h" #include "odp-util.h" -#include "ofp-actions.h" #include "ofproto-provider.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-msgs.h" #include "openvswitch/ofp-util.h" #include "openvswitch/ofpbuf.h" @@ -38,8 +39,6 @@ #include "stream.h" #include "timeval.h" -#include "bundles.h" - VLOG_DEFINE_THIS_MODULE(bundles); static struct ofp_bundle * diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c index 2649d44..0c48b77 100644 --- a/ofproto/connmgr.c +++ b/ofproto/connmgr.c @@ -15,19 +15,18 @@ */ #include - -#include "connmgr.h" - #include #include +#include "bundles.h" +#include "connmgr.h" #include "coverage.h" #include "fail-open.h" #include "in-band.h" #include "odp-util.h" -#include "ofp-actions.h" #include "ofproto-provider.h" #include "openvswitch/dynamic-string.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-msgs.h" #include "openvswitch/ofp-util.h" #include "openvswitch/ofpbuf.h" @@ -42,8 +41,6 @@ #include "stream.h" #include "timeval.h" -#include "bundles.h" - VLOG_DEFINE_THIS_MODULE(connmgr); static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); diff --git a/ofproto/fail-open.c b/ofproto/fail-open.c index 68a83fa..d8ec213 100644 --- a/ofproto/fail-open.c +++ b/ofproto/fail-open.c @@ -15,26 +15,26 @@ */ #include -#include "fail-open.h" #include #include #include "classifier.h" #include "connmgr.h" +#include "dp-packet.h" +#include "fail-open.h" #include "flow.h" #include "mac-learning.h" #include "odp-util.h" -#include "openvswitch/ofpbuf.h" -#include "ofp-actions.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-util.h" +#include "openvswitch/ofpbuf.h" +#include "openvswitch/vconn.h" +#include "openvswitch/vlog.h" #include "ofproto.h" #include "ofproto-provider.h" #include "pktbuf.h" -#include "dp-packet.h" #include "poll-loop.h" #include "rconn.h" #include "timeval.h" -#include "openvswitch/vconn.h" -#include "openvswitch/vlog.h" VLOG_DEFINE_THIS_MODULE(fail_open); diff --git a/ofproto/in-band.c b/ofproto/in-band.c index 9c04999..efea19f 100644 --- a/ofproto/in-band.c +++ b/ofproto/in-band.c @@ -15,7 +15,6 @@ */ #include -#include "in-band.h" #include #include #include @@ -26,18 +25,19 @@ #include "classifier.h" #include "dhcp.h" #include "flow.h" +#include "in-band.h" #include "netdev.h" #include "netlink.h" #include "odp-util.h" -#include "ofp-actions.h" #include "ofproto.h" -#include "openvswitch/ofpbuf.h" #include "ofproto-provider.h" #include "openflow/openflow.h" +#include "openvswitch/ofp-actions.h" +#include "openvswitch/ofpbuf.h" +#include "openvswitch/vlog.h" #include "packets.h" #include "poll-loop.h" #include "timeval.h" -#include "openvswitch/vlog.h" VLOG_DEFINE_THIS_MODULE(in_band); diff --git a/ofproto/ofproto-dpif-rid.h b/ofproto/ofproto-dpif-rid.h index 287663a..3efd85e 100644 --- a/ofproto/ofproto-dpif-rid.h +++ b/ofproto/ofproto-dpif-rid.h @@ -21,9 +21,9 @@ #include #include "cmap.h" -#include "openvswitch/list.h" -#include "ofp-actions.h" #include "ofproto-dpif-mirror.h" +#include "openvswitch/list.h" +#include "openvswitch/ofp-actions.h" #include "ovs-thread.h" #include "uuid.h" diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index a4fa09f..48674a2 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -22,7 +22,6 @@ #include #include -#include "tnl-neigh-cache.h" #include "bfd.h" #include "bitmap.h" #include "bond.h" @@ -33,32 +32,33 @@ #include "coverage.h" #include "dp-packet.h" #include "dpif.h" -#include "openvswitch/dynamic-string.h" #include "in-band.h" #include "lacp.h" #include "learn.h" -#include "openvswitch/list.h" -#include "ovs-lldp.h" #include "mac-learning.h" #include "mcast-snooping.h" -#include "openvswitch/meta-flow.h" #include "multipath.h" #include "netdev-vport.h" #include "netlink.h" #include "nx-match.h" #include "odp-execute.h" -#include "ofp-actions.h" #include "ofproto/ofproto-dpif-ipfix.h" #include "ofproto/ofproto-dpif-mirror.h" #include "ofproto/ofproto-dpif-monitor.h" #include "ofproto/ofproto-dpif-sflow.h" #include "ofproto/ofproto-dpif.h" #include "ofproto/ofproto-provider.h" -#include "packets.h" +#include "openvswitch/dynamic-string.h" +#include "openvswitch/meta-flow.h" +#include "openvswitch/list.h" +#include "openvswitch/ofp-actions.h" +#include "openvswitch/vlog.h" +#include "ovs-lldp.h" #include "ovs-router.h" +#include "packets.h" +#include "tnl-neigh-cache.h" #include "tnl-ports.h" #include "tunnel.h" -#include "openvswitch/vlog.h" COVERAGE_DEFINE(xlate_actions); COVERAGE_DEFINE(xlate_actions_oversize); diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 99ed723..9975ffb 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -15,10 +15,6 @@ */ #include - -#include "ofproto/ofproto-dpif.h" -#include "ofproto/ofproto-provider.h" - #include #include "bfd.h" @@ -29,9 +25,7 @@ #include "connmgr.h" #include "coverage.h" #include "cfm.h" -#include "ovs-lldp.h" #include "dpif.h" -#include "openvswitch/dynamic-string.h" #include "fail-open.h" #include "guarded-list.h" #include "hmapx.h" @@ -39,7 +33,6 @@ #include "learn.h" #include "mac-learning.h" #include "mcast-snooping.h" -#include "openvswitch/meta-flow.h" #include "multipath.h" #include "netdev-vport.h" #include "netdev.h" @@ -47,10 +40,9 @@ #include "nx-match.h" #include "odp-util.h" #include "odp-execute.h" -#include "openvswitch/ofp-util.h" -#include "openvswitch/ofpbuf.h" -#include "ofp-actions.h" #include "ofp-print.h" +#include "ofproto/ofproto-dpif.h" +#include "ofproto/ofproto-provider.h" #include "ofproto-dpif-ipfix.h" #include "ofproto-dpif-mirror.h" #include "ofproto-dpif-monitor.h" @@ -58,9 +50,17 @@ #include "ofproto-dpif-sflow.h" #include "ofproto-dpif-upcall.h" #include "ofproto-dpif-xlate.h" -#include "poll-loop.h" +#include "openvswitch/ofp-actions.h" +#include "openvswitch/dynamic-string.h" +#include "openvswitch/meta-flow.h" +#include "openvswitch/ofp-parse.h" +#include "openvswitch/ofp-util.h" +#include "openvswitch/ofpbuf.h" +#include "openvswitch/vlog.h" +#include "ovs-lldp.h" #include "ovs-rcu.h" #include "ovs-router.h" +#include "poll-loop.h" #include "seq.h" #include "simap.h" #include "smap.h" @@ -69,8 +69,6 @@ #include "unaligned.h" #include "unixctl.h" #include "vlan-bitmap.h" -#include "openvswitch/ofp-parse.h" -#include "openvswitch/vlog.h" VLOG_DEFINE_THIS_MODULE(ofproto_dpif); diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index 9d1a4b1..daa0077 100644 --- a/ofproto/ofproto-provider.h +++ b/ofproto/ofproto-provider.h @@ -38,10 +38,10 @@ #include "guarded-list.h" #include "heap.h" #include "hindex.h" +#include "ofproto/ofproto.h" #include "openvswitch/list.h" -#include "ofp-actions.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-util.h" -#include "ofproto/ofproto.h" #include "openvswitch/ofp-errors.h" #include "ovs-atomic.h" #include "ovs-rcu.h" diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index f6c0203..fa766f6 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -16,36 +16,38 @@ */ #include -#include "ofproto.h" #include #include #include #include #include + #include "bitmap.h" +#include "bundles.h" #include "byte-order.h" #include "classifier.h" #include "connectivity.h" #include "connmgr.h" #include "coverage.h" +#include "dp-packet.h" #include "hash.h" #include "hmap.h" #include "netdev.h" #include "nx-match.h" -#include "ofp-actions.h" #include "ofp-print.h" +#include "ofproto.h" #include "ofproto-provider.h" #include "openflow/nicira-ext.h" #include "openflow/openflow.h" #include "openvswitch/dynamic-string.h" #include "openvswitch/meta-flow.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-errors.h" #include "openvswitch/ofp-msgs.h" #include "openvswitch/ofp-util.h" #include "openvswitch/ofpbuf.h" #include "openvswitch/vlog.h" #include "ovs-rcu.h" -#include "dp-packet.h" #include "packets.h" #include "pinsched.h" #include "pktbuf.h" @@ -60,7 +62,6 @@ #include "tun-metadata.h" #include "unaligned.h" #include "unixctl.h" -#include "bundles.h" VLOG_DEFINE_THIS_MODULE(ofproto); diff --git a/ovn/controller/lflow.c b/ovn/controller/lflow.c index 91a3eee..96b7c66 100644 --- a/ovn/controller/lflow.c +++ b/ovn/controller/lflow.c @@ -16,9 +16,9 @@ #include #include "lflow.h" #include "lport.h" -#include "openvswitch/dynamic-string.h" #include "ofctrl.h" -#include "ofp-actions.h" +#include "openvswitch/dynamic-string.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofpbuf.h" #include "openvswitch/vlog.h" #include "ovn-controller.h" diff --git a/ovn/controller/ofctrl.c b/ovn/controller/ofctrl.c index e42d958..edd6f2a 100644 --- a/ovn/controller/ofctrl.c +++ b/ovn/controller/ofctrl.c @@ -15,15 +15,15 @@ #include #include "byte-order.h" -#include "ofctrl.h" #include "dirs.h" #include "hash.h" #include "hmap.h" -#include "ofp-actions.h" +#include "ofctrl.h" #include "ofp-print.h" #include "openflow/openflow.h" #include "openvswitch/dynamic-string.h" #include "openvswitch/match.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-msgs.h" #include "openvswitch/ofp-util.h" #include "openvswitch/ofpbuf.h" diff --git a/ovn/controller/physical.c b/ovn/controller/physical.c index 85708d4..e10909d 100644 --- a/ovn/controller/physical.c +++ b/ovn/controller/physical.c @@ -14,17 +14,17 @@ */ #include -#include "physical.h" #include "byte-order.h" #include "flow.h" #include "lflow.h" -#include "openvswitch/match.h" #include "ofctrl.h" -#include "ofp-actions.h" +#include "openvswitch/match.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofpbuf.h" +#include "openvswitch/vlog.h" #include "ovn-controller.h" #include "ovn/lib/ovn-sb-idl.h" -#include "openvswitch/vlog.h" +#include "physical.h" #include "shash.h" #include "simap.h" #include "smap.h" diff --git a/ovn/controller/pinctrl.c b/ovn/controller/pinctrl.c index 6555acf..9e9cd89 100644 --- a/ovn/controller/pinctrl.c +++ b/ovn/controller/pinctrl.c @@ -22,8 +22,8 @@ #include "dp-packet.h" #include "flow.h" #include "lport.h" -#include "ofp-actions.h" #include "ofp-print.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-msgs.h" #include "openvswitch/ofp-util.h" #include "openvswitch/vlog.h" diff --git a/ovn/lib/actions.c b/ovn/lib/actions.c index 92807f8..5f0bf19 100644 --- a/ovn/lib/actions.c +++ b/ovn/lib/actions.c @@ -15,16 +15,16 @@ */ #include -#include "actions.h" #include #include +#include "actions.h" #include "byte-order.h" #include "compiler.h" -#include "openvswitch/dynamic-string.h" #include "expr.h" #include "lex.h" #include "logical-fields.h" -#include "ofp-actions.h" +#include "openvswitch/dynamic-string.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofpbuf.h" #include "simap.h" diff --git a/ovn/lib/expr.c b/ovn/lib/expr.c index b3c7ce3..05dd498 100644 --- a/ovn/lib/expr.c +++ b/ovn/lib/expr.c @@ -17,16 +17,16 @@ #include #include "byte-order.h" #include "expr.h" -#include "openvswitch/dynamic-string.h" #include "json.h" #include "lex.h" #include "logical-fields.h" +#include "openvswitch/dynamic-string.h" #include "openvswitch/match.h" -#include "ofp-actions.h" +#include "openvswitch/ofp-actions.h" +#include "openvswitch/vlog.h" #include "shash.h" #include "simap.h" #include "sset.h" -#include "openvswitch/vlog.h" VLOG_DEFINE_THIS_MODULE(expr); diff --git a/tests/test-bundle.c b/tests/test-bundle.c index d19c23a..88949be 100644 --- a/tests/test-bundle.c +++ b/tests/test-bundle.c @@ -15,11 +15,11 @@ #include #undef NDEBUG -#include "bundle.h" #include #include +#include "bundle.h" #include "flow.h" -#include "ofp-actions.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofpbuf.h" #include "ovstest.h" #include "util.h" diff --git a/tests/test-multipath.c b/tests/test-multipath.c index 3fcc97a..08d2cba 100644 --- a/tests/test-multipath.c +++ b/tests/test-multipath.c @@ -16,14 +16,14 @@ #include #undef NDEBUG -#include "multipath.h" #include #include #include #include #include #include "flow.h" -#include "ofp-actions.h" +#include "multipath.h" +#include "openvswitch/ofp-actions.h" #include "ovstest.h" #include "util.h" diff --git a/tests/test-ovn.c b/tests/test-ovn.c index fae105f..051f3a7 100644 --- a/tests/test-ovn.c +++ b/tests/test-ovn.c @@ -15,16 +15,17 @@ */ #include -#include "command-line.h" #include #include #include -#include "openvswitch/dynamic-string.h" +#include "command-line.h" #include "fatal-signal.h" #include "flow.h" +#include "openvswitch/dynamic-string.h" #include "openvswitch/match.h" -#include "ofp-actions.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofpbuf.h" +#include "openvswitch/vlog.h" #include "ovn/lib/actions.h" #include "ovn/lib/expr.h" #include "ovn/lib/lex.h" @@ -33,7 +34,6 @@ #include "shash.h" #include "simap.h" #include "util.h" -#include "openvswitch/vlog.h" /* --relops: Bitmap of the relational operators to test, in exhaustive test. */ static unsigned int test_relops; diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index b50a4c4..6edb30c 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -40,7 +40,6 @@ #include "fatal-signal.h" #include "nx-match.h" #include "odp-util.h" -#include "ofp-actions.h" #include "ofp-print.h" #include "ofp-version-opt.h" #include "ofproto/ofproto.h" @@ -48,6 +47,7 @@ #include "openflow/openflow.h" #include "openvswitch/dynamic-string.h" #include "openvswitch/meta-flow.h" +#include "openvswitch/ofp-actions.h" #include "openvswitch/ofp-errors.h" #include "openvswitch/ofp-msgs.h" #include "openvswitch/ofp-util.h" @@ -59,12 +59,12 @@ #include "pcap-file.h" #include "poll-loop.h" #include "random.h" +#include "sort.h" #include "stream-ssl.h" #include "socket-util.h" #include "timeval.h" #include "unixctl.h" #include "util.h" -#include "sort.h" VLOG_DEFINE_THIS_MODULE(ofctl);