/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/*
 * Copyright (c) 2005,2006,2007 INRIA
 *
 * 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:
 *
 */

#include "ccnx-local-face.h"

#include "ns3/ccnx-l3-protocol.h"
#include "ns3/net-device.h"
#include "ns3/log.h"
#include "ns3/packet.h"
#include "ns3/node.h"
#include "ns3/pointer.h"
#include "ns3/assert.h" 

NS_LOG_COMPONENT_DEFINE ("CcnxLocalFace");

namespace ns3 {

NS_OBJECT_ENSURE_REGISTERED (CcnxLocalFace);

TypeId 
CcnxLocalFace::GetTypeId (void)
{
  static TypeId tid = TypeId ("ns3::CcnxLocalFace")
    .SetParent<Object> ()
  ;
  return tid;
}

/** 
 * By default, Ccnx interface are created in the "down" state
 *  with no IP addresses.  Before becoming useable, the user must 
 * invoke SetUp on them once an Ccnx address and mask have been set.
 */
CcnxLocalFace::CcnxLocalFace () 
{
  NS_LOG_FUNCTION (this);
}

CcnxLocalFace::~CcnxLocalFace ()
{
  NS_LOG_FUNCTION_NOARGS ();
}

void
CcnxLocalFace::DoDispose (void)
{
  NS_LOG_FUNCTION_NOARGS ();
  CcnxFace::DoDispose ();
}

void 
CcnxLocalFace::SetDevice (Ptr<NetDevice> device)
{
  NS_ASSERT_MSG (false, "It is impossible to set device to LocalFace");
}

Ptr<NetDevice>
CcnxLocalFace::GetDevice (void) const
{
  return 0;
}

void
CcnxLocalFace::Send (Ptr<Packet> p)
{
  NS_LOG_FUNCTION (*p);
  if (!IsUp ())
    {
      return;
    }

  // m_device->Send (p, m_device->GetBroadcast (), 
  //                 CcnxL3Protocol::PROT_NUMBER);
}

std::ostream& operator<< (std::ostream& os, CcnxLocalFace const& localFace)
{
  os << "dev=local";
  return os;
}

}; // namespace ns3

