static void ofpact_put_set_field(struct ofpbuf *openflow, enum ofp_version,
enum mf_field_id, uint64_t value);
+static void put_reg_load(struct ofpbuf *openflow,
+ const struct mf_subfield *, uint64_t value);
+
static enum ofperr ofpact_pull_raw(struct ofpbuf *, enum ofp_version,
enum ofp_raw_action_type *, uint64_t *arg);
static void *ofpact_put_raw(struct ofpbuf *, enum ofp_version,
{
uint8_t ecn = ip_ecn->ecn;
if (ofp_version == OFP10_VERSION) {
- /* XXX */
+ struct mf_subfield dst = { .field = mf_from_id(MFF_IP_ECN),
+ .ofs = 0, .n_bits = 2 };
+ put_reg_load(out, &dst, ecn);
} else if (ofp_version == OFP11_VERSION) {
put_OFPAT11_SET_NW_ECN(out, ecn);
} else {
pad_ofpat(openflow, start_ofs);
}
+static void
+put_reg_load(struct ofpbuf *openflow,
+ const struct mf_subfield *dst, uint64_t value)
+{
+ ovs_assert(dst->n_bits <= 64);
+
+ struct nx_action_reg_load *narl = put_NXAST_REG_LOAD(openflow);
+ narl->ofs_nbits = nxm_encode_ofs_nbits(dst->ofs, dst->n_bits);
+ narl->dst = htonl(mf_nxm_header(dst->field->id));
+ narl->value = htonll(value);
+}
+
static bool
next_load_segment(const struct ofpact_set_field *sf,
struct mf_subfield *dst, uint64_t *value)
dst.ofs = dst.n_bits = 0;
while (next_load_segment(sf, &dst, &value)) {
- struct nx_action_reg_load *narl = put_NXAST_REG_LOAD(openflow);
- narl->ofs_nbits = nxm_encode_ofs_nbits(dst.ofs, dst.n_bits);
- narl->dst = htonl(mf_nxm_header(dst.field->id));
- narl->value = htonll(value);
+ put_reg_load(openflow, &dst, value);
}
}
}
put_OFPAT_SET_NW_TOS(out, ofp_version, sf->value.u8 << 2);
break;
+ case MFF_IP_ECN:
+ put_OFPAT11_SET_NW_ECN(out, sf->value.u8);
+ break;
+
case MFF_TCP_SRC:
case MFF_UDP_SRC:
put_OFPAT_SET_TP_SRC(out, sf->value.be16);