Lines Matching refs:neigh
56 static void neigh_update_notify(struct neighbour *neigh, u32 nlmsg_pid);
92 static int neigh_blackhole(struct neighbour *neigh, struct sk_buff *skb) in neigh_blackhole() argument
98 static void neigh_cleanup_and_release(struct neighbour *neigh) in neigh_cleanup_and_release() argument
100 trace_neigh_cleanup_and_release(neigh, 0); in neigh_cleanup_and_release()
101 __neigh_notify(neigh, RTM_DELNEIGH, 0, 0); in neigh_cleanup_and_release()
102 call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh); in neigh_cleanup_and_release()
103 neigh_release(neigh); in neigh_cleanup_and_release()
179 static void neigh_update_flags(struct neighbour *neigh, u32 flags, int *notify, in neigh_update_flags() argument
182 u32 ndm_flags, old_flags = neigh->flags; in neigh_update_flags()
192 neigh->flags |= NTF_EXT_LEARNED; in neigh_update_flags()
194 neigh->flags &= ~NTF_EXT_LEARNED; in neigh_update_flags()
200 neigh->flags |= NTF_MANAGED; in neigh_update_flags()
202 neigh->flags &= ~NTF_MANAGED; in neigh_update_flags()
215 struct neighbour *neigh; in neigh_del() local
217 neigh = rcu_dereference_protected(n->next, in neigh_del()
219 rcu_assign_pointer(*np, neigh); in neigh_del()
912 void neigh_destroy(struct neighbour *neigh) in neigh_destroy() argument
914 struct net_device *dev = neigh->dev; in neigh_destroy()
916 NEIGH_CACHE_STAT_INC(neigh->tbl, destroys); in neigh_destroy()
918 if (!neigh->dead) { in neigh_destroy()
919 pr_warn("Destroying alive neighbour %p\n", neigh); in neigh_destroy()
924 if (neigh_del_timer(neigh)) in neigh_destroy()
927 write_lock_bh(&neigh->lock); in neigh_destroy()
928 __skb_queue_purge(&neigh->arp_queue); in neigh_destroy()
929 write_unlock_bh(&neigh->lock); in neigh_destroy()
930 neigh->arp_queue_len_bytes = 0; in neigh_destroy()
933 dev->netdev_ops->ndo_neigh_destroy(dev, neigh); in neigh_destroy()
935 netdev_put(dev, &neigh->dev_tracker); in neigh_destroy()
936 neigh_parms_put(neigh->parms); in neigh_destroy()
938 neigh_dbg(2, "neigh %p is destroyed\n", neigh); in neigh_destroy()
940 atomic_dec(&neigh->tbl->entries); in neigh_destroy()
941 kfree_rcu(neigh, rcu); in neigh_destroy()
950 static void neigh_suspect(struct neighbour *neigh) in neigh_suspect() argument
952 neigh_dbg(2, "neigh %p is suspected\n", neigh); in neigh_suspect()
954 neigh->output = neigh->ops->output; in neigh_suspect()
962 static void neigh_connect(struct neighbour *neigh) in neigh_connect() argument
964 neigh_dbg(2, "neigh %p is connected\n", neigh); in neigh_connect()
966 neigh->output = neigh->ops->connected_output; in neigh_connect()
1061 static void neigh_invalidate(struct neighbour *neigh) in neigh_invalidate() argument
1062 __releases(neigh->lock) in neigh_invalidate()
1063 __acquires(neigh->lock) in neigh_invalidate()
1067 NEIGH_CACHE_STAT_INC(neigh->tbl, res_failed); in neigh_invalidate()
1068 neigh_dbg(2, "neigh %p is failed\n", neigh); in neigh_invalidate()
1069 neigh->updated = jiffies; in neigh_invalidate()
1076 while (neigh->nud_state == NUD_FAILED && in neigh_invalidate()
1077 (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) { in neigh_invalidate()
1078 write_unlock(&neigh->lock); in neigh_invalidate()
1079 neigh->ops->error_report(neigh, skb); in neigh_invalidate()
1080 write_lock(&neigh->lock); in neigh_invalidate()
1082 __skb_queue_purge(&neigh->arp_queue); in neigh_invalidate()
1083 neigh->arp_queue_len_bytes = 0; in neigh_invalidate()
1086 static void neigh_probe(struct neighbour *neigh) in neigh_probe() argument
1087 __releases(neigh->lock) in neigh_probe()
1089 struct sk_buff *skb = skb_peek_tail(&neigh->arp_queue); in neigh_probe()
1093 write_unlock(&neigh->lock); in neigh_probe()
1094 if (neigh->ops->solicit) in neigh_probe()
1095 neigh->ops->solicit(neigh, skb); in neigh_probe()
1096 atomic_inc(&neigh->probes); in neigh_probe()
1105 struct neighbour *neigh = from_timer(neigh, t, timer); in neigh_timer_handler() local
1109 write_lock(&neigh->lock); in neigh_timer_handler()
1111 state = neigh->nud_state; in neigh_timer_handler()
1120 neigh->confirmed + neigh->parms->reachable_time)) { in neigh_timer_handler()
1121 neigh_dbg(2, "neigh %p is still alive\n", neigh); in neigh_timer_handler()
1122 next = neigh->confirmed + neigh->parms->reachable_time; in neigh_timer_handler()
1124 neigh->used + in neigh_timer_handler()
1125 NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME))) { in neigh_timer_handler()
1126 neigh_dbg(2, "neigh %p is delayed\n", neigh); in neigh_timer_handler()
1127 neigh->nud_state = NUD_DELAY; in neigh_timer_handler()
1128 neigh->updated = jiffies; in neigh_timer_handler()
1129 neigh_suspect(neigh); in neigh_timer_handler()
1130 next = now + NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME); in neigh_timer_handler()
1132 neigh_dbg(2, "neigh %p is suspected\n", neigh); in neigh_timer_handler()
1133 neigh->nud_state = NUD_STALE; in neigh_timer_handler()
1134 neigh->updated = jiffies; in neigh_timer_handler()
1135 neigh_suspect(neigh); in neigh_timer_handler()
1140 neigh->confirmed + in neigh_timer_handler()
1141 NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME))) { in neigh_timer_handler()
1142 neigh_dbg(2, "neigh %p is now reachable\n", neigh); in neigh_timer_handler()
1143 neigh->nud_state = NUD_REACHABLE; in neigh_timer_handler()
1144 neigh->updated = jiffies; in neigh_timer_handler()
1145 neigh_connect(neigh); in neigh_timer_handler()
1147 next = neigh->confirmed + neigh->parms->reachable_time; in neigh_timer_handler()
1149 neigh_dbg(2, "neigh %p is probed\n", neigh); in neigh_timer_handler()
1150 neigh->nud_state = NUD_PROBE; in neigh_timer_handler()
1151 neigh->updated = jiffies; in neigh_timer_handler()
1152 atomic_set(&neigh->probes, 0); in neigh_timer_handler()
1154 next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME), in neigh_timer_handler()
1159 next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME), HZ/100); in neigh_timer_handler()
1162 if ((neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) && in neigh_timer_handler()
1163 atomic_read(&neigh->probes) >= neigh_max_probes(neigh)) { in neigh_timer_handler()
1164 neigh->nud_state = NUD_FAILED; in neigh_timer_handler()
1166 neigh_invalidate(neigh); in neigh_timer_handler()
1170 if (neigh->nud_state & NUD_IN_TIMER) { in neigh_timer_handler()
1173 if (!mod_timer(&neigh->timer, next)) in neigh_timer_handler()
1174 neigh_hold(neigh); in neigh_timer_handler()
1176 if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) { in neigh_timer_handler()
1177 neigh_probe(neigh); in neigh_timer_handler()
1180 write_unlock(&neigh->lock); in neigh_timer_handler()
1184 neigh_update_notify(neigh, 0); in neigh_timer_handler()
1186 trace_neigh_timer_handler(neigh, 0); in neigh_timer_handler()
1188 neigh_release(neigh); in neigh_timer_handler()
1191 int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb, in __neigh_event_send() argument
1197 write_lock_bh(&neigh->lock); in __neigh_event_send()
1200 if (neigh->nud_state & (NUD_CONNECTED | NUD_DELAY | NUD_PROBE)) in __neigh_event_send()
1202 if (neigh->dead) in __neigh_event_send()
1205 if (!(neigh->nud_state & (NUD_STALE | NUD_INCOMPLETE))) { in __neigh_event_send()
1206 if (NEIGH_VAR(neigh->parms, MCAST_PROBES) + in __neigh_event_send()
1207 NEIGH_VAR(neigh->parms, APP_PROBES)) { in __neigh_event_send()
1210 atomic_set(&neigh->probes, in __neigh_event_send()
1211 NEIGH_VAR(neigh->parms, UCAST_PROBES)); in __neigh_event_send()
1212 neigh_del_timer(neigh); in __neigh_event_send()
1213 neigh->nud_state = NUD_INCOMPLETE; in __neigh_event_send()
1214 neigh->updated = now; in __neigh_event_send()
1219 next = now + max(NEIGH_VAR(neigh->parms, in __neigh_event_send()
1223 neigh_add_timer(neigh, next); in __neigh_event_send()
1225 neigh->nud_state = NUD_FAILED; in __neigh_event_send()
1226 neigh->updated = jiffies; in __neigh_event_send()
1227 write_unlock_bh(&neigh->lock); in __neigh_event_send()
1232 } else if (neigh->nud_state & NUD_STALE) { in __neigh_event_send()
1233 neigh_dbg(2, "neigh %p is delayed\n", neigh); in __neigh_event_send()
1234 neigh_del_timer(neigh); in __neigh_event_send()
1235 neigh->nud_state = NUD_DELAY; in __neigh_event_send()
1236 neigh->updated = jiffies; in __neigh_event_send()
1237 neigh_add_timer(neigh, jiffies + in __neigh_event_send()
1238 NEIGH_VAR(neigh->parms, DELAY_PROBE_TIME)); in __neigh_event_send()
1241 if (neigh->nud_state == NUD_INCOMPLETE) { in __neigh_event_send()
1243 while (neigh->arp_queue_len_bytes + skb->truesize > in __neigh_event_send()
1244 NEIGH_VAR(neigh->parms, QUEUE_LEN_BYTES)) { in __neigh_event_send()
1247 buff = __skb_dequeue(&neigh->arp_queue); in __neigh_event_send()
1250 neigh->arp_queue_len_bytes -= buff->truesize; in __neigh_event_send()
1252 NEIGH_CACHE_STAT_INC(neigh->tbl, unres_discards); in __neigh_event_send()
1255 __skb_queue_tail(&neigh->arp_queue, skb); in __neigh_event_send()
1256 neigh->arp_queue_len_bytes += skb->truesize; in __neigh_event_send()
1262 neigh_probe(neigh); in __neigh_event_send()
1264 write_unlock(&neigh->lock); in __neigh_event_send()
1266 trace_neigh_event_send_done(neigh, rc); in __neigh_event_send()
1270 if (neigh->nud_state & NUD_STALE) in __neigh_event_send()
1272 write_unlock_bh(&neigh->lock); in __neigh_event_send()
1274 trace_neigh_event_send_dead(neigh, 1); in __neigh_event_send()
1279 static void neigh_update_hhs(struct neighbour *neigh) in neigh_update_hhs() argument
1285 if (neigh->dev->header_ops) in neigh_update_hhs()
1286 update = neigh->dev->header_ops->cache_update; in neigh_update_hhs()
1289 hh = &neigh->hh; in neigh_update_hhs()
1292 update(hh, neigh->dev, neigh->ha); in neigh_update_hhs()
1317 static int __neigh_update(struct neighbour *neigh, const u8 *lladdr, in __neigh_update() argument
1327 trace_neigh_update(neigh, lladdr, new, flags, nlmsg_pid); in __neigh_update()
1329 write_lock_bh(&neigh->lock); in __neigh_update()
1331 dev = neigh->dev; in __neigh_update()
1332 old = neigh->nud_state; in __neigh_update()
1335 if (neigh->dead) { in __neigh_update()
1344 neigh_update_flags(neigh, flags, ¬ify, &gc_update, &managed_update); in __neigh_update()
1347 neigh->nud_state = new; in __neigh_update()
1353 neigh_del_timer(neigh); in __neigh_update()
1355 neigh_suspect(neigh); in __neigh_update()
1356 neigh->nud_state = new; in __neigh_update()
1361 neigh_invalidate(neigh); in __neigh_update()
1370 lladdr = neigh->ha; in __neigh_update()
1378 !memcmp(lladdr, neigh->ha, dev->addr_len)) in __neigh_update()
1379 lladdr = neigh->ha; in __neigh_update()
1389 lladdr = neigh->ha; in __neigh_update()
1396 neigh->confirmed = jiffies; in __neigh_update()
1404 if (lladdr != neigh->ha && !(flags & NEIGH_UPDATE_F_OVERRIDE)) { in __neigh_update()
1408 lladdr = neigh->ha; in __neigh_update()
1413 if (lladdr == neigh->ha && new == NUD_STALE && in __neigh_update()
1423 if (new != old || lladdr != neigh->ha) in __neigh_update()
1424 neigh->updated = jiffies; in __neigh_update()
1427 neigh_del_timer(neigh); in __neigh_update()
1429 atomic_set(&neigh->probes, 0); in __neigh_update()
1431 neigh_add_timer(neigh, (jiffies + in __neigh_update()
1433 neigh->parms->reachable_time : in __neigh_update()
1435 neigh->nud_state = new; in __neigh_update()
1439 if (lladdr != neigh->ha) { in __neigh_update()
1440 write_seqlock(&neigh->ha_lock); in __neigh_update()
1441 memcpy(&neigh->ha, lladdr, dev->addr_len); in __neigh_update()
1442 write_sequnlock(&neigh->ha_lock); in __neigh_update()
1443 neigh_update_hhs(neigh); in __neigh_update()
1445 neigh->confirmed = jiffies - in __neigh_update()
1446 (NEIGH_VAR(neigh->parms, BASE_REACHABLE_TIME) << 1); in __neigh_update()
1452 neigh_connect(neigh); in __neigh_update()
1454 neigh_suspect(neigh); in __neigh_update()
1460 while (neigh->nud_state & NUD_VALID && in __neigh_update()
1461 (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) { in __neigh_update()
1463 struct neighbour *n2, *n1 = neigh; in __neigh_update()
1464 write_unlock_bh(&neigh->lock); in __neigh_update()
1486 write_lock_bh(&neigh->lock); in __neigh_update()
1488 __skb_queue_purge(&neigh->arp_queue); in __neigh_update()
1489 neigh->arp_queue_len_bytes = 0; in __neigh_update()
1493 neigh_update_is_router(neigh, flags, ¬ify); in __neigh_update()
1494 write_unlock_bh(&neigh->lock); in __neigh_update()
1496 neigh_update_gc_list(neigh); in __neigh_update()
1498 neigh_update_managed_list(neigh); in __neigh_update()
1500 neigh_update_notify(neigh, nlmsg_pid); in __neigh_update()
1501 trace_neigh_update_done(neigh, err); in __neigh_update()
1505 int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, in neigh_update() argument
1508 return __neigh_update(neigh, lladdr, new, flags, nlmsg_pid, NULL); in neigh_update()
1515 void __neigh_set_probe_once(struct neighbour *neigh) in __neigh_set_probe_once() argument
1517 if (neigh->dead) in __neigh_set_probe_once()
1519 neigh->updated = jiffies; in __neigh_set_probe_once()
1520 if (!(neigh->nud_state & NUD_FAILED)) in __neigh_set_probe_once()
1522 neigh->nud_state = NUD_INCOMPLETE; in __neigh_set_probe_once()
1523 atomic_set(&neigh->probes, neigh_max_probes(neigh)); in __neigh_set_probe_once()
1524 neigh_add_timer(neigh, in __neigh_set_probe_once()
1525 jiffies + max(NEIGH_VAR(neigh->parms, RETRANS_TIME), in __neigh_set_probe_once()
1534 struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev, in neigh_event_ns() local
1536 if (neigh) in neigh_event_ns()
1537 neigh_update(neigh, lladdr, NUD_STALE, in neigh_event_ns()
1539 return neigh; in neigh_event_ns()
1563 int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb) in neigh_resolve_output() argument
1567 if (!neigh_event_send(neigh, skb)) { in neigh_resolve_output()
1569 struct net_device *dev = neigh->dev; in neigh_resolve_output()
1572 if (dev->header_ops->cache && !READ_ONCE(neigh->hh.hh_len)) in neigh_resolve_output()
1573 neigh_hh_init(neigh); in neigh_resolve_output()
1577 seq = read_seqbegin(&neigh->ha_lock); in neigh_resolve_output()
1579 neigh->ha, NULL, skb->len); in neigh_resolve_output()
1580 } while (read_seqretry(&neigh->ha_lock, seq)); in neigh_resolve_output()
1598 int neigh_connected_output(struct neighbour *neigh, struct sk_buff *skb) in neigh_connected_output() argument
1600 struct net_device *dev = neigh->dev; in neigh_connected_output()
1606 seq = read_seqbegin(&neigh->ha_lock); in neigh_connected_output()
1608 neigh->ha, NULL, skb->len); in neigh_connected_output()
1609 } while (read_seqretry(&neigh->ha_lock, seq)); in neigh_connected_output()
1621 int neigh_direct_output(struct neighbour *neigh, struct sk_buff *skb) in neigh_direct_output() argument
1631 struct neighbour *neigh; in neigh_managed_work() local
1634 list_for_each_entry(neigh, &tbl->managed_list, managed_list) in neigh_managed_work()
1635 neigh_event_send_probe(neigh, NULL, false); in neigh_managed_work()
1921 struct neighbour *neigh; in neigh_delete() local
1961 neigh = neigh_lookup(tbl, nla_data(dst_attr), dev); in neigh_delete()
1962 if (neigh == NULL) { in neigh_delete()
1967 err = __neigh_update(neigh, NULL, NUD_FAILED, in neigh_delete()
1971 neigh_release(neigh); in neigh_delete()
1972 neigh_remove_one(neigh, tbl); in neigh_delete()
1989 struct neighbour *neigh; in neigh_add() local
2012 BUILD_BUG_ON(sizeof(neigh->flags) * BITS_PER_BYTE < in neigh_add()
2073 neigh = neigh_lookup(tbl, dst, dev); in neigh_add()
2074 if (neigh == NULL) { in neigh_add()
2089 neigh = ___neigh_create(tbl, dst, dev, in neigh_add()
2093 if (IS_ERR(neigh)) { in neigh_add()
2094 err = PTR_ERR(neigh); in neigh_add()
2100 neigh_release(neigh); in neigh_add()
2110 neigh->protocol = protocol; in neigh_add()
2120 err = __neigh_update(neigh, lladdr, ndm->ndm_state, flags, in neigh_add()
2123 neigh_event_send(neigh, NULL); in neigh_add()
2126 neigh_release(neigh); in neigh_add()
2581 static int neigh_fill_info(struct sk_buff *skb, struct neighbour *neigh, in neigh_fill_info() argument
2594 neigh_flags_ext = neigh->flags >> NTF_EXT_SHIFT; in neigh_fill_info()
2595 neigh_flags = neigh->flags & NTF_OLD_MASK; in neigh_fill_info()
2598 ndm->ndm_family = neigh->ops->family; in neigh_fill_info()
2602 ndm->ndm_type = neigh->type; in neigh_fill_info()
2603 ndm->ndm_ifindex = neigh->dev->ifindex; in neigh_fill_info()
2605 if (nla_put(skb, NDA_DST, neigh->tbl->key_len, neigh->primary_key)) in neigh_fill_info()
2608 read_lock_bh(&neigh->lock); in neigh_fill_info()
2609 ndm->ndm_state = neigh->nud_state; in neigh_fill_info()
2610 if (neigh->nud_state & NUD_VALID) { in neigh_fill_info()
2613 neigh_ha_snapshot(haddr, neigh, neigh->dev); in neigh_fill_info()
2614 if (nla_put(skb, NDA_LLADDR, neigh->dev->addr_len, haddr) < 0) { in neigh_fill_info()
2615 read_unlock_bh(&neigh->lock); in neigh_fill_info()
2620 ci.ndm_used = jiffies_to_clock_t(now - neigh->used); in neigh_fill_info()
2621 ci.ndm_confirmed = jiffies_to_clock_t(now - neigh->confirmed); in neigh_fill_info()
2622 ci.ndm_updated = jiffies_to_clock_t(now - neigh->updated); in neigh_fill_info()
2623 ci.ndm_refcnt = refcount_read(&neigh->refcnt) - 1; in neigh_fill_info()
2624 read_unlock_bh(&neigh->lock); in neigh_fill_info()
2626 if (nla_put_u32(skb, NDA_PROBES, atomic_read(&neigh->probes)) || in neigh_fill_info()
2630 if (neigh->protocol && nla_put_u8(skb, NDA_PROTOCOL, neigh->protocol)) in neigh_fill_info()
2683 static void neigh_update_notify(struct neighbour *neigh, u32 nlmsg_pid) in neigh_update_notify() argument
2685 call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh); in neigh_update_notify()
2686 __neigh_notify(neigh, RTM_NEWNEIGH, 0, nlmsg_pid); in neigh_update_notify()
2993 static int neigh_get_reply(struct net *net, struct neighbour *neigh, in neigh_get_reply() argument
3003 err = neigh_fill_info(skb, neigh, pid, seq, RTM_NEWNEIGH, 0); in neigh_get_reply()
3022 static int pneigh_get_reply(struct net *net, struct pneigh_entry *neigh, in pneigh_get_reply() argument
3032 err = pneigh_fill_info(skb, neigh, pid, seq, RTM_NEWNEIGH, 0, tbl); in pneigh_get_reply()
3049 struct neighbour *neigh; in neigh_get() local
3090 neigh = neigh_lookup(tbl, dst, dev); in neigh_get()
3091 if (!neigh) { in neigh_get()
3096 err = neigh_get_reply(net, neigh, NETLINK_CB(in_skb).portid, in neigh_get()
3099 neigh_release(neigh); in neigh_get()
3167 struct neighbour *neigh; in neigh_xmit() local
3176 neigh = __ipv4_neigh_lookup_noref(dev, key); in neigh_xmit()
3178 neigh = __neigh_lookup_noref(tbl, addr, dev); in neigh_xmit()
3180 if (!neigh) in neigh_xmit()
3181 neigh = __neigh_create(tbl, addr, dev, false); in neigh_xmit()
3182 err = PTR_ERR(neigh); in neigh_xmit()
3183 if (IS_ERR(neigh)) { in neigh_xmit()
3187 err = neigh->output(neigh, skb); in neigh_xmit()