]>
Commit | Line | Data |
---|---|---|
982697a4 | 1 | /* |
964a5f60 | 2 | * Copyright (c) 2012, 2013 Nicira, Inc. |
982697a4 BP |
3 | * |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at: | |
7 | * | |
8 | * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
15 | */ | |
16 | ||
17 | #ifndef OFP_MSGS_H | |
18 | #define OFP_MSGS_H 1 | |
19 | ||
20 | /* OpenFlow message headers abstraction. | |
21 | * | |
22 | * OpenFlow headers are unnecessarily complicated: | |
23 | * | |
24 | * - Some messages with the same meaning were renumbered between 1.0 and 1.1. | |
25 | * | |
26 | * - "Statistics" (aka multipart) messages have a different format from other | |
27 | * messages. | |
28 | * | |
29 | * - The 1.0 header for statistics messages is an odd number of 32-bit words | |
30 | * long, leaving 64-bit quantities in the body misaligned. The 1.1 header | |
31 | * for statistics added a padding word to fix this misalignment, although | |
32 | * many statistic message bodies did not change. | |
33 | * | |
34 | * - Vendor-defined messages have an additional header but no standard way to | |
35 | * distinguish individual types of message within a given vendor. | |
36 | * | |
37 | * This file attempts to abstract out the differences between the various forms | |
38 | * of headers. | |
39 | */ | |
40 | ||
41 | #include "openvswitch/types.h" | |
42 | #include "ofp-errors.h" | |
43 | #include "util.h" | |
44 | ||
45 | struct list; | |
46 | \f | |
47 | /* Raw identifiers for OpenFlow messages. | |
48 | * | |
49 | * Some OpenFlow messages with similar meanings have multiple variants across | |
50 | * OpenFlow versions or vendor extensions. Each variant has a different | |
51 | * OFPRAW_* enumeration constant. More specifically, if two messages have | |
52 | * different types, different numbers, or different arguments, then they must | |
53 | * have different OFPRAW_* values. | |
54 | * | |
55 | * The comments here must follow a stylized form because the "extract-ofp-msgs" | |
56 | * program parses them at build time to generate data tables. The syntax of | |
57 | * each comment is: | |
58 | * | |
59 | * type versions (number): arguments. | |
60 | * | |
61 | * where the syntax of each part is: | |
62 | * | |
63 | * - type: One of OFPT (standard OpenFlow message), OFPST (standard OpenFlow | |
64 | * statistics message), NXT (Nicira extension message), or NXST (Nicira | |
65 | * extension statistics message). | |
66 | * | |
67 | * As new vendors implement extensions it will make sense to expand the | |
68 | * dictionary of possible types. | |
69 | * | |
70 | * - versions: The OpenFlow version or versions in which this message is | |
71 | * supported, e.g. "1.0" or "1.1" or "1.0+". | |
72 | * | |
73 | * - number: | |
74 | * For OFPT, the 'type' in struct ofp_header. | |
75 | * For OFPST, the 'type' in struct ofp_stats_msg or ofp11_stats_msg. | |
76 | * For NXT, the 'subtype' in struct nicira_header. | |
77 | * For NXST, the 'subtype' in struct nicira10_stats_msg or | |
78 | * nicira11_stats_msg. | |
79 | * | |
80 | * - arguments: The types of data that follow the OpenFlow headers (the | |
81 | * message "body"). This can be "void" if the message has no body. | |
82 | * Otherwise, it should be a comma-separated sequence of C types. The | |
83 | * last type in the sequence can end with [] if the body ends in a | |
84 | * variable-length sequence. | |
85 | * | |
86 | * The arguments are used to validate the lengths of messages when a | |
87 | * header is parsed. Any message whose length isn't valid as a length of | |
88 | * the specified types will be rejected with OFPERR_OFPBRC_BAD_LEN. | |
89 | * | |
90 | * A few OpenFlow messages, such as OFPT_PACKET_IN, intentionally end with | |
91 | * only part of a structure, up to some specified member. The syntax "up | |
92 | * to <member>" indicates this, e.g. "struct ofp11_packet_in up to data". | |
93 | */ | |
94 | enum ofpraw { | |
cf7cf630 BP |
95 | /* Immutable standard messages. |
96 | * | |
97 | * The OpenFlow standard promises to preserve these messages and their numbers | |
98 | * in future versions, so we mark them as <all>, which covers every OpenFlow | |
99 | * version numbered 0x01...0xff, rather than as OF1.0+, which covers only | |
100 | * OpenFlow versions that we otherwise implement. | |
101 | * | |
102 | * Without <all> here, then we would fail to decode "hello" messages that | |
103 | * announce a version higher than we understand, even though there still could | |
104 | * be a version in common with the peer that we do understand. The <all> | |
105 | * keyword is less useful for the other messages, because our OpenFlow channels | |
106 | * accept only OpenFlow messages with a previously negotiated version. | |
107 | */ | |
982697a4 | 108 | |
cf7cf630 | 109 | /* OFPT <all> (0): uint8_t[]. */ |
982697a4 BP |
110 | OFPRAW_OFPT_HELLO, |
111 | ||
cf7cf630 | 112 | /* OFPT <all> (1): struct ofp_error_msg, uint8_t[]. */ |
982697a4 BP |
113 | OFPRAW_OFPT_ERROR, |
114 | ||
cf7cf630 | 115 | /* OFPT <all> (2): uint8_t[]. */ |
982697a4 BP |
116 | OFPRAW_OFPT_ECHO_REQUEST, |
117 | ||
cf7cf630 | 118 | /* OFPT <all> (3): uint8_t[]. */ |
982697a4 BP |
119 | OFPRAW_OFPT_ECHO_REPLY, |
120 | ||
cf7cf630 BP |
121 | /* Other standard messages. |
122 | * | |
123 | * The meanings of these messages can (and often do) change from one version | |
124 | * of OpenFlow to another. */ | |
125 | ||
982697a4 BP |
126 | /* OFPT 1.0+ (5): void. */ |
127 | OFPRAW_OFPT_FEATURES_REQUEST, | |
128 | ||
129 | /* OFPT 1.0 (6): struct ofp_switch_features, struct ofp10_phy_port[]. */ | |
130 | OFPRAW_OFPT10_FEATURES_REPLY, | |
2e1ae200 | 131 | /* OFPT 1.1-1.2 (6): struct ofp_switch_features, struct ofp11_port[]. */ |
982697a4 | 132 | OFPRAW_OFPT11_FEATURES_REPLY, |
2e1ae200 JR |
133 | /* OFPT 1.3+ (6): struct ofp_switch_features. */ |
134 | OFPRAW_OFPT13_FEATURES_REPLY, | |
982697a4 BP |
135 | |
136 | /* OFPT 1.0+ (7): void. */ | |
137 | OFPRAW_OFPT_GET_CONFIG_REQUEST, | |
138 | ||
139 | /* OFPT 1.0+ (8): struct ofp_switch_config. */ | |
140 | OFPRAW_OFPT_GET_CONFIG_REPLY, | |
141 | ||
65367933 | 142 | /* OFPT 1.0+ (9): struct ofp_switch_config. */ |
982697a4 BP |
143 | OFPRAW_OFPT_SET_CONFIG, |
144 | ||
31a9e63f | 145 | /* OFPT 1.0 (10): struct ofp10_packet_in up to data, uint8_t[]. */ |
982697a4 | 146 | OFPRAW_OFPT10_PACKET_IN, |
31a9e63f | 147 | /* OFPT 1.1 (10): struct ofp11_packet_in, uint8_t[]. */ |
982697a4 | 148 | OFPRAW_OFPT11_PACKET_IN, |
d94240ec SH |
149 | /* OFPT 1.2 (10): struct ofp12_packet_in, uint8_t[]. */ |
150 | OFPRAW_OFPT12_PACKET_IN, | |
2e1ae200 JR |
151 | /* OFPT 1.3 (10): struct ofp13_packet_in, uint8_t[]. */ |
152 | OFPRAW_OFPT13_PACKET_IN, | |
982697a4 BP |
153 | /* NXT 1.0+ (17): struct nx_packet_in, uint8_t[]. */ |
154 | OFPRAW_NXT_PACKET_IN, | |
155 | ||
31a9e63f | 156 | /* OFPT 1.0 (11): struct ofp10_flow_removed. */ |
982697a4 | 157 | OFPRAW_OFPT10_FLOW_REMOVED, |
83974732 SH |
158 | /* OFPT 1.1+ (11): struct ofp11_flow_removed, uint8_t[8][]. */ |
159 | OFPRAW_OFPT11_FLOW_REMOVED, | |
982697a4 BP |
160 | /* NXT 1.0+ (14): struct nx_flow_removed, uint8_t[8][]. */ |
161 | OFPRAW_NXT_FLOW_REMOVED, | |
162 | ||
163 | /* OFPT 1.0 (12): struct ofp_port_status, struct ofp10_phy_port. */ | |
164 | OFPRAW_OFPT10_PORT_STATUS, | |
165 | /* OFPT 1.1+ (12): struct ofp_port_status, struct ofp11_port. */ | |
166 | OFPRAW_OFPT11_PORT_STATUS, | |
167 | ||
31a9e63f | 168 | /* OFPT 1.0 (13): struct ofp10_packet_out, uint8_t[]. */ |
982697a4 BP |
169 | OFPRAW_OFPT10_PACKET_OUT, |
170 | /* OFPT 1.1+ (13): struct ofp11_packet_out, uint8_t[]. */ | |
171 | OFPRAW_OFPT11_PACKET_OUT, | |
172 | ||
35805806 | 173 | /* OFPT 1.0 (14): struct ofp10_flow_mod, struct ofp_action_header[]. */ |
982697a4 BP |
174 | OFPRAW_OFPT10_FLOW_MOD, |
175 | /* OFPT 1.1+ (14): struct ofp11_flow_mod, struct ofp11_instruction[]. */ | |
176 | OFPRAW_OFPT11_FLOW_MOD, | |
177 | /* NXT 1.0+ (13): struct nx_flow_mod, uint8_t[8][]. */ | |
178 | OFPRAW_NXT_FLOW_MOD, | |
179 | ||
180 | /* OFPT 1.0 (15): struct ofp10_port_mod. */ | |
181 | OFPRAW_OFPT10_PORT_MOD, | |
bb2bc3c1 | 182 | /* OFPT 1.1+ (16): struct ofp11_port_mod. */ |
982697a4 BP |
183 | OFPRAW_OFPT11_PORT_MOD, |
184 | ||
185 | /* OFPT 1.0 (18): void. */ | |
186 | OFPRAW_OFPT10_BARRIER_REQUEST, | |
58cf43df | 187 | /* OFPT 1.1+ (20): void. */ |
982697a4 BP |
188 | OFPRAW_OFPT11_BARRIER_REQUEST, |
189 | ||
190 | /* OFPT 1.0 (19): void. */ | |
191 | OFPRAW_OFPT10_BARRIER_REPLY, | |
58cf43df | 192 | /* OFPT 1.1+ (21): void. */ |
982697a4 BP |
193 | OFPRAW_OFPT11_BARRIER_REPLY, |
194 | ||
c545d38d JR |
195 | /* OFPT 1.1+ (22): struct ofp11_queue_get_config_request. */ |
196 | OFPRAW_OFPT11_QUEUE_GET_CONFIG_REQUEST, | |
197 | ||
198 | /* OFPT 1.1+ (23): struct ofp11_queue_get_config_reply, struct ofp_packet_queue[]. */ | |
199 | OFPRAW_OFPT11_QUEUE_GET_CONFIG_REPLY, | |
200 | ||
6ea4776b JR |
201 | /* OFPT 1.2+ (24): struct ofp12_role_request. */ |
202 | OFPRAW_OFPT12_ROLE_REQUEST, | |
203 | /* NXT 1.0+ (10): struct nx_role_request. */ | |
204 | OFPRAW_NXT_ROLE_REQUEST, | |
205 | ||
206 | /* OFPT 1.2+ (25): struct ofp12_role_request. */ | |
207 | OFPRAW_OFPT12_ROLE_REPLY, | |
208 | /* NXT 1.0+ (11): struct nx_role_request. */ | |
209 | OFPRAW_NXT_ROLE_REPLY, | |
210 | ||
2e1ae200 JR |
211 | /* OFPT 1.3+ (26): void. */ |
212 | OFPRAW_OFPT13_GET_ASYNC_REQUEST, | |
213 | /* OFPT 1.3+ (27): struct ofp13_async_config. */ | |
214 | OFPRAW_OFPT13_GET_ASYNC_REPLY, | |
215 | /* OFPT 1.3+ (28): struct ofp13_async_config. */ | |
216 | OFPRAW_OFPT13_SET_ASYNC, | |
217 | /* NXT 1.0+ (19): struct nx_async_config. */ | |
218 | OFPRAW_NXT_SET_ASYNC_CONFIG, | |
219 | ||
638a19b0 | 220 | /* OFPT 1.3+ (29): struct ofp13_meter_mod, uint8_t[8][]. */ |
2e1ae200 JR |
221 | OFPRAW_OFPT13_METER_MOD, |
222 | ||
982697a4 BP |
223 | /* Standard statistics. */ |
224 | ||
225 | /* OFPST 1.0+ (0): void. */ | |
226 | OFPRAW_OFPST_DESC_REQUEST, | |
227 | ||
228 | /* OFPST 1.0+ (0): struct ofp_desc_stats. */ | |
229 | OFPRAW_OFPST_DESC_REPLY, | |
230 | ||
e2b9ac44 | 231 | /* OFPST 1.0 (1): struct ofp10_flow_stats_request. */ |
cfc23141 SH |
232 | OFPRAW_OFPST10_FLOW_REQUEST, |
233 | /* OFPST 1.1+ (1): struct ofp11_flow_stats_request, uint8_t[8][]. */ | |
234 | OFPRAW_OFPST11_FLOW_REQUEST, | |
982697a4 BP |
235 | /* NXST 1.0 (0): struct nx_flow_stats_request, uint8_t[8][]. */ |
236 | OFPRAW_NXST_FLOW_REQUEST, | |
237 | ||
238 | /* OFPST 1.0 (1): uint8_t[]. */ | |
cfc23141 | 239 | OFPRAW_OFPST10_FLOW_REPLY, |
2e1ae200 | 240 | /* OFPST 1.1-1.2 (1): uint8_t[]. */ |
cfc23141 | 241 | OFPRAW_OFPST11_FLOW_REPLY, |
2e1ae200 JR |
242 | /* OFPST 1.3+ (1): uint8_t[]. */ |
243 | OFPRAW_OFPST13_FLOW_REPLY, | |
982697a4 BP |
244 | /* NXST 1.0 (0): uint8_t[]. */ |
245 | OFPRAW_NXST_FLOW_REPLY, | |
246 | ||
e2b9ac44 | 247 | /* OFPST 1.0 (2): struct ofp10_flow_stats_request. */ |
617da9cd SH |
248 | OFPRAW_OFPST10_AGGREGATE_REQUEST, |
249 | /* OFPST 1.1+ (2): struct ofp11_flow_stats_request, uint8_t[8][]. */ | |
250 | OFPRAW_OFPST11_AGGREGATE_REQUEST, | |
982697a4 BP |
251 | /* NXST 1.0 (1): struct nx_flow_stats_request, uint8_t[8][]. */ |
252 | OFPRAW_NXST_AGGREGATE_REQUEST, | |
253 | ||
617da9cd | 254 | /* OFPST 1.0+ (2): struct ofp_aggregate_stats_reply. */ |
982697a4 | 255 | OFPRAW_OFPST_AGGREGATE_REPLY, |
a814ba0f | 256 | /* NXST 1.0 (1): struct ofp_aggregate_stats_reply. */ |
982697a4 BP |
257 | OFPRAW_NXST_AGGREGATE_REPLY, |
258 | ||
2e1ae200 | 259 | /* OFPST 1.0+ (3): void. */ |
982697a4 BP |
260 | OFPRAW_OFPST_TABLE_REQUEST, |
261 | ||
e2b9ac44 | 262 | /* OFPST 1.0 (3): struct ofp10_table_stats[]. */ |
16fdae54 SH |
263 | OFPRAW_OFPST10_TABLE_REPLY, |
264 | /* OFPST 1.1 (3): struct ofp11_table_stats[]. */ | |
265 | OFPRAW_OFPST11_TABLE_REPLY, | |
266 | /* OFPST 1.2 (3): struct ofp12_table_stats[]. */ | |
267 | OFPRAW_OFPST12_TABLE_REPLY, | |
2e1ae200 JR |
268 | /* OFPST 1.3 (3): struct ofp13_table_stats[]. */ |
269 | OFPRAW_OFPST13_TABLE_REPLY, | |
982697a4 | 270 | |
e2b9ac44 | 271 | /* OFPST 1.0 (4): struct ofp10_port_stats_request. */ |
f8e4867e SH |
272 | OFPRAW_OFPST10_PORT_REQUEST, |
273 | /* OFPST 1.1+ (4): struct ofp11_port_stats_request. */ | |
274 | OFPRAW_OFPST11_PORT_REQUEST, | |
982697a4 | 275 | |
e2b9ac44 | 276 | /* OFPST 1.0 (4): struct ofp10_port_stats[]. */ |
f8e4867e | 277 | OFPRAW_OFPST10_PORT_REPLY, |
2e1ae200 | 278 | /* OFPST 1.1-1.2 (4): struct ofp11_port_stats[]. */ |
f8e4867e | 279 | OFPRAW_OFPST11_PORT_REPLY, |
2e1ae200 JR |
280 | /* OFPST 1.3+ (4): struct ofp13_port_stats[]. */ |
281 | OFPRAW_OFPST13_PORT_REPLY, | |
982697a4 | 282 | |
e2b9ac44 | 283 | /* OFPST 1.0 (5): struct ofp10_queue_stats_request. */ |
64626975 SH |
284 | OFPRAW_OFPST10_QUEUE_REQUEST, |
285 | /* OFPST 1.1+ (5): struct ofp11_queue_stats_request. */ | |
286 | OFPRAW_OFPST11_QUEUE_REQUEST, | |
982697a4 | 287 | |
e2b9ac44 | 288 | /* OFPST 1.0 (5): struct ofp10_queue_stats[]. */ |
64626975 | 289 | OFPRAW_OFPST10_QUEUE_REPLY, |
2e1ae200 | 290 | /* OFPST 1.1-1.2 (5): struct ofp11_queue_stats[]. */ |
64626975 | 291 | OFPRAW_OFPST11_QUEUE_REPLY, |
2e1ae200 JR |
292 | /* OFPST 1.3+ (5): struct ofp13_queue_stats[]. */ |
293 | OFPRAW_OFPST13_QUEUE_REPLY, | |
294 | ||
295 | /* OFPST 1.1+ (6): struct ofp11_group_stats_request. */ | |
296 | OFPRAW_OFPST11_GROUP_REQUEST, | |
297 | ||
298 | /* OFPST 1.1-1.2 (6): struct ofp11_group_stats[]. */ | |
299 | OFPRAW_OFPST11_GROUP_REPLY, | |
300 | /* OFPST 1.3 (6): struct ofp13_group_stats[]. */ | |
301 | OFPRAW_OFPST13_GROUP_REPLY, | |
302 | ||
303 | /* OFPST 1.1+ (7): void. */ | |
304 | OFPRAW_OFPST11_GROUP_DESC_REQUEST, | |
305 | ||
306 | /* OFPST 1.1+ (7): struct ofp11_group_desc_stats[]. */ | |
307 | OFPRAW_OFPST11_GROUP_DESC_REPLY, | |
308 | ||
309 | /* OFPST 1.2+ (8): void. */ | |
310 | OFPRAW_OFPST12_GROUP_FEATURES_REQUEST, | |
311 | ||
312 | /* OFPST 1.2+ (8): struct ofp12_group_features_stats. */ | |
313 | OFPRAW_OFPST12_GROUP_FEATURES_REPLY, | |
314 | ||
315 | /* OFPST 1.3+ (9): struct ofp13_meter_multipart_request. */ | |
316 | OFPRAW_OFPST13_METER_REQUEST, | |
317 | ||
638a19b0 | 318 | /* OFPST 1.3+ (9): uint8_t[8][]. */ |
2e1ae200 JR |
319 | OFPRAW_OFPST13_METER_REPLY, |
320 | ||
321 | /* OFPST 1.3+ (10): struct ofp13_meter_multipart_request. */ | |
322 | OFPRAW_OFPST13_METER_CONFIG_REQUEST, | |
323 | ||
638a19b0 | 324 | /* OFPST 1.3+ (10): uint8_t[8][]. */ |
2e1ae200 JR |
325 | OFPRAW_OFPST13_METER_CONFIG_REPLY, |
326 | ||
327 | /* OFPST 1.3+ (11): void. */ | |
328 | OFPRAW_OFPST13_METER_FEATURES_REQUEST, | |
329 | ||
330 | /* OFPST 1.3+ (11): struct ofp13_meter_features. */ | |
331 | OFPRAW_OFPST13_METER_FEATURES_REPLY, | |
332 | ||
333 | /* OFPST 1.3+ (12): struct ofp13_table_features[]. */ | |
334 | OFPRAW_OFPST13_TABLE_FEATURES_REQUEST, | |
335 | ||
336 | /* OFPST 1.3+ (12): struct ofp13_table_features[]. */ | |
337 | OFPRAW_OFPST13_TABLE_FEATURES_REPLY, | |
982697a4 | 338 | |
56de7118 | 339 | /* OFPST 1.0+ (13): void. */ |
982697a4 BP |
340 | OFPRAW_OFPST_PORT_DESC_REQUEST, |
341 | ||
342 | /* OFPST 1.0 (13): struct ofp10_phy_port[]. */ | |
56de7118 SH |
343 | OFPRAW_OFPST10_PORT_DESC_REPLY, |
344 | /* OFPST 1.1+ (13): struct ofp11_port[]. */ | |
345 | OFPRAW_OFPST11_PORT_DESC_REPLY, | |
982697a4 BP |
346 | |
347 | /* Nicira extension messages. | |
348 | * | |
349 | * Nicira extensions that correspond to standard OpenFlow messages are listed | |
350 | * alongside the standard versions above. */ | |
351 | ||
310f3699 | 352 | /* NXT 1.0 (12): struct nx_set_flow_format. */ |
982697a4 BP |
353 | OFPRAW_NXT_SET_FLOW_FORMAT, |
354 | ||
355 | /* NXT 1.0+ (15): struct nx_flow_mod_table_id. */ | |
356 | OFPRAW_NXT_FLOW_MOD_TABLE_ID, | |
357 | ||
358 | /* NXT 1.0+ (16): struct nx_set_packet_in_format. */ | |
359 | OFPRAW_NXT_SET_PACKET_IN_FORMAT, | |
360 | ||
361 | /* NXT 1.0+ (18): void. */ | |
362 | OFPRAW_NXT_FLOW_AGE, | |
363 | ||
982697a4 BP |
364 | /* NXT 1.0+ (20): struct nx_controller_id. */ |
365 | OFPRAW_NXT_SET_CONTROLLER_ID, | |
366 | ||
367 | /* NXT 1.0+ (21): struct nx_flow_monitor_cancel. */ | |
368 | OFPRAW_NXT_FLOW_MONITOR_CANCEL, | |
369 | ||
370 | /* NXT 1.0+ (22): void. */ | |
371 | OFPRAW_NXT_FLOW_MONITOR_PAUSED, | |
372 | ||
373 | /* NXT 1.0+ (23): void. */ | |
374 | OFPRAW_NXT_FLOW_MONITOR_RESUMED, | |
375 | ||
376 | /* Nicira extension statistics. | |
377 | * | |
378 | * Nicira extension statistics that correspond to standard OpenFlow statistics | |
379 | * are listed alongside the standard versions above. */ | |
380 | ||
381 | /* NXST 1.0 (2): uint8_t[8][]. */ | |
382 | OFPRAW_NXST_FLOW_MONITOR_REQUEST, | |
383 | ||
384 | /* NXST 1.0 (2): uint8_t[8][]. */ | |
385 | OFPRAW_NXST_FLOW_MONITOR_REPLY, | |
386 | }; | |
387 | ||
388 | /* Decoding messages into OFPRAW_* values. */ | |
389 | enum ofperr ofpraw_decode(enum ofpraw *, const struct ofp_header *); | |
964a5f60 | 390 | enum ofpraw ofpraw_decode_assert(const struct ofp_header *); |
982697a4 BP |
391 | enum ofperr ofpraw_pull(enum ofpraw *, struct ofpbuf *); |
392 | enum ofpraw ofpraw_pull_assert(struct ofpbuf *); | |
393 | ||
394 | enum ofperr ofpraw_decode_partial(enum ofpraw *, | |
395 | const struct ofp_header *, size_t length); | |
396 | ||
397 | /* Encoding messages using OFPRAW_* values. */ | |
398 | struct ofpbuf *ofpraw_alloc(enum ofpraw, uint8_t ofp_version, | |
399 | size_t extra_tailroom); | |
400 | struct ofpbuf *ofpraw_alloc_xid(enum ofpraw, uint8_t ofp_version, | |
401 | ovs_be32 xid, size_t extra_tailroom); | |
402 | struct ofpbuf *ofpraw_alloc_reply(enum ofpraw, | |
403 | const struct ofp_header *request, | |
404 | size_t extra_tailroom); | |
405 | struct ofpbuf *ofpraw_alloc_stats_reply(const struct ofp_header *request, | |
406 | size_t extra_tailroom); | |
407 | ||
408 | void ofpraw_put(enum ofpraw, uint8_t ofp_version, struct ofpbuf *); | |
409 | void ofpraw_put_xid(enum ofpraw, uint8_t ofp_version, ovs_be32 xid, | |
410 | struct ofpbuf *); | |
411 | void ofpraw_put_reply(enum ofpraw, const struct ofp_header *request, | |
412 | struct ofpbuf *); | |
413 | void ofpraw_put_stats_reply(const struct ofp_header *request, struct ofpbuf *); | |
414 | ||
415 | /* Information about OFPRAW_* values. */ | |
416 | const char *ofpraw_get_name(enum ofpraw); | |
417 | enum ofpraw ofpraw_stats_request_to_reply(enum ofpraw, uint8_t version); | |
418 | \f | |
419 | /* Semantic identifiers for OpenFlow messages. | |
420 | * | |
421 | * Each OFPTYPE_* enumeration constant represents one or more concrete format | |
422 | * of OpenFlow message. When two variants of a message have essentially the | |
423 | * same meaning, they are assigned a single OFPTYPE_* value. | |
424 | * | |
425 | * The comments here must follow a stylized form because the "extract-ofp-msgs" | |
426 | * program parses them at build time to generate data tables. The format is | |
427 | * simply to list each OFPRAW_* enumeration constant for a given OFPTYPE_*, | |
428 | * each followed by a period. */ | |
429 | enum ofptype { | |
430 | /* Immutable messages. */ | |
431 | OFPTYPE_HELLO, /* OFPRAW_OFPT_HELLO. */ | |
432 | OFPTYPE_ERROR, /* OFPRAW_OFPT_ERROR. */ | |
433 | OFPTYPE_ECHO_REQUEST, /* OFPRAW_OFPT_ECHO_REQUEST. */ | |
434 | OFPTYPE_ECHO_REPLY, /* OFPRAW_OFPT_ECHO_REPLY. */ | |
435 | ||
436 | /* Switch configuration messages. */ | |
437 | OFPTYPE_FEATURES_REQUEST, /* OFPRAW_OFPT_FEATURES_REQUEST. */ | |
438 | OFPTYPE_FEATURES_REPLY, /* OFPRAW_OFPT10_FEATURES_REPLY. | |
2e1ae200 JR |
439 | * OFPRAW_OFPT11_FEATURES_REPLY. |
440 | * OFPRAW_OFPT13_FEATURES_REPLY. */ | |
982697a4 BP |
441 | OFPTYPE_GET_CONFIG_REQUEST, /* OFPRAW_OFPT_GET_CONFIG_REQUEST. */ |
442 | OFPTYPE_GET_CONFIG_REPLY, /* OFPRAW_OFPT_GET_CONFIG_REPLY. */ | |
443 | OFPTYPE_SET_CONFIG, /* OFPRAW_OFPT_SET_CONFIG. */ | |
444 | ||
445 | /* Asynchronous messages. */ | |
446 | OFPTYPE_PACKET_IN, /* OFPRAW_OFPT10_PACKET_IN. | |
447 | * OFPRAW_OFPT11_PACKET_IN. | |
d94240ec | 448 | * OFPRAW_OFPT12_PACKET_IN. |
2e1ae200 | 449 | * OFPRAW_OFPT13_PACKET_IN. |
982697a4 BP |
450 | * OFPRAW_NXT_PACKET_IN. */ |
451 | OFPTYPE_FLOW_REMOVED, /* OFPRAW_OFPT10_FLOW_REMOVED. | |
83974732 | 452 | * OFPRAW_OFPT11_FLOW_REMOVED. |
982697a4 BP |
453 | * OFPRAW_NXT_FLOW_REMOVED. */ |
454 | OFPTYPE_PORT_STATUS, /* OFPRAW_OFPT10_PORT_STATUS. | |
455 | * OFPRAW_OFPT11_PORT_STATUS. */ | |
456 | ||
457 | /* Controller command messages. */ | |
458 | OFPTYPE_PACKET_OUT, /* OFPRAW_OFPT10_PACKET_OUT. | |
459 | * OFPRAW_OFPT11_PACKET_OUT. */ | |
460 | OFPTYPE_FLOW_MOD, /* OFPRAW_OFPT10_FLOW_MOD. | |
461 | * OFPRAW_OFPT11_FLOW_MOD. | |
462 | * OFPRAW_NXT_FLOW_MOD. */ | |
463 | OFPTYPE_PORT_MOD, /* OFPRAW_OFPT10_PORT_MOD. | |
464 | * OFPRAW_OFPT11_PORT_MOD. */ | |
465 | ||
466 | /* Barrier messages. */ | |
467 | OFPTYPE_BARRIER_REQUEST, /* OFPRAW_OFPT10_BARRIER_REQUEST. | |
468 | * OFPRAW_OFPT11_BARRIER_REQUEST. */ | |
469 | OFPTYPE_BARRIER_REPLY, /* OFPRAW_OFPT10_BARRIER_REPLY. | |
470 | * OFPRAW_OFPT11_BARRIER_REPLY. */ | |
471 | ||
c545d38d JR |
472 | /* Queue Configuration messages. */ |
473 | OFPTYPE_QUEUE_GET_CONFIG_REQUEST, /* OFPRAW_OFPT11_QUEUE_GET_CONFIG_REQUEST. */ | |
474 | OFPTYPE_QUEUE_GET_CONFIG_REPLY, /* OFPRAW_OFPT11_QUEUE_GET_CONFIG_REPLY. */ | |
475 | ||
6ea4776b JR |
476 | /* Controller role change request messages. */ |
477 | OFPTYPE_ROLE_REQUEST, /* OFPRAW_OFPT12_ROLE_REQUEST. | |
478 | * OFPRAW_NXT_ROLE_REQUEST. */ | |
479 | OFPTYPE_ROLE_REPLY, /* OFPRAW_OFPT12_ROLE_REPLY. | |
480 | * OFPRAW_NXT_ROLE_REPLY. */ | |
481 | ||
2e1ae200 JR |
482 | /* Asynchronous message configuration. */ |
483 | OFPTYPE_GET_ASYNC_REQUEST, /* OFPRAW_OFPT13_GET_ASYNC_REQUEST. */ | |
484 | OFPTYPE_GET_ASYNC_REPLY, /* OFPRAW_OFPT13_GET_ASYNC_REPLY. */ | |
485 | OFPTYPE_SET_ASYNC_CONFIG, /* OFPRAW_NXT_SET_ASYNC_CONFIG. | |
486 | * OFPRAW_OFPT13_SET_ASYNC. */ | |
487 | ||
488 | /* Meters and rate limiters configuration messages. */ | |
489 | OFPTYPE_METER_MOD, /* OFPRAW_OFPT13_METER_MOD. */ | |
490 | ||
982697a4 BP |
491 | /* Statistics. */ |
492 | OFPTYPE_DESC_STATS_REQUEST, /* OFPRAW_OFPST_DESC_REQUEST. */ | |
493 | OFPTYPE_DESC_STATS_REPLY, /* OFPRAW_OFPST_DESC_REPLY. */ | |
cfc23141 SH |
494 | OFPTYPE_FLOW_STATS_REQUEST, /* OFPRAW_OFPST10_FLOW_REQUEST. |
495 | * OFPRAW_OFPST11_FLOW_REQUEST. | |
982697a4 | 496 | * OFPRAW_NXST_FLOW_REQUEST. */ |
cfc23141 SH |
497 | OFPTYPE_FLOW_STATS_REPLY, /* OFPRAW_OFPST10_FLOW_REPLY. |
498 | * OFPRAW_OFPST11_FLOW_REPLY. | |
2e1ae200 | 499 | * OFPRAW_OFPST13_FLOW_REPLY. |
982697a4 | 500 | * OFPRAW_NXST_FLOW_REPLY. */ |
617da9cd SH |
501 | OFPTYPE_AGGREGATE_STATS_REQUEST, /* OFPRAW_OFPST10_AGGREGATE_REQUEST. |
502 | * OFPRAW_OFPST11_AGGREGATE_REQUEST. | |
982697a4 BP |
503 | * OFPRAW_NXST_AGGREGATE_REQUEST. */ |
504 | OFPTYPE_AGGREGATE_STATS_REPLY, /* OFPRAW_OFPST_AGGREGATE_REPLY. | |
505 | * OFPRAW_NXST_AGGREGATE_REPLY. */ | |
506 | OFPTYPE_TABLE_STATS_REQUEST, /* OFPRAW_OFPST_TABLE_REQUEST. */ | |
16fdae54 SH |
507 | OFPTYPE_TABLE_STATS_REPLY, /* OFPRAW_OFPST10_TABLE_REPLY. |
508 | * OFPRAW_OFPST11_TABLE_REPLY. | |
2e1ae200 JR |
509 | * OFPRAW_OFPST12_TABLE_REPLY. |
510 | * OFPRAW_OFPST13_TABLE_REPLY. */ | |
f8e4867e SH |
511 | OFPTYPE_PORT_STATS_REQUEST, /* OFPRAW_OFPST10_PORT_REQUEST. |
512 | * OFPRAW_OFPST11_PORT_REQUEST. */ | |
513 | OFPTYPE_PORT_STATS_REPLY, /* OFPRAW_OFPST10_PORT_REPLY. | |
2e1ae200 JR |
514 | * OFPRAW_OFPST11_PORT_REPLY. |
515 | * OFPRAW_OFPST13_PORT_REPLY. */ | |
64626975 SH |
516 | OFPTYPE_QUEUE_STATS_REQUEST, /* OFPRAW_OFPST10_QUEUE_REQUEST. |
517 | * OFPRAW_OFPST11_QUEUE_REQUEST. */ | |
518 | OFPTYPE_QUEUE_STATS_REPLY, /* OFPRAW_OFPST10_QUEUE_REPLY. | |
2e1ae200 JR |
519 | * OFPRAW_OFPST11_QUEUE_REPLY. |
520 | * OFPRAW_OFPST13_QUEUE_REPLY. */ | |
521 | ||
522 | OFPTYPE_GROUP_REQUEST, /* OFPRAW_OFPST11_GROUP_REQUEST. */ | |
523 | ||
524 | OFPTYPE_GROUP_REPLY, /* OFPRAW_OFPST11_GROUP_REPLY. | |
525 | * OFPRAW_OFPST13_GROUP_REPLY. */ | |
526 | ||
527 | OFPTYPE_GROUP_DESC_REQUEST, /* OFPRAW_OFPST11_GROUP_DESC_REQUEST. */ | |
528 | ||
529 | OFPTYPE_GROUP_DESC_REPLY, /* OFPRAW_OFPST11_GROUP_DESC_REPLY. */ | |
530 | ||
531 | OFPTYPE_GROUP_FEATURES_REQUEST, /* OFPRAW_OFPST12_GROUP_FEATURES_REQUEST. */ | |
532 | ||
533 | OFPTYPE_GROUP_FEATURES_REPLY, /* OFPRAW_OFPST12_GROUP_FEATURES_REPLY. */ | |
534 | ||
535 | OFPTYPE_METER_REQUEST, /* OFPRAW_OFPST13_METER_REQUEST. */ | |
536 | ||
537 | OFPTYPE_METER_REPLY, /* OFPRAW_OFPST13_METER_REPLY. */ | |
538 | ||
539 | OFPTYPE_METER_CONFIG_REQUEST, /* OFPRAW_OFPST13_METER_CONFIG_REQUEST. */ | |
540 | ||
541 | OFPTYPE_METER_CONFIG_REPLY, /* OFPRAW_OFPST13_METER_CONFIG_REPLY. */ | |
542 | ||
543 | OFPTYPE_METER_FEATURES_REQUEST, /* OFPRAW_OFPST13_METER_FEATURES_REQUEST. */ | |
544 | ||
545 | OFPTYPE_METER_FEATURES_REPLY, /* OFPRAW_OFPST13_METER_FEATURES_REPLY. */ | |
546 | ||
547 | OFPTYPE_TABLE_FEATURES_REQUEST, /* OFPRAW_OFPST13_TABLE_FEATURES_REQUEST. */ | |
548 | ||
549 | OFPTYPE_TABLE_FEATURES_REPLY, /* OFPRAW_OFPST13_TABLE_FEATURES_REPLY. */ | |
550 | ||
982697a4 | 551 | OFPTYPE_PORT_DESC_STATS_REQUEST, /* OFPRAW_OFPST_PORT_DESC_REQUEST. */ |
64626975 | 552 | |
56de7118 SH |
553 | OFPTYPE_PORT_DESC_STATS_REPLY, /* OFPRAW_OFPST10_PORT_DESC_REPLY. |
554 | * OFPRAW_OFPST11_PORT_DESC_REPLY. */ | |
982697a4 BP |
555 | |
556 | /* Nicira extensions. */ | |
982697a4 BP |
557 | OFPTYPE_SET_FLOW_FORMAT, /* OFPRAW_NXT_SET_FLOW_FORMAT. */ |
558 | OFPTYPE_FLOW_MOD_TABLE_ID, /* OFPRAW_NXT_FLOW_MOD_TABLE_ID. */ | |
559 | OFPTYPE_SET_PACKET_IN_FORMAT, /* OFPRAW_NXT_SET_PACKET_IN_FORMAT. */ | |
560 | OFPTYPE_FLOW_AGE, /* OFPRAW_NXT_FLOW_AGE. */ | |
982697a4 BP |
561 | OFPTYPE_SET_CONTROLLER_ID, /* OFPRAW_NXT_SET_CONTROLLER_ID. */ |
562 | ||
563 | /* Flow monitor extension. */ | |
564 | OFPTYPE_FLOW_MONITOR_STATS_REQUEST, /* OFPRAW_NXST_FLOW_MONITOR_REQUEST. */ | |
565 | OFPTYPE_FLOW_MONITOR_STATS_REPLY, /* OFPRAW_NXST_FLOW_MONITOR_REPLY. */ | |
566 | OFPTYPE_FLOW_MONITOR_CANCEL, /* OFPRAW_NXT_FLOW_MONITOR_CANCEL. */ | |
567 | OFPTYPE_FLOW_MONITOR_PAUSED, /* OFPRAW_NXT_FLOW_MONITOR_PAUSED. */ | |
568 | OFPTYPE_FLOW_MONITOR_RESUMED, /* OFPRAW_NXT_FLOW_MONITOR_RESUMED. */ | |
569 | }; | |
570 | ||
571 | /* Decoding messages into OFPTYPE_* values. */ | |
572 | enum ofperr ofptype_decode(enum ofptype *, const struct ofp_header *); | |
573 | enum ofperr ofptype_pull(enum ofptype *, struct ofpbuf *); | |
574 | enum ofptype ofptype_from_ofpraw(enum ofpraw); | |
575 | \f | |
576 | /* OpenFlow message properties. */ | |
577 | void ofpmsg_update_length(struct ofpbuf *); | |
578 | const void *ofpmsg_body(const struct ofp_header *); | |
579 | \f | |
580 | /* Multipart messages (aka "statistics"). | |
581 | * | |
582 | * Individual OpenFlow messages are limited to 64 kB in size, but some messages | |
583 | * need to be longer. Therefore, multipart messages allow a longer message to | |
584 | * be divided into multiple parts at some convenient boundary. For example, | |
585 | * limiting the response to a "flow dump" request to 64 kB would unreasonably | |
586 | * limit the maximum number of flows in an OpenFlow switch, so a "flow dump" is | |
587 | * expressed as a multipart request/reply pair, with the reply broken into | |
588 | * pieces between flows. | |
589 | * | |
590 | * Multipart messages always consist of a request/reply pair. | |
591 | * | |
592 | * In OpenFlow 1.0, 1.1, and 1.2, requests must always fit in a single message, | |
593 | * that is, only a multipart reply may have more than one part. OpenFlow 1.3 | |
594 | * adds one multipart request. This code does not yet support multipart | |
595 | * requests. */ | |
596 | ||
597 | /* Encoding multipart replies. | |
598 | * | |
599 | * These functions are useful for multipart replies that might really require | |
600 | * more than one message. A multipart message that is known in advance to fit | |
601 | * within 64 kB doesn't need any special treatment, so you might as well use | |
602 | * the ofpraw_alloc_*() functions. | |
603 | * | |
604 | * These functions work with a "struct list" of "struct ofpbuf"s, each of | |
605 | * which represents one part of a multipart message. */ | |
606 | void ofpmp_init(struct list *, const struct ofp_header *request); | |
607 | struct ofpbuf *ofpmp_reserve(struct list *, size_t len); | |
608 | void *ofpmp_append(struct list *, size_t len); | |
609 | void ofpmp_postappend(struct list *, size_t start_ofs); | |
610 | ||
611 | /* Decoding multipart replies. */ | |
612 | uint16_t ofpmp_flags(const struct ofp_header *); | |
613 | bool ofpmp_more(const struct ofp_header *); | |
614 | ||
615 | #endif /* ofp-msgs.h */ |