]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Finish r275196: do not dereference rtentry in if_output() routines.
authorAlexander V. Chernikov <melifaro@FreeBSD.org>
Sat, 9 Jan 2016 16:34:37 +0000 (16:34 +0000)
committerAlexander V. Chernikov <melifaro@FreeBSD.org>
Sat, 9 Jan 2016 16:34:37 +0000 (16:34 +0000)
commit36402a681f08433cc28c2fde1753b66805dc5cc0
tree579c8d1b294a8ca74c13716078c336d35c2125b0
parentab707ec6681d72550f820bfc8039d3e4a595e0d0
Finish r275196: do not dereference rtentry in if_output() routines.

The only piece of information that is required is rt_flags subset.

In particular, if_loop() requires RTF_REJECT and RTF_BLACKHOLE flags
  to check if this particular mbuf needs to be dropped (and what
  error should be returned).
Note that if_loop() will always return EHOSTUNREACH for "reject" routes
  regardless of RTF_HOST flag existence. This is due to upcoming routing
  changes where RTF_HOST value won't be available as lookup result.

All other functions require RTF_GATEWAY flag to check if they need
  to return EHOSTUNREACH instead of EHOSTDOWN error.

There are 11 places where non-zero 'struct route' is passed to if_output().
For most of the callers (forwarding, bpf, arp) does not care about exact
  error value. In fact, the only place where this result is propagated
  is ip_output(). (ip6_output() passes NULL route to nd6_output_ifp()).

Given that, add 3 new 'struct route' flags (RT_REJECT, RT_BLACKHOLE and
  RT_IS_GW) and inline function (rt_update_ro_flags()) to copy necessary
  rte flags to ro_flags. Call this function in ip_output() after looking up/
  verifying rte.

Reviewed by: ae
sys/net/if_arcsubr.c
sys/net/if_ethersubr.c
sys/net/if_fddisubr.c
sys/net/if_fwsubr.c
sys/net/if_iso88025subr.c
sys/net/if_loop.c
sys/net/route.h
sys/netinet/ip_output.c
sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c