summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJustin Pettit <jpettit@nicira.com>2010-12-29 19:03:46 -0800
committerJustin Pettit <jpettit@nicira.com>2011-02-02 12:53:26 -0800
commitd31f1109f10e5ffb9bf266306b913ebf23781666 (patch)
treeddd80cc2348874fdea55a4e88e0990f821fb5e03 /include
parentbad68a9965215511b305c59d7f1830344ec2241f (diff)
downloadopenvswitch-d31f1109f10e5ffb9bf266306b913ebf23781666.tar.gz
nicira-ext: Support matching IPv6 traffic.
Provides ability to match over IPv6 traffic in the same manner as IPv4. Currently, the matching fields include: - IPv6 source and destination addresses (ipv6_src and ipv6_dst) - Traffic Class (nw_tos) - Next Header (nw_proto) - ICMPv6 Type and Code (icmp_type and icmp_code) - TCP and UDP Ports over IPv6 (tp_src and tp_dst) When defining IPv6 rules, the Nicira Extensible Match (NXM) extension to OVS must be used. Signed-off-by: Justin Pettit <jpettit@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'include')
-rw-r--r--include/openflow/nicira-ext.h36
-rw-r--r--include/openvswitch/datapath-protocol.h14
2 files changed, 46 insertions, 4 deletions
diff --git a/include/openflow/nicira-ext.h b/include/openflow/nicira-ext.h
index c5b0a7ca8..f67862639 100644
--- a/include/openflow/nicira-ext.h
+++ b/include/openflow/nicira-ext.h
@@ -388,6 +388,8 @@ OFP_ASSERT(sizeof(struct nx_action_pop_queue) == 16);
* - NXM_NX_TUN_ID
* - NXM_NX_ARP_SHA
* - NXM_NX_ARP_THA
+ * - NXM_NX_ICMPV6_TYPE
+ * - NXM_NX_ICMPV6_CODE
* - NXM_NX_REG(idx) for idx in the switch's accepted range.
*
* The following nxm_header values are potentially acceptable as 'dst':
@@ -904,7 +906,7 @@ enum nx_mp_algorithm {
/* 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.
*
@@ -913,7 +915,7 @@ enum nx_mp_algorithm {
/* 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.
*
@@ -936,7 +938,7 @@ enum nx_mp_algorithm {
/* 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.
@@ -948,7 +950,7 @@ enum nx_mp_algorithm {
/* 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.
@@ -1051,6 +1053,32 @@ enum nx_mp_algorithm {
#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)
+
+
/* ## --------------------- ## */
/* ## Requests and replies. ## */
/* ## --------------------- ## */
diff --git a/include/openvswitch/datapath-protocol.h b/include/openvswitch/datapath-protocol.h
index fdd225db6..13b7d9d1a 100644
--- a/include/openvswitch/datapath-protocol.h
+++ b/include/openvswitch/datapath-protocol.h
@@ -311,9 +311,11 @@ enum odp_key_type {
ODP_KEY_ATTR_8021Q, /* struct odp_key_8021q */
ODP_KEY_ATTR_ETHERTYPE, /* 16-bit Ethernet type */
ODP_KEY_ATTR_IPV4, /* struct odp_key_ipv4 */
+ ODP_KEY_ATTR_IPV6, /* struct odp_key_ipv6 */
ODP_KEY_ATTR_TCP, /* struct odp_key_tcp */
ODP_KEY_ATTR_UDP, /* struct odp_key_udp */
ODP_KEY_ATTR_ICMP, /* struct odp_key_icmp */
+ ODP_KEY_ATTR_ICMPV6, /* struct odp_key_icmpv6 */
ODP_KEY_ATTR_ARP, /* struct odp_key_arp */
__ODP_KEY_ATTR_MAX
};
@@ -337,6 +339,13 @@ struct odp_key_ipv4 {
uint8_t ipv4_tos;
};
+struct odp_key_ipv6 {
+ ovs_be32 ipv6_src[4];
+ ovs_be32 ipv6_dst[4];
+ uint8_t ipv6_proto;
+ uint8_t ipv6_tos;
+};
+
struct odp_key_tcp {
ovs_be16 tcp_src;
ovs_be16 tcp_dst;
@@ -352,6 +361,11 @@ struct odp_key_icmp {
uint8_t icmp_code;
};
+struct odp_key_icmpv6 {
+ uint8_t icmpv6_type;
+ uint8_t icmpv6_code;
+};
+
struct odp_key_arp {
ovs_be32 arp_sip;
ovs_be32 arp_tip;