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

Reply via email to