diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-04-03 17:49:19 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-04-09 14:16:12 +0200 |
commit | eb97214161e5561278e538f3741ae2cf1d762162 (patch) | |
tree | 800646119f4c2ee067ced8659d6d7e58599187a1 | |
parent | 0d1251159cd8dcddf5a6c18b9bb5df0a5c15cd2a (diff) |
udpsrc: Allow specifying the multicast-iface as an IPv4 address0.10
This is currently the only way to select an interface on Windows
before Vista.
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | gst/udp/gstdynudpsink.c | 3 | ||||
-rw-r--r-- | gst/udp/gstmultiudpsink.c | 6 | ||||
-rw-r--r-- | gst/udp/gstudpnetutils.c | 23 |
4 files changed, 22 insertions, 12 deletions
diff --git a/configure.ac b/configure.ac index e3eb71b4f..53b34b156 100644 --- a/configure.ac +++ b/configure.ac @@ -198,8 +198,8 @@ dnl Check for mmap (needed by electricfence plugin) AC_FUNC_MMAP AM_CONDITIONAL(GST_HAVE_MMAP, test "x$ac_cv_func_mmap_fixed_mapped" = "xyes") -dnl Check for mmap (needed by electricfence plugin) +AC_CHECK_FUNC(if_nametoindex) AC_CHECK_TYPE([struct ip_mreqn], [ AC_DEFINE(HAVE_IP_MREQN,, [Define if we have struct ip_mreqn])],, [#include <netinet/in.h>]) diff --git a/gst/udp/gstdynudpsink.c b/gst/udp/gstdynudpsink.c index a92cb6b6b..22e86022d 100644 --- a/gst/udp/gstdynudpsink.c +++ b/gst/udp/gstdynudpsink.c @@ -133,8 +133,7 @@ gst_dynudpsink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_set_details_simple (element_class, "UDP packet sender", "Sink/Network", diff --git a/gst/udp/gstmultiudpsink.c b/gst/udp/gstmultiudpsink.c index 754c71ea2..5a1c48962 100644 --- a/gst/udp/gstmultiudpsink.c +++ b/gst/udp/gstmultiudpsink.c @@ -979,8 +979,7 @@ gst_multiudpsink_init_send (GstMultiUDPSink * sink) * maximum of around 100K. Also a minimum of 128 bytes is required on * Linux. */ ret = - setsockopt (sink->sock, SOL_SOCKET, SO_SNDBUF, (void *) &sndsize, - len); + setsockopt (sink->sock, SOL_SOCKET, SO_SNDBUF, (void *) &sndsize, len); if (ret != 0) { GST_ELEMENT_WARNING (sink, RESOURCE, SETTINGS, (NULL), ("Could not create a buffer of requested %d bytes, %d: %s (%d)", @@ -991,8 +990,7 @@ gst_multiudpsink_init_send (GstMultiUDPSink * sink) /* read the value of the receive buffer. Note that on linux this returns 2x the * value we set because the kernel allocates extra memory for metadata. * The default on Linux is about 100K (which is about 50K without metadata) */ - ret = - getsockopt (sink->sock, SOL_SOCKET, SO_SNDBUF, (void *) &sndsize, &len); + ret = getsockopt (sink->sock, SOL_SOCKET, SO_SNDBUF, (void *) &sndsize, &len); if (ret == 0) GST_DEBUG_OBJECT (sink, "have udp buffer of %d bytes", sndsize); else diff --git a/gst/udp/gstudpnetutils.c b/gst/udp/gstudpnetutils.c index bdbffbcec..e0d598a38 100644 --- a/gst/udp/gstudpnetutils.c +++ b/gst/udp/gstudpnetutils.c @@ -203,6 +203,7 @@ gst_udp_join_group (int sockfd, struct sockaddr_storage *addr, gchar * iface) switch (addr->ss_family) { case AF_INET: { + struct in_addr iface_address; #ifdef HAVE_IP_MREQN struct ip_mreqn mreq4; #else @@ -213,12 +214,24 @@ gst_udp_join_group (int sockfd, struct sockaddr_storage *addr, gchar * iface) mreq4.imr_multiaddr.s_addr = ((struct sockaddr_in *) addr)->sin_addr.s_addr; #ifdef HAVE_IP_MREQN - if (iface) - mreq4.imr_ifindex = if_nametoindex (iface); - else + if (iface) { + if (inet_aton (iface, &iface_address) == 0) + mreq4.imr_address = iface_address; +#ifdef HAVE_IF_NAMETOINDEX + else + mreq4.imr_ifindex = if_nametoindex (iface); +#else + else + mreq4.imr_ifindex = 0; /* Pick any. */ +#endif + } else { mreq4.imr_ifindex = 0; /* Pick any. */ + } #else - mreq4.imr_interface.s_addr = INADDR_ANY; + if (iface && inet_aton (iface, &iface_address) == 0) + mreq4.imr_interface = iface_address; + else + mreq4.imr_interface.s_addr = INADDR_ANY; #endif if ((ret = @@ -237,7 +250,7 @@ gst_udp_join_group (int sockfd, struct sockaddr_storage *addr, gchar * iface) &(((struct sockaddr_in6 *) addr)->sin6_addr), sizeof (struct in6_addr)); mreq6.ipv6mr_interface = 0; -#if !defined(G_OS_WIN32) +#if HAVE_IF_NAMETOINDEX if (iface) mreq6.ipv6mr_interface = if_nametoindex (iface); #endif |