X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fofp-actions.c;h=23d89d307ec2a36c8334823807bc1cf024c9f868;hb=79f108b14e7944ddc4669e9c03fc34b40a3a2288;hp=df7aebd09ddf666dc3a2c9d305aff4f7426b31eb;hpb=1e827902be9194d71ea851c9ce2676f65eeed33a;p=sliver-openvswitch.git diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c index df7aebd09..23d89d307 100644 --- a/lib/ofp-actions.c +++ b/lib/ofp-actions.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -286,8 +286,7 @@ sample_from_openflow(const struct nx_action_sample *nas, } static enum ofperr -push_mpls_from_openflow(ovs_be16 ethertype, enum ofpact_mpls_position position, - struct ofpbuf *out) +push_mpls_from_openflow(ovs_be16 ethertype, struct ofpbuf *out) { struct ofpact_push_mpls *oam; @@ -296,7 +295,6 @@ push_mpls_from_openflow(ovs_be16 ethertype, enum ofpact_mpls_position position, } oam = ofpact_put_PUSH_MPLS(out); oam->ethertype = ethertype; - oam->position = position; return 0; } @@ -379,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(); @@ -473,8 +472,7 @@ ofpact_from_nxast(const union ofp_action *a, enum ofputil_action_code code, break; case OFPUTIL_NXAST_PUSH_MPLS: - error = push_mpls_from_openflow(a->push_mpls.ethertype, - OFPACT_MPLS_AFTER_VLAN, out); + error = push_mpls_from_openflow(a->push_mpls.ethertype, out); break; case OFPUTIL_NXAST_SET_MPLS_LABEL: @@ -526,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(); @@ -711,7 +710,7 @@ 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")", + "remaining message length (%"PRIu32")", actions_len, openflow->size); return OFPERR_OFPBRC_BAD_LEN; } @@ -1144,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(); @@ -1255,11 +1255,7 @@ ofpact_from_openflow11(const union ofp_action *a, enum ofp_version version, break; case OFPUTIL_OFPAT11_PUSH_MPLS: - /* OpenFlow 1.3 has different semantics. */ - error = push_mpls_from_openflow(a->push.ethertype, - version >= OFP13_VERSION ? - OFPACT_MPLS_BEFORE_VLAN : - OFPACT_MPLS_AFTER_VLAN, out); + error = push_mpls_from_openflow(a->push.ethertype, out); break; case OFPUTIL_OFPAT11_POP_MPLS: @@ -1637,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) { @@ -1754,7 +1768,7 @@ 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")", + "remaining message length (%"PRIu32")", instructions_len, openflow->size); error = OFPERR_OFPBIC_BAD_LEN; goto exit; @@ -2074,10 +2088,10 @@ ofpact_check__(enum ofputil_protocol *usable_protocols, struct ofpact *a, return 0; case OFPACT_POP_MPLS: - flow->dl_type = ofpact_get_POP_MPLS(a)->ethertype; if (!eth_type_mpls(flow->dl_type)) { inconsistent_match(usable_protocols); } + flow->dl_type = ofpact_get_POP_MPLS(a)->ethertype; return 0; case OFPACT_SAMPLE: @@ -3634,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(ofpacts->size, OFPACT_ALIGNTO); + if (pad) { + ofpbuf_put_zeros(ofpacts, pad); } }