Hi, please see comments inline.
On Sat, Jan 22, 2011 at 02:21:30AM +0100, Linus Lüssing wrote:
> [...]
> +static int add_router_of_dest(struct dest_entries_list *next_hops,
> + uint8_t *dest, struct bat_priv *bat_priv)
> +{
> + struct dest_entries_list *next_hop_tmp, *next_hop_entry;
> + struct element_t *bucket;
> + struct orig_node *orig_node;
> + struct hashtable_t *hash = bat_priv->orig_hash;
> + struct hlist_node *walk;
> + struct hlist_head *head;
> + int i;
> +
> + next_hop_entry = kmalloc(sizeof(struct dest_entries_list), GFP_ATOMIC);
> + if (!next_hop_entry)
> + return 1;
> +
> + next_hop_entry->batman_if = NULL;
> + for (i = 0; i < hash->size; i++) {
> + head = &hash->table[i];
> +
> + rcu_read_lock();
> + hlist_for_each_entry_rcu(bucket, walk, head, hlist) {
> + orig_node = bucket->data;
> +
> + if (memcmp(orig_node->orig, dest, ETH_ALEN))
> + continue;
> +
Traversing the hash yourself seems pretty redundant. If you need to find a
specific node, you can just use hash_find().
> + if (!orig_node->router) {
> + i = hash->size;
> + break;
> + }
> +
> + memcpy(next_hop_entry->dest, orig_node->router->addr,
> + ETH_ALEN);
> + next_hop_entry->batman_if =
> + orig_node->router->if_incoming;
> + i = hash->size;
> + break;
> + }
> + rcu_read_unlock();
> + }
> [...]
> +static void zero_tracker_packet(struct mcast_tracker_packet *tracker_packet,
> + uint8_t *next_hop, struct bat_priv *bat_priv)
> +{
> + struct tracker_packet_state state;
> +
> + struct element_t *bucket;
> + struct orig_node *orig_node;
> + struct hashtable_t *hash = bat_priv->orig_hash;
> + struct hlist_node *walk;
> + struct hlist_head *head;
> + int i;
> +
> + tracker_packet_for_each_dest(&state, tracker_packet) {
> + for (i = 0; i < hash->size; i++) {
> + head = &hash->table[i];
> +
> + rcu_read_lock();
> + hlist_for_each_entry_rcu(bucket, walk, head, hlist) {
> + orig_node = bucket->data;
> +
> + if (memcmp(orig_node->orig, state.dest_entry,
> + ETH_ALEN))
> + continue;
Same here. Just use hash_find().
> +
> + /* is the next hop already our destination? */
> + if (!memcmp(orig_node->orig, next_hop,
> + ETH_ALEN))
> + memset(state.dest_entry, '\0',
> + ETH_ALEN);
> + else if (!orig_node->router)
> + memset(state.dest_entry, '\0',
> + ETH_ALEN);
> + else if (!memcmp(orig_node->orig,
> + orig_node->router->orig_node->
> + primary_addr, ETH_ALEN))
> + memset(state.dest_entry, '\0',
> + ETH_ALEN);
> + /* is this the wrong next hop for our
> + * destination? */
> + else if (memcmp(orig_node->router->addr,
> + next_hop, ETH_ALEN))
> + memset(state.dest_entry, '\0',
> + ETH_ALEN);
> +
> + i = hash->size;
> + break;
> + }
> + rcu_read_unlock();
> + }
> + }
> +}
signature.asc
Description: Digital signature
