On 09/05/18 03:20, Marek Lindner wrote:
On Sunday, May 6, 2018 4:23:37 AM HKT Sven Eckelmann wrote:
- batadv_tt_tvlv_generate() - fill the tvlv buff with the tt entries from
the * specified tt hash
- @bat_priv: the bat priv with all the soft interface information
@@ -2934,6 +2969,7 @@ static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv, struct batadv_tvlv_tt_change *tt_change; struct hlist_head *head; u16 tt_tot, tt_num_entries = 0;
int flags;
u32 i;
tt_tot = batadv_tt_entries(tt_len); @@ -2951,8 +2987,12 @@ static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv, if ((valid_cb) && (!valid_cb(tt_common_entry, cb_data))) continue;
flags = batadv_tt_get_flags(tt_common_entry,
cb_data); + if (flags < 0)
continue;
The second argument of batadv_tt_get_flags is a little bit tricky here. The kernel-doc says that cb_data is "data passed to the filter function as argument" and is of type "void *". But you are now using it here as if would always be of type "struct batadv_orig_node *". This doesn't make problem for now because only two functions are using this argument - luckily they are either set it to NULL or to "batadv_orig_node *".
I would propose to make it clear that this argument must be "struct batadv_orig_node *" and not an arbitrary argument which is only used by the valid_cb callback.
I second that concern. An alternative suggestion: Modify batadv_tt_local_valid() / batadv_tt_global_valid() to return the flags as those functions already distinguish between the local and global case. Moreover, you save the extra batadv_tt_global_orig_entry_find() call which already happens in batadv_tt_global_valid().
I like Marek's idea, but I'd suggest to change the name of the tt_*_valid() functions to something a bit more generic.
Apart from that I agree that that the flags retrieval could directly be done within the callback which already knows if we are in the local or global case.
Cheers,