FAQ
===

Boost libraries
---------------

.. topic:: Custom boost libraries compilation problem

    I'm trying to use custom boost libraries, but something is going wrong. What should I do?

.. Please refer to :ref:`boost-custom-install` section for an example how custom boost libraries could be built.

.. include::  boost-custom-install.rst

Visualizer problems
-------------------

.. topic:: Visualizer module is not working

    Every time I'm trying to run visualizer, I get the following error::

        Waf: Entering directory `/ndnSIM/ns-3/build'
        Could not find a task generator for the name 'ns3-visualizer'..

Something is wrong with your python bindings and python bindings dependencies. 
Please follow the :ref:`requirements` section that lists what should be installed in order to run visualizer.

Code questions
--------------

.. topic:: Failing a link between nodes

    How can I fail a link between to NDN nodes?


Right now, NS-3 does not provide ability to actually "break" the link between nodes in NS-3.
However, exactly the same effect can be achieved by making an interface (:ndnsim:`ndn::Face`) up or down (:ndnsim:`ndn::Face::SetUp(true)` or :ndnsim:`ndn::Face::SetUp(false)`).

Here is an example of function to "fail" a point-to-point link between two NDN nodes:

.. code-block:: c++

    // hijacker is more than an application. just disable all faces
    void
    FailLinks (Ptr<Node> node1, Ptr<Node> node2)
    {
      Ptr<ndn::L3Protocol> ndn1 = node1->GetObject<ndn::L3Protocol> ();
      Ptr<ndn::L3Protocol> ndn2 = node2->GetObject<ndn::L3Protocol> ();
    
      // iterate over all faces to find the right one
      for (uint32_t faceId = 0; faceId < ndn1->GetNFaces (); faceId++)
        {
          Ptr<ndn::NetDeviceFace> ndFace = ndn1->GetFace (faceId)->GetObject<ndn::NetDeviceFace> ();
          if (ndFace == 0) continue;
     
          Ptr<PointToPointNetDevice> nd1 = ndFace->GetNetDevice ()->GetObject<PointToPointNetDevice> ();
          if (nd1 == 0) continue;
     
          Ptr<Channel> channel = nd1->GetChannel ();
          if (channel == 0) continue;
     
          Ptr<PointToPointChannel> ppChannel = DynamicCast<PointToPointChannel> (channel);
     
          Ptr<NetDevice> nd2 = ppChannel->GetDevice (0);
          if (nd2->GetNode () == node1)
            nd2 = ppChannel->GetDevice (1);
     
          if (nd2->GetNode () == node2)
            {
              Ptr<ndn::Face> face1 = ndn1->GetFaceByNetDevice (nd1);
              Ptr<ndn::Face> face2 = ndn2->GetFaceByNetDevice (nd2);
     
              face1->SetUp (false);
              face2->SetUp (false);
              break;
            }
        }
    }
     

General questions
-----------------

.. topic:: Errors/bugs reporting

    I found an error in the documentation / bug in the code. What should I do?

Please create an issue for the documentation error or code bug.  
We will try to resolve the problem as fast as we can.
