> --- a/multicast.c
> +++ b/multicast.c
> @@ -995,6 +995,116 @@ void batadv_mcast_init(struct batadv_priv *bat_priv)
>  }
> 
>  /**
> + * batadv_mcast_flags_print_header - print own mcast flags to debugfs
> table + * @bat_priv: the bat priv with all the soft interface information
> + * @seq: debugfs table seq_file struct
> + *
> + * Prints our own multicast flags including a more specific reason why
> + * they are set, that is prints the bridge and querier state too, to
> + * the debugfs table specified via @seq.
> + */
> +static void batadv_mcast_flags_print_header(struct batadv_priv *bat_priv,
> +                                         struct seq_file *seq)
> +{
> +     struct net_device *dev = bat_priv->soft_iface;
> +     uint8_t flags = bat_priv->mcast.flags;
> +     char ip4_querier_c, ip6_querier_c, ip4_shadowed_c, ip6_shadowed_c;
> +     bool bridged = batadv_mcast_has_bridge(bat_priv);
> +
> +     if (bridged) {
> +             bool ip4_querier, ip6_querier, ip4_shadowed, ip6_shadowed;
> +
> +             ip4_querier = br_multicast_has_querier_anywhere(dev, ETH_P_IP);
> +             ip6_querier = br_multicast_has_querier_anywhere(dev,
> +                                                             ETH_P_IPV6);
> +             ip4_shadowed = br_multicast_has_querier_adjacent(dev, ETH_P_IP);
> +             ip6_shadowed = br_multicast_has_querier_adjacent(dev,
> +                                                              ETH_P_IPV6);

Isn't this info already in bat_priv->querier_ipv4/v6->exists/shadowed? Should 
avoid the 80 lines workarounds you are having here, or maybe you are able to 
squash that with the lines below.

> +
> +             ip4_querier_c = !ip4_querier ? '+' : '-';
> +             ip6_querier_c = !ip6_querier ? '+' : '-';
> +             ip4_shadowed_c = ip4_shadowed ? '+' : '-';
> +             ip6_shadowed_c = ip6_shadowed ? '+' : '-';
> +     } else {
> +             ip4_querier_c = '?';
> +             ip6_querier_c = '?';
> +             ip4_shadowed_c = '?';
> +             ip6_shadowed_c = '?';
> +     }
> +
> +     seq_printf(seq, "Multicast flags (own flags: [%c%c%c])\n",
> +                flags & BATADV_MCAST_WANT_ALL_UNSNOOPABLES ? 'U' : '.',
> +                flags & BATADV_MCAST_WANT_ALL_IPV4 ? '4' : '.',
> +                flags & BATADV_MCAST_WANT_ALL_IPV6 ? '6' : '.');
> +     seq_printf(seq, "* Bridged [U]\t\t\t\t%c\n", bridged ? '+' : '-');

What does the U mean? Unsnoopables? The U-flag? (just noticed that this "U-
Flag" is also used without explanation in the previous patch).

> +     seq_printf(seq, "* No IGMP/MLD Querier [4/6]:\t\t%c/%c\n",
> +                ip4_querier_c, ip6_querier_c);
> +     seq_printf(seq, "* Shadowing IGMP/MLD Querier [4/6]:\t%c/%c\n",
> +                ip4_shadowed_c, ip6_shadowed_c);
> +     seq_puts(seq, "-------------------------------------------\n");
> +     seq_printf(seq, "       %-10s %s\n", "Originator", "Flags");
> +}
> +
> +/**
> + * batadv_mcast_flags_seq_print_text - print the mcast flags of other
> nodes + * @seq: seq file to print on
> + * @offset: not used
> + *
> + * This prints a table of (primary) originators and their according
> + * multicast flags, including (in the header) our own.
> + */
> +int batadv_mcast_flags_seq_print_text(struct seq_file *seq, void *offset)
> +{
> +     struct net_device *net_dev = (struct net_device *)seq->private;
> +     struct batadv_priv *bat_priv = netdev_priv(net_dev);
> +     struct batadv_hard_iface *primary_if;
> +     struct batadv_hashtable *hash = bat_priv->orig_hash;
> +     struct batadv_orig_node *orig_node;
> +     struct hlist_head *head;
> +     uint8_t flags;
> +     uint32_t i;
> +
> +     primary_if = batadv_seq_print_text_primary_if_get(seq);
> +     if (!primary_if)
> +             return 0;
> +
> +     batadv_mcast_flags_print_header(bat_priv, seq);
> +
> +     for (i = 0; i < hash->size; i++) {
> +             head = &hash->table[i];
> +
> +             rcu_read_lock();
> +             hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
> +                     if (!(orig_node->capa_initialized &
> +                           BATADV_ORIG_CAPA_HAS_MCAST))
> +                             continue;
> +
> +                     flags = orig_node->mcast_flags;
> +
> +                     if (!(orig_node->capabilities &
> +                           BATADV_ORIG_CAPA_HAS_MCAST)) {
> +                             seq_printf(seq, "%pM -\n", orig_node->orig);
> +                             continue;
> +                     }
> +
> +                     seq_printf(seq, "%pM [%c%c%c]\n", orig_node->orig,
> +                                (flags & BATADV_MCAST_WANT_ALL_UNSNOOPABLES ?
> +                                 'U' : '.'),
> +                                (flags & BATADV_MCAST_WANT_ALL_IPV4 ?
> +                                 '4' : '.'),
> +                                (flags & BATADV_MCAST_WANT_ALL_IPV6 ?
> +                                 '6' : '.'));
> +             }
> +             rcu_read_unlock();
> +     }
> +
> +     batadv_hardif_free_ref(primary_if);
> +
> +     return 0;
> +}
> +
> +
> +/**
>   * batadv_mcast_free - free the multicast optimizations structures
>   * @bat_priv: the bat priv with all the soft interface information
>   */

The rest looks good ... I'll need to test all that later. :)

Thanks,
    Simon

Reply via email to