Subject: Re: [PATCH net-next-2.6 1/4] net: introduce mc list helpers

From: Ben Hutchings <[email-masked]>
Date: Thu, 22 Oct 2009 15:18:32 +0100

On Thu, 2009-10-22 at 15:52 +0200, Jiri Pirko wrote:
> This helpers should be used by network drivers to access to netdev
> multicast lists.
[...]
> +static inline void netdev_mc_walk(struct net_device *dev,
> +				  void (*func)(void *, unsigned char *),
> +				  void *data)
> +{
> +	struct dev_addr_list *mclist;
> +	int i;
> +
> +	for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
> +	     i++, mclist = mclist->next)
> +		func(data, mclist->dmi_addr);
> +}
[...]

We usually implement iteration as macros so that any context doesn't
have to be squeezed through a single untyped (void *) variable.  A macro
for this would look something like:

#define netdev_for_each_mc_addr(dev, addr)						\
	for (addr = (dev)->mc_list ? (dev)->mc_list->dmi_addr : NULL;			\
	     addr;									\
	     addr = (container_of(addr, struct dev_addr_list, dmi_addr)->next ?		\
		     container_of(addr, struct dev_addr_list, dmi_addr)->next->dmi_addr : \
		     NULL))

Once you change the list type this can presumably be made less ugly.

Ben.

-- 
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.