/** \file
\brief MulticastSocketProtocol public header */
-#ifndef HH_MulticastSocketProtocol_
-#define HH_MulticastSocketProtocol_ 1
+#ifndef HH_SENF_Socket_Protocols_INet_MulticastSocketProtocol_
+#define HH_SENF_Socket_Protocols_INet_MulticastSocketProtocol_ 1
// Custom includes
#include "../../../Socket/SocketProtocol.hh"
///\{
/** \brief Generic addressing type independent multicast protocol facet
+
+ \todo implement complete new multicast API from RFC3678 (as far as supported by linux)
+ \bug mcLeaveSSMSource fails with EADDRNOTAVAIL
*/
class MulticastSocketProtocol
: public virtual SocketProtocol
bool mcLoop() const; ///< Return current multicast loopback state.
void mcLoop(bool value) const; ///< Set multicast loopback state
- /**< If set to false via \c mcLoop(value) multicast messages will not be looped back to local sockets. Default value is \c true (1). */
+ /**< If set to false via \c mcLoop(value) multicast messages
+ will not be looped back to local sockets. Default value
+ is \c true. */
void mcIface(std::string const & iface = std::string()) const;
///< Set multicast send interface of the socket
/**< \param[in] iface name of interface to send multicast
- data from */
+ data from
+
+ Under current linux versions this option is broken at
+ best. Don't use. */
};
/** \brief Multicast protocol facet for INet4 addressable multicast enabled sockets
*/
class INet4MulticastSocketProtocol
- : public virtual SocketProtocol
+ : public MulticastSocketProtocol
{
public:
void mcAddMembership(INet4Address const & mcAddr) const;
groups received. The group is joined on the default
interface.
\param[in] mcAddr address of group to join */
- void mcAddMembership(INet4Address const & mcAddr, INet4Address const & localAddr)
- const;
+ void mcAddMembership(INet4Address const & mcAddr, INet4Address const & localAddr) const;
///< join multicast group on a specific interface
/**< This member will add \a mcAddr to the list of multicast
groups received. The group is joined on the interface
interface with the given local address.
\param[in] mcAddr address of group to leave
\param[in] iface interface name */
+
+ void mcJoinSSMSource(INet4Address const & group, INet4Address const & source,
+ std::string const & iface) 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] iface interface to join the group on */
+ void mcLeaveSSMSource(INet4Address const & group, INet4Address const & source,
+ std::string const & iface) const;
+ ///< leave SSM multicast group
+ /**< This call will leave the multicast group \a group for
+ traffic from \a source.
+ \param[in] group multicast group to leave
+ \param[in] source SSM multicast source to leave the
+ group from
+ \param[in] iface interface to leave the group on */
};
/** \brief Multicast protocol facet for INet6 addressable multicast enabled sockets
+
+ This implementation supports INet6 mapped INet4 multicast addresses. This is a linux
+ specific extension and NOT part of the relevant RFCs.
*/
class INet6MulticastSocketProtocol
- : public virtual SocketProtocol
+ : public MulticastSocketProtocol
{
public:
void mcAddMembership(INet6Address const & mcAddr) const;
groups received. The group is joined on the default
interface.
\param[in] mcAddr address of group to join */
- void mcAddMembership(INet6Address const & mcAddr, INet6Address const & localAddr)
- const;
- ///< join multicast group on a specific interface
- /**< This member will add \a mcAddr to the list of multicast
- groups received. The group is joined on the interface
- with the given local address.
- \param[in] mcAddr address of group to join
- \param[in] localAddr address of interface to join on */
- void mcAddMembership(INet6Address const & mcAddr, std::string const & iface);
+ void mcAddMembership(INet6Address const & mcAddr, std::string const & iface) const;
///< join multicast group on a specific interface
/**< This member will add \a mcAddr to the list of multicast
groups received. The group is joined on the given
multicast groups received. The group is left from the
default interface.
\param[in] mcAddr address of group to leave */
- void mcDropMembership(INet6Address const & mcAddr, INet6Address const & localAddr)
- const;
+ void mcDropMembership(INet6Address const & mcAddr, std::string const & iface) const;
///< leave multicast group on a specific interface
/**< This member will remove \a mcAddr from the list of
multicast groups received. The group is left from the
interface with the given local address.
\param[in] mcAddr address of group to leave
- \param[in] localAddr address of interface to leave
- from */
- void mcDropMembership(INet6Address const & mcAddr, std::string const & iface)
- const;
- ///< leave multicast group on a specific interface
- /**< This member will remove \a mcAddr from the list of
- multicast groups received. The group is left from the
- interface with the given local address.
- \param[in] mcAddr address of group to leave
- \param[in] localAddr address of interface to leave
- from */
+ \param[in] iface interface name */
+
+ void mcJoinSSMSource(INet6Address const & group, INet6Address const & source,
+ std::string const & iface) 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] iface interface to join the group on. If set
+ to the empty string, use the default interface. */
+ void mcJoinSSMSource(INet6Address const & group, INet6Address const & source,
+ int ifacei = 0) 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 optional interface index to join the
+ group on */
+ void mcLeaveSSMSource(INet6Address const & group, INet6Address const & source,
+ std::string const & iface) const;
+ ///< leave SSM multicast group
+ /**< This call will leave the multicast group \a group for
+ traffic from \a source.
+ \param[in] group multicast group to leave
+ \param[in] source SSM multicast source to leave the
+ group from
+ \param[in] iface interface to leave the group on */
};
///\}