Add vendor-specific messages and statistics to OpenFlow protocol.
[openvswitch] / include / openflow.h
index 1ad8227e4826dba3f391b0e53d82b695cd58c16a..e7d1589325929877a5f0acf37b97ee46d2a53dfd 100644 (file)
@@ -68,7 +68,7 @@
 /* The most significant bit being set in the version field indicates an
  * experimental OpenFlow version.  
  */
-#define OFP_VERSION   0x89
+#define OFP_VERSION   0x90
 
 #define OFP_MAX_TABLE_NAME_LEN 32
 #define OFP_MAX_PORT_NAME_LEN  16
@@ -117,7 +117,8 @@ enum ofp_type {
     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 */
+    OFPT_ECHO_REPLY,          /* 16 Symmetric message */
+    OFPT_VENDOR = 0xff        /* 255 Vendor extension */
 };
 
 /* Header on all OpenFlow packets. */
@@ -164,12 +165,32 @@ enum ofp_capabilities {
     OFPC_IP_REASM     = 1 << 5  /* Can reassemble IP fragments. */
 };
 
-/* Flags to indicate behavior of the physical port */
+/* Flags to indicate behavior of the physical port. */
 enum ofp_port_flags {
-    OFPPFL_NO_FLOOD  = 1 << 0, /* Do not include this port when flooding. */
-    OFPPFL_PORT_DOWN = 1 << 1, /* Port is configured down. */
-    OFPPFL_LINK_DOWN = 1 << 2, /* No physical link on interface.  
-                                  NOTE: Non-settable field */
+    /* Read/write bits. */
+    OFPPFL_PORT_DOWN    = 1 << 1, /* Port is configured down. */
+    OFPPFL_NO_STP       = 1 << 3, /* Disable 802.1D spanning tree on port. */
+    OFPPFL_NO_RECV      = 1 << 4, /* Drop most packets received on port. */
+    OFPPFL_NO_RECV_STP  = 1 << 5, /* Drop received 802.1D STP packets. */
+    OFPPFL_NO_FWD       = 1 << 6, /* Drop packets forwarded to port. */
+    OFPPFL_NO_PACKET_IN = 1 << 7, /* Do not send packet-in msgs for port. */
+
+    /* Read-only bits. */
+    OFPPFL_LINK_DOWN    = 1 << 2, /* No physical link present. */
+
+    /* Read-only when STP is enabled (when OFPPFL_NO_STP is not set).
+     * Read/write when STP is disabled (when OFPPFL_NO_STP is set).
+     *
+     * The OFPPFL_STP_* bits have no effect on switch operation.  The
+     * controller must adjust OFPPFL_NO_RECV, OFPPFL_NO_FWD, and
+     * OFPPFL_NO_PACKET_IN appropriately to fully implement an 802.1D spanning
+     * tree. */
+    OFPPFL_NO_FLOOD     = 1 << 0, /* Do not include this port when flooding. */
+    OFPPFL_STP_LISTEN   = 0 << 8, /* Not learning or relaying frames. */
+    OFPPFL_STP_LEARN    = 1 << 8, /* Learning but not relaying frames. */
+    OFPPFL_STP_FORWARD  = 2 << 8, /* Learning and relaying frames. */
+    OFPPFL_STP_BLOCK    = 3 << 8, /* Not part of spanning tree. */
+    OFPPFL_STP_MASK     = 3 << 8, /* Bit mask for OFPPFL_STP_* values. */
 };
 
 /* Features of physical ports available in a datapath. */
@@ -181,6 +202,7 @@ enum ofp_port_features {
     OFPPF_1GB_HD     = 1 << 4, /* 1 Gb half-duplex rate support. */
     OFPPF_1GB_FD     = 1 << 5, /* 1 Gb full-duplex rate support. */
     OFPPF_10GB_FD    = 1 << 6, /* 10 Gb full-duplex rate support. */
+    OFPPF_STP        = 1 << 7, /* 802.1D spanning tree supported on port. */
 };
 
 
@@ -201,26 +223,21 @@ struct ofp_switch_features {
     uint64_t datapath_id;   /* Datapath unique ID.  Only the lower 48-bits
                                are meaningful. */
 
-    /* Table info. */
-    uint32_t n_exact;       /* Max exact-match table entries. */
-    uint32_t n_compression; /* Max entries compressed on service port. */
-    uint32_t n_general;     /* Max entries of arbitrary form. */
-
-    /* Buffer limits.  A datapath that cannot buffer reports 0.*/
-    uint32_t buffer_mb;     /* Space for buffering packets, in MB. */
     uint32_t n_buffers;     /* Max packets buffered at once. */
 
+    uint8_t n_tables;       /* Number of tables supported by datapath. */
+    uint8_t pad[3];         /* Align to 64-bits. */
+
     /* Features. */
     uint32_t capabilities;  /* Bitmap of support "ofp_capabilities". */
     uint32_t actions;       /* Bitmap of supported "ofp_action_type"s. */
-    uint8_t pad[4];         /* Align to 64-bits. */
 
     /* Port info.*/
     struct ofp_phy_port ports[0];  /* Port definitions.  The number of ports
                                       is inferred from the length field in
                                       the header. */
 };
-OFP_ASSERT(sizeof(struct ofp_switch_features) == 48);
+OFP_ASSERT(sizeof(struct ofp_switch_features) == 32);
 
 /* What changed about the physical port */
 enum ofp_port_reason {
@@ -324,6 +341,8 @@ OFP_ASSERT(sizeof(struct ofp_packet_out) == 16);
 
 enum ofp_flow_mod_command {
     OFPFC_ADD,              /* New flow. */
+    OFPFC_MODIFY,           /* Modify all matching flows. */
+    OFPFC_MODIFY_STRICT,    /* Strictly match wildcards and priority. */
     OFPFC_DELETE,           /* Delete all matching flows. */
     OFPFC_DELETE_STRICT     /* Strictly match wildcards and priority. */
 };
@@ -475,7 +494,13 @@ enum ofp_stats_types {
      * key-value pairs are included.
      * The reply body is an ASCII string of key-value pairs in the form
      * "key=value\n". */
-    OFPST_SWITCH
+    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 {
@@ -557,12 +582,14 @@ OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24);
 
 /* Body of reply to OFPST_TABLE request. */
 struct ofp_table_stats {
-    uint8_t table_id;
+    uint8_t table_id;        /* Identifier of table.  Lower numbered tables 
+                                are consulted first. */
     uint8_t pad[3];          /* Align to 32-bits */
     char name[OFP_MAX_TABLE_NAME_LEN];
+    uint32_t wildcards;      /* Bitmap of OFPFW_* wildcards that are 
+                                supported by the table. */
     uint32_t max_entries;    /* Max number of entries supported */
     uint32_t active_count;   /* Number of active entries */
-    uint8_t pad2[4];         /* Align to 64 bits. */
     uint64_t matched_count;  /* Number of packets that hit table */
 };
 OFP_ASSERT(sizeof(struct ofp_table_stats) == 56);
@@ -590,4 +617,15 @@ struct ofp_port_stats {
 };
 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 */