[ovs-dev] [PATCH 52/63] ofp-util: Pass vconn to fetch_port_by_features()
Simon Horman
horms at verge.net.au
Wed Jun 27 08:20:28 UTC 2012
Pass vconn to fetch_port_by_features() and callers.
In some cases this will reduce the number of connections
that ovs-ofputil sets up.
It should not alter the behaviour of ovs-ofputil.
Signed-off-by: Simon Horman <horms at verge.net.au>
---
v5
* Initial post
---
utilities/ovs-ofctl.c | 41 ++++++++++++++++++-----------------------
1 file changed, 18 insertions(+), 23 deletions(-)
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
index ca25f78..252d94f 100644
--- a/utilities/ovs-ofctl.c
+++ b/utilities/ovs-ofctl.c
@@ -531,14 +531,13 @@ do_dump_tables(int argc OVS_UNUSED, char *argv[])
}
static bool
-fetch_port_by_features(const char *vconn_name,
- const char *port_name, unsigned int port_no,
- struct ofputil_phy_port *pp, bool *trunc)
+fetch_port_by_features(struct vconn *vconn, const char *port_name,
+ unsigned int port_no, struct ofputil_phy_port *pp,
+ bool *trunc)
{
struct ofputil_switch_features features;
const struct ofp_switch_features *osf;
struct ofpbuf *request, *reply;
- struct vconn *vconn;
enum ofperr error;
struct ofpbuf b;
bool found = false;
@@ -546,14 +545,13 @@ fetch_port_by_features(const char *vconn_name,
/* Fetch the switch's ofp_switch_features. */
make_openflow(sizeof(struct ofp_header), vconn_get_version(vconn),
OFPT_FEATURES_REQUEST, &request);
- open_vconn(vconn_name, &vconn);
- run(vconn_transact(vconn, request, &reply), "talking to %s", vconn_name);
- vconn_close(vconn);
+ run(vconn_transact(vconn, request, &reply), "talking to %s",
+ vconn_get_name(vconn));
osf = reply->data;
if (reply->size < sizeof *osf) {
ovs_fatal(0, "%s: received too-short features reply (only %zu bytes)",
- vconn_name, reply->size);
+ vconn_get_name(vconn), reply->size);
}
*trunc = false;
@@ -565,7 +563,7 @@ fetch_port_by_features(const char *vconn_name,
error = ofputil_decode_switch_features(osf, &features, &b);
if (error) {
ovs_fatal(0, "%s: failed to decode features reply (%s)",
- vconn_name, ofperr_to_string(error));
+ vconn_get_name(vconn), ofperr_to_string(error));
}
while (!ofputil_pull_phy_port(osf->header.version, &b, pp)) {
@@ -583,19 +581,15 @@ exit:
}
static bool
-fetch_port_by_stats(const char *vconn_name,
- const char *port_name, unsigned int port_no,
- struct ofputil_phy_port *pp)
+fetch_port_by_stats(struct vconn* vconn, const char *port_name,
+ unsigned int port_no, struct ofputil_phy_port *pp)
{
struct ofpbuf *request;
- struct vconn *vconn;
ovs_be32 send_xid;
struct ofpbuf b;
bool done = false;
bool found = false;
- open_vconn(vconn_name, &vconn);
-
ofputil_make_stats_request(0, vconn_get_version(vconn),
OFPST_PORT_DESC, 0, &request);
send_xid = ((struct ofp_header *) request->data)->xid;
@@ -645,7 +639,6 @@ fetch_port_by_stats(const char *vconn_name,
}
ofpbuf_delete(reply);
}
- vconn_close(vconn);
return found;
}
@@ -655,7 +648,7 @@ fetch_port_by_stats(const char *vconn_name,
* 'port_name' (which may be a port name or number), and copies it into
* '*pp'. */
static void
-fetch_ofputil_phy_port(const char *vconn_name, const char *port_name,
+fetch_ofputil_phy_port(struct vconn *vconn, const char *port_name,
struct ofputil_phy_port *pp)
{
unsigned int port_no;
@@ -670,14 +663,15 @@ fetch_ofputil_phy_port(const char *vconn_name, const char *port_name,
/* Try to find the port based on the Features Reply. If it looks
* like the results may be truncated, then use the Port Description
* stats message introduced in OVS 1.7. */
- found = fetch_port_by_features(vconn_name, port_name, port_no, pp,
+ found = fetch_port_by_features(vconn, port_name, port_no, pp,
&trunc);
if (trunc) {
- found = fetch_port_by_stats(vconn_name, port_name, port_no, pp);
+ found = fetch_port_by_stats(vconn, port_name, port_no, pp);
}
if (!found) {
- ovs_fatal(0, "%s: couldn't find port `%s'", vconn_name, port_name);
+ ovs_fatal(0, "%s: couldn't find port `%s'",
+ vconn_get_name(vconn), port_name);
}
}
@@ -714,7 +708,7 @@ str_to_port_no(struct vconn *vconn, const char *port_name)
} else {
struct ofputil_phy_port pp;
- fetch_ofputil_phy_port(vconn_get_name(vconn), port_name, &pp);
+ fetch_ofputil_phy_port(vconn, port_name, &pp);
return pp.port_no;
}
@@ -1353,7 +1347,9 @@ do_mod_port(int argc OVS_UNUSED, char *argv[])
const char *command;
bool not;
- fetch_ofputil_phy_port(argv[1], argv[2], &pp);
+ protocol = open_vconn(argv[1], &vconn);
+
+ fetch_ofputil_phy_port(vconn, argv[2], &pp);
pm.port_no = pp.port_no;
memcpy(pm.hw_addr, pp.hw_addr, ETH_ADDR_LEN);
@@ -1381,7 +1377,6 @@ do_mod_port(int argc OVS_UNUSED, char *argv[])
ovs_fatal(0, "unknown mod-port command '%s'", argv[3]);
found:
- protocol = open_vconn(argv[1], &vconn);
transact_noreply(vconn, ofputil_encode_port_mod(&pm, protocol));
vconn_close(vconn);
}
--
1.7.10.2.484.gcd07cc5
More information about the dev
mailing list