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. */
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. */
};
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.
/* 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 {
};
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 {