src/node/net-device.h
changeset 234 6124bda39cb3
child 247 fb7375bb43d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/net-device.h	Thu Feb 08 15:37:48 2007 +0100
@@ -0,0 +1,221 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006 INRIA
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#ifndef NET_DEVICE_H
+#define NET_DEVICE_H
+
+#include <string>
+#include <stdint.h>
+#include "ns3/callback.h"
+#include "ns3/packet.h"
+#include "mac-address.h"
+
+namespace ns3 {
+
+class Ipv4L4Demux;
+class Node;
+
+/**
+ * \brief Network layer to device interface
+ *
+ * This interface defines the API which the IP and ARP
+ * layers need to access to manage an instance of a network device 
+ * layer. It currently does not support MAC-level 
+ * multicast but this should not be too hard to add by adding
+ * extra methods to register MAC multicast addresses to
+ * filter out unwanted packets before handing them to the
+ * higher layers.
+ *
+ * In Linux, this interface is analogous to the interface
+ * just above dev_queue_xmit() (i.e., IP packet is fully
+ * constructed with destination MAC address already selected).
+ * 
+ * If you want to write a new MAC layer, you need to subclass
+ * this base class and implement your own version of the 
+ * NetDevice::SendTo method.
+ */
+class NetDevice {
+ public:
+  /**
+   * \param node base class node pointer of device's node 
+   */
+  NetDevice(Node& node, const MacAddress& addr);
+  virtual ~NetDevice() {}
+  /**
+   * \return the current MacAddress of this interface.
+   */
+  MacAddress GetAddress (void) const;
+  /**
+   * \param mtu MTU value, in bytes, to set for the device
+   * \return whether the MTU value was within legal bounds
+   * 
+   * Override for default MTU defined on a per-type basis.
+   */
+  bool SetMtu (const uint16_t mtu);
+  /**
+   * \return the link-level MTU in bytes for this interface.
+   * 
+   * This value is typically used by the IP layer to perform
+   * IP fragmentation when needed.
+   */
+  uint16_t GetMtu (void) const;
+  /**
+   * \param name name of the device (e.g. "eth0")
+   */
+  void SetName(const std::string name); 
+  /**
+   * \return name name of the device (e.g. "eth0")
+   */
+  std::string GetName(void) const;
+  /**
+   * \return true if link is up; false otherwise
+   */
+  bool IsLinkUp (void) const;
+  /**
+   * \param callback the callback to invoke
+   *
+   * Register a callback invoked whenever the link 
+   * status changes to UP. This callback is typically used
+   * by the IP/ARP layer to flush the ARP cache 
+   * whenever the link goes up.
+   */
+  void SetLinkChangeCallback (Callback<void> callback);
+  /**
+   * \return true if this interface supports a broadcast address,
+   *         false otherwise.
+   */
+  bool IsBroadcast (void) const;
+  /**
+   * \return the broadcast address supported by
+   *         this netdevice.
+   *
+   * Calling this method is invalid if IsBroadcast returns
+   * not true.
+   */
+  MacAddress const &GetBroadcast (void) const;
+  /**
+   * \return value of m_isMulticast flag
+   */
+  bool IsMulticast (void) const;
+  /**
+   * \return value of m_isPointToPoint flag
+   */
+  bool IsPointToPoint (void) const;
+  /**
+   * \param p packet sent from above down to Network Device
+   * \param dest mac address of the destination (already resolved)
+   * \param protocolNumber identifies the type of payload contained in
+   *        this packet. Used to call the right L3Protocol when the packet
+   *        is received.
+   * 
+   *  Called from higher layer to send packet into Network Device
+   *  to the specified destination MacAddress
+   * 
+   * \return whether the Send operation succeeded 
+   */
+  bool Send(Packet& p, const MacAddress& dest, uint16_t protocolNumber);
+
+ protected:
+  /**
+   * Enable broadcast support. This method should be
+   * called by subclasses from their constructor
+   */
+  void EnableBroadcast (MacAddress broadcast);
+  /**
+   * Set m_isBroadcast flag to false
+   */
+  void DisableBroadcast (void);
+  /**
+   * Set m_isMulticast flag to true
+   */
+  void EnableMulticast (void);
+  /**
+   * Set m_isMulticast flag to false
+   */
+  void DisableMulticast (void);
+  /**
+   * Set m_isPointToPoint flag to true
+   */
+  void EnablePointToPoint (void);
+  /**
+   * Set m_isPointToPoint flag to false
+   */
+  void DisablePointToPoint (void);
+  /**
+   * When a subclass notices that the link status has changed to up,
+   * it notifies its parent class by calling this method. This method
+   * is responsible for notifying any LinkUp callbacks. 
+   */
+  void NotifyLinkUp (void);
+  /**
+   * When a subclass notices that the link status has changed to 
+   * down, it notifies its parent class by calling this method.
+   */
+  void NotifyLinkDown (void);
+  /**
+   * \returns the node base class which contains this network
+   *          interface.
+   *
+   * When a subclass needs to get access to the underlying node
+   * base class to print the nodeid for example, it can invoke
+   * this method.
+   */
+  Node& GetNode (void) const;
+
+  /**
+   * \param p packet sent from below up to Network Device
+   * \param from source mac address of the sender 
+   * \returns true if the packet was forwarded successfully,
+   *          false otherwise.
+   *
+   * When a subclass gets a packet from the PHY layer, it 
+   * forwards it to the higher layers by calling this method
+   * which is responsible for passing it up to the Rx callback.
+   */
+  bool ForwardUp (Packet& p);
+
+ private:
+  /**
+   * \param p packet to send
+   * \param dest address of destination to which packet must be sent
+   * \returns true if the packet could be sent successfully, false
+   *          otherwise.
+   *
+   * This is the private virtual target function of the public Send()
+   * method.  When the link is Up, this method is invoked to ask 
+   * subclasses to forward packets down to the PHY layer. Subclasses 
+   * MUST override this method.
+   */
+  virtual bool SendTo (Packet& p, const MacAddress& dest) = 0;
+  Node&         m_node;
+  std::string   m_name;
+  uint16_t      m_ifIndex;
+  MacAddress    m_address;
+  MacAddress    m_broadcast;
+  uint16_t      m_mtu;
+  bool          m_isUp;
+  bool          m_isBroadcast;
+  bool          m_isMulticast;
+  bool          m_isPointToPoint;
+  Callback<void> m_linkChangeCallback;
+};
+
+}; // namespace ns3
+#endif