Lines Matching refs:neigh

56 static void neigh_update_notify(struct neighbour *neigh);
91 static int neigh_blackhole(struct neighbour *neigh, struct sk_buff *skb) in neigh_blackhole() argument
97 static void neigh_cleanup_and_release(struct neighbour *neigh) in neigh_cleanup_and_release() argument
99 if (neigh->parms->neigh_cleanup) in neigh_cleanup_and_release()
100 neigh->parms->neigh_cleanup(neigh); in neigh_cleanup_and_release()
102 __neigh_notify(neigh, RTM_DELNEIGH, 0); in neigh_cleanup_and_release()
103 neigh_release(neigh); in neigh_cleanup_and_release()
683 void neigh_destroy(struct neighbour *neigh) in neigh_destroy() argument
685 struct net_device *dev = neigh->dev; in neigh_destroy()
687 NEIGH_CACHE_STAT_INC(neigh->tbl, destroys); in neigh_destroy()
689 if (!neigh->dead) { in neigh_destroy()
690 pr_warn("Destroying alive neighbour %p\n", neigh); in neigh_destroy()
695 if (neigh_del_timer(neigh)) in neigh_destroy()
698 write_lock_bh(&neigh->lock); in neigh_destroy()
699 __skb_queue_purge(&neigh->arp_queue); in neigh_destroy()
700 write_unlock_bh(&neigh->lock); in neigh_destroy()
701 neigh->arp_queue_len_bytes = 0; in neigh_destroy()
704 dev->netdev_ops->ndo_neigh_destroy(neigh); in neigh_destroy()
707 neigh_parms_put(neigh->parms); in neigh_destroy()
709 neigh_dbg(2, "neigh %p is destroyed\n", neigh); in neigh_destroy()
711 atomic_dec(&neigh->tbl->entries); in neigh_destroy()
712 kfree_rcu(neigh, rcu); in neigh_destroy()
721 static void neigh_suspect(struct neighbour *neigh) in neigh_suspect() argument
723 neigh_dbg(2, "neigh %p is suspected\n", neigh); in neigh_suspect()
725 neigh->output = neigh->ops->output; in neigh_suspect()
733 static void neigh_connect(struct neighbour *neigh) in neigh_connect() argument
735 neigh_dbg(2, "neigh %p is connected\n", neigh); in neigh_connect()
737 neigh->output = neigh->ops->connected_output; in neigh_connect()
829 static void neigh_invalidate(struct neighbour *neigh) in neigh_invalidate() argument
830 __releases(neigh->lock) in neigh_invalidate()
831 __acquires(neigh->lock) in neigh_invalidate()
835 NEIGH_CACHE_STAT_INC(neigh->tbl, res_failed); in neigh_invalidate()
836 neigh_dbg(2, "neigh %p is failed\n", neigh); in neigh_invalidate()
837 neigh->updated = jiffies; in neigh_invalidate()
844 while (neigh->nud_state == NUD_FAILED && in neigh_invalidate()
845 (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) { in neigh_invalidate()
846 write_unlock(&neigh->lock); in neigh_invalidate()
847 neigh->ops->error_report(neigh, skb); in neigh_invalidate()
848 write_lock(&neigh->lock); in neigh_invalidate()
850 __skb_queue_purge(&neigh->arp_queue); in neigh_invalidate()
851 neigh->arp_queue_len_bytes = 0; in neigh_invalidate()
854 static void neigh_probe(struct neighbour *neigh) in neigh_probe() argument
855 __releases(neigh->lock) in neigh_probe()
857 struct sk_buff *skb = skb_peek_tail(&neigh->arp_queue); in neigh_probe()
861 write_unlock(&neigh->lock); in neigh_probe()
862 neigh->ops->solicit(neigh, skb); in neigh_probe()
863 atomic_inc(&neigh->probes); in neigh_probe()
872 struct neighbour *neigh = (struct neighbour *)arg; in neigh_timer_handler() local
876 write_lock(&neigh->lock); in neigh_timer_handler()
878 state = neigh->nud_state; in neigh_timer_handler()
887 neigh->confirmed + neigh->parms->reachable_time)) { in neigh_timer_handler()
888 neigh_dbg(2, "neigh %p is still alive\n", neigh); in neigh_timer_handler()
889 next = neigh->confirmed + neigh->parms->reachable_time; in neigh_timer_handler()
891 neigh->used + in neigh_timer_handler()
892 NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME))) { in neigh_timer_handler()
893 neigh_dbg(2, "neigh %p is delayed\n", neigh); in neigh_timer_handler()
894 neigh->nud_state = NUD_DELAY; in neigh_timer_handler()
895 neigh->updated = jiffies; in neigh_timer_handler()
896 neigh_suspect(neigh); in neigh_timer_handler()
897 next = now + NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME); in neigh_timer_handler()
899 neigh_dbg(2, "neigh %p is suspected\n", neigh); in neigh_timer_handler()
900 neigh->nud_state = NUD_STALE; in neigh_timer_handler()
901 neigh->updated = jiffies; in neigh_timer_handler()
902 neigh_suspect(neigh); in neigh_timer_handler()
907 neigh->confirmed + in neigh_timer_handler()
908 NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME))) { in neigh_timer_handler()
909 neigh_dbg(2, "neigh %p is now reachable\n", neigh); in neigh_timer_handler()
910 neigh->nud_state = NUD_REACHABLE; in neigh_timer_handler()
911 neigh->updated = jiffies; in neigh_timer_handler()
912 neigh_connect(neigh); in neigh_timer_handler()
914 next = neigh->confirmed + neigh->parms->reachable_time; in neigh_timer_handler()
916 neigh_dbg(2, "neigh %p is probed\n", neigh); in neigh_timer_handler()
917 neigh->nud_state = NUD_PROBE; in neigh_timer_handler()
918 neigh->updated = jiffies; in neigh_timer_handler()
919 atomic_set(&neigh->probes, 0); in neigh_timer_handler()
921 next = now + NEIGH_VAR(neigh->parms, RETRANS_TIME); in neigh_timer_handler()
925 next = now + NEIGH_VAR(neigh->parms, RETRANS_TIME); in neigh_timer_handler()
928 if ((neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) && in neigh_timer_handler()
929 atomic_read(&neigh->probes) >= neigh_max_probes(neigh)) { in neigh_timer_handler()
930 neigh->nud_state = NUD_FAILED; in neigh_timer_handler()
932 neigh_invalidate(neigh); in neigh_timer_handler()
936 if (neigh->nud_state & NUD_IN_TIMER) { in neigh_timer_handler()
939 if (!mod_timer(&neigh->timer, next)) in neigh_timer_handler()
940 neigh_hold(neigh); in neigh_timer_handler()
942 if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) { in neigh_timer_handler()
943 neigh_probe(neigh); in neigh_timer_handler()
946 write_unlock(&neigh->lock); in neigh_timer_handler()
950 neigh_update_notify(neigh); in neigh_timer_handler()
952 neigh_release(neigh); in neigh_timer_handler()
955 int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) in __neigh_event_send() argument
960 write_lock_bh(&neigh->lock); in __neigh_event_send()
963 if (neigh->nud_state & (NUD_CONNECTED | NUD_DELAY | NUD_PROBE)) in __neigh_event_send()
965 if (neigh->dead) in __neigh_event_send()
968 if (!(neigh->nud_state & (NUD_STALE | NUD_INCOMPLETE))) { in __neigh_event_send()
969 if (NEIGH_VAR(neigh->parms, MCAST_PROBES) + in __neigh_event_send()
970 NEIGH_VAR(neigh->parms, APP_PROBES)) { in __neigh_event_send()
973 atomic_set(&neigh->probes, in __neigh_event_send()
974 NEIGH_VAR(neigh->parms, UCAST_PROBES)); in __neigh_event_send()
975 neigh->nud_state = NUD_INCOMPLETE; in __neigh_event_send()
976 neigh->updated = now; in __neigh_event_send()
977 next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME), in __neigh_event_send()
979 neigh_add_timer(neigh, next); in __neigh_event_send()
982 neigh->nud_state = NUD_FAILED; in __neigh_event_send()
983 neigh->updated = jiffies; in __neigh_event_send()
984 write_unlock_bh(&neigh->lock); in __neigh_event_send()
989 } else if (neigh->nud_state & NUD_STALE) { in __neigh_event_send()
990 neigh_dbg(2, "neigh %p is delayed\n", neigh); in __neigh_event_send()
991 neigh->nud_state = NUD_DELAY; in __neigh_event_send()
992 neigh->updated = jiffies; in __neigh_event_send()
993 neigh_add_timer(neigh, jiffies + in __neigh_event_send()
994 NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME)); in __neigh_event_send()
997 if (neigh->nud_state == NUD_INCOMPLETE) { in __neigh_event_send()
999 while (neigh->arp_queue_len_bytes + skb->truesize > in __neigh_event_send()
1000 NEIGH_VAR(neigh->parms, QUEUE_LEN_BYTES)) { in __neigh_event_send()
1003 buff = __skb_dequeue(&neigh->arp_queue); in __neigh_event_send()
1006 neigh->arp_queue_len_bytes -= buff->truesize; in __neigh_event_send()
1008 NEIGH_CACHE_STAT_INC(neigh->tbl, unres_discards); in __neigh_event_send()
1011 __skb_queue_tail(&neigh->arp_queue, skb); in __neigh_event_send()
1012 neigh->arp_queue_len_bytes += skb->truesize; in __neigh_event_send()
1018 neigh_probe(neigh); in __neigh_event_send()
1020 write_unlock(&neigh->lock); in __neigh_event_send()
1025 if (neigh->nud_state & NUD_STALE) in __neigh_event_send()
1027 write_unlock_bh(&neigh->lock); in __neigh_event_send()
1033 static void neigh_update_hhs(struct neighbour *neigh) in neigh_update_hhs() argument
1039 if (neigh->dev->header_ops) in neigh_update_hhs()
1040 update = neigh->dev->header_ops->cache_update; in neigh_update_hhs()
1043 hh = &neigh->hh; in neigh_update_hhs()
1046 update(hh, neigh->dev, neigh->ha); in neigh_update_hhs()
1075 int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, in neigh_update() argument
1084 write_lock_bh(&neigh->lock); in neigh_update()
1086 dev = neigh->dev; in neigh_update()
1087 old = neigh->nud_state; in neigh_update()
1093 if (neigh->dead) in neigh_update()
1097 neigh_del_timer(neigh); in neigh_update()
1099 neigh_suspect(neigh); in neigh_update()
1100 neigh->nud_state = new; in neigh_update()
1105 neigh_invalidate(neigh); in neigh_update()
1114 lladdr = neigh->ha; in neigh_update()
1122 !memcmp(lladdr, neigh->ha, dev->addr_len)) in neigh_update()
1123 lladdr = neigh->ha; in neigh_update()
1131 lladdr = neigh->ha; in neigh_update()
1135 neigh->confirmed = jiffies; in neigh_update()
1136 neigh->updated = jiffies; in neigh_update()
1144 if (lladdr != neigh->ha && !(flags & NEIGH_UPDATE_F_OVERRIDE)) { in neigh_update()
1148 lladdr = neigh->ha; in neigh_update()
1153 if (lladdr == neigh->ha && new == NUD_STALE && in neigh_update()
1162 neigh_del_timer(neigh); in neigh_update()
1164 atomic_set(&neigh->probes, 0); in neigh_update()
1166 neigh_add_timer(neigh, (jiffies + in neigh_update()
1168 neigh->parms->reachable_time : in neigh_update()
1170 neigh->nud_state = new; in neigh_update()
1174 if (lladdr != neigh->ha) { in neigh_update()
1175 write_seqlock(&neigh->ha_lock); in neigh_update()
1176 memcpy(&neigh->ha, lladdr, dev->addr_len); in neigh_update()
1177 write_sequnlock(&neigh->ha_lock); in neigh_update()
1178 neigh_update_hhs(neigh); in neigh_update()
1180 neigh->confirmed = jiffies - in neigh_update()
1181 (NEIGH_VAR(neigh->parms, BASE_REACHABLE_TIME) << 1); in neigh_update()
1187 neigh_connect(neigh); in neigh_update()
1189 neigh_suspect(neigh); in neigh_update()
1195 while (neigh->nud_state & NUD_VALID && in neigh_update()
1196 (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) { in neigh_update()
1198 struct neighbour *n2, *n1 = neigh; in neigh_update()
1199 write_unlock_bh(&neigh->lock); in neigh_update()
1221 write_lock_bh(&neigh->lock); in neigh_update()
1223 __skb_queue_purge(&neigh->arp_queue); in neigh_update()
1224 neigh->arp_queue_len_bytes = 0; in neigh_update()
1228 neigh->flags = (flags & NEIGH_UPDATE_F_ISROUTER) ? in neigh_update()
1229 (neigh->flags | NTF_ROUTER) : in neigh_update()
1230 (neigh->flags & ~NTF_ROUTER); in neigh_update()
1232 write_unlock_bh(&neigh->lock); in neigh_update()
1235 neigh_update_notify(neigh); in neigh_update()
1244 void __neigh_set_probe_once(struct neighbour *neigh) in __neigh_set_probe_once() argument
1246 if (neigh->dead) in __neigh_set_probe_once()
1248 neigh->updated = jiffies; in __neigh_set_probe_once()
1249 if (!(neigh->nud_state & NUD_FAILED)) in __neigh_set_probe_once()
1251 neigh->nud_state = NUD_INCOMPLETE; in __neigh_set_probe_once()
1252 atomic_set(&neigh->probes, neigh_max_probes(neigh)); in __neigh_set_probe_once()
1253 neigh_add_timer(neigh, in __neigh_set_probe_once()
1254 jiffies + NEIGH_VAR(neigh->parms, RETRANS_TIME)); in __neigh_set_probe_once()
1262 struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev, in neigh_event_ns() local
1264 if (neigh) in neigh_event_ns()
1265 neigh_update(neigh, lladdr, NUD_STALE, in neigh_event_ns()
1267 return neigh; in neigh_event_ns()
1291 int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb) in neigh_resolve_output() argument
1295 if (!neigh_event_send(neigh, skb)) { in neigh_resolve_output()
1297 struct net_device *dev = neigh->dev; in neigh_resolve_output()
1300 if (dev->header_ops->cache && !neigh->hh.hh_len) in neigh_resolve_output()
1301 neigh_hh_init(neigh); in neigh_resolve_output()
1305 seq = read_seqbegin(&neigh->ha_lock); in neigh_resolve_output()
1307 neigh->ha, NULL, skb->len); in neigh_resolve_output()
1308 } while (read_seqretry(&neigh->ha_lock, seq)); in neigh_resolve_output()
1326 int neigh_connected_output(struct neighbour *neigh, struct sk_buff *skb) in neigh_connected_output() argument
1328 struct net_device *dev = neigh->dev; in neigh_connected_output()
1334 seq = read_seqbegin(&neigh->ha_lock); in neigh_connected_output()
1336 neigh->ha, NULL, skb->len); in neigh_connected_output()
1337 } while (read_seqretry(&neigh->ha_lock, seq)); in neigh_connected_output()
1349 int neigh_direct_output(struct neighbour *neigh, struct sk_buff *skb) in neigh_direct_output() argument
1600 struct neighbour *neigh; in neigh_delete() local
1636 neigh = neigh_lookup(tbl, nla_data(dst_attr), dev); in neigh_delete()
1637 if (neigh == NULL) { in neigh_delete()
1642 err = neigh_update(neigh, NULL, NUD_FAILED, in neigh_delete()
1645 neigh_release(neigh); in neigh_delete()
1659 struct neighbour *neigh; in neigh_add() local
1708 neigh = neigh_lookup(tbl, dst, dev); in neigh_add()
1709 if (neigh == NULL) { in neigh_add()
1715 neigh = __neigh_lookup_errno(tbl, dst, dev); in neigh_add()
1716 if (IS_ERR(neigh)) { in neigh_add()
1717 err = PTR_ERR(neigh); in neigh_add()
1723 neigh_release(neigh); in neigh_add()
1732 neigh_event_send(neigh, NULL); in neigh_add()
1735 err = neigh_update(neigh, lladdr, ndm->ndm_state, flags); in neigh_add()
1736 neigh_release(neigh); in neigh_add()
2148 static int neigh_fill_info(struct sk_buff *skb, struct neighbour *neigh, in neigh_fill_info() argument
2161 ndm->ndm_family = neigh->ops->family; in neigh_fill_info()
2164 ndm->ndm_flags = neigh->flags; in neigh_fill_info()
2165 ndm->ndm_type = neigh->type; in neigh_fill_info()
2166 ndm->ndm_ifindex = neigh->dev->ifindex; in neigh_fill_info()
2168 if (nla_put(skb, NDA_DST, neigh->tbl->key_len, neigh->primary_key)) in neigh_fill_info()
2171 read_lock_bh(&neigh->lock); in neigh_fill_info()
2172 ndm->ndm_state = neigh->nud_state; in neigh_fill_info()
2173 if (neigh->nud_state & NUD_VALID) { in neigh_fill_info()
2176 neigh_ha_snapshot(haddr, neigh, neigh->dev); in neigh_fill_info()
2177 if (nla_put(skb, NDA_LLADDR, neigh->dev->addr_len, haddr) < 0) { in neigh_fill_info()
2178 read_unlock_bh(&neigh->lock); in neigh_fill_info()
2183 ci.ndm_used = jiffies_to_clock_t(now - neigh->used); in neigh_fill_info()
2184 ci.ndm_confirmed = jiffies_to_clock_t(now - neigh->confirmed); in neigh_fill_info()
2185 ci.ndm_updated = jiffies_to_clock_t(now - neigh->updated); in neigh_fill_info()
2186 ci.ndm_refcnt = atomic_read(&neigh->refcnt) - 1; in neigh_fill_info()
2187 read_unlock_bh(&neigh->lock); in neigh_fill_info()
2189 if (nla_put_u32(skb, NDA_PROBES, atomic_read(&neigh->probes)) || in neigh_fill_info()
2232 static void neigh_update_notify(struct neighbour *neigh) in neigh_update_notify() argument
2234 call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh); in neigh_update_notify()
2235 __neigh_notify(neigh, RTM_NEWNEIGH, 0); in neigh_update_notify()
2465 struct neighbour *neigh; in neigh_xmit() local
2470 neigh = __neigh_lookup_noref(tbl, addr, dev); in neigh_xmit()
2471 if (!neigh) in neigh_xmit()
2472 neigh = __neigh_create(tbl, addr, dev, false); in neigh_xmit()
2473 err = PTR_ERR(neigh); in neigh_xmit()
2474 if (IS_ERR(neigh)) in neigh_xmit()
2476 err = neigh->output(neigh, skb); in neigh_xmit()