#define OFP_PACKED /* SWIG doesn't understand __attribute. */
#endif
-/* Maximum length of a OpenFlow packet. */
-#define OFP_MAXLEN (sizeof(struct ofp_switch_features) \
- + (sizeof(struct ofp_phy_port) * OFPP_MAX) + 200)
-
-
/* The most significant bit being set in the version field indicates an
* experimental OpenFlow version.
*/
-#define OFP_VERSION 0x90
+#define OFP_VERSION 0x91
#define OFP_MAX_TABLE_NAME_LEN 32
#define OFP_MAX_PORT_NAME_LEN 16
};
enum ofp_type {
- OFPT_FEATURES_REQUEST, /* 0 Controller/switch message */
- OFPT_FEATURES_REPLY, /* 1 Controller/switch message */
- OFPT_GET_CONFIG_REQUEST, /* 2 Controller/switch message */
- OFPT_GET_CONFIG_REPLY, /* 3 Controller/switch message */
- OFPT_SET_CONFIG, /* 4 Controller/switch message */
- OFPT_PACKET_IN, /* 5 Async message */
- OFPT_PACKET_OUT, /* 6 Controller/switch message */
- OFPT_FLOW_MOD, /* 7 Controller/switch message */
- OFPT_FLOW_EXPIRED, /* 8 Async message */
- OFPT_TABLE, /* 9 Controller/switch message */
- OFPT_PORT_MOD, /* 10 Controller/switch message */
- OFPT_PORT_STATUS, /* 11 Async message */
- OFPT_ERROR_MSG, /* 12 Async message */
- OFPT_STATS_REQUEST, /* 13 Controller/switch message */
- OFPT_STATS_REPLY, /* 14 Controller/switch message */
- OFPT_ECHO_REQUEST, /* 15 Symmetric message */
- OFPT_ECHO_REPLY /* 16 Symmetric message */
+ /* Immutable messages. */
+ OFPT_HELLO, /* Symmetric message */
+ OFPT_ERROR, /* Symmetric message */
+ OFPT_ECHO_REQUEST, /* Symmetric message */
+ OFPT_ECHO_REPLY, /* Symmetric message */
+ OFPT_VENDOR, /* Symmetric message */
+
+ /* Switch configuration messages. */
+ OFPT_FEATURES_REQUEST, /* Controller/switch message */
+ OFPT_FEATURES_REPLY, /* Controller/switch message */
+ OFPT_GET_CONFIG_REQUEST, /* Controller/switch message */
+ OFPT_GET_CONFIG_REPLY, /* Controller/switch message */
+ OFPT_SET_CONFIG, /* Controller/switch message */
+
+ /* Asynchronous messages. */
+ OFPT_PACKET_IN, /* Async message */
+ OFPT_FLOW_EXPIRED, /* Async message */
+ OFPT_PORT_STATUS, /* Async message */
+
+ /* Controller command messages. */
+ OFPT_PACKET_OUT, /* Controller/switch message */
+ OFPT_FLOW_MOD, /* Controller/switch message */
+ OFPT_PORT_MOD, /* Controller/switch message */
+ OFPT_TABLE, /* Controller/switch message */
+
+ /* Statistics messages. */
+ OFPT_STATS_REQUEST, /* Controller/switch message */
+ OFPT_STATS_REPLY /* Controller/switch message */
};
/* Header on all OpenFlow packets. */
};
OFP_ASSERT(sizeof(struct ofp_header) == 8);
+/* OFPT_HELLO. This message has an empty body, but implementations must
+ * ignore any data included in the body, to allow for future extensions. */
+struct ofp_hello {
+ struct ofp_header header;
+};
+
#define OFP_DEFAULT_MISS_SEND_LEN 128
enum ofp_config_flags {
enum ofp_flow_mod_command {
OFPFC_ADD, /* New flow. */
OFPFC_MODIFY, /* Modify all matching flows. */
- OFPFC_MODIFY_STRICT, /* Strictly match wildcards and priority. */
+ OFPFC_MODIFY_STRICT, /* Modify entry strictly matching wildcards */
OFPFC_DELETE, /* Delete all matching flows. */
OFPFC_DELETE_STRICT /* Strictly match wildcards and priority. */
};
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. */
- uint32_t buffer_id; /* Buffered packet to apply to (or -1). */
+ uint32_t buffer_id; /* Buffered packet to apply to (or -1).
+ Not meaningful for OFPFC_DELETE*. */
uint32_t reserved; /* Reserved for future use. */
struct ofp_action actions[0]; /* The number of actions is inferred from
- the length field in the header. */
+ the length field in the header. */
};
OFP_ASSERT(sizeof(struct ofp_flow_mod) == 60);
};
OFP_ASSERT(sizeof(struct ofp_flow_expired) == 72);
-/* Error message (datapath -> controller). */
+/* Values for 'type' in ofp_error_message. These values are immutable: they
+ * will not change in future versions of the protocol (although new values may
+ * be added). */
+enum ofp_error_type {
+ OFPET_HELLO_FAILED, /* Hello protocol failed. */
+ OFPET_BAD_REQUEST /* Request was not understood. */
+};
+
+/* ofp_error_msg 'code' values for OFPET_HELLO_FAILED. 'data' contains an
+ * ASCII text string that may give failure details. */
+enum ofp_hello_failed_code {
+ OFPHFC_INCOMPATIBLE /* No compatible version. */
+};
+
+/* ofp_error_msg 'code' values for OFPET_BAD_REQUEST. 'data' contains at least
+ * the first 64 bytes of the failed request. */
+enum ofp_bad_request_code {
+ OFPBRC_BAD_VERSION, /* ofp_header.version not supported. */
+ OFPBRC_BAD_TYPE, /* ofp_header.type not supported. */
+ OFPBRC_BAD_STAT, /* ofp_stats_request.type not supported. */
+ OFPBRC_BAD_VENDOR /* Vendor not supported (in ofp_vendor or
+ * ofp_stats_request or ofp_stats_reply). */
+};
+
+/* OFPT_ERROR: Error message (datapath -> controller). */
struct ofp_error_msg {
struct ofp_header header;
* The reply body is an array of struct ofp_port_stats. */
OFPST_PORT,
- /* Switch status.
- * The request body is an ASCII string that specifies a prefix of the key
- * names to include in the output; if it is the null string, then all
- * key-value pairs are included.
- * The reply body is an ASCII string of key-value pairs in the form
- * "key=value\n". */
- OFPST_SWITCH
+ /* Vendor extension.
+ * The request and reply bodies begin with a 32-bit vendor ID, which takes
+ * the same form as in "struct ofp_vendor". The request and reply bodies
+ * are otherwise vendor-defined. */
+ OFPST_VENDOR = 0xffff
};
struct ofp_stats_request {
};
OFP_ASSERT(sizeof(struct ofp_port_stats) == 104);
+/* Vendor extension. */
+struct ofp_vendor {
+ struct ofp_header header; /* Type OFPT_VENDOR. */
+ uint32_t vendor; /* Vendor ID:
+ * - MSB 0: low-order bytes are Ethernet OUI.
+ * - MSB != 0: defined by OpenFlow
+ * consortium. */
+ /* Vendor-defined arbitrary additional data. */
+};
+OFP_ASSERT(sizeof(struct ofp_vendor) == 12);
+
#endif /* openflow.h */