|
@@ -29,11 +29,8 @@
|
|
|
#include "vis.h"
|
|
|
|
|
|
static struct proc_dir_entry *proc_batman_dir, *proc_interface_file;
|
|
|
-static struct proc_dir_entry *proc_orig_interval_file, *proc_originators_file;
|
|
|
-static struct proc_dir_entry *proc_transt_local_file;
|
|
|
-static struct proc_dir_entry *proc_transt_global_file;
|
|
|
+static struct proc_dir_entry *proc_orig_interval_file;
|
|
|
static struct proc_dir_entry *proc_vis_srv_file, *proc_vis_data_file;
|
|
|
-static struct proc_dir_entry *proc_aggr_file;
|
|
|
|
|
|
static int proc_interfaces_read(struct seq_file *seq, void *offset)
|
|
|
{
|
|
@@ -176,145 +173,6 @@ static int proc_orig_interval_open(struct inode *inode, struct file *file)
|
|
|
return single_open(file, proc_orig_interval_read, NULL);
|
|
|
}
|
|
|
|
|
|
-static int proc_originators_read(struct seq_file *seq, void *offset)
|
|
|
-{
|
|
|
- HASHIT(hashit);
|
|
|
- struct orig_node *orig_node;
|
|
|
- struct neigh_node *neigh_node;
|
|
|
- int batman_count = 0;
|
|
|
- char orig_str[ETH_STR_LEN], router_str[ETH_STR_LEN];
|
|
|
- unsigned long flags;
|
|
|
-
|
|
|
- rcu_read_lock();
|
|
|
- if (list_empty(&if_list)) {
|
|
|
- rcu_read_unlock();
|
|
|
- seq_printf(seq, "BATMAN disabled - please specify interfaces to enable it\n");
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- if (((struct batman_if *)if_list.next)->if_active != IF_ACTIVE) {
|
|
|
- rcu_read_unlock();
|
|
|
- seq_printf(seq, "BATMAN disabled - primary interface not active\n");
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- seq_printf(seq,
|
|
|
- " %-14s (%s/%i) %17s [%10s]: %20s ... [B.A.T.M.A.N. adv %s%s, MainIF/MAC: %s/%s]\n",
|
|
|
- "Originator", "#", TQ_MAX_VALUE, "Nexthop", "outgoingIF",
|
|
|
- "Potential nexthops", SOURCE_VERSION, REVISION_VERSION_STR,
|
|
|
- ((struct batman_if *)if_list.next)->dev,
|
|
|
- ((struct batman_if *)if_list.next)->addr_str);
|
|
|
-
|
|
|
- rcu_read_unlock();
|
|
|
- spin_lock_irqsave(&orig_hash_lock, flags);
|
|
|
-
|
|
|
- while (hash_iterate(orig_hash, &hashit)) {
|
|
|
-
|
|
|
- orig_node = hashit.bucket->data;
|
|
|
-
|
|
|
- if (!orig_node->router)
|
|
|
- continue;
|
|
|
-
|
|
|
- if (orig_node->router->tq_avg == 0)
|
|
|
- continue;
|
|
|
-
|
|
|
- batman_count++;
|
|
|
-
|
|
|
- addr_to_string(orig_str, orig_node->orig);
|
|
|
- addr_to_string(router_str, orig_node->router->addr);
|
|
|
-
|
|
|
- seq_printf(seq, "%-17s (%3i) %17s [%10s]:",
|
|
|
- orig_str, orig_node->router->tq_avg,
|
|
|
- router_str, orig_node->router->if_incoming->dev);
|
|
|
-
|
|
|
- list_for_each_entry(neigh_node, &orig_node->neigh_list, list) {
|
|
|
- addr_to_string(orig_str, neigh_node->addr);
|
|
|
- seq_printf(seq, " %17s (%3i)",
|
|
|
- orig_str, neigh_node->tq_avg);
|
|
|
- }
|
|
|
-
|
|
|
- seq_printf(seq, "\n");
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- spin_unlock_irqrestore(&orig_hash_lock, flags);
|
|
|
-
|
|
|
- if (batman_count == 0)
|
|
|
- seq_printf(seq, "No batman nodes in range ...\n");
|
|
|
-
|
|
|
-end:
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int proc_originators_open(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- return single_open(file, proc_originators_read, NULL);
|
|
|
-}
|
|
|
-
|
|
|
-static int proc_transt_local_read(struct seq_file *seq, void *offset)
|
|
|
-{
|
|
|
- char *buf;
|
|
|
-
|
|
|
- buf = kmalloc(4096, GFP_KERNEL);
|
|
|
- if (!buf)
|
|
|
- return 0;
|
|
|
-
|
|
|
- rcu_read_lock();
|
|
|
- if (list_empty(&if_list)) {
|
|
|
- rcu_read_unlock();
|
|
|
- seq_printf(seq, "BATMAN disabled - please specify interfaces to enable it\n");
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- rcu_read_unlock();
|
|
|
-
|
|
|
- seq_printf(seq, "Locally retrieved addresses (from %s) announced via HNA:\n", soft_device->name);
|
|
|
-
|
|
|
- hna_local_fill_buffer_text(buf, 4096);
|
|
|
- seq_printf(seq, "%s", buf);
|
|
|
-
|
|
|
-end:
|
|
|
- kfree(buf);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int proc_transt_local_open(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- return single_open(file, proc_transt_local_read, NULL);
|
|
|
-}
|
|
|
-
|
|
|
-static int proc_transt_global_read(struct seq_file *seq, void *offset)
|
|
|
-{
|
|
|
- char *buf;
|
|
|
-
|
|
|
- buf = kmalloc(4096, GFP_KERNEL);
|
|
|
- if (!buf)
|
|
|
- return 0;
|
|
|
-
|
|
|
- rcu_read_lock();
|
|
|
- if (list_empty(&if_list)) {
|
|
|
- rcu_read_unlock();
|
|
|
- seq_printf(seq, "BATMAN disabled - please specify interfaces to enable it\n");
|
|
|
- goto end;
|
|
|
- }
|
|
|
- rcu_read_unlock();
|
|
|
-
|
|
|
-
|
|
|
- seq_printf(seq, "Globally announced HNAs received via the mesh (translation table):\n");
|
|
|
-
|
|
|
- hna_global_fill_buffer_text(buf, 4096);
|
|
|
- seq_printf(seq, "%s", buf);
|
|
|
-
|
|
|
-end:
|
|
|
- kfree(buf);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int proc_transt_global_open(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- return single_open(file, proc_transt_global_read, NULL);
|
|
|
-}
|
|
|
-
|
|
|
/* setting the mode of the vis server by the user */
|
|
|
static ssize_t proc_vis_srv_write(struct file *file, const char __user * buffer,
|
|
|
size_t count, loff_t *ppos)
|
|
@@ -429,53 +287,6 @@ static int proc_vis_data_open(struct inode *inode, struct file *file)
|
|
|
return single_open(file, proc_vis_data_read, NULL);
|
|
|
}
|
|
|
|
|
|
-static int proc_aggr_read(struct seq_file *seq, void *offset)
|
|
|
-{
|
|
|
- seq_printf(seq, "%i\n", atomic_read(&aggregation_enabled));
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static ssize_t proc_aggr_write(struct file *file, const char __user *buffer,
|
|
|
- size_t count, loff_t *ppos)
|
|
|
-{
|
|
|
- char *aggr_string;
|
|
|
- int not_copied = 0;
|
|
|
- unsigned long aggregation_enabled_tmp;
|
|
|
- int retval;
|
|
|
-
|
|
|
- aggr_string = kmalloc(count, GFP_KERNEL);
|
|
|
-
|
|
|
- if (!aggr_string)
|
|
|
- return -ENOMEM;
|
|
|
-
|
|
|
- not_copied = copy_from_user(aggr_string, buffer, count);
|
|
|
- aggr_string[count - not_copied - 1] = 0;
|
|
|
-
|
|
|
- retval = strict_strtoul(aggr_string, 10, &aggregation_enabled_tmp);
|
|
|
-
|
|
|
- if (retval || aggregation_enabled_tmp > 1) {
|
|
|
- printk(KERN_ERR "batman-adv:Aggregation can only be enabled (1) or disabled (0), given value: %li\n", aggregation_enabled_tmp);
|
|
|
- } else {
|
|
|
- printk(KERN_INFO "batman-adv:Changing aggregation from: %s (%i) to: %s (%li)\n",
|
|
|
- (atomic_read(&aggregation_enabled) == 1 ?
|
|
|
- "enabled" : "disabled"),
|
|
|
- atomic_read(&aggregation_enabled),
|
|
|
- (aggregation_enabled_tmp == 1 ? "enabled" : "disabled"),
|
|
|
- aggregation_enabled_tmp);
|
|
|
- atomic_set(&aggregation_enabled,
|
|
|
- (unsigned)aggregation_enabled_tmp);
|
|
|
- }
|
|
|
-
|
|
|
- kfree(aggr_string);
|
|
|
- return count;
|
|
|
-}
|
|
|
-
|
|
|
-static int proc_aggr_open(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- return single_open(file, proc_aggr_read, NULL);
|
|
|
-}
|
|
|
-
|
|
|
/* satisfying different prototypes ... */
|
|
|
static ssize_t proc_dummy_write(struct file *file, const char __user *buffer,
|
|
|
size_t count, loff_t *ppos)
|
|
@@ -483,15 +294,6 @@ static ssize_t proc_dummy_write(struct file *file, const char __user *buffer,
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
-static const struct file_operations proc_aggr_fops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .open = proc_aggr_open,
|
|
|
- .read = seq_read,
|
|
|
- .write = proc_aggr_write,
|
|
|
- .llseek = seq_lseek,
|
|
|
- .release = single_release,
|
|
|
-};
|
|
|
-
|
|
|
static const struct file_operations proc_vis_srv_fops = {
|
|
|
.owner = THIS_MODULE,
|
|
|
.open = proc_vis_srv_open,
|
|
@@ -510,33 +312,6 @@ static const struct file_operations proc_vis_data_fops = {
|
|
|
.release = single_release,
|
|
|
};
|
|
|
|
|
|
-static const struct file_operations proc_originators_fops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .open = proc_originators_open,
|
|
|
- .read = seq_read,
|
|
|
- .write = proc_dummy_write,
|
|
|
- .llseek = seq_lseek,
|
|
|
- .release = single_release,
|
|
|
-};
|
|
|
-
|
|
|
-static const struct file_operations proc_transt_local_fops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .open = proc_transt_local_open,
|
|
|
- .read = seq_read,
|
|
|
- .write = proc_dummy_write,
|
|
|
- .llseek = seq_lseek,
|
|
|
- .release = single_release,
|
|
|
-};
|
|
|
-
|
|
|
-static const struct file_operations proc_transt_global_fops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .open = proc_transt_global_open,
|
|
|
- .read = seq_read,
|
|
|
- .write = proc_dummy_write,
|
|
|
- .llseek = seq_lseek,
|
|
|
- .release = single_release,
|
|
|
-};
|
|
|
-
|
|
|
static const struct file_operations proc_interfaces_fops = {
|
|
|
.owner = THIS_MODULE,
|
|
|
.open = proc_interfaces_open,
|
|
@@ -557,15 +332,6 @@ static const struct file_operations proc_orig_interval_fops = {
|
|
|
|
|
|
void cleanup_procfs(void)
|
|
|
{
|
|
|
- if (proc_transt_global_file)
|
|
|
- remove_proc_entry(PROC_FILE_TRANST_GLOBAL, proc_batman_dir);
|
|
|
-
|
|
|
- if (proc_transt_local_file)
|
|
|
- remove_proc_entry(PROC_FILE_TRANST_LOCAL, proc_batman_dir);
|
|
|
-
|
|
|
- if (proc_originators_file)
|
|
|
- remove_proc_entry(PROC_FILE_ORIGINATORS, proc_batman_dir);
|
|
|
-
|
|
|
if (proc_orig_interval_file)
|
|
|
remove_proc_entry(PROC_FILE_ORIG_INTERVAL, proc_batman_dir);
|
|
|
|
|
@@ -578,9 +344,6 @@ void cleanup_procfs(void)
|
|
|
if (proc_vis_srv_file)
|
|
|
remove_proc_entry(PROC_FILE_VIS_SRV, proc_batman_dir);
|
|
|
|
|
|
- if (proc_aggr_file)
|
|
|
- remove_proc_entry(PROC_FILE_AGGR, proc_batman_dir);
|
|
|
-
|
|
|
if (proc_batman_dir)
|
|
|
#ifdef __NET_NET_NAMESPACE_H
|
|
|
remove_proc_entry(PROC_ROOT_DIR, init_net.proc_net);
|
|
@@ -624,36 +387,6 @@ int setup_procfs(void)
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
|
- proc_originators_file = create_proc_entry(PROC_FILE_ORIGINATORS,
|
|
|
- S_IRUGO, proc_batman_dir);
|
|
|
- if (proc_originators_file) {
|
|
|
- proc_originators_file->proc_fops = &proc_originators_fops;
|
|
|
- } else {
|
|
|
- printk(KERN_ERR "batman-adv: Registering the '/proc/net/%s/%s' file failed\n", PROC_ROOT_DIR, PROC_FILE_ORIGINATORS);
|
|
|
- cleanup_procfs();
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
-
|
|
|
- proc_transt_local_file = create_proc_entry(PROC_FILE_TRANST_LOCAL,
|
|
|
- S_IRUGO, proc_batman_dir);
|
|
|
- if (proc_transt_local_file) {
|
|
|
- proc_transt_local_file->proc_fops = &proc_transt_local_fops;
|
|
|
- } else {
|
|
|
- printk(KERN_ERR "batman-adv: Registering the '/proc/net/%s/%s' file failed\n", PROC_ROOT_DIR, PROC_FILE_TRANST_LOCAL);
|
|
|
- cleanup_procfs();
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
-
|
|
|
- proc_transt_global_file = create_proc_entry(PROC_FILE_TRANST_GLOBAL,
|
|
|
- S_IRUGO, proc_batman_dir);
|
|
|
- if (proc_transt_global_file) {
|
|
|
- proc_transt_global_file->proc_fops = &proc_transt_global_fops;
|
|
|
- } else {
|
|
|
- printk(KERN_ERR "batman-adv: Registering the '/proc/net/%s/%s' file failed\n", PROC_ROOT_DIR, PROC_FILE_TRANST_GLOBAL);
|
|
|
- cleanup_procfs();
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
-
|
|
|
proc_vis_srv_file = create_proc_entry(PROC_FILE_VIS_SRV,
|
|
|
S_IWUSR | S_IRUGO,
|
|
|
proc_batman_dir);
|
|
@@ -675,15 +408,5 @@ int setup_procfs(void)
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
|
- proc_aggr_file = create_proc_entry(PROC_FILE_AGGR, S_IWUSR | S_IRUGO,
|
|
|
- proc_batman_dir);
|
|
|
- if (proc_aggr_file) {
|
|
|
- proc_aggr_file->proc_fops = &proc_aggr_fops;
|
|
|
- } else {
|
|
|
- printk(KERN_ERR "batman-adv: Registering the '/proc/net/%s/%s' file failed\n", PROC_ROOT_DIR, PROC_FILE_AGGR);
|
|
|
- cleanup_procfs();
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
-
|
|
|
return 0;
|
|
|
}
|