116 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <linux/kernel.h>3#include <linux/module.h>4#include <linux/device.h>5#include <linux/netdevice.h>6 7#include <net/bonding.h>8#include <net/bond_alb.h>9 10#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_NET_NS)11 12#include <linux/debugfs.h>13#include <linux/seq_file.h>14 15static struct dentry *bonding_debug_root;16 17/* Show RLB hash table */18static int bond_debug_rlb_hash_show(struct seq_file *m, void *v)19{20 struct bonding *bond = m->private;21 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));22 struct rlb_client_info *client_info;23 u32 hash_index;24 25 if (BOND_MODE(bond) != BOND_MODE_ALB)26 return 0;27 28 seq_printf(m, "SourceIP DestinationIP "29 "Destination MAC DEV\n");30 31 spin_lock_bh(&bond->mode_lock);32 33 hash_index = bond_info->rx_hashtbl_used_head;34 for (; hash_index != RLB_NULL_INDEX;35 hash_index = client_info->used_next) {36 client_info = &(bond_info->rx_hashtbl[hash_index]);37 seq_printf(m, "%-15pI4 %-15pI4 %-17pM %s\n",38 &client_info->ip_src,39 &client_info->ip_dst,40 &client_info->mac_dst,41 client_info->slave->dev->name);42 }43 44 spin_unlock_bh(&bond->mode_lock);45 46 return 0;47}48DEFINE_SHOW_ATTRIBUTE(bond_debug_rlb_hash);49 50void bond_debug_register(struct bonding *bond)51{52 bond->debug_dir =53 debugfs_create_dir(bond->dev->name, bonding_debug_root);54 55 debugfs_create_file("rlb_hash_table", 0400, bond->debug_dir,56 bond, &bond_debug_rlb_hash_fops);57}58 59void bond_debug_unregister(struct bonding *bond)60{61 debugfs_remove_recursive(bond->debug_dir);62}63 64void bond_debug_reregister(struct bonding *bond)65{66 struct dentry *d;67 68 d = debugfs_rename(bonding_debug_root, bond->debug_dir,69 bonding_debug_root, bond->dev->name);70 if (!IS_ERR(d)) {71 bond->debug_dir = d;72 } else {73 netdev_warn(bond->dev, "failed to reregister, so just unregister old one\n");74 bond_debug_unregister(bond);75 }76}77 78void __init bond_create_debugfs(void)79{80 bonding_debug_root = debugfs_create_dir("bonding", NULL);81 82 if (IS_ERR(bonding_debug_root))83 pr_warn("Warning: Cannot create bonding directory in debugfs\n");84}85 86void bond_destroy_debugfs(void)87{88 debugfs_remove_recursive(bonding_debug_root);89 bonding_debug_root = NULL;90}91 92 93#else /* !CONFIG_DEBUG_FS */94 95void bond_debug_register(struct bonding *bond)96{97}98 99void bond_debug_unregister(struct bonding *bond)100{101}102 103void bond_debug_reregister(struct bonding *bond)104{105}106 107void __init bond_create_debugfs(void)108{109}110 111void bond_destroy_debugfs(void)112{113}114 115#endif /* CONFIG_DEBUG_FS */116