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: [email protected]
Tel: 86-183-1003-2269
Site: http://www.hensen-wen.cn
2016-04-28 22:03 GMT+08:00 Ben Pfaff <[email protected]>:
> 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
[email protected]
http://openvswitch.org/mailman/listinfo/discuss