From: Ben Pfaff Date: Wed, 4 Jul 2012 06:01:59 +0000 (-0700) Subject: openflow: Separate OF1.0, OF1.1 flow_mod constants and types. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=openvswitch;a=commitdiff_plain;h=e1152397ae5307cd7a082361ab81fa73076368f5 openflow: Separate OF1.0, OF1.1 flow_mod constants and types. Signed-off-by: Ben Pfaff Tested-by: Simon Horman Reviewed-by: Simon Horman --- v3->v4: Builds, passes unit tests. --- diff --git a/include/openflow/nicira-ext.h b/include/openflow/nicira-ext.h index 05f6c18a..4fc2049d 100644 --- a/include/openflow/nicira-ext.h +++ b/include/openflow/nicira-ext.h @@ -118,7 +118,7 @@ enum nx_hash_fields { * instead of having the switch decide which table is most appropriate as * required by OpenFlow 1.0. By default, the extension is disabled. * - * When this feature is enabled, Open vSwitch treats struct ofp_flow_mod's + * When this feature is enabled, Open vSwitch treats struct ofp10_flow_mod's * 16-bit 'command' member as two separate fields. The upper 8 bits are used * as the table ID, the lower 8 bits specify the command as usual. A table ID * of 0xff is treated like a wildcarded table ID. diff --git a/include/openflow/openflow-1.0.h b/include/openflow/openflow-1.0.h index b2077f02..75c5fc3d 100644 --- a/include/openflow/openflow-1.0.h +++ b/include/openflow/openflow-1.0.h @@ -271,14 +271,6 @@ struct ofp_packet_out { }; OFP_ASSERT(sizeof(struct ofp_packet_out) == 8); -enum ofp_flow_mod_command { - OFPFC_ADD, /* New flow. */ - OFPFC_MODIFY, /* Modify all matching flows. */ - OFPFC_MODIFY_STRICT, /* Modify entry strictly matching wildcards */ - OFPFC_DELETE, /* Delete all matching flows. */ - OFPFC_DELETE_STRICT /* Strictly match wildcards and priority. */ -}; - /* Flow wildcards. */ enum ofp_flow_wildcards { OFPFW10_IN_PORT = 1 << 0, /* Switch input port. */ @@ -363,15 +355,12 @@ OFP_ASSERT(sizeof(struct ofp10_match) == 40); /* By default, choose a priority in the middle. */ #define OFP_DEFAULT_PRIORITY 0x8000 -enum ofp_flow_mod_flags { - OFPFF_SEND_FLOW_REM = 1 << 0, /* Send flow removed message when flow - * expires or is deleted. */ - OFPFF_CHECK_OVERLAP = 1 << 1, /* Check for overlapping entries first. */ - OFPFF_EMERG = 1 << 2 /* Ramark this is for emergency. */ +enum ofp10_flow_mod_flags { + OFPFF10_EMERG = 1 << 2 /* Ramark this is for emergency. */ }; /* Flow setup and teardown (controller -> datapath). */ -struct ofp_flow_mod { +struct ofp10_flow_mod { struct ofp10_match match; /* Fields to match */ ovs_be64 cookie; /* Opaque controller-issued identifier. */ @@ -391,7 +380,7 @@ struct ofp_flow_mod { from the length field in the header. */ }; -OFP_ASSERT(sizeof(struct ofp_flow_mod) == 64); +OFP_ASSERT(sizeof(struct ofp10_flow_mod) == 64); /* Flow removed (datapath -> controller). */ struct ofp_flow_removed { diff --git a/include/openflow/openflow-common.h b/include/openflow/openflow-common.h index 3c456ba1..4ab37804 100644 --- a/include/openflow/openflow-common.h +++ b/include/openflow/openflow-common.h @@ -195,6 +195,20 @@ enum ofp_packet_in_reason { OFPR_N_REASONS }; +enum ofp_flow_mod_command { + OFPFC_ADD, /* New flow. */ + OFPFC_MODIFY, /* Modify all matching flows. */ + OFPFC_MODIFY_STRICT, /* Modify entry strictly matching wildcards */ + OFPFC_DELETE, /* Delete all matching flows. */ + OFPFC_DELETE_STRICT /* Strictly match wildcards and priority. */ +}; + +enum ofp_flow_mod_flags { + OFPFF_SEND_FLOW_REM = 1 << 0, /* Send flow removed message when flow + * expires or is deleted. */ + OFPFF_CHECK_OVERLAP = 1 << 1, /* Check for overlapping entries first. */ +}; + /* Action structure for OFPAT10_SET_VLAN_VID and OFPAT11_SET_VLAN_VID. */ struct ofp_action_vlan_vid { ovs_be16 type; /* Type. */ diff --git a/lib/ofp-msgs.h b/lib/ofp-msgs.h index 162d6e04..5ff5976e 100644 --- a/lib/ofp-msgs.h +++ b/lib/ofp-msgs.h @@ -145,7 +145,7 @@ enum ofpraw { /* OFPT 1.1+ (13): struct ofp11_packet_out, uint8_t[]. */ OFPRAW_OFPT11_PACKET_OUT, - /* OFPT 1.0 (14): struct ofp_flow_mod, struct ofp_action_header[]. */ + /* OFPT 1.0 (14): struct ofp10_flow_mod, struct ofp_action_header[]. */ OFPRAW_OFPT10_FLOW_MOD, /* OFPT 1.1+ (14): struct ofp11_flow_mod, struct ofp11_instruction[]. */ OFPRAW_OFPT11_FLOW_MOD, diff --git a/lib/ofp-print.c b/lib/ofp-print.c index c4e7b8f4..dc9fb6de 100644 --- a/lib/ofp-print.c +++ b/lib/ofp-print.c @@ -711,7 +711,7 @@ ofp_print_flow_mod(struct ds *s, const struct ofp_header *oh, int verbosity) ds_put_char(s, ' '); ofpraw_decode(&raw, oh); if (verbosity >= 3 && raw == OFPRAW_OFPT10_FLOW_MOD) { - const struct ofp_flow_mod *ofm = ofpmsg_body(oh); + const struct ofp10_flow_mod *ofm = ofpmsg_body(oh); ofp10_match_print(s, &ofm->match, verbosity); /* ofp_print_match() doesn't print priority. */ @@ -770,11 +770,11 @@ ofp_print_flow_mod(struct ds *s, const struct ofp_header *oh, int verbosity) if (flags & OFPFF_CHECK_OVERLAP) { ds_put_cstr(s, "check_overlap "); } - if (flags & OFPFF_EMERG) { + if (flags & OFPFF10_EMERG) { ds_put_cstr(s, "emerg "); } - flags &= ~(OFPFF_SEND_FLOW_REM | OFPFF_CHECK_OVERLAP | OFPFF_EMERG); + flags &= ~(OFPFF_SEND_FLOW_REM | OFPFF_CHECK_OVERLAP | OFPFF10_EMERG); if (flags) { ds_put_format(s, "flags:0x%"PRIx16" ", flags); } diff --git a/lib/ofp-util.c b/lib/ofp-util.c index e41bab2b..92d3fe46 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -1104,7 +1104,7 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, raw = ofpraw_pull_assert(&b); if (raw == OFPRAW_OFPT10_FLOW_MOD) { /* Standard OpenFlow 1.1 flow_mod. */ - const struct ofp_flow_mod *ofm; + const struct ofp10_flow_mod *ofm; uint16_t priority; enum ofperr error; @@ -1193,7 +1193,7 @@ struct ofpbuf * ofputil_encode_flow_mod(const struct ofputil_flow_mod *fm, enum ofputil_protocol protocol) { - struct ofp_flow_mod *ofm; + struct ofp10_flow_mod *ofm; struct nx_flow_mod *nfm; struct ofpbuf *msg; uint16_t command; diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 522b791f..5fa57d85 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -3209,9 +3209,9 @@ handle_flow_mod(struct ofconn *ofconn, const struct ofp_header *oh) goto exit_free_ofpacts; } + if (fm.flags & OFPFF10_EMERG) { /* We do not support the OpenFlow 1.0 emergency flow cache, which is not * required in OpenFlow 1.0.1 and removed from OpenFlow 1.1. */ - if (fm.flags & OFPFF_EMERG) { /* We do not support the emergency flow cache. It will hopefully get * dropped from OpenFlow in the near future. There is no good error * code, so just state that the flow table is full. */ diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 258115ec..00ba06b1 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -1843,7 +1843,7 @@ read_flows_from_file(const char *filename, struct classifier *cls, int index) version->cookie = fm.new_cookie; version->idle_timeout = fm.idle_timeout; version->hard_timeout = fm.hard_timeout; - version->flags = fm.flags & (OFPFF_SEND_FLOW_REM | OFPFF_EMERG); + version->flags = fm.flags & (OFPFF_SEND_FLOW_REM | OFPFF10_EMERG); version->ofpacts = fm.ofpacts; version->ofpacts_len = fm.ofpacts_len; @@ -1868,8 +1868,8 @@ recv_flow_stats_reply(struct vconn *vconn, ovs_be32 send_xid, struct ofpbuf *reply = *replyp; for (;;) { - ovs_be16 flags; int retval; + bool more; /* Get a flow stats reply message, if we don't already have one. */ if (!reply) { @@ -1897,10 +1897,10 @@ recv_flow_stats_reply(struct vconn *vconn, ovs_be32 send_xid, return true; case EOF: - flags = ((const struct ofp_stats_msg *) reply->l2)->flags; + more = ofpmp_more(reply->l2); ofpbuf_delete(reply); reply = NULL; - if (!(flags & htons(OFPSF_REPLY_MORE))) { + if (!more) { *replyp = NULL; return false; }