xen-netback: create a debugfs node for hash information
[cascardo/linux.git] / drivers / net / xen-netback / hash.c
index fb87cb3..282b16d 100644 (file)
@@ -369,6 +369,74 @@ u32 xenvif_set_hash_mapping(struct xenvif *vif, u32 gref, u32 len,
        return XEN_NETIF_CTRL_STATUS_SUCCESS;
 }
 
+#ifdef CONFIG_DEBUG_FS
+void xenvif_dump_hash_info(struct xenvif *vif, struct seq_file *m)
+{
+       unsigned int i;
+
+       switch (vif->hash.alg) {
+       case XEN_NETIF_CTRL_HASH_ALGORITHM_TOEPLITZ:
+               seq_puts(m, "Hash Algorithm: TOEPLITZ\n");
+               break;
+
+       case XEN_NETIF_CTRL_HASH_ALGORITHM_NONE:
+               seq_puts(m, "Hash Algorithm: NONE\n");
+               /* FALLTHRU */
+       default:
+               return;
+       }
+
+       if (vif->hash.flags) {
+               seq_puts(m, "\nHash Flags:\n");
+
+               if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV4)
+                       seq_puts(m, "- IPv4\n");
+               if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP)
+                       seq_puts(m, "- IPv4 + TCP\n");
+               if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV6)
+                       seq_puts(m, "- IPv6\n");
+               if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP)
+                       seq_puts(m, "- IPv6 + TCP\n");
+       }
+
+       seq_puts(m, "\nHash Key:\n");
+
+       for (i = 0; i < XEN_NETBK_MAX_HASH_KEY_SIZE; ) {
+               unsigned int j, n;
+
+               n = 8;
+               if (i + n >= XEN_NETBK_MAX_HASH_KEY_SIZE)
+                       n = XEN_NETBK_MAX_HASH_KEY_SIZE - i;
+
+               seq_printf(m, "[%2u - %2u]: ", i, i + n - 1);
+
+               for (j = 0; j < n; j++, i++)
+                       seq_printf(m, "%02x ", vif->hash.key[i]);
+
+               seq_puts(m, "\n");
+       }
+
+       if (vif->hash.size != 0) {
+               seq_puts(m, "\nHash Mapping:\n");
+
+               for (i = 0; i < vif->hash.size; ) {
+                       unsigned int j, n;
+
+                       n = 8;
+                       if (i + n >= vif->hash.size)
+                               n = vif->hash.size - i;
+
+                       seq_printf(m, "[%4u - %4u]: ", i, i + n - 1);
+
+                       for (j = 0; j < n; j++, i++)
+                               seq_printf(m, "%4u ", vif->hash.mapping[i]);
+
+                       seq_puts(m, "\n");
+               }
+       }
+}
+#endif /* CONFIG_DEBUG_FS */
+
 void xenvif_init_hash(struct xenvif *vif)
 {
        if (xenvif_hash_cache_size == 0)