void do_mc(int fd, std::string const & interface, senf::MACAddress address, bool add)
{
struct packet_mreq mreq;
+ ::memset(&mreq, 0, sizeof(mreq));
mreq.mr_ifindex = ::if_nametoindex(interface.c_str());
if (mreq.mr_ifindex == 0)
throw senf::SystemException(EINVAL);
mreq.mr_alen = 6;
std::copy(address.begin(), address.end(), &mreq.mr_address[0]);
if (::setsockopt(fd, SOL_PACKET,
- add ? PACKET_ADD_MEMBERSHIP : PACKET_DROP_MEMBERSHIP,
- &mreq, sizeof(mreq)) < 0)
+ add ? PACKET_ADD_MEMBERSHIP : PACKET_DROP_MEMBERSHIP,
+ &mreq, sizeof(mreq)) < 0)
throw senf::SystemException();
}
-
}
prefix_ void senf::PacketSocketProtocol::mcAdd(std::string const & interface,
MACAddress const & address)
const
{
- do_mc(fd(),interface,address,true);
+ do_mc(fd(), interface, address, true);
}
prefix_ void senf::PacketSocketProtocol::mcDrop(std::string const & interface,
MACAddress const & address)
const
{
- do_mc(fd(),interface,address,false);
+ do_mc(fd(), interface, address, false);
+}
+
+prefix_ void senf::PacketSocketProtocol::promisc(std::string const & interface, bool mode)
+ const
+{
+ struct packet_mreq mreq;
+ ::memset(&mreq, 0, sizeof(mreq));
+ mreq.mr_ifindex = ::if_nametoindex(interface.c_str());
+ if (mreq.mr_ifindex == 0)
+ throw senf::SystemException(EINVAL);
+ mreq.mr_type = PACKET_MR_PROMISC;
+ if (::setsockopt(fd(), SOL_PACKET,
+ mode ? PACKET_ADD_MEMBERSHIP : PACKET_DROP_MEMBERSHIP,
+ &mreq, sizeof(mreq)) < 0)
+ throw senf::SystemException();
}
///////////////////////////////cc.e////////////////////////////////////////
// How am I supposed to test read and write .. grmpf ..
SENF_CHECK_NO_THROW( sock.protocol().mcAdd(
- "eth0",senf::MACAddress::from_string("01-02-03-04-05-06")) );
+ "eth0", senf::MACAddress::from_string("01-02-03-04-05-06")) );
SENF_CHECK_NO_THROW( sock.protocol().mcDrop(
- "eth0",senf::MACAddress::from_string("01-02-03-04-05-06")) );
+ "eth0", senf::MACAddress::from_string("01-02-03-04-05-06")) );
+ SENF_CHECK_NO_THROW( sock.protocol().promisc( "eth0", true) );
+ SENF_CHECK_NO_THROW( sock.protocol().promisc( "eth0", false));
+
SENF_CHECK_NO_THROW( sock.protocol().available() );
BOOST_CHECK( ! sock.eof() );
}