// $Id$
//
// Copyright (C) 2006
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
-// Stefan Bund <stefan.bund@fokus.fraunhofer.de>
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// Stefan Bund <g0dil@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
*/
#include "PacketSocketHandle.hh"
-#include "PacketSocketHandle.ih"
+//#include "PacketSocketHandle.ih"
// Custom includes
#include <sys/types.h>
protocol = ETH_P_ALL;
int sock = ::socket(PF_PACKET, socktype, htons(protocol));
if (sock < 0)
- throw SystemException(errno);
- body().fd(sock);
+ throwErrno();
+ fd(sock);
}
prefix_ std::auto_ptr<senf::SocketProtocol> senf::PacketProtocol::clone()
prefix_ unsigned senf::PacketProtocol::available()
const
{
- if (! body().readable())
+ if (! fh().readable())
return 0;
- ssize_t l = ::recv(body().fd(),0,0,MSG_PEEK | MSG_TRUNC);
+ ssize_t l = ::recv(fd(),0,0,MSG_PEEK | MSG_TRUNC);
if (l < 0)
- throw SystemException(errno);
+ throwErrno();
return l;
}
return false;
}
-prefix_ void senf::PacketProtocol::do_mc_i(std::string interface,
- detail::LLAddressCopier const & copier, bool add)
+namespace {
+
+ void do_mc(int fd, std::string const & interface, senf::MACAddress address, bool add)
+ {
+ struct packet_mreq mreq;
+ mreq.mr_ifindex = ::if_nametoindex(interface.c_str());
+ if (mreq.mr_ifindex == 0)
+ senf::throwErrno(EINVAL);
+ mreq.mr_type = PACKET_MR_MULTICAST;
+ 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)
+ senf::throwErrno();
+ }
+
+}
+
+prefix_ void senf::PacketProtocol::mcAdd(std::string const & interface,
+ MACAddress const & address)
+ const
+{
+ do_mc(fd(),interface,address,true);
+}
+
+prefix_ void senf::PacketProtocol::mcDrop(std::string const & interface,
+ MACAddress const & address)
const
{
- struct packet_mreq mreq;
- mreq.mr_ifindex = ::if_nametoindex(interface.c_str());
- if (mreq.mr_ifindex == 0)
- throw SystemException(EINVAL);
- mreq.mr_type = PACKET_MR_MULTICAST;
- mreq.mr_alen = copier(&mreq.mr_address[0]);
- if (::setsockopt(body().fd(),SOL_PACKET,
- add ? PACKET_ADD_MEMBERSHIP : PACKET_DROP_MEMBERSHIP,
- &mreq, sizeof(mreq)) < 0)
- throw SystemException(errno);
+ do_mc(fd(),interface,address,false);
}
///////////////////////////////cc.e////////////////////////////////////////