-/* Copyright (c) 2008, 2011 The Board of Trustees of The Leland Stanford
+/* Copyright (c) 2008, 2011, 2012 The Board of Trustees of The Leland Stanford
* Junior University
*
* We are making the OpenFlow specification and associated documentation
#define OFP_ETH_ALEN 6 /* Bytes in an Ethernet address. */
-/* Common OpenFlow message types. */
-enum ofp_type {
- /* 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_REMOVED, /* Async message */
- OFPT_PORT_STATUS, /* Async message */
-};
-
/* Header on all OpenFlow packets. */
struct ofp_header {
uint8_t version; /* An OpenFlow version number, e.g. OFP10_VERSION. */
/* Switch features. */
struct ofp_switch_features {
- struct ofp_header header;
ovs_be64 datapath_id; /* Datapath unique ID. The lower 48-bits are for
a MAC address, while the upper 16-bits are
implementer-defined. */
/* Followed by an array of struct ofp10_phy_port or struct ofp11_port
* structures. The number is inferred from header.length. */
};
-OFP_ASSERT(sizeof(struct ofp_switch_features) == 32);
+OFP_ASSERT(sizeof(struct ofp_switch_features) == 24);
/* Common capabilities supported by the datapath (struct ofp_switch_features,
* member capabilities). */
OFPR_N_REASONS
};
+/* Action structure for OFPAT10_SET_VLAN_VID and OFPAT11_SET_VLAN_VID. */
+struct ofp_action_vlan_vid {
+ ovs_be16 type; /* Type. */
+ ovs_be16 len; /* Length is 8. */
+ ovs_be16 vlan_vid; /* VLAN id. */
+ uint8_t pad[2];
+};
+OFP_ASSERT(sizeof(struct ofp_action_vlan_vid) == 8);
+
+/* Action structure for OFPAT10_SET_VLAN_PCP and OFPAT11_SET_VLAN_PCP. */
+struct ofp_action_vlan_pcp {
+ ovs_be16 type; /* Type. */
+ ovs_be16 len; /* Length is 8. */
+ uint8_t vlan_pcp; /* VLAN priority. */
+ uint8_t pad[3];
+};
+OFP_ASSERT(sizeof(struct ofp_action_vlan_pcp) == 8);
+
+/* Action structure for OFPAT10_SET_DL_SRC/DST and OFPAT11_SET_DL_SRC/DST. */
+struct ofp_action_dl_addr {
+ ovs_be16 type; /* Type. */
+ ovs_be16 len; /* Length is 16. */
+ uint8_t dl_addr[OFP_ETH_ALEN]; /* Ethernet address. */
+ uint8_t pad[6];
+};
+OFP_ASSERT(sizeof(struct ofp_action_dl_addr) == 16);
+
+/* Action structure for OFPAT10_SET_NW_SRC/DST and OFPAT11_SET_NW_SRC/DST. */
+struct ofp_action_nw_addr {
+ ovs_be16 type; /* Type. */
+ ovs_be16 len; /* Length is 8. */
+ ovs_be32 nw_addr; /* IP address. */
+};
+OFP_ASSERT(sizeof(struct ofp_action_nw_addr) == 8);
+
+/* Action structure for OFPAT10_SET_NW_TOS and OFPAT11_SET_NW_TOS. */
+struct ofp_action_nw_tos {
+ ovs_be16 type; /* Type.. */
+ ovs_be16 len; /* Length is 8. */
+ uint8_t nw_tos; /* DSCP in high 6 bits, rest ignored. */
+ uint8_t pad[3];
+};
+OFP_ASSERT(sizeof(struct ofp_action_nw_tos) == 8);
+
+/* Action structure for OFPAT10_SET_TP_SRC/DST and OFPAT11_SET_TP_SRC/DST. */
+struct ofp_action_tp_port {
+ ovs_be16 type; /* Type. */
+ ovs_be16 len; /* Length is 8. */
+ ovs_be16 tp_port; /* TCP/UDP port. */
+ uint8_t pad[2];
+};
+OFP_ASSERT(sizeof(struct ofp_action_tp_port) == 8);
+
/* Why was this flow removed? */
enum ofp_flow_removed_reason {
OFPRR_IDLE_TIMEOUT, /* Flow idle time exceeded idle_timeout. */
OFPRR_HARD_TIMEOUT, /* Time exceeded hard_timeout. */
OFPRR_DELETE, /* Evicted by a DELETE flow mod. */
- OFPRR_GROUP_DELETE /* Group was removed. */
+ OFPRR_GROUP_DELETE, /* Group was removed. */
+ OFPRR_EVICTION, /* Switch eviction to free resources. */
};
/* What changed about the physical port */
/* A physical port has changed in the datapath */
struct ofp_port_status {
- struct ofp_header header;
uint8_t reason; /* One of OFPPR_*. */
uint8_t pad[7]; /* Align to 64-bits. */
/* Followed by struct ofp10_phy_port or struct ofp11_port. */
};
-OFP_ASSERT(sizeof(struct ofp_port_status) == 16);
-
-enum ofp_stats_types {
- /* Description of this OpenFlow switch. (OFPMP_DESC)
- * The OF1.0 request is struct ofp_stats_msg.
- * The OF1.0 reply is struct ofp_desc_stats. */
- OFPST_DESC = 0,
-
- /* Individual flow statistics. (OFPMP_FLOW)
- * The OF1.0 request is struct ofp_flow_stats_request.
- * The OF1.0 reply body is an array of struct ofp_flow_stats. */
- OFPST_FLOW = 1,
-
- /* Aggregate flow statistics. (OFPMP_AGGREGATE)
- * The OF1.0 request is struct ofp_flow_stats_request.
- * The OF1.0 reply is struct ofp_aggregate_stats_reply. */
- OFPST_AGGREGATE = 2,
-
- /* Flow table statistics. (OFPMP_TABLE)
- * The OF1.0 request is struct ofp_stats_msg.
- * The OF1.0 reply body is an array of struct ofp_table_stats. */
- OFPST_TABLE = 3,
-
- /* Physical port statistics. (OFPMP_PORT_STATS)
- * The OF1.0 request is struct ofp_port_stats_request.
- * The OF1.0 reply body is an array of struct ofp_port_stats. */
- OFPST_PORT = 4,
-
- /* Queue statistics for a port. (OFPMP_QUEUE)
- * The OF1.0 request is struct ofp_stats_msg.
- * The OF1.0 reply body is an array of struct ofp_queue_stats. */
- OFPST_QUEUE = 5,
-
- /* Vendor extension.
- * The OF1.0 request and reply begin with struct ofp_vendor_stats. */
- OFPST_VENDOR = 0xffff
-};
+OFP_ASSERT(sizeof(struct ofp_port_status) == 8);
/* The match type indicates the match structure (set of fields that compose the
* match) in use. The match type is placed in the type field at the beginning