ofproto: Generalize tun_id_from_cookie into flow_format.
authorBen Pfaff <blp@nicira.com>
Fri, 5 Nov 2010 18:10:35 +0000 (11:10 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 5 Nov 2010 18:10:35 +0000 (11:10 -0700)
Upcoming commits will add more flow formats, so this needs to be
an enumerated type instead of a bool.

include/openflow/nicira-ext.h
lib/classifier.c
lib/classifier.h
lib/flow.c
lib/flow.h
ofproto/ofproto.c

index 70b450276cba8db64be2b7243f1aa0d6463372c3..cd5026ee4573d6a5c91439701b279ec3c0c1d6ab 100644 (file)
@@ -125,6 +125,11 @@ struct nicira_header {
 };
 OFP_ASSERT(sizeof(struct nicira_header) == 16);
 
+enum {
+    NXFF_OPENFLOW10 = 0,         /* Standard OpenFlow 1.0 compatible. */
+    NXFF_TUN_ID_FROM_COOKIE = 1  /* Obtain tunnel ID from cookie. */
+};
+
 struct nxt_tun_id_cookie {
     struct ofp_header header;
     uint32_t vendor;            /* NX_VENDOR_ID. */
index 8da2d795b6239eb0641b3e58674a399bcacc6251..42f026ff9d859b15766edd9e1293d6bdfeb0dc1c 100644 (file)
@@ -118,18 +118,18 @@ cls_rule_from_flow(const struct flow *flow, uint32_t wildcards,
     rule->priority = priority;
 }
 
-/* Converts the ofp_match in 'match' into a cls_rule in 'rule', with the given
- * 'priority'.  If 'tun_id_from_cookie' is set then the upper 32 bits of
- * 'cookie' are stored in the rule as the tunnel ID. */
+/* Converts the ofp_match in 'match' (with format 'flow_format', one of NXFF_*)
+ * into a cls_rule in 'rule', with the given 'priority'.  'cookie' is used
+ * when 'flow_format' is NXFF_TUN_ID_FROM_COOKIE. */
 void
 cls_rule_from_match(const struct ofp_match *match, unsigned int priority,
-                    bool tun_id_from_cookie, uint64_t cookie,
+                    int flow_format, uint64_t cookie,
                     struct cls_rule *rule)
 {
     uint32_t wildcards;
     struct flow flow;
 
-    flow_from_match(match, tun_id_from_cookie, cookie, &flow, &wildcards);
+    flow_from_match(match, flow_format, cookie, &flow, &wildcards);
     cls_rule_init__(rule, &flow, wildcards);
     rule->priority = rule->wc.wildcards ? priority : UINT16_MAX;
 }
index 7ed3cf74300d5d25fc6082117bc8987f1f09eff9..e178703c6f961e1dd4d49c059367966e31d56933 100644 (file)
@@ -75,8 +75,7 @@ enum {
 void cls_rule_from_flow(const struct flow *, uint32_t wildcards,
                         unsigned int priority, struct cls_rule *);
 void cls_rule_from_match(const struct ofp_match *, unsigned int priority,
-                         bool tun_id_from_cookie, uint64_t cookie,
-                         struct cls_rule *);
+                         int flow_format, uint64_t cookie, struct cls_rule *);
 
 void cls_rule_zero_wildcards(struct cls_rule *);
 
index aba77cca76a21d01371ed5688425dfb652bb0417..678ae43090875c70ab4b27b77533ac155a13f9ba 100644 (file)
@@ -250,12 +250,12 @@ flow_extract_stats(const struct flow *flow, struct ofpbuf *packet,
 }
 
 /* Extract 'flow' with 'wildcards' into the OpenFlow match structure
- * 'match'. */
+ * 'match'.  'flow_format' should be one of NXFF_*. */
 void
 flow_to_match(const struct flow *flow, uint32_t wildcards,
-              bool tun_id_from_cookie, struct ofp_match *match)
+              int flow_format, struct ofp_match *match)
 {
-    if (!tun_id_from_cookie) {
+    if (flow_format != NXFF_TUN_ID_FROM_COOKIE) {
         wildcards &= OFPFW_ALL;
     }
     match->wildcards = htonl(wildcards);
@@ -278,14 +278,14 @@ flow_to_match(const struct flow *flow, uint32_t wildcards,
 }
 
 void
-flow_from_match(const struct ofp_match *match, bool tun_id_from_cookie,
+flow_from_match(const struct ofp_match *match, int flow_format,
                 ovs_be64 cookie, struct flow *flow, uint32_t *flow_wildcards)
 {
        uint32_t wildcards = ntohl(match->wildcards);
 
     flow->nw_src = match->nw_src;
     flow->nw_dst = match->nw_dst;
-    if (tun_id_from_cookie && !(wildcards & NXFW_TUN_ID)) {
+    if (flow_format == NXFF_TUN_ID_FROM_COOKIE && !(wildcards & NXFW_TUN_ID)) {
         flow->tun_id = htonl(ntohll(cookie) >> 32);
     } else {
         wildcards |= NXFW_TUN_ID;
index f1a32d5509bcde4700b0762d12a2ac1bc2b105bc..a154df2b92235d3d55bcb3d0b154d54c5e15cd7b 100644 (file)
@@ -59,9 +59,9 @@ int flow_extract(struct ofpbuf *, ovs_be32 tun_id, uint16_t in_port,
                  struct flow *);
 void flow_extract_stats(const struct flow *flow, struct ofpbuf *packet,
         struct odp_flow_stats *stats);
-void flow_to_match(const struct flow *, uint32_t wildcards, bool tun_id_cookie,
+void flow_to_match(const struct flow *, uint32_t wildcards, int flow_format,
                    struct ofp_match *);
-void flow_from_match(const struct ofp_match *, bool tun_id_from_cookie,
+void flow_from_match(const struct ofp_match *, int flow_format,
                      ovs_be64 cookie, struct flow *, uint32_t *wildcards);
 char *flow_to_string(const struct flow *);
 void flow_format(struct ds *, const struct flow *);
index 42260443c902cd4d83cda45b988545e4d337abaa..bd31b7605f4786e4bb7376178cef719fca49c2be 100644 (file)
@@ -290,7 +290,7 @@ struct ofproto {
     bool need_revalidate;
     long long int next_expiration;
     struct tag_set revalidate_set;
-    bool tun_id_from_cookie;
+    int flow_format;            /* One of NXFF_*. */
 
     /* OpenFlow connections. */
     struct hmap controllers;   /* Controller "struct ofconn"s. */
@@ -398,6 +398,7 @@ ofproto_create(const char *datapath, const char *datapath_type,
     p->need_revalidate = false;
     p->next_expiration = time_msec() + 1000;
     tag_set_init(&p->revalidate_set);
+    p->flow_format = NXFF_OPENFLOW10;
 
     /* Initialize OpenFlow connections. */
     list_init(&p->all_conns);
@@ -3066,8 +3067,8 @@ handle_table_stats_request(struct ofproto *p, struct ofconn *ofconn,
     ots = append_stats_reply(sizeof *ots, ofconn, &msg);
     memset(ots, 0, sizeof *ots);
     strcpy(ots->name, "classifier");
-    ots->wildcards = p->tun_id_from_cookie ? htonl(OVSFW_ALL)
-                                           : htonl(OFPFW_ALL);
+    ots->wildcards = (p->flow_format == NXFF_OPENFLOW10
+                      ? htonl(OFPFW_ALL) : htonl(OVSFW_ALL));
     ots->max_entries = htonl(1024 * 1024); /* An arbitrary big number. */
     ots->active_count = htonl(n_rules);
     ots->lookup_count = htonll(0);              /* XXX */
@@ -3224,7 +3225,7 @@ flow_stats_cb(struct cls_rule *rule_, void *cbdata_)
     ofs->table_id = 0;
     ofs->pad = 0;
     flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards,
-                  cbdata->ofproto->tun_id_from_cookie, &ofs->match);
+                  cbdata->ofproto->flow_format, &ofs->match);
     ofs->duration_sec = htonl(sec);
     ofs->duration_nsec = htonl(msec * 1000000);
     ofs->cookie = rule->flow_cookie;
@@ -3264,7 +3265,7 @@ handle_flow_stats_request(struct ofproto *p, struct ofconn *ofconn,
     cbdata.ofconn = ofconn;
     cbdata.out_port = fsr->out_port;
     cbdata.msg = start_stats_reply(osr, 1024);
-    cls_rule_from_match(&fsr->match, 0, false, 0, &target);
+    cls_rule_from_match(&fsr->match, 0, NXFF_OPENFLOW10, 0, &target);
     classifier_for_each_match(&p->cls, &target,
                               table_id_to_include(fsr->table_id),
                               flow_stats_cb, &cbdata);
@@ -3294,7 +3295,7 @@ flow_stats_ds_cb(struct cls_rule *rule_, void *cbdata_)
 
     query_stats(cbdata->ofproto, rule, &packet_count, &byte_count);
     flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards,
-                  cbdata->ofproto->tun_id_from_cookie, &match);
+                  cbdata->ofproto->flow_format, &match);
 
     ds_put_format(results, "duration=%llds, ",
                   (time_msec() - rule->created) / 1000);
@@ -3325,7 +3326,7 @@ ofproto_get_all_flows(struct ofproto *p, struct ds *results)
     cbdata.ofproto = p;
     cbdata.results = results;
 
-    cls_rule_from_match(&match, 0, false, 0, &target);
+    cls_rule_from_match(&match, 0, NXFF_OPENFLOW10, 0, &target);
     classifier_for_each_match(&p->cls, &target, CLS_INC_ALL,
                               flow_stats_ds_cb, &cbdata);
 }
@@ -3378,7 +3379,7 @@ handle_aggregate_stats_request(struct ofproto *p, struct ofconn *ofconn,
     cbdata.packet_count = 0;
     cbdata.byte_count = 0;
     cbdata.n_flows = 0;
-    cls_rule_from_match(&asr->match, 0, false, 0, &target);
+    cls_rule_from_match(&asr->match, 0, NXFF_OPENFLOW10, 0, &target);
     classifier_for_each_match(&p->cls, &target,
                               table_id_to_include(asr->table_id),
                               aggregate_stats_cb, &cbdata);
@@ -3577,7 +3578,7 @@ add_flow(struct ofproto *p, struct ofconn *ofconn,
         struct cls_rule cr;
 
         cls_rule_from_match(&ofm->match, ntohs(ofm->priority),
-                            p->tun_id_from_cookie, ofm->cookie, &cr);
+                            p->flow_format, ofm->cookie, &cr);
         if (classifier_rule_overlaps(&p->cls, &cr)) {
             return ofp_mkerr(OFPET_FLOW_MOD_FAILED, OFPFMFC_OVERLAP);
         }
@@ -3588,7 +3589,7 @@ add_flow(struct ofproto *p, struct ofconn *ofconn,
                        ntohs(ofm->hard_timeout),  ofm->cookie,
                        ofm->flags & htons(OFPFF_SEND_FLOW_REM));
     cls_rule_from_match(&ofm->match, ntohs(ofm->priority),
-                        p->tun_id_from_cookie, ofm->cookie, &rule->cr);
+                        p->flow_format, ofm->cookie, &rule->cr);
 
     error = 0;
     if (ofm->buffer_id != htonl(UINT32_MAX)) {
@@ -3609,7 +3610,7 @@ find_flow_strict(struct ofproto *p, const struct ofp_flow_mod *ofm)
     struct cls_rule target;
 
     cls_rule_from_match(&ofm->match, ntohs(ofm->priority),
-                        p->tun_id_from_cookie, ofm->cookie, &target);
+                        p->flow_format, ofm->cookie, &target);
     return rule_from_cls_rule(classifier_find_rule_exactly(&p->cls, &target));
 }
 
@@ -3668,8 +3669,7 @@ modify_flows_loose(struct ofproto *p, struct ofconn *ofconn,
     cbdata.n_actions = n_actions;
     cbdata.match = NULL;
 
-    cls_rule_from_match(&ofm->match, 0, p->tun_id_from_cookie, ofm->cookie,
-                        &target);
+    cls_rule_from_match(&ofm->match, 0, p->flow_format, ofm->cookie, &target);
 
     classifier_for_each_match(&p->cls, &target, CLS_INC_ALL,
                               modify_flows_cb, &cbdata);
@@ -3770,8 +3770,7 @@ delete_flows_loose(struct ofproto *p, const struct ofp_flow_mod *ofm)
     cbdata.ofproto = p;
     cbdata.out_port = ofm->out_port;
 
-    cls_rule_from_match(&ofm->match, 0, p->tun_id_from_cookie, ofm->cookie,
-                        &target);
+    cls_rule_from_match(&ofm->match, 0, p->flow_format, ofm->cookie, &target);
 
     classifier_for_each_match(&p->cls, &target, CLS_INC_ALL,
                               delete_flows_cb, &cbdata);
@@ -3908,7 +3907,7 @@ handle_tun_id_from_cookie(struct ofproto *p, struct nxt_tun_id_cookie *msg)
         return error;
     }
 
-    p->tun_id_from_cookie = !!msg->set;
+    p->flow_format = msg->set ? NXFF_TUN_ID_FROM_COOKIE : NXFF_OPENFLOW10;
     return 0;
 }
 
@@ -4524,7 +4523,7 @@ compose_flow_removed(struct ofproto *p, const struct rule *rule,
     uint32_t msec = tdiff - (sec * 1000);
 
     ofr = make_openflow(sizeof *ofr, OFPT_FLOW_REMOVED, &buf);
-    flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards, p->tun_id_from_cookie,
+    flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards, p->flow_format,
                   &ofr->match);
     ofr->cookie = rule->flow_cookie;
     ofr->priority = htons(rule->cr.priority);