On Sun, May 12, 2013 at 01:11:13AM +0200, Antonio Quartulli wrote:
> On Sat, May 11, 2013 at 07:23:26PM +0200, Linus Lüssing wrote:
> > /**
> > + * batadv_mcast_tvlv_ogm_handler_v1 - process incoming multicast tvlv
> > container
> > + * @bat_priv: the bat priv with all the soft interface information
> > + * @orig: the orig_node of the ogm
> > + * @flags: flags indicating the tvlv state (see batadv_tvlv_handler_flags)
> > + * @tvlv_value: tvlv buffer containing the multicast data
> > + * @tvlv_value_len: tvlv buffer length
> > + */
> > +static void batadv_mcast_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
> > + struct batadv_orig_node *orig,
> > + uint8_t flags,
> > + void *tvlv_value,
> > + uint16_t tvlv_value_len)
> > +{
> > + uint8_t mcast_flags = BATADV_NO_FLAGS;
> > +
> > + /* only fetch the tvlv value if the handler wasn't called via the
> > + * CIFNOTFND flag and if there is data to fetch
> > + */
> > + if (!(flags & BATADV_TVLV_HANDLER_OGM_CIFNOTFND) &&
> > + (tvlv_value) && (tvlv_value_len == 1))
> just for style reason I'd suggest to use sizeof(mcast_flags)
> instead of 1. and there is no need for parentheses around
> tvlv_value.
>
> > + mcast_flags = *(unsigned char *)tvlv_value;
>
> mcast_flags is uint8_t, therefore (even if it may practically be the same) you
> should use the same type for the cast.
ok
>
> > +
> > + if (!(mcast_flags & BATADV_MCAST_LISTENER_ANNOUNCEMENT) &&
> > + orig->mcast_flags & BATADV_MCAST_LISTENER_ANNOUNCEMENT) {
> > + atomic_inc(&bat_priv->mcast_num_non_aware);
> > + } else if (mcast_flags & BATADV_MCAST_LISTENER_ANNOUNCEMENT &&
> > + !(orig->mcast_flags & BATADV_MCAST_LISTENER_ANNOUNCEMENT)) {
> > + atomic_dec(&bat_priv->mcast_num_non_aware);
> > + }
> > +
> > + orig->mcast_flags = mcast_flags;
> > +}
>
> > diff --git a/originator.c b/originator.c
> > index 5d53d2f..acc0c2d 100644
> > --- a/originator.c
> > +++ b/originator.c
> > @@ -257,6 +257,9 @@ struct batadv_orig_node *batadv_get_orig_node(struct
> > batadv_priv *bat_priv,
> > reset_time = jiffies - 1 - msecs_to_jiffies(BATADV_RESET_PROTECTION_MS);
> > orig_node->bcast_seqno_reset = reset_time;
> > orig_node->batman_seqno_reset = reset_time;
> > +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS
> > + orig_node->mcast_flags = BATADV_MCAST_LISTENER_ANNOUNCEMENT;
> > +#endif
>
> why do you start assuming that an originator has the optimisation enabled?
> would
> it be better to wait for the first mcast tvlv from it to claim this?
Because it is easier code-wise. I had it the other way round first
and issuing an atomic_inc(&bat_priv->mcast_num_non_ware) in
batadv_get_orig_node(), but then I ended up counting up too many
times because I was increasing that counter for secondary
interface originators, too while not decreasing it again because
no TVLV handler will be called for these. And within
batadv_get_orig_node() I don't see an easy way to determine
whether I was called for a primary or secondary interface
originator.
>
> > +/* multicast capabilities */
> > +enum batadv_mcast_flags {
> > + BATADV_MCAST_LISTENER_ANNOUNCEMENT = BIT(0),
> > +};
> > +
>
> > diff --git a/types.h b/types.h
> > index 5d73a75..4ef5fb9 100644
> > --- a/types.h
> > +++ b/types.h
> > @@ -146,6 +146,9 @@ struct batadv_orig_node {
> > unsigned long last_seen;
> > unsigned long bcast_seqno_reset;
> > unsigned long batman_seqno_reset;
> > +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS
> > + uint8_t mcast_flags;
> > +#endif
> > uint8_t capabilities;
> > atomic_t last_ttvn;
> > uint32_t tt_crc;
> > @@ -569,6 +572,7 @@ struct batadv_priv {
> > #endif
> > #ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS
> > atomic_t mcast_group_awareness;
> > + atomic_t mcast_num_non_aware;
>
> why isn't this variable in the mcast_priv struct? It is not a user knob (as
> far
> as I can see)
You're right, will move it.
>
> Cheers,
>
> --
> Antonio Quartulli
>
> ..each of us alone is worth nothing..
> Ernesto "Che" Guevara
Cheers, Linus