2 * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
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:
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
24 #include "classifier.h"
26 #include "openflow/nicira-ext.h"
27 #include "openvswitch/types.h"
32 /* Basic decoding and length validation of OpenFlow messages. */
33 enum ofputil_msg_code
{
36 /* OFPT_* messages. */
39 OFPUTIL_OFPT_ECHO_REQUEST
,
40 OFPUTIL_OFPT_ECHO_REPLY
,
41 OFPUTIL_OFPT_FEATURES_REQUEST
,
42 OFPUTIL_OFPT_FEATURES_REPLY
,
43 OFPUTIL_OFPT_GET_CONFIG_REQUEST
,
44 OFPUTIL_OFPT_GET_CONFIG_REPLY
,
45 OFPUTIL_OFPT_SET_CONFIG
,
46 OFPUTIL_OFPT_PACKET_IN
,
47 OFPUTIL_OFPT_FLOW_REMOVED
,
48 OFPUTIL_OFPT_PORT_STATUS
,
49 OFPUTIL_OFPT_PACKET_OUT
,
50 OFPUTIL_OFPT_FLOW_MOD
,
51 OFPUTIL_OFPT_PORT_MOD
,
52 OFPUTIL_OFPT_BARRIER_REQUEST
,
53 OFPUTIL_OFPT_BARRIER_REPLY
,
54 OFPUTIL_OFPT_QUEUE_GET_CONFIG_REQUEST
,
55 OFPUTIL_OFPT_QUEUE_GET_CONFIG_REPLY
,
57 /* OFPST_* stat requests. */
58 OFPUTIL_OFPST_DESC_REQUEST
,
59 OFPUTIL_OFPST_FLOW_REQUEST
,
60 OFPUTIL_OFPST_AGGREGATE_REQUEST
,
61 OFPUTIL_OFPST_TABLE_REQUEST
,
62 OFPUTIL_OFPST_PORT_REQUEST
,
63 OFPUTIL_OFPST_QUEUE_REQUEST
,
65 /* OFPST_* stat replies. */
66 OFPUTIL_OFPST_DESC_REPLY
,
67 OFPUTIL_OFPST_FLOW_REPLY
,
68 OFPUTIL_OFPST_QUEUE_REPLY
,
69 OFPUTIL_OFPST_PORT_REPLY
,
70 OFPUTIL_OFPST_TABLE_REPLY
,
71 OFPUTIL_OFPST_AGGREGATE_REPLY
,
74 OFPUTIL_NXT_ROLE_REQUEST
,
75 OFPUTIL_NXT_ROLE_REPLY
,
76 OFPUTIL_NXT_SET_FLOW_FORMAT
,
77 OFPUTIL_NXT_FLOW_MOD_TABLE_ID
,
79 OFPUTIL_NXT_FLOW_REMOVED
,
81 /* NXST_* stat requests. */
82 OFPUTIL_NXST_FLOW_REQUEST
,
83 OFPUTIL_NXST_AGGREGATE_REQUEST
,
85 /* NXST_* stat replies. */
86 OFPUTIL_NXST_FLOW_REPLY
,
87 OFPUTIL_NXST_AGGREGATE_REPLY
90 struct ofputil_msg_type
;
91 int ofputil_decode_msg_type(const struct ofp_header
*,
92 const struct ofputil_msg_type
**);
93 enum ofputil_msg_code
ofputil_msg_type_code(const struct ofputil_msg_type
*);
94 const char *ofputil_msg_type_name(const struct ofputil_msg_type
*);
95 int ofputil_check_output_port(uint16_t ofp_port
, int max_ports
);
97 /* Converting OFPFW_NW_SRC_MASK and OFPFW_NW_DST_MASK wildcard bit counts to
98 * and from IP bitmasks. */
99 ovs_be32
ofputil_wcbits_to_netmask(int wcbits
);
100 int ofputil_netmask_to_wcbits(ovs_be32 netmask
);
102 /* Work with OpenFlow 1.0 ofp_match. */
103 void ofputil_wildcard_from_openflow(uint32_t ofpfw
, struct flow_wildcards
*);
104 void ofputil_cls_rule_from_match(const struct ofp_match
*,
105 unsigned int priority
, struct cls_rule
*);
106 void ofputil_normalize_rule(struct cls_rule
*, enum nx_flow_format
);
107 void ofputil_cls_rule_to_match(const struct cls_rule
*, struct ofp_match
*);
109 /* dl_type translation between OpenFlow and 'struct flow' format. */
110 ovs_be16
ofputil_dl_type_to_openflow(ovs_be16 flow_dl_type
);
111 ovs_be16
ofputil_dl_type_from_openflow(ovs_be16 ofp_dl_type
);
114 bool ofputil_flow_format_is_valid(enum nx_flow_format
);
115 const char *ofputil_flow_format_to_string(enum nx_flow_format
);
116 int ofputil_flow_format_from_string(const char *);
117 enum nx_flow_format
ofputil_min_flow_format(const struct cls_rule
*);
119 struct ofpbuf
*ofputil_make_set_flow_format(enum nx_flow_format
);
121 /* NXT_FLOW_MOD_TABLE_ID extension. */
122 struct ofpbuf
*ofputil_make_flow_mod_table_id(bool flow_mod_table_id
);
124 /* Flow format independent flow_mod. */
130 uint16_t idle_timeout
;
131 uint16_t hard_timeout
;
135 union ofp_action
*actions
;
139 int ofputil_decode_flow_mod(struct flow_mod
*, const struct ofp_header
*,
140 bool flow_mod_table_id
);
141 struct ofpbuf
*ofputil_encode_flow_mod(const struct flow_mod
*,
143 bool flow_mod_table_id
);
145 /* Flow stats or aggregate stats request, independent of flow format. */
146 struct flow_stats_request
{
147 bool aggregate
; /* Aggregate results? */
148 struct cls_rule match
;
153 int ofputil_decode_flow_stats_request(struct flow_stats_request
*,
154 const struct ofp_header
*);
155 struct ofpbuf
*ofputil_encode_flow_stats_request(
156 const struct flow_stats_request
*, enum nx_flow_format
);
158 /* Flow stats reply, independent of flow format. */
159 struct ofputil_flow_stats
{
160 struct cls_rule rule
;
163 uint32_t duration_sec
;
164 uint32_t duration_nsec
;
165 uint16_t idle_timeout
;
166 uint16_t hard_timeout
;
167 uint64_t packet_count
; /* Packet count, UINT64_MAX if unknown. */
168 uint64_t byte_count
; /* Byte count, UINT64_MAX if unknown. */
169 union ofp_action
*actions
;
173 int ofputil_decode_flow_stats_reply(struct ofputil_flow_stats
*,
175 void ofputil_append_flow_stats_reply(const struct ofputil_flow_stats
*,
176 struct list
*replies
);
178 /* Aggregate stats reply, independent of flow format. */
179 struct ofputil_aggregate_stats
{
180 uint64_t packet_count
; /* Packet count, UINT64_MAX if unknown. */
181 uint64_t byte_count
; /* Byte count, UINT64_MAX if unknown. */
185 struct ofpbuf
*ofputil_encode_aggregate_stats_reply(
186 const struct ofputil_aggregate_stats
*stats
,
187 const struct ofp_stats_msg
*request
);
189 /* Flow removed message, independent of flow format. */
190 struct ofputil_flow_removed
{
191 struct cls_rule rule
;
193 uint8_t reason
; /* One of OFPRR_*. */
194 uint32_t duration_sec
;
195 uint32_t duration_nsec
;
196 uint16_t idle_timeout
;
197 uint64_t packet_count
; /* Packet count, UINT64_MAX if unknown. */
198 uint64_t byte_count
; /* Byte count, UINT64_MAX if unknown. */
201 int ofputil_decode_flow_removed(struct ofputil_flow_removed
*,
202 const struct ofp_header
*);
203 struct ofpbuf
*ofputil_encode_flow_removed(const struct ofputil_flow_removed
*,
204 enum nx_flow_format
);
206 /* Abstract packet-in message. */
207 struct ofputil_packet_in
{
208 struct ofpbuf
*packet
;
210 uint8_t reason
; /* One of OFPR_*. */
216 struct ofpbuf
*ofputil_encode_packet_in(const struct ofputil_packet_in
*,
217 struct ofpbuf
*rw_packet
);
219 /* OpenFlow protocol utility functions. */
220 void *make_openflow(size_t openflow_len
, uint8_t type
, struct ofpbuf
**);
221 void *make_nxmsg(size_t openflow_len
, uint32_t subtype
, struct ofpbuf
**);
223 void *make_openflow_xid(size_t openflow_len
, uint8_t type
,
224 ovs_be32 xid
, struct ofpbuf
**);
225 void *make_nxmsg_xid(size_t openflow_len
, uint32_t subtype
, ovs_be32 xid
,
228 void *put_openflow(size_t openflow_len
, uint8_t type
, struct ofpbuf
*);
229 void *put_openflow_xid(size_t openflow_len
, uint8_t type
, ovs_be32 xid
,
232 void *put_nxmsg(size_t openflow_len
, uint32_t subtype
, struct ofpbuf
*);
233 void *put_nxmsg_xid(size_t openflow_len
, uint32_t subtype
, ovs_be32 xid
,
236 void update_openflow_length(struct ofpbuf
*);
238 void *ofputil_make_stats_request(size_t openflow_len
, uint16_t type
,
239 uint32_t subtype
, struct ofpbuf
**);
240 void *ofputil_make_stats_reply(size_t openflow_len
,
241 const struct ofp_stats_msg
*request
,
244 void ofputil_start_stats_reply(const struct ofp_stats_msg
*request
,
246 struct ofpbuf
*ofputil_reserve_stats_reply(size_t len
, struct list
*);
247 void *ofputil_append_stats_reply(size_t len
, struct list
*);
249 const void *ofputil_stats_body(const struct ofp_header
*);
250 size_t ofputil_stats_body_len(const struct ofp_header
*);
252 const void *ofputil_nxstats_body(const struct ofp_header
*);
253 size_t ofputil_nxstats_body_len(const struct ofp_header
*);
255 struct ofpbuf
*make_flow_mod(uint16_t command
, const struct cls_rule
*,
257 struct ofpbuf
*make_add_flow(const struct cls_rule
*, uint32_t buffer_id
,
258 uint16_t max_idle
, size_t actions_len
);
259 struct ofpbuf
*make_del_flow(const struct cls_rule
*);
260 struct ofpbuf
*make_add_simple_flow(const struct cls_rule
*,
261 uint32_t buffer_id
, uint16_t out_port
,
263 struct ofpbuf
*make_packet_in(uint32_t buffer_id
, uint16_t in_port
,
265 const struct ofpbuf
*payload
, int max_send_len
);
266 struct ofpbuf
*make_packet_out(const struct ofpbuf
*packet
, uint32_t buffer_id
,
268 const struct ofp_action_header
*,
270 struct ofpbuf
*make_buffered_packet_out(uint32_t buffer_id
,
271 uint16_t in_port
, uint16_t out_port
);
272 struct ofpbuf
*make_unbuffered_packet_out(const struct ofpbuf
*packet
,
273 uint16_t in_port
, uint16_t out_port
);
274 struct ofpbuf
*make_echo_request(void);
275 struct ofpbuf
*make_echo_reply(const struct ofp_header
*rq
);
279 enum ofputil_action_code
{
280 /* OFPAT_* actions. */
281 OFPUTIL_OFPAT_OUTPUT
,
282 OFPUTIL_OFPAT_SET_VLAN_VID
,
283 OFPUTIL_OFPAT_SET_VLAN_PCP
,
284 OFPUTIL_OFPAT_STRIP_VLAN
,
285 OFPUTIL_OFPAT_SET_DL_SRC
,
286 OFPUTIL_OFPAT_SET_DL_DST
,
287 OFPUTIL_OFPAT_SET_NW_SRC
,
288 OFPUTIL_OFPAT_SET_NW_DST
,
289 OFPUTIL_OFPAT_SET_NW_TOS
,
290 OFPUTIL_OFPAT_SET_TP_SRC
,
291 OFPUTIL_OFPAT_SET_TP_DST
,
292 OFPUTIL_OFPAT_ENQUEUE
,
294 /* NXAST_* actions. */
295 OFPUTIL_NXAST_RESUBMIT
,
296 OFPUTIL_NXAST_SET_TUNNEL
,
297 OFPUTIL_NXAST_SET_QUEUE
,
298 OFPUTIL_NXAST_POP_QUEUE
,
299 OFPUTIL_NXAST_REG_MOVE
,
300 OFPUTIL_NXAST_REG_LOAD
,
302 OFPUTIL_NXAST_SET_TUNNEL64
,
303 OFPUTIL_NXAST_MULTIPATH
,
304 OFPUTIL_NXAST_AUTOPATH
,
305 OFPUTIL_NXAST_BUNDLE
,
306 OFPUTIL_NXAST_BUNDLE_LOAD
,
309 int ofputil_decode_action(const union ofp_action
*);
310 enum ofputil_action_code
ofputil_decode_action_unsafe(
311 const union ofp_action
*);
313 #define OFP_ACTION_ALIGN 8 /* Alignment of ofp_actions. */
315 static inline union ofp_action
*
316 ofputil_action_next(const union ofp_action
*a
)
318 return (void *) ((uint8_t *) a
+ ntohs(a
->header
.len
));
322 ofputil_action_is_valid(const union ofp_action
*a
, size_t n_actions
)
324 uint16_t len
= ntohs(a
->header
.len
);
325 return (!(len
% OFP_ACTION_ALIGN
)
327 && len
/ sizeof *a
<= n_actions
);
330 /* This macro is careful to check for actions with bad lengths. */
331 #define OFPUTIL_ACTION_FOR_EACH(ITER, LEFT, ACTIONS, N_ACTIONS) \
332 for ((ITER) = (ACTIONS), (LEFT) = (N_ACTIONS); \
333 (LEFT) > 0 && ofputil_action_is_valid(ITER, LEFT); \
334 ((LEFT) -= ntohs((ITER)->header.len) / sizeof(union ofp_action), \
335 (ITER) = ofputil_action_next(ITER)))
337 /* This macro does not check for actions with bad lengths. It should only be
338 * used with actions from trusted sources or with actions that have already
339 * been validated (e.g. with OFPUTIL_ACTION_FOR_EACH). */
340 #define OFPUTIL_ACTION_FOR_EACH_UNSAFE(ITER, LEFT, ACTIONS, N_ACTIONS) \
341 for ((ITER) = (ACTIONS), (LEFT) = (N_ACTIONS); \
343 ((LEFT) -= ntohs((ITER)->header.len) / sizeof(union ofp_action), \
344 (ITER) = ofputil_action_next(ITER)))
346 int validate_actions(const union ofp_action
*, size_t n_actions
,
347 const struct flow
*, int max_ports
);
348 bool action_outputs_to_port(const union ofp_action
*, ovs_be16 port
);
350 int ofputil_pull_actions(struct ofpbuf
*, unsigned int actions_len
,
351 union ofp_action
**, size_t *);
353 bool ofputil_actions_equal(const union ofp_action
*a
, size_t n_a
,
354 const union ofp_action
*b
, size_t n_b
);
355 union ofp_action
*ofputil_actions_clone(const union ofp_action
*, size_t n
);
359 * These functions map OpenFlow 32-bit vendor IDs (as used in struct
360 * ofp_vendor_header) into 4-bit values to embed in an "int". The 4-bit values
361 * are only used internally in Open vSwitch and never appear on the wire, so
362 * particular codes used are not important.
365 /* Vendor error numbers currently used in Open vSwitch. */
366 #define OFPUTIL_VENDORS \
367 /* vendor name vendor value */ \
368 OFPUTIL_VENDOR(OFPUTIL_VENDOR_OPENFLOW, 0x00000000) \
369 OFPUTIL_VENDOR(OFPUTIL_VENDOR_NICIRA, NX_VENDOR_ID)
371 /* OFPUTIL_VENDOR_* definitions. */
372 enum ofputil_vendor_codes
{
373 #define OFPUTIL_VENDOR(NAME, VENDOR_ID) NAME,
376 #undef OFPUTIL_VENDOR
381 * We embed system errno values and OpenFlow standard and vendor extension
382 * error codes into a single 31-bit space using the following encoding.
383 * (Bit 31 is unused and assumed 0 to avoid negative "int" values.)
386 * +------------------------------------------------------+
388 * +------------------------------------------------------+
391 * +--+---------------------------------------------------+
392 * | 0| errno value | errno value
393 * +--+---------------------------------------------------+
395 * 30 29 26 25 16 15 0
396 * +--+-------+----------------+--------------------------+
397 * | 1| 0 | type | code | standard OpenFlow
398 * +--+-------+----------------+--------------------------+ error
400 * 30 29 26 25 16 15 0
401 * +--+-------+----------------+--------------------------+ Nicira
402 * | 1| vendor| type | code | NXET_VENDOR
403 * +--+-------+----------------+--------------------------+ error extension
405 * C and POSIX say that errno values are positive. We assume that they are
406 * less than 2**29. They are actually less than 65536 on at least Linux,
407 * FreeBSD, OpenBSD, and Windows.
409 * The 'vendor' field holds one of the OFPUTIL_VENDOR_* codes defined above.
410 * It must be nonzero.
412 * Negative values are not defined.
415 /* Currently 4 bits are allocated to the "vendor" field. Make sure that all
416 * the vendor codes can fit. */
417 BUILD_ASSERT_DECL(OFPUTIL_N_VENDORS
<= 16);
419 /* These are macro versions of the functions defined below. The macro versions
420 * are intended for use in contexts where function calls are not allowed,
421 * e.g. static initializers and case labels. */
422 #define OFP_MKERR(TYPE, CODE) ((1 << 30) | ((TYPE) << 16) | (CODE))
423 #define OFP_MKERR_VENDOR(VENDOR, TYPE, CODE) \
424 ((1 << 30) | ((VENDOR) << 26) | ((TYPE) << 16) | (CODE))
425 #define OFP_MKERR_NICIRA(TYPE, CODE) \
426 OFP_MKERR_VENDOR(OFPUTIL_VENDOR_NICIRA, TYPE, CODE)
428 /* Returns the standard OpenFlow error with the specified 'type' and 'code' as
431 ofp_mkerr(uint16_t type
, uint16_t code
)
433 return OFP_MKERR(type
, code
);
436 /* Returns the OpenFlow vendor error with the specified 'vendor', 'type', and
437 * 'code' as an integer. 'vendor' must be an OFPUTIL_VENDOR_* constant. */
439 ofp_mkerr_vendor(uint8_t vendor
, uint16_t type
, uint16_t code
)
441 assert(vendor
< OFPUTIL_N_VENDORS
);
442 return OFP_MKERR_VENDOR(vendor
, type
, code
);
445 /* Returns the OpenFlow vendor error with Nicira as vendor, with the specific
446 * 'type' and 'code', as an integer. */
448 ofp_mkerr_nicira(uint16_t type
, uint16_t code
)
450 return OFP_MKERR_NICIRA(type
, code
);
453 /* Returns true if 'error' encodes an OpenFlow standard or vendor extension
454 * error codes as documented above. */
456 is_ofp_error(int error
)
458 return (error
& (1 << 30)) != 0;
461 /* Returns true if 'error' appears to be a system errno value. */
465 return !is_ofp_error(error
);
468 /* Returns the "vendor" part of the OpenFlow error code 'error' (which must be
469 * in the format explained above). This is normally one of the
470 * OFPUTIL_VENDOR_* constants. Returns OFPUTIL_VENDOR_OPENFLOW (0) for a
471 * standard OpenFlow error. */
472 static inline uint8_t
473 get_ofp_err_vendor(int error
)
475 return (error
>> 26) & 0xf;
478 /* Returns the "type" part of the OpenFlow error code 'error' (which must be in
479 * the format explained above). */
480 static inline uint16_t
481 get_ofp_err_type(int error
)
483 return (error
>> 16) & 0x3ff;
486 /* Returns the "code" part of the OpenFlow error code 'error' (which must be in
487 * the format explained above). */
488 static inline uint16_t
489 get_ofp_err_code(int error
)
491 return error
& 0xffff;
494 struct ofpbuf
*ofputil_encode_error_msg(int error
, const struct ofp_header
*);
495 int ofputil_decode_error_msg(const struct ofp_header
*, size_t *payload_ofs
);
497 /* String versions of errors. */
498 void ofputil_format_error(struct ds
*, int error
);
499 char *ofputil_error_to_string(int error
);
501 #endif /* ofp-util.h */