X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fofp-actions.c;h=ce1400462a3321767b60ffca39a8abe4ca88081b;hb=HEAD;hp=3cd1e8b4047ee336ffd8487e4da2d482278bea51;hpb=b3f2fc93e3f357f8d05a92f53ec253339a40887f;p=sliver-openvswitch.git diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c index 3cd1e8b40..ce1400462 100644 --- a/lib/ofp-actions.c +++ b/lib/ofp-actions.c @@ -225,7 +225,7 @@ dec_ttl_from_openflow(struct ofpbuf *out, enum ofputil_action_code compat) ids->ofpact.compat = compat; ids->n_controllers = 1; ofpbuf_put(out, &id, sizeof id); - ids = out->l2; + ids = out->frame; ofpact_update_len(out, &ids->ofpact); return error; } @@ -258,7 +258,7 @@ dec_ttl_cnt_ids_from_openflow(const struct nx_action_cnt_ids *nac_ids, for (i = 0; i < ids->n_controllers; i++) { uint16_t id = ntohs(((ovs_be16 *)(nac_ids + 1))[i]); ofpbuf_put(out, &id, sizeof id); - ids = out->l2; + ids = out->frame; } ofpact_update_len(out, &ids->ofpact); @@ -377,6 +377,7 @@ ofpact_from_nxast(const union ofp_action *a, enum ofputil_action_code code, case OFPUTIL_ACTION_INVALID: #define OFPAT10_ACTION(ENUM, STRUCT, NAME) case OFPUTIL_##ENUM: #define OFPAT11_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) case OFPUTIL_##ENUM: +#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) case OFPUTIL_##ENUM: #include "ofp-util.def" OVS_NOT_REACHED(); @@ -523,6 +524,7 @@ ofpact_from_openflow10(const union ofp_action *a, switch (code) { case OFPUTIL_ACTION_INVALID: #define OFPAT11_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) case OFPUTIL_##ENUM: +#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) case OFPUTIL_##ENUM: #include "ofp-util.def" OVS_NOT_REACHED(); @@ -708,8 +710,8 @@ ofpacts_pull_openflow_actions(struct ofpbuf *openflow, actions = ofpbuf_try_pull(openflow, actions_len); if (actions == NULL) { VLOG_WARN_RL(&rl, "OpenFlow message actions length %u exceeds " - "remaining message length (%"PRIuSIZE")", - actions_len, openflow->size); + "remaining message length (%"PRIu32")", + actions_len, ofpbuf_size(openflow)); return OFPERR_OFPBRC_BAD_LEN; } @@ -720,7 +722,7 @@ ofpacts_pull_openflow_actions(struct ofpbuf *openflow, return error; } - error = ofpacts_verify(ofpacts->data, ofpacts->size); + error = ofpacts_verify(ofpbuf_data(ofpacts), ofpbuf_size(ofpacts)); if (error) { ofpbuf_clear(ofpacts); } @@ -1075,7 +1077,7 @@ static void set_field_to_openflow(const struct ofpact_set_field *sf, struct ofpbuf *openflow) { - struct ofp_header *oh = (struct ofp_header *)openflow->l2; + struct ofp_header *oh = (struct ofp_header *)openflow->frame; if (oh->version >= OFP12_VERSION) { set_field_to_openflow12(sf, openflow); @@ -1141,6 +1143,7 @@ ofpact_from_openflow11(const union ofp_action *a, enum ofp_version version, switch (code) { case OFPUTIL_ACTION_INVALID: #define OFPAT10_ACTION(ENUM, STRUCT, NAME) case OFPUTIL_##ENUM: +#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) case OFPUTIL_##ENUM: #include "ofp-util.def" OVS_NOT_REACHED(); @@ -1417,7 +1420,7 @@ ofpacts_copy_last(struct ofpbuf *out, const struct ofpbuf *in, const struct ofpact *a; target = NULL; - OFPACT_FOR_EACH (a, in->data, in->size) { + OFPACT_FOR_EACH (a, ofpbuf_data(in), ofpbuf_size(in)) { if (a->type == filter) { target = a; } @@ -1436,7 +1439,7 @@ ofpacts_copy_all(struct ofpbuf *out, const struct ofpbuf *in, { const struct ofpact *a; - OFPACT_FOR_EACH (a, in->data, in->size) { + OFPACT_FOR_EACH (a, ofpbuf_data(in), ofpbuf_size(in)) { if (filter(a)) { ofpact_copy(out, a); } @@ -1494,7 +1497,7 @@ ofpacts_from_openflow11_for_action_set(const union ofp_action *in, { enum ofperr error; struct ofpact *a; - size_t start = out->size; + size_t start = ofpbuf_size(out); error = ofpacts_from_openflow(in, n_in, version, out); @@ -1502,7 +1505,7 @@ ofpacts_from_openflow11_for_action_set(const union ofp_action *in, return error; } - OFPACT_FOR_EACH (a, ofpact_end(out->data, start), out->size - start) { + OFPACT_FOR_EACH (a, ofpact_end(ofpbuf_data(out), start), ofpbuf_size(out) - start) { if (!ofpact_is_allowed_in_actions_set(a)) { VLOG_WARN_RL(&rl, "disallowed action in action set"); return OFPERR_OFPBAC_BAD_TYPE; @@ -1630,6 +1633,24 @@ ovs_instruction_type_from_ofpact_type(enum ofpact_type type) } } +enum ofperr +ovs_instruction_type_from_inst_type(enum ovs_instruction_type *instruction_type, + const uint16_t inst_type) +{ + switch (inst_type) { + +#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) \ + case ENUM: \ + *instruction_type = OVSINST_##ENUM; \ + return 0; +OVS_INSTRUCTIONS +#undef DEFINE_INST + + default: + return OFPERR_OFPBIC_UNKNOWN_INST; + } +} + static inline struct ofp11_instruction * instruction_next(const struct ofp11_instruction *inst) { @@ -1747,8 +1768,8 @@ ofpacts_pull_openflow_instructions(struct ofpbuf *openflow, instructions = ofpbuf_try_pull(openflow, instructions_len); if (instructions == NULL) { VLOG_WARN_RL(&rl, "OpenFlow message instructions length %u exceeds " - "remaining message length (%"PRIuSIZE")", - instructions_len, openflow->size); + "remaining message length (%"PRIu32")", + instructions_len, ofpbuf_size(openflow)); error = OFPERR_OFPBIC_BAD_LEN; goto exit; } @@ -1793,7 +1814,7 @@ ofpacts_pull_openflow_instructions(struct ofpbuf *openflow, size_t start; ofpact_pad(ofpacts); - start = ofpacts->size; + start = ofpbuf_size(ofpacts); on = ofpact_put(ofpacts, OFPACT_WRITE_ACTIONS, offsetof(struct ofpact_nest, actions)); get_actions_from_instruction(insts[OVSINST_OFPIT11_WRITE_ACTIONS], @@ -1804,7 +1825,7 @@ ofpacts_pull_openflow_instructions(struct ofpbuf *openflow, goto exit; } on = ofpbuf_at_assert(ofpacts, start, sizeof *on); - on->ofpact.len = ofpacts->size - start; + on->ofpact.len = ofpbuf_size(ofpacts) - start; } if (insts[OVSINST_OFPIT11_WRITE_METADATA]) { const struct ofp11_instruction_write_metadata *oiwm; @@ -1827,7 +1848,7 @@ ofpacts_pull_openflow_instructions(struct ofpbuf *openflow, ogt->table_id = oigt->table_id; } - error = ofpacts_verify(ofpacts->data, ofpacts->size); + error = ofpacts_verify(ofpbuf_data(ofpacts), ofpbuf_size(ofpacts)); exit: if (error) { ofpbuf_clear(ofpacts); @@ -2267,23 +2288,23 @@ ofpact_write_metadata_to_nxast(const struct ofpact_metadata *om, static void ofpact_note_to_nxast(const struct ofpact_note *note, struct ofpbuf *out) { - size_t start_ofs = out->size; + size_t start_ofs = ofpbuf_size(out); struct nx_action_note *nan; unsigned int remainder; unsigned int len; nan = ofputil_put_NXAST_NOTE(out); - out->size -= sizeof nan->note; + ofpbuf_set_size(out, ofpbuf_size(out) - sizeof nan->note); ofpbuf_put(out, note->data, note->length); - len = out->size - start_ofs; + len = ofpbuf_size(out) - start_ofs; remainder = len % OFP_ACTION_ALIGN; if (remainder) { ofpbuf_put_zeros(out, OFP_ACTION_ALIGN - remainder); } nan = ofpbuf_at(out, start_ofs, sizeof *nan); - nan->len = htons(out->size - start_ofs); + nan->len = htons(ofpbuf_size(out) - start_ofs); } static void @@ -2568,6 +2589,8 @@ ofpact_to_openflow10(const struct ofpact *a, struct ofpbuf *out) * follow this action. */ break; + case OFPACT_SET_IP_ECN: + case OFPACT_SET_IP_TTL: case OFPACT_CLEAR_ACTIONS: case OFPACT_WRITE_ACTIONS: case OFPACT_GOTO_TABLE: @@ -2590,8 +2613,6 @@ ofpact_to_openflow10(const struct ofpact *a, struct ofpbuf *out) case OFPACT_STACK_PUSH: case OFPACT_STACK_POP: case OFPACT_DEC_TTL: - case OFPACT_SET_IP_ECN: - case OFPACT_SET_IP_TTL: case OFPACT_SET_MPLS_LABEL: case OFPACT_SET_MPLS_TC: case OFPACT_SET_MPLS_TTL: @@ -2960,7 +2981,7 @@ ofpacts_put_openflow_actions(const struct ofpact ofpacts[], size_t ofpacts_len, enum ofp_version ofp_version) { const struct ofpact *a; - size_t start_size = openflow->size; + size_t start_size = ofpbuf_size(openflow); void (*translate)(const struct ofpact *a, struct ofpbuf *out) = (ofp_version == OFP10_VERSION) ? ofpact_to_openflow10 : @@ -2970,7 +2991,7 @@ ofpacts_put_openflow_actions(const struct ofpact ofpacts[], size_t ofpacts_len, OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) { translate(a, openflow); } - return openflow->size - start_size; + return ofpbuf_size(openflow) - start_size; } static void @@ -2980,10 +3001,10 @@ ofpacts_update_instruction_actions(struct ofpbuf *openflow, size_t ofs) /* Update the instruction's length (or, if it's empty, delete it). */ oia = ofpbuf_at_assert(openflow, ofs, sizeof *oia); - if (openflow->size > ofs + sizeof *oia) { - oia->len = htons(openflow->size - ofs); + if (ofpbuf_size(openflow) > ofs + sizeof *oia) { + oia->len = htons(ofpbuf_size(openflow) - ofs); } else { - openflow->size = ofs; + ofpbuf_set_size(openflow, ofs); } } @@ -3034,7 +3055,7 @@ ofpacts_put_openflow_instructions(const struct ofpact ofpacts[], break; case OVSINST_OFPIT11_APPLY_ACTIONS: { - const size_t ofs = openflow->size; + const size_t ofs = ofpbuf_size(openflow); const size_t ofpacts_len_left = (uint8_t*)ofpact_end(ofpacts, ofpacts_len) - (uint8_t*)a; const struct ofpact *action; @@ -3059,7 +3080,7 @@ ofpacts_put_openflow_instructions(const struct ofpact ofpacts[], } case OVSINST_OFPIT11_WRITE_ACTIONS: { - const size_t ofs = openflow->size; + const size_t ofs = ofpbuf_size(openflow); const struct ofpact_nest *on; on = ofpact_get_WRITE_ACTIONS(a); @@ -3587,7 +3608,7 @@ ofpact_put(struct ofpbuf *ofpacts, enum ofpact_type type, size_t len) struct ofpact *ofpact; ofpact_pad(ofpacts); - ofpact = ofpacts->l2 = ofpbuf_put_uninit(ofpacts, len); + ofpact = ofpacts->frame = ofpbuf_put_uninit(ofpacts, len); ofpact_init(ofpact, type, len); return ofpact; } @@ -3610,7 +3631,7 @@ ofpact_init(struct ofpact *ofpact, enum ofpact_type type, size_t len) void ofpact_update_len(struct ofpbuf *ofpacts, struct ofpact *ofpact) { - ovs_assert(ofpact == ofpacts->l2); + ovs_assert(ofpact == ofpacts->frame); ofpact->len = (char *) ofpbuf_tail(ofpacts) - (char *) ofpact; } @@ -3627,8 +3648,8 @@ ofpact_update_len(struct ofpbuf *ofpacts, struct ofpact *ofpact) void ofpact_pad(struct ofpbuf *ofpacts) { - unsigned int rem = ofpacts->size % OFPACT_ALIGNTO; - if (rem) { - ofpbuf_put_zeros(ofpacts, OFPACT_ALIGNTO - rem); + unsigned int pad = PAD_SIZE(ofpbuf_size(ofpacts), OFPACT_ALIGNTO); + if (pad) { + ofpbuf_put_zeros(ofpacts, pad); } }