X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=include%2Fopenflow%2Fopenflow.h;h=0dad50d10d4340718d33479ce3af3d5a60e1c84b;hb=99769a40d9d5769c94ae3520112d86c56cbb7322;hp=f53954336da94d8ef4180fad2ce10aa2e5ef9c06;hpb=b2fda3effc787f265b5ad5dfa967ac00627bd075;p=openvswitch diff --git a/include/openflow/openflow.h b/include/openflow/openflow.h index f5395433..0dad50d1 100644 --- a/include/openflow/openflow.h +++ b/include/openflow/openflow.h @@ -630,9 +630,9 @@ enum ofp_hello_failed_code { 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_STAT, /* ofp_stats_msg.type not supported. */ OFPBRC_BAD_VENDOR, /* Vendor not supported (in ofp_vendor_header - * or ofp_stats_request or ofp_stats_reply). */ + * or ofp_stats_msg). */ OFPBRC_BAD_SUBTYPE, /* Vendor subtype not supported. */ OFPBRC_EPERM, /* Permissions error. */ OFPBRC_BAD_LEN, /* Wrong request length for type. */ @@ -696,67 +696,59 @@ 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_desc_stats. */ + * The request is struct ofp_stats_msg. + * The reply is struct ofp_desc_stats. */ OFPST_DESC, /* Individual flow statistics. - * The request body is struct ofp_flow_stats_request. + * The request is struct ofp_flow_stats_request. * The reply body is an array of struct ofp_flow_stats. */ OFPST_FLOW, /* Aggregate flow statistics. - * The request body is struct ofp_aggregate_stats_request. - * The reply body is struct ofp_aggregate_stats_reply. */ + * The request is struct ofp_flow_stats_request. + * The reply is struct ofp_aggregate_stats_reply. */ OFPST_AGGREGATE, /* Flow table statistics. - * The request body is empty. + * The request is struct ofp_stats_msg. * The reply body is an array of struct ofp_table_stats. */ OFPST_TABLE, /* Physical port statistics. - * The request body is struct ofp_port_stats_request. + * The request is struct ofp_port_stats_request. * The reply body is an array of struct ofp_port_stats. */ OFPST_PORT, - /* Queue statistics for a port + /* Queue statistics for a port. * The request body is struct ofp_queue_stats_request. * The reply body is an array of struct ofp_queue_stats. */ OFPST_QUEUE, /* Vendor extension. - * The request and reply bodies begin with a 32-bit vendor ID, which takes - * the same form as in "struct ofp_vendor_header". The request and reply - * bodies are otherwise vendor-defined. */ + * The request and reply begin with "struct ofp_vendor_stats". */ OFPST_VENDOR = 0xffff }; -struct ofp_stats_request { +/* Statistics request or reply message. */ +struct ofp_stats_msg { struct ofp_header header; ovs_be16 type; /* One of the OFPST_* constants. */ - ovs_be16 flags; /* OFPSF_REQ_* flags (none yet defined). */ - uint8_t body[0]; /* Body of the request. */ + ovs_be16 flags; /* Requests: always 0. + * Replies: 0 or OFPSF_REPLY_MORE. */ }; -OFP_ASSERT(sizeof(struct ofp_stats_request) == 12); +OFP_ASSERT(sizeof(struct ofp_stats_msg) == 12); enum ofp_stats_reply_flags { OFPSF_REPLY_MORE = 1 << 0 /* More replies to follow. */ }; -struct ofp_stats_reply { - struct ofp_header header; - ovs_be16 type; /* One of the OFPST_* constants. */ - ovs_be16 flags; /* OFPSF_REPLY_* flags. */ - uint8_t body[0]; /* Body of the reply. */ -}; -OFP_ASSERT(sizeof(struct ofp_stats_reply) == 12); - #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. */ +/* Reply to OFPST_DESC request. Each entry is a NULL-terminated ASCII + * string. */ struct ofp_desc_stats { + struct ofp_stats_msg osm; char mfr_desc[DESC_STR_LEN]; /* Manufacturer description. */ char hw_desc[DESC_STR_LEN]; /* Hardware description. */ char sw_desc[DESC_STR_LEN]; /* Software description. */ @@ -764,10 +756,11 @@ struct ofp_desc_stats { char dp_desc[DESC_STR_LEN]; /* Human readable description of the datapath. */ }; -OFP_ASSERT(sizeof(struct ofp_desc_stats) == 1056); +OFP_ASSERT(sizeof(struct ofp_desc_stats) == 1068); -/* Body for ofp_stats_request of type OFPST_FLOW. */ +/* Stats request of type OFPST_AGGREGATE or OFPST_FLOW. */ struct ofp_flow_stats_request { + struct ofp_stats_msg osm; struct ofp_match match; /* Fields to match. */ uint8_t table_id; /* ID of table to read (from ofp_table_stats) or 0xff for all tables. */ @@ -776,7 +769,7 @@ struct ofp_flow_stats_request { as an output port. A value of OFPP_NONE indicates no restriction. */ }; -OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 44); +OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 56); /* Body of reply to OFPST_FLOW request. */ struct ofp_flow_stats { @@ -799,26 +792,15 @@ struct ofp_flow_stats { }; OFP_ASSERT(sizeof(struct ofp_flow_stats) == 88); -/* Body for ofp_stats_request of type OFPST_AGGREGATE. */ -struct ofp_aggregate_stats_request { - struct ofp_match match; /* Fields to match. */ - uint8_t table_id; /* ID of table to read (from ofp_table_stats) - or 0xff for all tables. */ - uint8_t pad; /* Align to 32 bits. */ - ovs_be16 out_port; /* Require matching entries to include this - as an output port. A value of OFPP_NONE - indicates no restriction. */ -}; -OFP_ASSERT(sizeof(struct ofp_aggregate_stats_request) == 44); - -/* Body of reply to OFPST_AGGREGATE request. */ +/* Reply to OFPST_AGGREGATE request. */ struct ofp_aggregate_stats_reply { + struct ofp_stats_msg osm; ovs_32aligned_be64 packet_count; /* Number of packets in flows. */ ovs_32aligned_be64 byte_count; /* Number of bytes in flows. */ ovs_be32 flow_count; /* Number of flows. */ uint8_t pad[4]; /* Align to 64 bits. */ }; -OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24); +OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 36); /* Body of reply to OFPST_TABLE request. */ struct ofp_table_stats { @@ -835,14 +817,15 @@ struct ofp_table_stats { }; OFP_ASSERT(sizeof(struct ofp_table_stats) == 64); -/* Body for ofp_stats_request of type OFPST_PORT. */ +/* Stats request of type OFPST_PORT. */ struct ofp_port_stats_request { + struct ofp_stats_msg osm; ovs_be16 port_no; /* OFPST_PORT message may request statistics for a single port (specified with port_no) or for all ports (port_no == OFPP_NONE). */ uint8_t pad[6]; }; -OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 8); +OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 20); /* Body of reply to OFPST_PORT request. If a counter is unsupported, set * the field to all ones. */ @@ -871,15 +854,16 @@ OFP_ASSERT(sizeof(struct ofp_port_stats) == 104); /* All ones is used to indicate all queues in a port (for stats retrieval). */ #define OFPQ_ALL 0xffffffff -/* Body for ofp_stats_request of type OFPST_QUEUE. */ +/* Body for stats request of type OFPST_QUEUE. */ struct ofp_queue_stats_request { + struct ofp_stats_msg osm; ovs_be16 port_no; /* All ports if OFPP_ALL. */ uint8_t pad[2]; /* Align to 32-bits. */ ovs_be32 queue_id; /* All queues if OFPQ_ALL. */ }; -OFP_ASSERT(sizeof(struct ofp_queue_stats_request) == 8); +OFP_ASSERT(sizeof(struct ofp_queue_stats_request) == 20); -/* Body for ofp_stats_reply of type OFPST_QUEUE consists of an array of this +/* Body for stats reply of type OFPST_QUEUE consists of an array of this * structure type. */ struct ofp_queue_stats { ovs_be16 port_no; @@ -891,6 +875,17 @@ struct ofp_queue_stats { }; OFP_ASSERT(sizeof(struct ofp_queue_stats) == 32); +/* Vendor extension stats message. */ +struct ofp_vendor_stats_msg { + struct ofp_stats_msg osm; /* Type OFPST_VENDOR. */ + ovs_be32 vendor; /* Vendor ID: + * - MSB 0: low-order bytes are IEEE OUI. + * - MSB != 0: defined by OpenFlow + * consortium. */ + /* Followed by vendor-defined arbitrary additional data. */ +}; +OFP_ASSERT(sizeof(struct ofp_vendor_stats_msg) == 16); + /* Vendor extension. */ struct ofp_vendor_header { struct ofp_header header; /* Type OFPT_VENDOR. */