[RFC PATCH 1/5] Add support for AF_BRIDGE family in link cache

Thomas Graf tgraf at suug.ch
Mon Nov 5 08:56:28 EST 2012


On 11/05/12 at 05:37am, roopa at cumulusnetworks.com wrote:
> From: roopa <roopa at cumulusnetworks.com>
> 
> This patch adds support for AF_BRIDGE family in link cache
> and adds link family attribute to link object oo_id_attrs.
> With this the key for link object lookups will be ifindex and family.
> 
> This allows for base rtnl link objects to co-exist with the AF_BRIDGE
> link objects in the same cache.

I like the idea of reusing the link cache to cover bridge objects.
Especially because most of the code is essentially the same.

What we can't do is include the bridging objects by default.
Especially they look like incomplete duplicates to users that
don't care about AF_BRIDGE object.

I suggest to require enabling this feature using a flag of some
sort. Eventually the flag that I propose further down in the email.


> Note: I am considering the option of fixing the kernel link cache AF_UNSPEC get
> at some point if possible. Also the link cache get api's today only look for
> ifindex match and not family. These will need to be fixed or new api's introduced.
> I can submit patches to fix this if we choose to take this path.
> 
> -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;
> -
> -	err = __cache_pickup(sk, cache, &p);
> -	if (err == -NLE_DUMP_INTR)
> -		goto restart;
> -	else if (err < 0)
> -		goto errout;
> +        for (grp = cache->c_ops->co_groups; grp->ag_group; grp++) {
> +		nl_cache_set_arg1(cache, grp->ag_family);
> +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;

We need to add a flag to trigger this behavior. It makes sense for the
link cache but it does not make sense for the address cache. RTM_GETADDR
with family == AF_UNSPEC triggers a foreach(family) do dump action
which is definitely more desirable than trying to emulate that from with
libnl.

So please add 'co_flags' to struct nl_cache_ops with a new flag
NL_CACHE_AF_ITER to trigger the above code.

> +/**
> + * (Re)fill a cache with the contents in the kernel for all
> + * families the cache is associated with
> + * @arg sk		Netlink socket.
> + * @arg cache		cache to update
> + *
> + * Clears the specified cache and fills it with the current state in
> + * the kernel.
> + *
> + * @return 0 or a negative error code.
> + */
> +int nl_cache_refill_assoc_families(struct nl_sock *sk, struct nl_cache *cache)

I believe we can get rid of this if we have the above flag, do you
agree?

Alternatively we could add nl_cache_set_flags() and
nl_cache_unset_flags() to allow modifying the iterate groups feature.

Example:
	nl_cache_set_flags(link_cache, NL_CACHE_AF_ITER);
	nl_cache_refill(sk, link_cache);



More information about the libnl mailing list