X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=include%2Fopenflow%2Fnicira-ext.h;h=1dcd32b5318f58c9b841523e86531e02705911d5;hb=2bcf7df6f7a87d8940deff6fbbc359b0a310a74a;hp=6ce87a2539e0c41da3032f7272ca93a3900a3134;hpb=75a75043564dc9b002fffa6c6ad71e0d4d5c892e;p=openvswitch diff --git a/include/openflow/nicira-ext.h b/include/openflow/nicira-ext.h index 6ce87a25..1dcd32b5 100644 --- a/include/openflow/nicira-ext.h +++ b/include/openflow/nicira-ext.h @@ -99,7 +99,20 @@ enum nx_bad_request_code { NXBRC_NXM_BAD_PREREQ = 0x104, /* A given nxm_type was specified more than once. */ - NXBRC_NXM_DUP_TYPE = 0x105 + NXBRC_NXM_DUP_TYPE = 0x105, + +/* Other errors. */ + + /* A request specified a nonexistent table ID. (But NXFMFC_BAD_TABLE_ID is + * used instead, when it is appropriate, because that is such a special + * case.) */ + NXBRC_BAD_TABLE_ID = 0x200, + + /* NXT_ROLE_REQUEST specified an invalid role. */ + NXBRC_BAD_ROLE = 0x201, + + /* The in_port in an ofp_packet_out request is invalid. */ + NXBRC_BAD_IN_PORT = 0x202 }; /* Additional "code" values for OFPET_FLOW_MOD_FAILED. */ @@ -282,7 +295,8 @@ enum nx_action_subtype { NXAST_BUNDLE_LOAD, /* struct nx_action_bundle */ NXAST_RESUBMIT_TABLE, /* struct nx_action_resubmit */ NXAST_OUTPUT_REG, /* struct nx_action_output_reg */ - NXAST_LEARN /* struct nx_action_learn */ + NXAST_LEARN, /* struct nx_action_learn */ + NXAST_EXIT /* struct nx_action_header */ }; /* Header for Nicira-defined actions. */ @@ -784,7 +798,8 @@ enum nx_mp_algorithm { * actions=load:A->NXM_NX_REG1[16..31]". * * In syntax accepted by ovs-ofctl, this action is: learn(in_port=99, - * NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31]) + * NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], + * load:NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31]) * * 2. Output to input port based on the source MAC and VLAN VID, with lookup * into NXM_NX_REG1[16:31]: @@ -935,6 +950,13 @@ OFP_ASSERT(sizeof(struct nx_action_autopath) == 24); * slave. If the switch does not support the specified 'algorithm' parameter, * it should reject the action. * + * Several algorithms take into account liveness when selecting slaves. The + * liveness of a slave is implementation defined (with one exception), but will + * generally take into account things like its carrier status and the results + * of any link monitoring protocols which happen to be running on it. In order + * to give controllers a place-holder value, the OFPP_NONE port is always + * considered live. + * * Some slave selection strategies require the use of a hash function, in which * case the 'fields' and 'basis' parameters should be populated. The 'fields' * parameter (one of NX_HASH_FIELDS_*) designates which parts of the flow to @@ -956,13 +978,13 @@ struct nx_action_bundle { ovs_be16 type; /* OFPAT_VENDOR. */ ovs_be16 len; /* Length including slaves. */ ovs_be32 vendor; /* NX_VENDOR_ID. */ - ovs_be16 subtype; /* NXAST_BUNDLE. */ + ovs_be16 subtype; /* NXAST_BUNDLE or NXAST_BUNDLE_LOAD. */ /* Slave choice algorithm to apply to hash value. */ ovs_be16 algorithm; /* One of NX_BD_ALG_*. */ /* What fields to hash and how. */ - ovs_be16 fields; /* One of NX_BD_FIELDS_*. */ + ovs_be16 fields; /* One of NX_HASH_FIELDS_*. */ ovs_be16 basis; /* Universal hash parameter. */ ovs_be32 slave_type; /* NXM_OF_IN_PORT. */ @@ -1026,6 +1048,18 @@ struct nx_action_output_reg { }; OFP_ASSERT(sizeof(struct nx_action_output_reg) == 24); +/* NXAST_EXIT + * + * Discontinues action processing. + * + * The NXAST_EXIT action causes the switch to immediately halt processing + * actions for the flow. Any actions which have already been processed are + * executed by the switch. However, any further actions, including those which + * may be in different tables, or different levels of the NXAST_RESUBMIT + * hierarchy, will be ignored. + * + * Uses the nx_action_header structure. */ + /* Flexible flow specifications (aka NXM = Nicira Extended Match). * * OpenFlow 1.0 has "struct ofp_match" for specifying flow matches. This @@ -1133,12 +1167,12 @@ OFP_ASSERT(sizeof(struct nx_action_output_reg) == 24); * and nxm_value=0x0800. That is, matching on the IP source address is * allowed only if the Ethernet type is explicitly set to IP. * - * - An nxm_entry for nxm_type=NXM_OF_TCP_SRC is allowed only if it is preced - * by an entry with nxm_type=NXM_OF_ETH_TYPE, nxm_hasmask=0, - * nxm_value=0x0800 and another with nxm_type=NXM_OF_IP_PROTO, - * nxm_hasmask=0, nxm_value=6, in that order. That is, matching on the TCP - * source port is allowed only if the Ethernet type is IP and the IP - * protocol is TCP. + * - An nxm_entry for nxm_type=NXM_OF_TCP_SRC is allowed only if it is + * preceded by an entry with nxm_type=NXM_OF_ETH_TYPE, nxm_hasmask=0, and + * nxm_value either 0x0800 or 0x86dd, and another with + * nxm_type=NXM_OF_IP_PROTO, nxm_hasmask=0, nxm_value=6, in that order. + * That is, matching on the TCP source port is allowed only if the Ethernet + * type is IP or IPv6 and the IP protocol is TCP. * * These restrictions should be noted in specifications for individual fields. * A switch may implement relaxed versions of these restrictions. A switch @@ -1439,6 +1473,8 @@ OFP_ASSERT(sizeof(struct nx_action_output_reg) == 24); #define NXM_NX_REG2_W NXM_HEADER_W(0x0001, 2, 4) #define NXM_NX_REG3 NXM_HEADER (0x0001, 3, 4) #define NXM_NX_REG3_W NXM_HEADER_W(0x0001, 3, 4) +#define NXM_NX_REG4 NXM_HEADER (0x0001, 4, 4) +#define NXM_NX_REG4_W NXM_HEADER_W(0x0001, 4, 4) /* Tunnel ID. * @@ -1528,6 +1564,98 @@ OFP_ASSERT(sizeof(struct nx_action_output_reg) == 24); * Masking: Not maskable. */ #define NXM_NX_ND_TLL NXM_HEADER (0x0001, 25, 6) +/* IP fragment information. + * + * Prereqs: + * NXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd. + * + * Format: 8-bit value with one of the values 0, 1, or 3, as described below. + * + * Masking: Fully maskable. + * + * This field has three possible values: + * + * - A packet that is not an IP fragment has value 0. + * + * - A packet that is an IP fragment with offset 0 (the first fragment) has + * bit 0 set and thus value 1. + * + * - A packet that is an IP fragment with nonzero offset has bits 0 and 1 set + * and thus value 3. + * + * NX_IP_FRAG_ANY and NX_IP_FRAG_LATER are declared to symbolically represent + * the meanings of bits 0 and 1. + * + * The switch may reject matches against values that can never appear. + * + * It is important to understand how this field interacts with the OpenFlow IP + * fragment handling mode: + * + * - In OFPC_FRAG_DROP mode, the OpenFlow switch drops all IP fragments + * before they reach the flow table, so every packet that is available for + * matching will have value 0 in this field. + * + * - Open vSwitch does not implement OFPC_FRAG_REASM mode, but if it did then + * IP fragments would be reassembled before they reached the flow table and + * again every packet available for matching would always have value 0. + * + * - In OFPC_FRAG_NORMAL mode, all three values are possible, but OpenFlow + * 1.0 says that fragments' transport ports are always 0, even for the + * first fragment, so this does not provide much extra information. + * + * - In OFPC_FRAG_NX_MATCH mode, all three values are possible. For + * fragments with offset 0, Open vSwitch makes L4 header information + * available. + */ +#define NXM_NX_IP_FRAG NXM_HEADER (0x0001, 26, 1) +#define NXM_NX_IP_FRAG_W NXM_HEADER_W(0x0001, 26, 1) + +/* Bits in the value of NXM_NX_IP_FRAG. */ +#define NX_IP_FRAG_ANY (1 << 0) /* Is this a fragment? */ +#define NX_IP_FRAG_LATER (1 << 1) /* Is this a fragment with nonzero offset? */ + +/* The flow label in the IPv6 header. + * + * Prereqs: NXM_OF_ETH_TYPE must match 0x86dd exactly. + * + * Format: 20-bit IPv6 flow label in least-significant bits. + * + * Masking: Not maskable. */ +#define NXM_NX_IPV6_LABEL NXM_HEADER (0x0001, 27, 4) + +/* The ECN of the IP header. + * + * Prereqs: NXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd. + * + * Format: ECN in the low-order 2 bits. + * + * Masking: Not maskable. */ +#define NXM_NX_IP_ECN NXM_HEADER (0x0001, 28, 1) + +/* The time-to-live/hop limit of the IP header. + * + * Prereqs: NXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd. + * + * Format: 8-bit integer. + * + * Masking: Not maskable. */ +#define NXM_NX_IP_TTL NXM_HEADER (0x0001, 29, 1) + +/* Flow cookie. + * + * This may be used to gain the OpenFlow 1.1-like ability to restrict + * certain NXM-based Flow Mod and Flow Stats Request messages to flows + * with specific cookies. See the "nx_flow_mod" and "nx_flow_stats_request" + * structure definitions for more details. This match is otherwise not + * allowed. + * + * Prereqs: None. + * + * Format: 64-bit integer in network byte order. + * + * Masking: Arbitrary masks. */ +#define NXM_NX_COOKIE NXM_HEADER (0x0001, 30, 8) +#define NXM_NX_COOKIE_W NXM_HEADER_W(0x0001, 30, 8) /* ## --------------------- ## */ /* ## Requests and replies. ## */ @@ -1547,7 +1675,14 @@ struct nxt_set_flow_format { }; OFP_ASSERT(sizeof(struct nxt_set_flow_format) == 20); -/* NXT_FLOW_MOD (analogous to OFPT_FLOW_MOD). */ +/* NXT_FLOW_MOD (analogous to OFPT_FLOW_MOD). + * + * It is possible to limit flow deletions and modifications to certain + * cookies by using the NXM_NX_COOKIE and NXM_NX_COOKIE_W matches. For + * these commands, the "cookie" field is always ignored. Flow additions + * make use of the "cookie" field and ignore any NXM_NX_COOKIE* + * definitions. + */ struct nx_flow_mod { struct nicira_header nxh; ovs_be64 cookie; /* Opaque controller-issued identifier. */ @@ -1596,7 +1731,11 @@ struct nx_flow_removed { OFP_ASSERT(sizeof(struct nx_flow_removed) == 56); /* Nicira vendor stats request of type NXST_FLOW (analogous to OFPST_FLOW - * request). */ + * request). + * + * It is possible to limit matches to certain cookies by using the + * NXM_NX_COOKIE and NXM_NX_COOKIE_W matches. + */ struct nx_flow_stats_request { struct nicira_stats_msg nsm; ovs_be16 out_port; /* Require matching entries to include this