From: Liam Smith Replace an existing comment which describes obsolete fib_lookup(), MSG_DONTROUTE and IPv6 behavior. Signed-off-by: Liam Smith --- net/ipv4/route.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 03db105303b4..fcdcb63ba09e 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -2856,24 +2856,18 @@ struct rtable *ip_route_output_key_hash_rcu(struct net *net, struct flowi4 *fl4, if (fl4->flowi4_oif && (ipv4_is_multicast(fl4->daddr) || (!fl4->flowi4_l3mdev && err == -ESRCH))) { - /* Apparently, routing tables are wrong. Assume, - * that the destination is on link. + /* When oif is specified, fib_lookup() is called + * primarily to determine if the destination is + * accessible directly or through a gateway. It also + * checks whether there are any traffic restrictions + * (blackhole, prohibit, unreachable), or if there's a + * routing lookup miss. * - * WHY? DW. - * Because we are allowed to send to iface - * even if it has NO routes and NO assigned - * addresses. When oif is specified, routing - * tables are looked up with only one purpose: - * to catch if destination is gatewayed, rather than - * direct. Moreover, if MSG_DONTROUTE is set, - * we send packet, ignoring both routing tables - * and ifaddr state. --ANK - * - * - * We could make it even if oif is unknown, - * likely IPv6, but we do not. + * Multicast is sent regardless of restriction or miss. + * Non-vrf unicast honors restrictions but allows + * oif-bound sends even when oif has no routes. In both + * cases the destination is assumed on-link. */ - if (fl4->saddr == 0) fl4->saddr = inet_select_addr(dev_out, 0, RT_SCOPE_LINK); -- 2.47.3