On Mon, Oct 06, 2014 at 11:26:09AM -0700, Jarno Rajahalme wrote:
> 
> On Sep 30, 2014, at 5:47 PM, Ben Pfaff <b...@nicira.com> wrote:
> 
> > OpenFlow 1.5 (draft) extends the OFPAT_SET_FIELD action originally
> > introduced in OpenFlow 1.2 so that it can set not just entire fields but
> > any subset of bits within a field as well.  This commit adds support for
> > that feature when OpenFlow 1.5 is used.
> > 
> > With this feature, OFPAT_SET_FIELD becomes a superset of NXAST_REG_LOAD.
> > Thus, this commit merges the implementations of the two actions into a
> > single ofpact_set_field.
> > 
> > ONF-JIRA: EXT-314
> > Signed-off-by: Ben Pfaff <b...@nicira.com>
> > ?
> > 
> 
> (snip)
> 
> > diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
> > index f6818ca..ca4dac9 100644
> > --- a/lib/ofp-actions.c
> > +++ b/lib/ofp-actions.c
> 
> (snip)
> 
> > @@ -1973,14 +1932,17 @@ decode_OFPAT_RAW12_SET_FIELD(const struct 
> > ofp12_action_set_field *oasf,
> >     sf = ofpact_put_SET_FIELD(ofpacts);
> > 
> >     ofpbuf_use_const(&b, oasf, ntohs(oasf->len));
> > -    ofpbuf_pull(&b, 4);
> > -    error = nx_pull_entry(&b, &sf->field, &sf->value, NULL);
> > +    ofpbuf_pull(&b, OBJECT_OFFSETOF(oasf, pad));
> > +    error = nx_pull_entry(&b, &sf->field, &sf->value,
> > +                          may_mask ? &sf->mask : NULL);
> >     if (error) {
> > -        /* OF1.5 specifically says to use OFPBAC_BAD_SET_MASK in this 
> > case. */
> >         return (error == OFPERR_OFPBMC_BAD_MASK
> >                 ? OFPERR_OFPBAC_BAD_SET_MASK
> >                 : error);
> >     }
> > +    if (!may_mask) {
> > +        memset(&sf->mask, 0xff, sf->field->n_bytes);
> > +    }
> > 
> >     if (!is_all_zeros(ofpbuf_data(&b), ofpbuf_size(&b))) {
> >         return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
> > @@ -2003,6 +1965,7 @@ decode_OFPAT_RAW12_SET_FIELD(const struct 
> > ofp12_action_set_field *oasf,
> >      * on for OXM_OF_VLAN_VID. */
> >     if (!mf_is_value_valid(sf->field, &sf->value)
> >         || (sf->field->id == MFF_VLAN_VID
> > +            && sf->mask.be16 & htons(OFPVID12_PRESENT)
> >             && !(sf->value.be16 & htons(OFPVID12_PRESENT)))) {
> 
> This does not look right to me.

It was a little wrong.  Like this, then?

    /* The value must be valid for match.  The OpenFlow 1.5 draft also says,
     * "In an OXM_OF_VLAN_VID set-field action, the OFPVID_PRESENT bit must be
     * a 1-bit in oxm_value and in oxm_mask." */
    if (!mf_is_value_valid(sf->field, &sf->value)
        || (sf->field->id == MFF_VLAN_VID
            && (!(sf->mask.be16 & htons(OFPVID12_PRESENT)
                  || !(sf->value.be16 & htons(OFPVID12_PRESENT)))))) {
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to