Changeset 1589

Show
Ignore:
Timestamp:
03/10/10 22:48:40 (5 months ago)
Author:
marek
Message:

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 Luessing <linus.luessing@…>

Location:
trunk/batman-adv-kernelland
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/batman-adv-kernelland/proc.c

    r1573 r1589  
    374374        struct vis_info_entry *entries; 
    375375        HLIST_HEAD(vis_if_list); 
     376        struct if_list_entry *entry; 
     377        struct hlist_node *pos, *n; 
    376378        int i; 
    377379        char tmp_addr_str[ETH_STR_LEN]; 
     
    392394                entries = (struct vis_info_entry *) 
    393395                        ((char *)info + sizeof(struct vis_info)); 
    394                 addr_to_string(tmp_addr_str, info->packet.vis_orig); 
    395                 seq_printf(seq, "%s,", tmp_addr_str); 
    396396 
    397397                for (i = 0; i < info->packet.entries; i++) { 
    398                         proc_vis_read_entry(seq, &entries[i], &vis_if_list, 
    399                                             info->packet.vis_orig); 
     398                        if (entries[i].quality == 0) 
     399                                continue; 
     400                        proc_vis_insert_interface(entries[i].src, &vis_if_list, 
     401                                compare_orig(entries[i].src, 
     402                                                info->packet.vis_orig)); 
    400403                } 
    401404 
    402                 /* add primary/secondary records */ 
    403                 proc_vis_read_prim_sec(seq, &vis_if_list); 
    404                 seq_printf(seq, "\n"); 
     405                hlist_for_each_entry(entry, pos, &vis_if_list, list) { 
     406                        addr_to_string(tmp_addr_str, entry->addr); 
     407                        seq_printf(seq, "%s,", tmp_addr_str); 
     408 
     409                        for (i = 0; i < info->packet.entries; i++) 
     410                                proc_vis_read_entry(seq, &entries[i], 
     411                                                entry->addr, entry->primary); 
     412 
     413                        /* add primary/secondary records */ 
     414                        if (compare_orig(entry->addr, info->packet.vis_orig)) 
     415                                proc_vis_read_prim_sec(seq, &vis_if_list); 
     416 
     417                        seq_printf(seq, "\n"); 
     418                } 
     419 
     420                hlist_for_each_entry_safe(entry, pos, n, &vis_if_list, list) { 
     421                        hlist_del(&entry->list); 
     422                        kfree(entry); 
     423                } 
    405424        } 
    406425        spin_unlock_irqrestore(&vis_hash_lock, flags); 
  • trunk/batman-adv-kernelland/vis.c

    r1579 r1589  
    8888/* insert interface to the list of interfaces of one originator, if it 
    8989 * does not already exist in the list */ 
    90 static void proc_vis_insert_interface(const uint8_t *interface, 
     90void proc_vis_insert_interface(const uint8_t *interface, 
    9191                                      struct hlist_head *if_list, 
    9292                                      bool primary) 
     
    113113{ 
    114114        struct if_list_entry *entry; 
    115         struct hlist_node *pos, *n; 
     115        struct hlist_node *pos; 
    116116        char tmp_addr_str[ETH_STR_LEN]; 
    117117 
    118         hlist_for_each_entry_safe(entry, pos, n, if_list, list) { 
    119                 if (entry->primary) { 
     118        hlist_for_each_entry(entry, pos, if_list, list) { 
     119                if (entry->primary) 
    120120                        seq_printf(seq, "PRIMARY, "); 
    121                 } else { 
     121                else { 
    122122                        addr_to_string(tmp_addr_str, entry->addr); 
    123123                        seq_printf(seq, "SEC %s, ", tmp_addr_str); 
    124124                } 
    125  
    126                 hlist_del(&entry->list); 
    127                 kfree(entry); 
    128125        } 
    129126} 
     
    132129void proc_vis_read_entry(struct seq_file *seq, 
    133130                                struct vis_info_entry *entry, 
    134                                 struct hlist_head *if_list, 
    135                                 uint8_t *vis_orig) 
     131                                uint8_t *src, 
     132                                bool primary) 
    136133{ 
    137134        char to[40]; 
    138135 
    139136        addr_to_string(to, entry->dest); 
    140         if (entry->quality == 0) { 
    141                 proc_vis_insert_interface(vis_orig, if_list, true); 
     137        if (primary && entry->quality == 0) 
    142138                seq_printf(seq, "HNA %s, ", to); 
    143         } else { 
    144                 proc_vis_insert_interface(entry->src, if_list, 
    145                                           compare_orig(entry->src, vis_orig)); 
     139        else if (compare_orig(entry->src, src)) 
    146140                seq_printf(seq, "TQ %s %d, ", to, entry->quality); 
    147         } 
    148141} 
    149142 
  • trunk/batman-adv-kernelland/vis.h

    r1579 r1589  
    5050extern spinlock_t vis_hash_lock; 
    5151 
     52void proc_vis_insert_interface(const uint8_t *interface, 
     53                                      struct hlist_head *if_list, 
     54                                      bool primary); 
    5255void proc_vis_read_entry(struct seq_file *seq, 
    5356                                struct vis_info_entry *entry, 
    54                                 struct hlist_head *if_list, 
    55                                 uint8_t *vis_orig); 
     57                                uint8_t *src, 
     58                                bool primary); 
    5659void proc_vis_read_prim_sec(struct seq_file *seq, 
    5760                            struct hlist_head *if_list);