[ovs-dev] [PATCH v4 05/10] Native Set-Field action.
Ben Pfaff
blp at nicira.com
Fri Nov 1 22:02:26 UTC 2013
On Thu, Oct 24, 2013 at 01:19:29PM -0700, Jarno Rajahalme wrote:
> Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>
I'm going to fold this in:
diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index a9d4340..9f31449 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -793,7 +793,7 @@ set_field_from_openflow(const struct ofp12_action_set_field *oasf,
return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
}
sf = ofpact_put_SET_FIELD(ofpacts);
- sf->field = mf->id;
+ sf->field = mf;
memcpy(&sf->value, oasf + 1, mf->n_bytes);
/* The value must be valid for match and must have the OFPVID_PRESENT bit
@@ -816,17 +816,16 @@ static void
set_field_to_ofast(const struct ofpact_set_field *sf,
struct ofpbuf *openflow)
{
- const struct mf_field *mf = mf_from_id(sf->field);
- uint16_t padded_value_len = ROUND_UP(mf->n_bytes, 8);
+ uint16_t padded_value_len = ROUND_UP(sf->field->n_bytes, 8);
struct ofp12_action_set_field *oasf;
char *value;
oasf = ofputil_put_OFPAT12_SET_FIELD(openflow);
- oasf->dst = htonl(mf->oxm_header);
+ oasf->dst = htonl(sf->field->oxm_header);
oasf->len = htons(ntohs(oasf->len) + padded_value_len);
value = ofpbuf_put_zeros(openflow, padded_value_len);
- memcpy(value, &sf->value, mf->n_bytes);
+ memcpy(value, &sf->value, sf->field->n_bytes);
}
static void
@@ -834,16 +833,14 @@ set_field_to_openflow(const struct ofpact_set_field *sf,
struct ofpbuf *openflow)
{
struct ofp_header *oh = (struct ofp_header *)openflow->l2;
+ const struct mf_field *mf = sf->field;
struct nx_action_reg_load *narl;
- const struct mf_field *mf;
if (oh->version >= OFP12_VERSION) {
set_field_to_ofast(sf, openflow);
return;
}
- mf = mf_from_id(sf->field);
-
/* Convert to one or two REG_LOADs */
if (mf->n_bits > 64) {
@@ -1780,7 +1777,7 @@ ofpact_check__(struct ofpact *a, struct flow *flow, ofp_port_t max_ports,
return nxm_reg_load_check(ofpact_get_REG_LOAD(a), flow);
case OFPACT_SET_FIELD:
- mf = mf_from_id(ofpact_get_SET_FIELD(a)->field);
+ mf = ofpact_get_SET_FIELD(a)->field;
/* Require OXM_OF_VLAN_VID to have an existing VLAN header. */
if (!mf_are_prereqs_ok(mf, flow) ||
(mf->id == MFF_VLAN_VID && !(flow->vlan_tci & htons(VLAN_CFI)))) {
@@ -2967,7 +2964,7 @@ ofpact_format(const struct ofpact *a, struct ds *s)
case OFPACT_SET_FIELD:
set_field = ofpact_get_SET_FIELD(a);
- mf = mf_from_id(set_field->field);
+ mf = set_field->field;
ds_put_format(s, "set_field:");
/* RFC: Print VLAN VID without the OFPVID_PRESENT bit. */
if (mf->id == MFF_VLAN_VID) {
diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h
index 1809db0..233a31b 100644
--- a/lib/ofp-actions.h
+++ b/lib/ofp-actions.h
@@ -378,7 +378,7 @@ enum ofpact_mpls_position {
* Used for OFPAT12_SET_FIELD. */
struct ofpact_set_field {
struct ofpact ofpact;
- enum mf_field_id field;
+ const struct mf_field *field;
union mf_value value; /* Most-significant bits are used. */
};
diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c
index 7b19dc0..0fb32d5 100644
--- a/lib/ofp-parse.c
+++ b/lib/ofp-parse.c
@@ -489,7 +489,7 @@ set_field_parse__(char *arg, struct ofpbuf *ofpacts,
if (!mf->writable) {
return xasprintf("%s is read-only", key);
}
- sf->field = mf->id;
+ sf->field = mf;
delim[0] = '\0';
error = mf_parse_value(mf, value, &sf->value);
if (error) {
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index f8c4f5f..1b849d2 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -2440,7 +2440,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
case OFPACT_SET_FIELD:
set_field = ofpact_get_SET_FIELD(a);
- mf = mf_from_id(set_field->field);
+ mf = set_field->field;
mf_mask_field_and_prereqs(mf, &wc->masks);
/* Set field action only ever overwrites packet's outermost
More information about the dev
mailing list