[ovs-dev] [PATCH v3 2/3] ofproto: Add table config to struct ofproto

Simon Horman horms at verge.net.au
Mon Dec 16 08:53:22 UTC 2013


Add table config to to struct ofproto and set it
when a table mod message is received.

This is in preparation for changing the behaviour of the switch
based on table config.

Cc: Andy Zhou <azhou at nicira.com>
Signed-off-by: Simon Horman <horms at verge.net.au>

---

v3
* As suggested by Ben Pfaff
  + Use atomic type for config field of struct oftable
    rather than guarding it using a rwlock
  + Check that table_id is within the usable range
* Rename table_set_config as oftable_set_config as
  it operates on a struct oftable.
* Use enum ofp_table_config as type of config parameter
  of oftable_set_config
* Only updated configuration for supported table_mod config values.
  Currently there are no such values.

v2
* Add OVS_EXCLUDED annotation to table_set_config().
  This was mistakenly done in a subsequent patch.

atomic table->config
---
 ofproto/ofproto-provider.h | 15 ++++++++++++++-
 ofproto/ofproto.c          | 27 +++++++++++++++++++++++++--
 2 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
index 77553f6..dbcc254 100644
--- a/ofproto/ofproto-provider.h
+++ b/ofproto/ofproto-provider.h
@@ -213,6 +213,8 @@ enum oftable_flags {
  * Thread-safety
  * =============
  *
+ * cls
+ * ---
  * A cls->rwlock read-lock holder prevents rules from being added or deleted.
  *
  * Adding or removing rules requires holding ofproto_mutex AND the cls->rwlock
@@ -229,7 +231,12 @@ enum oftable_flags {
  * removing the rule from the classifier, release a ref_count from the rule
  * ('cls''s reference to the rule).
  *
- * Refer to the thread-safety notes on struct rule for more information.*/
+ * Refer to the thread-safety notes on struct rule for more information.
+ *
+ * config
+ * ------
+ * config is guarded by config_rwlock.
+ */
 struct oftable {
     enum oftable_flags flags;
     struct classifier cls;      /* Contains "struct rule"s. */
@@ -260,8 +267,14 @@ struct oftable {
     uint32_t eviction_group_id_basis;
     struct hmap eviction_groups_by_id;
     struct heap eviction_groups_by_size;
+
+    /* Table config: contains enum ofp_table_config; accessed atomically. */
+    atomic_uint config;
 };
 
+BUILD_ASSERT_DECL(sizeof(unsigned int) >= sizeof(enum ofp_table_config));
+
+
 /* Assigns TABLE to each oftable, in turn, in OFPROTO.
  *
  * All parameters are evaluated multiple times. */
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index 78a6a9a..3e643c6 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -5770,8 +5770,31 @@ handle_group_mod(struct ofconn *ofconn, const struct ofp_header *oh)
 }
 
 static enum ofperr
+table_mod(struct ofproto *ofproto, const struct ofputil_table_mod *tm)
+{
+    /* XXX Reject all configurations because none are currently supported */
+    return OFPERR_OFPTMFC_BAD_CONFIG;
+
+    if (tm->table_id == OFPTT_ALL) {
+        int i;
+        for (i = 0; i < ofproto->n_tables; i++) {
+            atomic_store(&ofproto->tables[i].config,
+                         (unsigned int)tm->config);
+        }
+    } else if (!check_table_id(ofproto, tm->table_id)) {
+        return OFPERR_OFPTMFC_BAD_TABLE;
+    } else {
+        atomic_store(&ofproto->tables[tm->table_id].config,
+                     (unsigned int)tm->config);
+    }
+
+    return 0;
+}
+
+static enum ofperr
 handle_table_mod(struct ofconn *ofconn, const struct ofp_header *oh)
 {
+    struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
     struct ofputil_table_mod tm;
     enum ofperr error;
 
@@ -5785,8 +5808,7 @@ handle_table_mod(struct ofconn *ofconn, const struct ofp_header *oh)
         return error;
     }
 
-    /* XXX Actual table mod support is not implemented yet. */
-    return 0;
+    return table_mod(ofproto, &tm);
 }
 
 static enum ofperr
@@ -6619,6 +6641,7 @@ oftable_init(struct oftable *table)
     memset(table, 0, sizeof *table);
     classifier_init(&table->cls, flow_segment_u32s);
     table->max_flows = UINT_MAX;
+    atomic_init(&table->config, (unsigned int)OFPTC11_TABLE_MISS_CONTROLLER);
 }
 
 /* Destroys 'table', including its classifier and eviction groups.
-- 
1.8.4




More information about the dev mailing list