Implemented MOOSE Ethernet Address Rewriting, Forwarding and Caching. Removed friend...
authorRichard Whitehouse <github@richardwhiuk.com>
Tue, 25 Jan 2011 01:07:33 +0000 (01:07 +0000)
committerRichard Whitehouse <github@richardwhiuk.com>
Tue, 25 Jan 2011 01:07:33 +0000 (01:07 +0000)
12 files changed:
code/src/devices/bridge/model/bridge-net-device.cc
code/src/devices/bridge/model/bridge-net-device.h
code/src/devices/bridge/model/bridge-port-net-device.cc
code/src/devices/bridge/model/bridge-port-net-device.h
code/src/devices/bridge/model/moose-bridge-net-device.cc
code/src/devices/bridge/model/moose-bridge-net-device.h
code/src/devices/bridge/model/moose-bridge-port-net-device.cc
code/src/devices/bridge/model/moose-bridge-port-net-device.h
code/src/node/moose-address.cc
code/src/node/moose-address.h
code/src/node/moose-suffix-address.cc
code/src/node/moose-suffix-address.h

index 602426d3a9f10f3cae56e27a9343ddba6d8c30cd..14d8d8108f240e2555f06728d00130440479dca6 100644 (file)
@@ -214,13 +214,13 @@ BridgeNetDevice::GetNBridgePorts (void) const
   return m_ports.size ();
 }
 
-/** Dislike this. */
+/** Dislike this slightly less now. */
 
 Ptr<NetDevice>
 BridgeNetDevice::GetBridgePort (uint32_t n) const
 {
   NS_LOG_FUNCTION_NOARGS ();
-  return m_ports[n]->m_device;
+  return m_ports[n]->GetDevice();
 }
 
 void 
index a005f1aced2104b408ae57b4bc7d967caaf72ae2..6fe9e99745102b39479b520b6f3ecf0f6371e74b 100644 (file)
@@ -118,13 +118,14 @@ public:
   virtual bool SupportsSendFrom () const;
   virtual Address GetMulticast (Ipv6Address addr) const;
 
+  virtual void Forward (Ptr<BridgePortNetDevice> port, Ptr<const Packet> packet, uint16_t protocol, Address const &src, Address const &dst, PacketType packetType);
+  virtual void Learn (Address const &src, Ptr<BridgePortNetDevice> port);
+
 protected:
   virtual void DoDispose (void);
 
-  virtual void Forward (Ptr<BridgePortNetDevice> port, Ptr<const Packet> packet, uint16_t protocol, Address const &src, Address const &dst, PacketType packetType);
   virtual void ForwardUnicast (Ptr<BridgePortNetDevice> incomingPort, Ptr<const Packet> packet, uint16_t protocol, Mac48Address src, Mac48Address dst);
   virtual void ForwardBroadcast (Ptr<BridgePortNetDevice> incomingPort, Ptr<const Packet> packet, uint16_t protocol, Mac48Address src, Mac48Address dst);
-  virtual void Learn (Address const &src, Ptr<BridgePortNetDevice> port);
   virtual Ptr<BridgePortNetDevice> GetLearnedState (Mac48Address source);
 
   virtual Ptr<BridgePortNetDevice> CreateBridgePort(Ptr<BridgeNetDevice> bridge, Ptr<NetDevice> device, Ptr<Node> node);
@@ -151,8 +152,6 @@ private:
   uint16_t m_mtu;
   bool m_enableLearning;
 
-  friend class BridgePortNetDevice;
-
 };
 
 } // namespace ns3
index 29093e6c1d4f118862b62340d35c2e6e4a59f0be..5a68c8f5a994bd2f825d6c3733cdb1afc63dff51 100644 (file)
@@ -68,6 +68,10 @@ void BridgePortNetDevice::Send(Ptr<Packet> packet, const Address& source, const
        m_device->SendFrom(packet->Copy(), source, dest, protocolNumber);
 }
 
+Ptr<NetDevice> BridgePortNetDevice::GetDevice(){
+   return m_device;
+}
+
 /**
  * By moving learning to the port, we can have some ports which learn, and some which don't.
  **/
index ccc3da0d8ef1e3eecd53cad5edd85da3080d3dc4..58b05f1ffe388dd0475ae2046cb7d795a3440528 100644 (file)
@@ -43,17 +43,16 @@ public:
 
   static TypeId GetTypeId (void);
 
+  Ptr<NetDevice> GetDevice();
+
+  virtual void Send (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber);
+
 protected:
-  void Send (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber);
-  void Receive (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol, Address const &source, Address const &destination, NetDevice::PacketType packetType);
-     
-private:
+  virtual void Receive (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol, Address const &source, Address const &destination, NetDevice::PacketType packetType);
+  
   Ptr<BridgeNetDevice> m_bridge;
   Ptr<NetDevice> m_device;
 
-
-  friend class BridgeNetDevice;
-
 };
 
 } // namespace ns3
index f066c3b47df7d355dbe2c366f58942296b61120d..48b47eb3104245b5f632ffe2ca9ec918df87f1d0 100644 (file)
@@ -10,7 +10,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
+ * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Richard Whitehouse <ns3@richardwhiuk.com>
@@ -21,6 +21,8 @@
 #include "moose-bridge-port-net-device.h"
 #include "ns3/log.h"
 #include "ns3/node.h"
+#include "ns3/simulator.h"
+#include "ns3/packet.h"
 
 NS_LOG_COMPONENT_DEFINE ("MooseBridgeNetDevice");
 
@@ -52,16 +54,202 @@ Ptr<BridgePortNetDevice> MooseBridgeNetDevice::CreateBridgePort(Ptr<BridgeNetDev
        return CreateObject<MooseBridgePortNetDevice>(bridge, device, node);
 }
 
-/*
-//bool Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber);
-//bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
+MooseAddress MooseBridgeNetDevice::FromMoose(MooseAddress const& addr){
+  NS_LOG_FUNCTION_NOARGS();
+
+  if(addr.GetMooseType() != MooseAddress::MOOSE){
+     return MooseAddress(Mac48Address::GetBroadcast());
+  }
+  
+  // Don't translate none local MOOSE addrs.
+
+  if(addr.GetMoosePrefix() != m_mooseAddress.GetMoosePrefix()){
+     return addr;
+  }
+  std::map<MooseSuffixAddress, SuffixState*>::iterator iter = m_ethernetState.find(addr.GetMooseSuffix());
+
+  if(iter == m_ethernetState.end()){
+
+     // Expired state - must broadcast.     
+
+     return MooseAddress(Mac48Address::GetBroadcast());
+
+  } else {
 
-void Forward (Ptr<BridgePortNetDevice> port, Ptr<const Packet> packet, uint16_t protocol, Address const &src, Address const &dst, PacketType packetType){
-       
+     Time now = Simulator::Now();     
+
+     SuffixState* state = iter->second;
+    
+     if(state->expirationTime > now){ 
+        m_ethernetState.erase(iter);
+        m_suffixState.erase(iter->second->ethernet);
+        return MooseAddress(Mac48Address::GetBroadcast());
+     } else { 
+        return MooseAddress(iter->second->ethernet);
+     }
+
+  }
+  
 }
 
-void ForwardUnicast (Ptr<BridgePortNetDevice> incomingPort, Ptr<const Packet> packet, uint16_t protocol, Mac48Address src, Mac48Address dst);
-void ForwardBroadcast (Ptr<BridgePortNetDevice> incomingPort, Ptr<const Packet> packet, uint16_t protocol, Mac48Address src, Mac48Address dst);
+MooseAddress MooseBridgeNetDevice::ToMoose(MooseAddress const& addr){
+  NS_LOG_FUNCTION_NOARGS();
+
+  Time now = Simulator::Now();
+
+  MooseAddress::MooseType mt = addr.GetMooseType();
+
+  if(mt == MooseAddress::MOOSE){ 
+     return addr;
+  } else if(mt == MooseAddress::HOST){
+     MooseAddress moose;
+
+     Mac48Address addr48 = addr.GetMacAddress();
+
+     // Fix Suffix.
+     std::map<Mac48Address, SuffixState>::iterator iter = m_suffixState.find(addr48);
+     if(iter == m_suffixState.end()){
+         // Allocate New Suffix
+
+         moose = MooseAddress::Allocate(m_mooseAddress.GetMoosePrefix()); 
+
+         SuffixState &state = m_suffixState[addr48];
+         state.ethernet = addr48;
+         state.suffix = moose.GetMooseSuffix();
+         state.expirationTime = now + m_expirationTime;
+
+         m_ethernetState[state.suffix] = &state;
+
+     } else {
+        SuffixState &state = iter->second;
+        if(state.expirationTime > now){
+            moose = MooseAddress::Combine(m_mooseAddress.GetMoosePrefix(), state.suffix);
+            state.expirationTime = now + m_expirationTime;
+        } else {
+            // Delete old and alloc new
+
+            m_ethernetState.erase(state.suffix);
+            m_suffixState.erase(iter);
+
+            // Allocate New
+
+            SuffixState &state = m_suffixState[addr48];
+          
+            moose = MooseAddress::Allocate(m_mooseAddress.GetMoosePrefix());
+           state.ethernet = addr48;
+            state.suffix = moose.GetMooseSuffix();
+            state.expirationTime = now + m_expirationTime;
+
+            m_ethernetState[state.suffix] = &state;
+
+        }
+     }
+
+     return moose;
+
+  } else {
+     NS_ASSERT( (mt == MooseAddress::HOST) || (mt == MooseAddress::MOOSE) );  
+     return addr;
+  }
+
+}
+
+void MooseBridgeNetDevice::Learn(MooseAddress const& addr, Ptr<BridgePortNetDevice> port){
+  NS_LOG_FUNCTION_NOARGS ();
+  
+  Time now = Simulator::Now();
+
+  NS_ASSERT(addr.GetMooseType() == MooseAddress::MOOSE);
+
+  if(addr.GetMoosePrefix() != m_mooseAddress.GetMoosePrefix()){
+     
+     PrefixState &state = m_prefixState[addr.GetMoosePrefix()];
+     state.associatedPort = port;
+     state.expirationTime = now + m_expirationTime;
+
+  } else {
+
+     PortState &state = m_portState[addr.GetMooseSuffix()];
+     state.associatedPort = port;
+     state.expirationTime = now + m_expirationTime;
+
+  }
+}
+
+Ptr<BridgePortNetDevice> MooseBridgeNetDevice::GetLearnedPort(MooseAddress const&addr){
+  NS_LOG_FUNCTION_NOARGS();
+
+  Time now = Simulator::Now();
+
+  if(addr.GetMooseType() != MooseAddress::MOOSE){
+      return NULL;
+  }
+
+  if(addr.GetMoosePrefix() != m_mooseAddress.GetMoosePrefix()){
+     std::map<MoosePrefixAddress, PrefixState>::iterator iter = m_prefixState.find(addr.GetMoosePrefix());
+
+     if(iter != m_prefixState.end()){
+          return iter->second.associatedPort;
+     }
+  } else {
+     std::map<MooseSuffixAddress, PortState>::iterator iter = m_portState.find(addr.GetMooseSuffix());
+
+     if(iter != m_portState.end()){
+          return iter->second.associatedPort;
+     }
+  }
+  
+  return NULL;
+}
+
+
+void
+MooseBridgeNetDevice::ForwardUnicast (Ptr<BridgePortNetDevice> incomingPort, Ptr<const Packet> packet, uint16_t protocol, Mac48Address src, Mac48Address dst)
+{
+  NS_LOG_FUNCTION_NOARGS (); 
+
+  // Get Port
+
+  MooseAddress mdst = MooseAddress(dst);
+
+  Ptr<BridgePortNetDevice> outPort = GetLearnedPort(mdst);
+
+  if (outPort != NULL && outPort != incomingPort){   
+      NS_LOG_LOGIC ("Learning bridge state says to use port `" << outPort->GetInstanceTypeId ().GetName () << "'");
+      
+      Mac48Address newdst = FromMoose(mdst).GetMacAddress();
+      
+      if(!newdst.IsBroadcast()){
+
+         NS_LOG_LOGIC("MOOSE bridge says MAC Address is `" << newdst << "'");
+
+         outPort->Send (packet->Copy (), src, newdst, protocol);
+         return;
+      }   
+  } else {
+      Mac48Address newdst = FromMoose(mdst).GetMacAddress();
+    
+      if(!newdst.IsBroadcast()){
+
+         NS_LOG_LOGIC("MOOSE bridge says MAC Address is `" << newdst << "' - no port data, so broadcasting."); 
+
+        ForwardBroadcast(incomingPort, packet, protocol, src, newdst);
+
+         return;
+      }
+  }
+
+  NS_LOG_LOGIC("Not enough learned state. Dropping packet");
+
+}
+
+
+
+/*
+//bool Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber);
+//bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
 void Learn (Address const &src, Ptr<BridgePortNetDevice> port);
 Ptr<BridgePortNetDevice> GetLearnedState (Mac48Address source);*/
 
index 9f39dcb43a990bbe0b5ed9fb72c24f2479de0f27..91fd1d7e89a98c4cb2b84eb001e19fada19e85f5 100644 (file)
@@ -39,8 +39,16 @@ public:
   MooseBridgeNetDevice ();
   virtual ~MooseBridgeNetDevice ();
 
+  void Learn(MooseAddress const& addr, Ptr<BridgePortNetDevice> port);
+  Ptr<BridgePortNetDevice> GetLearnedPort(MooseAddress const& addr);
+  MooseAddress ToMoose(MooseAddress const& addr);
+  MooseAddress FromMoose(MooseAddress const& addr);
+
+
 protected:
 
+  virtual void ForwardUnicast (Ptr<BridgePortNetDevice> incomingPort, Ptr<const Packet> packet, uint16_t protocol, Mac48Address src, Mac48Address dst);
+
 // From NetDevice
 
 // Unconvinced we need these...
@@ -53,7 +61,6 @@ protected:
 /*
 
   virtual void Forward (Ptr<BridgePortNetDevice> port, Ptr<const Packet> packet, uint16_t protocol, Address const &src, Address const &dst, PacketType packetType);
-  virtual void ForwardUnicast (Ptr<BridgePortNetDevice> incomingPort, Ptr<const Packet> packet, uint16_t protocol, Mac48Address src, Mac48Address dst);
   virtual void ForwardBroadcast (Ptr<BridgePortNetDevice> incomingPort, Ptr<const Packet> packet, uint16_t protocol, Mac48Address src, Mac48Address dst);
   virtual void Learn (Address const &src, Ptr<BridgePortNetDevice> port);
   virtual Ptr<BridgePortNetDevice> GetLearnedState (Mac48Address source); */
@@ -64,18 +71,6 @@ private:
 
 // Need more types of state
 
-/**
-  Local Port Mappings
-       -- Implemented in parent.
-
-  struct LearnedState
-  {
-    Ptr<BridgePortNetDevice> associatedPort;
-    Time expirationTime;
-  };
-  std::map<Mac48Address, LearnedState> m_learnState;
-**/
-
   MooseAddress m_mooseAddress;
 
   // Remote Moose State
@@ -84,17 +79,29 @@ private:
   {
     Ptr<BridgePortNetDevice> associatedPort;
     Time expirationTime;
-  };
-  std::map<MoosePrefixAddress, PrefixState> m_remoteState;
+  };  
 
   // Local Moose State
 
   struct SuffixState
   {
-    Mac48Address ethernetAddr;
+    Mac48Address ethernet;
+    MooseSuffixAddress suffix;
+    Time expirationTime;
+  };  
+
+  struct PortState 
+  {
+    Ptr<BridgePortNetDevice> associatedPort;
     Time expirationTime;
   };
-  std::map<MooseSuffixAddress, PrefixState> m_localState;
+  Time m_expirationTime;
+
+  std::map<MoosePrefixAddress, PrefixState> m_prefixState;
+  std::map<Mac48Address, SuffixState> m_suffixState;
+  std::map<MooseSuffixAddress, SuffixState*> m_ethernetState;
+  std::map<MooseSuffixAddress, PortState> m_portState;
 
 };
 
index 59a74cad5aa34d234a9b652c045d4a146b54fa60..e16bc0c41d9831c15f273b3b7df980d9f02e104b 100644 (file)
@@ -20,6 +20,7 @@
 #include "moose-bridge-net-device.h"
 #include "bridge-port-net-device.h"
 #include "moose-bridge-port-net-device.h"
+#include "ns3/moose-address.h"
 #include "ns3/node.h"
 #include "ns3/channel.h"
 #include "ns3/packet.h"
@@ -27,6 +28,8 @@
 #include "ns3/boolean.h"
 #include "ns3/simulator.h"
 #include "ns3/uinteger.h"
+#include "ns3/arp-l3-protocol.h"
+#include <iostream>
 
 NS_LOG_COMPONENT_DEFINE ("MooseBridgePortNetDevice");
 
@@ -51,6 +54,60 @@ MooseBridgePortNetDevice::~MooseBridgePortNetDevice(){
   NS_LOG_FUNCTION_NOARGS ();
 }
 
+void MooseBridgePortNetDevice::Send (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber){
+  NS_LOG_FUNCTION_NOARGS();
+  NS_LOG_DEBUG("Send(device=" << m_device << ",packet=" << packet << ",src=" << src << ",dest=" << dest << ",port=" << this << ",protocol=" << protocolNumber);
+  
+  BridgePortNetDevice::Send(packet, src, dest, protocolNumber);
 }
 
+void MooseBridgePortNetDevice::Receive (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol, Address const &src, Address const &dst, NetDevice::PacketType packetType){
+  NS_LOG_FUNCTION_NOARGS ();
+  NS_LOG_DEBUG("Receive(device=" << device << ",packet=" << packet << ",src=" << src << ",dst=" << dst << ",type=" << packetType << ",port=" << this << ",protocol=" << protocol << ")");
+
+  Mac48Address src48 = Mac48Address::ConvertFrom(src);
+
+  MooseAddress msrc(src48);
+
+  Ptr<MooseBridgeNetDevice> bridge = m_bridge->GetObject<MooseBridgeNetDevice>();
+
+  NS_ASSERT(bridge != NULL);
+
+  MooseAddress::MooseType mt = msrc.GetMooseType();
+
+  if(mt == MooseAddress::MOOSE){
+     // We have a MOOSE Packet. Let it continue.
+
+     NS_LOG_LOGIC("MOOSE Packet Received");
+
+     bridge->Learn(msrc, this);
+
+     bridge->Forward(this, packet, protocol, src, dst, packetType);
+
+  } else if(mt == MooseAddress::HOST) {
+     
+     NS_LOG_LOGIC("Unicast Packet Received");
+
+     MooseAddress newsrc = bridge->ToMoose(msrc);
+
+     packet->Print(std::cout); std::cout << std::endl;
+     if(protocol == ArpL3Protocol::PROT_NUMBER){
+        // Need to do ARP rewriting.
+
+     }
+
+     bridge->Learn(newsrc, this);
+
+     bridge->Forward(this, packet, protocol, newsrc.GetMacAddress(), dst, packetType);
+
+  } else {
+
+     NS_LOG_LOGIC("Multicast Packet Recieved");
+
+     bridge->Forward(this, packet, protocol, src, dst, packetType);     
+
+  }
+}
+
+}
 
index f0dfa780da6f3c017ee3e2d122a40b8ca2840271..a1a2b4297a4661c8abf54291edd41b261a6d2539 100644 (file)
@@ -45,6 +45,9 @@ public:
   MooseBridgePortNetDevice(Ptr<BridgeNetDevice> bridge, Ptr<NetDevice> device, Ptr<Node> node);
   virtual ~MooseBridgePortNetDevice();
 
+  virtual void Send (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber);
+  virtual void Receive (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol, Address const &source, Address const &destination, NetDevice::PacketType packetType);
+
   static TypeId GetTypeId (void);
 
 };
@@ -52,3 +55,4 @@ public:
 }
 
 #endif
+
index ab300a0b94e76f224badf0cdd36fe627a6e2abe4..e7802b14862830229d9de227ba80a40160eb61b9 100644 (file)
@@ -57,9 +57,15 @@ const Mac48Address MooseAddress::GetMacAddress() const
    return mac;
 }
 
-bool MooseAddress::IsMoose () const
+MooseAddress::MooseType MooseAddress::GetMooseType () const
 {
-  return (m_address[0] & 0x02) == 0x02;
+  if((m_address[0] & 0x01) == 0x01){
+       return GROUP;
+  } else if((m_address[0] & 0x02) == 0x02){
+       return MOOSE;
+  } else {
+        return HOST;
+  }
 }
 
 MooseAddress MooseAddress::Allocate()
@@ -82,7 +88,7 @@ MooseAddress MooseAddress::Allocate(MoosePrefixAddress prefix){
 
   uint16_t key = prefix.GetInt();
 
-  uint16_t val = ++ids[key];
+  uint32_t val = ++ids[key];
 
   MooseAddress moose;
   moose.m_address[0] = 0 | 0x02;                       // MOOSE Address
@@ -98,5 +104,26 @@ MooseAddress MooseAddress::Allocate(MoosePrefixAddress prefix){
 
 }
 
+MooseAddress MooseAddress::Combine(MoosePrefixAddress prefix, MooseSuffixAddress suffix){
+
+  uint16_t key = prefix.GetInt();
+  uint32_t val = suffix.GetInt();
+
+  MooseAddress moose;
+
+  moose.m_address[0] = 0 | 0x02;                        // MOOSE Address
+
+  moose.m_address[1] = (key >>  8) & 0xff;              // Bridge
+  moose.m_address[2] = (key >>  0) & 0xff;
+
+  moose.m_address[3] = (val >> 16) & 0xff;              // Port
+  moose.m_address[4] = (val >>  8) & 0xff;
+  moose.m_address[5] = (val >>  0) & 0xff;
+
+  return moose;
+
+}
+
+
 }
 
index 74253de681e2fdd7e1821c83e170b48c21165ef9..1a0d7ef893cc55bab68b80e83919f2d4dd3831d1 100644 (file)
@@ -42,11 +42,17 @@ public:
   MooseAddress (const char *str);
   MooseAddress (const Mac48Address &mac);
 
+  enum MooseType {
+     MOOSE,
+     HOST,
+     GROUP
+  };
+
   /**
-   * \returns true if this is a MOOSE address, false otherwise.
+   * \returns the MooseType of this address. 
    */
 
-  bool IsMoose() const;
+  MooseType GetMooseType() const;
 
   /**
    * \returns the MOOSE prefix
@@ -76,6 +82,12 @@ public:
    */
   static MooseAddress Allocate (MoosePrefixAddress prefix);
 
+  /**
+   * Form a Moose Address from Parts.
+   */
+
+  static MooseAddress Combine (MoosePrefixAddress prefix, MooseSuffixAddress suffix);
+
 private:
 
   uint8_t m_address[6];
index 49dc81439269bf3933d1e16e20bd1d334a0e19a0..512ffabfa0dc2767af6cd460507bfa3ea72e0c4a 100644 (file)
@@ -30,6 +30,12 @@ MooseSuffixAddress::MooseSuffixAddress(const uint8_t buffer[3]){
   memcpy(m_address, buffer, 3);
 }
 
-
+uint32_t MooseSuffixAddress::GetInt() const {
+  uint32_t val = 0;
+  val = m_address[0];
+  val += m_address[1] << 8;
+  val += m_address[2] << 16;
+  return val;
+}
 
 }
index 682710105339934a575cbfd2a6274c8f9b43e253..5b4e2b31655e4ff18a6e9341596b018d746aaac4 100644 (file)
@@ -32,6 +32,8 @@ public:
   MooseSuffixAddress();
   MooseSuffixAddress(const uint8_t buffer[3]);
 
+  uint32_t GetInt() const;
+
 private:
 
   uint8_t m_address[6];