Skip to content
Snippets Groups Projects
Commit 59d1aa09 authored by dw6's avatar dw6
Browse files

adding flexibility to use interface index / no interface

parent 1236931e
No related branches found
No related tags found
No related merge requests found
...@@ -311,23 +311,30 @@ senf::INet6MulticastSocketProtocol::mcDropMembership(INet6Address const & mcAddr ...@@ -311,23 +311,30 @@ senf::INet6MulticastSocketProtocol::mcDropMembership(INet6Address const & mcAddr
} }
namespace { namespace {
void mc6SSMSourceRequest(int operation, int fd, senf::INet6Address const & group, void mc6SSMSourceRequest(int operation, int fd, senf::INet6Address const & group,
senf::INet6Address const & source, std::string const & iface) senf::INet6Address const & source, int const & ifacei)
{ {
struct group_source_req req; struct group_source_req req;
::memset(&req, 0, sizeof(req)); ::memset(&req, 0, sizeof(req));
req.gsr_interface = if_nametoindex(iface.c_str()); req.gsr_interface = ifacei;
if (req.gsr_interface == 0) req.gsr_group.ss_family = AF_INET6;
throw senf::SystemException("::if_nametoindex()", ENOENT SENF_EXC_DEBUGINFO); std::copy(group.begin(), group.end(),
req.gsr_group.ss_family = AF_INET6; reinterpret_cast<struct sockaddr_in6&>(req.gsr_group).sin6_addr.s6_addr);
std::copy(group.begin(), group.end(), req.gsr_source.ss_family = AF_INET6;
reinterpret_cast<struct sockaddr_in6&>(req.gsr_group).sin6_addr.s6_addr); std::copy(source.begin(), source.end(),
req.gsr_source.ss_family = AF_INET6; reinterpret_cast<struct sockaddr_in6&>(req.gsr_source).sin6_addr.s6_addr);
std::copy(source.begin(), source.end(), if (::setsockopt(fd, SOL_IPV6, MCAST_JOIN_SOURCE_GROUP, &req, sizeof(req)) < 0)
reinterpret_cast<struct sockaddr_in6&>(req.gsr_source).sin6_addr.s6_addr); SENF_THROW_SYSTEM_EXCEPTION("::setsockopt()");
if (::setsockopt(fd, SOL_IPV6, MCAST_JOIN_SOURCE_GROUP, &req, sizeof(req)) < 0) }
SENF_THROW_SYSTEM_EXCEPTION("::setsockopt()"); void mc6SSMSourceRequest(int operation, int fd, senf::INet6Address const & group,
senf::INet6Address const & source, std::string const & iface)
{
int ifacei = if_nametoindex(iface.c_str());
if (ifacei == 0)
throw senf::SystemException("::if_nametoindex()", ENOENT SENF_EXC_DEBUGINFO);
mc6SSMSourceRequest(operation, fd, group, source, ifacei);
} }
} }
prefix_ void senf::INet6MulticastSocketProtocol::mcJoinSSMSource(INet6Address const & group, prefix_ void senf::INet6MulticastSocketProtocol::mcJoinSSMSource(INet6Address const & group,
...@@ -338,6 +345,20 @@ prefix_ void senf::INet6MulticastSocketProtocol::mcJoinSSMSource(INet6Address co ...@@ -338,6 +345,20 @@ prefix_ void senf::INet6MulticastSocketProtocol::mcJoinSSMSource(INet6Address co
mc6SSMSourceRequest(MCAST_JOIN_SOURCE_GROUP, fd(), group, source, iface); mc6SSMSourceRequest(MCAST_JOIN_SOURCE_GROUP, fd(), group, source, iface);
} }
prefix_ void senf::INet6MulticastSocketProtocol::mcJoinSSMSource(INet6Address const & group,
INet6Address const & source,
int ifacei)
const
{
mc6SSMSourceRequest(MCAST_JOIN_SOURCE_GROUP, fd(), group, source, ifacei);
}
prefix_ void senf::INet6MulticastSocketProtocol::mcJoinSSMSource(INet6Address const & group,
INet6Address const & source)
const
{
mc6SSMSourceRequest(MCAST_JOIN_SOURCE_GROUP, fd(), group, source, 0);
}
prefix_ void senf::INet6MulticastSocketProtocol::mcLeaveSSMSource(INet6Address const & group, prefix_ void senf::INet6MulticastSocketProtocol::mcLeaveSSMSource(INet6Address const & group,
INet6Address const & source, INet6Address const & source,
std::string const & iface) std::string const & iface)
...@@ -346,6 +367,7 @@ prefix_ void senf::INet6MulticastSocketProtocol::mcLeaveSSMSource(INet6Address c ...@@ -346,6 +367,7 @@ prefix_ void senf::INet6MulticastSocketProtocol::mcLeaveSSMSource(INet6Address c
mc6SSMSourceRequest(MCAST_LEAVE_SOURCE_GROUP, fd(), group, source, iface); mc6SSMSourceRequest(MCAST_LEAVE_SOURCE_GROUP, fd(), group, source, iface);
} }
///////////////////////////////cc.e//////////////////////////////////////// ///////////////////////////////cc.e////////////////////////////////////////
#undef prefix_ #undef prefix_
//#include "MulticastSocketProtocol.mpp" //#include "MulticastSocketProtocol.mpp"
......
...@@ -197,6 +197,24 @@ namespace senf { ...@@ -197,6 +197,24 @@ namespace senf {
\param[in] source SSM multicast source to join the \param[in] source SSM multicast source to join the
group on group on
\param[in] iface interface to join the group on */ \param[in] iface interface to join the group on */
void mcJoinSSMSource(INet6Address const & group, INet6Address const & source,
int ifacei) const;
///< join SSM multicast group
/**< This call will join the multicast group \a group for
traffic from \a source. A single group may be joined
multiple times on different sources.
\param[in] group multicast group to join
\param[in] source SSM multicast source to join the
group on
\param[in] ifacei interface index to join the group on */
void mcJoinSSMSource(INet6Address const & group, INet6Address const & source) const;
///< join SSM multicast group
/**< This call will join the multicast group \a group for
traffic from \a source. A single group may be joined
multiple times on different sources.
\param[in] group multicast group to join
\param[in] source SSM multicast source to join the
group on */
void mcLeaveSSMSource(INet6Address const & group, INet6Address const & source, void mcLeaveSSMSource(INet6Address const & group, INet6Address const & source,
std::string const & iface) const; std::string const & iface) const;
///< leave SSM multicast group ///< leave SSM multicast group
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment