Signed-off-by: Simon Horman <ho...@verge.net.au> ---
v6 * Rebase v5 * Use #define for OFPUTIL_P_NONE * Ensure that if ofconn->rconn is connected that a valid value for ofconn->protocol is always used by fetching the value from the rconn in ofconn_get_protocol() as necessary and always using ofconn_get_protocol() to access ofconn->protocol. v4 * Rebase --- lib/ofp-util.h | 1 + ofproto/connmgr.c | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/ofp-util.h b/lib/ofp-util.h index edefa2d..d87554d 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -69,6 +69,7 @@ enum ofputil_protocol { * The protocols with "TID" mean that the nx_flow_mod_table_id Nicira * extension has been enabled. The other protocols have it disabled. */ +#define OFPUTIL_P_NONE 0 OFPUTIL_P_OF10_STD = 1 << 0, OFPUTIL_P_OF10_STD_TID = 1 << 1, OFPUTIL_P_OF10_NXM = 1 << 2, diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c index 2885804..5c7e1c5 100644 --- a/ofproto/connmgr.c +++ b/ofproto/connmgr.c @@ -840,10 +840,18 @@ ofconn_get_invalid_ttl_to_controller(struct ofconn *ofconn) /* Returns the currently configured protocol for 'ofconn', one of OFPUTIL_P_*. * - * The default, if no other format has been set, is OFPUTIL_P_OF10_STD. */ + * The default, if no other format has been set, is OFPUTIL_P_NONE. */ enum ofputil_protocol ofconn_get_protocol(struct ofconn *ofconn) { + if (ofconn->protocol == OFPUTIL_P_NONE && + rconn_is_connected(ofconn->rconn)) { + int version = rconn_get_version(ofconn->rconn); + if (version > 0) { + ofconn_set_protocol(ofconn, + ofputil_protocol_from_ofp_version(version)); + } + } return ofconn->protocol; } @@ -1034,7 +1042,7 @@ ofconn_flush(struct ofconn *ofconn) int i; ofconn->role = NX_ROLE_OTHER; - ofconn->protocol = OFPUTIL_P_OF10_STD; + ofconn_set_protocol(ofconn, OFPUTIL_P_NONE); ofconn->packet_in_format = NXPIF_OPENFLOW10; /* Disassociate 'ofconn' from all of the ofopgroups that it initiated that @@ -1317,7 +1325,7 @@ connmgr_send_port_status(struct connmgr *mgr, if (ofconn_receives_async_msg(ofconn, OAM_PORT_STATUS, reason)) { struct ofpbuf *msg; - msg = ofputil_encode_port_status(&ps, ofconn->protocol); + msg = ofputil_encode_port_status(&ps, ofconn_get_protocol(ofconn)); ofconn_send(ofconn, msg, NULL); } } @@ -1340,7 +1348,7 @@ connmgr_send_flow_removed(struct connmgr *mgr, * also prevents new flows from being added (and expiring). (It * also prevents processing OpenFlow requests that would not add * new flows, so it is imperfect.) */ - msg = ofputil_encode_flow_removed(fr, ofconn->protocol); + msg = ofputil_encode_flow_removed(fr, ofconn_get_protocol(ofconn)); ofconn_send_reply(ofconn, msg); } } @@ -1411,7 +1419,7 @@ schedule_packet_in(struct ofconn *ofconn, struct ofputil_packet_in pin) * while (until a later call to pinsched_run()). */ pinsched_send(ofconn->schedulers[pin.reason == OFPR_NO_MATCH ? 0 : 1], pin.fmd.in_port, - ofputil_encode_packet_in(&pin, ofconn->protocol, + ofputil_encode_packet_in(&pin, ofconn_get_protocol(ofconn), ofconn->packet_in_format), do_send_packet_in, ofconn); } -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev