2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-29 15:28:56 +00:00

lib: Keep track of usable protocols while parsing.

Keep track of usable protocols while parsing actions and matches,
rather than checking for them afterwards.  This fixes silently discarded
meter and goto table instructions when not explicitly specifying the
protocol to use.

Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Jarno Rajahalme
2013-08-20 18:41:45 -07:00
committed by Ben Pfaff
parent 89454bf477
commit db0b6c2913
12 changed files with 341 additions and 315 deletions

View File

@@ -89,6 +89,7 @@ struct lswitch {
* to set up the flow table. */
const struct ofputil_flow_mod *default_flows;
size_t n_default_flows;
enum ofputil_protocol usable_protocols;
};
/* The log messages here could actually be useful in debugging, so keep the
@@ -161,6 +162,7 @@ lswitch_create(struct rconn *rconn, const struct lswitch_config *cfg)
sw->default_flows = cfg->default_flows;
sw->n_default_flows = cfg->n_default_flows;
sw->usable_protocols = cfg->usable_protocols;
sw->queued = rconn_packet_counter_create();
@@ -176,7 +178,6 @@ lswitch_handshake(struct lswitch *sw)
protocol = ofputil_protocol_from_ofp_version(rconn_get_version(sw->rconn));
if (sw->default_flows) {
enum ofputil_protocol usable_protocols;
struct ofpbuf *msg = NULL;
int error = 0;
size_t i;
@@ -188,10 +189,8 @@ lswitch_handshake(struct lswitch *sw)
* This could be improved by actually negotiating a mutually acceptable
* flow format with the switch, but that would require an asynchronous
* state machine. This version ought to work fine in practice. */
usable_protocols = ofputil_flow_mod_usable_protocols(
sw->default_flows, sw->n_default_flows);
if (!(protocol & usable_protocols)) {
enum ofputil_protocol want = rightmost_1bit(usable_protocols);
if (!(protocol & sw->usable_protocols)) {
enum ofputil_protocol want = rightmost_1bit(sw->usable_protocols);
while (!error) {
msg = ofputil_encode_set_protocol(protocol, want, &protocol);
if (!msg) {
@@ -200,7 +199,7 @@ lswitch_handshake(struct lswitch *sw)
error = rconn_send(sw->rconn, msg, NULL);
}
}
if (protocol & usable_protocols) {
if (protocol & sw->usable_protocols) {
for (i = 0; !error && i < sw->n_default_flows; i++) {
msg = ofputil_encode_flow_mod(&sw->default_flows[i], protocol);
error = rconn_send(sw->rconn, msg, NULL);