Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(1392)

Unified Diff: src/internet-stack/ipv4-static-routing-impl.h

Issue 65047: ns-3 ipv4 changes
Patch Set: Created 14 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/internet-stack/ipv4-static-routing-impl.h
===================================================================
new file mode 100644
--- /dev/null
+++ b/src/internet-stack/ipv4-static-routing-impl.h
@@ -0,0 +1,367 @@
+// -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*-
+//
+// Copyright (c) 2006 Georgia Tech Research Corporation
+//
+// 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: George F. Riley<riley@ece.gatech.edu>
+// Gustavo Carneiro <gjc@inescporto.pt>
+//
+
+#ifndef IPV4_STATIC_ROUTING_IMPL_H
+#define IPV4_STATIC_ROUTING_IMPL_H
+
+#include <list>
+#include <stdint.h>
+#include "ns3/ipv4-address.h"
+#include "ns3/ipv4-header.h"
+#include "ns3/socket.h"
+#include "ns3/ptr.h"
+#include "ns3/ipv4.h"
+#include "ns3/ipv4-static-routing.h"
+
+namespace ns3 {
+
+class Packet;
+class NetDevice;
+class Ipv4Interface;
+class Ipv4Address;
+class Ipv4Header;
+class Ipv4RoutingTableEntry;
+class Ipv4MulticastRoutingTableEntry;
+class Node;
+
+class Ipv4StaticRoutingImpl : public Ipv4StaticRouting
+{
+public:
+ static TypeId GetTypeId (void);
+
+ Ipv4StaticRoutingImpl ();
+ virtual ~Ipv4StaticRoutingImpl ();
+
+ virtual Ptr<Ipv4Route> RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &errno);
+
+ virtual bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
+ UnicastForwardCallback ucb, MulticastForwardCallback mcb,
+ LocalDeliverCallback lcb, ErrorCallback ecb);
+
+/**
+ * @brief Add a host route to the static routing table.
faker.moatamri 2009/05/15 07:55:26 should be \brief, \param, etc...
+ *
+ * @param dest The Ipv4Address destination for this route.
+ * @param nextHop The Ipv4Address of the next hop in the route.
+ * @param interface The network interface index used to send packets to the
+ * destination.
+ *
+ * @see Ipv4Address
+ */
+ void AddHostRouteTo (Ipv4Address dest,
+ Ipv4Address nextHop,
+ uint32_t interface);
+/**
+ * @brief Add a host route to the static routing table.
+ *
+ * @param dest The Ipv4Address destination for this route.
+ * @param interface The network interface index used to send packets to the
+ * destination.
+ *
+ * @see Ipv4Address
+ */
+ void AddHostRouteTo (Ipv4Address dest,
+ uint32_t interface);
+
+/**
+ * @brief Add a network route to the static routing table.
+ *
+ * @param network The Ipv4Address network for this route.
+ * @param networkMask The Ipv4Mask to extract the network.
+ * @param nextHop The next hop in the route to the destination network.
+ * @param interface The network interface index used to send packets to the
+ * destination.
+ *
+ * @see Ipv4Address
+ */
+ void AddNetworkRouteTo (Ipv4Address network,
+ Ipv4Mask networkMask,
+ Ipv4Address nextHop,
+ uint32_t interface);
+
+/**
+ * @brief Add a network route to the static routing table.
+ *
+ * @param network The Ipv4Address network for this route.
+ * @param networkMask The Ipv4Mask to extract the network.
+ * @param interface The network interface index used to send packets to the
+ * destination.
+ *
+ * @see Ipv4Address
+ */
+ void AddNetworkRouteTo (Ipv4Address network,
+ Ipv4Mask networkMask,
+ uint32_t interface);
+
+/**
+ * @brief Add a default route to the static routing table.
+ *
+ * This method tells the routing system what to do in the case where a specific
+ * route to a destination is not found. The system forwards packets to the
+ * specified node in the hope that it knows better how to route the packet.
+ *
+ * If the default route is set, it is returned as the selected route from
+ * LookupStatic irrespective of destination address if no specific route is
+ * found.
+ *
+ * @param nextHop The Ipv4Address to send packets to in the hope that they
+ * will be forwarded correctly.
+ * @param interface The network interface index used to send packets.
+ *
+ * @see Ipv4Address
+ * @see Ipv4StaticRouting::Lookup
+ */
+ void SetDefaultRoute (Ipv4Address nextHop,
+ uint32_t interface);
+
+/**
+ * @brief Get the number of individual unicast routes that have been added
+ * to the routing table.
+ *
+ * @warning The default route counts as one of the routes.
+ */
+ uint32_t GetNRoutes (void);
+
+/**
+ * @brief Get the default route from the static routing table.
+ *
+ * @return If the default route is set, a pointer to that Ipv4RoutingTableEntry is
+ * returned, otherwise a zero pointer is returned.
+ *
+ * @see Ipv4RoutingTableEntry
+ */
+ Ipv4RoutingTableEntry GetDefaultRoute (void);
+
+/**
+ * @brief Get a route from the static unicast routing table.
+ *
+ * Externally, the unicast static routing table appears simply as a table with
+ * n entries. The one sublety of note is that if a default route has been set
+ * it will appear as the zeroth entry in the table. This means that if you
+ * add only a default route, the table will have one entry that can be accessed
+ * either by explicity calling GetDefaultRoute () or by calling GetRoute (0).
+ *
+ * Similarly, if the default route has been set, calling RemoveRoute (0) will
+ * remove the default route.
+ *
+ * @param i The index (into the routing table) of the route to retrieve. If
+ * the default route has been set, it will occupy index zero.
+ * @return If route is set, a pointer to that Ipv4RoutingTableEntry is returned, otherwise
+ * a zero pointer is returned.
+ *
+ * @see Ipv4RoutingTableEntry
+ * @see Ipv4StaticRouting::RemoveRoute
+ */
+ Ipv4RoutingTableEntry GetRoute (uint32_t i);
+
+/**
+ * @brief Remove a route from the static unicast routing table.
+ *
+ * Externally, the unicast static routing table appears simply as a table with
+ * n entries. The one sublety of note is that if a default route has been set
+ * it will appear as the zeroth entry in the table. This means that if the
+ * default route has been set, calling RemoveRoute (0) will remove the
+ * default route.
+ *
+ * @param i The index (into the routing table) of the route to remove. If
+ * the default route has been set, it will occupy index zero.
+ *
+ * @see Ipv4RoutingTableEntry
+ * @see Ipv4StaticRouting::GetRoute
+ * @see Ipv4StaticRouting::AddRoute
+ */
+ void RemoveRoute (uint32_t i);
+
+/**
+ * @brief Add a multicast route to the static routing table.
+ *
+ * A multicast route must specify an origin IP address, a multicast group and
+ * an input network interface index as conditions and provide a vector of
+ * output network interface indices over which packets matching the conditions
+ * are sent.
+ *
+ * Typically there are two main types of multicast routes: routes of the
+ * first kind are used during forwarding. All of the conditions must be
+ * exlicitly provided. The second kind of routes are used to get packets off
+ * of a local node. The difference is in the input interface. Routes for
+ * forwarding will always have an explicit input interface specified. Routes
+ * off of a node will always set the input interface to a wildcard specified
+ * by the index Ipv4RoutingProtocol::INTERFACE_ANY.
+ *
+ * For routes off of a local node wildcards may be used in the origin and
+ * multicast group addresses. The wildcard used for Ipv4Adresses is that
+ * address returned by Ipv4Address::GetAny () -- typically "0.0.0.0". Usage
+ * of a wildcard allows one to specify default behavior to varying degrees.
+ *
+ * For example, making the origin address a wildcard, but leaving the
+ * multicast group specific allows one (in the case of a node with multiple
+ * interfaces) to create different routes using different output interfaces
+ * for each multicast group.
+ *
+ * If the origin and multicast addresses are made wildcards, you have created
+ * essentially a default multicast address that can forward to multiple
+ * interfaces. Compare this to the actual default multicast address that is
+ * limited to specifying a single output interface for compatibility with
+ * existing functionality in other systems.
+ *
+ * @param origin The Ipv4Address of the origin of packets for this route. May
+ * be Ipv4Address:GetAny for open groups.
+ * @param group The Ipv4Address of the multicast group or this route.
+ * @param inputInterface The input network interface index over which to
+ * expect packets destined for this route. May be
+ * Ipv4RoutingProtocol::INTERFACE_ANY for packets of local origin.
+ * @param outputInterfaces A vector of network interface indices used to specify
+ * how to send packets to the destination(s).
+ *
+ * @see Ipv4Address
+ */
+ void AddMulticastRoute (Ipv4Address origin,
+ Ipv4Address group,
+ uint32_t inputInterface,
+ std::vector<uint32_t> outputInterfaces);
+
+/**
+ * @brief Add a default multicast route to the static routing table.
+ *
+ * This is the multicast equivalent of the unicast version SetDefaultRoute.
+ * We tell the routing system what to do in the case where a specific route
+ * to a destination multicast group is not found. The system forwards
+ * packets out the specified interface in the hope that "something out there"
+ * knows better how to route the packet. This method is only used in
+ * initially sending packets off of a host. The default multicast route is
+ * not consulted during forwarding -- exact routes must be specified using
+ * AddMulticastRoute for that case.
+ *
+ * Since we're basically sending packets to some entity we think may know
+ * better what to do, we don't pay attention to "subtleties" like origin
+ * address, nor do we worry about forwarding out multiple interfaces. If the
+ * default multicast route is set, it is returned as the selected route from
+ * LookupStatic irrespective of origin or multicast group if another specific
+ * route is not found.
+ *
+ * @param outputInterface The network interface index used to specify where
+ * to send packets in the case of unknown routes.
+ *
+ * @see Ipv4Address
+ */
+ void SetDefaultMulticastRoute (uint32_t outputInterface);
+
+/**
+ * @brief Get the number of individual multicast routes that have been added
+ * to the routing table.
+ *
+ * @warning The default multicast route counts as one of the routes.
+ */
+ uint32_t GetNMulticastRoutes (void) const;
+
+/**
+ * @brief Get a route from the static multicast routing table.
+ *
+ * Externally, the multicast static routing table appears simply as a table
+ * with n entries.
+ *
+ * @param i The index (into the routing table) of the multicast route to
+ * retrieve.
+ * @return If route \e i is set, a pointer to that Ipv4MulticastRoutingTableEntry is
+ * returned, otherwise a zero pointer is returned.
+ *
+ * @see Ipv4MulticastRoutingTableEntry
+ * @see Ipv4StaticRouting::RemoveRoute
+ */
+ Ipv4MulticastRoutingTableEntry GetMulticastRoute (uint32_t i) const;
+
+/**
+ * @brief Remove a route from the static multicast routing table.
+ *
+ * Externally, the multicast static routing table appears simply as a table
+ * with n entries.
+ * This method causes the multicast routing table to be searched for the first
+ * route that matches the parameters and removes it.
+ *
+ * Wildcards may be provided to this function, but the wildcards are used to
+ * exacly match wildcards in the routes (see AddMulticastRoute). That is,
+ * calling RemoveMulticastRoute with the origin set to "0.0.0.0" will not
+ * remove routes with any address in the origin, but will only remove routes
+ * with "0.0.0.0" set as the the origin.
+ *
+ * @param origin The IP address specified as the origin of packets for the
+ * route.
+ * @param group The IP address specified as the multicast group addres of
+ * the route.
+ * @param inputInterface The network interface index specified as the expected
+ * input interface for the route.
+ * @returns true if a route was found and removed, false otherwise.
+ *
+ * @see Ipv4MulticastRoutingTableEntry
+ * @see Ipv4StaticRouting::AddMulticastRoute
+ */
+ bool RemoveMulticastRoute (Ipv4Address origin,
+ Ipv4Address group,
+ uint32_t inputInterface);
+
+/**
+ * @brief Remove a route from the static multicast routing table.
+ *
+ * Externally, the multicast static routing table appears simply as a table
+ * with n entries.
+ *
+ * @param index The index (into the multicast routing table) of the route to
+ * remove.
+ *
+ * @see Ipv4RoutingTableEntry
+ * @see Ipv4StaticRouting::GetRoute
+ * @see Ipv4StaticRouting::AddRoute
+ */
+ void RemoveMulticastRoute (uint32_t index);
+
+ void SetNode (Ptr<Node> node);
+ Ptr<Node> GetNode (void) const;
+
+protected:
+ void DoDispose (void);
+
+private:
+ typedef std::list<Ipv4RoutingTableEntry *> HostRoutes;
+ typedef std::list<Ipv4RoutingTableEntry *>::const_iterator HostRoutesCI;
+ typedef std::list<Ipv4RoutingTableEntry *>::iterator HostRoutesI;
+ typedef std::list<Ipv4RoutingTableEntry *> NetworkRoutes;
+ typedef std::list<Ipv4RoutingTableEntry *>::const_iterator NetworkRoutesCI;
+ typedef std::list<Ipv4RoutingTableEntry *>::iterator NetworkRoutesI;
+
+ typedef std::list<Ipv4MulticastRoutingTableEntry *> MulticastRoutes;
+ typedef std::list<Ipv4MulticastRoutingTableEntry *>::const_iterator MulticastRoutesCI;
+ typedef std::list<Ipv4MulticastRoutingTableEntry *>::iterator MulticastRoutesI;
+
+ Ptr<Ipv4Route> LookupStatic (Ipv4Address dest);
+ Ptr<Ipv4MulticastRoute> LookupStatic (Ipv4Address origin, Ipv4Address group,
+ uint32_t interface);
+
+ HostRoutes m_hostRoutes;
+ NetworkRoutes m_networkRoutes;
+ Ipv4RoutingTableEntry *m_defaultRoute;
+ MulticastRoutes m_multicastRoutes;
+
+ Ptr<Node> m_node;
+};
+
+} // Namespace ns3
+
+#endif /* IPV4_STATIC_ROUTING_IMPL_H */

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b