|
@@ -1616,3 +1616,68 @@ out:
|
|
|
batadv_hardif_free_ref(primary_if);
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
+int batadv_bla_backbone_table_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_hashtable *hash = bat_priv->backbone_hash;
|
|
|
+ struct batadv_backbone_gw *backbone_gw;
|
|
|
+ struct batadv_hard_iface *primary_if;
|
|
|
+ struct hlist_node *node;
|
|
|
+ struct hlist_head *head;
|
|
|
+ int secs, msecs;
|
|
|
+ uint32_t i;
|
|
|
+ bool is_own;
|
|
|
+ int ret = 0;
|
|
|
+ uint8_t *primary_addr;
|
|
|
+
|
|
|
+ primary_if = batadv_primary_if_get_selected(bat_priv);
|
|
|
+ if (!primary_if) {
|
|
|
+ ret = seq_printf(seq,
|
|
|
+ "BATMAN mesh %s disabled - please specify interfaces to enable it\n",
|
|
|
+ net_dev->name);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (primary_if->if_status != BATADV_IF_ACTIVE) {
|
|
|
+ ret = seq_printf(seq,
|
|
|
+ "BATMAN mesh %s disabled - primary interface not active\n",
|
|
|
+ net_dev->name);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ primary_addr = primary_if->net_dev->dev_addr;
|
|
|
+ seq_printf(seq,
|
|
|
+ "Backbones announced for the mesh %s (orig %pM, group id %04x)\n",
|
|
|
+ net_dev->name, primary_addr,
|
|
|
+ ntohs(bat_priv->claim_dest.group));
|
|
|
+ seq_printf(seq, " %-17s %-5s %-9s (%-4s)\n",
|
|
|
+ "Originator", "VID", "last seen", "CRC");
|
|
|
+ for (i = 0; i < hash->size; i++) {
|
|
|
+ head = &hash->table[i];
|
|
|
+
|
|
|
+ rcu_read_lock();
|
|
|
+ hlist_for_each_entry_rcu(backbone_gw, node, head, hash_entry) {
|
|
|
+ msecs = jiffies_to_msecs(jiffies -
|
|
|
+ backbone_gw->lasttime);
|
|
|
+ secs = msecs / 1000;
|
|
|
+ msecs = msecs % 1000;
|
|
|
+
|
|
|
+ is_own = batadv_compare_eth(backbone_gw->orig,
|
|
|
+ primary_addr);
|
|
|
+ if (is_own)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ seq_printf(seq,
|
|
|
+ " * %pM on % 5d % 4i.%03is (%04x)\n",
|
|
|
+ backbone_gw->orig, backbone_gw->vid,
|
|
|
+ secs, msecs, backbone_gw->crc);
|
|
|
+ }
|
|
|
+ rcu_read_unlock();
|
|
|
+ }
|
|
|
+out:
|
|
|
+ if (primary_if)
|
|
|
+ batadv_hardif_free_ref(primary_if);
|
|
|
+ return ret;
|
|
|
+}
|