X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FRaw%2FLLAddressing.hh;h=78a1c326a421e9208c47a65db0bfebc4137fab7d;hb=81f84badf27b66dbadec9890646ca1193e998505;hp=0a36fbe42f9918c14bd95c42762a033958a498e5;hpb=fb08e3defcfb7cd8851ede0fab6cad424d168485;p=senf.git diff --git a/Socket/Protocols/Raw/LLAddressing.hh b/Socket/Protocols/Raw/LLAddressing.hh index 0a36fbe..78a1c32 100644 --- a/Socket/Protocols/Raw/LLAddressing.hh +++ b/Socket/Protocols/Raw/LLAddressing.hh @@ -1,9 +1,9 @@ // $Id$ // // Copyright (C) 2006 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Stefan Bund // // 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 @@ -24,15 +24,16 @@ \brief LLSocketAddress and LLAddressingPolicy public header */ -#ifndef HH_LLAddressing_ -#define HH_LLAddressing_ 1 +#ifndef HH_SENF_Socket_Protocols_Raw_LLAddressing_ +#define HH_SENF_Socket_Protocols_Raw_LLAddressing_ 1 // Custom includes #include #include -#include "Socket/SocketPolicy.hh" -#include "Socket/FileHandle.hh" -#include "Socket/Protocols/GenericAddressingPolicy.hh" +#include "../../SocketPolicy.hh" +#include "../../FileHandle.hh" +#include "../BSDAddressingPolicy.hh" +#include "../BSDSocketAddress.hh" #include "MACAddress.hh" //#include "LLAddressing.mpp" @@ -51,13 +52,17 @@ namespace senf { class only allows changing those fields which need to be changed. The other fields are read-only. They are filled by the operating system when receiving a packet + \nosubgrouping */ class LLSocketAddress + : public BSDSocketAddress { public: + static short const addressFamily = AF_PACKET; + /** \brief Valid pkttype() values - These are the possible values returned by arptype() + These are the possible values returned by pkttype() */ enum PktType { Undefined = 0 , Host = PACKET_HOST /**< Packet destined for this host */ @@ -68,12 +73,16 @@ namespace senf { , Outgoing = PACKET_OUTGOING /**< Packet sent out from this host */ }; + /////////////////////////////////////////////////////////////////////////// + ///\name Structors and default members + ///@{ + LLSocketAddress(); ///< Create empty address explicit LLSocketAddress(unsigned proto, std::string const & iface=""); ///< Create address for \c bind() /**< This constructs an LLSocketAddress valid for calling PacketSocketHandle::bind() with. - \param[in] prot Protocol (Ethertype) to listen for + \param[in] proto Protocol (Ethertype) to listen for \param[in] iface Interface name to bind to */ explicit LLSocketAddress(std::string const &iface); ///< Create address for \c bind() @@ -90,13 +99,18 @@ namespace senf { \param addr Address to send data to \param iface Interface to send packet from */ - void clear(); ///< Clear the address + LLSocketAddress(const LLSocketAddress& other); + LLSocketAddress& operator=(const LLSocketAddress& other); - unsigned protocol() const; ///< Return address protocol (ethertype) + ///@} + /////////////////////////////////////////////////////////////////////////// + + MACAddress address() const; ///< Return address std::string interface() const; ///< Return interface name + unsigned protocol() const; ///< Return address protocol (ethertype) + unsigned arptype() const; ///< Return the hatype field (ARP hardware type) PktType pkttype() const; ///< Return type of packet - MACAddress address() const; ///< Return address // The mutating interface is purposely restricted to allow only // changing those members, which are sensible to be changed. @@ -105,25 +119,13 @@ namespace senf { void interface(std::string const & iface); ///< Change interface void protocol(unsigned prot); ///< Change protocol - ///\name Generic SocketAddress interface - ///@{ - - struct sockaddr * sockaddr_p(); - struct sockaddr const * sockaddr_p() const; - unsigned sockaddr_len() const; - - ///@} + using BSDSocketAddress::sockaddr_p; + using BSDSocketAddress::socklen_p; private: struct ::sockaddr_ll addr_; }; - /** \brief Signal invalid link local address syntax - \related LLSocketAddress - */ - struct InvalidLLSocketAddressException : public std::exception - { char const * what() const throw() { return "invalid ll address"; } }; - /// @} /// \addtogroup policy_impl_group @@ -144,15 +146,20 @@ namespace senf { */ struct LLAddressingPolicy : public AddressingPolicyBase, - private GenericAddressingPolicy + private BSDAddressingPolicyMixin { typedef LLSocketAddress Address; - using GenericAddressingPolicy::local; - using GenericAddressingPolicy::bind; + using BSDAddressingPolicyMixin::local; + using BSDAddressingPolicyMixin::bind; }; /// @} + + /** \brief Write link layer address + \related LLSocketAddress + */ + std::ostream & operator<<(std::ostream & os, LLSocketAddress const & llAddr); } ///////////////////////////////hh.e////////////////////////////////////////