X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fopenflow%2Fnicira-ext.h;h=88efdf6531ccb2df82be81181d9222084c3c2536;hb=685a51a5b89750cead1b2934c2079d2bb9c52a4a;hp=b18214f6e14575c14ab22d97f7caf474ba5e976d;hpb=459749fe9b667cbc67f64aa8a6853512d442262f;p=sliver-openvswitch.git diff --git a/include/openflow/nicira-ext.h b/include/openflow/nicira-ext.h index b18214f6e..88efdf653 100644 --- a/include/openflow/nicira-ext.h +++ b/include/openflow/nicira-ext.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks + * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,7 +36,7 @@ * * This extension attempts to address the problem by adding a generic "error * vendor extension". The extension works as follows: use NXET_VENDOR as type - * and NXVC_VENDOR_CODE as code, followed by struct nx_vendor_error with + * and NXVC_VENDOR_ERROR as code, followed by struct nx_vendor_error with * vendor-specific details, followed by at least 64 bytes of the failed * request. * @@ -76,7 +76,7 @@ struct nx_vendor_error { * that duplicate the current ones' meanings. */ /* Additional "code" values for OFPET_BAD_REQUEST. */ -enum { +enum nx_bad_request_code { /* Nicira Extended Match (NXM) errors. */ /* Generic error code used when there is an error in an NXM sent to the @@ -103,7 +103,7 @@ enum { }; /* Additional "code" values for OFPET_FLOW_MOD_FAILED. */ -enum { +enum nx_flow_mod_failed_code { /* Generic hardware error. */ NXFMFC_HARDWARE = 0x100, @@ -230,6 +230,7 @@ enum nx_action_subtype { NXAST_REG_LOAD, /* struct nx_action_reg_load */ NXAST_NOTE, /* struct nx_action_note */ NXAST_SET_TUNNEL64, /* struct nx_action_set_tunnel64 */ + NXAST_MULTIPATH /* struct nx_action_multipath */ }; /* Header for Nicira-defined actions. */ @@ -311,9 +312,9 @@ OFP_ASSERT(sizeof(struct nx_action_set_tunnel64) == 24); * Ethernet+IPv4 ARP packet for which the source Ethernet address inside the * ARP packet differs from the source Ethernet address in the Ethernet header. * - * This is useful because OpenFlow does not provide a way to match on the - * Ethernet addresses inside ARP packets, so there is no other way to drop - * spoofed ARPs other than sending every ARP packet to a controller. */ + * (This action is deprecated in favor of defining flows using the + * NXM_NX_ARP_SHA flow match and will likely be removed in a future version + * of Open vSwitch.) */ struct nx_action_drop_spoofed_arp { ovs_be16 type; /* OFPAT_VENDOR. */ ovs_be16 len; /* Length is 16. */ @@ -385,6 +386,12 @@ OFP_ASSERT(sizeof(struct nx_action_pop_queue) == 16); * - NXM_OF_ARP_SPA * - NXM_OF_ARP_TPA * - NXM_NX_TUN_ID + * - NXM_NX_ARP_SHA + * - NXM_NX_ARP_THA + * - NXM_NX_ICMPV6_TYPE + * - NXM_NX_ICMPV6_CODE + * - NXM_NX_ND_SLL + * - NXM_NX_ND_TLL * - NXM_NX_REG(idx) for idx in the switch's accepted range. * * The following nxm_header values are potentially acceptable as 'dst': @@ -429,9 +436,9 @@ OFP_ASSERT(sizeof(struct nx_action_reg_move) == 24); * starts at 0 for the least-significant bit, 1 for the next most significant * bit, and so on. * - * 'dst' is an nxm_header with nxm_hasmask=0. It must be one of the following: - * - * - NXM_NX_REG(idx) for idx in the switch's accepted range. + * 'dst' is an nxm_header with nxm_hasmask=0. See the documentation for + * NXAST_REG_MOVE, above, for the permitted fields and for the side effects of + * loading them. * * The 'ofs' and 'n_bits' fields are combined into a single 'ofs_nbits' field * to avoid enlarging the structure by another 8 bytes. To allow 'n_bits' to @@ -477,6 +484,132 @@ struct nx_action_note { }; OFP_ASSERT(sizeof(struct nx_action_note) == 16); +/* Action structure for NXAST_MULTIPATH. + * + * This action performs the following steps in sequence: + * + * 1. Hashes the fields designated by 'fields', one of NX_MP_FIELDS_*. + * Refer to the definition of "enum nx_mp_fields" for details. + * + * The 'basis' value is used as a universal hash parameter, that is, + * different values of 'basis' yield different hash functions. The + * particular universal hash function used is implementation-defined. + * + * The hashed fields' values are drawn from the current state of the + * flow, including all modifications that have been made by actions up to + * this point. + * + * 2. Applies the multipath link choice algorithm specified by 'algorithm', + * one of NX_MP_ALG_*. Refer to the definition of "enum nx_mp_algorithm" + * for details. + * + * The output of the algorithm is 'link', an unsigned integer less than + * or equal to 'max_link'. + * + * Some algorithms use 'arg' as an additional argument. + * + * 3. Stores 'link' in dst[ofs:ofs+n_bits]. The format and semantics of + * 'dst' and 'ofs_nbits' are identical to those for the NXAST_REG_LOAD + * action; refer to the description of that action for details. + * + * The switch will reject actions that have an unknown 'fields', or an unknown + * 'algorithm', or in which ofs+n_bits is greater than the width of 'dst', or + * in which 'max_link' is greater than or equal to 2**n_bits, with error type + * OFPET_BAD_ACTION, code OFPBAC_BAD_ARGUMENT. + */ +struct nx_action_multipath { + ovs_be16 type; /* OFPAT_VENDOR. */ + ovs_be16 len; /* Length is 32. */ + ovs_be32 vendor; /* NX_VENDOR_ID. */ + ovs_be16 subtype; /* NXAST_MULTIPATH. */ + + /* What fields to hash and how. */ + ovs_be16 fields; /* One of NX_MP_FIELDS_*. */ + ovs_be16 basis; /* Universal hash parameter. */ + ovs_be16 pad0; + + /* Multipath link choice algorithm to apply to hash value. */ + ovs_be16 algorithm; /* One of NX_MP_ALG_*. */ + ovs_be16 max_link; /* Number of output links, minus 1. */ + ovs_be32 arg; /* Algorithm-specific argument. */ + ovs_be16 pad1; + + /* Where to store the result. */ + ovs_be16 ofs_nbits; /* (ofs << 6) | (n_bits - 1). */ + ovs_be32 dst; /* Destination register. */ +}; +OFP_ASSERT(sizeof(struct nx_action_multipath) == 32); + +/* NXAST_MULTIPATH: Fields to hash. */ +enum nx_mp_fields { + /* Ethernet source address (NXM_OF_ETH_SRC) only. */ + NX_MP_FIELDS_ETH_SRC, + + /* L2 through L4, symmetric across src/dst. Specifically, each of the + * following fields, if present, is hashed (slashes separate symmetric + * pairs): + * + * - NXM_OF_ETH_DST / NXM_OF_ETH_SRC + * - NXM_OF_ETH_TYPE + * - The VID bits from NXM_OF_VLAN_TCI, ignoring PCP and CFI. + * - NXM_OF_IP_PROTO + * - NXM_OF_IP_SRC / NXM_OF_IP_DST + * - NXM_OF_TCP_SRC / NXM_OF_TCP_DST + * - NXM_OF_UDP_SRC / NXM_OF_UDP_DST + */ + NX_MP_FIELDS_SYMMETRIC_L4 +}; + +/* NXAST_MULTIPATH: 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, + + /* 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, + + /* 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, /* Highest Random Weight. */ + + /* 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 /* Iterative Hash. */ +}; + /* Wildcard for tunnel ID. */ #define NXFW_TUN_ID (1 << 25) @@ -775,7 +908,7 @@ OFP_ASSERT(sizeof(struct nx_action_note) == 16); /* The "type of service" byte of the IP header, with the ECN bits forced to 0. * - * Prereqs: NXM_OF_ETH_TYPE must match 0x0800 exactly. + * Prereqs: NXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd. * * Format: 8-bit integer with 2 least-significant bits forced to 0. * @@ -784,7 +917,7 @@ OFP_ASSERT(sizeof(struct nx_action_note) == 16); /* The "protocol" byte in the IP header. * - * Prereqs: NXM_OF_ETH_TYPE must match 0x0800 exactly. + * Prereqs: NXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd. * * Format: 8-bit integer. * @@ -807,7 +940,7 @@ OFP_ASSERT(sizeof(struct nx_action_note) == 16); /* The source or destination port in the TCP header. * * Prereqs: - * NXM_OF_ETH_TYPE must match 0x0800 exactly. + * NXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd. * NXM_OF_IP_PROTO must match 6 exactly. * * Format: 16-bit integer in network byte order. @@ -819,7 +952,7 @@ OFP_ASSERT(sizeof(struct nx_action_note) == 16); /* The source or destination port in the UDP header. * * Prereqs: - * NXM_OF_ETH_TYPE must match 0x0800 exactly. + * NXM_OF_ETH_TYPE must match either 0x0800 or 0x86dd. * NXM_OF_IP_PROTO must match 17 exactly. * * Format: 16-bit integer in network byte order. @@ -911,6 +1044,81 @@ OFP_ASSERT(sizeof(struct nx_action_note) == 16); #define NXM_NX_TUN_ID NXM_HEADER (0x0001, 16, 8) #define NXM_NX_TUN_ID_W NXM_HEADER_W(0x0001, 16, 8) +/* For an Ethernet+IP ARP packet, the source or target hardware address + * in the ARP header. Always 0 otherwise. + * + * Prereqs: NXM_OF_ETH_TYPE must match 0x0806 exactly. + * + * Format: 48-bit Ethernet MAC address. + * + * Masking: Not maskable. */ +#define NXM_NX_ARP_SHA NXM_HEADER (0x0001, 17, 6) +#define NXM_NX_ARP_THA NXM_HEADER (0x0001, 18, 6) + +/* The source or destination address in the IPv6 header. + * + * Prereqs: NXM_OF_ETH_TYPE must match 0x86dd exactly. + * + * Format: 128-bit IPv6 address. + * + * Masking: Only CIDR masks are allowed, that is, masks that consist of N + * high-order bits set to 1 and the other 128-N bits set to 0. */ +#define NXM_NX_IPV6_SRC NXM_HEADER (0x0001, 19, 16) +#define NXM_NX_IPV6_SRC_W NXM_HEADER_W(0x0001, 19, 16) +#define NXM_NX_IPV6_DST NXM_HEADER (0x0001, 20, 16) +#define NXM_NX_IPV6_DST_W NXM_HEADER_W(0x0001, 20, 16) + +/* The type or code in the ICMPv6 header. + * + * Prereqs: + * NXM_OF_ETH_TYPE must match 0x86dd exactly. + * NXM_OF_IP_PROTO must match 58 exactly. + * + * Format: 8-bit integer. + * + * Masking: Not maskable. */ +#define NXM_NX_ICMPV6_TYPE NXM_HEADER (0x0001, 21, 1) +#define NXM_NX_ICMPV6_CODE NXM_HEADER (0x0001, 22, 1) + +/* The target address in an IPv6 Neighbor Discovery message. + * + * Prereqs: + * NXM_OF_ETH_TYPE must match 0x86dd exactly. + * NXM_OF_IP_PROTO must match 58 exactly. + * NXM_OF_ICMPV6_TYPE must be either 135 or 136. + * + * Format: 128-bit IPv6 address. + * + * Masking: Not maskable. */ +#define NXM_NX_ND_TARGET NXM_HEADER (0x0001, 23, 16) + +/* The source link-layer address option in an IPv6 Neighbor Discovery + * message. + * + * Prereqs: + * NXM_OF_ETH_TYPE must match 0x86dd exactly. + * NXM_OF_IP_PROTO must match 58 exactly. + * NXM_OF_ICMPV6_TYPE must be exactly 135. + * + * Format: 48-bit Ethernet MAC address. + * + * Masking: Not maskable. */ +#define NXM_NX_ND_SLL NXM_HEADER (0x0001, 24, 6) + +/* The target link-layer address option in an IPv6 Neighbor Discovery + * message. + * + * Prereqs: + * NXM_OF_ETH_TYPE must match 0x86dd exactly. + * NXM_OF_IP_PROTO must match 58 exactly. + * NXM_OF_ICMPV6_TYPE must be exactly 136. + * + * Format: 48-bit Ethernet MAC address. + * + * Masking: Not maskable. */ +#define NXM_NX_ND_TLL NXM_HEADER (0x0001, 25, 6) + + /* ## --------------------- ## */ /* ## Requests and replies. ## */ /* ## --------------------- ## */