On Sep 30, 2014, at 5:47 PM, Ben Pfaff <[email protected]> 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 <[email protected]>
> —
>
(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.
> struct ds ds = DS_EMPTY_INITIALIZER;
> mf_format(sf->field, &sf->value, NULL, &ds);
> @@ -2015,56 +1978,110 @@ decode_OFPAT_RAW12_SET_FIELD(const struct
> ofp12_action_set_field *oasf,
> return 0;
> }
Jarno
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev