Sorry for the delayed response. I attached the patch file for ovs-2.3.2 of my version.
As you can see I defined a new enumeration type for "flat" action, and try to decode it from the flowmod message. In the code I outputed the result right after the type of action was decoded, where I marked "test here" in ofp-actions.c And the result turned out to be 16 rather than 4096. Can you figure out what I missed? Thanks, 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 2016-04-28 22:03 GMT+08:00 Ben Pfaff <b...@ovn.org>: > On Thu, Apr 28, 2016 at 07:08:08PM +0800, Haosen Wen wrote: > > I defined a new action with type=0x1000(4096) in loxigen through > floodlight > > controller. But the decode result in ovs is type=0x10(16). > > What do you mean, "the decode result in ovs is type=0x10(16)." OVS > doesn't decode actions to a raw integer, it has enumeration types for > that purpose. >
diff -ru ovs-origin/openvswitch-2.3.2/include/openflow/openflow-1.1.h openvswitch-2.3.2/include/openflow/openflow-1.1.h --- ovs-origin/openvswitch-2.3.2/include/openflow/openflow-1.1.h 2015-06-19 03:32:47.000000000 +0800 +++ openvswitch-2.3.2/include/openflow/openflow-1.1.h 2016-04-28 19:06:01.928764568 +0800 @@ -210,6 +210,7 @@ OFPAT11_GROUP, /* Apply group. */ OFPAT11_SET_NW_TTL, /* IP TTL. */ OFPAT11_DEC_NW_TTL, /* Decrement IP TTL. */ + OFPAT11_FLAT = 0x1000, /*Hs: FLAT*/ OFPAT11_EXPERIMENTER = 0xffff }; @@ -357,6 +358,17 @@ }; OFP_ASSERT(sizeof(struct ofp11_action_output) == 16); +/*hs: Action structure for FLAT.*/ +struct ofp11_action_flat{ + /*hs: it's kind of dirty, i'd say...*/ + ovs_be16 type; /* flat, 4096 */ + ovs_be16 len; /* Length is 24. */ + 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 */ +}; + /* Action structure for OFPAT_GROUP. */ struct ofp11_action_group { ovs_be16 type; /* OFPAT11_GROUP. */ diff -ru ovs-origin/openvswitch-2.3.2/lib/ofp-actions.c openvswitch-2.3.2/lib/ofp-actions.c --- ovs-origin/openvswitch-2.3.2/lib/ofp-actions.c 2015-06-19 03:32:47.000000000 +0800 +++ openvswitch-2.3.2/lib/ofp-actions.c 2016-05-05 16:25:20.556399171 +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 ofp11_action_flat flat;/*hs:*/ }; static enum ofperr @@ -647,7 +648,7 @@ static enum ofperr ofpacts_from_openflow(const union ofp_action *in, size_t n_in, enum ofp_version version, struct ofpbuf *out) -{ +{/*hs: the very function that deal with the action headers.*/ const union ofp_action *a; size_t left; @@ -745,8 +746,12 @@ static enum ofperr decode_openflow11_action(const union ofp_action *a, enum ofputil_action_code *code) -{ +{/*hs: test here.*/ uint16_t len; + FILE *fp; + fp=fopen("/home/hensen/test.txt","a+"); + fprintf(fp,"type in decode_openflow11_action: %d\n",a->type); + fclose(fp); switch (a->type) { case CONSTANT_HTONS(OFPAT11_EXPERIMENTER): @@ -1151,6 +1156,10 @@ case OFPUTIL_OFPAT11_OUTPUT: return output_from_openflow11(&a->ofp11_output, out); + case OFPUTIL_OFPAT11_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 +1598,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: @@ -1751,7 +1761,7 @@ unsigned int instructions_len, enum ofp_version version, struct ofpbuf *ofpacts) -{ +{/*hs: decoding instructions(actions)*/ const struct ofp11_instruction *instructions; const struct ofp11_instruction *insts[N_OVS_INSTRUCTIONS]; enum ofperr error; @@ -1906,12 +1916,19 @@ { const struct ofpact_enqueue *enqueue; const struct mf_field *mf; + FILE *fp; + fp=fopen("/home/hensen/test.txt","a+");/*hs: for testing.*/ + fprintf(fp,"type now: %d\n",a->type); + fclose(fp); 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 ovs-origin/openvswitch-2.3.2/lib/ofp-actions.h openvswitch-2.3.2/lib/ofp-actions.h --- ovs-origin/openvswitch-2.3.2/lib/ofp-actions.h 2015-06-19 03:32:47.000000000 +0800 +++ openvswitch-2.3.2/lib/ofp-actions.h 2016-04-27 17:09:15.802846177 +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 ovs-origin/openvswitch-2.3.2/lib/ofp-util.def openvswitch-2.3.2/lib/ofp-util.def --- ovs-origin/openvswitch-2.3.2/lib/ofp-util.def 2015-06-19 03:32:47.000000000 +0800 +++ openvswitch-2.3.2/lib/ofp-util.def 2016-04-28 19:04:37.968763863 +0800 @@ -43,6 +43,7 @@ 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") +OFPAT11_ACTION(OFPAT11_FLAT, ofp11_action_flat, 0, "flat") #ifndef OFPAT13_ACTION #define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) diff -ru ovs-origin/openvswitch-2.3.2/ofproto/ofproto.c openvswitch-2.3.2/ofproto/ofproto.c --- ovs-origin/openvswitch-2.3.2/ofproto/ofproto.c 2015-06-19 03:32:47.000000000 +0800 +++ openvswitch-2.3.2/ofproto/ofproto.c 2016-05-05 16:26:08.560398756 +0800 @@ -5933,8 +5933,15 @@ const struct ofp_header *oh = ofpbuf_data(msg); enum ofptype type; enum ofperr error; + /*hs: testing:*/ + FILE *fp; + fp=fopen("/home/hensen/test.txt","a+"); + fprintf(fp,"[v1]function called: handle_openflow__\n"); error = ofptype_decode(&type, oh); + + fprintf(fp,"type: %d\n",type); + fclose(fp); if (error) { return error; }
_______________________________________________ discuss mailing list discuss@openvswitch.org http://openvswitch.org/mailman/listinfo/discuss