blob: d83f6878eae85852048c08ca93bf5610cecb2902 [file] [log] [blame]
// -*- 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>
//
#ifndef CCNX_L3_PROTOCOL_H
#define CCNX_L3_PROTOCOL_H
#include <list>
#include <vector>
#include <stdint.h>
#include "ns3/ptr.h"
#include "ns3/net-device.h"
#include "ns3/ccnx.h"
#include "ns3/traced-callback.h"
namespace ns3 {
class Packet;
class NetDevice;
class CcnxInterface;
// class CcnxAddress;
// class CcnxHeader;
// class CcnxRoutingTableEntry;
class CcnxRoute;
class Node;
class Socket;
/**
* \brief Implement the Ccnx layer.
*
* This is the actual implementation of IP. It contains APIs to send and
* receive packets at the IP layer, as well as APIs for IP routing.
*
* This class contains two distinct groups of trace sources. The
* trace sources 'Rx' and 'Tx' are called, respectively, immediately
* after receiving from the NetDevice and immediately before sending
* to a NetDevice for transmitting a packet. These are low level
* trace sources that include the CcnxHeader already serialized into
* the packet. In contrast, the Drop, SendOutgoing, UnicastForward,
* and LocalDeliver trace sources are slightly higher-level and pass
* around the CcnxHeader as an explicit parameter and not as part of
* the packet.
*/
class CcnxL3Protocol : public Ccnx
{
public:
static TypeId GetTypeId (void);
static const uint16_t PROT_NUMBER;
CcnxL3Protocol();
virtual ~CcnxL3Protocol ();
/**
* \enum DropReason
* \brief Reason why a packet has been dropped.
*/
enum DropReason
{
DROP_TTL_EXPIRED = 1, /**< Packet TTL has expired */
DROP_NO_ROUTE, /**< No route to host */
DROP_BAD_CHECKSUM, /**< Bad checksum */
DROP_INTERFACE_DOWN, /**< Interface is down so can not send packet */
DROP_ROUTE_ERROR, /**< Route error */
};
void SetNode (Ptr<Node> node);
// functions defined in base class Ccnx
// void SetRoutingProtocol (Ptr<CcnxRoutingProtocol> routingProtocol);
// Ptr<CcnxRoutingProtocol> GetRoutingProtocol (void) const;
// Ptr<Socket> CreateRawSocket (void);
// void DeleteRawSocket (Ptr<Socket> socket);
/**
* Lower layer calls this method after calling L3Demux::Lookup
* The ARP subclass needs to know from which NetDevice this
* packet is coming to:
* - implement a per-NetDevice ARP cache
* - send back arp replies on the right device
* \param device network device
* \param p the packet
* \param protocol lower layer protocol value
* \param from lower layer address of the correspondant
* \param to lower layer address of the destination
* \param packetType type of the packet (broadcast/multicast/unicast/otherhost)
*/
void Receive ( Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol,
const Address &from,
const Address &to,
NetDevice::PacketType packetType);
/**
* \param packet packet to send
* \param route route entry
*
* Higher-level layers call this method to send a packet
* down the stack to the MAC and PHY layers.
*/
void Send (Ptr<Packet> packet, Ptr<CcnxRoute> route);
uint32_t AddInterface (Ptr<NetDevice> device);
Ptr<CcnxInterface> GetInterface (uint32_t i) const;
uint32_t GetNInterfaces (void) const;
int32_t GetInterfaceForDevice (Ptr<const NetDevice> device) const;
// bool IsDestinationAddress (CcnxAddress address, uint32_t iif) const;
void SetMetric (uint32_t i, uint16_t metric);
uint16_t GetMetric (uint32_t i) const;
uint16_t GetMtu (uint32_t i) const;
bool IsUp (uint32_t i) const;
void SetUp (uint32_t i);
void SetDown (uint32_t i);
Ptr<NetDevice> GetNetDevice (uint32_t i);
protected:
virtual void DoDispose (void);
/**
* This function will notify other components connected to the node that a new stack member is now connected
* This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them together.
*/
virtual void NotifyNewAggregate ();
private:
// friend class CcnxL3ProtocolTestCase;
CcnxL3Protocol(const CcnxL3Protocol &);
CcnxL3Protocol &operator = (const CcnxL3Protocol &);
void
SendRealOut (Ptr<CcnxRoute> route,
Ptr<Packet> packet,
CcnxHeader const &ipHeader);
// void
// IpForward (Ptr<CcnxRoute> rtentry,
// Ptr<const Packet> p,
// const CcnxHeader &header);
// void
// IpMulticastForward (Ptr<CcnxMulticastRoute> mrtentry,
// Ptr<const Packet> p,
// const CcnxHeader &header);
void LocalDeliver (Ptr<const Packet> p, CcnxHeader const&ip, uint32_t iif);
void RouteInputError (Ptr<const Packet> p, const CcnxHeader & ipHeader, Socket::SocketErrno sockErrno);
uint32_t AddCcnxInterface (Ptr<CcnxInterface> interface);
typedef std::vector<Ptr<CcnxInterface> > CcnxInterfaceList;
CcnxInterfaceList m_interfaces;
uint16_t m_identification;
Ptr<Node> m_node;
CcnxL4Protocol m_layer4;
TracedCallback<const CcnxHeader &, Ptr<const Packet>, uint32_t> m_sendOutgoingTrace;
TracedCallback<const CcnxHeader &, Ptr<const Packet>, uint32_t> m_unicastForwardTrace;
TracedCallback<const CcnxHeader &, Ptr<const Packet>, uint32_t> m_localDeliverTrace;
// The following two traces pass a packet with an IP header
TracedCallback<Ptr<const Packet>, Ptr<Ccnx>, uint32_t> m_txTrace;
TracedCallback<Ptr<const Packet>, Ptr<Ccnx>, uint32_t> m_rxTrace;
// <ip-header, payload, reason, ifindex> (ifindex not valid if reason is DROP_NO_ROUTE)
TracedCallback<const CcnxHeader &, Ptr<const Packet>, DropReason, Ptr<Ccnx>, uint32_t> m_dropTrace;
// Ptr<CcnxRoutingProtocol> m_routingProtocol;
};
} // Namespace ns3
#endif /* CCNX_L3_PROTOCOL_H */