diff options
author | Edgar E. Iglesias <edgar.iglesias@gmail.com> | 2009-03-13 18:28:59 +0100 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-03-13 18:28:59 +0100 |
commit | 469aced5810b094f05d628d1d447b6430ae0d483 (patch) | |
tree | 9274017c566c5a71a29451bf15cfb2b451be1ad4 /gst/udp/gstudpnetutils.c | |
parent | a32581abeea9264bba014f5e03063ee60f9c4bdb (diff) |
udpsrc: Add network interface selection
Add network interface selection when joining multicast groups.
Useful when using the udpsrc on multihomed hosts.
Fixes #575234.
API: GstUDPSrc::multicast-iface
Diffstat (limited to 'gst/udp/gstudpnetutils.c')
-rw-r--r-- | gst/udp/gstudpnetutils.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/gst/udp/gstudpnetutils.c b/gst/udp/gstudpnetutils.c index 5fa7593a..e1f8297a 100644 --- a/gst/udp/gstudpnetutils.c +++ b/gst/udp/gstudpnetutils.c @@ -163,19 +163,31 @@ gst_udp_set_loop_ttl (int sockfd, gboolean loop, int ttl) return ret; } +/* FIXME: Add interface selection for windows hosts. */ int -gst_udp_join_group (int sockfd, struct sockaddr_storage *addr) +gst_udp_join_group (int sockfd, struct sockaddr_storage *addr, gchar * iface) { int ret = -1; switch (addr->ss_family) { case AF_INET: { +#ifdef G_OS_WIN32 struct ip_mreq mreq4; +#else + struct ip_mreqn mreq4; +#endif mreq4.imr_multiaddr.s_addr = ((struct sockaddr_in *) addr)->sin_addr.s_addr; +#ifdef G_OS_WIN32 mreq4.imr_interface.s_addr = INADDR_ANY; +#else + if (iface) + mreq4.imr_ifindex = if_nametoindex (iface); + else + mreq4.imr_ifindex = 0; /* Pick any. */ +#endif if ((ret = setsockopt (sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, @@ -192,6 +204,10 @@ gst_udp_join_group (int sockfd, struct sockaddr_storage *addr) &(((struct sockaddr_in6 *) addr)->sin6_addr), sizeof (struct in6_addr)); mreq6.ipv6mr_interface = 0; +#if !defined(G_OS_WIN32) + if (iface) + mreq6.ipv6mr_interface = if_nametoindex (iface); +#endif if ((ret = setsockopt (sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP, |