Set TTL to 255 for outgoing IPv4 unicast packets
authorRafał Miłecki <rafal@milecki.pl>
Mon, 13 Feb 2017 23:14:45 +0000 (00:14 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Tue, 14 Feb 2017 22:13:10 +0000 (23:13 +0100)
1) We SHOULD do this according to the RFC 6762 (Section 11, "Source
   Address Check").
2) We already do it for IPv6 unicast and both multicast interfaces
3) When receiving IPv4 packet we ignore it if TTL doesn't equal 255

In other words this is a requirement for working unicast communication
between 2 umdns instances (which doesn't seem to work yet though).

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Acked-by: John Crispin <john@phrozen.org>
interface.c

index 587b1886c6c1946824acf921cebcb549a9b38695..76820c7739fb8f895ccec0ab91882a4052a040ab 100644 (file)
@@ -389,6 +389,7 @@ static void
 reconnect_socket4(struct uloop_timeout *timeout)
 {
        struct interface *iface = container_of(timeout, struct interface, reconnect);
+       int ttl = 255;
        int yes = 1;
 
        iface->fd.fd = usock(USOCK_UDP | USOCK_SERVER | USOCK_NONBLOCK | USOCK_IPV4ONLY,
@@ -404,6 +405,9 @@ reconnect_socket4(struct uloop_timeout *timeout)
        if (setsockopt(iface->fd.fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0)
                fprintf(stderr, "ioctl failed: SO_REUSEADDR\n");
 
+       if (setsockopt(iface->fd.fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) < 0)
+               fprintf(stderr, "ioctl failed: IP_TTL\n");
+
        if (setsockopt(iface->fd.fd, IPPROTO_IP, IP_RECVTTL, &yes, sizeof(yes)) < 0)
                fprintf(stderr, "ioctl failed: IP_RECVTTL\n");