Hi all, I'm trying to add a new action, "FLAT" to ovs-2.3.2 action definitions. When compiling, I met the following errors:
*lib/ofp-actions.c: In function 'ofpact_from_openflow11':* *lib/ofp-actions.c:1155:5: error: duplicate case value* *lib/ofp-util.def:66:1: error: previously used here* and here is the content of the patch of my version: diff -ru /home/hensen/ovs-origin/openvswitch-2.3.2/include/openflow/openflow-1.3.h ./include/openflow/openflow-1.3.h --- /home/hensen/ovs-origin/openvswitch-2.3.2/include/openflow/openflow-1.3.h 2015-06-19 03:32:47.000000000 +0800 +++ ./include/openflow/openflow-1.3.h 2016-04-21 17:46:13.365100554 +0800 @@ -121,7 +121,8 @@ 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) */ + OFPAT13_POP_PBB = 27, /* Pop the outer PBB service tag (I-TAG) */ + OFPAT13_FLAT = 4096 /*hs: for FLAT*/ }; /* enum ofp_config_flags value OFPC_INVALID_TTL_TO_CONTROLLER @@ -138,6 +139,17 @@ OFPFF13_NO_BYT_COUNTS = 1 << 4 /* Don't keep track of byte count. */ }; +/*hs: Action structure for FLAT.*/ +struct flat_action{ + /*hs: it's kind of dirty, i'd say...*/ + ovs_be16 type; /* flat, 4096 */ + ovs_be16 len; /* Length is 16. */ + ovs_be16 timeflake; /* FLAT timeflake, 1 or 5 */ + ovs_be16 max_len; + ovs_be32 port; /* Output port. */ + uint8_t pad[4]; /* 8-byte alignment rule */ +}; + /* Common header for all meter bands */ struct ofp13_meter_band_header { ovs_be16 type; /* One of OFPMBT_*. */ diff -ru /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-actions.c ./lib/ofp-actions.c --- /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-actions.c 2015-06-19 03:32:47.000000000 +0800 +++ ./lib/ofp-actions.c 2016-04-21 18:00:44.869107865 +0800 @@ -35,7 +35,7 @@ /* Converting OpenFlow 1.0 to ofpacts. */ -union ofp_action { +union ofp_action {/*hs: action list*/ ovs_be16 type; struct ofp_action_header header; struct ofp_action_vendor_header vendor; @@ -81,6 +81,7 @@ struct nx_action_learn learn; struct nx_action_mpls_label mpls_label; struct nx_action_mpls_tc mpls_tc; + struct flat_action flat;/*hs:*/ }; static enum ofperr @@ -1151,6 +1152,10 @@ case OFPUTIL_OFPAT11_OUTPUT: return output_from_openflow11(&a->ofp11_output, out); + case OFPUTIL_OFPAT13_FLAT:/*hs: TODO: need further extension.*/ + ofpact_put_FLAT(out); + break; + case OFPUTIL_OFPAT11_SET_VLAN_VID: if (a->vlan_vid.vlan_vid & ~htons(0xfff)) { return OFPERR_OFPBAC_BAD_ARGUMENT; @@ -1589,6 +1594,7 @@ case OFPACT_GOTO_TABLE: return OVSINST_OFPIT11_GOTO_TABLE; case OFPACT_OUTPUT: + case OFPACT_FLAT:/*hs: for abstract action type verification.*/ case OFPACT_GROUP: case OFPACT_CONTROLLER: case OFPACT_ENQUEUE: @@ -1906,12 +1912,16 @@ { const struct ofpact_enqueue *enqueue; const struct mf_field *mf; + FILE *fp;/*hs: for testing.*/ switch (a->type) { case OFPACT_OUTPUT: return ofpact_check_output_port(ofpact_get_OUTPUT(a)->port, max_ports); + case OFPACT_FLAT:/*hs:for ofpact consistency detection. TODO: output port check as OUTPUT does.*/ + return 0; + case OFPACT_CONTROLLER: return 0; diff -ru /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-actions.h ./lib/ofp-actions.h --- /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-actions.h 2015-06-19 03:32:47.000000000 +0800 +++ ./lib/ofp-actions.h 2016-04-21 17:30:03.925092421 +0800 @@ -108,7 +108,10 @@ DEFINE_OFPACT(CLEAR_ACTIONS, ofpact_null, ofpact) \ DEFINE_OFPACT(WRITE_ACTIONS, ofpact_nest, ofpact) \ DEFINE_OFPACT(WRITE_METADATA, ofpact_metadata, ofpact) \ - DEFINE_OFPACT(GOTO_TABLE, ofpact_goto_table, ofpact) + DEFINE_OFPACT(GOTO_TABLE, ofpact_goto_table, ofpact) \ + \ + /*hs:FLAT */ \ + DEFINE_OFPACT(FLAT, ofpact_flat, ofpact) /* enum ofpact_type, with a member OFPACT_<ENUM> for each action. */ enum OVS_PACKED_ENUM ofpact_type { @@ -201,6 +204,17 @@ struct ofpact ofpact; }; +/*hs:OFPACT_FLAT. + * + * Used for OFPAT_FLAT. */ +struct ofpact_flat{/*i don't know if it's right...with no pads.*/ + struct ofpact ofpact; + ovs_be16 timeflake; /* FLAT timeflake, 1 or 5 */ + ovs_be16 max_len; + ofp_port_t port; /* Output port. */ +}; + + /* OFPACT_OUTPUT. * * Used for OFPAT10_OUTPUT. */ diff -ru /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-util.def ./lib/ofp-util.def --- /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-util.def 2015-06-19 03:32:47.000000000 +0800 +++ ./lib/ofp-util.def 2016-04-20 18:38:53.288230912 +0800 @@ -63,6 +63,7 @@ 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") +OFPAT13_ACTION(OFPAT13_FLAT, flat_action, 0, "flat") #ifndef NXAST_ACTION #define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) As the code suggests, the ofp13_type is set as 0x1000(4096). I haven't finish the execution module of this action, but up to now, the error kept coming up and I can't continue. What's the problem of my extension? Did I miss anything? Thanks a lot, Hs Haosen Wen Beijing Foreign Studies University Addr: 2nd Xisanhuan North Ave., Haidian Dist., Beijing, China E-Mail: wenhao...@gmail.com Tel: 86-183-1003-2269 Site: http://www.hensen-wen.cn
diff -ru /home/hensen/ovs-origin/openvswitch-2.3.2/include/openflow/openflow-1.3.h ./include/openflow/openflow-1.3.h --- /home/hensen/ovs-origin/openvswitch-2.3.2/include/openflow/openflow-1.3.h 2015-06-19 03:32:47.000000000 +0800 +++ ./include/openflow/openflow-1.3.h 2016-04-21 17:46:13.365100554 +0800 @@ -121,7 +121,8 @@ 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) */ + OFPAT13_POP_PBB = 27, /* Pop the outer PBB service tag (I-TAG) */ + OFPAT13_FLAT = 4096 /*hs: for FLAT*/ }; /* enum ofp_config_flags value OFPC_INVALID_TTL_TO_CONTROLLER @@ -138,6 +139,17 @@ OFPFF13_NO_BYT_COUNTS = 1 << 4 /* Don't keep track of byte count. */ }; +/*hs: Action structure for FLAT.*/ +struct flat_action{ + /*hs: it's kind of dirty, i'd say...*/ + ovs_be16 type; /* flat, 4096 */ + ovs_be16 len; /* Length is 16. */ + ovs_be16 timeflake; /* FLAT timeflake, 1 or 5 */ + ovs_be16 max_len; + ovs_be32 port; /* Output port. */ + uint8_t pad[4]; /* 8-byte alignment rule */ +}; + /* Common header for all meter bands */ struct ofp13_meter_band_header { ovs_be16 type; /* One of OFPMBT_*. */ diff -ru /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-actions.c ./lib/ofp-actions.c --- /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-actions.c 2015-06-19 03:32:47.000000000 +0800 +++ ./lib/ofp-actions.c 2016-04-21 18:00:44.869107865 +0800 @@ -35,7 +35,7 @@ /* Converting OpenFlow 1.0 to ofpacts. */ -union ofp_action { +union ofp_action {/*hs: action list*/ ovs_be16 type; struct ofp_action_header header; struct ofp_action_vendor_header vendor; @@ -81,6 +81,7 @@ struct nx_action_learn learn; struct nx_action_mpls_label mpls_label; struct nx_action_mpls_tc mpls_tc; + struct flat_action flat;/*hs:*/ }; static enum ofperr @@ -1151,6 +1152,10 @@ case OFPUTIL_OFPAT11_OUTPUT: return output_from_openflow11(&a->ofp11_output, out); + case OFPUTIL_OFPAT13_FLAT:/*hs: TODO: need further extension.*/ + ofpact_put_FLAT(out); + break; + case OFPUTIL_OFPAT11_SET_VLAN_VID: if (a->vlan_vid.vlan_vid & ~htons(0xfff)) { return OFPERR_OFPBAC_BAD_ARGUMENT; @@ -1589,6 +1594,7 @@ case OFPACT_GOTO_TABLE: return OVSINST_OFPIT11_GOTO_TABLE; case OFPACT_OUTPUT: + case OFPACT_FLAT:/*hs: for abstract action type verification.*/ case OFPACT_GROUP: case OFPACT_CONTROLLER: case OFPACT_ENQUEUE: @@ -1906,12 +1912,16 @@ { const struct ofpact_enqueue *enqueue; const struct mf_field *mf; + FILE *fp;/*hs: for testing.*/ switch (a->type) { case OFPACT_OUTPUT: return ofpact_check_output_port(ofpact_get_OUTPUT(a)->port, max_ports); + case OFPACT_FLAT:/*hs:for ofpact consistency detection. TODO: output port check as OUTPUT does.*/ + return 0; + case OFPACT_CONTROLLER: return 0; diff -ru /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-actions.h ./lib/ofp-actions.h --- /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-actions.h 2015-06-19 03:32:47.000000000 +0800 +++ ./lib/ofp-actions.h 2016-04-21 17:30:03.925092421 +0800 @@ -108,7 +108,10 @@ DEFINE_OFPACT(CLEAR_ACTIONS, ofpact_null, ofpact) \ DEFINE_OFPACT(WRITE_ACTIONS, ofpact_nest, ofpact) \ DEFINE_OFPACT(WRITE_METADATA, ofpact_metadata, ofpact) \ - DEFINE_OFPACT(GOTO_TABLE, ofpact_goto_table, ofpact) + DEFINE_OFPACT(GOTO_TABLE, ofpact_goto_table, ofpact) \ + \ + /*hs:FLAT */ \ + DEFINE_OFPACT(FLAT, ofpact_flat, ofpact) /* enum ofpact_type, with a member OFPACT_<ENUM> for each action. */ enum OVS_PACKED_ENUM ofpact_type { @@ -201,6 +204,17 @@ struct ofpact ofpact; }; +/*hs:OFPACT_FLAT. + * + * Used for OFPAT_FLAT. */ +struct ofpact_flat{/*i don't know if it's right...with no pads.*/ + struct ofpact ofpact; + ovs_be16 timeflake; /* FLAT timeflake, 1 or 5 */ + ovs_be16 max_len; + ofp_port_t port; /* Output port. */ +}; + + /* OFPACT_OUTPUT. * * Used for OFPAT10_OUTPUT. */ diff -ru /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-util.def ./lib/ofp-util.def --- /home/hensen/ovs-origin/openvswitch-2.3.2/lib/ofp-util.def 2015-06-19 03:32:47.000000000 +0800 +++ ./lib/ofp-util.def 2016-04-20 18:38:53.288230912 +0800 @@ -63,6 +63,7 @@ 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") +OFPAT13_ACTION(OFPAT13_FLAT, flat_action, 0, "flat") #ifndef NXAST_ACTION #define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME)
_______________________________________________ discuss mailing list discuss@openvswitch.org http://openvswitch.org/mailman/listinfo/discuss