Staging: batman-adv: Fix VIS output bug for secondary interfaces
TQ and HNA records for originators on secondary interfaces were wrongly being included on the primary interface. Ensure we output a line for each source interface on every node, so we correctly separate primary and secondary interface records. Signed-off-by: Linus Lüssing <linus.luessing@web.de> Signed-off-by: Andrew Lunn <andrew@lunn.ch> Cc: stable <stable@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Родитель
107c32fe68
Коммит
f6497e38fd
|
@ -369,6 +369,8 @@ static int proc_vis_data_read(struct seq_file *seq, void *offset)
|
|||
struct vis_info *info;
|
||||
struct vis_info_entry *entries;
|
||||
HLIST_HEAD(vis_if_list);
|
||||
struct if_list_entry *entry;
|
||||
struct hlist_node *pos, *n;
|
||||
int i;
|
||||
char tmp_addr_str[ETH_STR_LEN];
|
||||
unsigned long flags;
|
||||
|
@ -387,18 +389,35 @@ static int proc_vis_data_read(struct seq_file *seq, void *offset)
|
|||
info = hashit.bucket->data;
|
||||
entries = (struct vis_info_entry *)
|
||||
((char *)info + sizeof(struct vis_info));
|
||||
addr_to_string(tmp_addr_str, info->packet.vis_orig);
|
||||
seq_printf(seq, "%s,", tmp_addr_str);
|
||||
|
||||
for (i = 0; i < info->packet.entries; i++) {
|
||||
proc_vis_read_entry(seq, &entries[i], &vis_if_list,
|
||||
info->packet.vis_orig);
|
||||
if (entries[i].quality == 0)
|
||||
continue;
|
||||
proc_vis_insert_interface(entries[i].src, &vis_if_list,
|
||||
compare_orig(entries[i].src,
|
||||
info->packet.vis_orig));
|
||||
}
|
||||
|
||||
hlist_for_each_entry(entry, pos, &vis_if_list, list) {
|
||||
addr_to_string(tmp_addr_str, entry->addr);
|
||||
seq_printf(seq, "%s,", tmp_addr_str);
|
||||
|
||||
for (i = 0; i < info->packet.entries; i++)
|
||||
proc_vis_read_entry(seq, &entries[i],
|
||||
entry->addr, entry->primary);
|
||||
|
||||
/* add primary/secondary records */
|
||||
if (compare_orig(entry->addr, info->packet.vis_orig))
|
||||
proc_vis_read_prim_sec(seq, &vis_if_list);
|
||||
|
||||
seq_printf(seq, "\n");
|
||||
}
|
||||
|
||||
hlist_for_each_entry_safe(entry, pos, n, &vis_if_list, list) {
|
||||
hlist_del(&entry->list);
|
||||
kfree(entry);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&vis_hash_lock, flags);
|
||||
|
||||
end:
|
||||
|
|
|
@ -86,7 +86,7 @@ static int vis_info_choose(void *data, int size)
|
|||
|
||||
/* insert interface to the list of interfaces of one originator, if it
|
||||
* does not already exist in the list */
|
||||
static void proc_vis_insert_interface(const uint8_t *interface,
|
||||
void proc_vis_insert_interface(const uint8_t *interface,
|
||||
struct hlist_head *if_list,
|
||||
bool primary)
|
||||
{
|
||||
|
@ -111,40 +111,33 @@ void proc_vis_read_prim_sec(struct seq_file *seq,
|
|||
struct hlist_head *if_list)
|
||||
{
|
||||
struct if_list_entry *entry;
|
||||
struct hlist_node *pos, *n;
|
||||
struct hlist_node *pos;
|
||||
char tmp_addr_str[ETH_STR_LEN];
|
||||
|
||||
hlist_for_each_entry_safe(entry, pos, n, if_list, list) {
|
||||
if (entry->primary) {
|
||||
hlist_for_each_entry(entry, pos, if_list, list) {
|
||||
if (entry->primary)
|
||||
seq_printf(seq, "PRIMARY, ");
|
||||
} else {
|
||||
else {
|
||||
addr_to_string(tmp_addr_str, entry->addr);
|
||||
seq_printf(seq, "SEC %s, ", tmp_addr_str);
|
||||
}
|
||||
|
||||
hlist_del(&entry->list);
|
||||
kfree(entry);
|
||||
}
|
||||
}
|
||||
|
||||
/* read an entry */
|
||||
void proc_vis_read_entry(struct seq_file *seq,
|
||||
struct vis_info_entry *entry,
|
||||
struct hlist_head *if_list,
|
||||
uint8_t *vis_orig)
|
||||
uint8_t *src,
|
||||
bool primary)
|
||||
{
|
||||
char to[40];
|
||||
|
||||
addr_to_string(to, entry->dest);
|
||||
if (entry->quality == 0) {
|
||||
proc_vis_insert_interface(vis_orig, if_list, true);
|
||||
if (primary && entry->quality == 0)
|
||||
seq_printf(seq, "HNA %s, ", to);
|
||||
} else {
|
||||
proc_vis_insert_interface(entry->src, if_list,
|
||||
compare_orig(entry->src, vis_orig));
|
||||
else if (compare_orig(entry->src, src))
|
||||
seq_printf(seq, "TQ %s %d, ", to, entry->quality);
|
||||
}
|
||||
}
|
||||
|
||||
/* add the info packet to the send list, if it was not
|
||||
* already linked in. */
|
||||
|
|
|
@ -49,10 +49,13 @@ struct recvlist_node {
|
|||
extern struct hashtable_t *vis_hash;
|
||||
extern spinlock_t vis_hash_lock;
|
||||
|
||||
void proc_vis_insert_interface(const uint8_t *interface,
|
||||
struct hlist_head *if_list,
|
||||
bool primary);
|
||||
void proc_vis_read_entry(struct seq_file *seq,
|
||||
struct vis_info_entry *entry,
|
||||
struct hlist_head *if_list,
|
||||
uint8_t *vis_orig);
|
||||
uint8_t *src,
|
||||
bool primary);
|
||||
void proc_vis_read_prim_sec(struct seq_file *seq,
|
||||
struct hlist_head *if_list);
|
||||
void receive_server_sync_packet(struct vis_packet *vis_packet,
|
||||
|
|
Загрузка…
Ссылка в новой задаче