1 /* Copyright (c) 2008, 2014 The Board of Trustees of The Leland Stanford
3 * Copyright (c) 2011, 2012 Open Networking Foundation
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:
18 * The above copyright notice and this permission notice shall be
19 * included in all copies or substantial portions of the Software.
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
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.
35 /* OpenFlow: protocol between controller and datapath. */
38 #define OPENFLOW_14_H 1
40 #include <openflow/openflow-1.3.h>
43 /* ## ---------- ## */
44 /* ## ofp14_port ## */
45 /* ## ---------- ## */
47 /* Port description property types. */
48 enum ofp_port_desc_prop_type
{
49 OFPPDPT14_ETHERNET
= 0, /* Ethernet property. */
50 OFPPDPT14_OPTICAL
= 1, /* Optical property. */
51 OFPPDPT14_EXPERIMENTER
= 0xFFFF, /* Experimenter property. */
54 /* Ethernet port description property. */
55 struct ofp14_port_desc_prop_ethernet
{
56 ovs_be16 type
; /* OFPPDPT14_ETHERNET. */
57 ovs_be16 length
; /* Length in bytes of this property. */
58 uint8_t pad
[4]; /* Align to 64 bits. */
59 /* Bitmaps of OFPPF_* that describe features. All bits zeroed if
60 * unsupported or unavailable. */
61 ovs_be32 curr
; /* Current features. */
62 ovs_be32 advertised
; /* Features being advertised by the port. */
63 ovs_be32 supported
; /* Features supported by the port. */
64 ovs_be32 peer
; /* Features advertised by peer. */
66 ovs_be32 curr_speed
; /* Current port bitrate in kbps. */
67 ovs_be32 max_speed
; /* Max port bitrate in kbps */
69 OFP_ASSERT(sizeof(struct ofp14_port_desc_prop_ethernet
) == 32);
75 struct eth_addr hw_addr
;
76 uint8_t pad2
[2]; /* Align to 64 bits. */
77 char name
[OFP_MAX_PORT_NAME_LEN
]; /* Null-terminated */
79 ovs_be32 config
; /* Bitmap of OFPPC_* flags. */
80 ovs_be32 state
; /* Bitmap of OFPPS_* flags. */
82 /* Followed by 0 or more OFPPDPT14_* properties. */
84 OFP_ASSERT(sizeof(struct ofp14_port
) == 40);
87 /* ## -------------- ## */
88 /* ## ofp14_port_mod ## */
89 /* ## -------------- ## */
91 enum ofp14_port_mod_prop_type
{
92 OFPPMPT14_ETHERNET
= 0, /* Ethernet property. */
93 OFPPMPT14_OPTICAL
= 1, /* Optical property. */
94 OFPPMPT14_EXPERIMENTER
= 0xFFFF, /* Experimenter property. */
97 /* Ethernet port mod property. */
98 struct ofp14_port_mod_prop_ethernet
{
99 ovs_be16 type
; /* OFPPMPT14_ETHERNET. */
100 ovs_be16 length
; /* Length in bytes of this property. */
101 ovs_be32 advertise
; /* Bitmap of OFPPF_*. Zero all bits to prevent
102 any action taking place. */
104 OFP_ASSERT(sizeof(struct ofp14_port_mod_prop_ethernet
) == 8);
106 struct ofp14_port_mod
{
109 struct eth_addr hw_addr
;
111 ovs_be32 config
; /* Bitmap of OFPPC_* flags. */
112 ovs_be32 mask
; /* Bitmap of OFPPC_* flags to be changed. */
113 /* Followed by 0 or more OFPPMPT14_* properties. */
115 OFP_ASSERT(sizeof(struct ofp14_port_mod
) == 24);
117 /* ## --------------- ## */
118 /* ## ofp14_table_mod ## */
119 /* ## --------------- ## */
121 enum ofp14_table_mod_prop_type
{
122 OFPTMPT14_EVICTION
= 0x2, /* Eviction property. */
123 OFPTMPT14_VACANCY
= 0x3, /* Vacancy property. */
124 OFPTMPT14_EXPERIMENTER
= 0xFFFF, /* Experimenter property. */
127 enum ofp14_table_mod_prop_eviction_flag
{
128 OFPTMPEF14_OTHER
= 1 << 0, /* Using other factors. */
129 OFPTMPEF14_IMPORTANCE
= 1 << 1, /* Using flow entry importance. */
130 OFPTMPEF14_LIFETIME
= 1 << 2, /* Using flow entry lifetime. */
133 /* What changed about the table */
134 enum ofp14_table_reason
{
135 OFPTR_VACANCY_DOWN
= 3, /* Vacancy down threshold event. */
136 OFPTR_VACANCY_UP
= 4, /* Vacancy up threshold event. */
139 struct ofp14_table_mod_prop_eviction
{
140 ovs_be16 type
; /* OFPTMPT14_EVICTION. */
141 ovs_be16 length
; /* Length in bytes of this property. */
142 ovs_be32 flags
; /* Bitmap of OFPTMPEF14_* flags */
144 OFP_ASSERT(sizeof(struct ofp14_table_mod_prop_eviction
) == 8);
146 struct ofp14_table_mod_prop_vacancy
{
147 ovs_be16 type
; /* OFPTMPT14_VACANCY. */
148 ovs_be16 length
; /* Length in bytes of this property. */
149 uint8_t vacancy_down
; /* Vacancy threshold when space decreases (%). */
150 uint8_t vacancy_up
; /* Vacancy threshold when space increases (%). */
151 uint8_t vacancy
; /* Current vacancy (%) - only in ofp14_table_desc. */
152 uint8_t pad
[1]; /* Align to 64 bits. */
154 OFP_ASSERT(sizeof(struct ofp14_table_mod_prop_vacancy
) == 8);
156 struct ofp14_table_mod
{
157 uint8_t table_id
; /* ID of the table, OFPTT_ALL indicates all tables */
158 uint8_t pad
[3]; /* Pad to 32 bits */
159 ovs_be32 config
; /* Bitmap of OFPTC_* flags */
160 /* Followed by 0 or more OFPTMPT14_* properties. */
162 OFP_ASSERT(sizeof(struct ofp14_table_mod
) == 8);
164 /* Body of reply to OFPMP_TABLE_DESC request. */
165 struct ofp14_table_desc
{
166 ovs_be16 length
; /* Length is padded to 64 bits. */
167 uint8_t table_id
; /* Identifier of table. Lower numbered tables
168 are consulted first. */
169 uint8_t pad
[1]; /* Align to 32-bits. */
170 ovs_be32 config
; /* Bitmap of OFPTC_* values. */
171 /* Followed by 0 or more OFPTMPT14_* properties. */
173 OFP_ASSERT(sizeof(struct ofp14_table_desc
) == 8);
175 /* ## ---------------- ## */
176 /* ## ofp14_port_stats ## */
177 /* ## ---------------- ## */
179 enum ofp14_port_stats_prop_type
{
180 OFPPSPT14_ETHERNET
= 0, /* Ethernet property. */
181 OFPPSPT14_OPTICAL
= 1, /* Optical property. */
182 OFPPSPT14_EXPERIMENTER
= 0xFFFF, /* Experimenter property. */
185 struct ofp14_port_stats_prop_ethernet
{
186 ovs_be16 type
; /* OFPPSPT14_ETHERNET. */
187 ovs_be16 length
; /* Length in bytes of this property. */
188 uint8_t pad
[4]; /* Align to 64 bits. */
190 ovs_be64 rx_frame_err
; /* Number of frame alignment errors. */
191 ovs_be64 rx_over_err
; /* Number of packets with RX overrun. */
192 ovs_be64 rx_crc_err
; /* Number of CRC errors. */
193 ovs_be64 collisions
; /* Number of collisions. */
195 OFP_ASSERT(sizeof(struct ofp14_port_stats_prop_ethernet
) == 40);
197 struct ofp14_port_stats
{
198 ovs_be16 length
; /* Length of this entry. */
199 uint8_t pad
[2]; /* Align to 64 bits. */
201 ovs_be32 duration_sec
; /* Time port has been alive in seconds. */
202 ovs_be32 duration_nsec
; /* Time port has been alive in nanoseconds beyond
204 ovs_be64 rx_packets
; /* Number of received packets. */
205 ovs_be64 tx_packets
; /* Number of transmitted packets. */
206 ovs_be64 rx_bytes
; /* Number of received bytes. */
207 ovs_be64 tx_bytes
; /* Number of transmitted bytes. */
209 ovs_be64 rx_dropped
; /* Number of packets dropped by RX. */
210 ovs_be64 tx_dropped
; /* Number of packets dropped by TX. */
211 ovs_be64 rx_errors
; /* Number of receive errors. This is a super-set
212 of more specific receive errors and should be
213 greater than or equal to the sum of all
214 rx_*_err values in properties. */
215 ovs_be64 tx_errors
; /* Number of transmit errors. This is a super-set
216 of more specific transmit errors and should be
217 greater than or equal to the sum of all
218 tx_*_err values (none currently defined.) */
219 /* Followed by 0 or more OFPPSPT14_* properties. */
221 OFP_ASSERT(sizeof(struct ofp14_port_stats
) == 80);
224 /* ## ----------------- ## */
225 /* ## ofp14_queue_stats ## */
226 /* ## ----------------- ## */
228 struct ofp14_queue_stats
{
229 ovs_be16 length
; /* Length of this entry. */
230 uint8_t pad
[6]; /* Align to 64 bits. */
231 struct ofp13_queue_stats qs
;
232 /* Followed by 0 or more properties (none yet defined). */
234 OFP_ASSERT(sizeof(struct ofp14_queue_stats
) == 48);
237 /* ## -------------- ## */
238 /* ## Miscellaneous. ## */
239 /* ## -------------- ## */
241 /* Common header for all async config Properties */
242 struct ofp14_async_config_prop_header
{
243 ovs_be16 type
; /* One of OFPACPT_*. */
244 ovs_be16 length
; /* Length in bytes of this property. */
246 OFP_ASSERT(sizeof(struct ofp14_async_config_prop_header
) == 4);
248 /* Asynchronous message configuration.
249 * OFPT_GET_ASYNC_REPLY or OFPT_SET_ASYNC.
251 struct ofp14_async_config
{
252 struct ofp_header header
;
253 /* Async config Property list - 0 or more */
254 struct ofp14_async_config_prop_header properties
[0];
256 OFP_ASSERT(sizeof(struct ofp14_async_config
) == 8);
258 /* Request forward reason */
259 enum ofp14_requestforward_reason
{
260 OFPRFR_GROUP_MOD
= 0, /* Forward group mod requests. */
261 OFPRFR_METER_MOD
= 1, /* Forward meter mod requests. */
264 /* Async Config property types.
265 * Low order bit cleared indicates a property for the slave role.
266 * Low order bit set indicates a property for the master/equal role.
268 enum ofp14_async_config_prop_type
{
269 OFPACPT_PACKET_IN_SLAVE
= 0, /* Packet-in mask for slave. */
270 OFPACPT_PACKET_IN_MASTER
= 1, /* Packet-in mask for master. */
271 OFPACPT_PORT_STATUS_SLAVE
= 2, /* Port-status mask for slave. */
272 OFPACPT_PORT_STATUS_MASTER
= 3, /* Port-status mask for master. */
273 OFPACPT_FLOW_REMOVED_SLAVE
= 4, /* Flow removed mask for slave. */
274 OFPACPT_FLOW_REMOVED_MASTER
= 5, /* Flow removed mask for master. */
275 OFPACPT_ROLE_STATUS_SLAVE
= 6, /* Role status mask for slave. */
276 OFPACPT_ROLE_STATUS_MASTER
= 7, /* Role status mask for master. */
277 OFPACPT_TABLE_STATUS_SLAVE
= 8, /* Table status mask for slave. */
278 OFPACPT_TABLE_STATUS_MASTER
= 9, /* Table status mask for master. */
279 OFPACPT_REQUESTFORWARD_SLAVE
= 10, /* RequestForward mask for slave. */
280 OFPACPT_REQUESTFORWARD_MASTER
= 11, /* RequestForward mask for master. */
281 OFPTFPT_EXPERIMENTER_SLAVE
= 0xFFFE, /* Experimenter for slave. */
282 OFPTFPT_EXPERIMENTER_MASTER
= 0xFFFF, /* Experimenter for master. */
285 /* Various reason based properties */
286 struct ofp14_async_config_prop_reasons
{
287 /* 'type' is one of OFPACPT_PACKET_IN_*, OFPACPT_PORT_STATUS_*,
288 * OFPACPT_FLOW_REMOVED_*, OFPACPT_ROLE_STATUS_*,
289 * OFPACPT_TABLE_STATUS_*, OFPACPT_REQUESTFORWARD_*. */
291 ovs_be16 length
; /* Length in bytes of this property. */
292 ovs_be32 mask
; /* Bitmasks of reason values. */
294 OFP_ASSERT(sizeof(struct ofp14_async_config_prop_reasons
) == 8);
296 /* Experimenter async config property */
297 struct ofp14_async_config_prop_experimenter
{
298 ovs_be16 type
; /* One of OFPTFPT_EXPERIMENTER_SLAVE,
299 OFPTFPT_EXPERIMENTER_MASTER. */
300 ovs_be16 length
; /* Length in bytes of this property. */
301 ovs_be32 experimenter
; /* Experimenter ID which takes the same
303 ofp_experimenter_header. */
304 ovs_be32 exp_type
; /* Experimenter defined. */
306 * - Exactly (length - 12) bytes containing the experimenter data, then
307 * - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
308 * bytes of all-zero bytes */
310 OFP_ASSERT(sizeof(struct ofp14_async_config_prop_experimenter
) == 12);
312 /* Common header for all Role Properties */
313 struct ofp14_role_prop_header
{
314 ovs_be16 type
; /* One of OFPRPT_*. */
315 ovs_be16 length
; /* Length in bytes of this property. */
317 OFP_ASSERT(sizeof(struct ofp14_role_prop_header
) == 4);
319 /* Role status event message. */
320 struct ofp14_role_status
{
321 ovs_be32 role
; /* One of OFPCR_ROLE_*. */
322 uint8_t reason
; /* One of OFPCRR_*. */
323 uint8_t pad
[3]; /* Align to 64 bits. */
324 ovs_be64 generation_id
; /* Master Election Generation Id */
326 /* Followed by a list of struct ofp14_role_prop_header */
328 OFP_ASSERT(sizeof(struct ofp14_role_status
) == 16);
330 /* What changed about the controller role */
331 enum ofp14_controller_role_reason
{
332 OFPCRR_MASTER_REQUEST
= 0, /* Another controller asked to be master. */
333 OFPCRR_CONFIG
= 1, /* Configuration changed on the switch. */
334 OFPCRR_EXPERIMENTER
= 2, /* Experimenter data changed. */
337 /* Role property types.
339 enum ofp14_role_prop_type
{
340 OFPRPT_EXPERIMENTER
= 0xFFFF, /* Experimenter property. */
343 /* Experimenter role property */
344 struct ofp14_role_prop_experimenter
{
345 ovs_be16 type
; /* One of OFPRPT_EXPERIMENTER. */
346 ovs_be16 length
; /* Length in bytes of this property. */
347 ovs_be32 experimenter
; /* Experimenter ID which takes the same
349 ofp_experimenter_header. */
350 ovs_be32 exp_type
; /* Experimenter defined. */
352 * - Exactly (length - 12) bytes containing the experimenter data, then
353 * - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
354 * bytes of all-zero bytes */
356 OFP_ASSERT(sizeof(struct ofp14_role_prop_experimenter
) == 12);
358 /* Bundle control message types */
359 enum ofp14_bundle_ctrl_type
{
360 OFPBCT_OPEN_REQUEST
= 0,
361 OFPBCT_OPEN_REPLY
= 1,
362 OFPBCT_CLOSE_REQUEST
= 2,
363 OFPBCT_CLOSE_REPLY
= 3,
364 OFPBCT_COMMIT_REQUEST
= 4,
365 OFPBCT_COMMIT_REPLY
= 5,
366 OFPBCT_DISCARD_REQUEST
= 6,
367 OFPBCT_DISCARD_REPLY
= 7,
370 /* Bundle configuration flags. */
371 enum ofp14_bundle_flags
{
372 OFPBF_ATOMIC
= 1 << 0, /* Execute atomically. */
373 OFPBF_ORDERED
= 1 << 1, /* Execute in specified order. */
376 /* Message structure for OFPT_BUNDLE_CONTROL and OFPT_BUNDLE_ADD_MESSAGE. */
377 struct ofp14_bundle_ctrl_msg
{
378 ovs_be32 bundle_id
; /* Identify the bundle. */
379 ovs_be16 type
; /* OFPT_BUNDLE_CONTROL: one of OFPBCT_*.
380 * OFPT_BUNDLE_ADD_MESSAGE: not used. */
381 ovs_be16 flags
; /* Bitmap of OFPBF_* flags. */
383 * - For OFPT_BUNDLE_ADD_MESSAGE only, an encapsulated OpenFlow message,
384 * beginning with an ofp_header whose xid is identical to this message's
386 * - For OFPT_BUNDLE_ADD_MESSAGE only, and only if at least one property is
387 * present, 0 to 7 bytes of padding to align on a 64-bit boundary.
388 * - Zero or more properties (see struct ofp14_bundle_prop_header). */
390 OFP_ASSERT(sizeof(struct ofp14_bundle_ctrl_msg
) == 8);
392 /* Body for ofp14_multipart_request of type OFPMP_FLOW_MONITOR.
394 * The OFPMP_FLOW_MONITOR request's body consists of an array of zero or more
395 * instances of this structure. The request arranges to monitor the flows
396 * that match the specified criteria, which are interpreted in the same way as
399 * 'id' identifies a particular monitor for the purpose of allowing it to be
400 * canceled later with OFPFMC_DELETE. 'id' must be unique among
401 * existing monitors that have not already been canceled.
403 struct ofp14_flow_monitor_request
{
404 ovs_be32 monitor_id
; /* Controller-assigned ID for this monitor. */
405 ovs_be32 out_port
; /* Required output port, if not OFPP_ANY. */
406 ovs_be32 out_group
; /* Required output port, if not OFPG_ANY. */
407 ovs_be16 flags
; /* OFPMF14_*. */
408 uint8_t table_id
; /* One table's ID or OFPTT_ALL (all tables). */
409 uint8_t command
; /* One of OFPFMC14_*. */
410 /* Followed by an ofp11_match structure. */
412 OFP_ASSERT(sizeof(struct ofp14_flow_monitor_request
) == 16);
414 /* Flow monitor commands */
415 enum ofp14_flow_monitor_command
{
416 OFPFMC14_ADD
= 0, /* New flow monitor. */
417 OFPFMC14_MODIFY
= 1, /* Modify existing flow monitor. */
418 OFPFMC14_DELETE
= 2, /* Delete/cancel existing flow monitor. */
421 /* 'flags' bits in struct of_flow_monitor_request. */
422 enum ofp14_flow_monitor_flags
{
423 /* When to send updates. */
424 /* Common to NX and OpenFlow 1.4 */
425 OFPFMF14_INITIAL
= 1 << 0, /* Initially matching flows. */
426 OFPFMF14_ADD
= 1 << 1, /* New matching flows as they are added. */
427 OFPFMF14_REMOVED
= 1 << 2, /* Old matching flows as they are removed. */
428 OFPFMF14_MODIFY
= 1 << 3, /* Matching flows as they are changed. */
430 /* What to include in updates. */
431 /* Common to NX and OpenFlow 1.4 */
432 OFPFMF14_INSTRUCTIONS
= 1 << 4, /* If set, instructions are included. */
433 OFPFMF14_NO_ABBREV
= 1 << 5, /* If set, include own changes in full. */
435 OFPFMF14_ONLY_OWN
= 1 << 6, /* If set, don't include other controllers.
439 #endif /* openflow/openflow-1.4.h */