v5.1: Add actions in ofp-util.h like enum, init/put function prototype here. Add actions in ofp-util.c
v5: Merge ofp-util.def to this patch to make it work independent. Fix different return type in func ovs_instruction_type_from_inst_type Use OVS_NOT_REACHED now. v4: Add enums of ofp13_action_type and make them work. v3: Add func to get instruction/action name by OpenFlow instruction type directly. Signed-off-by: Alexander Wu <alexander...@huawei.com> Signed-off-by: Ben Pfaff <b...@nicira.com> --- include/openflow/openflow-1.3.h | 20 ++++++++++++++++++-- lib/ofp-actions.c | 21 +++++++++++++++++++++ lib/ofp-actions.h | 3 +++ lib/ofp-parse.c | 19 +++++++++++++++++++ lib/ofp-util.c | 5 +++++ lib/ofp-util.def | 21 +++++++++++++++++++++ lib/ofp-util.h | 5 +++++ 7 files changed, 92 insertions(+), 2 deletions(-) diff --git a/include/openflow/openflow-1.3.h b/include/openflow/openflow-1.3.h index 767e048..4696f01 100644 --- a/include/openflow/openflow-1.3.h +++ b/include/openflow/openflow-1.3.h @@ -104,8 +104,24 @@ struct ofp13_instruction_meter { OFP_ASSERT(sizeof(struct ofp13_instruction_meter) == 8); enum ofp13_action_type { - OFPAT13_PUSH_PBB = 26, /* Push a new PBB service tag (I-TAG) */ - OFPAT13_POP_PBB = 27 /* Pop the outer PBB service tag (I-TAG) */ + OFPAT13_OUTPUT = 0, /* Output to switch port. */ + OFPAT13_COPY_TTL_OUT = 11, /* Copy TTL "outwards" -- from next-to-outermost + to outermost */ + OFPAT13_COPY_TTL_IN = 12, /* Copy TTL "inwards" -- from outermost to + next-to-outermost */ + OFPAT13_SET_MPLS_TTL = 15, /* MPLS TTL */ + OFPAT13_DEC_MPLS_TTL = 16, /* Decrement MPLS TTL */ + OFPAT13_PUSH_VLAN = 17, /* Push a new VLAN tag */ + OFPAT13_POP_VLAN = 18, /* Pop the outer VLAN tag */ + OFPAT13_PUSH_MPLS = 19, /* Push a new MPLS Label Stack Entry */ + OFPAT13_POP_MPLS = 20, /* Pop the outer MPLS Label Stack Entry */ + OFPAT13_SET_QUEUE = 21, /* Set queue id when outputting to a port */ + OFPAT13_GROUP = 22, /* Apply group. */ + OFPAT13_SET_NW_TTL = 23, /* IP TTL. */ + OFPAT13_DEC_NW_TTL = 24, /* Decrement IP TTL. */ + OFPAT13_SET_FIELD = 25, /* Set a header field using OXM TLV format. */ + OFPAT13_PUSH_PBB = 26, /* Push a new PBB service tag (I-TAG) */ + OFPAT13_POP_PBB = 27 /* Pop the outer PBB service tag (I-TAG) */ }; /* enum ofp_config_flags value OFPC_INVALID_TTL_TO_CONTROLLER diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c index df7aebd..449a087 100644 --- a/lib/ofp-actions.c +++ b/lib/ofp-actions.c @@ -379,6 +379,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(); @@ -526,6 +527,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(); @@ -1144,6 +1146,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(); @@ -1637,6 +1640,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) { diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h index 00cba6a..a174d9f 100644 --- a/lib/ofp-actions.h +++ b/lib/ofp-actions.h @@ -764,4 +764,7 @@ const char *ovs_instruction_name_from_type(enum ovs_instruction_type type); int ovs_instruction_type_from_name(const char *name); enum ovs_instruction_type ovs_instruction_type_from_ofpact_type( enum ofpact_type); +enum ofperr ovs_instruction_type_from_inst_type( + enum ovs_instruction_type *instruction_type, const uint16_t inst_type); + #endif /* ofp-actions.h */ diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c index 251adfa..c64734c 100644 --- a/lib/ofp-parse.c +++ b/lib/ofp-parse.c @@ -648,6 +648,7 @@ parse_named_action(enum ofputil_action_code code, case OFPUTIL_OFPAT10_OUTPUT: case OFPUTIL_OFPAT11_OUTPUT: + case OFPUTIL_OFPAT13_OUTPUT: error = parse_output(arg, ofpacts); break; @@ -684,14 +685,17 @@ parse_named_action(enum ofputil_action_code code, break; case OFPUTIL_OFPAT12_SET_FIELD: + case OFPUTIL_OFPAT13_SET_FIELD: return set_field_parse(arg, ofpacts, usable_protocols); case OFPUTIL_OFPAT10_STRIP_VLAN: case OFPUTIL_OFPAT11_POP_VLAN: + case OFPUTIL_OFPAT13_POP_VLAN: ofpact_put_STRIP_VLAN(ofpacts)->ofpact.compat = code; break; case OFPUTIL_OFPAT11_PUSH_VLAN: + case OFPUTIL_OFPAT13_PUSH_VLAN: *usable_protocols &= OFPUTIL_P_OF11_UP; error = str_to_u16(arg, "ethertype", ðertype); if (error) { @@ -707,6 +711,7 @@ parse_named_action(enum ofputil_action_code code, break; case OFPUTIL_OFPAT11_SET_QUEUE: + case OFPUTIL_OFPAT13_SET_QUEUE: error = str_to_u32(arg, &ofpact_put_SET_QUEUE(ofpacts)->queue_id); break; @@ -756,6 +761,7 @@ parse_named_action(enum ofputil_action_code code, break; case OFPUTIL_OFPAT11_SET_NW_TTL: + case OFPUTIL_OFPAT13_SET_NW_TTL: error = str_to_u8(arg, "TTL", &ttl); if (error) { return error; @@ -765,6 +771,7 @@ parse_named_action(enum ofputil_action_code code, break; case OFPUTIL_OFPAT11_DEC_NW_TTL: + case OFPUTIL_OFPAT13_DEC_NW_TTL: OVS_NOT_REACHED(); case OFPUTIL_OFPAT10_SET_TP_SRC: @@ -859,10 +866,12 @@ parse_named_action(enum ofputil_action_code code, case OFPUTIL_NXAST_SET_MPLS_TTL: case OFPUTIL_OFPAT11_SET_MPLS_TTL: + case OFPUTIL_OFPAT13_SET_MPLS_TTL: error = parse_set_mpls_ttl(ofpacts, arg); break; case OFPUTIL_OFPAT11_DEC_MPLS_TTL: + case OFPUTIL_OFPAT13_DEC_MPLS_TTL: case OFPUTIL_NXAST_DEC_MPLS_TTL: ofpact_put_DEC_MPLS_TTL(ofpacts); break; @@ -876,6 +885,7 @@ parse_named_action(enum ofputil_action_code code, break; case OFPUTIL_OFPAT11_PUSH_MPLS: + case OFPUTIL_OFPAT13_PUSH_MPLS: case OFPUTIL_NXAST_PUSH_MPLS: error = str_to_u16(arg, "push_mpls", ðertype); if (!error) { @@ -884,6 +894,7 @@ parse_named_action(enum ofputil_action_code code, break; case OFPUTIL_OFPAT11_POP_MPLS: + case OFPUTIL_OFPAT13_POP_MPLS: case OFPUTIL_NXAST_POP_MPLS: error = str_to_u16(arg, "pop_mpls", ðertype); if (!error) { @@ -892,9 +903,17 @@ parse_named_action(enum ofputil_action_code code, break; case OFPUTIL_OFPAT11_GROUP: + case OFPUTIL_OFPAT13_GROUP: error = str_to_u32(arg, &ofpact_put_GROUP(ofpacts)->group_id); break; + /* FIXME when implement OFPAT13_* */ + case OFPUTIL_OFPAT13_COPY_TTL_OUT: + case OFPUTIL_OFPAT13_COPY_TTL_IN: + case OFPUTIL_OFPAT13_PUSH_PBB: + case OFPUTIL_OFPAT13_POP_PBB: + OVS_NOT_REACHED(); + case OFPUTIL_NXAST_STACK_PUSH: error = nxm_parse_stack_action(ofpact_put_STACK_PUSH(ofpacts), arg); break; diff --git a/lib/ofp-util.c b/lib/ofp-util.c index a0a372f..f276250 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -5178,6 +5178,7 @@ static const char *const names[OFPUTIL_N_ACTIONS] = { NULL, #define OFPAT10_ACTION(ENUM, STRUCT, NAME) NAME, #define OFPAT11_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) NAME, +#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) NAME, #define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) NAME, #include "ofp-util.def" }; @@ -5217,6 +5218,8 @@ ofputil_put_action(enum ofputil_action_code code, struct ofpbuf *buf) { switch (code) { case OFPUTIL_ACTION_INVALID: +#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) case OFPUTIL_##ENUM: +#include "ofp-util.def" OVS_NOT_REACHED(); #define OFPAT10_ACTION(ENUM, STRUCT, NAME) \ @@ -5248,6 +5251,8 @@ ofputil_put_action(enum ofputil_action_code code, struct ofpbuf *buf) } #define OFPAT11_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \ OFPAT10_ACTION(ENUM, STRUCT, NAME) +#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \ + OFPAT10_ACTION(ENUM, STRUCT, NAME) #define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \ void \ ofputil_init_##ENUM(struct STRUCT *s) \ diff --git a/lib/ofp-util.def b/lib/ofp-util.def index fae2bf2..44decae 100644 --- a/lib/ofp-util.def +++ b/lib/ofp-util.def @@ -44,6 +44,26 @@ OFPAT11_ACTION(OFPAT11_DEC_NW_TTL, ofp_action_header, 0, NULL) OFPAT11_ACTION(OFPAT12_SET_FIELD, ofp12_action_set_field, 1, "set_field") OFPAT11_ACTION(OFPAT11_GROUP, ofp11_action_group, 0, "group") +#ifndef OFPAT13_ACTION +#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) +#endif +OFPAT13_ACTION(OFPAT13_OUTPUT, ofp11_action_output, 0, "output") +OFPAT13_ACTION(OFPAT13_COPY_TTL_OUT, ofp_action_header, 0, "copy_ttl_out") +OFPAT13_ACTION(OFPAT13_COPY_TTL_IN, ofp_action_header, 0, "copy_ttl_in") +OFPAT13_ACTION(OFPAT13_SET_MPLS_TTL, ofp11_action_mpls_ttl, 0, "set_mpls_ttl") +OFPAT13_ACTION(OFPAT13_DEC_MPLS_TTL, ofp_action_header, 0, "dec_mpls_ttl") +OFPAT13_ACTION(OFPAT13_PUSH_VLAN, ofp11_action_push, 0, "push_vlan") +OFPAT13_ACTION(OFPAT13_POP_VLAN, ofp_action_header, 0, "pop_vlan") +OFPAT13_ACTION(OFPAT13_PUSH_MPLS, ofp11_action_push, 0, "push_mpls") +OFPAT13_ACTION(OFPAT13_POP_MPLS, ofp11_action_pop_mpls, 0, "pop_mpls") +OFPAT13_ACTION(OFPAT13_SET_QUEUE, ofp11_action_set_queue, 0, "set_queue") +OFPAT13_ACTION(OFPAT13_GROUP, ofp11_action_group, 0, "group") +OFPAT13_ACTION(OFPAT13_SET_NW_TTL, ofp11_action_nw_ttl, 0, "set_nw_ttl") +OFPAT13_ACTION(OFPAT13_DEC_NW_TTL, ofp_action_header, 0, "dec_nw_ttl") +OFPAT13_ACTION(OFPAT13_SET_FIELD, ofp12_action_set_field, 1, "set_field") +OFPAT13_ACTION(OFPAT13_PUSH_PBB, ofp11_action_push, 0, "push_pbb") +OFPAT13_ACTION(OFPAT13_POP_PBB, ofp_action_header, 0, "pop_pbb") + #ifndef NXAST_ACTION #define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) #endif @@ -80,4 +100,5 @@ NXAST_ACTION(NXAST_SAMPLE, nx_action_sample, 0, "sample") #undef OFPAT10_ACTION #undef OFPAT11_ACTION +#undef OFPAT13_ACTION #undef NXAST_ACTION diff --git a/lib/ofp-util.h b/lib/ofp-util.h index bf02b9f..9a44d06 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -848,6 +848,7 @@ enum OVS_PACKED_ENUM ofputil_action_code { OFPUTIL_ACTION_INVALID, #define OFPAT10_ACTION(ENUM, STRUCT, NAME) OFPUTIL_##ENUM, #define OFPAT11_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) OFPUTIL_##ENUM, +#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) OFPUTIL_##ENUM, #define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) OFPUTIL_##ENUM, #include "ofp-util.def" }; @@ -856,6 +857,7 @@ enum OVS_PACKED_ENUM ofputil_action_code { enum { #define OFPAT10_ACTION(ENUM, STRUCT, NAME) + 1 #define OFPAT11_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) + 1 +#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) + 1 #define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) + 1 OFPUTIL_N_ACTIONS = 1 #include "ofp-util.def" @@ -886,6 +888,9 @@ void *ofputil_put_action(enum ofputil_action_code, struct ofpbuf *buf); #define OFPAT11_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \ void ofputil_init_##ENUM(struct STRUCT *); \ struct STRUCT *ofputil_put_##ENUM(struct ofpbuf *); +#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \ + void ofputil_init_##ENUM(struct STRUCT *); \ + struct STRUCT *ofputil_put_##ENUM(struct ofpbuf *); #define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \ void ofputil_init_##ENUM(struct STRUCT *); \ struct STRUCT *ofputil_put_##ENUM(struct ofpbuf *); -- 1.7.3.1.msysgit.0 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev