blob: ce66a8922e09f0fd79216d55be2deea2e595cb8c [file] [log] [blame]
Junxiao Shia4f2be82014-03-02 22:56:41 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -07003 * Copyright (c) 2014 Regents of the University of California,
4 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology
9 *
10 * This file is part of NFD (Named Data Networking Forwarding Daemon).
11 * See AUTHORS.md for complete list of NFD authors and contributors.
12 *
13 * NFD is free software: you can redistribute it and/or modify it under the terms
14 * of the GNU General Public License as published by the Free Software Foundation,
15 * either version 3 of the License, or (at your option) any later version.
16 *
17 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
18 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
19 * PURPOSE. See the GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along with
22 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
23 **/
Junxiao Shia4f2be82014-03-02 22:56:41 -070024
25#include "face-table.hpp"
26#include "forwarder.hpp"
Steve DiBenedettobf6a93d2014-03-21 14:03:02 -060027#include "core/logger.hpp"
Junxiao Shia4f2be82014-03-02 22:56:41 -070028
29namespace nfd {
30
31NFD_LOG_INIT("FaceTable");
32
33FaceTable::FaceTable(Forwarder& forwarder)
34 : m_forwarder(forwarder)
35 , m_lastFaceId(0)
36{
37}
38
Steve DiBenedettoabe9e972014-02-20 15:37:04 -070039FaceTable::~FaceTable()
40{
41
42}
43
Junxiao Shia4f2be82014-03-02 22:56:41 -070044void
45FaceTable::add(shared_ptr<Face> face)
46{
Alexander Afanasyevbc521a52014-03-26 23:31:55 -070047 if (face->getId() != INVALID_FACEID &&
48 m_faces.count(face->getId()) > 0)
49 {
50 NFD_LOG_DEBUG("Trying to add existing face id=" << face->getId() << " to the face table");
51 return;
52 }
53
Junxiao Shia4f2be82014-03-02 22:56:41 -070054 FaceId faceId = ++m_lastFaceId;
55 face->setId(faceId);
56 m_faces[faceId] = face;
Junxiao Shi6e694322014-04-03 10:27:13 -070057 NFD_LOG_INFO("Added face id=" << faceId << " remote=" << face->getRemoteUri() <<
58 " local=" << face->getLocalUri());
Junxiao Shia4f2be82014-03-02 22:56:41 -070059
60 face->onReceiveInterest += bind(&Forwarder::onInterest,
Junxiao Shic542b2b2014-03-16 21:45:52 -070061 &m_forwarder, boost::ref(*face), _1);
Junxiao Shia4f2be82014-03-02 22:56:41 -070062 face->onReceiveData += bind(&Forwarder::onData,
Junxiao Shic542b2b2014-03-16 21:45:52 -070063 &m_forwarder, boost::ref(*face), _1);
64 face->onFail += bind(&FaceTable::remove,
65 this, face);
Junxiao Shibd392bf2014-03-17 15:54:11 -070066
67 this->onAdd(face);
Junxiao Shia4f2be82014-03-02 22:56:41 -070068}
69
70void
71FaceTable::remove(shared_ptr<Face> face)
72{
Junxiao Shibd392bf2014-03-17 15:54:11 -070073 this->onRemove(face);
74
Junxiao Shia4f2be82014-03-02 22:56:41 -070075 FaceId faceId = face->getId();
76 m_faces.erase(faceId);
77 face->setId(INVALID_FACEID);
Junxiao Shi6e694322014-04-03 10:27:13 -070078 NFD_LOG_INFO("Removed face id=" << faceId << " remote=" << face->getRemoteUri() <<
79 " local=" << face->getLocalUri());
Junxiao Shia4f2be82014-03-02 22:56:41 -070080
81 // XXX This clears all subscriptions, because EventEmitter
82 // does not support only removing Forwarder's subscription
83 face->onReceiveInterest.clear();
84 face->onReceiveData .clear();
Junxiao Shic542b2b2014-03-16 21:45:52 -070085 // don't clear onFail because other functions may need to execute
Junxiao Shia4f2be82014-03-02 22:56:41 -070086
87 m_forwarder.getFib().removeNextHopFromAllEntries(face);
88}
89
Steve DiBenedettoabe9e972014-02-20 15:37:04 -070090
91
Junxiao Shia4f2be82014-03-02 22:56:41 -070092} // namespace nfd