/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
 * Copyright (c) 2014-2016,  The University of Memphis,
 *                           Regents of the University of California
 *
 * This file is part of NLSR (Named-data Link State Routing).
 * See AUTHORS.md for complete list of NLSR authors and contributors.
 *
 * NLSR is free software: you can redistribute it and/or modify it under the terms
 * of the GNU General Public License as published by the Free Software Foundation,
 * either version 3 of the License, or (at your option) any later version.
 *
 * NLSR 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
 * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
 *
 * \author A K M Mahmudul Hoque <ahoque1@memphis.edu>
 *
 **/

#include "conf-parameter.hpp"
#include "logger.hpp"

namespace nlsr {

INIT_LOGGER("ConfParameter");

void
ConfParameter::writeLog()
{
  _LOG_DEBUG("Router Name: " << m_routerName);
  _LOG_DEBUG("Site Name: " << m_siteName);
  _LOG_DEBUG("Network: " << m_network);
  _LOG_DEBUG("Router Prefix: " << m_routerPrefix);
  _LOG_DEBUG("ChronoSync sync Prefix: " << m_chronosyncPrefix);
  _LOG_DEBUG("ChronoSync LSA prefix: " << m_lsaPrefix);
  _LOG_DEBUG("Hello Interest retry number: " << m_interestRetryNumber);
  _LOG_DEBUG("Hello Interest resend second: " << m_interestResendTime);
  _LOG_DEBUG("Info Interest interval: " << m_infoInterestInterval);
  _LOG_DEBUG("LSA refresh time: " << m_lsaRefreshTime);
  _LOG_DEBUG("LSA Interest lifetime: " << getLsaInterestLifetime());
  _LOG_DEBUG("Router dead interval: " << getRouterDeadInterval());
  _LOG_DEBUG("Max Faces Per Prefix: " << m_maxFacesPerPrefix);
  _LOG_DEBUG("Hyperbolic Routing: " << m_hyperbolicState);
  _LOG_DEBUG("Hyp R: " << m_corR);
  _LOG_DEBUG("Hyp theta: " << m_corTheta);
  _LOG_DEBUG("Log Directory: " << m_logDir);
  _LOG_DEBUG("Seq Directory: " << m_seqFileDir);

  // Event Intervals
  _LOG_DEBUG("Adjacency LSA build interval:  " << m_adjLsaBuildInterval);
  _LOG_DEBUG("First Hello Interest interval: " << m_firstHelloInterval);
  _LOG_DEBUG("Routing calculation interval:  " << m_routingCalcInterval);
}

} // namespace nlsr
