Skip to content
  • Ondřej Surý's avatar
    Use IP_RECVERR / IPV6_RECVERR to learn about ICMP destination unreachable · 06bd8da9
    Ondřej Surý authored and Ondřej Surý's avatar Ondřej Surý committed
    BIND 9 uses a connect()ed UDP socket when sending recursive queries.
    The connect()ed socket provides feedback on a variety of ICMP
    errors (e.g.  port unreachable) which BIND 9 can then use to decide what
    to do with errors (report them to the client, try again with a different
    nameserver etc).
    
    However, Linux's implementation does not report what it considers
    "transient" conditions, which is defined as Destination Host
    Unreachable, Destination Network Unreachable, Source Route Failed and
    Message Too Big.
    
    BIND 9 now uses set setsockopt(fd, SOL_IP(V6), IP(V6)_RECVERR, &one,
    sizeof(one)); and receive a EPOLL_ERR, and recvmsg return value so that
    it notices that the send has failed immediately rather than waiting for
    a timeout.
    06bd8da9