Implement 802.1D Spanning Tree Protocol.
[sliver-openvswitch.git] / include / openflow.h
index de23072..69d7853 100644 (file)
@@ -164,12 +164,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 +201,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. */
 };
 
 
@@ -446,8 +467,8 @@ OFP_ASSERT(sizeof(struct ofp_error_msg) == 12);
 enum ofp_stats_types {
     /* Description of this OpenFlow switch. 
      * The request body is empty.
-     * The reply body is struct ofp_version_stats. */
-    OFPST_VERSION,
+     * The reply body is struct ofp_desc_stats. */
+    OFPST_DESC,
 
     /* Individual flow statistics.
      * The request body is struct ofp_flow_stats_request.
@@ -467,7 +488,15 @@ enum ofp_stats_types {
     /* Physical port statistics.
      * The request body is empty.
      * The reply body is an array of struct ofp_port_stats. */
-    OFPST_PORT
+    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
 };
 
 struct ofp_stats_request {
@@ -490,15 +519,17 @@ struct ofp_stats_reply {
 };
 OFP_ASSERT(sizeof(struct ofp_stats_reply) == 12);
 
-#define VERSION_STR_LEN 256
-/* Body of reply to OFPST_VERSION request.  Each entry is a NULL-terminated 
+#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. */
-struct ofp_version_stats {
-    char mfr_desc[VERSION_STR_LEN];  /* Manufacturer description. */
-    char hw_desc[VERSION_STR_LEN];   /* Hardware description. */
-    char sw_desc[VERSION_STR_LEN];   /* Software description. */
+struct ofp_desc_stats {
+    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 serial_num[SERIAL_NUM_LEN];   /* Serial number. */
 };
-OFP_ASSERT(sizeof(struct ofp_version_stats) == 768);
+OFP_ASSERT(sizeof(struct ofp_desc_stats) == 800);
 
 /* Body for ofp_stats_request of type OFPST_FLOW. */
 struct ofp_flow_stats_request {