freebsd-dev/sys/net
Alexander V. Chernikov 1fe201c322 Simplify the way of attaching IPv6 link-layer header.
Problem description:
How do we currently perform layer 2 resolution and header imposition:

For IPv4 we have the following chain:
  ip_output() -> (ether|atm|whatever)_output() -> arpresolve()

Lookup is done in proper place (link-layer output routine) and it is possible
  to provide cached lle data.

For IPv6 situation is more complex:
  ip6_output() -> nd6_output() -> nd6_output_ifp() -> (whatever)_output() ->
    nd6_storelladdr()

We have ip6_ouput() which calls nd6_output() instead of link output routine.
nd6_output() does the following:
  * checks if lle exists, creates it if needed (similar to arpresolve())
  * performes lle state transitions (similar to arpresolve())
  * calls nd6_output_ifp() which pushes packets to link output routine along
    with running SeND/MAC hooks regardless of lle state
    (e.g. works as run-hooks placeholder).

After that, iface output routine like ether_output() calls nd6_storelladdr()
  which performs lle lookup once again.

As a result, we perform lookup twice for each outgoing packet for most types
  of interfaces. We also need to maintain runtime-checked table of 'nd6-free'
  interfaces (see nd6_need_cache()).

Fix this behavior by eliminating first ND lookup. To be more specific:
  * make all nd6_output() consumers use nd6_output_ifp() instead
  * rename nd6_output[_slow]() to nd6_resolve_[slow]()
  * convert nd6_resolve() and nd6_resolve_slow() to arpresolve() semantics,
    e.g. copy L2 address to buffer instead of pushing packet towards lower
    layers
  * Make all nd6_storelladdr() users use nd6_resolve()
  * eliminate nd6_storelladdr()

The resulting callchain is the following:
  ip6_output() -> nd6_output_ifp() -> (whatever)_output() -> nd6_resolve()

Error handling:
Currently sending packet to non-existing la results in ip6_<output|forward>
  -> nd6_output() -> nd6_output _lle() which returns 0.
In new scenario packet is propagated to <ether|whatever>_output() ->
  nd6_resolve() which will return EWOULDBLOCK, and that result
  will be converted to 0.

(And EWOULDBLOCK is actually used by IB/TOE code).

Sponsored by:		Yandex LLC
Differential Revision:	https://reviews.freebsd.org/D1469
2015-09-16 14:26:28 +00:00
..
altq Fix the spelling of eri's name. 2015-08-24 23:40:36 +00:00
bpf_buffer.c Remove the sleep from the buffer allocation routine. 2015-07-31 20:25:54 +00:00
bpf_buffer.h
bpf_filter.c
bpf_jitter.c
bpf_jitter.h
bpf_zerocopy.c - Modify vm_page_unwire() and vm_page_enqueue() to directly accept 2014-06-16 18:15:27 +00:00
bpf_zerocopy.h
bpf.c Remove the mtx_sleep() from the kqueue f_event filter. 2015-08-03 22:14:45 +00:00
bpf.h Remove two unnecessary sleeps from the hot path in bpf(4). 2015-07-31 21:43:27 +00:00
bpfdesc.h
bridgestp.c
bridgestp.h
ethernet.h Sync to HEAD@r274766 2014-11-21 01:22:33 +00:00
fddi.h
firewire.h
flowtable.c Start process of removing the use of the deprecated "M_FLOWID" flag 2014-12-01 11:45:24 +00:00
flowtable.h
ieee8023ad_lacp.c Make LAG LACP fast timeout tunable through IOCTL. 2015-08-12 20:21:04 +00:00
ieee8023ad_lacp.h Make LAG LACP fast timeout tunable through IOCTL. 2015-08-12 20:21:04 +00:00
ieee_oui.h
if_arc.h Replace 'struct route *' if_output() argument with 'struct nhop_info *'. 2014-11-09 16:33:04 +00:00
if_arcsubr.c Simplify the way of attaching IPv6 link-layer header. 2015-09-16 14:26:28 +00:00
if_arp.h Remove struct arpcom. It is unused by most interface types, that allocate 2014-11-07 15:14:10 +00:00
if_atm.h Replace 'struct route *' if_output() argument with 'struct nhop_info *'. 2014-11-09 16:33:04 +00:00
if_atmsubr.c Replace 'struct route *' if_output() argument with 'struct nhop_info *'. 2014-11-09 16:33:04 +00:00
if_bridge.c Fix panic when adding vtnet interfaces to a bridge 2015-06-13 19:39:21 +00:00
if_bridgevar.h
if_clone.c Fix group membership of cloned interfaces when one is moved by 2015-03-02 20:00:03 +00:00
if_clone.h Fix group membership of cloned interfaces when one is moved by 2015-03-02 20:00:03 +00:00
if_dead.c Provide a dead version of if_get_counter. 2014-12-12 16:10:42 +00:00
if_debug.c Remove ifq_drops from struct ifqueue. Now queue drops are accounted in 2014-09-19 09:01:19 +00:00
if_disc.c Remove net/route_internal header from if_disc and if_faith. 2014-11-09 16:58:36 +00:00
if_dl.h Constantify lookup key in ifa_ifwith* functions. 2015-09-05 05:33:20 +00:00
if_edsc.c Virtualize if_edsc(4). 2014-10-05 21:27:26 +00:00
if_enc.c Replace 'struct route *' if_output() argument with 'struct nhop_info *'. 2014-11-09 16:33:04 +00:00
if_enc.h
if_epair.c Fix a panic which was reproducible by an infinite loop of 2015-09-02 16:30:45 +00:00
if_ethersubr.c Simplify the way of attaching IPv6 link-layer header. 2015-09-16 14:26:28 +00:00
if_fddisubr.c Simplify the way of attaching IPv6 link-layer header. 2015-09-16 14:26:28 +00:00
if_fwsubr.c Simplify the way of attaching IPv6 link-layer header. 2015-09-16 14:26:28 +00:00
if_gif.c - Remove GIF_{SEND,ACCEPT}_REVETHIP. 2015-09-10 05:59:39 +00:00
if_gif.h - Remove GIF_{SEND,ACCEPT}_REVETHIP. 2015-09-10 05:59:39 +00:00
if_gre.c Add new socket ioctls SIOC[SG]TUNFIB to set FIB number of encapsulated 2015-05-12 07:37:27 +00:00
if_gre.h Extern declarations in C files loses compile-time checking that 2014-12-25 21:32:37 +00:00
if_iso88025subr.c Simplify the way of attaching IPv6 link-layer header. 2015-09-16 14:26:28 +00:00
if_lagg.c Make LAG LACP fast timeout tunable through IOCTL. 2015-08-12 20:21:04 +00:00
if_lagg.h Make LAG LACP fast timeout tunable through IOCTL. 2015-08-12 20:21:04 +00:00
if_llatbl.c * Require explicitl lle unlink prior to calling llentry_delete(). 2015-09-15 06:48:19 +00:00
if_llatbl.h Fix the handling of IPv6 On-Link Redirects. 2015-09-14 19:17:25 +00:00
if_llc.h
if_loop.c Fix if_loop so bpfwrite() can use it regardless of the state of 2015-07-06 02:12:49 +00:00
if_me.c Add new socket ioctls SIOC[SG]TUNFIB to set FIB number of encapsulated 2015-05-12 07:37:27 +00:00
if_media.c Make IFMEDIA_DEBUG a kernel option. 2015-04-21 10:35:23 +00:00
if_media.h ifmedia changes: 2015-04-07 21:31:17 +00:00
if_mib.c Remove SYSCTL_VNET_* macros, and simply put CTLFLAG_VNET where needed. 2014-11-07 09:39:05 +00:00
if_mib.h
if_pflog.h
if_pfsync.h
if_sppp.h
if_spppfr.c Mechanically convert to if_inc_counter(). 2014-09-19 10:39:58 +00:00
if_spppsubr.c Convert in_ifaddr_lock and in6_ifaddr_lock to rmlock. 2015-07-29 08:12:05 +00:00
if_stf.c Ansify if_stf.c 2015-07-31 09:04:22 +00:00
if_tap.c Redo r274966. Instead of global all-interface all-vnet undocumented sysctl, 2015-04-10 09:50:13 +00:00
if_tap.h
if_tapvar.h
if_tun.c * Address review (and add a bit myself). 2015-07-12 18:14:38 +00:00
if_tun.h
if_types.h After r281643 an #ifdef IFT_FOO preprocessor directive returns false, 2015-05-02 20:37:40 +00:00
if_var.h Unify loopback route switching: 2015-09-16 06:23:15 +00:00
if_vlan_var.h Move struct ether_vlan_header to ethernet.h, out of if_vlan_var.h, 2014-11-11 10:22:33 +00:00
if_vlan.c Don't propagate SIOCSIFCAPS from a vlan(4) to its parent. This leads to 2015-04-23 13:19:00 +00:00
if_vxlan.c Start process of removing the use of the deprecated "M_FLOWID" flag 2014-12-01 11:45:24 +00:00
if_vxlan.h Add vxlan interface 2014-10-20 14:42:42 +00:00
if.c Unify loopback route switching: 2015-09-16 06:23:15 +00:00
if.h * Add SIOCGI2C driver ioctl used to retrieve i2c info. 2014-08-29 18:02:58 +00:00
ifq.h Move ALTQ from contrib to net/altq. The ALTQ code is for many years 2015-04-16 20:22:40 +00:00
iso88025.h Replace 'struct route *' if_output() argument with 'struct nhop_info *'. 2014-11-09 16:33:04 +00:00
netisr_internal.h
netisr.c Currently there is no easy way to specify net.isr.maxthreads = all cpus. We need 2015-04-25 16:12:06 +00:00
netisr.h Update the IPv4 input path to handle reassembled frames and incoming frames 2014-09-09 04:18:20 +00:00
netmap_user.h Sync netmap sources with the version in our private tree. 2015-07-10 05:51:36 +00:00
netmap.h Sync netmap sources with the version in our private tree. 2015-07-10 05:51:36 +00:00
paravirt.h Update to the current version of netmap. 2014-08-16 15:00:01 +00:00
pfil.c
pfil.h
pfkeyv2.h looks like all archs either have clang or cdefs included before.. 2015-08-02 21:33:40 +00:00
pfvar.h pf: Remove support for 'scrub fragment crop|drop-ovl' 2015-08-27 21:27:47 +00:00
ppp_defs.h
radix_mpath.c Replace 'struct route *' if_output() argument with 'struct nhop_info *'. 2014-11-09 16:33:04 +00:00
radix_mpath.h
radix.c Follow r256586 and rename the kernel version of the Free() macro to 2015-07-30 02:09:03 +00:00
radix.h Follow r256586 and rename the kernel version of the Free() macro to 2015-07-30 02:09:03 +00:00
raw_cb.c
raw_cb.h
raw_usrreq.c
route.c Fix the handling of IPv6 On-Link Redirects. 2015-09-14 19:17:25 +00:00
route.h Constantify lookup key in ifa_ifwith* functions. 2015-09-05 05:33:20 +00:00
rss_config.c Remove now unused (and #if 0'ed out) headers. 2015-08-29 04:33:31 +00:00
rss_config.h Replace the printf()s with optional rate limited debugging for RSS. 2015-08-28 05:58:16 +00:00
rtsock.c Switch route radix to dual-lock model: 2014-11-10 00:07:06 +00:00
sff8436.h * Update SFF-8024 Identifier constants. 2015-05-16 13:11:35 +00:00
sff8472.h * Update SFF-8024 Identifier constants. 2015-05-16 13:11:35 +00:00
slcompress.c
slcompress.h
toeplitz.c Refactor / restructure the RSS code into generic, IPv4 and IPv6 specific 2015-01-18 18:06:40 +00:00
toeplitz.h Refactor / restructure the RSS code into generic, IPv4 and IPv6 specific 2015-01-18 18:06:40 +00:00
vnet.c
vnet.h Remove SYSCTL_VNET_* macros, and simply put CTLFLAG_VNET where needed. 2014-11-07 09:39:05 +00:00