Setting tag sliver-openvswitch-2.2.90-1
[sliver-openvswitch.git] / include / openflow / openflow-1.3.h
1 /* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
2 * Junior University
3 * Copyright (c) 2011, 2012 Open Networking Foundation
4 *
5 * We are making the OpenFlow specification and associated documentation
6 * (Software) available for public use and benefit with the expectation
7 * that others will use, modify and enhance the Software and contribute
8 * those enhancements back to the community. However, since we would
9 * like to make the Software available for broadest use, with as few
10 * restrictions as possible permission is hereby granted, free of
11 * charge, to any person obtaining a copy of this Software to deal in
12 * the Software under the copyrights without restriction, including
13 * without limitation the rights to use, copy, modify, merge, publish,
14 * distribute, sublicense, and/or sell copies of the Software, and to
15 * permit persons to whom the Software is furnished to do so, subject to
16 * the following conditions:
17 *
18 * The above copyright notice and this permission notice shall be
19 * included in all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
25 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
26 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
27 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28 * SOFTWARE.
29 *
30 * The name and trademarks of copyright holder(s) may NOT be used in
31 * advertising or publicity pertaining to the Software or any
32 * derivatives without specific, written prior permission.
33 */
34
35 /* OpenFlow: protocol between controller and datapath. */
36
37 #ifndef OPENFLOW_13_H
38 #define OPENFLOW_13_H 1
39
40 #include "openflow/openflow-1.2.h"
41
42 /*
43  * OpenFlow 1.3 modifies the syntax of the following message types:
44  *
45  * OFPT_FEATURES_REPLY     = 6    (opf13_switch_features)
46  *                                 - new field: auxiliary_id
47  *                                 - removed: ofp_ports at the end
48  *
49  * OFPT_PACKET_IN          = 10   (ofp13_packet_in) new field: cookie
50  *
51  * OpenFlow 1.3 adds following new message types:
52  *
53  * * Asynchronous message configuration. *
54  * OFPT13_GET_ASYNC_REQUEST  = 26   (void)
55  * OFPT13_GET_ASYNC_REPLY    = 27   (ofp13_async_config)
56  * OFPT13_SET_ASYNC          = 28   (ofp13_async_config)
57  *
58  * * Meters and rate limiters configuration messages. *
59  * OFPT13_METER_MOD          = 29   (ofp13_meter_mod)
60  *
61  * OpenFlow 1.3 modifies the syntax of the following statistics message types
62  * (now called multipart message types):
63  *
64  * OFPMP13_FLOW_REPLY = 1 (struct ofp13_flow_stats[])
65  * OFPMP13_TABLE_REPLY = 3 (struct ofp13_table_stats[])
66  * OFPMP13_PORT_REPLY = 4 (struct ofp13_port_stats[])
67  * OFPMP13_QUEUE_REPLY = 5, (struct ofp13_queue_stats[])
68  * OFPMP13_GROUP_REPLY = 6, (struct ofp13_group_stats[])
69  *
70  * OpenFlow 1.3 adds the following multipart message types
71  *
72  * Meter statistics:
73  * OFPMP13_METER_REQUEST = 9, (struct ofp13_meter_multipart_request)
74  * OFPMP13_METER_REPLY = 9, (struct ofp13_meter_stats[])
75  *
76  * Meter configuration:
77  * OFPMP13_METER_CONFIG_REQUEST = 10, (struct ofp13_meter_multipart_request)
78  * OFPMP13_METER_CONFIG_REPLY = 10, (struct ofp13_meter_config[])
79  *
80  * Meter features:
81  * OFPMP13_METER_FEATURES_REQUEST = 11 (void)
82  * OFPMP13_METER_FEATURES_REPLY = 11 (struct ofp13_meter_features)
83  *
84  * Table features:
85  * OFPMP13_TABLE_FEATURES_REQUEST = 12, (struct ofp13_table_features[])
86  * OFPMP13_TABLE_FEATURES_REPLY = 12, (struct ofp13_table_features[])
87  *
88  */
89
90 enum ofp13_instruction_type {
91     OFPIT13_METER = 6           /* Apply meter (rate limiter) */
92 };
93
94 #define OFPIT13_ALL (OFPIT11_GOTO_TABLE | OFPIT11_WRITE_METADATA |      \
95                      OFPIT11_WRITE_ACTIONS | OFPIT11_APPLY_ACTIONS |    \
96                      OFPIT11_CLEAR_ACTIONS | OFPIT13_METER)
97
98 /* Instruction structure for OFPIT_METER */
99 struct ofp13_instruction_meter {
100     ovs_be16 type;              /* OFPIT13_METER */
101     ovs_be16 len;               /* Length is 8. */
102     ovs_be32 meter_id;          /* Meter instance. */
103 };
104 OFP_ASSERT(sizeof(struct ofp13_instruction_meter) == 8);
105
106 enum ofp13_action_type {
107     OFPAT13_OUTPUT       = 0,   /* Output to switch port. */
108     OFPAT13_COPY_TTL_OUT = 11,  /* Copy TTL "outwards" -- from next-to-outermost
109                                    to outermost */
110     OFPAT13_COPY_TTL_IN  = 12,  /* Copy TTL "inwards" -- from outermost to
111                                    next-to-outermost */
112     OFPAT13_SET_MPLS_TTL = 15,  /* MPLS TTL */
113     OFPAT13_DEC_MPLS_TTL = 16,  /* Decrement MPLS TTL */
114     OFPAT13_PUSH_VLAN    = 17,  /* Push a new VLAN tag */
115     OFPAT13_POP_VLAN     = 18,  /* Pop the outer VLAN tag */
116     OFPAT13_PUSH_MPLS    = 19,  /* Push a new MPLS Label Stack Entry */
117     OFPAT13_POP_MPLS     = 20,  /* Pop the outer MPLS Label Stack Entry */
118     OFPAT13_SET_QUEUE    = 21,  /* Set queue id when outputting to a port */
119     OFPAT13_GROUP        = 22,  /* Apply group. */
120     OFPAT13_SET_NW_TTL   = 23,  /* IP TTL. */
121     OFPAT13_DEC_NW_TTL   = 24,  /* Decrement IP TTL. */
122     OFPAT13_SET_FIELD    = 25,  /* Set a header field using OXM TLV format. */
123     OFPAT13_PUSH_PBB     = 26,  /* Push a new PBB service tag (I-TAG) */
124     OFPAT13_POP_PBB      = 27   /* Pop the outer PBB service tag (I-TAG) */
125 };
126
127 /* enum ofp_config_flags value OFPC_INVALID_TTL_TO_CONTROLLER
128  * is deprecated in OpenFlow 1.3 */
129
130 /* Flags to configure the table. Reserved for future use. */
131 enum ofp13_table_config {
132     OFPTC13_DEPRECATED_MASK = 3  /* Deprecated bits */
133 };
134
135 /* OpenFlow 1.3 specific flags for flow_mod messages. */
136 enum ofp13_flow_mod_flags {
137     OFPFF13_NO_PKT_COUNTS = 1 << 3, /* Don't keep track of packet count. */
138     OFPFF13_NO_BYT_COUNTS = 1 << 4  /* Don't keep track of byte count. */
139 };
140
141 /* Common header for all meter bands */
142 struct ofp13_meter_band_header {
143     ovs_be16 type;       /* One of OFPMBT_*. */
144     ovs_be16 len;        /* Length in bytes of this band. */
145     ovs_be32 rate;       /* Rate for this band. */
146     ovs_be32 burst_size; /* Size of bursts. */
147 };
148 OFP_ASSERT(sizeof(struct ofp13_meter_band_header) == 12);
149
150 /* Meter configuration. OFPT_METER_MOD. */
151 struct ofp13_meter_mod {
152     ovs_be16          command;      /* One of OFPMC_*. */
153     ovs_be16          flags;        /* Set of OFPMF_*. */
154     ovs_be32          meter_id;     /* Meter instance. */
155     /* struct ofp13_meter_band_header bands[0];  The bands length is inferred
156                                                  from the length field in the
157                                                  header. */
158 };
159 OFP_ASSERT(sizeof(struct ofp13_meter_mod) == 8);
160
161 /* Meter numbering. Flow meters can use any number up to OFPM_MAX. */
162 enum ofp13_meter {
163     /* Last usable meter. */
164     OFPM13_MAX        = 0xffff0000,
165     /* Virtual meters. */
166     OFPM13_SLOWPATH   = 0xfffffffd, /* Meter for slow datapath. */
167     OFPM13_CONTROLLER = 0xfffffffe, /* Meter for controller connection. */
168     OFPM13_ALL        = 0xffffffff, /* Represents all meters for stat requests
169                                      commands. */
170 };
171
172 /* Meter commands */
173 enum ofp13_meter_mod_command {
174     OFPMC13_ADD,           /* New meter. */
175     OFPMC13_MODIFY,        /* Modify specified meter. */
176     OFPMC13_DELETE         /* Delete specified meter. */
177 };
178
179 /* Meter configuration flags */
180 enum ofp13_meter_flags {
181     OFPMF13_KBPS    = 1 << 0,   /* Rate value in kb/s (kilo-bit per second). */
182     OFPMF13_PKTPS   = 1 << 1,   /* Rate value in packet/sec. */
183     OFPMF13_BURST   = 1 << 2,   /* Do burst size. */
184     OFPMF13_STATS   = 1 << 3    /* Collect statistics. */
185 };
186
187 /* Meter band types */
188 enum ofp13_meter_band_type {
189     OFPMBT13_DROP         = 1,     /* Drop packet. */
190     OFPMBT13_DSCP_REMARK  = 2,     /* Remark DSCP in the IP header. */
191     OFPMBT13_EXPERIMENTER = 0xFFFF /* Experimenter meter band. */
192 };
193
194 /* OFPMBT_DROP band - drop packets */
195 struct ofp13_meter_band_drop {
196     ovs_be16    type;        /* OFPMBT_DROP. */
197     ovs_be16    len;         /* Length in bytes of this band. */
198     ovs_be32    rate;        /* Rate for dropping packets. */
199     ovs_be32    burst_size;  /* Size of bursts. */
200     uint8_t     pad[4];
201 };
202 OFP_ASSERT(sizeof(struct ofp13_meter_band_drop) == 16);
203
204 /* OFPMBT_DSCP_REMARK band - Remark DSCP in the IP header */
205 struct ofp13_meter_band_dscp_remark {
206     ovs_be16    type;        /* OFPMBT_DSCP_REMARK. */
207     ovs_be16    len;         /* Length in bytes of this band. */
208     ovs_be32    rate;        /* Rate for remarking packets. */
209     ovs_be32    burst_size;  /* Size of bursts. */
210     uint8_t     prec_level;  /* Number of drop precedence level to add. */
211     uint8_t     pad[3];
212 };
213 OFP_ASSERT(sizeof(struct ofp13_meter_band_dscp_remark) == 16);
214
215 /* OFPMBT_EXPERIMENTER band - Write actions in action set */
216 struct ofp13_meter_band_experimenter {
217     ovs_be16    type;        /* OFPMBT_EXPERIMENTER. */
218     ovs_be16    len;         /* Length in bytes of this band. */
219     ovs_be32    rate;        /* Rate for dropping packets. */
220     ovs_be32    burst_size;  /* Size of bursts. */
221     ovs_be32    experimenter; /* Experimenter ID which takes the same form as
222                                  in struct ofp_experimenter_header. */
223 };
224 OFP_ASSERT(sizeof(struct ofp13_meter_band_experimenter) == 16);
225
226 /* OF 1.3 adds MORE flag also for requests */
227 enum ofp13_multipart_request_flags {
228     OFPMPF13_REQ_MORE = 1 << 0 /* More requests to follow. */
229 };
230
231 /* OF 1.3 splits table features off the ofp_table_stats */
232 /* Body of reply to OFPMP13_TABLE request. */
233 struct ofp13_table_stats {
234     uint8_t  table_id;      /* Identifier of table. Lower numbered tables are
235                                consulted first. */
236     uint8_t  pad[3];        /* Align to 32-bits. */
237     ovs_be32 active_count;  /* Number of active entries. */
238     ovs_be64 lookup_count;  /* Number of packets looked up in table. */
239     ovs_be64 matched_count; /* Number of packets that hit table. */
240 };
241 OFP_ASSERT(sizeof(struct ofp13_table_stats) == 24);
242
243 /* Common header for all Table Feature Properties */
244 struct ofp13_table_feature_prop_header {
245     ovs_be16    type;   /* One of OFPTFPT_*. */
246     ovs_be16    length; /* Length in bytes of this property. */
247 };
248 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_header) == 4);
249
250 /* Body for ofp_multipart_request of type OFPMP_TABLE_FEATURES./
251  * Body of reply to OFPMP_TABLE_FEATURES request. */
252 struct ofp13_table_features {
253     ovs_be16 length;          /* Length is padded to 64 bits. */
254     uint8_t table_id;         /* Identifier of table. Lower numbered tables
255                                  are consulted first. */
256     uint8_t pad[5];           /* Align to 64-bits. */
257     char name[OFP_MAX_TABLE_NAME_LEN];
258     ovs_be64 metadata_match;  /* Bits of metadata table can match. */
259     ovs_be64 metadata_write;  /* Bits of metadata table can write. */
260     ovs_be32 config;          /* Bitmap of OFPTC_* values */
261     ovs_be32 max_entries;     /* Max number of entries supported. */
262
263     /* Table Feature Property list */
264     /* struct ofp13_table_feature_prop_header properties[0]; */
265 };
266 OFP_ASSERT(sizeof(struct ofp13_table_features) == 64);
267
268 /* Table Feature property types.
269  * Low order bit cleared indicates a property for a regular Flow Entry.
270  * Low order bit set indicates a property for the Table-Miss Flow Entry. */
271 enum ofp13_table_feature_prop_type {
272     OFPTFPT13_INSTRUCTIONS         = 0, /* Instructions property. */
273     OFPTFPT13_INSTRUCTIONS_MISS    = 1, /* Instructions for table-miss. */
274     OFPTFPT13_NEXT_TABLES          = 2, /* Next Table property. */
275     OFPTFPT13_NEXT_TABLES_MISS     = 3, /* Next Table for table-miss. */
276     OFPTFPT13_WRITE_ACTIONS        = 4, /* Write Actions property. */
277     OFPTFPT13_WRITE_ACTIONS_MISS   = 5, /* Write Actions for table-miss. */
278     OFPTFPT13_APPLY_ACTIONS        = 6, /* Apply Actions property. */
279     OFPTFPT13_APPLY_ACTIONS_MISS   = 7, /* Apply Actions for table-miss. */
280     OFPTFPT13_MATCH                = 8, /* Match property. */
281     OFPTFPT13_WILDCARDS            = 10, /* Wildcards property. */
282     OFPTFPT13_WRITE_SETFIELD       = 12, /* Write Set-Field property. */
283     OFPTFPT13_WRITE_SETFIELD_MISS  = 13, /* Write Set-Field for table-miss. */
284     OFPTFPT13_APPLY_SETFIELD       = 14, /* Apply Set-Field property. */
285     OFPTFPT13_APPLY_SETFIELD_MISS  = 15, /* Apply Set-Field for table-miss. */
286     OFPTFPT13_EXPERIMENTER         = 0xFFFE, /* Experimenter property. */
287     OFPTFPT13_EXPERIMENTER_MISS    = 0xFFFF, /* Experimenter for table-miss. */
288 };
289
290 /* Instructions property */
291 struct ofp13_table_feature_prop_instructions {
292     ovs_be16    type;    /* One of OFPTFPT13_INSTRUCTIONS,
293                             OFPTFPT13_INSTRUCTIONS_MISS. */
294     ovs_be16    length;  /* Length in bytes of this property. */
295     /* Followed by:
296      *   - Exactly (length - 4) bytes containing the instruction ids, then
297      *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
298      *     bytes of all-zero bytes */
299     /* struct ofp11_instruction instruction_ids[0];  List of instructions
300                                                      without any data */
301 };
302 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_instructions) == 4);
303
304 /* Next Tables property */
305 struct ofp13_table_feature_prop_next_tables {
306     ovs_be16    type;   /* One of OFPTFPT13_NEXT_TABLES,
307                            OFPTFPT13_NEXT_TABLES_MISS. */
308     ovs_be16    length; /* Length in bytes of this property. */
309     /* Followed by:
310      *   - Exactly (length - 4) bytes containing the table_ids, then
311      *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
312      *     bytes of all-zero bytes */
313     /* uint8_t     next_table_ids[0]; */
314 };
315 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_next_tables) == 4);
316
317 /* Actions property */
318 struct ofp13_table_feature_prop_actions {
319     ovs_be16    type;   /* One of OFPTFPT13_WRITE_ACTIONS,
320                            OFPTFPT13_WRITE_ACTIONS_MISS,
321                            OFPTFPT13_APPLY_ACTIONS,
322                            OFPTFPT13_APPLY_ACTIONS_MISS. */
323     ovs_be16    length; /* Length in bytes of this property. */
324     /* Followed by:
325      *   - Exactly (length - 4) bytes containing the action_ids, then
326      *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
327      *     bytes of all-zero bytes */
328     /* struct ofp_action_header action_ids[0];     List of actions
329                                                    without any data */
330 };
331 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_actions) == 4);
332
333
334 /* Match, Wildcard or Set-Field property */
335 struct ofp13_table_feature_prop_oxm {
336     ovs_be16    type;   /* One of OFPTFPT13_MATCH, OFPTFPT13_WILDCARDS,
337                            OFPTFPT13_WRITE_SETFIELD,
338                            OFPTFPT13_WRITE_SETFIELD_MISS,
339                            OFPTFPT13_APPLY_SETFIELD,
340                            OFPTFPT13_APPLY_SETFIELD_MISS. */
341     ovs_be16    length; /* Length in bytes of this property. */
342     /* Followed by:
343      *   - Exactly (length - 4) bytes containing the oxm_ids, then
344      *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
345      *     bytes of all-zero bytes */
346     /* ovs_be32    oxm_ids[0];     Array of OXM headers */
347 };
348 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_oxm) == 4);
349
350 /* Experimenter table feature property */
351 struct ofp13_table_feature_prop_experimenter {
352     ovs_be16    type;     /* One of OFPTFPT13_EXPERIMENTER,
353                              OFPTFPT13_EXPERIMENTER_MISS. */
354     ovs_be16    length;   /* Length in bytes of this property. */
355     ovs_be32    experimenter; /* Experimenter ID which takes the same form
356                                  as in struct ofp_experimenter_header. */
357     ovs_be32    exp_type;     /* Experimenter defined. */
358     /* Followed by:
359      *   - Exactly (length - 12) bytes containing the experimenter data, then
360      *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
361      *     bytes of all-zero bytes */
362     /* ovs_be32    experimenter_data[0]; */
363 };
364 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_experimenter) == 12);
365
366 /* Body of reply to OFPMP13_PORT request. If a counter is unsupported, set
367  * the field to all ones. */
368 struct ofp13_port_stats {
369     struct ofp11_port_stats ps;
370     ovs_be32 duration_sec;    /* Time port has been alive in seconds. */
371     ovs_be32 duration_nsec;   /* Time port has been alive in nanoseconds
372                                  beyond duration_sec. */
373 };
374 OFP_ASSERT(sizeof(struct ofp13_port_stats) == 112);
375
376 /* Body of reply to OFPMP13_QUEUE request */
377 struct ofp13_queue_stats {
378     struct ofp11_queue_stats qs;
379     ovs_be32 duration_sec;    /* Time queue has been alive in seconds. */
380     ovs_be32 duration_nsec;   /* Time queue has been alive in nanoseconds
381                                  beyond duration_sec. */
382 };
383 OFP_ASSERT(sizeof(struct ofp13_queue_stats) == 40);
384
385 /* Body of reply to OFPMP13_GROUP request */
386 struct ofp13_group_stats {
387     struct ofp11_group_stats gs;
388     ovs_be32 duration_sec;    /* Time group has been alive in seconds. */
389     ovs_be32 duration_nsec;   /* Time group has been alive in nanoseconds
390                                  beyond duration_sec. */
391     struct ofp11_bucket_counter bucket_stats[0];
392 };
393 OFP_ASSERT(sizeof(struct ofp13_group_stats) == 40);
394
395 /* Body of OFPMP13_METER and OFPMP13_METER_CONFIG requests. */
396 struct ofp13_meter_multipart_request {
397     ovs_be32 meter_id;  /* Meter instance, or OFPM_ALL. */
398     uint8_t pad[4];     /* Align to 64 bits. */
399 };
400 OFP_ASSERT(sizeof(struct ofp13_meter_multipart_request) == 8);
401
402 /* Statistics for each meter band */
403 struct ofp13_meter_band_stats {
404     ovs_be64    packet_band_count;      /* Number of packets in band. */
405     ovs_be64    byte_band_count;        /* Number of bytes in band. */
406 };
407 OFP_ASSERT(sizeof(struct ofp13_meter_band_stats) == 16);
408
409 /* Body of reply to OFPMP13_METER request. Meter statistics. */
410 struct ofp13_meter_stats {
411     ovs_be32  meter_id;          /* Meter instance. */
412     ovs_be16  len;               /* Length in bytes of this stats. */
413     uint8_t   pad[6];
414     ovs_be32  flow_count;        /* Number of flows bound to meter. */
415     ovs_be64  packet_in_count;   /* Number of packets in input. */
416     ovs_be64  byte_in_count;     /* Number of bytes in input. */
417     ovs_be32  duration_sec;      /* Time meter has been alive in seconds. */
418     ovs_be32  duration_nsec;     /* Time meter has been alive in nanoseconds
419                                     beyond duration_sec. */
420     struct ofp13_meter_band_stats band_stats[0];  /* The band_stats length is
421                                              inferred from the length field. */
422 };
423 OFP_ASSERT(sizeof(struct ofp13_meter_stats) == 40);
424
425 /* Body of reply to OFPMP13_METER_CONFIG request. Meter configuration. */
426 struct ofp13_meter_config {
427     ovs_be16          length;       /* Length of this entry. */
428     ovs_be16          flags;        /* Set of OFPMC_* that apply. */
429     ovs_be32          meter_id;     /* Meter instance. */
430     /* struct ofp13_meter_band_header bands[0];   The bands length is inferred
431                                                from the length field. */
432 };
433 OFP_ASSERT(sizeof(struct ofp13_meter_config) == 8);
434
435 /* Body of reply to OFPMP13_METER_FEATURES request. Meter features. */
436 struct ofp13_meter_features {
437     ovs_be32   max_meter;     /* Maximum number of meters. */
438     ovs_be32   band_types;    /* Bitmaps of OFPMBT13_* values supported. */
439     ovs_be32   capabilities;  /* Bitmaps of "ofp13_meter_flags". */
440     uint8_t    max_bands;     /* Maximum bands per meters */
441     uint8_t    max_color;     /* Maximum color value */
442     uint8_t    pad[2];
443 };
444 OFP_ASSERT(sizeof(struct ofp13_meter_features) == 16);
445
446 /* Asynchronous message configuration. */
447 /* The body of this is the same as nx_async_config */
448 /* OFPT_GET_ASYNC_REPLY or OFPT_SET_ASYNC. */
449 struct ofp13_async_config {
450     ovs_be32 packet_in_mask[2];   /* Bitmasks of OFPR_* values. */
451     ovs_be32 port_status_mask[2]; /* Bitmasks of OFPPR_* values. */
452     ovs_be32 flow_removed_mask[2];/* Bitmasks of OFPRR_* values. */
453 };
454 OFP_ASSERT(sizeof(struct ofp13_async_config) == 24);
455
456
457 /* Packet received on port (datapath -> controller). */
458 struct ofp13_packet_in {
459     struct ofp12_packet_in pi;
460     ovs_be64 cookie;          /* Cookie of the flow entry that was looked up */
461     /* Followed by:
462      *   - Match
463      *   - Exactly 2 all-zero padding bytes, then
464      *   - An Ethernet frame whose length is inferred from header.length.
465      * The padding bytes preceding the Ethernet frame ensure that the IP
466      * header (if any) following the Ethernet header is 32-bit aligned.
467      */
468     /* struct ofp12_match match; */
469     /* uint8_t pad[2];         Align to 64 bit + 16 bit */
470     /* uint8_t data[0];        Ethernet frame */
471 };
472 OFP_ASSERT(sizeof(struct ofp13_packet_in) == 16);
473
474
475 #endif /* openflow/openflow-1.3.h */