meetecho / janus-gateway

Janus WebRTC Server
https://janus.conf.meetecho.com
GNU General Public License v3.0
8.23k stars 2.48k forks source link

[1.x] can't create socket for streaming endpoint if ipv6 is disabled on host #3470

Open spscream opened 1 week ago

spscream commented 1 week ago

What version of Janus is this happening on? master

Have you tested a more recent version of Janus too? no

Was this working before? I don't have information

Is there a gdb or libasan trace of the issue? no

Additional context We have server with disabled ipv6 and if we create stream with following parameters:

    request_body = %{
      "request" => "create",
      "type" => "rtp",
      "id" => stream_id,
      "name" => description,
      "description" => description,
      "media" => [%{
        "type" => "audio",
        "mid" => "1",
        "port" => 0,
        "pt" => 111,
        "codec" => "opus"
      }]
    }

we got an error:

[ERR] [plugins/janus_streaming.c:janus_streaming_create_fd:7292] [(null)] Cannot create socket for audio... 97 (Address family not supported by protocol)
[ERR] [plugins/janus_streaming.c:janus_streaming_create_rtp_source_stream:7503] [(null)] Can't bind to port 0...
[ERR] [plugins/janus_streaming.c:janus_streaming_process_synchronous_request:3575] Can't add 'rtp' stream '(null)', error creating data source stream...

if I specify iface parameter for create all is working good. I think its due this ternary here(https://github.com/meetecho/janus-gateway/blob/master/src/plugins/janus_streaming.c#L7289):

fd = socket(family == AF_INET ? AF_INET : AF_INET6, SOCK_DGRAM, IPPROTO_UDP);

In case iface isn't set when family is 0, but AF_INET is 2.

nekogasuki91 commented 1 week ago

Hello.

We encountered a similar problem with Janus in a docker container started on a host where IPv6 is disabled and with an RTSP stream. The container is based on a debian:12-slim image.

We patched by adding the line family = AF_INET; just before https://github.com/meetecho/janus-gateway/blob/master/src/plugins/janus_streaming.c#L7289.

It's dirty, but it allowed us to run the stream for test purposes while waiting for a fix or before switching to an alternative solution such as MediaMTX.

lminiero commented 1 week ago

The Streaming plugin probably just needs the ipv6_disabled property we added to other plugins (e.g. AudioBridge and VideoRoom), where we basically try and create an IPv6 socket as soon as the plugin is loaded, and if that fails, we set ipv6_disabled = FALSE which then impacts how sockets are created, for instance:

audiobridge->rtp_udp_sock = socket(!ipv6_disabled ? AF_INET6 : AF_INET, SOCK_DGRAM, IPPROTO_UDP);

There may be a reason why we didn't add it to the Streaming plugin too, back then, but on the top of my head I can't remember if that was the case.