X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fnetwork%2Fudp.c;h=ab1792e6de2a2587fd4b45cc3a2da4dd92050be0;hb=eb1988c900eee1c0325d56693b575713befb3716;hp=8f6a18f499d88591a0e38ce8c78f815bda576f71;hpb=3c56e7abe9f8ab23ffd69bd8c1a2d38ce9efa6b6;p=vlc diff --git a/src/network/udp.c b/src/network/udp.c index 8f6a18f499..ab1792e6de 100644 --- a/src/network/udp.c +++ b/src/network/udp.c @@ -35,10 +35,6 @@ #include -#ifdef HAVE_SYS_TIME_H -# include -#endif - #include #ifdef WIN32 @@ -146,12 +142,14 @@ static int net_ListenSingle (vlc_object_t *obj, const char *host, int port, memset (&hints, 0, sizeof( hints )); hints.ai_family = family; hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = protocol; hints.ai_flags = AI_PASSIVE; if (host && !*host) host = NULL; - msg_Dbg (obj, "net: opening %s datagram port %d", host ?: "any", port); + msg_Dbg (obj, "net: opening %s datagram port %d", + host ? host : "any", port); int val = vlc_getaddrinfo (obj, host, port, &hints, &res); if (val) @@ -166,24 +164,28 @@ static int net_ListenSingle (vlc_object_t *obj, const char *host, int port, for (const struct addrinfo *ptr = res; ptr != NULL; ptr = ptr->ai_next) { int fd = net_Socket (obj, ptr->ai_family, ptr->ai_socktype, - protocol ?: ptr->ai_protocol); + ptr->ai_protocol); if (fd == -1) { msg_Dbg (obj, "socket error: %m"); continue; } - if (ptr->ai_next != NULL) - { #ifdef IPV6_V6ONLY - if ((ptr->ai_family != AF_INET6) - || setsockopt (fd, SOL_IPV6, IPV6_V6ONLY, &(int){ 0 }, - sizeof (int))) + /* If IPv6 was forced, set IPv6-only mode. + * If IPv4 was forced, do nothing extraordinary. + * If nothing was forced, try dual-mode IPv6. */ + if (ptr->ai_family == AF_INET6) + { + int on = (family == AF_INET6); + setsockopt (fd, SOL_IPV6, IPV6_V6ONLY, &on, sizeof (on)); + } + if (ptr->ai_family == AF_INET) #endif - { - msg_Err (obj, "Multiple network protocols present"); - msg_Err (obj, "Please select network protocol manually"); - } + if (family == AF_UNSPEC && ptr->ai_next != NULL) + { + msg_Warn (obj, "ambiguous network protocol specification"); + msg_Warn (obj, "please select IP version explicitly"); } fd = net_SetupDgramSocket( obj, fd, ptr ); @@ -628,25 +630,26 @@ static int net_SetDSCP( int fd, uint8_t dscp ) return setsockopt( fd, level, cmd, &(int){ dscp }, sizeof (int)); } - +#undef net_ConnectDgram /***************************************************************************** - * __net_ConnectDgram: + * net_ConnectDgram: ***************************************************************************** * Open a datagram socket to send data to a defined destination, with an * optional hop limit. *****************************************************************************/ -int __net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port, - int i_hlim, int proto ) +int net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port, + int i_hlim, int proto ) { struct addrinfo hints, *res, *ptr; int i_val, i_handle = -1; bool b_unreach = false; - if( i_hlim < 1 ) + if( i_hlim < 0 ) i_hlim = var_CreateGetInteger( p_this, "ttl" ); memset( &hints, 0, sizeof( hints ) ); hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = proto; msg_Dbg( p_this, "net: connecting to [%s]:%d", psz_host, i_port ); @@ -662,7 +665,7 @@ int __net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port, { char *str; int fd = net_Socket (p_this, ptr->ai_family, ptr->ai_socktype, - proto ?: ptr->ai_protocol); + ptr->ai_protocol); if (fd == -1) continue; @@ -676,7 +679,7 @@ int __net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port, setsockopt (fd, SOL_SOCKET, SO_BROADCAST, &(int){ 1 }, sizeof (int)); #endif - if( i_hlim > 0 ) + if( i_hlim >= 0 ) net_SetMcastHopLimit( p_this, fd, ptr->ai_family, i_hlim ); str = var_CreateGetNonEmptyString (p_this, "miface"); @@ -729,15 +732,15 @@ int __net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port, return i_handle; } - +#undef net_OpenDgram /***************************************************************************** - * __net_OpenDgram: + * net_OpenDgram: ***************************************************************************** * OpenDgram a datagram socket and return a handle *****************************************************************************/ -int __net_OpenDgram( vlc_object_t *obj, const char *psz_bind, int i_bind, - const char *psz_server, int i_server, - int family, int protocol ) +int net_OpenDgram( vlc_object_t *obj, const char *psz_bind, int i_bind, + const char *psz_server, int i_server, + int family, int protocol ) { if ((psz_server == NULL) || (psz_server[0] == '\0')) return net_ListenSingle (obj, psz_bind, i_bind, family, protocol); @@ -751,6 +754,7 @@ int __net_OpenDgram( vlc_object_t *obj, const char *psz_bind, int i_bind, memset (&hints, 0, sizeof (hints)); hints.ai_family = family; hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = protocol; val = vlc_getaddrinfo (obj, psz_server, i_server, &hints, &rem); if (val) @@ -773,7 +777,7 @@ int __net_OpenDgram( vlc_object_t *obj, const char *psz_bind, int i_bind, for (struct addrinfo *ptr = loc; ptr != NULL; ptr = ptr->ai_next) { int fd = net_Socket (obj, ptr->ai_family, ptr->ai_socktype, - protocol ?: ptr->ai_protocol); + ptr->ai_protocol); if (fd == -1) continue; // usually, address family not supported