Re: [B.A.T.M.A.N.] [PATCH 07/20] batman-adv: Prepare and send own multicast tracker packets

Andrew Lunn
2010-12-08T09:06:37Z

> +#define tracker_packet_for_each_dest(mcast_entry, dest_entry, mcast_num, dest_num, tracker_packet) \
> + for (mcast_num = 0, mcast_entry = (struct mcast_entry *)(tracker_packet + 1), \
> + dest_entry = (uint8_t *)(mcast_entry + 1); \
> + mcast_num < tracker_packet->num_mcast_entries; mcast_num++, \
> + mcast_entry = (struct mcast_entry *)dest_entry, \
> + dest_entry = (uint8_t *)(mcast_entry + 1)) \
> + for (dest_num = 0; dest_num < mcast_entry->num_dest; dest_num++, \
> + dest_entry += ETH_ALEN)

It is probably not a good idea to have nested for loops inside a macro
like this. What happens with code like:

tracker_packet_for_each_dest(mcast_entry, dest_entry, mcast_num, dest_num, tracker_packet) {
...
...
if (foo == bar)
break;

if (foo)
continue;

These don't do what you would expect.

Andrew