* experimental OpenFlow version.
*/
#define OFP_VERSION 0x01
+#define OFP10_VERSION 0x01
#define OFP_MAX_TABLE_NAME_LEN 32
#define OFP_MAX_PORT_NAME_LEN 16
OFPC_FRAG_NORMAL = 0, /* No special handling for fragments. */
OFPC_FRAG_DROP = 1, /* Drop fragments. */
OFPC_FRAG_REASM = 2, /* Reassemble (only if OFPC_IP_REASM set). */
+ OFPC_FRAG_NX_MATCH = 3, /* Make first fragments available for matching. */
OFPC_FRAG_MASK = 3
};
};
OFP_ASSERT(sizeof(struct ofp_match) == 40);
-/* The match fields for ICMP type and code use the transport source and
- * destination port fields, respectively. */
-#define icmp_type tp_src
-#define icmp_code tp_dst
-
/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry
* is permanent. */
#define OFP_FLOW_PERMANENT 0
enum ofp_stats_types {
/* Description of this OpenFlow switch.
- * The request body is empty.
- * The reply body is struct ofp_desc_stats. */
+ * The request is struct ofp_stats_msg.
+ * The reply is struct ofp_desc_stats. */
OFPST_DESC,
/* Individual flow statistics.
- * The request body is struct ofp_flow_stats_request.
+ * The request is struct ofp_flow_stats_request.
* The reply body is an array of struct ofp_flow_stats. */
OFPST_FLOW,
/* Aggregate flow statistics.
- * The request body is struct ofp_aggregate_stats_request.
- * The reply body is struct ofp_aggregate_stats_reply. */
+ * The request is struct ofp_flow_stats_request.
+ * The reply is struct ofp_aggregate_stats_reply. */
OFPST_AGGREGATE,
/* Flow table statistics.
- * The request body is empty.
+ * The request is struct ofp_stats_msg.
* The reply body is an array of struct ofp_table_stats. */
OFPST_TABLE,
/* Physical port statistics.
- * The request body is struct ofp_port_stats_request.
+ * The request is struct ofp_port_stats_request.
* The reply body is an array of struct ofp_port_stats. */
OFPST_PORT,
- /* Queue statistics for a port
+ /* Queue statistics for a port.
* The request body is struct ofp_queue_stats_request.
* The reply body is an array of struct ofp_queue_stats. */
OFPST_QUEUE,
/* Vendor extension.
- * The request and reply bodies begin with a 32-bit vendor ID, which takes
- * the same form as in "struct ofp_vendor_header". The request and reply
- * bodies are otherwise vendor-defined. */
+ * The request and reply begin with "struct ofp_vendor_stats". */
OFPST_VENDOR = 0xffff
};
#define DESC_STR_LEN 256
#define SERIAL_NUM_LEN 32
-/* Body of reply to OFPST_DESC request. Each entry is a NULL-terminated
- * ASCII string. */
+/* Reply to OFPST_DESC request. Each entry is a NULL-terminated ASCII
+ * string. */
struct ofp_desc_stats {
+ struct ofp_stats_msg osm;
char mfr_desc[DESC_STR_LEN]; /* Manufacturer description. */
char hw_desc[DESC_STR_LEN]; /* Hardware description. */
char sw_desc[DESC_STR_LEN]; /* Software description. */
char dp_desc[DESC_STR_LEN]; /* Human readable description of
the datapath. */
};
-OFP_ASSERT(sizeof(struct ofp_desc_stats) == 1056);
+OFP_ASSERT(sizeof(struct ofp_desc_stats) == 1068);
-/* Body for stats request of type OFPST_FLOW. */
+/* Stats request of type OFPST_AGGREGATE or OFPST_FLOW. */
struct ofp_flow_stats_request {
+ struct ofp_stats_msg osm;
struct ofp_match match; /* Fields to match. */
uint8_t table_id; /* ID of table to read (from ofp_table_stats)
or 0xff for all tables. */
as an output port. A value of OFPP_NONE
indicates no restriction. */
};
-OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 44);
+OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 56);
/* Body of reply to OFPST_FLOW request. */
struct ofp_flow_stats {
};
OFP_ASSERT(sizeof(struct ofp_flow_stats) == 88);
-/* Body for stats request of type OFPST_AGGREGATE. */
-struct ofp_aggregate_stats_request {
- struct ofp_match match; /* Fields to match. */
- uint8_t table_id; /* ID of table to read (from ofp_table_stats)
- or 0xff for all tables. */
- uint8_t pad; /* Align to 32 bits. */
- ovs_be16 out_port; /* Require matching entries to include this
- as an output port. A value of OFPP_NONE
- indicates no restriction. */
-};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_request) == 44);
-
-/* Body of reply to OFPST_AGGREGATE request. */
+/* Reply to OFPST_AGGREGATE request. */
struct ofp_aggregate_stats_reply {
+ struct ofp_stats_msg osm;
ovs_32aligned_be64 packet_count; /* Number of packets in flows. */
ovs_32aligned_be64 byte_count; /* Number of bytes in flows. */
ovs_be32 flow_count; /* Number of flows. */
uint8_t pad[4]; /* Align to 64 bits. */
};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24);
+OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 36);
/* Body of reply to OFPST_TABLE request. */
struct ofp_table_stats {
};
OFP_ASSERT(sizeof(struct ofp_table_stats) == 64);
-/* Body for stats request of type OFPST_PORT. */
+/* Stats request of type OFPST_PORT. */
struct ofp_port_stats_request {
+ struct ofp_stats_msg osm;
ovs_be16 port_no; /* OFPST_PORT message may request statistics
for a single port (specified with port_no)
or for all ports (port_no == OFPP_NONE). */
uint8_t pad[6];
};
-OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 8);
+OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 20);
/* Body of reply to OFPST_PORT request. If a counter is unsupported, set
* the field to all ones. */
/* Body for stats request of type OFPST_QUEUE. */
struct ofp_queue_stats_request {
+ struct ofp_stats_msg osm;
ovs_be16 port_no; /* All ports if OFPP_ALL. */
uint8_t pad[2]; /* Align to 32-bits. */
ovs_be32 queue_id; /* All queues if OFPQ_ALL. */
};
-OFP_ASSERT(sizeof(struct ofp_queue_stats_request) == 8);
+OFP_ASSERT(sizeof(struct ofp_queue_stats_request) == 20);
/* Body for stats reply of type OFPST_QUEUE consists of an array of this
* structure type. */
};
OFP_ASSERT(sizeof(struct ofp_queue_stats) == 32);
+/* Vendor extension stats message. */
+struct ofp_vendor_stats_msg {
+ struct ofp_stats_msg osm; /* Type OFPST_VENDOR. */
+ ovs_be32 vendor; /* Vendor ID:
+ * - MSB 0: low-order bytes are IEEE OUI.
+ * - MSB != 0: defined by OpenFlow
+ * consortium. */
+ /* Followed by vendor-defined arbitrary additional data. */
+};
+OFP_ASSERT(sizeof(struct ofp_vendor_stats_msg) == 16);
+
/* Vendor extension. */
struct ofp_vendor_header {
struct ofp_header header; /* Type OFPT_VENDOR. */