]> granicus.if.org Git - libnl/commitdiff
Add NL_CACHE_AF_ITER support during refill and resync
authorroopa <roopa@cumulusnetworks.com>
Mon, 12 Nov 2012 20:38:33 +0000 (12:38 -0800)
committerThomas Graf <tgraf@suug.ch>
Mon, 12 Nov 2012 20:51:07 +0000 (21:51 +0100)
This patch adds support to iter over all supported families
during cache fill and resync.

The motivation for this was previously introduced at
http://lists.infradead.org/pipermail/libnl/2012-November/000734.html
In short, this patch allows caches to request dump on all supported
families instead of only AF_UNSPEC as done today.

With feedback from thomas this patch makes the iter over all families
conditional on per cache flag NL_CACHE_AF_ITER

Signed-off-by: Thomas Graf <tgraf@suug.ch>
lib/cache.c

index f21df2bd526e78231198acc25fa73ee9c4f8c063..7b703245a1b25d7f086b358b5a8463efe731a6fc 100644 (file)
@@ -779,6 +779,7 @@ int nl_cache_resync(struct nl_sock *sk, struct nl_cache *cache,
                    change_func_t change_cb, void *data)
 {
        struct nl_object *obj, *next;
+       struct nl_af_group *grp;
        struct nl_cache_assoc ca = {
                .ca_cache = cache,
                .ca_change = change_cb,
@@ -792,19 +793,28 @@ int nl_cache_resync(struct nl_sock *sk, struct nl_cache *cache,
 
        NL_DBG(1, "Resyncing cache %p <%s>...\n", cache, nl_cache_name(cache));
 
-restart:
        /* Mark all objects so we can see if some of them are obsolete */
        nl_cache_mark_all(cache);
 
-       err = nl_cache_request_full_dump(sk, cache);
-       if (err < 0)
-               goto errout;
+       grp = cache->c_ops->co_groups;
+       do {
+               if (grp && grp->ag_group &&
+                       (cache->c_flags & NL_CACHE_AF_ITER))
+                       nl_cache_set_arg1(cache, grp->ag_family);
 
-       err = __cache_pickup(sk, cache, &p);
-       if (err == -NLE_DUMP_INTR)
-               goto restart;
-       else if (err < 0)
-               goto errout;
+restart:
+               err = nl_cache_request_full_dump(sk, cache);
+               if (err < 0)
+                       goto errout;
+
+               err = __cache_pickup(sk, cache, &p);
+               if (err == -NLE_DUMP_INTR)
+                       goto restart;
+               else if (err < 0)
+                       goto errout;
+               grp++;
+       } while (grp && grp->ag_group &&
+               (cache->c_flags & NL_CACHE_AF_ITER));
 
        nl_list_for_each_entry_safe(obj, next, &cache->c_items, ce_list) {
                if (nl_object_is_marked(obj)) {
@@ -886,23 +896,35 @@ int nl_cache_parse_and_add(struct nl_cache *cache, struct nl_msg *msg)
  */
 int nl_cache_refill(struct nl_sock *sk, struct nl_cache *cache)
 {
+       struct nl_af_group *grp;
        int err;
 
+       nl_cache_clear(cache);
+       grp = cache->c_ops->co_groups;
+       do {
+               if (grp && grp->ag_group &&
+                       (cache->c_flags & NL_CACHE_AF_ITER))
+                       nl_cache_set_arg1(cache, grp->ag_family);
+
 restart:
-       err = nl_cache_request_full_dump(sk, cache);
-       if (err < 0)
-               return err;
+               err = nl_cache_request_full_dump(sk, cache);
+               if (err < 0)
+                       return err;
+
+               err = nl_cache_pickup(sk, cache);
+               if (err == -NLE_DUMP_INTR) {
+                       fprintf(stderr, "dump interrupted, restarting!\n");
+                       goto restart;
+               } else if (err < 0)
+                       break;
+
+               grp++;
+       } while (grp && grp->ag_group &&
+                       (cache->c_flags & NL_CACHE_AF_ITER));
 
        NL_DBG(2, "Upading cache %p <%s>, request sent, waiting for dump...\n",
               cache, nl_cache_name(cache));
-       nl_cache_clear(cache);
 
-       err = nl_cache_pickup(sk, cache);
-       if (err == -NLE_DUMP_INTR) {
-               fprintf(stderr, "dump interrupted, restarting!\n");
-               goto restart;
-       }
-       
        return err;
 }