summaryrefslogtreecommitdiffstats
path: root/gst/udp
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2008-05-21 17:35:50 +0000
committerWim Taymans <wim.taymans@gmail.com>2008-05-21 17:35:50 +0000
commite206f74bcea198673e6e64f04218d7c72a56efcd (patch)
tree47ff9b26c2813960bae7c522028e9e7f01773bd1 /gst/udp
parent961eed538b8dff2f9ee059cf2ce45ecf0c715351 (diff)
gst/udp/: Joining a multicast group and setting the loop/ttl properties are totally unrelated tasks are must be separ...
Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal): * gst/udp/gstudpnetutils.c: (gst_udp_set_loop_ttl), (gst_udp_join_group): * gst/udp/gstudpnetutils.h: * gst/udp/gstudpsrc.c: (gst_udpsrc_start): Joining a multicast group and setting the loop/ttl properties are totally unrelated tasks are must be separated.
Diffstat (limited to 'gst/udp')
-rw-r--r--gst/udp/gstmultiudpsink.c7
-rw-r--r--gst/udp/gstudpnetutils.c66
-rw-r--r--gst/udp/gstudpnetutils.h4
-rw-r--r--gst/udp/gstudpsrc.c2
4 files changed, 50 insertions, 29 deletions
diff --git a/gst/udp/gstmultiudpsink.c b/gst/udp/gstmultiudpsink.c
index 237103bd..449bf714 100644
--- a/gst/udp/gstmultiudpsink.c
+++ b/gst/udp/gstmultiudpsink.c
@@ -621,14 +621,14 @@ gst_multiudpsink_init_send (GstMultiUDPSink * sink)
sink->bytes_to_serve = 0;
sink->bytes_served = 0;
+ gst_udp_set_loop_ttl (sink->sock, sink->loop, sink->ttl);
gst_multiudpsink_setup_qos_dscp (sink);
/* look for multicast clients and join multicast groups approptiately */
for (clients = sink->clients; clients; clients = g_list_next (clients)) {
client = (GstUDPClient *) clients->data;
if (gst_udp_is_multicast (&client->theiraddr) && sink->auto_multicast)
- gst_udp_join_group (*(client->sock), sink->loop, sink->ttl,
- &client->theiraddr);
+ gst_udp_join_group (*(client->sock), &client->theiraddr);
}
return TRUE;
@@ -680,8 +680,7 @@ gst_multiudpsink_add_internal (GstMultiUDPSink * sink, const gchar * host,
GST_DEBUG_OBJECT (sink, "multicast address detected");
if (sink->auto_multicast) {
GST_DEBUG_OBJECT (sink, "joining multicast group");
- gst_udp_join_group (*(client->sock), sink->loop, sink->ttl,
- &client->theiraddr);
+ gst_udp_join_group (*(client->sock), &client->theiraddr);
}
} else {
GST_DEBUG_OBJECT (sink, "normal address detected");
diff --git a/gst/udp/gstudpnetutils.c b/gst/udp/gstudpnetutils.c
index b50336f5..ff5e9387 100644
--- a/gst/udp/gstudpnetutils.c
+++ b/gst/udp/gstudpnetutils.c
@@ -91,21 +91,16 @@ gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr)
}
int
-gst_udp_join_group (int sockfd, gboolean loop, int ttl,
- struct sockaddr_storage *addr)
+gst_udp_set_loop_ttl (int sockfd, gboolean loop, int ttl)
{
int ret = -1;
+
+#if 0
int l = (loop == FALSE) ? 0 : 1;
switch (addr->ss_family) {
case AF_INET:
{
- struct ip_mreq mreq4;
-
- mreq4.imr_multiaddr.s_addr =
- ((struct sockaddr_in *) addr)->sin_addr.s_addr;
- mreq4.imr_interface.s_addr = INADDR_ANY;
-
if ((ret =
setsockopt (sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &l,
sizeof (l))) < 0)
@@ -115,14 +110,50 @@ gst_udp_join_group (int sockfd, gboolean loop, int ttl,
setsockopt (sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
sizeof (ttl))) < 0)
return ret;
+ break;
+ }
+ case AF_INET6:
+ {
+ if ((ret =
+ setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &l,
+ sizeof (l))) < 0)
+ return ret;
+
+ if ((ret =
+ setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl,
+ sizeof (ttl))) < 0)
+ return ret;
+
+ break;
+ }
+ default:
+ errno = EAFNOSUPPORT;
+ }
+#endif
+ return ret;
+}
+
+int
+gst_udp_join_group (int sockfd, struct sockaddr_storage *addr)
+{
+ int ret = -1;
+
+ switch (addr->ss_family) {
+ case AF_INET:
+ {
+ struct ip_mreq mreq4;
+
+ mreq4.imr_multiaddr.s_addr =
+ ((struct sockaddr_in *) addr)->sin_addr.s_addr;
+ mreq4.imr_interface.s_addr = INADDR_ANY;
if ((ret =
setsockopt (sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(const void *) &mreq4, sizeof (mreq4))) < 0)
return ret;
- }
- break;
+ break;
+ }
case AF_INET6:
{
struct ipv6_mreq mreq6;
@@ -133,26 +164,15 @@ gst_udp_join_group (int sockfd, gboolean loop, int ttl,
mreq6.ipv6mr_interface = 0;
if ((ret =
- setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &l,
- sizeof (l))) < 0)
- return ret;
-
- if ((ret =
- setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl,
- sizeof (ttl))) < 0)
- return ret;
-
- if ((ret =
setsockopt (sockfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
(const void *) &mreq6, sizeof (mreq6))) < 0)
return ret;
- }
- break;
+ break;
+ }
default:
errno = EAFNOSUPPORT;
}
-
return ret;
}
diff --git a/gst/udp/gstudpnetutils.h b/gst/udp/gstudpnetutils.h
index d098664c..68407f7a 100644
--- a/gst/udp/gstudpnetutils.h
+++ b/gst/udp/gstudpnetutils.h
@@ -74,7 +74,9 @@ gboolean gst_udp_net_utils_win32_wsa_startup (GstObject * obj);
int gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr);
int gst_udp_is_multicast (struct sockaddr_storage *addr);
-int gst_udp_join_group (int sockfd, gboolean loop, int ttl, struct sockaddr_storage *addr);
+int gst_udp_set_loop_ttl (int sockfd, gboolean loop, int ttl);
+
+int gst_udp_join_group (int sockfd, struct sockaddr_storage *addr);
int gst_udp_leave_group (int sockfd, struct sockaddr_storage *addr);
#endif /* __GST_UDP_NET_UTILS_H__*/
diff --git a/gst/udp/gstudpsrc.c b/gst/udp/gstudpsrc.c
index 2927cdf6..40d91537 100644
--- a/gst/udp/gstudpsrc.c
+++ b/gst/udp/gstudpsrc.c
@@ -738,7 +738,7 @@ gst_udpsrc_start (GstBaseSrc * bsrc)
}
if (gst_udp_is_multicast (&src->myaddr)) {
- ret = gst_udp_join_group (src->sock.fd, TRUE, src->ttl, &src->myaddr);
+ ret = gst_udp_join_group (src->sock.fd, &src->myaddr);
if (ret < 0)
goto membership;
}