From: tho Date: Thu, 26 Mar 2009 16:16:42 +0000 (+0000) Subject: Socket/Protocols/Raw/PacketSocketHandle: added promisc() method X-Git-Url: http://g0dil.de/git?a=commitdiff_plain;h=d704e2a2bbd875ba9dbdef01226ced23f927a8d7;p=senf.git Socket/Protocols/Raw/PacketSocketHandle: added promisc() method git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1169 270642c3-0616-0410-b53a-bc976706d245 --- diff --git a/Socket/Protocols/Raw/PacketSocketHandle.cc b/Socket/Protocols/Raw/PacketSocketHandle.cc index 224b469..f24e0b1 100644 --- a/Socket/Protocols/Raw/PacketSocketHandle.cc +++ b/Socket/Protocols/Raw/PacketSocketHandle.cc @@ -76,6 +76,7 @@ namespace { 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); @@ -83,25 +84,39 @@ namespace { 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//////////////////////////////////////// diff --git a/Socket/Protocols/Raw/PacketSocketHandle.hh b/Socket/Protocols/Raw/PacketSocketHandle.hh index 3cae497..35898ac 100644 --- a/Socket/Protocols/Raw/PacketSocketHandle.hh +++ b/Socket/Protocols/Raw/PacketSocketHandle.hh @@ -122,6 +122,9 @@ namespace senf { ///< Disable reception of a multicast group /**< \see \ref mcAdd() */ + void promisc(std::string const & interface, bool mode) const; + ///< enable/disable promiscuous mode + ///@} ///\name Abstract Interface Implementation diff --git a/Socket/Protocols/Raw/PacketSocketHandle.test.cc b/Socket/Protocols/Raw/PacketSocketHandle.test.cc index e83a93d..78d5476 100644 --- a/Socket/Protocols/Raw/PacketSocketHandle.test.cc +++ b/Socket/Protocols/Raw/PacketSocketHandle.test.cc @@ -56,10 +56,13 @@ BOOST_AUTO_UNIT_TEST(packetSocketHandle) // 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() ); }