]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (c) 2012 Nicira, Inc. | |
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 { | |
95 | /* Standard messages. */ | |
96 | ||
97 | /* OFPT 1.0+ (0): uint8_t[]. */ | |
98 | OFPRAW_OFPT_HELLO, | |
99 | ||
100 | /* OFPT 1.0+ (1): struct ofp_error_msg, uint8_t[]. */ | |
101 | OFPRAW_OFPT_ERROR, | |
102 | ||
103 | /* OFPT 1.0+ (2): uint8_t[]. */ | |
104 | OFPRAW_OFPT_ECHO_REQUEST, | |
105 | ||
106 | /* OFPT 1.0+ (3): uint8_t[]. */ | |
107 | OFPRAW_OFPT_ECHO_REPLY, | |
108 | ||
109 | /* OFPT 1.0+ (5): void. */ | |
110 | OFPRAW_OFPT_FEATURES_REQUEST, | |
111 | ||
112 | /* OFPT 1.0 (6): struct ofp_switch_features, struct ofp10_phy_port[]. */ | |
113 | OFPRAW_OFPT10_FEATURES_REPLY, | |
114 | /* OFPT 1.1+ (6): struct ofp_switch_features, struct ofp11_port[]. */ | |
115 | OFPRAW_OFPT11_FEATURES_REPLY, | |
116 | ||
117 | /* OFPT 1.0+ (7): void. */ | |
118 | OFPRAW_OFPT_GET_CONFIG_REQUEST, | |
119 | ||
120 | /* OFPT 1.0+ (8): struct ofp_switch_config. */ | |
121 | OFPRAW_OFPT_GET_CONFIG_REPLY, | |
122 | ||
123 | /* OFPT 1.0-1.1 (9): struct ofp_switch_config. */ | |
124 | OFPRAW_OFPT_SET_CONFIG, | |
125 | ||
126 | /* OFPT 1.0 (10): struct ofp_packet_in up to data, uint8_t[]. */ | |
127 | OFPRAW_OFPT10_PACKET_IN, | |
128 | /* OFPT 1.1 (10): struct ofp11_packet_in up to data, uint8_t[]. */ | |
129 | OFPRAW_OFPT11_PACKET_IN, | |
130 | /* NXT 1.0+ (17): struct nx_packet_in, uint8_t[]. */ | |
131 | OFPRAW_NXT_PACKET_IN, | |
132 | ||
133 | /* OFPT 1.0 (11): struct ofp_flow_removed. */ | |
134 | OFPRAW_OFPT10_FLOW_REMOVED, | |
135 | /* NXT 1.0+ (14): struct nx_flow_removed, uint8_t[8][]. */ | |
136 | OFPRAW_NXT_FLOW_REMOVED, | |
137 | ||
138 | /* OFPT 1.0 (12): struct ofp_port_status, struct ofp10_phy_port. */ | |
139 | OFPRAW_OFPT10_PORT_STATUS, | |
140 | /* OFPT 1.1+ (12): struct ofp_port_status, struct ofp11_port. */ | |
141 | OFPRAW_OFPT11_PORT_STATUS, | |
142 | ||
143 | /* OFPT 1.0 (13): struct ofp_packet_out, uint8_t[]. */ | |
144 | OFPRAW_OFPT10_PACKET_OUT, | |
145 | /* OFPT 1.1+ (13): struct ofp11_packet_out, uint8_t[]. */ | |
146 | OFPRAW_OFPT11_PACKET_OUT, | |
147 | ||
148 | /* OFPT 1.0 (14): struct ofp_flow_mod, struct ofp_action_header[]. */ | |
149 | OFPRAW_OFPT10_FLOW_MOD, | |
150 | /* OFPT 1.1+ (14): struct ofp11_flow_mod, struct ofp11_instruction[]. */ | |
151 | OFPRAW_OFPT11_FLOW_MOD, | |
152 | /* NXT 1.0+ (13): struct nx_flow_mod, uint8_t[8][]. */ | |
153 | OFPRAW_NXT_FLOW_MOD, | |
154 | ||
155 | /* OFPT 1.0 (15): struct ofp10_port_mod. */ | |
156 | OFPRAW_OFPT10_PORT_MOD, | |
157 | /* OFPT 1.1 (16): struct ofp11_port_mod. */ | |
158 | OFPRAW_OFPT11_PORT_MOD, | |
159 | ||
160 | /* OFPT 1.0 (18): void. */ | |
161 | OFPRAW_OFPT10_BARRIER_REQUEST, | |
162 | /* OFPT 1.1 (20): void. */ | |
163 | OFPRAW_OFPT11_BARRIER_REQUEST, | |
164 | ||
165 | /* OFPT 1.0 (19): void. */ | |
166 | OFPRAW_OFPT10_BARRIER_REPLY, | |
167 | /* OFPT 1.1 (21): void. */ | |
168 | OFPRAW_OFPT11_BARRIER_REPLY, | |
169 | ||
170 | /* Standard statistics. */ | |
171 | ||
172 | /* OFPST 1.0+ (0): void. */ | |
173 | OFPRAW_OFPST_DESC_REQUEST, | |
174 | ||
175 | /* OFPST 1.0+ (0): struct ofp_desc_stats. */ | |
176 | OFPRAW_OFPST_DESC_REPLY, | |
177 | ||
178 | /* OFPST 1.0 (1): struct ofp10_flow_stats_request. */ | |
179 | OFPRAW_OFPST_FLOW_REQUEST, | |
180 | /* NXST 1.0 (0): struct nx_flow_stats_request, uint8_t[8][]. */ | |
181 | OFPRAW_NXST_FLOW_REQUEST, | |
182 | ||
183 | /* OFPST 1.0 (1): uint8_t[]. */ | |
184 | OFPRAW_OFPST_FLOW_REPLY, | |
185 | /* NXST 1.0 (0): uint8_t[]. */ | |
186 | OFPRAW_NXST_FLOW_REPLY, | |
187 | ||
188 | /* OFPST 1.0 (2): struct ofp10_flow_stats_request. */ | |
189 | OFPRAW_OFPST_AGGREGATE_REQUEST, | |
190 | /* NXST 1.0 (1): struct nx_flow_stats_request, uint8_t[8][]. */ | |
191 | OFPRAW_NXST_AGGREGATE_REQUEST, | |
192 | ||
193 | /* OFPST 1.0 (2): struct ofp_aggregate_stats_reply. */ | |
194 | OFPRAW_OFPST_AGGREGATE_REPLY, | |
195 | /* NXST 1.0 (1): struct ofp_aggregate_stats_reply. */ | |
196 | OFPRAW_NXST_AGGREGATE_REPLY, | |
197 | ||
198 | /* OFPST 1.0 (3): void. */ | |
199 | OFPRAW_OFPST_TABLE_REQUEST, | |
200 | ||
201 | /* OFPST 1.0 (3): struct ofp10_table_stats[]. */ | |
202 | OFPRAW_OFPST_TABLE_REPLY, | |
203 | ||
204 | /* OFPST 1.0 (4): struct ofp10_port_stats_request. */ | |
205 | OFPRAW_OFPST_PORT_REQUEST, | |
206 | ||
207 | /* OFPST 1.0 (4): struct ofp10_port_stats[]. */ | |
208 | OFPRAW_OFPST_PORT_REPLY, | |
209 | ||
210 | /* OFPST 1.0 (5): struct ofp10_queue_stats_request. */ | |
211 | OFPRAW_OFPST_QUEUE_REQUEST, | |
212 | ||
213 | /* OFPST 1.0 (5): struct ofp10_queue_stats[]. */ | |
214 | OFPRAW_OFPST_QUEUE_REPLY, | |
215 | ||
216 | /* OFPST 1.0 (13): void. */ | |
217 | OFPRAW_OFPST_PORT_DESC_REQUEST, | |
218 | ||
219 | /* OFPST 1.0 (13): struct ofp10_phy_port[]. */ | |
220 | OFPRAW_OFPST_PORT_DESC_REPLY, | |
221 | ||
222 | /* Nicira extension messages. | |
223 | * | |
224 | * Nicira extensions that correspond to standard OpenFlow messages are listed | |
225 | * alongside the standard versions above. */ | |
226 | ||
227 | /* NXT 1.0+ (10): struct nx_role_request. */ | |
228 | OFPRAW_NXT_ROLE_REQUEST, | |
229 | ||
230 | /* NXT 1.0+ (11): struct nx_role_request. */ | |
231 | OFPRAW_NXT_ROLE_REPLY, | |
232 | ||
233 | /* NXT 1.0+ (12): struct nx_set_flow_format. */ | |
234 | OFPRAW_NXT_SET_FLOW_FORMAT, | |
235 | ||
236 | /* NXT 1.0+ (15): struct nx_flow_mod_table_id. */ | |
237 | OFPRAW_NXT_FLOW_MOD_TABLE_ID, | |
238 | ||
239 | /* NXT 1.0+ (16): struct nx_set_packet_in_format. */ | |
240 | OFPRAW_NXT_SET_PACKET_IN_FORMAT, | |
241 | ||
242 | /* NXT 1.0+ (18): void. */ | |
243 | OFPRAW_NXT_FLOW_AGE, | |
244 | ||
245 | /* NXT 1.0+ (19): struct nx_async_config. */ | |
246 | OFPRAW_NXT_SET_ASYNC_CONFIG, | |
247 | ||
248 | /* NXT 1.0+ (20): struct nx_controller_id. */ | |
249 | OFPRAW_NXT_SET_CONTROLLER_ID, | |
250 | ||
251 | /* NXT 1.0+ (21): struct nx_flow_monitor_cancel. */ | |
252 | OFPRAW_NXT_FLOW_MONITOR_CANCEL, | |
253 | ||
254 | /* NXT 1.0+ (22): void. */ | |
255 | OFPRAW_NXT_FLOW_MONITOR_PAUSED, | |
256 | ||
257 | /* NXT 1.0+ (23): void. */ | |
258 | OFPRAW_NXT_FLOW_MONITOR_RESUMED, | |
259 | ||
260 | /* Nicira extension statistics. | |
261 | * | |
262 | * Nicira extension statistics that correspond to standard OpenFlow statistics | |
263 | * are listed alongside the standard versions above. */ | |
264 | ||
265 | /* NXST 1.0 (2): uint8_t[8][]. */ | |
266 | OFPRAW_NXST_FLOW_MONITOR_REQUEST, | |
267 | ||
268 | /* NXST 1.0 (2): uint8_t[8][]. */ | |
269 | OFPRAW_NXST_FLOW_MONITOR_REPLY, | |
270 | }; | |
271 | ||
272 | /* Decoding messages into OFPRAW_* values. */ | |
273 | enum ofperr ofpraw_decode(enum ofpraw *, const struct ofp_header *); | |
274 | enum ofperr ofpraw_pull(enum ofpraw *, struct ofpbuf *); | |
275 | enum ofpraw ofpraw_pull_assert(struct ofpbuf *); | |
276 | ||
277 | enum ofperr ofpraw_decode_partial(enum ofpraw *, | |
278 | const struct ofp_header *, size_t length); | |
279 | ||
280 | /* Encoding messages using OFPRAW_* values. */ | |
281 | struct ofpbuf *ofpraw_alloc(enum ofpraw, uint8_t ofp_version, | |
282 | size_t extra_tailroom); | |
283 | struct ofpbuf *ofpraw_alloc_xid(enum ofpraw, uint8_t ofp_version, | |
284 | ovs_be32 xid, size_t extra_tailroom); | |
285 | struct ofpbuf *ofpraw_alloc_reply(enum ofpraw, | |
286 | const struct ofp_header *request, | |
287 | size_t extra_tailroom); | |
288 | struct ofpbuf *ofpraw_alloc_stats_reply(const struct ofp_header *request, | |
289 | size_t extra_tailroom); | |
290 | ||
291 | void ofpraw_put(enum ofpraw, uint8_t ofp_version, struct ofpbuf *); | |
292 | void ofpraw_put_xid(enum ofpraw, uint8_t ofp_version, ovs_be32 xid, | |
293 | struct ofpbuf *); | |
294 | void ofpraw_put_reply(enum ofpraw, const struct ofp_header *request, | |
295 | struct ofpbuf *); | |
296 | void ofpraw_put_stats_reply(const struct ofp_header *request, struct ofpbuf *); | |
297 | ||
298 | /* Information about OFPRAW_* values. */ | |
299 | const char *ofpraw_get_name(enum ofpraw); | |
300 | enum ofpraw ofpraw_stats_request_to_reply(enum ofpraw, uint8_t version); | |
301 | \f | |
302 | /* Semantic identifiers for OpenFlow messages. | |
303 | * | |
304 | * Each OFPTYPE_* enumeration constant represents one or more concrete format | |
305 | * of OpenFlow message. When two variants of a message have essentially the | |
306 | * same meaning, they are assigned a single OFPTYPE_* value. | |
307 | * | |
308 | * The comments here must follow a stylized form because the "extract-ofp-msgs" | |
309 | * program parses them at build time to generate data tables. The format is | |
310 | * simply to list each OFPRAW_* enumeration constant for a given OFPTYPE_*, | |
311 | * each followed by a period. */ | |
312 | enum ofptype { | |
313 | /* Immutable messages. */ | |
314 | OFPTYPE_HELLO, /* OFPRAW_OFPT_HELLO. */ | |
315 | OFPTYPE_ERROR, /* OFPRAW_OFPT_ERROR. */ | |
316 | OFPTYPE_ECHO_REQUEST, /* OFPRAW_OFPT_ECHO_REQUEST. */ | |
317 | OFPTYPE_ECHO_REPLY, /* OFPRAW_OFPT_ECHO_REPLY. */ | |
318 | ||
319 | /* Switch configuration messages. */ | |
320 | OFPTYPE_FEATURES_REQUEST, /* OFPRAW_OFPT_FEATURES_REQUEST. */ | |
321 | OFPTYPE_FEATURES_REPLY, /* OFPRAW_OFPT10_FEATURES_REPLY. | |
322 | * OFPRAW_OFPT11_FEATURES_REPLY. */ | |
323 | OFPTYPE_GET_CONFIG_REQUEST, /* OFPRAW_OFPT_GET_CONFIG_REQUEST. */ | |
324 | OFPTYPE_GET_CONFIG_REPLY, /* OFPRAW_OFPT_GET_CONFIG_REPLY. */ | |
325 | OFPTYPE_SET_CONFIG, /* OFPRAW_OFPT_SET_CONFIG. */ | |
326 | ||
327 | /* Asynchronous messages. */ | |
328 | OFPTYPE_PACKET_IN, /* OFPRAW_OFPT10_PACKET_IN. | |
329 | * OFPRAW_OFPT11_PACKET_IN. | |
330 | * OFPRAW_NXT_PACKET_IN. */ | |
331 | OFPTYPE_FLOW_REMOVED, /* OFPRAW_OFPT10_FLOW_REMOVED. | |
332 | * OFPRAW_NXT_FLOW_REMOVED. */ | |
333 | OFPTYPE_PORT_STATUS, /* OFPRAW_OFPT10_PORT_STATUS. | |
334 | * OFPRAW_OFPT11_PORT_STATUS. */ | |
335 | ||
336 | /* Controller command messages. */ | |
337 | OFPTYPE_PACKET_OUT, /* OFPRAW_OFPT10_PACKET_OUT. | |
338 | * OFPRAW_OFPT11_PACKET_OUT. */ | |
339 | OFPTYPE_FLOW_MOD, /* OFPRAW_OFPT10_FLOW_MOD. | |
340 | * OFPRAW_OFPT11_FLOW_MOD. | |
341 | * OFPRAW_NXT_FLOW_MOD. */ | |
342 | OFPTYPE_PORT_MOD, /* OFPRAW_OFPT10_PORT_MOD. | |
343 | * OFPRAW_OFPT11_PORT_MOD. */ | |
344 | ||
345 | /* Barrier messages. */ | |
346 | OFPTYPE_BARRIER_REQUEST, /* OFPRAW_OFPT10_BARRIER_REQUEST. | |
347 | * OFPRAW_OFPT11_BARRIER_REQUEST. */ | |
348 | OFPTYPE_BARRIER_REPLY, /* OFPRAW_OFPT10_BARRIER_REPLY. | |
349 | * OFPRAW_OFPT11_BARRIER_REPLY. */ | |
350 | ||
351 | /* Statistics. */ | |
352 | OFPTYPE_DESC_STATS_REQUEST, /* OFPRAW_OFPST_DESC_REQUEST. */ | |
353 | OFPTYPE_DESC_STATS_REPLY, /* OFPRAW_OFPST_DESC_REPLY. */ | |
354 | OFPTYPE_FLOW_STATS_REQUEST, /* OFPRAW_OFPST_FLOW_REQUEST. | |
355 | * OFPRAW_NXST_FLOW_REQUEST. */ | |
356 | OFPTYPE_FLOW_STATS_REPLY, /* OFPRAW_OFPST_FLOW_REPLY. | |
357 | * OFPRAW_NXST_FLOW_REPLY. */ | |
358 | OFPTYPE_AGGREGATE_STATS_REQUEST, /* OFPRAW_OFPST_AGGREGATE_REQUEST. | |
359 | * OFPRAW_NXST_AGGREGATE_REQUEST. */ | |
360 | OFPTYPE_AGGREGATE_STATS_REPLY, /* OFPRAW_OFPST_AGGREGATE_REPLY. | |
361 | * OFPRAW_NXST_AGGREGATE_REPLY. */ | |
362 | OFPTYPE_TABLE_STATS_REQUEST, /* OFPRAW_OFPST_TABLE_REQUEST. */ | |
363 | OFPTYPE_TABLE_STATS_REPLY, /* OFPRAW_OFPST_TABLE_REPLY. */ | |
364 | OFPTYPE_PORT_STATS_REQUEST, /* OFPRAW_OFPST_PORT_REQUEST. */ | |
365 | OFPTYPE_PORT_STATS_REPLY, /* OFPRAW_OFPST_PORT_REPLY. */ | |
366 | OFPTYPE_QUEUE_STATS_REQUEST, /* OFPRAW_OFPST_QUEUE_REQUEST. */ | |
367 | OFPTYPE_QUEUE_STATS_REPLY, /* OFPRAW_OFPST_QUEUE_REPLY. */ | |
368 | OFPTYPE_PORT_DESC_STATS_REQUEST, /* OFPRAW_OFPST_PORT_DESC_REQUEST. */ | |
369 | OFPTYPE_PORT_DESC_STATS_REPLY, /* OFPRAW_OFPST_PORT_DESC_REPLY. */ | |
370 | ||
371 | /* Nicira extensions. */ | |
372 | OFPTYPE_ROLE_REQUEST, /* OFPRAW_NXT_ROLE_REQUEST. */ | |
373 | OFPTYPE_ROLE_REPLY, /* OFPRAW_NXT_ROLE_REPLY. */ | |
374 | OFPTYPE_SET_FLOW_FORMAT, /* OFPRAW_NXT_SET_FLOW_FORMAT. */ | |
375 | OFPTYPE_FLOW_MOD_TABLE_ID, /* OFPRAW_NXT_FLOW_MOD_TABLE_ID. */ | |
376 | OFPTYPE_SET_PACKET_IN_FORMAT, /* OFPRAW_NXT_SET_PACKET_IN_FORMAT. */ | |
377 | OFPTYPE_FLOW_AGE, /* OFPRAW_NXT_FLOW_AGE. */ | |
378 | OFPTYPE_SET_ASYNC_CONFIG, /* OFPRAW_NXT_SET_ASYNC_CONFIG. */ | |
379 | OFPTYPE_SET_CONTROLLER_ID, /* OFPRAW_NXT_SET_CONTROLLER_ID. */ | |
380 | ||
381 | /* Flow monitor extension. */ | |
382 | OFPTYPE_FLOW_MONITOR_STATS_REQUEST, /* OFPRAW_NXST_FLOW_MONITOR_REQUEST. */ | |
383 | OFPTYPE_FLOW_MONITOR_STATS_REPLY, /* OFPRAW_NXST_FLOW_MONITOR_REPLY. */ | |
384 | OFPTYPE_FLOW_MONITOR_CANCEL, /* OFPRAW_NXT_FLOW_MONITOR_CANCEL. */ | |
385 | OFPTYPE_FLOW_MONITOR_PAUSED, /* OFPRAW_NXT_FLOW_MONITOR_PAUSED. */ | |
386 | OFPTYPE_FLOW_MONITOR_RESUMED, /* OFPRAW_NXT_FLOW_MONITOR_RESUMED. */ | |
387 | }; | |
388 | ||
389 | /* Decoding messages into OFPTYPE_* values. */ | |
390 | enum ofperr ofptype_decode(enum ofptype *, const struct ofp_header *); | |
391 | enum ofperr ofptype_pull(enum ofptype *, struct ofpbuf *); | |
392 | enum ofptype ofptype_from_ofpraw(enum ofpraw); | |
393 | \f | |
394 | /* OpenFlow message properties. */ | |
395 | void ofpmsg_update_length(struct ofpbuf *); | |
396 | const void *ofpmsg_body(const struct ofp_header *); | |
397 | \f | |
398 | /* Multipart messages (aka "statistics"). | |
399 | * | |
400 | * Individual OpenFlow messages are limited to 64 kB in size, but some messages | |
401 | * need to be longer. Therefore, multipart messages allow a longer message to | |
402 | * be divided into multiple parts at some convenient boundary. For example, | |
403 | * limiting the response to a "flow dump" request to 64 kB would unreasonably | |
404 | * limit the maximum number of flows in an OpenFlow switch, so a "flow dump" is | |
405 | * expressed as a multipart request/reply pair, with the reply broken into | |
406 | * pieces between flows. | |
407 | * | |
408 | * Multipart messages always consist of a request/reply pair. | |
409 | * | |
410 | * In OpenFlow 1.0, 1.1, and 1.2, requests must always fit in a single message, | |
411 | * that is, only a multipart reply may have more than one part. OpenFlow 1.3 | |
412 | * adds one multipart request. This code does not yet support multipart | |
413 | * requests. */ | |
414 | ||
415 | /* Encoding multipart replies. | |
416 | * | |
417 | * These functions are useful for multipart replies that might really require | |
418 | * more than one message. A multipart message that is known in advance to fit | |
419 | * within 64 kB doesn't need any special treatment, so you might as well use | |
420 | * the ofpraw_alloc_*() functions. | |
421 | * | |
422 | * These functions work with a "struct list" of "struct ofpbuf"s, each of | |
423 | * which represents one part of a multipart message. */ | |
424 | void ofpmp_init(struct list *, const struct ofp_header *request); | |
425 | struct ofpbuf *ofpmp_reserve(struct list *, size_t len); | |
426 | void *ofpmp_append(struct list *, size_t len); | |
427 | void ofpmp_postappend(struct list *, size_t start_ofs); | |
428 | ||
429 | /* Decoding multipart replies. */ | |
430 | uint16_t ofpmp_flags(const struct ofp_header *); | |
431 | bool ofpmp_more(const struct ofp_header *); | |
432 | ||
433 | #endif /* ofp-msgs.h */ |