Federico Beffa <be...@ieee.org> skribis:

> The error is produced by the system call "setsockopt". Here is the
> part of the strace log showing the error:

[...]

> socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 9
> setsockopt(9, SOL_IP, IP_MULTICAST_TTL, "\4", 1) = 0
> fcntl(9, F_GETFL)                       = 0x2 (flags O_RDWR)
> fcntl(9, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
> socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 10
> setsockopt(10, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
> bind(10, {sa_family=AF_INET, sin_port=htons(1900),
> sin_addr=inet_addr("0.0.0.0")}, 16) = 0
> setsockopt(10, SOL_IP, IP_ADD_MEMBERSHIP, "\357\377\377\372\0\0\0\0",
> 8) = -1 ENODEV (No such device)

[...]

> From the above I understand that libupnp embedded server wants to
> setup multicast, but, as far as I know, this doesn't work with the
> "lo" interface and fails. I do not see a workaround. Anyone?

Yeah <https://bugzilla.redhat.com/show_bug.cgi?id=172350> suggests that
ENODEV is due to the lack of a default route.

Indeed, running that fails:

--8<---------------cut here---------------start------------->8---
(use-modules (guix))

(define build
  #~(begin
      (define %upnp-ipv4-multicast-address
        (inet-pton AF_INET "239.255.255.250"))

      (define %upnp-multicast-port 1900)

      (define %upnp-ipv4-multicast-socket-address
        (make-socket-address AF_INET
                             %upnp-ipv4-multicast-address
                             %upnp-multicast-port))

      (define (open-upnp-socket)
        (let ((s (socket PF_INET SOCK_DGRAM 0)))
          (setsockopt s IPPROTO_IP IP_ADD_MEMBERSHIP
                      (cons %upnp-ipv4-multicast-address INADDR_ANY))
          s))

      (pk (open-upnp-socket))
      (flush-all-ports)
      (mkdir #$output)))

(with-store store
  (run-with-store store
    (mlet %store-monad ((drv (gexp->derivation "test" build)))
      (built-derivations (list drv)))))
--8<---------------cut here---------------end--------------->8---

If we add, before the ‘open-upnp-socket’ call, this line:

--8<---------------cut here---------------start------------->8---
      (system* (string-append #$net-tools "/sbin/route")
               "add" "-net" "default")
--8<---------------cut here---------------end--------------->8---

‘route’ simply fails with:

  SIOCADDRT: Operation not permitted

I don’t know how to work around it.  You may need to disable the tests.

Thanks,
Ludo’.

Reply via email to