History log of /src/sys/net/if_llatbl.c |
Revision | | Date | Author | Comments |
1.35 |
| 19-Nov-2022 |
yamt | Make arp have its own mowner
This helped me to debug mbuf leaks in arp. (if_arp.c rev. 1.298)
|
1.34 |
| 24-May-2022 |
andvar | fix various typos in comment, documentation and log messages.
|
1.33 |
| 11-Sep-2020 |
roy | ARP: Use ND rather than our own.
This brings the benefit of Neighbour Unreachability Detection which is something ARP sorely lacks.
The new timings mirror those of IPv6 and are adjustable via sysctl(8). Unlike IPv6 ND, these are global and not per interface.
|
1.32 |
| 11-Sep-2020 |
roy | if_llatbl.c: adjust for nd changes
|
1.31 |
| 25-Sep-2019 |
ozaki-r | Make panic messages more informative
|
1.30 |
| 10-Jul-2018 |
kre | UPdate previous so that there is no unused (but assigned) variable left when there is no ARP. Thanks gcc!
|
1.29 |
| 10-Jul-2018 |
kre | Avoid attempting to call arp related functions if there is no arp in the kernel.
|
1.28 |
| 10-Jul-2018 |
ozaki-r | Don't overwrite an existing llentry on RTM_ADD to avoid race conditions
Reported and tested by christos@
|
1.27 |
| 05-Jun-2018 |
nonaka | branches: 1.27.2; It is necessary to set wall time instead of monotonic time to rmx_expire.
|
1.26 |
| 06-Mar-2018 |
ozaki-r | Use pool(9) for llentry allocations
llentry is easy to be leaked and pool suits for it because pool is usable to detect leaks.
Also sweep unnecessary wrappers for llentry, in_llentry and in6_llentry.
|
1.25 |
| 06-Mar-2018 |
ozaki-r | Fix memory leaks on arp -d and ndp -d for static entries
We have to delete entries on in_lltable_delete and in6_lltable_delete unconditionally. Note that we don't need to worry about LLE_IFADDR because there is no such entries now.
|
1.24 |
| 06-Mar-2018 |
ozaki-r | Fix reference leaks of llentry
callout_reset and callout_halt can cancel a pending callout without telling us. Detect a cancel and remove a reference by using callout_pending and callout_stop (it's a bit tricy though, we can detect it).
While here, we can remove remaining abuses of mutex_owned for softnet_lock.
|
1.23 |
| 14-Feb-2018 |
maxv | branches: 1.23.2; Remove IFF_STATICARP, we don't support this, and the code is useless in its current form.
ok ozaki-r@
|
1.22 |
| 10-Nov-2017 |
ozaki-r | branches: 1.22.2; Fix a deadlock between a route update and lltable
It happens because rtalloc1 is called from lltable with holding IF_AFDATA_WLOCK.
If a route update is in action, rtalloc1 would wait for its completion with holding IF_AFDATA_WLOCK. At the same moment, a softint (e.g., arpintr) may try to take IF_AFDATA_WLOCK and get stuck on it. Unfortunately the stuck softint prevents the route update from progressing because the route update calls psref_target_destroy that needs the softint to complete.
A resource allocation graph of the senario looks like this: route update =(psref_target_destroy)=> softint => IF_AFDATA_WLOCK =(rt_update_wait)=> route update
Fix the deadlock by pulling rtalloc1 out of the lltable codes inside IF_AFDATA_WLOCK.
Note that the deadlock happens only if NET_MPSAFE is enabled.
|
1.21 |
| 28-Jun-2017 |
ozaki-r | Restore ARP/NDP entries to route show and netstat -r
Requested by dyoung@ some time ago
|
1.20 |
| 23-Jun-2017 |
ozaki-r | Tweak lltable_sysctl_dumparp
- Rename lltable_sysctl_dumparp to lltable_sysctl_dump because it's not only for ARP - Enable it not only for INET but also for INET6
|
1.19 |
| 22-Jun-2017 |
ozaki-r | Purge all related L2 caches on removing a route
The change addresses situations similar to PR 51179.
|
1.18 |
| 03-Mar-2017 |
msaitoh | branches: 1.18.6; Add missing opt_net_mpsafe.h.
|
1.17 |
| 16-Jan-2017 |
christos | ip6_sprintf -> IN6_PRINT so that we pass the size.
|
1.16 |
| 21-Dec-2016 |
ozaki-r | branches: 1.16.2; Fix deadlock between llentry timers and destruction of llentry
llentry timer (of nd6) holds both llentry's lock and softnet_lock. A caller also holds them and calls callout_halt to wait for the timer to quit. However we can pass only one lock to callout_halt, so passing either of them can cause a deadlock. Fix it by avoid calling callout_halt without holding llentry's lock.
BTW in the first place we cannot pass llentry's lock to callout_halt because it's a rwlock...
|
1.15 |
| 11-Oct-2016 |
roy | Mark arprequest static and introduce arpannounce so that gratuitous ARP requests are only send from valid addresses.
|
1.14 |
| 16-Jun-2016 |
ozaki-r | branches: 1.14.2; Use if_get_byindex instead of if_byindex for MP-safe
|
1.13 |
| 06-Apr-2016 |
ozaki-r | Fill rtm_addrs properly
This fixes that arp(8) on some archs (only 32bit?) shows "(weird)" for every entries unexpectedly.
Confirmed on evbarm by ryo@ and i386 by me.
|
1.12 |
| 06-Apr-2016 |
ozaki-r | Fill sdl with sockaddr_dl_init
And add an assertion of if_addrlen and ll_addr.
From christos@
|
1.11 |
| 04-Apr-2016 |
ozaki-r | Separate nexthop caches from the routing table
By this change, nexthop caches (IP-MAC address pair) are not stored in the routing table anymore. Instead nexthop caches are stored in each network interface; we already have lltable/llentry data structure for this purpose. This change also obsoletes the concept of cloning/cloned routes. Cloned routes no longer exist while cloning routes still exist with renamed to connected routes.
Noticeable changes are: - Nexthop caches aren't listed in route show/netstat -r - sysctl(NET_RT_DUMP) doesn't return them - If RTF_LLDATA is specified, it returns nexthop caches - Several definitions of routing flags and messages are removed - RTF_CLONING, RTF_XRESOLVE, RTF_LLINFO, RTF_CLONED and RTM_RESOLVE - RTF_CONNECTED is added - It has the same value of RTF_CLONING for backward compatibility - route's -xresolve, -[no]cloned and -llinfo options are removed - -[no]cloning remains because it seems there are users - -[no]connected is introduced and recommended to be used instead of -[no]cloning - route show/netstat -r drops some flags - 'L' and 'c' are not seen anymore - 'C' now indicates a connected route - Gateway value of a route of an interface address is now not a L2 address but "link#N" like a connected (cloning) route - Proxy ARP: "arp -s ... pub" doesn't create a route
You can know details of behavior changes by seeing diffs under tests/.
Proposed on tech-net and tech-kern: http://mail-index.netbsd.org/tech-net/2016/03/11/msg005701.html
|
1.10 |
| 16-Feb-2016 |
ozaki-r | Remove workaround for GATEWAY
The workaround was introduced because lltable/llentry uses rwlock but it may be executed in hardware interrupt due to fast forward. Now we don't run fast forward in hardware interrupt anymore, so we can remove the workaround.
|
1.9 |
| 26-Nov-2015 |
ozaki-r | Fix build dependency of if_llatbl.c
if_llatbl.c is required if inet or inet6 is enabled. Depending on ether doesn't suit for NDP case.
|
1.8 |
| 25-Nov-2015 |
ozaki-r | Use lltable/llentry for NDP
lltable and llentry were introduced to replace ARP cache data structure for further restructuring of the routing table: L2 nexthop cache separation. This change replaces the NDP cache data structure (llinfo_nd6) with them as well as ARP.
One noticeable change is for neighbor cache GC mechanism that was introduced to prevent IPv6 DoS attacks. net.inet6.ip6.neighborgcthresh was the max number of caches that we store in the system. After introducing lltable/llentry, the value is changed to be per-interface basis because lltable/llentry stores neighbor caches in each interface separately. And the change brings one degradation; the old GC mechanism dropped exceeded packets based on LRU while the new implementation drops packets in order from the beginning of lltable (a hash table + linked lists). It would be improved in the future.
Added functions in in6.c come from FreeBSD (as of r286629) and are tweaked for NetBSD.
Proposed on tech-kern and tech-net.
|
1.7 |
| 20-Oct-2015 |
ozaki-r | Stop using softnet_lock (fix possible deadlock)
Using softnet_lock for mutual exclusion between lltable_free and arptimer was wrong and had an issue causing a deadlock between them; lltable_free waits arptimer completion by calling callout_halt with softnet_lock that is held in arptimer, however lltable_free also holds llentry's lock that is also held in arptimer so arptimer never obtain the lock and both never go forward eventually. We have to pass llentry's lock to callout_halt instead.
|
1.6 |
| 30-Sep-2015 |
ozaki-r | Make GATEWAY (fastforward) work again
With GATEWAY (fastforward), the whole forwarding processing runs in hardware interrupt context. So we cannot use rwlock for lltable and llentry in that case.
This change replaces rwlock with mutex(IPL_NET) for lltable and llentry when GATEWAY is enabled. We need to tweak locking only around rtree in lltable_free. Other than that, what we need to do is to change macros for locks.
I hope fastforward runs in softint some day in the future...
|
1.5 |
| 28-Sep-2015 |
ozaki-r | Tweak mutex_enter(softnet_lock) position
The previous code took locks the following order: - LLE_WLOCKs - mutex_enter(softnet_lock) - LLE_WUNLOCKs - mutex_exit(softnet_lock)
This fix moves mutex_enter(softnet_lock) before LLE_WLOCKs.
|
1.4 |
| 09-Sep-2015 |
ozaki-r | branches: 1.4.2; Fix race condition on la_rt between lltable_free and other places touching la_rt
We have to touch la_rt always with holding softnet_lock. And we have to use callout_halt with softnet_lock instead of callout_stop for la_timer (arptimer) because arptimer holds softnet_lock inside it.
This fix may solve a kernel panic christos@ encountered.
|
1.3 |
| 31-Aug-2015 |
pooka | #if __NetBSD__ -> #if defined(__NetBSD__)
|
1.2 |
| 31-Aug-2015 |
ozaki-r | Replace ARP cache (llinfo) with lltable/llentry
Highlights of the change are: - Use llentry instead of llinfo to manage ARP caches - ARP specific data are stored in the hashed list of an interface instead of the global list (llinfo_arp) - Fine-grain locking on llentry - arptimer (callout) per ARP cache - the global timer callout with the big locks can be removed (though softnet_lock is still required for now) - net.inet.arp.prune is now obsoleted - it was the interval of the global timer callout - net.inet.arp.refresh is now obsoleted - it was a parameter that prevents expiration of active caches - Removed to simplify the timer logic, but we may be able to restore the feature if really needed
Proposed on tech-kern and tech-net.
|
1.1 |
| 31-Aug-2015 |
ozaki-r | Import lltable/llentry from FreeBSD
lltable/llentry is new L2 nexthop cache data structures that store caches in each interface (struct ifnet). It is imported to replace the current ARP cache implementation that uses the global list with the big kernel lock, and provide fine-grain locking for cache operations. It is also planned to replace NDP caches.
The code is based on FreeBSD's lltable/llentry as of r286629 and tweaked for NetBSD.
|
1.4.2.9 |
| 28-Aug-2017 |
skrll | Sync with HEAD
|
1.4.2.8 |
| 05-Feb-2017 |
skrll | Sync with HEAD
|
1.4.2.7 |
| 05-Dec-2016 |
skrll | Sync with HEAD
|
1.4.2.6 |
| 09-Jul-2016 |
skrll | Sync with HEAD
|
1.4.2.5 |
| 22-Apr-2016 |
skrll | Sync with HEAD
|
1.4.2.4 |
| 19-Mar-2016 |
skrll | Sync with HEAD
|
1.4.2.3 |
| 27-Dec-2015 |
skrll | Sync with HEAD (as of 26th Dec)
|
1.4.2.2 |
| 22-Sep-2015 |
skrll | Sync with HEAD
|
1.4.2.1 |
| 09-Sep-2015 |
skrll | file if_llatbl.c was added on branch nick-nhusb on 2015-09-22 12:06:10 +0000
|
1.14.2.3 |
| 20-Mar-2017 |
pgoyette | Sync with HEAD
|
1.14.2.2 |
| 07-Jan-2017 |
pgoyette | Sync with HEAD. (Note that most of these changes are simply $NetBSD$ tag issues.)
|
1.14.2.1 |
| 04-Nov-2016 |
pgoyette | Sync with HEAD
|
1.16.2.1 |
| 21-Apr-2017 |
bouyer | Sync with HEAD
|
1.18.6.7 |
| 11-Jul-2018 |
martin | Additionally pullup src/sys/net/if_llatbl.c r1.30 to fix build fallout from previous, requested by both ozaki-r (ticket #918) and kre (ticket #920):
Update previous so that there is no unused (but assigned) variable left when there is no ARP. Thanks gcc!
|
1.18.6.6 |
| 10-Jul-2018 |
martin | Additionally pull up the following, requested by ozaki-r in ticket #918:
src/sys/net/if_llatbl.c 1.29
Avoid attempting to call arp related functions if there is no arp in the kernel.
|
1.18.6.5 |
| 10-Jul-2018 |
martin | Pull up following revision(s) (requested by ozaki-r in ticket #918):
sys/net/if_llatbl.c: revision 1.28
Don't overwrite an existing llentry on RTM_ADD to avoid race conditions Reported and tested by christos@
|
1.18.6.4 |
| 09-Jun-2018 |
martin | Pull up following revision(s) (requested by nonaka in ticket #862):
sys/net/if_llatbl.c: revision 1.27
It is necessary to set wall time instead of monotonic time to rmx_expire.
|
1.18.6.3 |
| 13-Mar-2018 |
martin | Pull up following revision(s) (requested by ozaki-r in ticket #622): sys/netinet/if_arp.c: revision 1.270 sys/net/if_llatbl.c: revision 1.24 (patch) sys/net/if_llatbl.c: revision 1.25 sys/net/if_llatbl.c: revision 1.26 sys/net/route.c: revision 1.204 sys/netinet6/in6.c: revision 1.261 sys/netinet6/in6.c: revision 1.262 (patch) sys/netinet6/in6.c: revision 1.263 sys/netinet/in.c: revision 1.216 sys/netinet6/in6.c: revision 1.264 sys/netinet6/nd6.c: revision 1.246 (patch) sys/netinet/if_arp.c: revision 1.269 sys/net/if_llatbl.h: revision 1.14 sys/netinet6/in6.c: revision 1.259 sys/netinet/in.c: revision 1.220 sys/netinet/in.c: revision 1.221 (patch) sys/netinet/in.c: revision 1.222 sys/netinet/in.c: revision 1.223
Suppress noisy debugging outputs Even if DEBUG they are too noisy under load.
Tweak sanity checks
Scheduling a timer of static entries is wrong.
Add assertions
We must not destroy llentries holding mbufs.
Fix reference leaks of llentry callout_reset and callout_halt can cancel a pending callout without telling us. Detect a cancel and remove a reference by using callout_pending and callout_stop (it's a bit tricy though, we can detect it). While here, we can remove remaining abuses of mutex_owned for softnet_lock.
Fix memory leaks on arp -d and ndp -d for static entries We have to delete entries on in_lltable_delete and in6_lltable_delete unconditionally. Note that we don't need to worry about LLE_IFADDR because there is no such entries now.
Use pool(9) for llentry allocations llentry is easy to be leaked and pool suits for it because pool is usable to detect leaks.
Also sweep unnecessary wrappers for llentry, in_llentry and in6_llentry.
|
1.18.6.2 |
| 17-Nov-2017 |
snj | Pull up following revision(s) (requested by ozaki-r in ticket #353): sys/net/if_llatbl.c: 1.22 sys/net/if_llatbl.h: 1.13 sys/netinet/if_arp.c: 1.254 sys/netinet/in.c: 1.208-1.209 sys/netinet6/in6.c: 1.249-1.250 sys/netinet6/nd6.c: 1.237 Remove redundant KASSERTMSG The function is static, has just one caller and the caller does the same check. -- Fix a deadlock between a route update and lltable It happens because rtalloc1 is called from lltable with holding IF_AFDATA_WLOCK. If a route update is in action, rtalloc1 would wait for its completion with holding IF_AFDATA_WLOCK. At the same moment, a softint (e.g., arpintr) may try to take IF_AFDATA_WLOCK and get stuck on it. Unfortunately the stuck softint prevents the route update from progressing because the route update calls psref_target_destroy that needs the softint to complete. A resource allocation graph of the senario looks like this: route update =(psref_target_destroy)=> softint => IF_AFDATA_WLOCK =(rt_update_wait)=> route update Fix the deadlock by pulling rtalloc1 out of the lltable codes inside IF_AFDATA_WLOCK. Note that the deadlock happens only if NET_MPSAFE is enabled.
|
1.18.6.1 |
| 07-Jul-2017 |
martin | Pull up following revision(s) (requested by ozaki-r in ticket #107): usr.sbin/arp/arp.c: revision 1.56 sys/net/rtsock.c: revision 1.218 sys/net/if_llatbl.c: revision 1.20 usr.sbin/arp/arp.c: revision 1.57 sys/net/rtsock.c: revision 1.219 sys/net/if_llatbl.c: revision 1.21 usr.sbin/arp/arp.c: revision 1.58 tests/net/net_common.sh: revision 1.19 sys/netinet6/nd6.h: revision 1.84 sys/netinet6/nd6.h: revision 1.85 tests/net/arp/t_arp.sh: revision 1.23 sys/netinet6/in6.c: revision 1.246 tests/net/arp/t_arp.sh: revision 1.24 sys/netinet6/in6.c: revision 1.247 tests/net/arp/t_arp.sh: revision 1.25 sys/netinet6/in6.c: revision 1.248 tests/net/arp/t_arp.sh: revision 1.26 usr.sbin/ndp/ndp.c: revision 1.49 tests/net/arp/t_arp.sh: revision 1.27 tests/net/ndp/t_ndp.sh: revision 1.20 tests/net/arp/t_arp.sh: revision 1.28 tests/net/ndp/t_ndp.sh: revision 1.21 tests/net/arp/t_arp.sh: revision 1.29 tests/net/ndp/t_ndp.sh: revision 1.22 tests/net/ndp/t_ndp.sh: revision 1.23 tests/net/route/t_flags6.sh: revision 1.13 tests/net/ndp/t_ndp.sh: revision 1.24 tests/net/route/t_flags6.sh: revision 1.14 tests/net/ndp/t_ndp.sh: revision 1.25 tests/net/route/t_flags6.sh: revision 1.15 tests/net/ndp/t_ndp.sh: revision 1.26 sbin/route/rtutil.c: revision 1.9 tests/net/ndp/t_ndp.sh: revision 1.27 tests/net/ndp/t_ndp.sh: revision 1.28 tests/net/net/t_ipv6address.sh: revision 1.14 tests/net/ndp/t_ra.sh: revision 1.28 tests/net/ndp/t_ndp.sh: revision 1.29 sys/net/route.h: revision 1.113 tests/net/ndp/t_ra.sh: revision 1.29 sys/net/rtsock.c: revision 1.220 sys/net/rtsock.c: revision 1.221 sys/net/rtsock.c: revision 1.222 sys/net/rtsock.c: revision 1.223 tests/net/route/t_route.sh: revision 1.13 sys/net/rtsock.c: revision 1.224 sys/net/route.c: revision 1.196 sys/net/if_llatbl.c: revision 1.19 sys/net/route.c: revision 1.197 sbin/route/route.c: revision 1.156 tests/net/route/t_flags.sh: revision 1.16 tests/net/route/t_flags.sh: revision 1.17 usr.sbin/ndp/ndp.c: revision 1.50 tests/net/route/t_flags.sh: revision 1.18 sys/netinet/in.c: revision 1.204 tests/net/route/t_flags.sh: revision 1.19 sys/netinet/in.c: revision 1.205 tests/net/arp/t_arp.sh: revision 1.30 tests/net/arp/t_arp.sh: revision 1.31 sys/net/if_llatbl.h: revision 1.11 tests/net/arp/t_arp.sh: revision 1.32 sys/net/if_llatbl.h: revision 1.12 tests/net/arp/t_arp.sh: revision 1.33 sys/netinet6/nd6.c: revision 1.233 sys/netinet6/nd6.c: revision 1.234 sys/netinet/if_arp.c: revision 1.251 sys/netinet6/nd6.c: revision 1.235 sys/netinet/if_arp.c: revision 1.252 sbin/route/route.8: revision 1.57 sys/net/rtsock.c: revision 1.214 sys/net/rtsock.c: revision 1.215 sys/net/rtsock.c: revision 1.216 sys/net/rtsock.c: revision 1.217 whitespace police Simplify We can assume that rt_ifp is always non-NULL. Sending a routing message (RTM_ADD) on adding an llentry A message used to be sent on adding a cloned route. Restore the behavior for backward compatibility. Requested by ryo@ Drop RTF_CONNECTED from a result of RTM_GET for ARP/NDP entries ARP/NDP entries aren't connected routes. Reported by ryo@ Support -c <count> option for route monitor route command exits if it receives <count> routing messages where <count> is a value specified by -c. The option is useful to get only particular message(s) in a test script. Test routing messages emitted on operations of ARP/NDP entries Do netstat -a for an appropriate protocol Add missing declarations for cleanup Set net.inet.arp.keep only if it's required Don't create a permanent L2 cache entry on adding an address to an interface It was created to copy FreeBSD, however actually the cache isn't necessary. Remove it to simplify the code and reduce the cost to maintain it (e.g., keep a consistency with a corresponding local route). Fix typo Fix in_lltable_match_prefix The function has not been used but will be used soon. Remove unused function (nd6_rem_ifa_lle) Allow in6_lltable_free_entry to be called without holding the afdata lock of ifp as well as in_lltable_free_entry This behavior is a bit odd and should be fixed in the future... Purge ARP/NDP entries on an interface when the interface is down Fix PR kern/51179 Purge all related L2 caches on removing a route The change addresses situations similar to PR 51179. Purge L2 caches on changing an interface of a route The change addresses situations similar to PR 51179. Test implicit removals of ARP/NDP entries One test case reproudces PR 51179. Fix build of kernels without both INET and INET6 Tweak lltable_sysctl_dumparp - Rename lltable_sysctl_dumparp to lltable_sysctl_dump because it's not only for ARP - Enable it not only for INET but also for INET6 Fix usage of routing messages on arp -d and ndp -d It didn't work as we expected; we should set RTA_GATEWAY not RTA_IFP on RTM_GET to return an if_index and the kernel should use it on RTM_DELETE. Improve backward compatibility of (fake) routing messages on adding an ARP/NDP entry A message originally included only DST and GATEWAY. Restore it. Fix ifdef; care about a case w/ INET6 and w/o INET Drop RTF_UP from a routing message of a deleted ARP/NDP entry Check existence of ARP/NDP entries Checking ARP/NDP entries is valid rather than checking routes. Fix wrong comment Drop RTF_LLINFO flag (now it's RTF_LLDATA) from local routes They don't have llinfo anymore. And also the change fixes unexpected behavior of ARP proxy. Restore ARP/NDP entries to route show and netstat -r Requested by dyoung@ some time ago Enable to remove multiple ARP/NDP entries for one destination The kernel can have multiple ARP/NDP entries which have an indentical destination on different interfaces. This is normal and can be reproduce easily by ping -I or ping6 -S. We should be able to remove such entries. arp -d <ip> and ndp -d <ip> are changed to fetch all ARP/NDP entries and remove matched entries. So we can remove multiple entries described above. This fetch all and selective removal behavior is the same as arp <ip> and ndp <ip>; they also do fetch all entries and show only matched entries. Related to PR 51179 Check if ARP/NDP entries are purged when a related route is deleted
|
1.22.2.2 |
| 03-Dec-2017 |
jdolecek | update from HEAD
|
1.22.2.1 |
| 10-Nov-2017 |
jdolecek | file if_llatbl.c was added on branch tls-maxphys on 2017-12-03 11:39:02 +0000
|
1.23.2.3 |
| 28-Jul-2018 |
pgoyette | Sync with HEAD
|
1.23.2.2 |
| 25-Jun-2018 |
pgoyette | Sync with HEAD
|
1.23.2.1 |
| 15-Mar-2018 |
pgoyette | Synch with HEAD
|
1.27.2.2 |
| 13-Apr-2020 |
martin | Mostly merge changes from HEAD upto 20200411
|
1.27.2.1 |
| 10-Jun-2019 |
christos | Sync with HEAD
|