summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2013-04-03 17:49:19 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2013-04-09 14:16:12 +0200
commiteb97214161e5561278e538f3741ae2cf1d762162 (patch)
tree800646119f4c2ee067ced8659d6d7e58599187a1
parent0d1251159cd8dcddf5a6c18b9bb5df0a5c15cd2a (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.ac2
-rw-r--r--gst/udp/gstdynudpsink.c3
-rw-r--r--gst/udp/gstmultiudpsink.c6
-rw-r--r--gst/udp/gstudpnetutils.c23
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