summaryrefslogtreecommitdiff
path: root/lib/vconn-provider.h
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2013-01-04 12:41:01 -0800
committerBen Pfaff <blp@nicira.com>2013-01-24 14:57:24 -0800
commit4766ce7a6438c11743c354fddad9d1164c76c467 (patch)
tree4880b10c8ad9925c66ca1a46e46765aaeb68055d /lib/vconn-provider.h
parent539b741f5999e22de02b14a35cc3e3855e2dc51d (diff)
downloadopenvswitch-4766ce7a6438c11743c354fddad9d1164c76c467.tar.gz
rconn: Fix null pointer dereference in rconn_add_monitor().
rconn_add_monitor() tries to check the version of the controller connection being monitored, so that it can decide what OpenFlow version to tell the monitor connection to negotiate. But at any given time an rconn may not have a controller connection (e.g. during backoff), so rc->vconn may be null and thus vconn_get_version(rc->vconn) dereferences a null pointer. Fixing the problem in a local way would require the rconn to remember the previous version negotiated, and that fails if the rconn hasn't yet connected or if the next connection negotiates a new version. This commit instead adds the ability to a vconn to accept any OpenFlow message version and modifies "ovs-ofctl snoop" to use that feature, thus removing the need to negotiate the "correct" version on snoops. Bug #14265. Reported-by: Pratap Reddy <preddy@nicira.com> Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
Diffstat (limited to 'lib/vconn-provider.h')
-rw-r--r--lib/vconn-provider.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/vconn-provider.h b/lib/vconn-provider.h
index f4e9a9e4d..e6058f335 100644
--- a/lib/vconn-provider.h
+++ b/lib/vconn-provider.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2009, 2010, 2012 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2012, 2013 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,13 +33,18 @@ struct vconn {
struct vconn_class *class;
int state;
int error;
- uint32_t allowed_versions;
- uint32_t peer_versions;
- enum ofp_version version;
+
+ /* OpenFlow versions. */
+ uint32_t allowed_versions; /* Bitmap of versions we will accept. */
+ uint32_t peer_versions; /* Peer's bitmap of versions it will accept. */
+ enum ofp_version version; /* Negotiated version (or 0). */
+ bool recv_any_version; /* True to receive a message of any version. */
+
ovs_be32 remote_ip;
ovs_be16 remote_port;
ovs_be32 local_ip;
ovs_be16 local_port;
+
char *name;
};