Socket/Protocols/Raw/PacketSocketHandle: added promisc() method
tho [Thu, 26 Mar 2009 16:16:42 +0000 (16:16 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1169 270642c3-0616-0410-b53a-bc976706d245

Socket/Protocols/Raw/PacketSocketHandle.cc
Socket/Protocols/Raw/PacketSocketHandle.hh
Socket/Protocols/Raw/PacketSocketHandle.test.cc

index 224b469..f24e0b1 100644 (file)
@@ -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////////////////////////////////////////
index 3cae497..35898ac 100644 (file)
@@ -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
index e83a93d..78d5476 100644 (file)
@@ -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() );
     }