From 347b7ac46a96f851a67179d25401255a7f6e0b3b Mon Sep 17 00:00:00 2001 From: Justin Pettit Date: Fri, 4 May 2012 17:19:26 -0700 Subject: [PATCH] ofp-util: Add ofputil_switch_features_ports_trunc function. Add function to determine whether the max number of ports are contains in a Features Reply. If so, it removes the port list, since it may be incomplete. This function will be used in a later commit. Signed-off-by: Justin Pettit --- lib/ofp-util.c | 34 ++++++++++++++++++++++++++++++++++ lib/ofp-util.h | 1 + 2 files changed, 35 insertions(+) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 60071477..69e2b175 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -2568,6 +2568,40 @@ ofputil_decode_switch_features(const struct ofp_switch_features *osf, return 0; } +/* Returns true if the maximum number of ports are in 'osf'. */ +static bool +max_ports_in_features(const struct ofp_switch_features *osf) +{ + size_t pp_size = osf->header.version == OFP10_VERSION ? + sizeof(struct ofp10_phy_port) : + sizeof(struct ofp11_port); + + return ntohs(osf->header.length) + pp_size > UINT16_MAX; +} + +/* Given a buffer 'b' that contains a Features Reply message, checks if + * it contains the maximum number of ports that will fit. If so, it + * returns true and removes the ports from the message. The caller + * should then send an OFPST_PORT_DESC stats request to get the ports, + * since the switch may have more ports than could be represented in the + * Features Reply. Otherwise, returns false. + */ +bool +ofputil_switch_features_ports_trunc(struct ofpbuf *b) +{ + struct ofp_switch_features *osf = b->data; + + if (max_ports_in_features(osf)) { + /* Remove all the ports. */ + b->size = sizeof(*osf); + update_openflow_length(b); + + return true; + } + + return false; +} + static ovs_be32 encode_action_bits(enum ofputil_action_bitmap ofputil_actions, const struct ofputil_action_bit_translation *x) diff --git a/lib/ofp-util.h b/lib/ofp-util.h index a3c12fc7..e6716636 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -443,6 +443,7 @@ struct ofpbuf *ofputil_encode_switch_features( ovs_be32 xid); void ofputil_put_switch_features_port(const struct ofputil_phy_port *, struct ofpbuf *); +bool ofputil_switch_features_ports_trunc(struct ofpbuf *b); /* phy_port helper functions. */ int ofputil_pull_phy_port(uint8_t ofp_version, struct ofpbuf *, -- 2.30.2