[ovs-dev] [PATCH 2/3] extend-table: Use iterator macro instead of create callback.

Ben Pfaff blp at ovn.org
Wed Jan 24 01:39:34 UTC 2018


This is my suggestion as a way to make the use of extend-table code simpler
and more transparent.  This is intended to be squashed into the previous
commit.

Signed-off-by: Ben Pfaff <blp at ovn.org>
---
 ovn/controller/ofctrl.c | 47 ++++++++++++++++++++---------------------------
 ovn/lib/extend-table.c  | 18 +-----------------
 ovn/lib/extend-table.h  | 17 +++++++++++------
 3 files changed, 32 insertions(+), 50 deletions(-)

diff --git a/ovn/controller/ofctrl.c b/ovn/controller/ofctrl.c
index 94ee69c1c3ed..c81c40c6e646 100644
--- a/ovn/controller/ofctrl.c
+++ b/ovn/controller/ofctrl.c
@@ -69,7 +69,6 @@ static char *ovn_flow_to_string(const struct ovn_flow *);
 static void ovn_flow_log(const struct ovn_flow *, const char *action);
 static void ovn_flow_destroy(struct ovn_flow *);
 
-static void add_group(uint32_t table_id, struct ds *ds, struct ovs_list *msgs);
 static void delete_group(uint32_t table_id, struct ovs_list *msgs);
 
 /* OpenFlow connection to the switch. */
@@ -162,7 +161,6 @@ ofctrl_init(struct ovn_extend_table *group_table)
     ovs_list_init(&flow_updates);
     ovn_init_symtab(&symtab);
     groups = group_table;
-    groups->create = add_group;
     groups->remove = delete_group;
 }
 
@@ -767,30 +765,6 @@ add_group_mod(const struct ofputil_group_mod *gm, struct ovs_list *msgs)
 }
 
 static void
-add_group(uint32_t table_id, struct ds *ds, struct ovs_list *msgs) {
-    /* Create and install new group. */
-    struct ofputil_group_mod gm;
-    enum ofputil_protocol usable_protocols;
-    char *error;
-    struct ds group_string = DS_EMPTY_INITIALIZER;
-    ds_put_format(&group_string, "group_id=%"PRIu32",%s",
-                  table_id, ds_cstr(ds));
-
-    error = parse_ofp_group_mod_str(&gm, OFPGC11_ADD, ds_cstr(&group_string),
-                                    NULL, &usable_protocols);
-    if (!error) {
-        add_group_mod(&gm, msgs);
-    } else {
-        static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
-        VLOG_ERR_RL(&rl, "new group %s %s", error,
-                    ds_cstr(&group_string));
-        free(error);
-    }
-    ds_destroy(&group_string);
-    ofputil_uninit_group_mod(&gm);
-}
-
-static void
 delete_group(uint32_t table_id, struct ovs_list *msgs) {
     /* Delete the group. */
     struct ofputil_group_mod gm;
@@ -878,7 +852,26 @@ ofctrl_put(struct hmap *flow_table, struct shash *pending_ct_zones,
         }
     }
 
-    ovn_extend_table_install_desired(groups, &msgs);
+    struct ovn_extend_table_info *desired;
+    EXTEND_TABLE_FOR_EACH_UNINSTALLED (desired, groups) {
+        char *group_string = xasprintf("group_id=%"PRIu32",%s",
+                                       desired->table_id,
+                                       ds_cstr(&desired->info));
+
+        struct ofputil_group_mod gm;
+        enum ofputil_protocol usable_protocols;
+        char *error = parse_ofp_group_mod_str(&gm, OFPGC11_ADD, group_string,
+                                              NULL, &usable_protocols);
+        if (!error) {
+            add_group_mod(&gm, &msgs);
+        } else {
+            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
+            VLOG_ERR_RL(&rl, "new group %s %s", error, group_string);
+            free(error);
+        }
+        free(group_string);
+        ofputil_uninit_group_mod(&gm);
+    }
 
     /* Iterate through all of the installed flows.  If any of them are no
      * longer desired, delete them; if any of them should have different
diff --git a/ovn/lib/extend-table.c b/ovn/lib/extend-table.c
index dfd1a9413cfc..26391b6bd264 100644
--- a/ovn/lib/extend-table.c
+++ b/ovn/lib/extend-table.c
@@ -53,7 +53,7 @@ void ovn_extend_table_destroy(struct ovn_extend_table *table)
 
 /* Finds and returns a group_info in 'existing' whose key is identical
  * to 'target''s key, or NULL if there is none. */
-static struct ovn_extend_table_info *
+struct ovn_extend_table_info *
 ovn_extend_table_lookup(struct hmap *exisiting,
                         const struct ovn_extend_table_info *target)
 {
@@ -88,22 +88,6 @@ ovn_extend_table_clear(struct ovn_extend_table *table, bool existing)
 }
 
 void
-ovn_extend_table_install_desired(struct ovn_extend_table *table,
-                                 struct ovs_list *msgs)
-{
-    struct ovn_extend_table_info *desired;
-
-    /* Iterate through all the desired tables. If there are new ones,
-     * add them to the switch. */
-    HMAP_FOR_EACH (desired, hmap_node, &table->desired) {
-        if (!ovn_extend_table_lookup(&table->existing, desired)) {
-            /* Create and install new group. */
-            table->create(desired->table_id, &desired->info, msgs);
-        }
-    }
-}
-
-void
 ovn_extend_table_remove_existing(struct ovn_extend_table *table,
                                  struct ovs_list *msgs)
 {
diff --git a/ovn/lib/extend-table.h b/ovn/lib/extend-table.h
index ededba59dc01..67ac5d77436e 100644
--- a/ovn/lib/extend-table.h
+++ b/ovn/lib/extend-table.h
@@ -33,9 +33,6 @@ struct ovn_extend_table {
     struct hmap desired;
     struct hmap existing;
 
-    /* Used to create a form entity through the openflow channel. */
-    void (*create)(uint32_t, struct ds *, struct ovs_list *);
-
     /* Used to remove a form entity through the openflow channel. */
     void (*remove)(uint32_t, struct ovs_list *);
 };
@@ -52,12 +49,12 @@ void ovn_extend_table_init(struct ovn_extend_table *table);
 
 void ovn_extend_table_destroy(struct ovn_extend_table *table);
 
-void ovn_extend_table_install_desired(struct ovn_extend_table *table,
-                                      struct ovs_list *msgs);
-
 void ovn_extend_table_remove_existing(struct ovn_extend_table *table,
                                       struct ovs_list *msgs);
 
+struct ovn_extend_table_info *ovn_extend_table_lookup(
+    struct hmap *, const struct ovn_extend_table_info *);
+
 /* Move the contents of desired to existing. */
 void ovn_extend_table_move(struct ovn_extend_table *table);
 
@@ -66,4 +63,12 @@ void ovn_extend_table_clear(struct ovn_extend_table *table, bool existing);
 uint32_t ovn_extend_table_assign_id(struct ovn_extend_table *table,
                                     struct ds *ds);
 
+/* Iterates 'DESIRED' through all of the 'ovn_extend_table_info's in
+ * 'TABLE'->desired that are not in 'TABLE'->existing.  (The loop body
+ * presumably adds those */
+#define EXTEND_TABLE_FOR_EACH_UNINSTALLED(DESIRED, TABLE) \
+    HMAP_FOR_EACH (DESIRED, hmap_node, &(TABLE)->desired) \
+        if (!ovn_extend_table_lookup(&(TABLE)->existing, DESIRED))
+
+
 #endif /* ovn/lib/extend-table.h */
-- 
2.10.2



More information about the dev mailing list