--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/routing/click/model/ipv4-click-routing.h Wed Feb 23 17:50:31 2011 +0000
@@ -0,0 +1,247 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Lalith Suresh
+ *
+ * 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
+ *
+ * Authors: Lalith Suresh <suresh.lalith@gmail.com>
+ */
+
+#ifndef __IPV4_CLICK_ROUTING_H__
+#define __IPV4_CLICK_ROUTING_H__
+
+#include "ns3/object.h"
+#include "ns3/packet.h"
+#include "ns3/ipv4.h"
+#include "ns3/ipv4-routing-protocol.h"
+#include "ns3/test.h"
+
+#include <sys/time.h>
+#include <sys/types.h>
+
+#ifdef NS3_CLICK
+#include <click/simclick.h>
+#endif
+
+#include <map>
+#include <string>
+
+namespace ns3 {
+
+/**
+* \ingroup click
+* \brief Class to allow a node to use Click for external routing
+*/
+
+class Ipv4ClickRouting : public Ipv4RoutingProtocol
+{
+#ifdef NS3_CLICK
+public:
+ // Allow test cases to access private members
+ friend class ClickTrivialTest;
+ friend class ClickIfidFromNameTest;
+ friend class ClickIpMacAddressFromNameTest;
+
+ static TypeId GetTypeId (void);
+
+ Ipv4ClickRouting ();
+ virtual ~Ipv4ClickRouting ();
+
+protected:
+ virtual void DoStart (void);
+
+public:
+ virtual void DoDispose ();
+
+ /**
+ * \brief Click configuration file to be used by the node's Click Instance.
+ * \param clickfile name of .click configuration file
+ */
+ void SetClickFile (std::string clickfile);
+
+ /**
+ * \brief Name of the node as to be used by Click. Required for Click Dumps.
+ * \param name Name to be assigned to the node.
+ */
+ void SetNodeName (std::string name);
+
+ /**
+ * \brief Name of the routing table element being used by Click. Required for RouteOutput ()
+ * \param name Name of the routing table element.
+ */
+ void SetClickRoutingTableElement (std::string name);
+
+ /**
+ * \brief Read Handler interface for a node's Click Elements.
+ * Allows a user to read state information of a Click element.
+ * \param elementName name of the Click element
+ * \param handlerName name of the handler to be read
+ */
+ std::string ReadHandler (std::string elementName, std::string handlerName);
+
+ /**
+ * \brief Write Handler interface for a node's Click Elements
+ * Allows a user to modify state information of a Click element.
+ * \param elementName name of the Click element
+ * \param handlerName name of the handler to be read
+ * \param writeString string to be written using the write handler
+ */
+ int WriteHandler (std::string elementName, std::string handlerName, std::string writeString);
+
+ /**
+ *
+ * \brief Sets an interface to run on promiscuous mode.
+ */
+ void SetPromiscuous (std::string ifName);
+
+private:
+ simclick_node_t *m_simNode;
+
+ /**
+ * \brief Provide a mapping between the node reference used by Click and the corresponding Ipv4ClickRouting instance.
+ */
+ static std::map < simclick_node_t *, Ptr<Ipv4ClickRouting> > m_clickInstanceFromSimNode;
+
+public:
+ /**
+ * \brief Allows the Click service methods, which reside outside Ipv4ClickRouting, to get the required Ipv4ClickRouting instances.
+ * \param simnode The Click simclick_node_t instance for which the Ipv4ClickRouting instance is required
+ * \return A Ptr to the required Ipv4ClickRouting instance
+ */
+ static Ptr<Ipv4ClickRouting> GetClickInstanceFromSimNode (simclick_node_t *simnode);
+
+public:
+
+ /**
+ * \brief Provides for SIMCLICK_IFID_FROM_NAME
+ * \param ifname The name of the interface
+ * \return The interface ID which corresponds to ifname
+ */
+ int GetInterfaceId (const char *ifname);
+
+ /**
+ * \brief Provides for SIMCLICK_IPADDR_FROM_NAME
+ * \param ifid The interface ID for which the IP Address is required
+ * \return The IP Address of the interface in string format
+ */
+ std::string GetIpAddressFromInterfaceId (int ifid);
+
+ /**
+ * \brief Provides for SIMCLICK_MACADDR_FROM_NAME
+ * \param ifid The interface ID for which the MAC Address is required
+ * \return The MAC Address of the interface in string format
+ */
+ std::string GetMacAddressFromInterfaceId (int ifid);
+
+ /**
+ * \brief Provides for SIMCLICK_GET_NODE_NAME
+ * \return The Node name
+ */
+ std::string GetNodeName ();
+
+ /**
+ * \brief Provides for SIMCLICK_IF_READY
+ * \return Returns 1, if the interface is ready, -1 if ifid is invalid
+ */
+ bool IsInterfaceReady (int ifid);
+
+ /**
+ * \brief Set the Ipv4 instance to be used
+ * \param ipv4 The Ipv4 instance
+ */
+ virtual void SetIpv4 (Ptr<Ipv4> ipv4);
+
+private:
+ /**
+ * \brief Used internally in DoStart () to Add a mapping to m_clickInstanceFromSimNode mapping
+ */
+ void AddSimNodeToClickMapping ();
+
+ /**
+ * \brief This method has to be scheduled everytime Click calls SIMCLICK_SCHEDULE
+ */
+ void RunClickEvent ();
+
+public:
+
+ /**
+ * \brief Schedules simclick_click_run to run at the given time
+ * \param when Time at which the simclick_click_run instance should be run
+ */
+ void HandleScheduleFromClick (const struct timeval *when);
+
+ /**
+ * \brief Receives a packet from Click
+ * \param ifid The interface ID from which the packet is arriving
+ * \param type The type of packet as defined in click/simclick.h
+ * \param data The contents of the packet
+ * \param len The length of the packet
+ */
+ void HandlePacketFromClick (int ifid, int type, const unsigned char *data, int len);
+
+ /**
+ * \brief Sends a packet to Click
+ * \param ifid The interface ID from which the packet is arriving
+ * \param type The type of packet as defined in click/simclick.h
+ * \param data The contents of the packet
+ * \param len The length of the packet
+ */
+ void SendPacketToClick (int ifid, int type, const unsigned char *data, int len);
+
+ /**
+ * \brief Allow a higher layer to send data through Click. (From Ipv4ExtRouting)
+ * \param p The packet to be sent
+ * \param src The source IP Address
+ * \param dest The destination IP Address
+ */
+ void Send (Ptr<Packet> p, Ipv4Address src, Ipv4Address dest);
+
+ /**
+ * \brief Allow a lower layer to send data to Click. (From Ipv4ExtRouting)
+ * \param p The packet to be sent
+ * \param receiverAddr Receiving interface's address
+ * \param dest The Destination MAC address
+ */
+ void Receive (Ptr<Packet> p, Mac48Address receiverAddr, Mac48Address dest);
+
+ // From Ipv4RoutingProtocol
+ virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr);
+ virtual bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
+ UnicastForwardCallback ucb, MulticastForwardCallback mcb,
+ LocalDeliverCallback lcb, ErrorCallback ecb);
+ virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const;
+ virtual void NotifyInterfaceUp (uint32_t interface);
+ virtual void NotifyInterfaceDown (uint32_t interface);
+ virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address);
+ virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address);
+
+private:
+ std::string m_clickFile;
+ std::string m_nodeName;
+ std::string m_clickRoutingTableElement;
+
+
+ std::map < std::string, uint32_t > m_ifaceIdFromName;
+ std::map < std::string, Address > m_ifaceMacFromName;
+ std::map < std::string, Ipv4Address > m_ifaceAddrFromName;
+ bool m_clickInitialised;
+ bool m_nonDefaultName;
+
+ Ptr<Ipv4> m_ipv4;
+#endif //NS3_CLICK
+};
+
+} // namespace ns3
+
+#endif // __IPV4_CLICK_ROUTING_H__