summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroopa <roopa@cumulusnetworks.com>2012-11-12 12:38:33 -0800
committerThomas Graf <tgraf@suug.ch>2012-11-12 21:51:07 +0100
commit0bd14aa2d689604b22b1d9f87a57c0e09c21b522 (patch)
tree44d63f5318e5c7fd4fdf910c0cae8e400ed249ec
parent30d862650bcc26588ddcb07d1126b43e0ec4c121 (diff)
downloadlibnl-0bd14aa2d689604b22b1d9f87a57c0e09c21b522.tar.gz
Add NL_CACHE_AF_ITER support during refill and resync
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>
-rw-r--r--lib/cache.c60
1 files changed, 41 insertions, 19 deletions
diff --git a/lib/cache.c b/lib/cache.c
index f21df2b..7b70324 100644
--- a/lib/cache.c
+++ b/lib/cache.c
@@ -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;
}