aboutsummaryrefslogtreecommitdiff
path: root/sys/ofed
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2016-01-09 16:34:37 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2016-01-09 16:34:37 +0000
commit36402a681f08433cc28c2fde1753b66805dc5cc0 (patch)
tree579c8d1b294a8ca74c13716078c336d35c2125b0 /sys/ofed
parentab707ec6681d72550f820bfc8039d3e4a595e0d0 (diff)
downloadsrc-36402a681f08433cc28c2fde1753b66805dc5cc0.tar.gz
src-36402a681f08433cc28c2fde1753b66805dc5cc0.zip
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
Notes
Notes: svn path=/head/; revision=293544
Diffstat (limited to 'sys/ofed')
-rw-r--r--sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
index e1f2dc082d33..6326bd211e1b 100644
--- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -1260,16 +1260,12 @@ ipoib_output(struct ifnet *ifp, struct mbuf *m,
#if defined(INET) || defined(INET6)
struct llentry *lle = NULL;
#endif
- struct rtentry *rt0 = NULL;
struct ipoib_header *eh;
int error = 0, is_gw = 0;
short type;
- if (ro != NULL) {
- rt0 = ro->ro_rt;
- if (rt0 != NULL && (rt0->rt_flags & RTF_GATEWAY) != 0)
- is_gw = 1;
- }
+ if (ro != NULL)
+ is_gw = (ro->ro_flags & RT_HAS_GW) != 0;
#ifdef MAC
error = mac_ifnet_check_transmit(ifp, m);
if (error)