X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flearn.c;h=606ea9ed0b0bf29e6f5ea2154bd44955ac7ab726;hb=91a9863c4512d2e03378f4ea21c1662e503d2899;hp=b9bbc973e6bddb1e8fdde00a9eaed097999ac6e0;hpb=158edc8d32355d736fb843c18e624e3d402a7a16;p=sliver-openvswitch.git diff --git a/lib/learn.c b/lib/learn.c index b9bbc973e..606ea9ed0 100644 --- a/lib/learn.c +++ b/lib/learn.c @@ -374,6 +374,22 @@ learn_execute(const struct ofpact_learn *learn, const struct flow *flow, fm->ofpacts_len = ofpacts->size; } +/* Perform a bitwise-OR on 'wc''s fields that are relevant as sources in + * the learn action 'learn'. */ +void +learn_mask(const struct ofpact_learn *learn, struct flow_wildcards *wc) +{ + const struct ofpact_learn_spec *spec; + union mf_subvalue value; + + memset(&value, 0xff, sizeof value); + for (spec = learn->specs; spec < &learn->specs[learn->n_specs]; spec++) { + if (spec->src_type == NX_LEARN_SRC_FIELD) { + mf_write_subfield_flow(&spec->src, &value, &wc->masks); + } + } +} + static void learn_parse_load_immediate(const char *s, struct ofpact_learn_spec *spec) { @@ -512,14 +528,13 @@ learn_parse_spec(const char *orig, char *name, char *value, * * Modifies 'arg'. */ void -learn_parse(char *arg, const struct flow *flow, struct ofpbuf *ofpacts) +learn_parse(char *arg, struct ofpbuf *ofpacts) { char *orig = xstrdup(arg); char *name, *value; struct ofpact_learn *learn; struct match match; - enum ofperr error; learn = ofpact_put_LEARN(ofpacts); learn->idle_timeout = OFP_FLOW_PERMANENT; @@ -556,21 +571,6 @@ learn_parse(char *arg, const struct flow *flow, struct ofpbuf *ofpacts) learn_parse_spec(orig, name, value, spec); - /* Check prerequisites. */ - if (spec->src_type == NX_LEARN_SRC_FIELD - && flow && !mf_are_prereqs_ok(spec->src.field, flow)) { - ovs_fatal(0, "%s: cannot specify source field %s because " - "prerequisites are not satisfied", - orig, spec->src.field->name); - } - if ((spec->dst_type == NX_LEARN_DST_MATCH - || spec->dst_type == NX_LEARN_DST_LOAD) - && !mf_are_prereqs_ok(spec->dst.field, &match.flow)) { - ovs_fatal(0, "%s: cannot specify destination field %s because " - "prerequisites are not satisfied", - orig, spec->dst.field->name); - } - /* Update 'match' to allow for satisfying destination * prerequisites. */ if (spec->src_type == NX_LEARN_SRC_IMMEDIATE @@ -581,13 +581,6 @@ learn_parse(char *arg, const struct flow *flow, struct ofpbuf *ofpacts) } ofpact_update_len(ofpacts, &learn->ofpact); - /* In theory the above should have caught any errors, but... */ - if (flow) { - error = learn_check(learn, flow); - if (error) { - ovs_fatal(0, "%s: %s", orig, ofperr_to_string(error)); - } - } free(orig); }