diff options
author | Ben Pfaff <blp@nicira.com> | 2013-01-04 12:41:01 -0800 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2013-01-24 14:57:24 -0800 |
commit | 4766ce7a6438c11743c354fddad9d1164c76c467 (patch) | |
tree | 4880b10c8ad9925c66ca1a46e46765aaeb68055d /lib/vconn.h | |
parent | 539b741f5999e22de02b14a35cc3e3855e2dc51d (diff) |
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.h')
-rw-r--r-- | lib/vconn.h | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/vconn.h b/lib/vconn.h index 81bdcc97..b15388c0 100644 --- a/lib/vconn.h +++ b/lib/vconn.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 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. @@ -38,14 +38,18 @@ int vconn_open(const char *name, uint32_t allowed_versions, uint8_t dscp, struct vconn **vconnp); void vconn_close(struct vconn *); const char *vconn_get_name(const struct vconn *); + uint32_t vconn_get_allowed_versions(const struct vconn *vconn); void vconn_set_allowed_versions(struct vconn *vconn, uint32_t allowed_versions); +int vconn_get_version(const struct vconn *); +void vconn_set_recv_any_version(struct vconn *); + ovs_be32 vconn_get_remote_ip(const struct vconn *); ovs_be16 vconn_get_remote_port(const struct vconn *); ovs_be32 vconn_get_local_ip(const struct vconn *); ovs_be16 vconn_get_local_port(const struct vconn *); -int vconn_get_version(const struct vconn *); + int vconn_connect(struct vconn *); int vconn_recv(struct vconn *, struct ofpbuf **); int vconn_send(struct vconn *, struct ofpbuf *); |