static void hna_local_purge(struct work_struct *work) { struct delayed_work *delayed_work = container_of(work, struct delayed_work, work); struct bat_priv *bat_priv = container_of(delayed_work, struct bat_priv, hna_work); struct hna_local_entry *hna_local_entry; HASHIT(hashit); unsigned long flags; unsigned long timeout; spin_lock_irqsave(&bat_priv->hna_lhash_lock, flags); while (hash_iterate(bat_priv->hna_local_hash, &hashit)) { hna_local_entry = hashit.bucket->data; timeout = hna_local_entry->last_seen + LOCAL_HNA_TIMEOUT * HZ; if ((!hna_local_entry->never_purge) && time_after(jiffies, timeout)) hna_local_del(bat_priv, hna_local_entry, "address timed out"); } spin_unlock_irqrestore(&bat_priv->hna_lhash_lock, flags); hna_local_start_timer(bat_priv); }
int hna_local_init(void) { if (hna_local_hash) return 1; hna_local_hash = hash_new(128, compare_orig, choose_orig); if (!hna_local_hash) return 0; atomic_set(&hna_local_changed, 0); hna_local_start_timer(); return 1; }
int hna_local_init(struct bat_priv *bat_priv) { if (bat_priv->hna_local_hash) return 1; bat_priv->hna_local_hash = hash_new(128, compare_orig, choose_orig); if (!bat_priv->hna_local_hash) return 0; atomic_set(&bat_priv->hna_local_changed, 0); hna_local_start_timer(bat_priv); return 1; }
void hna_local_purge(struct work_struct *work) { struct hna_local_entry *hna_local_entry; struct hash_it_t *hashit = NULL; unsigned long flags; unsigned long timeout; spin_lock_irqsave(&hna_local_hash_lock, flags); while (NULL != (hashit = hash_iterate(hna_local_hash, hashit))) { hna_local_entry = hashit->bucket->data; timeout = hna_local_entry->last_seen + ((LOCAL_HNA_TIMEOUT / 1000) * HZ); if ((!hna_local_entry->never_purge) && time_after(jiffies, timeout)) hna_local_del(hna_local_entry, "address timed out"); } spin_unlock_irqrestore(&hna_local_hash_lock, flags); hna_local_start_timer(); }