Packets: Fix VariantParser invalid parser access bug
[senf.git] / Socket / Protocols / Raw / LLAddressing.hh
index bed2c13..78a1c32 100644 (file)
@@ -1,9 +1,9 @@
 // $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
     \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 <sys/socket.h>
 #include <netpacket/packet.h>
-#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,40 +99,33 @@ 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.
 
         void address(MACAddress const & addr); ///< Change address
-        void interface(std::string iface); ///< Change interface
+        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<LLSocketAddress>
+          private BSDAddressingPolicyMixin<LLSocketAddress>
     {
         typedef LLSocketAddress Address;
 
-        using GenericAddressingPolicy<LLSocketAddress>::local;
-        using GenericAddressingPolicy<LLSocketAddress>::bind;
+        using BSDAddressingPolicyMixin<LLSocketAddress>::local;
+        using BSDAddressingPolicyMixin<LLSocketAddress>::bind;
     };
 
     /// @}
+
+    /** \brief Write link layer address
+        \related LLSocketAddress
+     */
+    std::ostream & operator<<(std::ostream & os, LLSocketAddress const & llAddr);
 }
 
 ///////////////////////////////hh.e////////////////////////////////////////