[ovs-dev] [of1.1 draft v2 5/7] ofp-util: Add functions for working with OpenFlow 1.1 port numbers.
Ben Pfaff
blp at nicira.com
Fri Feb 3 20:43:53 UTC 2012
OpenFlow 1.1 extends port numbers to 32 bits. Initially we plan to support
only port numbers in the 16-bit range in Open vSwitch. However the OF1.1
reserved ports have high-valued fixed numbers that require translation to
high fixed values in the 16-bit range for OF1.0. These new functions
provide this translation.
Nothing uses these functions yet.
These new functions need comments before they're ready.
---
lib/ofp-util.c | 24 ++++++++++++++++++++++++
lib/ofp-util.h | 3 +++
2 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 1257e6f..a4d13cc 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -2591,6 +2591,30 @@ ofputil_frag_handling_from_string(const char *s, enum ofp_config_flags *flags)
return true;
}
+enum ofperr
+ofputil_port_from_ofp11(ovs_be32 ofp11_port, uint16_t *ofp10_port)
+{
+ uint32_t ofp11_port_h = ntohl(ofp11_port);
+
+ if (ofp11_port_h < OFPP_MAX) {
+ *ofp10_port = ofp11_port_h;
+ return 0;
+ } else if (ofp11_port_h >= 0xfffffff8) {
+ *ofp10_port = ofp11_port_h >> 16;
+ return 0;
+ } else {
+ VLOG_WARN_RL(&bad_ofmsg_rl, "port %"PRIu32" is outside the supported "
+ "range 0 through %d", ofp11_port_h, OFPP_MAX - 1);
+ return OFPERR_OFPBAC_BAD_OUT_PORT;
+ }
+}
+
+ovs_be32
+ofputil_port_to_ofp11(uint16_t ofp10_port)
+{
+ return htonl(ofp10_port < OFPP_MAX ? ofp10_port : ofp10_port + 0xffff0000);
+}
+
/* Checks that 'port' is a valid output port for the OFPAT_OUTPUT action, given
* that the switch will never have more than 'max_ports' ports. Returns 0 if
* 'port' is valid, otherwise an OpenFlow return code. */
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index 5991594..3422ece 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -99,6 +99,9 @@ enum ofputil_msg_code ofputil_msg_type_code(const struct ofputil_msg_type *);
const char *ofputil_msg_type_name(const struct ofputil_msg_type *);
/* Port numbers. */
+enum ofperr ofputil_port_from_ofp11(ovs_be32 ofp11_port, uint16_t *ofp10_port);
+ovs_be32 ofputil_port_to_ofp11(uint16_t ofp10_port);
+
enum ofperr ofputil_check_output_port(uint16_t ofp_port, int max_ports);
bool ofputil_port_from_string(const char *, uint16_t *port);
void ofputil_format_port(uint16_t port, struct ds *);
--
1.7.2.5
More information about the dev
mailing list