Lines Matching full:entry
106 static inline void lec_arp_hold(struct lec_arp_table *entry) in lec_arp_hold() argument
108 refcount_inc(&entry->usage); in lec_arp_hold()
111 static inline void lec_arp_put(struct lec_arp_table *entry) in lec_arp_put() argument
113 if (refcount_dec_and_test(&entry->usage)) in lec_arp_put()
114 kfree(entry); in lec_arp_put()
222 struct lec_arp_table *entry; in lec_start_xmit() local
293 entry = NULL; in lec_start_xmit()
294 vcc = lec_arp_resolve(priv, dst, is_rdesc, &entry); in lec_start_xmit()
295 pr_debug("%s:vcc:%p vcc_flags:%lx, entry:%p\n", in lec_start_xmit()
296 dev->name, vcc, vcc ? vcc->flags : 0, entry); in lec_start_xmit()
298 if (entry && (entry->tx_wait.qlen < LEC_UNRES_QUE_LEN)) { in lec_start_xmit()
301 skb_queue_tail(&entry->tx_wait, skb); in lec_start_xmit()
303 pr_debug("%s:tx queue full or no arp entry, dropping, MAC address: %pM\n", in lec_start_xmit()
315 while (entry && (skb2 = skb_dequeue(&entry->tx_wait))) { in lec_start_xmit()
339 if (entry) in lec_start_xmit()
340 lec_arp_put(entry); in lec_start_xmit()
359 struct lec_arp_table *entry; in lec_atm_send() local
386 entry = lec_arp_find(priv, mesg->content.normal.mac_addr); in lec_atm_send()
387 lec_arp_remove(priv, entry); in lec_atm_send()
454 pr_debug("%s: entry found, responding to zeppelin\n", in lec_atm_send()
638 struct lec_arp_table *entry; in lec_push() local
656 * the LE_ARP cache entry, delete the LE_ARP cache entry. in lec_push()
661 entry = lec_arp_find(priv, src); in lec_push()
662 if (entry && entry->vcc != vcc) { in lec_push()
663 lec_arp_remove(priv, entry); in lec_push()
664 lec_arp_put(entry); in lec_push()
826 static void lec_info(struct seq_file *seq, struct lec_arp_table *entry) in lec_info() argument
828 seq_printf(seq, "%pM ", entry->mac_addr); in lec_info()
829 seq_printf(seq, "%*phN ", ATM_ESA_LEN, entry->atm_addr); in lec_info()
830 seq_printf(seq, "%s %4.4x", lec_arp_get_status_string(entry->status), in lec_info()
831 entry->flags & 0xffff); in lec_info()
832 if (entry->vcc) in lec_info()
833 seq_printf(seq, "%3d %3d ", entry->vcc->vpi, entry->vcc->vci); in lec_info()
836 if (entry->recv_vcc) { in lec_info()
837 seq_printf(seq, " %3d %3d", entry->recv_vcc->vpi, in lec_info()
838 entry->recv_vcc->vci); in lec_info()
1000 struct lec_arp_table *entry = hlist_entry(state->node, in lec_seq_show() local
1005 lec_info(seq, entry); in lec_seq_show()
1198 * TLVs get freed when entry is killed in lane2_associate_ind()
1200 struct lec_arp_table *entry = lec_arp_find(priv, mac_addr); in lane2_associate_ind()
1202 if (entry == NULL) in lane2_associate_ind()
1205 kfree(entry->tlvs); in lane2_associate_ind()
1207 entry->tlvs = kmemdup(tlvs, sizeoftlvs, GFP_KERNEL); in lane2_associate_ind()
1208 if (entry->tlvs == NULL) in lane2_associate_ind()
1210 entry->sizeoftlvs = sizeoftlvs; in lane2_associate_ind()
1278 static void lec_arp_clear_vccs(struct lec_arp_table *entry) in lec_arp_clear_vccs() argument
1280 if (entry->vcc) { in lec_arp_clear_vccs()
1281 struct atm_vcc *vcc = entry->vcc; in lec_arp_clear_vccs()
1291 vcc->push = entry->old_push; in lec_arp_clear_vccs()
1294 entry->vcc = NULL; in lec_arp_clear_vccs()
1296 if (entry->recv_vcc) { in lec_arp_clear_vccs()
1297 struct atm_vcc *vcc = entry->recv_vcc; in lec_arp_clear_vccs()
1304 entry->recv_vcc->push = entry->old_recv_push; in lec_arp_clear_vccs()
1305 vcc_release_async(entry->recv_vcc, -EPIPE); in lec_arp_clear_vccs()
1307 entry->recv_vcc = NULL; in lec_arp_clear_vccs()
1312 * Insert entry to lec_arp_table
1316 lec_arp_add(struct lec_priv *priv, struct lec_arp_table *entry) in lec_arp_add() argument
1320 tmp = &priv->lec_arp_tables[HASH(entry->mac_addr[ETH_ALEN - 1])]; in lec_arp_add()
1321 hlist_add_head(&entry->next, tmp); in lec_arp_add()
1323 pr_debug("Added entry:%pM\n", entry->mac_addr); in lec_arp_add()
1327 * Remove entry from lec_arp_table
1332 struct lec_arp_table *entry; in lec_arp_remove() local
1350 hlist_for_each_entry(entry, in lec_arp_remove()
1353 entry->atm_addr, ATM_ESA_LEN) == 0) { in lec_arp_remove()
1364 pr_debug("Removed entry:%pM\n", to_remove->mac_addr); in lec_arp_remove()
1498 struct lec_arp_table *entry; in lec_arp_destroy() local
1509 hlist_for_each_entry_safe(entry, next, in lec_arp_destroy()
1511 lec_arp_remove(priv, entry); in lec_arp_destroy()
1512 lec_arp_put(entry); in lec_arp_destroy()
1517 hlist_for_each_entry_safe(entry, next, in lec_arp_destroy()
1519 timer_delete_sync(&entry->timer); in lec_arp_destroy()
1520 lec_arp_clear_vccs(entry); in lec_arp_destroy()
1521 hlist_del(&entry->next); in lec_arp_destroy()
1522 lec_arp_put(entry); in lec_arp_destroy()
1526 hlist_for_each_entry_safe(entry, next, in lec_arp_destroy()
1528 timer_delete_sync(&entry->timer); in lec_arp_destroy()
1529 lec_arp_clear_vccs(entry); in lec_arp_destroy()
1530 hlist_del(&entry->next); in lec_arp_destroy()
1531 lec_arp_put(entry); in lec_arp_destroy()
1535 hlist_for_each_entry_safe(entry, next, &priv->mcast_fwds, next) { in lec_arp_destroy()
1537 lec_arp_clear_vccs(entry); in lec_arp_destroy()
1538 hlist_del(&entry->next); in lec_arp_destroy()
1539 lec_arp_put(entry); in lec_arp_destroy()
1547 * Find entry by mac_address
1553 struct lec_arp_table *entry; in lec_arp_find() local
1558 hlist_for_each_entry(entry, head, next) { in lec_arp_find()
1559 if (ether_addr_equal(mac_addr, entry->mac_addr)) in lec_arp_find()
1560 return entry; in lec_arp_find()
1586 struct lec_arp_table *entry; in lec_arp_expire_arp() local
1588 entry = timer_container_of(entry, t, timer); in lec_arp_expire_arp()
1591 if (entry->status == ESI_ARP_PENDING) { in lec_arp_expire_arp()
1592 if (entry->no_tries <= entry->priv->max_retry_count) { in lec_arp_expire_arp()
1593 if (entry->is_rdesc) in lec_arp_expire_arp()
1594 send_to_lecd(entry->priv, l_rdesc_arp_xmt, in lec_arp_expire_arp()
1595 entry->mac_addr, NULL, NULL); in lec_arp_expire_arp()
1597 send_to_lecd(entry->priv, l_arp_xmt, in lec_arp_expire_arp()
1598 entry->mac_addr, NULL, NULL); in lec_arp_expire_arp()
1599 entry->no_tries++; in lec_arp_expire_arp()
1601 mod_timer(&entry->timer, jiffies + (1 * HZ)); in lec_arp_expire_arp()
1605 /* Unknown/unused vcc expire, remove associated entry */
1628 static bool __lec_arp_check_expire(struct lec_arp_table *entry, in __lec_arp_check_expire() argument
1634 if ((entry->flags) & LEC_REMOTE_FLAG && priv->topology_change) in __lec_arp_check_expire()
1640 now, entry->last_used, time_to_check); in __lec_arp_check_expire()
1641 if (time_after(now, entry->last_used + time_to_check) && in __lec_arp_check_expire()
1642 !(entry->flags & LEC_PERMANENT_FLAG) && in __lec_arp_check_expire()
1643 !(entry->mac_addr[0] & 0x01)) { /* LANE2: 7.1.20 */ in __lec_arp_check_expire()
1644 /* Remove entry */ in __lec_arp_check_expire()
1645 pr_debug("Entry timed out\n"); in __lec_arp_check_expire()
1646 lec_arp_remove(priv, entry); in __lec_arp_check_expire()
1647 lec_arp_put(entry); in __lec_arp_check_expire()
1650 if ((entry->status == ESI_VC_PENDING || in __lec_arp_check_expire()
1651 entry->status == ESI_ARP_PENDING) && in __lec_arp_check_expire()
1652 time_after_eq(now, entry->timestamp + in __lec_arp_check_expire()
1654 entry->timestamp = jiffies; in __lec_arp_check_expire()
1655 entry->packets_flooded = 0; in __lec_arp_check_expire()
1656 if (entry->status == ESI_VC_PENDING) in __lec_arp_check_expire()
1658 entry->mac_addr, in __lec_arp_check_expire()
1659 entry->atm_addr, in __lec_arp_check_expire()
1662 if (entry->status == ESI_FLUSH_PENDING && in __lec_arp_check_expire()
1663 time_after_eq(now, entry->timestamp + in __lec_arp_check_expire()
1665 lec_arp_hold(entry); in __lec_arp_check_expire()
1675 * 2. For each entry, delete entries that have aged past the age limit.
1676 * 3. For each entry, depending on the status of the entry, perform
1694 struct lec_arp_table *entry; in lec_arp_check_expire() local
1703 hlist_for_each_entry_safe(entry, next, in lec_arp_check_expire()
1705 if (__lec_arp_check_expire(entry, now, priv)) { in lec_arp_check_expire()
1707 struct atm_vcc *vcc = entry->vcc; in lec_arp_check_expire()
1711 while ((skb = skb_dequeue(&entry->tx_wait))) in lec_arp_check_expire()
1713 entry->last_used = jiffies; in lec_arp_check_expire()
1714 entry->status = ESI_FORWARD_DIRECT; in lec_arp_check_expire()
1715 lec_arp_put(entry); in lec_arp_check_expire()
1736 struct lec_arp_table *entry; in lec_arp_resolve() local
1753 entry = lec_arp_find(priv, mac_to_find); in lec_arp_resolve()
1755 if (entry) { in lec_arp_resolve()
1756 if (entry->status == ESI_FORWARD_DIRECT) { in lec_arp_resolve()
1758 entry->last_used = jiffies; in lec_arp_resolve()
1759 lec_arp_hold(entry); in lec_arp_resolve()
1760 *ret_entry = entry; in lec_arp_resolve()
1761 found = entry->vcc; in lec_arp_resolve()
1765 * If the LE_ARP cache entry is still pending, reset count to 0 in lec_arp_resolve()
1768 if (entry->status == ESI_ARP_PENDING) in lec_arp_resolve()
1769 entry->no_tries = 0; in lec_arp_resolve()
1776 if (entry->status != ESI_FLUSH_PENDING && in lec_arp_resolve()
1777 entry->packets_flooded < in lec_arp_resolve()
1779 entry->packets_flooded++; in lec_arp_resolve()
1785 * We got here because entry->status == ESI_FLUSH_PENDING in lec_arp_resolve()
1786 * or BUS flood limit was reached for an entry which is in lec_arp_resolve()
1789 lec_arp_hold(entry); in lec_arp_resolve()
1790 *ret_entry = entry; in lec_arp_resolve()
1791 pr_debug("entry->status %d entry->vcc %p\n", entry->status, in lec_arp_resolve()
1792 entry->vcc); in lec_arp_resolve()
1795 /* No matching entry was found */ in lec_arp_resolve()
1796 entry = make_entry(priv, mac_to_find); in lec_arp_resolve()
1797 pr_debug("Making entry\n"); in lec_arp_resolve()
1798 if (!entry) { in lec_arp_resolve()
1802 lec_arp_add(priv, entry); in lec_arp_resolve()
1804 entry->packets_flooded = 1; in lec_arp_resolve()
1805 entry->status = ESI_ARP_PENDING; in lec_arp_resolve()
1806 entry->no_tries = 1; in lec_arp_resolve()
1807 entry->last_used = entry->timestamp = jiffies; in lec_arp_resolve()
1808 entry->is_rdesc = is_rdesc; in lec_arp_resolve()
1809 if (entry->is_rdesc) in lec_arp_resolve()
1814 entry->timer.expires = jiffies + (1 * HZ); in lec_arp_resolve()
1815 entry->timer.function = lec_arp_expire_arp; in lec_arp_resolve()
1816 add_timer(&entry->timer); in lec_arp_resolve()
1831 struct lec_arp_table *entry; in lec_addr_delete() local
1837 hlist_for_each_entry_safe(entry, next, in lec_addr_delete()
1839 if (!memcmp(atm_addr, entry->atm_addr, ATM_ESA_LEN) && in lec_addr_delete()
1841 !(entry->flags & LEC_PERMANENT_FLAG))) { in lec_addr_delete()
1842 lec_arp_remove(priv, entry); in lec_addr_delete()
1843 lec_arp_put(entry); in lec_addr_delete()
1863 struct lec_arp_table *entry, *tmp; in lec_arp_update() local
1870 entry = lec_arp_find(priv, mac_addr); in lec_arp_update()
1871 if (entry == NULL && targetless_le_arp) in lec_arp_update()
1874 * we have no entry in the cache. 7.1.30 in lec_arp_update()
1877 hlist_for_each_entry_safe(entry, next, in lec_arp_update()
1879 if (memcmp(entry->atm_addr, atm_addr, ATM_ESA_LEN) == 0) { in lec_arp_update()
1880 hlist_del(&entry->next); in lec_arp_update()
1881 timer_delete(&entry->timer); in lec_arp_update()
1887 tmp->vcc = entry->vcc; in lec_arp_update()
1888 tmp->old_push = entry->old_push; in lec_arp_update()
1890 timer_delete(&entry->timer); in lec_arp_update()
1891 lec_arp_put(entry); in lec_arp_update()
1892 entry = tmp; in lec_arp_update()
1894 entry->status = ESI_FORWARD_DIRECT; in lec_arp_update()
1895 ether_addr_copy(entry->mac_addr, in lec_arp_update()
1897 entry->last_used = jiffies; in lec_arp_update()
1898 lec_arp_add(priv, entry); in lec_arp_update()
1901 entry->flags |= LEC_REMOTE_FLAG; in lec_arp_update()
1903 entry->flags &= ~LEC_REMOTE_FLAG; in lec_arp_update()
1911 entry = lec_arp_find(priv, mac_addr); in lec_arp_update()
1912 if (!entry) { in lec_arp_update()
1913 entry = make_entry(priv, mac_addr); in lec_arp_update()
1914 if (!entry) in lec_arp_update()
1916 entry->status = ESI_UNKNOWN; in lec_arp_update()
1917 lec_arp_add(priv, entry); in lec_arp_update()
1920 memcpy(entry->atm_addr, atm_addr, ATM_ESA_LEN); in lec_arp_update()
1921 timer_delete(&entry->timer); in lec_arp_update()
1925 if (entry != tmp && in lec_arp_update()
1933 entry->vcc = tmp->vcc; in lec_arp_update()
1934 entry->old_push = tmp->old_push; in lec_arp_update()
1936 entry->status = tmp->status; in lec_arp_update()
1942 entry->flags |= LEC_REMOTE_FLAG; in lec_arp_update()
1944 entry->flags &= ~LEC_REMOTE_FLAG; in lec_arp_update()
1945 if (entry->status == ESI_ARP_PENDING || entry->status == ESI_UNKNOWN) { in lec_arp_update()
1946 entry->status = ESI_VC_PENDING; in lec_arp_update()
1947 send_to_lecd(priv, l_svc_setup, entry->mac_addr, atm_addr, NULL); in lec_arp_update()
1964 struct lec_arp_table *entry; in lec_vcc_added() local
1972 entry = lec_arp_find(priv, bus_mac); in lec_vcc_added()
1973 if (!entry) { in lec_vcc_added()
1974 pr_info("LEC_ARP: Multicast entry not found!\n"); in lec_vcc_added()
1977 memcpy(entry->atm_addr, ioc_data->atm_addr, ATM_ESA_LEN); in lec_vcc_added()
1978 entry->recv_vcc = vcc; in lec_vcc_added()
1979 entry->old_recv_push = old_push; in lec_vcc_added()
1981 entry = make_entry(priv, bus_mac); in lec_vcc_added()
1982 if (entry == NULL) in lec_vcc_added()
1984 timer_delete(&entry->timer); in lec_vcc_added()
1985 memcpy(entry->atm_addr, ioc_data->atm_addr, ATM_ESA_LEN); in lec_vcc_added()
1986 entry->recv_vcc = vcc; in lec_vcc_added()
1987 entry->old_recv_push = old_push; in lec_vcc_added()
1988 hlist_add_head(&entry->next, &priv->mcast_fwds); in lec_vcc_added()
1997 entry = make_entry(priv, bus_mac); in lec_vcc_added()
1998 if (entry == NULL) in lec_vcc_added()
2000 memcpy(entry->atm_addr, ioc_data->atm_addr, ATM_ESA_LEN); in lec_vcc_added()
2001 eth_zero_addr(entry->mac_addr); in lec_vcc_added()
2002 entry->recv_vcc = vcc; in lec_vcc_added()
2003 entry->old_recv_push = old_push; in lec_vcc_added()
2004 entry->status = ESI_UNKNOWN; in lec_vcc_added()
2005 entry->timer.expires = jiffies + priv->vcc_timeout_period; in lec_vcc_added()
2006 entry->timer.function = lec_arp_expire_vcc; in lec_vcc_added()
2007 hlist_add_head(&entry->next, &priv->lec_no_forward); in lec_vcc_added()
2008 add_timer(&entry->timer); in lec_vcc_added()
2015 hlist_for_each_entry(entry, in lec_vcc_added()
2018 (ioc_data->atm_addr, entry->atm_addr, in lec_vcc_added()
2022 entry->vcc ? entry->vcc->vci : 0, in lec_vcc_added()
2023 entry->recv_vcc ? entry->recv_vcc-> in lec_vcc_added()
2026 timer_delete(&entry->timer); in lec_vcc_added()
2027 entry->vcc = vcc; in lec_vcc_added()
2028 entry->old_push = old_push; in lec_vcc_added()
2029 if (entry->status == ESI_VC_PENDING) { in lec_vcc_added()
2032 entry->status = in lec_vcc_added()
2035 entry->timestamp = jiffies; in lec_vcc_added()
2036 entry->status = in lec_vcc_added()
2041 entry->atm_addr, in lec_vcc_added()
2071 entry = make_entry(priv, bus_mac); in lec_vcc_added()
2072 if (!entry) in lec_vcc_added()
2074 entry->vcc = vcc; in lec_vcc_added()
2075 entry->old_push = old_push; in lec_vcc_added()
2076 memcpy(entry->atm_addr, ioc_data->atm_addr, ATM_ESA_LEN); in lec_vcc_added()
2077 eth_zero_addr(entry->mac_addr); in lec_vcc_added()
2078 entry->status = ESI_UNKNOWN; in lec_vcc_added()
2079 hlist_add_head(&entry->next, &priv->lec_arp_empty_ones); in lec_vcc_added()
2080 entry->timer.expires = jiffies + priv->vcc_timeout_period; in lec_vcc_added()
2081 entry->timer.function = lec_arp_expire_vcc; in lec_vcc_added()
2082 add_timer(&entry->timer); in lec_vcc_added()
2092 struct lec_arp_table *entry; in lec_flush_complete() local
2099 hlist_for_each_entry(entry, in lec_flush_complete()
2101 if (entry->flush_tran_id == tran_id && in lec_flush_complete()
2102 entry->status == ESI_FLUSH_PENDING) { in lec_flush_complete()
2104 struct atm_vcc *vcc = entry->vcc; in lec_flush_complete()
2106 lec_arp_hold(entry); in lec_flush_complete()
2109 while ((skb = skb_dequeue(&entry->tx_wait))) in lec_flush_complete()
2111 entry->last_used = jiffies; in lec_flush_complete()
2112 entry->status = ESI_FORWARD_DIRECT; in lec_flush_complete()
2113 lec_arp_put(entry); in lec_flush_complete()
2128 struct lec_arp_table *entry; in lec_set_flush_tran_id() local
2133 hlist_for_each_entry(entry, in lec_set_flush_tran_id()
2135 if (!memcmp(atm_addr, entry->atm_addr, ATM_ESA_LEN)) { in lec_set_flush_tran_id()
2136 entry->flush_tran_id = tran_id; in lec_set_flush_tran_id()
2138 tran_id, entry); in lec_set_flush_tran_id()
2186 struct lec_arp_table *entry; in lec_vcc_close() local
2195 hlist_for_each_entry_safe(entry, next, in lec_vcc_close()
2197 if (vcc == entry->vcc) { in lec_vcc_close()
2198 lec_arp_remove(priv, entry); in lec_vcc_close()
2199 lec_arp_put(entry); in lec_vcc_close()
2206 hlist_for_each_entry_safe(entry, next, in lec_vcc_close()
2208 if (entry->vcc == vcc) { in lec_vcc_close()
2209 lec_arp_clear_vccs(entry); in lec_vcc_close()
2210 timer_delete(&entry->timer); in lec_vcc_close()
2211 hlist_del(&entry->next); in lec_vcc_close()
2212 lec_arp_put(entry); in lec_vcc_close()
2216 hlist_for_each_entry_safe(entry, next, in lec_vcc_close()
2218 if (entry->recv_vcc == vcc) { in lec_vcc_close()
2219 lec_arp_clear_vccs(entry); in lec_vcc_close()
2220 timer_delete(&entry->timer); in lec_vcc_close()
2221 hlist_del(&entry->next); in lec_vcc_close()
2222 lec_arp_put(entry); in lec_vcc_close()
2226 hlist_for_each_entry_safe(entry, next, &priv->mcast_fwds, next) { in lec_vcc_close()
2227 if (entry->recv_vcc == vcc) { in lec_vcc_close()
2228 lec_arp_clear_vccs(entry); in lec_vcc_close()
2230 hlist_del(&entry->next); in lec_vcc_close()
2231 lec_arp_put(entry); in lec_vcc_close()
2245 struct lec_arp_table *entry, *tmp; in lec_arp_check_empties() local
2250 hlist_for_each_entry_safe(entry, next, in lec_arp_check_empties()
2252 if (vcc == entry->vcc) { in lec_arp_check_empties()
2253 timer_delete(&entry->timer); in lec_arp_check_empties()
2254 ether_addr_copy(entry->mac_addr, src); in lec_arp_check_empties()
2255 entry->status = ESI_FORWARD_DIRECT; in lec_arp_check_empties()
2256 entry->last_used = jiffies; in lec_arp_check_empties()
2257 /* We might have got an entry */ in lec_arp_check_empties()
2263 hlist_del(&entry->next); in lec_arp_check_empties()
2264 lec_arp_add(priv, entry); in lec_arp_check_empties()
2268 pr_debug("LEC_ARP: Arp_check_empties: entry not found!\n"); in lec_arp_check_empties()