make chronosync a dependency
refs: #2400
Change-Id: I8b488f165a4f9a2c9a7731931be3b6d2e3c43c89
diff --git a/.jenkins.d/01-dependencies.sh b/.jenkins.d/01-dependencies.sh
index b1ba81f..760b057 100755
--- a/.jenkins.d/01-dependencies.sh
+++ b/.jenkins.d/01-dependencies.sh
@@ -9,8 +9,8 @@
set -x
brew update
brew upgrade
- brew install boost pkg-config sqlite cryptopp log4cxx protobuf openssl
- brew link --force openssl log4cxx protobuf
+ brew install boost pkg-config sqlite cryptopp log4cxx openssl
+ brew link --force openssl log4cxx
brew cleanup
fi
@@ -24,5 +24,5 @@
sudo apt-get update -qq -y
sudo apt-get -qq -y install build-essential pkg-config $BOOST_PKG \
libcrypto++-dev libsqlite3-dev \
- liblog4cxx10-dev protobuf-compiler libprotobuf-dev libssl-dev
+ liblog4cxx10-dev libssl-dev
fi
diff --git a/.jenkins.d/10-ndn-cxx.sh b/.jenkins.d/10-ndn-cxx.sh
index 69d337e..0d4239e 100755
--- a/.jenkins.d/10-ndn-cxx.sh
+++ b/.jenkins.d/10-ndn-cxx.sh
@@ -49,6 +49,6 @@
if has Linux $NODE_LABELS; then
sudo ldconfig
-elif has FreeBSD $NODE_LABELS; then
- sudo ldconfig -a
+elif has FreeBSD10 $NODE_LABELS; then
+ sudo ldconfig -m
fi
diff --git a/.jenkins.d/11-chronosync.sh b/.jenkins.d/11-chronosync.sh
new file mode 100755
index 0000000..6fb1d9f
--- /dev/null
+++ b/.jenkins.d/11-chronosync.sh
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+set -x
+set -e
+
+JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+source "$JDIR"/util.sh
+
+pushd /tmp >/dev/null
+
+INSTALLED_VERSION=
+if has OSX $NODE_LABELS; then
+ BOOST=$(brew ls --versions boost)
+ OLD_BOOST=$(cat boost_chrono.txt || :)
+ if [[ $OLD_BOOST != $BOOST ]]; then
+ echo "$BOOST" > boost_chrono.txt
+ INSTALLED_VERSION=NONE
+ fi
+fi
+
+if [[ -z $INSTALLED_VERSION ]]; then
+ INSTALLED_VERSION=$((cd ChronoSync && git rev-parse HEAD) 2>/dev/null || echo NONE)
+fi
+
+sudo rm -Rf ChronoSync-latest
+
+git clone --depth 1 git://github.com/named-data/ChronoSync ChronoSync-latest
+
+LATEST_VERSION=$((cd ChronoSync-latest && git rev-parse HEAD) 2>/dev/null || echo UNKNOWN)
+
+if [[ $INSTALLED_VERSION != $LATEST_VERSION ]]; then
+ sudo rm -Rf ChronoSync
+ mv ChronoSync-latest ChronoSync
+else
+ sudo rm -Rf ChronoSync-latest
+fi
+
+sudo rm -Rf /usr/local/include/ChronoSync
+sudo rm -f /usr/local/lib/libChronoSync*
+sudo rm -f /usr/local/lib/pkgconfig/ChronoSync*
+
+pushd ChronoSync >/dev/null
+
+if has FreeBSD10 $NODE_LABELS; then
+ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
+fi
+
+./waf -j1 --color=yes configure
+./waf -j1 --color=yes build
+sudo ./waf install -j1 --color=yes
+
+popd >/dev/null
+popd >/dev/null
+
+if has Linux $NODE_LABELS; then
+ sudo ldconfig
+elif has FreeBSD10 $NODE_LABELS; then
+ sudo ldconfig -m
+fi
diff --git a/.waf-tools/openssl.py b/.waf-tools/openssl.py
deleted file mode 100644
index dae6a86..0000000
--- a/.waf-tools/openssl.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#! /usr/bin/env python
-# encoding: utf-8
-
-'''
-
-When using this tool, the wscript will look like:
-
- def options(opt):
- opt.tool_options('openssl')
-
- def configure(conf):
- conf.load('compiler_cxx openssl')
- conf.check_openssl()
-
- def build(bld):
- bld(source='main.cpp', target='app', use='OPENSSL')
-
-'''
-
-from waflib import Options
-from waflib.Configure import conf
-
-@conf
-def check_openssl(self,*k,**kw):
- root = k and k[0] or kw.get('path', None) or Options.options.with_openssl
- mandatory = kw.get('mandatory', True)
- var = kw.get('uselib_store', 'OPENSSL')
-
- if root:
- libcrypto = self.check_cxx(lib=['ssl', 'crypto'],
- msg='Checking for OpenSSL library',
- define_name='HAVE_%s' % var,
- global_define=True,
- uselib_store=var,
- mandatory=mandatory,
- includes="%s/include" % root,
- libpath="%s/lib" % root)
- else:
- libcrypto = self.check_cxx(lib=['ssl', 'crypto'],
- msg='Checking for OpenSSL library',
- define_name='HAVE_%s' % var,
- uselib_store=var,
- mandatory=mandatory)
-
-def options(opt):
- opt.add_option('--with-openssl', type='string', default=None,
- dest='with_openssl', help='''Path to OpenSSL''')
diff --git a/.waf-tools/protoc.py b/.waf-tools/protoc.py
deleted file mode 100644
index fc4e445..0000000
--- a/.waf-tools/protoc.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python
-# encoding: utf-8
-# Philipp Bender, 2012
-# Matt Clarkson, 2012
-
-from waflib.Task import Task
-from waflib.TaskGen import extension
-
-"""
-A simple tool to integrate protocol buffers into your build system.
-
- def configure(conf):
- conf.load('compiler_cxx cxx protoc')
-
- def build(bld):
- bld(
- features = 'cxx cxxprogram'
- source = 'main.cpp file1.proto proto/file2.proto',
- include = '. proto',
- target = 'executable')
-
-"""
-
-class protoc(Task):
- run_str = '${PROTOC} ${PROTOC_FLAGS} ${PROTOC_ST:INCPATHS} ${SRC[0].abspath()}'
- color = 'BLUE'
- ext_out = ['.h', 'pb.cc']
-
-@extension('.proto')
-def process_protoc(self, node):
- cpp_node = node.change_ext('.pb.cc')
- hpp_node = node.change_ext('.pb.h')
- self.create_task('protoc', node, [cpp_node, hpp_node])
- self.source.append(cpp_node)
-
- if 'cxx' in self.features and not self.env.PROTOC_FLAGS:
- self.env.PROTOC_FLAGS = '--cpp_out=%s' % node.parent.get_bld().abspath()
-
- use = getattr(self, 'use', '')
- if not 'PROTOBUF' in use:
- self.use = self.to_list(use) + ['PROTOBUF']
-
-def configure(conf):
- conf.check_cfg(package="protobuf", uselib_store="PROTOBUF", args=['--cflags', '--libs'])
- conf.find_program('protoc', var='PROTOC')
- conf.env.PROTOC_ST = '-I%s'
-
diff --git a/docs/INSTALL.rst b/docs/INSTALL.rst
index f3c0ed6..f54163a 100644
--- a/docs/INSTALL.rst
+++ b/docs/INSTALL.rst
@@ -12,6 +12,12 @@
Refer to `Getting started with NFD <http://named-data.net/doc/NFD/current/INSTALL.html>`_
for detailed installation and running instruction.
+- ChronoSync library
+
+ ::
+
+ https://github.com/named-data/ChronoSync#build
+
- log4cxx library
On Ubuntu Linux:
@@ -26,34 +32,6 @@
sudo port install log4cxx
-- protobuf
-
- On Ubuntu Linux:
-
- ::
-
- sudo apt-get install libprotobuf-dev protobuf-compiler
-
- On OS X with MacPorts:
-
- ::
-
- sudo port install protobuf-cpp
-
-- openssl
-
- On Ubuntu Linux:
-
- ::
-
- sudo apt-get install libssl-dev
-
- On OS X with MacPorts:
-
- ::
-
- sudo port install openssl
-
Build
-----
diff --git a/nsync/README.md b/nsync/README.md
deleted file mode 100644
index 99c0b3a..0000000
--- a/nsync/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-nsync is a copy of ChronoSync (https://github.com/bruinfish/ChronoSync/tree/master).
-
-ChonoSync's license is GPL2.
diff --git a/nsync/boost-archive.h b/nsync/boost-archive.h
deleted file mode 100644
index b56c876..0000000
--- a/nsync/boost-archive.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2016, The University of Memphis,
- * Regents of the University of California
- *
- * See COPYING.md for copyright and distribution information.
- */
-
-// suppress Boost::archive warnings
-#pragma GCC system_header
-#pragma clang system_header
-
-#include <boost/archive/iterators/transform_width.hpp>
-#include <boost/iterator/transform_iterator.hpp>
-#include <boost/archive/iterators/dataflow_exception.hpp>
diff --git a/nsync/openssl.h b/nsync/openssl.h
deleted file mode 100644
index 6b6798c..0000000
--- a/nsync/openssl.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef NLSR_NSYNC_OPENSSL_H
-#define NLSR_NSYNC_OPENSSL_H
-
-// suppress deprecation warnings in OSX >= 10.7
-
-#if defined(__APPLE__)
-
-#ifdef __clang__
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-#endif // __clang__
-
-#ifdef __GNUC__
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif // __GNUC__
-
-#endif
-
-
-#include <openssl/evp.h>
-
-#endif // NLSR_NSYNC_OPENSSL_H
diff --git a/nsync/sync-common.h b/nsync/sync-common.h
deleted file mode 100644
index 41eaeab..0000000
--- a/nsync/sync-common.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- 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/>.
- *
- **/
-
-#ifndef NLSR_NSYNC_SYNC_COMMON_H
-#define NLSR_NSYNC_SYNC_COMMON_H
-
-#include <boost/exception/all.hpp>
-
-#include <ndn-cxx/common.hpp>
-
-#include <tuple>
-
-namespace Sync {
-
-using std::bind;
-using std::function;
-
-using std::make_shared;
-using std::shared_ptr;
-using std::weak_ptr;
-
-using std::dynamic_pointer_cast;
-using std::static_pointer_cast;
-
-using std::tuple;
-using std::make_tuple;
-using std::tie;
-
-} // namespace Sync
-
-#endif // NLSR_NSYNC_SYNC_COMMON_H
diff --git a/nsync/sync-diff-leaf.cc b/nsync/sync-diff-leaf.cc
deleted file mode 100644
index 114b122..0000000
--- a/nsync/sync-diff-leaf.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-diff-leaf.h"
-#include <boost/throw_exception.hpp>
-typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info;
-
-using namespace Sync::Error;
-
-namespace Sync {
-
-DiffLeaf::DiffLeaf (NameInfoConstPtr info, const SeqNo &seq)
- : Leaf (info, seq)
- , m_op (UPDATE)
-{
-}
-
-DiffLeaf::DiffLeaf (NameInfoConstPtr info)
- : Leaf (info, SeqNo (0,0))
- , m_op (REMOVE)
-{
-}
-
-std::ostream &
-operator << (std::ostream &os, Operation op)
-{
- switch (op)
- {
- case UPDATE:
- os << "update";
- break;
- case REMOVE:
- os << "remove";
- break;
- }
- return os;
-}
-
-std::istream &
-operator >> (std::istream &is, Operation &op)
-{
- std::string operation;
- is >> operation;
- if (operation == "update")
- op = UPDATE;
- else if (operation == "remove")
- op = REMOVE;
- else
- BOOST_THROW_EXCEPTION (SyncDiffLeafOperationParseError () << errmsg_info (operation));
-
- return is;
-}
-
-
-}
diff --git a/nsync/sync-diff-leaf.h b/nsync/sync-diff-leaf.h
deleted file mode 100644
index eb16209..0000000
--- a/nsync/sync-diff-leaf.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_DIFF_LEAF_H
-#define NLSR_NSYNC_SYNC_DIFF_LEAF_H
-
-#include "sync-leaf.h"
-#include <boost/exception/all.hpp>
-
-namespace Sync {
-
-/**
- * @ingroup sync
- * @brief Annotation for SYNC leaf
- */
-enum Operation
- {
- UPDATE, ///< @brief Leaf was added or updated
- REMOVE ///< @brief Leaf was removed
- };
-
-/**
- * @ingroup sync
- * @brief Annotated SYNC leaf
- */
-class DiffLeaf : public Leaf
-{
-public:
- /**
- * @brief Constructor to create an UPDATE diff leaf
- * @param info Smart pointer to leaf's name
- * @param seq Initial sequence number of the pointer
- */
- DiffLeaf (NameInfoConstPtr info, const SeqNo &seq);
-
- /**
- * @brief Constructor to create an REMOVE diff leaf
- * @param info Smart pointer to leaf's name
- *
- * This constructor creates a leaf with phony sequence number
- * with 0 session ID and 0 sequence number
- */
- DiffLeaf (NameInfoConstPtr info);
-
- virtual ~DiffLeaf () { }
-
- /**
- * @brief Get diff leaf type
- */
- Operation
- getOperation () const { return m_op; }
-
-private:
- Operation m_op;
-};
-
-typedef shared_ptr<DiffLeaf> DiffLeafPtr;
-typedef shared_ptr<const DiffLeaf> DiffLeafConstPtr;
-
-std::ostream &
-operator << (std::ostream &os, Operation op);
-
-std::istream &
-operator >> (std::istream &is, Operation &op);
-
-namespace Error {
-struct SyncDiffLeafOperationParseError : virtual boost::exception, virtual std::exception { };
-} // Error
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_DIFF_LEAF_H
diff --git a/nsync/sync-diff-state-container.h b/nsync/sync-diff-state-container.h
deleted file mode 100644
index f85ff1c..0000000
--- a/nsync/sync-diff-state-container.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_DIFF_STATE_CONTAINER_H
-#define NLSR_NSYNC_SYNC_DIFF_STATE_CONTAINER_H
-
-#include "sync-diff-state.h"
-#include "sync-digest.h"
-
-#include <boost/multi_index_container.hpp>
-#include <boost/multi_index/tag.hpp>
-// #include <boost/multi_index/ordered_index.hpp>
-// #include <boost/multi_index/composite_key.hpp>
-#include <boost/multi_index/hashed_index.hpp>
-#include <boost/multi_index/sequenced_index.hpp>
-// #include <boost/multi_index/random_access_index.hpp>
-#include <boost/multi_index/member.hpp>
-#include <boost/multi_index/mem_fun.hpp>
-
-namespace mi = boost::multi_index;
-
-namespace Sync {
-
-/// @cond include_hidden
-struct sequenced { };
-struct timed { };
-/// @endcond
-
-/**
- * \ingroup sync
- * @brief Container for differential states
- */
-struct DiffStateContainer : public mi::multi_index_container<
- DiffStatePtr,
- mi::indexed_by<
- // For fast access to elements using DiffState hashes
- mi::hashed_unique<
- mi::tag<hashed>,
- mi::const_mem_fun<DiffState, DigestConstPtr, &DiffState::getDigest>,
- DigestPtrHash,
- DigestPtrEqual
- >
- ,
- // sequenced index to access older/newer element (like in list)
- mi::sequenced<mi::tag<sequenced> >
- >
- >
-{
-};
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_DIFF_STATE_CONTAINER_H
diff --git a/nsync/sync-diff-state.cc b/nsync/sync-diff-state.cc
deleted file mode 100644
index 715ba47..0000000
--- a/nsync/sync-diff-state.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-diff-state.h"
-#include "sync-diff-leaf.h"
-
-#include <boost/foreach.hpp>
-#include <boost/assert.hpp>
-
-namespace Sync {
-
-DiffState::DiffState ()
-{
-}
-
-DiffState::~DiffState ()
-{
-}
-
-DiffStatePtr
-DiffState::diff () const
-{
- DiffStatePtr ret = make_shared<DiffState> ();
-
- DiffStatePtr state = m_next;
- while (state != 0)
- {
- *ret += *state;
- state = state->m_next;
- }
-
- return ret;
-}
-
-DiffState &
-DiffState::operator += (const DiffState &state)
-{
- BOOST_FOREACH (LeafConstPtr _leaf, state.getLeaves ())
- {
- DiffLeafConstPtr leaf = dynamic_pointer_cast<const DiffLeaf> (_leaf);
- BOOST_ASSERT (leaf != 0);
-
- if (leaf->getOperation () == UPDATE)
- update (leaf->getInfo (), leaf->getSeq ());
- else if (leaf->getOperation () == REMOVE)
- remove (leaf->getInfo ());
- else
- {
- BOOST_ASSERT (false);
- }
- }
-
- return *this;
-}
-
-// from State
-tuple<bool/*inserted*/, bool/*updated*/, SeqNo/*oldSeqNo*/>
-DiffState::update (NameInfoConstPtr info, const SeqNo &seq)
-{
- m_leaves.erase (info);
-
- DiffLeafPtr leaf = make_shared<DiffLeaf> (info, seq);
- m_leaves.insert (leaf);
-
- return make_tuple (true, false, SeqNo ());
-}
-
-bool
-DiffState::remove (NameInfoConstPtr info)
-{
- m_leaves.erase (info);
-
- DiffLeafPtr leaf = make_shared<DiffLeaf> (info);
- m_leaves.insert (leaf);
-
- return true;
-}
-
-} // ns3
diff --git a/nsync/sync-diff-state.h b/nsync/sync-diff-state.h
deleted file mode 100644
index 9f5f6b1..0000000
--- a/nsync/sync-diff-state.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_DIFF_STATE_H
-#define NLSR_NSYNC_SYNC_DIFF_STATE_H
-
-#include "sync-state.h"
-#include <iostream>
-
-namespace Sync {
-
-class DiffState;
-typedef shared_ptr<DiffState> DiffStatePtr;
-typedef shared_ptr<DiffState> DiffStateConstPtr;
-
-/**
- * @ingroup ccnx
- * @brief Differential SYNC state
- */
-class DiffState : public State
-{
-public:
- /**
- * @see Default constructor
- */
- DiffState ();
- virtual ~DiffState ();
-
- /**
- * @brief Set successor for the diff state
- * @param next successor state
- */
- void
- setNext (DiffStatePtr next)
- {
- m_next = next;
- }
-
- /**
- * @brief Set digest for the diff state (obtained from a corresponding full state)
- * @param digest A read only smart pointer to a digest object (that should be unmodified anywhere else)
- */
- void
- setDigest (DigestConstPtr digest) { m_digest = digest; }
-
- /**
- * @brief Get digest for the diff state
- */
- DigestConstPtr
- getDigest () const { return m_digest; }
-
- /**
- * @brief Accumulate differences from `this' state to the most current state
- * @returns Accumulated differences from `this' state to the most current state
- */
- DiffStatePtr
- diff () const;
-
- /**
- * @brief Combine differences from `this' and `state'
- * @param state Differential state to combine with
- * @return Combined differences
- *
- * In case of collisions, `this' leaf will be replaced with the leaf of `state'
- */
- DiffState&
- operator += (const DiffState &state);
-
- // from State
- virtual tuple<bool/*inserted*/, bool/*updated*/, SeqNo/*oldSeqNo*/>
- update (NameInfoConstPtr info, const SeqNo &seq);
-
- virtual bool
- remove (NameInfoConstPtr info);
-
-private:
- DiffStatePtr m_next;
- DigestConstPtr m_digest;
-};
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_DIFF_STATE_H
diff --git a/nsync/sync-digest.cc b/nsync/sync-digest.cc
deleted file mode 100644
index c6dc060..0000000
--- a/nsync/sync-digest.cc
+++ /dev/null
@@ -1,262 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-digest.h"
-#include <string.h>
-
-#include <boost/assert.hpp>
-#include <boost/throw_exception.hpp>
-typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info_str;
-typedef boost::error_info<struct tag_errmsg, int> errmsg_info_int;
-
-// for printing, may be disabled in optimized build
-
-// #ifdef DIGEST_BASE64
-// #include <boost/archive/iterators/base64_from_binary.hpp>
-// #include <boost/archive/iterators/binary_from_base64.hpp>
-// #endif
-
-#include "boost-archive.h"
-
-using namespace boost;
-using namespace boost::archive::iterators;
-using namespace std;
-
-// Other options: VP_md2, EVP_md5, EVP_sha, EVP_sha1, EVP_sha256, EVP_dss, EVP_dss1, EVP_mdc2, EVP_ripemd160
-#define HASH_FUNCTION EVP_sha256
-#define HASH_FUNCTION_LEN 32
-
-
-// #ifndef DIGEST_BASE64
-
-template<class CharType>
-struct hex_from_4_bit
-{
- typedef CharType result_type;
- CharType operator () (CharType ch) const
- {
- const char *lookup_table = "0123456789abcdef";
- // cout << "New character: " << (int) ch << " (" << (char) ch << ")" << "\n";
- BOOST_ASSERT (ch < 16);
- return lookup_table[static_cast<size_t>(ch)];
- }
-};
-
-typedef transform_iterator<hex_from_4_bit<std::vector<uint8_t>::const_iterator::value_type>,
- transform_width<std::vector<uint8_t>::const_iterator, 4, 8, std::vector<uint8_t>::const_iterator::value_type> > string_from_binary;
-
-
-template<class CharType>
-struct hex_to_4_bit
-{
- typedef CharType result_type;
- CharType operator () (CharType ch) const
- {
- const signed char lookup_table [] = {
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
- -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- };
-
- // cout << "New character: " << hex << (int) ch << " (" << (char) ch << ")" << "\n";
- signed char value = -1;
- if ((unsigned)ch < 128)
- value = lookup_table [(unsigned)ch];
- if (value == -1)
- BOOST_THROW_EXCEPTION (Sync::Error::DigestCalculationError () << errmsg_info_int ((int)ch));
-
- return value;
- }
-};
-
-typedef transform_width<transform_iterator<hex_to_4_bit<string::const_iterator::value_type>, string::const_iterator>, 8, 4> string_to_binary;
-
-namespace Sync {
-
-Digest::Digest ()
-{
- m_context = EVP_MD_CTX_create ();
-
- reset ();
-}
-
-Digest::~Digest ()
-{
- EVP_MD_CTX_destroy (m_context);
-}
-
-bool
-Digest::empty () const
-{
- return m_buffer.empty ();
-}
-
-bool
-Digest::isZero () const
-{
- if (m_buffer.empty ())
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("Digest has not been yet finalized"));
-
- return (m_buffer.size () == 1 && m_buffer[0] == 0);
-}
-
-
-void
-Digest::reset ()
-{
- m_buffer.clear ();
-
- int ok = EVP_DigestInit_ex (m_context, HASH_FUNCTION (), 0);
- if (!ok)
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("EVP_DigestInit_ex returned error")
- << errmsg_info_int (ok));
-}
-
-
-void
-Digest::finalize ()
-{
- if (!m_buffer.empty ()) return;
-
- m_buffer.resize (HASH_FUNCTION_LEN);
-
- unsigned int tmp;
- int ok = EVP_DigestFinal_ex (m_context,
- &m_buffer[0], &tmp);
- if (!ok)
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("EVP_DigestFinal_ex returned error")
- << errmsg_info_int (ok));
-}
-
-std::size_t
-Digest::getHash () const
-{
- if (isZero ()) return 0;
-
- if (sizeof (std::size_t) > m_buffer.size ())
- {
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("Hash is not zero and length is less than size_t")
- << errmsg_info_int (m_buffer.size ()));
- }
-
- // just getting first sizeof(std::size_t) bytes
- // not ideal, but should work pretty well
- return *(reinterpret_cast<const std::size_t*> (&m_buffer[0]));
-}
-
-bool
-Digest::operator == (const Digest &digest) const
-{
- if (m_buffer.empty ())
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("Digest1 is empty"));
-
- if (digest.m_buffer.empty ())
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("Digest2 is empty"));
-
- return m_buffer == digest.m_buffer;
-}
-
-
-void
-Digest::update (const uint8_t *buffer, size_t size)
-{
- // cout << "Update: " << (void*)buffer << " / size: " << size << "\n";
-
- // cannot update Digest when it has been finalized
- if (!m_buffer.empty ())
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("Digest has been already finalized"));
-
- bool ok = EVP_DigestUpdate (m_context, buffer, size);
- if (!ok)
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("EVP_DigestUpdate returned error")
- << errmsg_info_int (ok));
-}
-
-
-Digest &
-Digest::operator << (const Digest &src)
-{
- if (src.m_buffer.empty ())
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("Digest has not been yet finalized"));
-
- update (&src.m_buffer[0], src.m_buffer.size ());
-
- return *this;
-}
-
-std::ostream &
-operator << (std::ostream &os, const Digest &digest)
-{
- BOOST_ASSERT (!digest.m_buffer.empty ());
-
- ostreambuf_iterator<char> out_it (os); // ostream iterator
- // need to encode to base64
- copy (string_from_binary (digest.m_buffer.begin ()),
- string_from_binary (digest.m_buffer.end ()),
- out_it);
-
- return os;
-}
-
-std::istream &
-operator >> (std::istream &is, Digest &digest)
-{
- string str;
- is >> str; // read string first
-
- if (str.size () == 0)
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("Input is empty"));
-
- // uint8_t padding = (3 - str.size () % 3) % 3;
- // for (uint8_t i = 0; i < padding; i++) str.push_back ('=');
-
- // only empty digest object can be used for reading
- if (!digest.m_buffer.empty ())
- BOOST_THROW_EXCEPTION (Error::DigestCalculationError ()
- << errmsg_info_str ("Digest has been already finalized"));
-
- digest.m_buffer.clear ();
-
- copy (string_to_binary (str.begin ()),
- string_to_binary (str.end ()),
- std::back_inserter (digest.m_buffer));
-
- return is;
-}
-
-
-} // Sync
diff --git a/nsync/sync-digest.h b/nsync/sync-digest.h
deleted file mode 100644
index b376f88..0000000
--- a/nsync/sync-digest.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_DIGEST_H
-#define NLSR_NSYNC_SYNC_DIGEST_H
-
-#include "sync-common.h"
-
-#include <vector>
-#include "openssl.h"
-
-namespace Sync {
-
-/**
- * @ingroup sync
- * @brief A simple wrapper for libcrypto hash functions
- */
-class Digest
-{
-public:
- /**
- * @brief Default constructor. Will initialize internal libssl structures
- */
- Digest ();
-
- /**
- * @brief Check if digest is empty
- */
- bool
- empty () const;
-
- /**
- * @brief Reset digest to the initial state
- */
- void
- reset ();
-
- /**
- * @brief Destructor
- */
- ~Digest ();
-
- /**
- * @brief Obtain a short version of the hash (just first sizeof(size_t) bytes
- *
- * Side effect: finalize() will be called on `this'
- */
- std::size_t
- getHash () const;
-
- /**
- * @brief Finalize digest. All subsequent calls to "operator <<" will fire an exception
- */
- void
- finalize ();
-
- /**
- * @brief Compare two full digests
- *
- * Side effect: Finalize will be called on `this' and `digest'
- */
- bool
- operator == (const Digest &digest) const;
-
- bool
- operator != (const Digest &digest) const
- { return ! (*this == digest); }
-
-
- /**
- * @brief Add existing digest to digest calculation
- * @param src digest to combine with
- *
- * The result of this combination is hash (hash (...))
- */
- Digest &
- operator << (const Digest &src);
-
- /**
- * @brief Add string to digest calculation
- * @param str string to put into digest
- */
- inline Digest &
- operator << (const std::string &str);
-
- /**
- * @brief Add uint64_t value to digest calculation
- * @param value uint64_t value to put into digest
- */
- inline Digest &
- operator << (uint64_t value);
-
- /**
- * @brief Checks if the stored hash is zero-root hash
- *
- * Zero-root hash is a valid hash that optimally represents an empty state
- */
- bool
- isZero () const;
-
-private:
- Digest &
- operator = (Digest &digest) { (void)digest; return *this; }
-
- /**
- * @brief Add size bytes of buffer to the hash
- */
- void
- update (const uint8_t *buffer, size_t size);
-
- friend std::ostream &
- operator << (std::ostream &os, const Digest &digest);
-
- friend std::istream &
- operator >> (std::istream &is, Digest &digest);
-
-private:
- EVP_MD_CTX *m_context;
- std::vector<uint8_t> m_buffer;
-};
-
-namespace Error {
-struct DigestCalculationError : virtual boost::exception, virtual std::exception { };
-}
-
-typedef shared_ptr<Digest> DigestPtr;
-typedef shared_ptr<const Digest> DigestConstPtr;
-
-Digest &
-Digest::operator << (const std::string &str)
-{
- update (reinterpret_cast<const uint8_t*> (str.c_str ()), str.size ());
- return *this;
-}
-
-inline Digest &
-Digest::operator << (uint64_t value)
-{
- update (reinterpret_cast<const uint8_t*> (&value), sizeof (uint64_t));
- return *this;
-}
-
-std::ostream &
-operator << (std::ostream &os, const Digest &digest);
-
-std::istream &
-operator >> (std::istream &is, Digest &digest);
-
-// template<class INT>
-// Digest &
-// Digest::operator << (INT value)
-// {
-// update (&value, sizeof (INT));
-// return *this;
-// }
-
-struct DigestPtrHash : public std::unary_function<Digest, std::size_t>
-{
- std::size_t
- operator() (DigestConstPtr digest) const
- {
- // std::cout << "digest->getHash: " << digest->getHash () << " (" << *digest << ")" << std::endl;
- return digest->getHash ();
- }
-};
-
-struct DigestPtrEqual : public std::unary_function<Digest, std::size_t>
-{
- bool
- operator() (DigestConstPtr digest1, DigestConstPtr digest2) const
- {
- // std::cout << boost::cref(*digest1) << " == " << boost::cref(*digest2) << " : " << (*digest1 == *digest2) << std::endl;
- return *digest1 == *digest2;
- }
-};
-
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_DIGEST_H
diff --git a/nsync/sync-event.h b/nsync/sync-event.h
deleted file mode 100644
index a847431..0000000
--- a/nsync/sync-event.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_EVENT_H
-#define NLSR_NSYNC_SYNC_EVENT_H
-
-#include "sync-common.h"
-
-namespace Sync
-{
-
-typedef function< void ( ) > Event;
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_EVENT_H
diff --git a/nsync/sync-full-leaf.cc b/nsync/sync-full-leaf.cc
deleted file mode 100644
index 67c68fc..0000000
--- a/nsync/sync-full-leaf.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-full-leaf.h"
-
-namespace Sync {
-
-FullLeaf::FullLeaf (NameInfoConstPtr info, const SeqNo &seq)
- : Leaf (info, seq)
-{
- updateDigest ();
-}
-
-void
-FullLeaf::updateDigest ()
-{
- m_digest.reset ();
- m_digest << getInfo ()->getDigest () << *getSeq ().getDigest ();
- m_digest.finalize ();
-}
-
-// from Leaf
-void
-FullLeaf::setSeq (const SeqNo &seq)
-{
- Leaf::setSeq (seq);
- updateDigest ();
-}
-
-} // Sync
diff --git a/nsync/sync-full-leaf.h b/nsync/sync-full-leaf.h
deleted file mode 100644
index b1f5ef4..0000000
--- a/nsync/sync-full-leaf.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_FULL_LEAF_H
-#define NLSR_NSYNC_SYNC_FULL_LEAF_H
-
-#include "sync-leaf.h"
-
-namespace Sync {
-
-/**
- * @ingroup sync
- * @brief SYNC leaf for the full state (with support of Digest calculation)
- */
-class FullLeaf : public Leaf
-{
-public:
- /**
- * @brief Constructor to create an UPDATE diff leaf
- * @param info Smart pointer to leaf's name
- * @param seq Initial sequence number of the pointer
- */
- FullLeaf (NameInfoConstPtr info, const SeqNo &seq);
- virtual ~FullLeaf () { }
-
- /**
- * @brief Get hash digest of the leaf
- *
- * The underlying Digest object is recalculated on every update or removal
- * (including updates of child classes)
- */
- const Digest &
- getDigest () const { return m_digest; }
-
- // from Leaf
- virtual void
- setSeq (const SeqNo &seq);
-
-private:
- void
- updateDigest ();
-
-private:
- Digest m_digest;
-};
-
-typedef shared_ptr<FullLeaf> FullLeafPtr;
-typedef shared_ptr<const FullLeaf> FullLeafConstPtr;
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_FULL_LEAF_H
diff --git a/nsync/sync-full-state.cc b/nsync/sync-full-state.cc
deleted file mode 100644
index b6ffd64..0000000
--- a/nsync/sync-full-state.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-full-state.h"
-
-#include <boost/assert.hpp>
-
-#include "sync-full-leaf.h"
-
-namespace Sync {
-
-
-FullState::FullState ()
-// m_lastUpdated is initialized to "not_a_date_time" in normal lib mode and to "0" time in NS-3 mode
-{
-}
-
-FullState::~FullState ()
-{
-}
-
-ndn::time::system_clock::Duration
-FullState::getTimeFromLastUpdate () const
-{
- return ndn::time::system_clock::now() - m_lastUpdated;
-}
-
-DigestConstPtr
-FullState::getDigest ()
-{
- if (!m_digest)
- {
- m_digest = make_shared<Digest> ();
- if (m_leaves.get<ordered> ().size () > 0)
- {
- for (LeafConstPtr leaf : m_leaves.get<ordered> ())
- {
- FullLeafConstPtr fullLeaf = dynamic_pointer_cast<const FullLeaf> (leaf);
- BOOST_ASSERT (fullLeaf != 0);
- *m_digest << fullLeaf->getDigest ();
- }
- m_digest->finalize ();
- }
- else
- {
- std::istringstream is ("00"); //zero state
- is >> *m_digest;
- }
- }
-
- return m_digest;
-}
-
-// from State
-tuple<bool/*inserted*/, bool/*updated*/, SeqNo/*oldSeqNo*/>
-FullState::update (NameInfoConstPtr info, const SeqNo &seq)
-{
- m_lastUpdated = ndn::time::system_clock::now();
-
-
- m_digest.reset ();
-
- LeafContainer::iterator item = m_leaves.find (info);
- if (item == m_leaves.end ())
- {
- m_leaves.insert (make_shared<FullLeaf> (info, seq));
- return make_tuple (true, false, SeqNo ());
- }
- else
- {
- if ((*item)->getSeq () == seq || seq < (*item)->getSeq ())
- {
- return make_tuple (false, false, SeqNo ());
- }
-
- SeqNo old = (*item)->getSeq ();
- m_leaves.modify (item, [&seq](LeafPtr data){ data->setSeq(seq); });
- return make_tuple (false, true, old);
- }
-}
-
-bool
-FullState::remove (NameInfoConstPtr info)
-{
- m_lastUpdated = ndn::time::system_clock::now();
-
- m_digest.reset ();
-
- LeafContainer::iterator item = m_leaves.find (info);
- if (item != m_leaves.end ())
- {
- m_leaves.erase (item);
- return true;
- }
- else
- return false;
-}
-
-} // Sync
diff --git a/nsync/sync-full-state.h b/nsync/sync-full-state.h
deleted file mode 100644
index 34ed139..0000000
--- a/nsync/sync-full-state.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_FULL_STATE_H
-#define NLSR_NSYNC_SYNC_FULL_STATE_H
-
-#include <ndn-cxx/util/time.hpp>
-#include "sync-state.h"
-
-namespace Sync {
-
-class FullState;
-typedef shared_ptr<FullState> FullStatePtr;
-typedef shared_ptr<FullState> FullStateConstPtr;
-
-
-/**
- * \ingroup sync
- * @brief Cumulative SYNC state
- */
-class FullState : public State
-{
-public:
- /**
- * @brief Default constructor
- */
- FullState ();
- virtual ~FullState ();
-
- /**
- * @brief Get time period since last state update
- *
- * This value can be used to randomize reconciliation waiting time in SyncApp
- */
- ndn::time::system_clock::Duration
- getTimeFromLastUpdate () const;
-
- /**
- * @brief Obtain a read-only copy of the digest
- *
- * If m_digest is 0, then it is automatically created. On every update and removal, m_digest is reset to 0
- */
- DigestConstPtr
- getDigest ();
-
- // from State
- virtual tuple<bool/*inserted*/, bool/*updated*/, SeqNo/*oldSeqNo*/>
- update (NameInfoConstPtr info, const SeqNo &seq);
-
- virtual bool
- remove (NameInfoConstPtr info);
-
-private:
- ndn::time::system_clock::TimePoint m_lastUpdated; ///< @brief Time when state was updated last time
- DigestPtr m_digest;
-};
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_FULL_STATE_H
diff --git a/nsync/sync-interest-container.h b/nsync/sync-interest-container.h
deleted file mode 100644
index d0b88c8..0000000
--- a/nsync/sync-interest-container.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_INTEREST_CONTAINER_H
-#define NLSR_NSYNC_SYNC_INTEREST_CONTAINER_H
-
-#include <ndn-cxx/util/time.hpp>
-
-#include "sync-digest.h"
-
-#include <boost/multi_index_container.hpp>
-#include <boost/multi_index/tag.hpp>
-// #include <boost/multi_index/ordered_index.hpp>
-// #include <boost/multi_index/composite_key.hpp>
-#include <boost/multi_index/hashed_index.hpp>
-#include <boost/multi_index/sequenced_index.hpp>
-#include <boost/multi_index/ordered_index.hpp>
-// #include <boost/multi_index/random_access_index.hpp>
-#include <boost/multi_index/member.hpp>
-#include <boost/multi_index/mem_fun.hpp>
-
-namespace mi = boost::multi_index;
-
-namespace Sync {
-
-struct Interest
-{
- Interest (DigestConstPtr digest, const std::string &name, bool unknown=false)
- : m_digest (digest)
- , m_name (name)
- , m_time (ndn::time::system_clock::now())
- , m_unknown (unknown)
- {
- }
-
- DigestConstPtr m_digest;
- std::string m_name;
- ndn::time::system_clock::TimePoint m_time;
- bool m_unknown;
-};
-
-/// @cond include_hidden
-struct named { };
-struct hashed;
-struct timed;
-/// @endcond
-
-/**
- * \ingroup sync
- * @brief Container for interests (application PIT)
- */
-struct InterestContainer : public mi::multi_index_container<
- Interest,
- mi::indexed_by<
- mi::hashed_unique<
- mi::tag<named>,
- BOOST_MULTI_INDEX_MEMBER(Interest, std::string, m_name)
- >
- ,
-
- mi::hashed_non_unique<
- mi::tag<hashed>,
- BOOST_MULTI_INDEX_MEMBER(Interest, DigestConstPtr, m_digest),
- DigestPtrHash,
- DigestPtrEqual
- >
- ,
-
- mi::ordered_non_unique<
- mi::tag<timed>,
- BOOST_MULTI_INDEX_MEMBER(Interest, ndn::time::system_clock::TimePoint, m_time)
- >
- >
- >
-{
-};
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_INTEREST_CONTAINER_H
diff --git a/nsync/sync-interest-table.cc b/nsync/sync-interest-table.cc
deleted file mode 100644
index 1fc1552..0000000
--- a/nsync/sync-interest-table.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-interest-table.h"
-#include "sync-logging.h"
-using namespace std;
-
-INIT_LOGGER("SyncInterestTable");
-
-namespace Sync
-{
-
-SyncInterestTable::SyncInterestTable(boost::asio::io_service& io, ndn::time::system_clock::Duration lifetime)
- : m_entryLifetime(lifetime)
- , m_scheduler(io)
-{
- m_scheduler.scheduleEvent(ndn::time::seconds(4),
- ndn::bind(&SyncInterestTable::expireInterests, this));
-}
-
-SyncInterestTable::~SyncInterestTable()
-{
-}
-
-Interest
-SyncInterestTable::pop()
-{
- if (m_table.size() == 0)
- BOOST_THROW_EXCEPTION(Error::InterestTableIsEmpty());
-
- Interest ret = *m_table.begin();
- m_table.erase(m_table.begin());
-
- return ret;
-}
-
-bool
-SyncInterestTable::insert(DigestConstPtr digest, const string &name, bool unknownState/*=false*/)
-{
- bool existent = false;
-
- InterestContainer::index<named>::type::iterator it = m_table.get<named>().find(name);
- if (it != m_table.end())
- {
- existent = true;
- m_table.erase(it);
- }
- m_table.insert(Interest(digest, name, unknownState));
-
- return existent;
-}
-
-uint32_t
-SyncInterestTable::size() const
-{
- return m_table.size();
-}
-
-bool
-SyncInterestTable::remove(const string &name)
-{
- InterestContainer::index<named>::type::iterator item = m_table.get<named>().find(name);
- if (item != m_table.get<named>().end())
- {
- m_table.get<named>().erase(name);
- return true;
- }
-
- return false;
-}
-
-bool
-SyncInterestTable::remove(DigestConstPtr digest)
-{
- InterestContainer::index<hashed>::type::iterator item = m_table.get<hashed>().find(digest);
- if (item != m_table.get<hashed>().end())
- {
- m_table.get<hashed>().erase(digest); // erase all records associated with the digest
- return true;
- }
- return false;
-}
-
-void SyncInterestTable::expireInterests()
-{
- uint32_t count = 0;
- ndn::time::system_clock::TimePoint expireTime = ndn::time::system_clock::now() - m_entryLifetime;
-
- while (m_table.size() > 0)
- {
- InterestContainer::index<timed>::type::iterator item = m_table.get<timed>().begin();
-
- if (item->m_time <= expireTime)
- {
- m_table.get<timed>().erase(item);
- count ++;
- }
- else
- break;
- }
-
- m_scheduler.scheduleEvent(ndn::time::seconds(4),
- ndn::bind(&SyncInterestTable::expireInterests, this));
-}
-
-
-}
diff --git a/nsync/sync-interest-table.h b/nsync/sync-interest-table.h
deleted file mode 100644
index 899ddbd..0000000
--- a/nsync/sync-interest-table.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_INTEREST_TABLE_H
-#define NLSR_NSYNC_SYNC_INTEREST_TABLE_H
-
-#include <ndn-cxx/util/scheduler.hpp>
-
-#include <string>
-#include <vector>
-
-#include "sync-digest.h"
-#include "sync-interest-container.h"
-
-namespace Sync {
-
-/**
- * \ingroup sync
- * @brief A table to keep unanswered Sync Interest
- * all access operation to the table should grab the
- * mutex first
- */
-class SyncInterestTable
-{
-public:
- SyncInterestTable (boost::asio::io_service& io, ndn::time::system_clock::Duration lifetime);
- ~SyncInterestTable ();
-
- /**
- * @brief Insert an interest, if interest already exists, update the
- * timestamp
- */
- bool
- insert (DigestConstPtr interest, const std::string &name, bool unknownState=false);
-
- /**
- * @brief Remove interest by digest (e.g., when it was satisfied)
- */
- bool
- remove (DigestConstPtr interest);
-
- /**
- * @brief Remove interest by name (e.g., when it was satisfied)
- */
- bool
- remove (const std::string &name);
-
- /**
- * @brief pop a non-expired Interest from PIT
- */
- Interest
- pop ();
-
- uint32_t
- size () const;
-
-private:
- /**
- * @brief periodically called to expire Interest
- */
- void
- expireInterests ();
-
-private:
- ndn::time::system_clock::Duration m_entryLifetime;
- InterestContainer m_table;
-
- ndn::Scheduler m_scheduler;
-};
-
-namespace Error {
-struct InterestTableIsEmpty : virtual boost::exception, virtual std::exception { };
-}
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_INTEREST_TABLE_H
diff --git a/nsync/sync-leaf.cc b/nsync/sync-leaf.cc
deleted file mode 100644
index e01b192..0000000
--- a/nsync/sync-leaf.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-leaf.h"
-
-namespace Sync {
-
-Leaf::Leaf (NameInfoConstPtr info, const SeqNo &seq)
- : m_info (info)
- , m_seq (seq)
-{
-}
-
-Leaf::~Leaf ()
-{
-}
-
-void
-Leaf::setSeq (const SeqNo &seq)
-{
- m_seq = std::max (m_seq, seq);
-}
-
-} // Sync
diff --git a/nsync/sync-leaf.h b/nsync/sync-leaf.h
deleted file mode 100644
index 1227c98..0000000
--- a/nsync/sync-leaf.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_LEAF_H
-#define NLSR_NSYNC_SYNC_LEAF_H
-
-#include "sync-seq-no.h"
-#include "sync-name-info.h"
-
-namespace Sync {
-
-/**
- * \ingroup sync
- * @brief Sync tree leaf
- */
-class Leaf
-{
-public:
- /**
- * @brief Constructor
- * @param info Smart pointer to leaf's name
- * @param seq Initial sequence number of the pointer
- */
- Leaf (NameInfoConstPtr info, const SeqNo &seq);
- virtual ~Leaf ();
-
- /**
- * @brief Get name of the leaf
- */
- NameInfoConstPtr
- getInfo () const { return m_info; }
-
- /**
- * @brief Get sequence number of the leaf
- */
- const SeqNo&
- getSeq () const { return m_seq; }
-
- /**
- * @brief Update sequence number of the leaf
- * @param seq Sequence number
- *
- * Sequence number is updated to the largest value among this->m_seq and seq
- */
- virtual void
- setSeq (const SeqNo &seq);
-
-private:
- NameInfoConstPtr m_info;
- SeqNo m_seq;
-};
-
-typedef shared_ptr<Leaf> LeafPtr;
-typedef shared_ptr<const Leaf> LeafConstPtr;
-
-inline std::ostream &
-operator << (std::ostream &os, const Leaf &leaf)
-{
- os << *leaf.getInfo () << "(" << leaf.getSeq () << ")";
- return os;
-}
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_LEAF_H
diff --git a/nsync/sync-logging.cc b/nsync/sync-logging.cc
deleted file mode 100644
index 3a63232..0000000
--- a/nsync/sync-logging.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-logging.h"
-
-#ifdef HAVE_LOG4CXX
-
-#include <log4cxx/logger.h>
-#include <log4cxx/basicconfigurator.h>
-#include <log4cxx/consoleappender.h>
-#include <log4cxx/patternlayout.h>
-#include <log4cxx/level.h>
-#include <log4cxx/propertyconfigurator.h>
-#include <log4cxx/defaultconfigurator.h>
-#include <log4cxx/helpers/exception.h>
-using namespace log4cxx;
-using namespace log4cxx::helpers;
-
-#include <unistd.h>
-
-void
-INIT_LOGGERS ()
-{
- static bool configured = false;
-
- if (configured) return;
-
- if (access ("log4cxx.properties", R_OK)==0)
- PropertyConfigurator::configureAndWatch ("log4cxx.properties");
- else
- {
- PatternLayoutPtr layout (new PatternLayout ("%d{HH:mm:ss} %p %c{1} - %m%n"));
- ConsoleAppenderPtr appender (new ConsoleAppender (layout));
-
- BasicConfigurator::configure( appender );
- Logger::getRootLogger()->setLevel (log4cxx::Level::getInfo ());
- }
-
- configured = true;
-}
-
-#endif
diff --git a/nsync/sync-logging.h b/nsync/sync-logging.h
deleted file mode 100644
index 88a4ea0..0000000
--- a/nsync/sync-logging.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_LOGGING_H
-#define NLSR_NSYNC_SYNC_LOGGING_H
-
-#ifdef HAVE_LOG4CXX
-
-#include <log4cxx/logger.h>
-
-#define INIT_LOGGER(name) \
- static log4cxx::LoggerPtr staticModuleLogger = log4cxx::Logger::getLogger (name)
-
-#define _LOG_DEBUG(x) \
- LOG4CXX_DEBUG(staticModuleLogger, x);
-
-#define _LOG_TRACE(x) \
- LOG4CXX_TRACE(staticModuleLogger, x);
-
-#define _LOG_FUNCTION(x) \
- LOG4CXX_TRACE(staticModuleLogger, __FUNCTION__ << "(" << x << ")");
-
-#define _LOG_FUNCTION_NOARGS \
- LOG4CXX_TRACE(staticModuleLogger, __FUNCTION__ << "()");
-
-#define _LOG_ERROR(x) \
- LOG4CXX_ERROR(staticModuleLogger, x);
-
-void
-INIT_LOGGERS ();
-
-#else
-
-#define INIT_LOGGER(name)
-#define _LOG_FUNCTION(x)
-#define _LOG_FUNCTION_NOARGS
-#define _LOG_TRACE(x)
-#define INIT_LOGGERS(x)
-#define _LOG_ERROR(x)
-
-#ifdef _DEBUG
-
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <iostream>
-
-#define _LOG_DEBUG(x) \
- std::clog << boost::get_system_time () << " " << boost::this_thread::get_id () << " " << x << endl;
-
-#else
-#define _LOG_DEBUG(x)
-#endif
-
-#endif // HAVE_LOG4CXX
-
-#endif // NLSR_NSYNC_SYNC_LOGGING_H
diff --git a/nsync/sync-logic-event-container.h b/nsync/sync-logic-event-container.h
deleted file mode 100644
index fbf5129..0000000
--- a/nsync/sync-logic-event-container.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_LOGIC_EVENT_CONTAINER_H
-#define NLSR_NSYNC_SYNC_LOGIC_EVENT_CONTAINER_H
-
-#include "sync-event.h"
-
-#include <boost/date_time/posix_time/posix_time_types.hpp>
-
-#include <boost/multi_index_container.hpp>
-// #include <boost/multi_index/tag.hpp>
-#include <boost/multi_index/ordered_index.hpp>
-// #include <boost/multi_index/composite_key.hpp>
-// #include <boost/multi_index/hashed_index.hpp>
-// #include <boost/multi_index/random_access_index.hpp>
-#include <boost/multi_index/member.hpp>
-// #include <boost/multi_index/mem_fun.hpp>
-
-namespace mi = boost::multi_index;
-
-namespace Sync
-{
-
-struct LogicEvent
-{
- LogicEvent (const boost::system_time &_time, Event _event, uint32_t _label)
- : time (_time)
- , event (_event)
- , lbl (_label)
- { }
-
- boost::system_time time;
- Event event;
- uint32_t lbl;
-};
-
-/// @cond include_hidden
-struct byLabel { } ;
-/// @endcond
-
-/**
- * \ingroup sync
- * @brief ???
- */
-struct EventsContainer : public mi::multi_index_container<
- LogicEvent,
- mi::indexed_by<
-
- mi::ordered_non_unique<
- mi::member<LogicEvent, boost::system_time, &LogicEvent::time>
- >,
-
- mi::ordered_non_unique<
- mi::tag<byLabel>,
- mi::member<LogicEvent, uint32_t, &LogicEvent::lbl>
- >
- >
- >
-{
-};
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_LOGIC_EVENT_CONTAINER_H
diff --git a/nsync/sync-logic.cc b/nsync/sync-logic.cc
deleted file mode 100644
index b1482cf..0000000
--- a/nsync/sync-logic.cc
+++ /dev/null
@@ -1,752 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#include "sync-logic.h"
-#include "sync-diff-leaf.h"
-#include "sync-full-leaf.h"
-#include "sync-logging.h"
-#include "sync-state.h"
-
-#include <boost/foreach.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/thread.hpp>
-#include <vector>
-
-using namespace std;
-
-using ndn::Data;
-using ndn::EventId;
-using ndn::KeyChain;
-using ndn::Face;
-using ndn::Name;
-using ndn::OnDataValidated;
-using ndn::OnDataValidationFailed;
-using ndn::Validator;
-
-INIT_LOGGER ("SyncLogic");
-
-
-#ifdef _DEBUG
-#define _LOG_DEBUG_ID(v) _LOG_DEBUG(m_instanceId << " " << v)
-#else
-#define _LOG_DEBUG_ID(v) _LOG_DEBUG(v)
-#endif
-
-#define GET_RANDOM(var) var ()
-
-#define TIME_SECONDS_WITH_JITTER(sec) \
- (ndn::time::seconds(sec) + ndn::time::milliseconds(GET_RANDOM (m_reexpressionJitter)))
-
-#define TIME_MILLISECONDS_WITH_JITTER(ms) \
- (ndn::time::seconds(ms) + ndn::time::milliseconds(GET_RANDOM (m_reexpressionJitter)))
-
-namespace Sync {
-
-using ndn::shared_ptr;
-
-int SyncLogic::m_instanceCounter = 0;
-
-const int SyncLogic::m_syncResponseFreshness = 1000; // MUST BE dividable by 1000!!!
-const int SyncLogic::m_syncInterestReexpress = 4; // seconds
-
-SyncLogic::SyncLogic (const Name& syncPrefix,
- shared_ptr<Validator> validator,
- shared_ptr<Face> face,
- LogicUpdateCallback onUpdate,
- LogicRemoveCallback onRemove)
- : m_state (new FullState)
- , m_syncInterestTable (face->getIoService(), ndn::time::seconds(m_syncInterestReexpress))
- , m_syncPrefix (syncPrefix)
- , m_onUpdate (onUpdate)
- , m_onRemove (onRemove)
- , m_perBranch (false)
- , m_validator(validator)
- , m_keyChain(new KeyChain())
- , m_face(face)
- , m_scheduler(face->getIoService())
- , m_randomGenerator (static_cast<unsigned int> (std::time (0)))
- , m_rangeUniformRandom (m_randomGenerator, boost::uniform_int<> (200,1000))
- , m_reexpressionJitter (m_randomGenerator, boost::uniform_int<> (100,500))
- , m_recoveryRetransmissionInterval (m_defaultRecoveryRetransmitInterval)
-{
- m_syncRegisteredPrefixId = m_face->setInterestFilter (m_syncPrefix,
- bind(&SyncLogic::onSyncInterest,
- this, _1, _2),
- bind(&SyncLogic::onSyncRegisterSucceed,
- this, _1),
- bind(&SyncLogic::onSyncRegisterFailed,
- this, _1, _2));
-
-
- m_reexpressingInterestId = m_scheduler.scheduleEvent (ndn::time::seconds (0),
- bind (&SyncLogic::sendSyncInterest, this));
-
- m_instanceId = string("Instance " + boost::lexical_cast<string>(m_instanceCounter++) + " ");
-}
-
-SyncLogic::SyncLogic (const Name& syncPrefix,
- shared_ptr<Validator> validator,
- shared_ptr<Face> face,
- LogicPerBranchCallback onUpdateBranch)
- : m_state (new FullState)
- , m_syncInterestTable (face->getIoService(), ndn::time::seconds (m_syncInterestReexpress))
- , m_syncPrefix (syncPrefix)
- , m_onUpdateBranch (onUpdateBranch)
- , m_perBranch(true)
- , m_validator(validator)
- , m_keyChain(new KeyChain())
- , m_face(face)
- , m_scheduler(face->getIoService())
- , m_randomGenerator (static_cast<unsigned int> (std::time (0)))
- , m_rangeUniformRandom (m_randomGenerator, boost::uniform_int<> (200,1000))
- , m_reexpressionJitter (m_randomGenerator, boost::uniform_int<> (100,500))
- , m_recoveryRetransmissionInterval (m_defaultRecoveryRetransmitInterval)
-{
- m_syncRegisteredPrefixId = m_face->setInterestFilter (m_syncPrefix,
- bind(&SyncLogic::onSyncInterest,
- this, _1, _2),
- bind(&SyncLogic::onSyncRegisterSucceed,
- this, _1),
- bind(&SyncLogic::onSyncRegisterFailed,
- this, _1, _2));
-
- m_reexpressingInterestId = m_scheduler.scheduleEvent (ndn::time::seconds (0),
- bind (&SyncLogic::sendSyncInterest, this));
-}
-
-SyncLogic::~SyncLogic ()
-{
- m_face->unsetInterestFilter(m_syncRegisteredPrefixId);
- m_scheduler.cancelEvent (m_reexpressingInterestId);
- m_scheduler.cancelEvent (m_delayedInterestProcessingId);
-}
-
-/**
- * Two types of intersts
- *
- * Normal name: .../<hash>
- * Recovery name: .../recovery/<hash>
- */
-tuple<DigestConstPtr, std::string>
-SyncLogic::convertNameToDigestAndType (const Name &name)
-{
- BOOST_ASSERT (m_syncPrefix.isPrefixOf(name));
-
- int nameLengthDiff = name.size() - m_syncPrefix.size();
- BOOST_ASSERT (nameLengthDiff > 0);
- BOOST_ASSERT (nameLengthDiff < 3);
-
- string hash = name.get(-1).toUri();
- string interestType;
-
- if(nameLengthDiff == 1)
- interestType = "normal";
- else
- interestType = name.get(-2).toUri();
-
- _LOG_DEBUG_ID (hash << ", " << interestType);
-
- DigestPtr digest = make_shared<Digest> ();
- istringstream is (hash);
- is >> *digest;
-
- return make_tuple(digest, interestType);
-}
-
-void
-SyncLogic::onSyncInterest (const Name& prefix, const ndn::Interest& interest)
-{
- Name name = interest.getName();
-
- _LOG_DEBUG_ID("respondSyncInterest: " << name);
-
- try
- {
- _LOG_DEBUG_ID ("<< I " << name);
-
- DigestConstPtr digest;
- string type;
- tie (digest, type) = convertNameToDigestAndType (name);
-
- if (type == "normal") // kind of ineffective...
- {
- processSyncInterest (name, digest);
- }
- else if (type == "recovery")
- {
- processSyncRecoveryInterest (name, digest);
- }
- }
- catch (Error::DigestCalculationError &e)
- {
- _LOG_DEBUG_ID ("Something fishy happened...");
- // log error. ignoring it for now, later we should log it
- return ;
- }
-}
-
-void
-SyncLogic::onSyncRegisterSucceed(const Name& prefix)
-{
- _LOG_DEBUG_ID("Sync prefix registration succeeded! " << prefix);
-}
-
-void
-SyncLogic::onSyncRegisterFailed(const Name& prefix, const string& msg)
-{
- _LOG_DEBUG_ID("Sync prefix registration failed! " << msg);
-}
-
-void
-SyncLogic::onSyncData(const ndn::Interest& interest, const Data& data)
-{
- OnDataValidated onValidated = bind(&SyncLogic::onSyncDataValidated, this, _1);
- OnDataValidationFailed onValidationFailed = bind(&SyncLogic::onSyncDataValidationFailed, this, _1);
- m_validator->validate(data, onValidated, onValidationFailed);
-}
-
-void
-SyncLogic::onSyncTimeout(const ndn::Interest& interest)
-{
- // It is OK. Others will handle the time out situation.
-}
-
-void
-SyncLogic::onSyncDataValidationFailed(const shared_ptr<const Data>& data)
-{
- _LOG_DEBUG_ID("Sync data cannot be verified!");
-}
-
-void
-SyncLogic::onSyncDataValidated(const shared_ptr<const Data>& data)
-{
- Name name = data->getName();
- const char* wireData = (const char*)data->getContent().value();
- size_t len = data->getContent().value_size();
-
- try
- {
- _LOG_DEBUG_ID ("<< D " << name);
-
- DigestConstPtr digest;
- string type;
- tie (digest, type) = convertNameToDigestAndType (name);
-
- if (type == "normal")
- {
- processSyncData (name, digest, wireData, len);
- }
- else
- {
- // timer is always restarted when we schedule recovery
- m_scheduler.cancelEvent (m_reexpressingRecoveryInterestId);
- processSyncData (name, digest, wireData, len);
- }
- }
- catch (Error::DigestCalculationError &e)
- {
- _LOG_DEBUG_ID ("Something fishy happened...");
- // log error. ignoring it for now, later we should log it
- return;
- }
-}
-
-void
-SyncLogic::processSyncInterest (const Name &name, DigestConstPtr digest,
- bool timedProcessing/*=false*/)
-{
- _LOG_DEBUG_ID("processSyncInterest");
- DigestConstPtr rootDigest;
- {
- rootDigest = m_state->getDigest();
- }
-
- // Special case when state is not empty and we have received request with zero-root digest
- if (digest->isZero () && !rootDigest->isZero ())
- {
-
- SyncStateMsg ssm;
- {
- ssm << (*m_state);
- }
- sendSyncData (name, digest, ssm);
- return;
- }
-
- if (*rootDigest == *digest)
- {
- _LOG_DEBUG_ID ("processSyncInterest (): Same state. Adding to PIT");
- m_syncInterestTable.insert (digest, name.toUri(), false);
- return;
- }
-
- DiffStateContainer::iterator stateInDiffLog = m_log.find (digest);
-
- if (stateInDiffLog != m_log.end ())
- {
- DiffStateConstPtr stateDiff = (*stateInDiffLog)->diff ();
-
- sendSyncData (name, digest, stateDiff);
- return;
- }
-
- if (!timedProcessing)
- {
- bool exists = m_syncInterestTable.insert (digest, name.toUri(), true);
- if (exists) // somebody else replied, so restart random-game timer
- {
- _LOG_DEBUG_ID("Unknown digest, but somebody may have already replied, " <<
- "so restart our timer");
- m_scheduler.cancelEvent (m_delayedInterestProcessingId);
- }
-
- uint32_t waitDelay = GET_RANDOM (m_rangeUniformRandom);
- _LOG_DEBUG_ID("Digest is not in the log. Schedule processing after small delay: " <<
- ndn::time::milliseconds (waitDelay));
-
- m_delayedInterestProcessingId =
- m_scheduler.scheduleEvent(ndn::time::milliseconds (waitDelay),
- bind (&SyncLogic::processSyncInterest, this, name, digest, true));
- }
- else
- {
- _LOG_DEBUG_ID(" (timed processing)");
-
- m_recoveryRetransmissionInterval = m_defaultRecoveryRetransmitInterval;
- sendSyncRecoveryInterests (digest);
- }
-}
-
-void
-SyncLogic::processSyncData (const Name &name, DigestConstPtr digest,
- const char *wireData, size_t len)
-{
- DiffStatePtr diffLog = make_shared<DiffState> ();
- bool ownInterestSatisfied = false;
-
- try
- {
-
- m_syncInterestTable.remove (name.toUri()); // Remove satisfied interest from PIT
-
- ownInterestSatisfied = (name == m_outstandingInterestName);
-
- DiffState diff;
- SyncStateMsg msg;
- if (!msg.ParseFromArray(wireData, len) || !msg.IsInitialized())
- {
- //Throw
- BOOST_THROW_EXCEPTION (Error::SyncStateMsgDecodingFailure () );
- }
- msg >> diff;
-
- vector<MissingDataInfo> v;
- BOOST_FOREACH (LeafConstPtr leaf, diff.getLeaves().get<ordered>())
- {
- DiffLeafConstPtr diffLeaf = dynamic_pointer_cast<const DiffLeaf> (leaf);
- BOOST_ASSERT (diffLeaf != 0);
-
- NameInfoConstPtr info = diffLeaf->getInfo();
- if (diffLeaf->getOperation() == UPDATE)
- {
- SeqNo seq = diffLeaf->getSeq();
-
- bool inserted = false;
- bool updated = false;
- SeqNo oldSeq;
- {
- tie (inserted, updated, oldSeq) = m_state->update (info, seq);
- }
-
- if (inserted || updated)
- {
- diffLog->update (info, seq);
- if (!oldSeq.isValid())
- {
- oldSeq = SeqNo(seq.getSession(), 0);
- }
- else
- {
- ++oldSeq;
- }
- // there is no need for application to process update on forwarder node
- if (info->toString() != forwarderPrefix)
- {
- MissingDataInfo mdi = {info->toString(), oldSeq, seq};
- {
- ostringstream interestName;
- interestName << mdi.prefix <<
- "/" << mdi.high.getSession() <<
- "/" << mdi.high.getSeq();
- _LOG_DEBUG_ID("+++++++++++++++ " + interestName.str());
- }
- if (m_perBranch)
- {
- ostringstream interestName;
- interestName << mdi.prefix <<
- "/" << mdi.high.getSession() <<
- "/" << mdi.high.getSeq();
- m_onUpdateBranch(interestName.str());
- }
- else
- {
- v.push_back(mdi);
- }
- }
- }
- }
- else if (diffLeaf->getOperation() == REMOVE)
- {
- if (m_state->remove (info))
- {
- diffLog->remove (info);
- if (!m_perBranch)
- {
- m_onRemove (info->toString ());
- }
- }
- }
- else
- {
- }
- }
-
- if (!v.empty())
- {
- if (!m_perBranch)
- {
- m_onUpdate(v);
- }
- }
-
- insertToDiffLog (diffLog);
- }
- catch (Error::SyncStateMsgDecodingFailure &e)
- {
- _LOG_DEBUG_ID ("Something really fishy happened during state decoding " <<
- diagnostic_information (e));
- diffLog.reset ();
- // don't do anything
- }
-
- if ((diffLog != 0 && diffLog->getLeaves ().size () > 0) ||
- ownInterestSatisfied)
- {
- _LOG_DEBUG_ID(" +++++++++++++++ state changed!!!");
- // Do it only if everything went fine and state changed
-
- // this is kind of wrong
- // satisfyPendingSyncInterests (diffLog); // if there are interests in PIT,
- // // there is a point to satisfy them using new state
-
- // if state has changed, then it is safe to express a new interest
- ndn::time::system_clock::Duration after =
- ndn::time::milliseconds(GET_RANDOM (m_reexpressionJitter));
- // cout << "------------ reexpress interest after: " << after << endl;
- EventId eventId = m_scheduler.scheduleEvent (after,
- bind (&SyncLogic::sendSyncInterest, this));
-
- m_scheduler.cancelEvent (m_reexpressingInterestId);
- m_reexpressingInterestId = eventId;
- }
-}
-
-void
-SyncLogic::processSyncRecoveryInterest (const Name &name, DigestConstPtr digest)
-{
- _LOG_DEBUG_ID("processSyncRecoveryInterest");
- DiffStateContainer::iterator stateInDiffLog = m_log.find (digest);
-
- if (stateInDiffLog == m_log.end ())
- {
- _LOG_DEBUG_ID ("Could not find " << *digest << " in digest log");
- return;
- }
-
- SyncStateMsg ssm;
- {
- ssm << (*m_state);
- }
- sendSyncData (name, digest, ssm);
-}
-
-void
-SyncLogic::satisfyPendingSyncInterests (DiffStateConstPtr diffLog)
-{
- DiffStatePtr fullStateLog = make_shared<DiffState> ();
- {
- BOOST_FOREACH (LeafConstPtr leaf, m_state->getLeaves ()/*.get<timed> ()*/)
- {
- fullStateLog->update (leaf->getInfo (), leaf->getSeq ());
- /// @todo Impose limit on how many state info should be send out
- }
- }
-
- try
- {
- uint32_t counter = 0;
- while (m_syncInterestTable.size () > 0)
- {
- Sync::Interest interest = m_syncInterestTable.pop ();
-
- if (!interest.m_unknown)
- {
- _LOG_DEBUG_ID (">> D " << interest.m_name);
- sendSyncData (interest.m_name, interest.m_digest, diffLog);
- }
- else
- {
- _LOG_DEBUG_ID (">> D (unknown)" << interest.m_name);
- sendSyncData (interest.m_name, interest.m_digest, fullStateLog);
- }
- counter ++;
- }
- _LOG_DEBUG_ID ("Satisfied " << counter << " pending interests");
- }
- catch (Error::InterestTableIsEmpty &e)
- {
- // ok. not really an error
- }
-}
-
-void
-SyncLogic::insertToDiffLog (DiffStatePtr diffLog)
-{
- diffLog->setDigest (m_state->getDigest());
- if (m_log.size () > 0)
- {
- m_log.get<sequenced> ().front ()->setNext (diffLog);
- }
- m_log.erase (m_state->getDigest()); // remove diff state with the same digest.
- // next pointers are still valid
- /// @todo Optimization
- m_log.get<sequenced> ().push_front (diffLog);
-}
-
-void
-SyncLogic::addLocalNames (const Name &prefix, uint64_t session, uint64_t seq)
-{
- DiffStatePtr diff;
- {
- //cout << "Add local names" <<endl;
- NameInfoConstPtr info = StdNameInfo::FindOrCreate(prefix.toUri());
-
- _LOG_DEBUG_ID ("addLocalNames (): old state " << *m_state->getDigest ());
-
- SeqNo seqN (session, seq);
- m_state->update(info, seqN);
-
- _LOG_DEBUG_ID ("addLocalNames (): new state " << *m_state->getDigest ());
-
- diff = make_shared<DiffState>();
- diff->update(info, seqN);
- insertToDiffLog (diff);
- }
-
- // _LOG_DEBUG_ID ("PIT size: " << m_syncInterestTable.size ());
- satisfyPendingSyncInterests (diff);
-}
-
-void
-SyncLogic::remove(const Name &prefix)
-{
- DiffStatePtr diff;
- {
- NameInfoConstPtr info = StdNameInfo::FindOrCreate(prefix.toUri());
- m_state->remove(info);
-
- // increment the sequence number for the forwarder node
- NameInfoConstPtr forwarderInfo = StdNameInfo::FindOrCreate(forwarderPrefix);
-
- LeafContainer::iterator item = m_state->getLeaves ().find (forwarderInfo);
- SeqNo seqNo (0);
- if (item != m_state->getLeaves ().end ())
- {
- seqNo = (*item)->getSeq ();
- ++seqNo;
- }
- m_state->update (forwarderInfo, seqNo);
-
- diff = make_shared<DiffState>();
- diff->remove(info);
- diff->update(forwarderInfo, seqNo);
-
- insertToDiffLog (diff);
- }
-
- satisfyPendingSyncInterests (diff);
-}
-
-void
-SyncLogic::sendSyncInterest ()
-{
- _LOG_DEBUG_ID("sendSyncInterest");
-
- {
- m_outstandingInterestName = m_syncPrefix;
- ostringstream os;
- os << *m_state->getDigest();
- m_outstandingInterestName.append(os.str());
- _LOG_DEBUG_ID (">> I " << m_outstandingInterestName);
- }
-
- _LOG_DEBUG_ID("sendSyncInterest: " << m_outstandingInterestName);
-
- EventId eventId =
- m_scheduler.scheduleEvent(ndn::time::seconds(m_syncInterestReexpress) +
- ndn::time::milliseconds(GET_RANDOM(m_reexpressionJitter)),
- bind (&SyncLogic::sendSyncInterest, this));
- m_scheduler.cancelEvent (m_reexpressingInterestId);
- m_reexpressingInterestId = eventId;
-
- ndn::Interest interest(m_outstandingInterestName);
- interest.setMustBeFresh(true);
-
- m_face->expressInterest(interest,
- bind(&SyncLogic::onSyncData, this, _1, _2),
- bind(&SyncLogic::onSyncTimeout, this, _1), // Nack
- bind(&SyncLogic::onSyncTimeout, this, _1));
-}
-
-void
-SyncLogic::sendSyncRecoveryInterests (DigestConstPtr digest)
-{
- ostringstream os;
- os << *digest;
-
- Name interestName = m_syncPrefix;
- interestName.append("recovery").append(os.str());
-
- ndn::time::system_clock::Duration nextRetransmission =
- ndn::time::milliseconds(m_recoveryRetransmissionInterval + GET_RANDOM (m_reexpressionJitter));
-
- m_recoveryRetransmissionInterval <<= 1;
-
- m_scheduler.cancelEvent (m_reexpressingRecoveryInterestId);
- if (m_recoveryRetransmissionInterval < 100*1000) // <100 seconds
- m_reexpressingRecoveryInterestId =
- m_scheduler.scheduleEvent (nextRetransmission,
- bind (&SyncLogic::sendSyncRecoveryInterests, this, digest));
-
- ndn::Interest interest(interestName);
- interest.setMustBeFresh(true);
-
- m_face->expressInterest(interest,
- bind(&SyncLogic::onSyncData, this, _1, _2),
- bind(&SyncLogic::onSyncTimeout, this, _1), // Nack
- bind(&SyncLogic::onSyncTimeout, this, _1));
-}
-
-
-void
-SyncLogic::sendSyncData (const Name &name, DigestConstPtr digest, StateConstPtr state)
-{
- SyncStateMsg msg;
- msg << (*state);
- sendSyncData(name, digest, msg);
-}
-
-// pass in state msg instead of state, so that there is no need to lock the state until
-// this function returns
-void
-SyncLogic::sendSyncData (const Name &name, DigestConstPtr digest, SyncStateMsg &ssm)
-{
- _LOG_DEBUG_ID (">> D " << name);
- int size = ssm.ByteSize();
- char *wireData = new char[size];
- ssm.SerializeToArray(wireData, size);
-
- //Data syncData(name);
- ndn::shared_ptr<ndn::Data> syncData = ndn::make_shared<ndn::Data>();
- syncData->setName(name);
- syncData->setContent(reinterpret_cast<const uint8_t*>(wireData), size);
- syncData->setFreshnessPeriod(ndn::time::seconds(m_syncResponseFreshness));
-
- m_keyChain->sign(*syncData);
-
- m_face->put(*syncData);
-
- delete []wireData;
-
- // checking if our own interest got satisfied
- bool satisfiedOwnInterest = false;
- {
- satisfiedOwnInterest = (m_outstandingInterestName == name);
- }
-
- if (satisfiedOwnInterest)
- {
- _LOG_DEBUG_ID ("Satisfied our own Interest. Re-expressing (hopefully with a new digest)");
-
- ndn::time::system_clock::Duration after =
- ndn::time::milliseconds(GET_RANDOM(m_reexpressionJitter));
- // cout << "------------ reexpress interest after: " << after << endl;
- EventId eventId = m_scheduler.scheduleEvent (after,
- bind (&SyncLogic::sendSyncInterest, this));
- m_scheduler.cancelEvent (m_reexpressingInterestId);
- m_reexpressingInterestId = eventId;
- }
-}
-
-string
-SyncLogic::getRootDigest()
-{
- ostringstream os;
- os << *m_state->getDigest();
- return os.str();
-}
-
-size_t
-SyncLogic::getNumberOfBranches () const
-{
- return m_state->getLeaves ().size ();
-}
-
-void
-SyncLogic::printState () const
-{
- BOOST_FOREACH (const shared_ptr<Sync::Leaf> leaf, m_state->getLeaves ())
- {
- std::cout << *leaf << std::endl;
- }
-}
-
-std::map<std::string, bool>
-SyncLogic::getBranchPrefixes() const
-{
- std::map<std::string, bool> m;
-
- BOOST_FOREACH (const shared_ptr<Sync::Leaf> leaf, m_state->getLeaves ())
- {
- std::string prefix = leaf->getInfo()->toString();
- // do not return forwarder prefix
- if (prefix != forwarderPrefix)
- {
- m.insert(pair<std::string, bool>(prefix, false));
- }
- }
-
- return m;
-}
-
-}
diff --git a/nsync/sync-logic.h b/nsync/sync-logic.h
deleted file mode 100644
index 17d98ee..0000000
--- a/nsync/sync-logic.h
+++ /dev/null
@@ -1,223 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_LOGIC_H
-#define NLSR_NSYNC_SYNC_LOGIC_H
-
-#include <boost/random.hpp>
-#include <memory>
-#include <map>
-
-#include <ndn-cxx/face.hpp>
-#include <ndn-cxx/security/validator.hpp>
-#include <ndn-cxx/security/key-chain.hpp>
-#include <ndn-cxx/util/scheduler.hpp>
-
-#include "sync-interest-table.h"
-#include "sync-diff-state.h"
-#include "sync-full-state.h"
-#include "sync-std-name-info.h"
-
-#include "sync-diff-state-container.h"
-
-#ifdef _DEBUG
-#ifdef HAVE_LOG4CXX
-#include <log4cxx/logger.h>
-#endif
-#endif
-
-namespace Sync {
-
-struct MissingDataInfo {
- std::string prefix;
- SeqNo low;
- SeqNo high;
-};
-
-/**
- * \ingroup sync
- * @brief A wrapper for SyncApp, which handles ccnx related things (process
- * interests and data)
- */
-
-class SyncLogic
-{
-public:
- typedef function< void (const std::vector<MissingDataInfo> & ) > LogicUpdateCallback;
- typedef function< void (const std::string &/*prefix*/ ) > LogicRemoveCallback;
- typedef function< void (const std::string &)> LogicPerBranchCallback;
-
- /**
- * @brief Constructor
- * @param syncPrefix the name prefix to use for the Sync Interest
- * @param onUpdate function that will be called when new state is detected
- * @param onRemove function that will be called when state is removed
- * @param ccnxHandle ccnx handle
- * the app data when new remote names are learned
- */
- SyncLogic (const ndn::Name& syncPrefix,
- ndn::shared_ptr<ndn::Validator> validator,
- ndn::shared_ptr<ndn::Face> face,
- LogicUpdateCallback onUpdate,
- LogicRemoveCallback onRemove);
-
- SyncLogic (const ndn::Name& syncPrefix,
- ndn::shared_ptr<ndn::Validator> validator,
- ndn::shared_ptr<ndn::Face> face,
- LogicPerBranchCallback onUpdateBranch);
-
- ~SyncLogic ();
-
- /**
- * a wrapper for the same func in SyncApp
- */
- void addLocalNames (const ndn::Name &prefix, uint64_t session, uint64_t seq);
-
- /**
- * @brief remove a participant's subtree from the sync tree
- * @param prefix the name prefix for the participant
- */
- void remove (const ndn::Name &prefix);
-
- std::string
- getRootDigest();
-
-#ifdef _DEBUG
- ndn::Scheduler &
- getScheduler () { return m_scheduler; }
-#endif
-
- void
- printState () const;
-
- std::map<std::string, bool>
- getBranchPrefixes() const;
-
-private:
- void
- delayedChecksLoop ();
-
- void
- onSyncInterest (const ndn::Name& prefix, const ndn::Interest& interest);
-
- void
- onSyncRegisterSucceed(const ndn::Name& prefix);
-
- void
- onSyncRegisterFailed(const ndn::Name& prefix, const std::string& msg);
-
- void
- onSyncData(const ndn::Interest& interest, const ndn::Data& data);
-
- void
- onSyncTimeout(const ndn::Interest& interest);
-
- void
- onSyncDataValidationFailed(const ndn::shared_ptr<const ndn::Data>& data);
-
- void
- onSyncDataValidated(const ndn::shared_ptr<const ndn::Data>& data);
-
- void
- processSyncInterest (const ndn::Name &name,
- DigestConstPtr digest, bool timedProcessing=false);
-
- void
- processSyncData (const ndn::Name &name,
- DigestConstPtr digest, const char *wireData, size_t len);
-
- void
- processSyncRecoveryInterest (const ndn::Name &name,
- DigestConstPtr digest);
-
- void
- insertToDiffLog (DiffStatePtr diff);
-
- void
- satisfyPendingSyncInterests (DiffStateConstPtr diff);
-
- tuple<DigestConstPtr, std::string>
- convertNameToDigestAndType (const ndn::Name &name);
-
- void
- sendSyncInterest ();
-
- void
- sendSyncRecoveryInterests (DigestConstPtr digest);
-
- void
- sendSyncData (const ndn::Name &name,
- DigestConstPtr digest, StateConstPtr state);
-
- void
- sendSyncData (const ndn::Name &name,
- DigestConstPtr digest, SyncStateMsg &msg);
-
- size_t
- getNumberOfBranches () const;
-
-private:
- FullStatePtr m_state;
-
- DiffStateContainer m_log;
-
- ndn::Name m_outstandingInterestName;
- SyncInterestTable m_syncInterestTable;
-
- ndn::Name m_syncPrefix;
- LogicUpdateCallback m_onUpdate;
- LogicRemoveCallback m_onRemove;
- LogicPerBranchCallback m_onUpdateBranch;
- bool m_perBranch;
- std::shared_ptr<ndn::Validator> m_validator;
- std::shared_ptr<ndn::KeyChain> m_keyChain;
- std::shared_ptr<ndn::Face> m_face;
- const ndn::RegisteredPrefixId* m_syncRegisteredPrefixId;
-
- ndn::Scheduler m_scheduler;
-
- boost::mt19937 m_randomGenerator;
- boost::variate_generator<boost::mt19937&, boost::uniform_int<> > m_rangeUniformRandom;
- boost::variate_generator<boost::mt19937&, boost::uniform_int<> > m_reexpressionJitter;
-
-
- static const int m_unknownDigestStoreTime = 10; // seconds
- static const int m_syncResponseFreshness; // MUST BE dividable by 1000!!!
- static const int m_syncInterestReexpress; // seconds
- static const int m_defaultRecoveryRetransmitInterval = 200; // milliseconds
-
-
- uint32_t m_recoveryRetransmissionInterval; // milliseconds
-
- ndn::EventId m_delayedInterestProcessingId;
- ndn::EventId m_reexpressingInterestId;
- ndn::EventId m_reexpressingRecoveryInterestId;
-
- std::string m_instanceId;
- static int m_instanceCounter;
-};
-
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_LOGIC_H
diff --git a/nsync/sync-name-info.cc b/nsync/sync-name-info.cc
deleted file mode 100644
index 3054eac..0000000
--- a/nsync/sync-name-info.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-name-info.h"
-
-// #include <boost/lexical_cast.hpp>
-
-namespace Sync {
-
-NameInfo::NameMap NameInfo::m_names;
-size_t NameInfo::m_ids = 0;
-
-} // Sync
diff --git a/nsync/sync-name-info.h b/nsync/sync-name-info.h
deleted file mode 100644
index f4d94da..0000000
--- a/nsync/sync-name-info.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_NAME_INFO_H
-#define NLSR_NSYNC_SYNC_NAME_INFO_H
-
-#include "sync-common.h"
-
-#include <map>
-#include <string>
-#include "sync-digest.h"
-
-namespace Sync {
-
-/**
- * @ingroup sync
- * @brief Templated class for the leaf name
- */
-class NameInfo
-{
-private:
- typedef weak_ptr<const NameInfo> const_weak_ptr;
-
-public:
- virtual ~NameInfo () { };
-
- /**
- * @brief Get ID of the record (should be locally-unique, but not really necessary---this is be used for hashing purposes)
- */
- size_t
- getHashId () const { return m_id; }
-
- /**
- * @brief Check if two names are equal
- * @param info name to check with
- */
- virtual bool
- operator == (const NameInfo &info) const = 0;
-
- /**
- * @brief Check if two names are in order
- * @param info name to check with
- */
- virtual bool
- operator < (const NameInfo &info) const = 0;
-
- /**
- * @brief Calculates digest of the name
- */
- const Digest &
- getDigest () const { return m_digest; }
-
- /**
- * @brief Convert prefix to string
- * @returns string representation of prefix
- */
- virtual std::string
- toString () const = 0;
-
-protected:
- // actual stuff
- size_t m_id; ///< @brief Identifies NameInfo throughout the library (for hash container, doesn't need to be strictly unique)
- Digest m_digest;
-
- // static stuff
- typedef std::map<std::string, const_weak_ptr> NameMap;
- static size_t m_ids;
- static NameMap m_names;
-};
-
-typedef shared_ptr<NameInfo> NameInfoPtr;
-typedef shared_ptr<const NameInfo> NameInfoConstPtr;
-
-inline std::ostream &
-operator << (std::ostream &os, const NameInfo &info)
-{
- os << info.toString ();
- return os;
-}
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_NAME_INFO_H
diff --git a/nsync/sync-seq-no.cc b/nsync/sync-seq-no.cc
deleted file mode 100644
index 00d97ee..0000000
--- a/nsync/sync-seq-no.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-seq-no.h"
-
-namespace Sync {
-
-DigestConstPtr
-SeqNo::getDigest () const
-{
- DigestPtr digest = make_shared<Digest> ();
- *digest << m_session << m_seq;
- digest->finalize ();
- return digest;
-}
-
-} // Sync
diff --git a/nsync/sync-seq-no.h b/nsync/sync-seq-no.h
deleted file mode 100644
index b6de991..0000000
--- a/nsync/sync-seq-no.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_SEQ_NO_H
-#define NLSR_NSYNC_SYNC_SEQ_NO_H
-
-#include <boost/cstdint.hpp>
-#include "sync-digest.h"
-
-namespace Sync {
-
-/**
- * @ingroup sync
- * @brief Sequence number abstraction
- */
-class SeqNo
-{
-public:
- /**
- * @brief Default constructor. Creates an zero sequence number with zero session ID (basically is an invalid object)
- */
- SeqNo ()
- : m_valid (false)
- , m_session (0)
- , m_seq (0)
- {
- }
-
- /**
- * @brief Copy constructor
- * @param seq sequence number object to copy from
- */
- SeqNo (const SeqNo &seq)
- {
- *this = seq;
- }
-
- /**
- * @brief Assignment operator
- * @param seq sequence number object to copy from
- */
- SeqNo &
- operator = (const SeqNo &seq)
- {
- m_valid = seq.m_valid;
- m_session = seq.m_session;
- m_seq = seq.m_seq;
-
- return *this;
- }
-
- /**
- * @brief Constructor with just sequence number. Session assumed to be zero
- * @param seq Sequence number
- */
- SeqNo (uint64_t seq)
- : m_valid (true)
- , m_session (0)
- , m_seq (seq)
- { }
-
- /**
- * @brief Constructor with session and sequence id
- * @param session Session ID
- * @param seq Sequence number
- */
- SeqNo (uint64_t session, uint64_t seq)
- : m_valid (true)
- , m_session (session)
- , m_seq (seq)
- { }
-
- /**
- * @brief Get sequence number digest
- *
- * Digest will be calculated every time it is requested
- */
- DigestConstPtr
- getDigest () const;
-
- /**
- * @brief Compare if one sequence number is lower
- * @param seq Another sequence number to compare with
- *
- * tuple (session1, seq1) is less than (session2, seq2) in two cases:
- * 1. session1 < session2
- * 2. session1 == session2 and seq1 < seq2
- */
- bool
- operator < (const SeqNo &seq) const
- {
- return m_session < seq.m_session || (m_session == seq.m_session && m_seq < seq.m_seq);
- }
-
- /**
- * @brief Compare if two sequence numbers are equal
- * @param seq Another sequence number to compare with
- */
- bool
- operator == (const SeqNo &seq) const
- {
- return m_session == seq.m_session && m_seq == seq.m_seq;
- }
-
- bool
- operator <= (const SeqNo &seq) const
- {
- return m_session == seq.m_session && m_seq <= seq.m_seq;
- }
-
- SeqNo &
- operator ++ ()
- {
- if (m_valid) {
- m_seq ++;
- }
- else {
- m_valid = true;
- }
- return *this;
- }
-
- bool
- isValid () const
- {
- return m_valid;
- }
-
- /**
- * @brief Get session id
- */
- uint64_t getSession () const
- { return m_session; }
-
- /**
- * @brief Get sequence number
- */
- uint64_t getSeq () const
- { return m_seq; }
-
- /**
- * @brief Set sequence number
- */
- void
- setSeq(uint64_t seq)
- { m_seq = seq; }
-
-private:
- bool m_valid;
-
- /**
- * @brief Session ID (e.g., after crash, application will choose new session ID.
- *
- * Note that session IDs for the same name should always increase. So, the good choice
- * for the session ID is client's timestamp
- */
- uint64_t m_session;
-
- /**
- * @brief Sequence number
- *
- * Sequence number for a session always starts with 0 and goes to max value.
- *
- * For now, wrapping sequence number after max to zero is not supported
- */
- uint64_t m_seq;
-};
-
-inline std::ostream &
-operator << (std::ostream &os, const SeqNo &seqno)
-{
- os << "<session>" << seqno.getSession () << "</session><seqno>" << seqno.getSeq () << "</seqno>";
- return os;
-}
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_SEQ_NO_H
diff --git a/nsync/sync-socket.cc b/nsync/sync-socket.cc
deleted file mode 100644
index ef6b9fb..0000000
--- a/nsync/sync-socket.cc
+++ /dev/null
@@ -1,184 +0,0 @@
-/* -*- Mode: C32++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#include "sync-socket.h"
-#include "sync-logging.h"
-
-#include <boost/lexical_cast.hpp>
-#include <boost/thread.hpp>
-
-using namespace std;
-
-using ndn::Data;
-using ndn::Face;
-using ndn::KeyChain;
-using ndn::Name;
-using ndn::OnDataValidated;
-using ndn::OnDataValidationFailed;
-using ndn::Validator;
-
-INIT_LOGGER ("SyncSocket");
-
-namespace Sync {
-
-using ndn::shared_ptr;
-using ndn::make_shared;
-
-SyncSocket::SyncSocket (const Name &syncPrefix,
- shared_ptr<Validator> validator,
- shared_ptr<Face> face,
- NewDataCallback dataCallback,
- RemoveCallback rmCallback )
- : m_newDataCallback(dataCallback)
- , m_validator(validator)
- , m_keyChain(new KeyChain())
- , m_face(face)
- , m_syncLogic (syncPrefix,
- validator,
- face,
- bind(&SyncSocket::passCallback, this, _1),
- rmCallback)
-{
-}
-
-SyncSocket::~SyncSocket()
-{
-}
-
-bool
-SyncSocket::publishData(const Name &prefix, uint64_t session,
- const char *buf, size_t len,
- int freshness,uint64_t seq)
-{
- shared_ptr<Data> data = make_shared<Data>();
- data->setContent(reinterpret_cast<const uint8_t*>(buf), len);
- data->setFreshnessPeriod(ndn::time::seconds(freshness));
-
- m_face->getIoService().post(bind(&SyncSocket::publishDataInternal, this,
- data, prefix, session,seq));
-
- return true;
-}
-
-void
-SyncSocket::publishDataInternal(shared_ptr<Data> data,
- const Name &prefix, uint64_t session, uint64_t seq)
-{
- uint64_t sequence = seq;
- Name dataName = prefix;
- dataName.append(boost::lexical_cast<string>(session))
- .append(boost::lexical_cast<string>(sequence));
- data->setName(dataName);
-
- m_keyChain->sign(*data);
- m_face->put(*data);
-
- SeqNo s(session, sequence + 1);
-
- m_sequenceLog[prefix] = s;
- m_syncLogic.addLocalNames (prefix, session, sequence);
-}
-
-void
-SyncSocket::fetchData(const Name &prefix, const SeqNo &seq,
- const OnDataValidated& onValidated, int retry)
-{
- Name interestName = prefix;
- interestName.append(boost::lexical_cast<string>(seq.getSession()))
- .append(boost::lexical_cast<string>(seq.getSeq()));
-
- const OnDataValidationFailed& onValidationFailed =
- bind(&SyncSocket::onDataValidationFailed, this, _1);
-
- ndn::Interest interest(interestName);
- interest.setMustBeFresh(true);
- m_face->expressInterest(interest,
- bind(&SyncSocket::onData, this, _1, _2,
- onValidated, onValidationFailed),
- bind(&SyncSocket::onDataTimeout, this, _1, retry, // Nack
- onValidated, onValidationFailed),
- bind(&SyncSocket::onDataTimeout, this, _1, retry,
- onValidated, onValidationFailed));
-
-}
-
-void
-SyncSocket::onData(const ndn::Interest& interest, const Data& data,
- const OnDataValidated& onValidated,
- const OnDataValidationFailed& onValidationFailed)
-{
- m_validator->validate(data, onValidated, onValidationFailed);
-}
-
-void
-SyncSocket::onDataTimeout(const ndn::Interest& interest,
- int retry,
- const OnDataValidated& onValidated,
- const OnDataValidationFailed& onValidationFailed)
-{
- if(retry > 0)
- {
- m_face->expressInterest(interest,
- bind(&SyncSocket::onData,
- this,
- _1,
- _2,
- onValidated,
- onValidationFailed),
- bind(&SyncSocket::onDataTimeout,
- this,
- _1,
- retry - 1,
- onValidated,
- onValidationFailed),
- bind(&SyncSocket::onDataTimeout,
- this,
- _1,
- retry - 1,
- onValidated,
- onValidationFailed));
-
- }
- else
- _LOG_DEBUG("interest eventually time out!");
-}
-
-void
-SyncSocket::onDataValidationFailed(const shared_ptr<const Data>& data)
-{
- _LOG_DEBUG("data cannot be verified!");
-}
-
-
-uint64_t
-SyncSocket::getNextSeq (const Name &prefix, uint64_t session)
-{
- SequenceLog::iterator i = m_sequenceLog.find (prefix);
-
- if (i != m_sequenceLog.end ())
- {
- SeqNo s = i->second;
- if (s.getSession() == session)
- return s.getSeq();
- }
- return 0;
-}
-
-}//Sync
diff --git a/nsync/sync-socket.h b/nsync/sync-socket.h
deleted file mode 100644
index e6ca55e..0000000
--- a/nsync/sync-socket.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_SOCKET_H
-#define NLSR_NSYNC_SYNC_SOCKET_H
-
-#include "sync-common.h"
-
-#include <ndn-cxx/face.hpp>
-#include <ndn-cxx/security/validator.hpp>
-#include <ndn-cxx/security/key-chain.hpp>
-
-#include "sync-logic.h"
-#include "sync-seq-no.h"
-
-#include <utility>
-#include <map>
-#include <vector>
-#include <sstream>
-
-namespace Sync {
-
-/**
- * \ingroup sync
- * @brief A simple interface to interact with client code
- */
-class SyncSocket
-{
-public:
- typedef ndn::function<void(const std::vector<MissingDataInfo> &, SyncSocket *)> NewDataCallback;
- typedef ndn::function<void(const std::string &/*prefix*/)> RemoveCallback;
-
- /**
- * @brief the constructor for SyncAppSocket; the parameter syncPrefix
- * should be passed to the constructor of m_syncAppWrapper; the other
- * parameter should be passed to the constructor of m_fetcher; furthermore,
- * the fetch function of m_fetcher should be a second paramter passed to
- * the constructor of m_syncAppWrapper, so that m_syncAppWrapper can tell
- * m_fetcher to fetch the actual app data after it learns the names
- *
- * @param syncPrefix the name prefix for Sync Interest
- * @param dataCallback the callback to process data
- */
- SyncSocket (const ndn::Name &syncPrefix,
- ndn::shared_ptr<ndn::Validator> validator,
- ndn::shared_ptr<ndn::Face> face,
- NewDataCallback dataCallback,
- RemoveCallback rmCallback);
-
- ~SyncSocket ();
-
- bool
- publishData(const ndn::Name &prefix, uint64_t session, const char *buf, size_t len,
- int freshness,uint64_t seq);
-
- void
- remove (const ndn::Name &prefix)
- { m_syncLogic.remove(prefix); }
-
- void
- fetchData(const ndn::Name &prefix, const SeqNo &seq,
- const ndn::OnDataValidated& onValidated, int retry = 0);
-
- std::string
- getRootDigest()
- { return m_syncLogic.getRootDigest(); }
-
- uint64_t
- getNextSeq (const ndn::Name &prefix, uint64_t session);
-
- SyncLogic &
- getLogic ()
- { return m_syncLogic; }
-
- // make this a static function so we don't have to create socket instance without
- // knowing the local prefix. it's a wrong place for this function anyway
- static std::string
- GetLocalPrefix ();
-
-private:
- void
- publishDataInternal(ndn::shared_ptr<ndn::Data> data,
- const ndn::Name &prefix, uint64_t session,uint64_t seq);
-
- void
- passCallback(const std::vector<MissingDataInfo> &v)
- {
- m_newDataCallback(v, this);
- }
-
- void
- onData(const ndn::Interest& interest, const ndn::Data& data,
- const ndn::OnDataValidated& onValidated,
- const ndn::OnDataValidationFailed& onValidationFailed);
-
- void
- onDataTimeout(const ndn::Interest& interest,
- int retry,
- const ndn::OnDataValidated& onValidated,
- const ndn::OnDataValidationFailed& onValidationFailed);
-
- void
- onDataValidationFailed(const ndn::shared_ptr<const ndn::Data>& data);
-
-private:
- typedef std::map<ndn::Name, SeqNo> SequenceLog;
- NewDataCallback m_newDataCallback;
- SequenceLog m_sequenceLog;
- ndn::shared_ptr<ndn::Validator> m_validator;
- ndn::shared_ptr<ndn::KeyChain> m_keyChain;
- ndn::shared_ptr<ndn::Face> m_face;
- SyncLogic m_syncLogic;
-};
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_SOCKET_H
diff --git a/nsync/sync-state-leaf-container.h b/nsync/sync-state-leaf-container.h
deleted file mode 100644
index 9f0c272..0000000
--- a/nsync/sync-state-leaf-container.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_STATE_LEAF_CONTAINER_H
-#define NLSR_NSYNC_SYNC_STATE_LEAF_CONTAINER_H
-
-#include "sync-leaf.h"
-#include "sync-name-info.h"
-
-#include <boost/multi_index_container.hpp>
-// #include <boost/multi_index/tag.hpp>
-#include <boost/multi_index/ordered_index.hpp>
-// #include <boost/multi_index/composite_key.hpp>
-#include <boost/multi_index/hashed_index.hpp>
-// #include <boost/multi_index/random_access_index.hpp>
-// #include <boost/multi_index/member.hpp>
-#include <boost/multi_index/mem_fun.hpp>
-
-namespace mi = boost::multi_index;
-
-namespace Sync {
-
-struct NameInfoHash : public std::unary_function<NameInfo, std::size_t>
-{
- std::size_t
- operator() (NameInfoConstPtr prefix) const
- {
- return prefix->getHashId ();
- }
-};
-
-struct NameInfoEqual : public std::unary_function<NameInfo, std::size_t>
-{
- bool
- operator() (NameInfoConstPtr prefix1, NameInfoConstPtr prefix2) const
- {
- return *prefix1 == *prefix2;
- }
-};
-
-struct NameInfoCompare : public std::unary_function<NameInfo, std::size_t>
-{
- bool
- operator() (NameInfoConstPtr prefix1, NameInfoConstPtr prefix2) const
- {
- return *prefix1 < *prefix2;
- }
-};
-
-/// @cond include_hidden
-struct hashed { };
-struct ordered { };
-/// @endcond
-
-/**
- * \ingroup sync
- * @brief Container for SYNC leaves
- */
-struct LeafContainer : public mi::multi_index_container<
- LeafPtr,
- mi::indexed_by<
- // For fast access to elements using NameInfo
- mi::hashed_unique<
- mi::tag<hashed>,
- mi::const_mem_fun<Leaf, NameInfoConstPtr, &Leaf::getInfo>,
- NameInfoHash,
- NameInfoEqual
- >,
-
- mi::ordered_unique<
- mi::tag<ordered>,
- mi::const_mem_fun<Leaf, NameInfoConstPtr, &Leaf::getInfo>,
- NameInfoCompare
- >
- >
- >
-{
-};
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_STATE_LEAF_CONTAINER_H
diff --git a/nsync/sync-state.cc b/nsync/sync-state.cc
deleted file mode 100644
index 0fe12a6..0000000
--- a/nsync/sync-state.cc
+++ /dev/null
@@ -1,169 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-state.h"
-#include "sync-diff-leaf.h"
-#include "sync-std-name-info.h"
-
-#include <boost/assert.hpp>
-#include <boost/foreach.hpp>
-#include <boost/throw_exception.hpp>
-#include <boost/lexical_cast.hpp>
-
-typedef boost::error_info<struct tag_errmsg, std::string> info_str;
-
-using namespace Sync::Error;
-using boost::lexical_cast;
-
-namespace Sync {
-
-/*
-std::ostream &
-operator << (std::ostream &os, const State &state)
-{
- os << "<state>"; DEBUG_ENDL;
-
- BOOST_FOREACH (shared_ptr<const Leaf> leaf, state.getLeaves ().get<ordered> ())
- {
- shared_ptr<const DiffLeaf> diffLeaf = dynamic_pointer_cast<const DiffLeaf> (leaf);
- if (diffLeaf != 0)
- {
- os << "<item action=\"" << diffLeaf->getOperation () << "\">"; DEBUG_ENDL;
- }
- else
- {
- os << "<item>"; DEBUG_ENDL;
- }
- os << "<name>" << *leaf->getInfo () << "</name>"; DEBUG_ENDL;
- if (diffLeaf == 0 || (diffLeaf != 0 && diffLeaf->getOperation () == UPDATE))
- {
- os << "<seq>" << leaf->getSeq () << "</seq>"; DEBUG_ENDL;
- }
- os << "</item>"; DEBUG_ENDL;
- }
- os << "</state>";
-}
-*/
-
-SyncStateMsg &
-operator << (SyncStateMsg &ossm, const State &state)
-{
- BOOST_FOREACH (shared_ptr<const Leaf> leaf, state.getLeaves ().get<ordered> ())
- {
- SyncState *oss = ossm.add_ss();
- shared_ptr<const DiffLeaf> diffLeaf = dynamic_pointer_cast<const DiffLeaf> (leaf);
- if (diffLeaf != 0 && diffLeaf->getOperation() != UPDATE)
- {
- oss->set_type(SyncState::DELETE);
- }
- else
- {
- oss->set_type(SyncState::UPDATE);
- }
-
- std::ostringstream os;
- os << *leaf->getInfo();
- oss->set_name(os.str());
-
- if (diffLeaf == 0 || (diffLeaf != 0 && diffLeaf->getOperation () == UPDATE))
- {
- SyncState::SeqNo *seqNo = oss->mutable_seqno();
- seqNo->set_session(leaf->getSeq().getSession());
- seqNo->set_seq(leaf->getSeq().getSeq());
- }
- }
- return ossm;
-}
-
-/*
-std::istream &
-operator >> (std::istream &in, State &state)
-{
- TiXmlDocument doc;
- in >> doc;
-
- if (doc.RootElement() == 0)
- BOOST_THROW_EXCEPTION (SyncXmlDecodingFailure () << info_str ("Empty XML"));
-
- for (TiXmlElement *iterator = doc.RootElement()->FirstChildElement ("item");
- iterator != 0;
- iterator = iterator->NextSiblingElement("item"))
- {
- TiXmlElement *name = iterator->FirstChildElement ("name");
- if (name == 0 || name->GetText() == 0)
- BOOST_THROW_EXCEPTION (SyncXmlDecodingFailure () << info_str ("<name> element is missing"));
-
- NameInfoConstPtr info = StdNameInfo::FindOrCreate (name->GetText());
-
- if (iterator->Attribute("action") == 0 || strcmp(iterator->Attribute("action"), "update") == 0)
- {
- TiXmlElement *seq = iterator->FirstChildElement ("seq");
- if (seq == 0)
- BOOST_THROW_EXCEPTION (SyncXmlDecodingFailure () << info_str ("<seq> element is missing"));
-
- TiXmlElement *session = seq->FirstChildElement ("session");
- TiXmlElement *seqno = seq->FirstChildElement ("seqno");
-
- if (session == 0 || session->GetText() == 0)
- BOOST_THROW_EXCEPTION (SyncXmlDecodingFailure () << info_str ("<session> element is missing"));
- if (seqno == 0 || seqno->GetText() == 0)
- BOOST_THROW_EXCEPTION (SyncXmlDecodingFailure () << info_str ("<seqno> element is missing"));
-
- state.update (info, SeqNo (
- lexical_cast<uint32_t> (session->GetText()),
- lexical_cast<uint32_t> (seqno->GetText())
- ));
- }
- else
- {
- state.remove (info);
- }
- }
-
- return in;
-}
-*/
-
-SyncStateMsg &
-operator >> (SyncStateMsg &issm, State &state)
-{
- int n = issm.ss_size();
- for (int i = 0; i < n; i++)
- {
- const SyncState &ss = issm.ss(i);
- NameInfoConstPtr info = StdNameInfo::FindOrCreate (ss.name());
- if (ss.type() == SyncState::UPDATE)
- {
- uint64_t session = lexical_cast<uint64_t>(ss.seqno().session());
- uint64_t seq = lexical_cast<uint64_t>(ss.seqno().seq());
- SeqNo seqNo(session, seq);
- state.update(info, seqNo);
- }
- else
- {
- state.remove(info);
- }
- }
- return issm;
-}
-
-}
diff --git a/nsync/sync-state.h b/nsync/sync-state.h
deleted file mode 100644
index 520150a..0000000
--- a/nsync/sync-state.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_STATE_H
-#define NLSR_NSYNC_SYNC_STATE_H
-
-#include "sync-state-leaf-container.h"
-#include <boost/exception/all.hpp>
-#include "sync-state.pb.h"
-
-/**
- * \defgroup sync SYNC protocol
- *
- * Implementation of SYNC protocol
- */
-namespace Sync {
-
-/**
- * \ingroup sync
- * @brief this prefix will be used for the dummy node which increases its sequence number whenever
- * a remove operation happens; this is to prevent the reversion of root digest when we prune
- * a branch, i.e. help the root digest to be forward only
- * No corresponding data msg would be published and no attempt would be made to retrieve the
- * data msg
- */
-const std::string forwarderPrefix = "/d0n0t18ak/t0ps8cr8t";
-
-class State;
-typedef shared_ptr<State> StatePtr;
-typedef shared_ptr<State> StateConstPtr;
-
-/**
- * \ingroup sync
- * @brief Container for state leaves and definition of the abstract interface to work with State objects
- */
-class State
-{
-public:
- virtual ~State () { };
-
- /**
- * @brief Add or update leaf to the state tree
- *
- * @param info name of the leaf
- * @param seq sequence number of the leaf
- */
- virtual tuple<bool/*inserted*/, bool/*updated*/, SeqNo/*oldSeqNo*/>
- update (NameInfoConstPtr info, const SeqNo &seq) = 0;
-
- /**
- * @brief Remove leaf from the state tree
- * @param info name of the leaf
- */
- virtual bool
- remove (NameInfoConstPtr info) = 0;
-
- /**
- * @brief Get state leaves
- */
- const LeafContainer &
- getLeaves () const
- { return m_leaves; }
-
-protected:
- LeafContainer m_leaves;
-};
-
-
-/**
- * @brief Formats a protobuf SyncStateMsg msg
- * @param oss output SyncStateMsg msg
- * @param state state
- * @returns output SyncStateMsg msg
- */
-SyncStateMsg &
-operator << (SyncStateMsg &ossm, const State &state);
-
-
-/**
- * @brief Parse a protobuf SyncStateMsg msg
- * @param iss input SyncStateMsg msg
- * @param state state
- * @returns SyncStateMsg msg
- */
-SyncStateMsg &
-operator >> (SyncStateMsg &issm, State &state);
-
-namespace Error {
-/**
- * @brief Will be thrown when data cannot be properly decoded to SyncStateMsg
- */
-struct SyncStateMsgDecodingFailure : virtual boost::exception, virtual std::exception { };
-}
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_STATE_H
diff --git a/nsync/sync-state.proto b/nsync/sync-state.proto
deleted file mode 100644
index 7cc6b18..0000000
--- a/nsync/sync-state.proto
+++ /dev/null
@@ -1,24 +0,0 @@
-package Sync;
-
-message SyncState
-{
- required string name = 1;
- enum ActionType
- {
- UPDATE = 0;
- DELETE = 1;
- OTHER = 2;
- }
- required ActionType type = 2;
- message SeqNo
- {
- required uint64 seq = 1;
- required uint64 session = 2;
- }
- optional SeqNo seqno = 3;
-}
-
-message SyncStateMsg
-{
- repeated SyncState ss = 1;
-}
diff --git a/nsync/sync-std-name-info.cc b/nsync/sync-std-name-info.cc
deleted file mode 100644
index 9f0fa0d..0000000
--- a/nsync/sync-std-name-info.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "sync-std-name-info.h"
-
-namespace Sync {
-
-
-NameInfoConstPtr
-StdNameInfo::FindOrCreate (const std::string &key)
-{
- // std::cout << "FindOrCreate: " << m_names.size () << "\n";
-
- NameInfoConstPtr ret;
-
- NameMap::iterator item = m_names.find (key);
- if (item != m_names.end ())
- {
- ret = item->second.lock ();
- BOOST_ASSERT (ret != 0);
- }
- else
- {
- ret = NameInfoPtr (new StdNameInfo (key));
- weak_ptr<const NameInfo> value (ret);
- std::pair<NameMap::iterator,bool> inserted =
- m_names.insert (make_pair (key, value));
-
- BOOST_ASSERT (inserted.second); // previous call has to insert value
- item = inserted.first;
- }
-
- return ret;
-}
-
-StdNameInfo::StdNameInfo (const std::string &name)
- : m_name (name)
-{
- m_id = m_ids ++; // set ID for a newly inserted element
- m_digest << name;
- m_digest.finalize ();
-
- // std::cout << "StdNameInfo: " << name << " = " << m_id << "\n";
-}
-
-StdNameInfo::~StdNameInfo ()
-{
- // cout << "Destructor for " << m_name << "\n";
- m_names.erase (toString ());
-}
-
-std::string
-StdNameInfo::toString () const
-{
- return m_name;
-}
-
-bool
-StdNameInfo::operator == (const NameInfo &info) const
-{
- return m_name == dynamic_cast<const StdNameInfo&> (info).m_name;
-}
-
-bool
-StdNameInfo::operator < (const NameInfo &info) const
-{
- return m_name < dynamic_cast<const StdNameInfo&> (info).m_name;
-}
-
-} // Sync
diff --git a/nsync/sync-std-name-info.h b/nsync/sync-std-name-info.h
deleted file mode 100644
index 3726645..0000000
--- a/nsync/sync-std-name-info.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NLSR_NSYNC_SYNC_STD_NAME_INFO_H
-#define NLSR_NSYNC_SYNC_STD_NAME_INFO_H
-
-#include "sync-name-info.h"
-#include <string>
-
-namespace Sync {
-
-class StdNameInfo : public NameInfo
-{
-public:
- /**
- * @brief Lookup existing or create new NameInfo object
- * @param name routable prefix
- */
- static NameInfoConstPtr
- FindOrCreate (const std::string &name);
-
- /**
- * @brief Destructor which will clean up m_names structure
- */
- virtual ~StdNameInfo ();
-
- // from NameInfo
- virtual bool
- operator == (const NameInfo &info) const;
-
- virtual bool
- operator < (const NameInfo &info) const;
-
- virtual std::string
- toString () const;
-
-private:
- // implementing a singleton pattern.
- /**
- * @brief Disabled default constructor. NameInfo object should be created through FindOrCreate static call.
- */
-
- /**
- * @brief Disabled default
- */
- StdNameInfo () {}
- StdNameInfo& operator = (const StdNameInfo &info) { (void)info; return *this; }
- StdNameInfo (const std::string &name);
-
- std::string m_name;
-};
-
-} // Sync
-
-#endif // NLSR_NSYNC_SYNC_STD_NAME_INFO_H
diff --git a/src/communication/sync-logic-handler.cpp b/src/communication/sync-logic-handler.cpp
index 0e40809..09d5c27 100644
--- a/src/communication/sync-logic-handler.cpp
+++ b/src/communication/sync-logic-handler.cpp
@@ -156,22 +156,19 @@
// of the object
std::shared_ptr<ndn::Face> facePtr(&m_syncFace, NullDeleter<ndn::Face>());
- m_syncSocket = std::make_shared<Sync::SyncSocket>(m_syncPrefix, m_validator, facePtr,
- std::bind(&SyncLogicHandler::onNsyncUpdate,
- this, _1, _2),
- std::bind(&SyncLogicHandler::onNsyncRemoval,
- this, _1));
+ m_syncSocket = std::make_shared<chronosync::Socket>(m_syncPrefix, m_updatePrefix, *facePtr,
+ bind(&SyncLogicHandler::onNsyncUpdate, this, _1));
}
void
-SyncLogicHandler::onNsyncUpdate(const vector<Sync::MissingDataInfo>& v, Sync::SyncSocket* socket)
+SyncLogicHandler::onNsyncUpdate(const vector<chronosync::MissingDataInfo>& v)
{
_LOG_DEBUG("Received Nsync update event");
for (size_t i = 0; i < v.size(); i++){
- _LOG_DEBUG("Update Name: " << v[i].prefix << " Seq no: " << v[i].high.getSeq());
+ _LOG_DEBUG("Update Name: " << v[i].session.getPrefix(-1).toUri() << " Seq no: " << v[i].high);
- SyncUpdate update(v[i].prefix, v[i].high.getSeq());
+ SyncUpdate update(v[i].session.getPrefix(-1), v[i].high);
processUpdateFromSync(update);
}
@@ -299,7 +296,8 @@
ndn::Name updateName(updatePrefix);
string data("NoData");
- m_syncSocket->publishData(updateName.toUri(), 0, data.c_str(), data.size(), 1000, seqNo);
+ m_syncSocket->publishData(reinterpret_cast<const uint8_t*>(data.c_str()), data.size(),
+ ndn::time::milliseconds(1000), seqNo, updateName);
}
} // namespace nlsr
diff --git a/src/communication/sync-logic-handler.hpp b/src/communication/sync-logic-handler.hpp
index 5e0e6a8..c8e143e 100644
--- a/src/communication/sync-logic-handler.hpp
+++ b/src/communication/sync-logic-handler.hpp
@@ -24,7 +24,7 @@
#include <ndn-cxx/face.hpp>
#include <ndn-cxx/security/validator-null.hpp>
-#include <nsync/sync-socket.h>
+#include <ChronoSync/socket.hpp>
#include <iostream>
#include <unistd.h>
@@ -60,10 +60,9 @@
/*! \brief Simple wrapper function to handle updates from Sync.
\param v The information that Sync has acquired.
- \param socket The socket that Sync is using to synchronize updates.
*/
void
- onNsyncUpdate(const std::vector<Sync::MissingDataInfo>& v, Sync::SyncSocket* socket);
+ onNsyncUpdate(const std::vector<chronosync::MissingDataInfo>& v);
void
onNsyncRemoval(const std::string& prefix);
@@ -93,7 +92,7 @@
private:
std::shared_ptr<ndn::ValidatorNull> m_validator;
ndn::Face& m_syncFace;
- std::shared_ptr<Sync::SyncSocket> m_syncSocket;
+ std::shared_ptr<chronosync::Socket> m_syncSocket;
ndn::Name m_syncPrefix;
private:
diff --git a/src/conf-file-processor.hpp b/src/conf-file-processor.hpp
index 2a32cee..d6cdcbe 100644
--- a/src/conf-file-processor.hpp
+++ b/src/conf-file-processor.hpp
@@ -16,11 +16,8 @@
*
* 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>
- * \author Minsheng Zhang <mzhang4@memphis.edu>
- *
**/
+
#ifndef NLSR_CONF_FILE_PROCESSOR_HPP
#define NLSR_CONF_FILE_PROCESSOR_HPP
diff --git a/src/nlsr-runner.cpp b/src/nlsr-runner.cpp
index 100cf72..d5bf709 100644
--- a/src/nlsr-runner.cpp
+++ b/src/nlsr-runner.cpp
@@ -43,7 +43,7 @@
ConfFileProcessor configProcessor(m_nlsr, m_nlsr.getConfFileName());
if (!configProcessor.processConfFile()) {
- throw Error("Error in configuration file processing! Exiting from NLSR");
+ BOOST_THROW_EXCEPTION(Error("Error in configuration file processing! Exiting from NLSR"));
}
if (m_nlsr.getConfParameter().isLog4CxxConfAvailable()) {
@@ -53,16 +53,16 @@
INIT_LOGGERS(m_nlsr.getConfParameter().getLogDir(), m_nlsr.getConfParameter().getLogLevel());
}
- m_nlsr.initialize();
-
if (m_nlsr.getIsSetDaemonProcess()) {
m_nlsr.daemonize();
}
+ m_nlsr.initialize();
+
try {
m_nlsr.startEventLoop();
}
- catch (std::exception& e) {
+ catch (const std::exception& e) {
_LOG_FATAL("ERROR: " << e.what());
std::cerr << "ERROR: " << e.what() << std::endl;
diff --git a/tests-integrated/nsync/test-socket.cc.tmp b/tests-integrated/nsync/test-socket.cc.tmp
deleted file mode 100644
index 60a87f3..0000000
--- a/tests-integrated/nsync/test-socket.cc.tmp
+++ /dev/null
@@ -1,399 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include <boost/test/unit_test.hpp>
-#include <boost/test/output_test_stream.hpp>
-using boost::test_tools::output_test_stream;
-
-#include <boost/make_shared.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-
-#include "sync-logging.h"
-#include "sync-socket.h"
-#include <ndn-cpp-dev/security/validator-null.hpp>
-
-extern "C" {
-#include <unistd.h>
-}
-
-using namespace Sync;
-using namespace std;
-using namespace boost;
-
-INIT_LOGGER ("Test.AppSocket");
-
-#define PRINT
-//std::cout << "Line: " << __LINE__ << std::endl;
-
-class TestSocketApp {
-public:
- TestSocketApp()
- : sum(0)
- {}
-
- map<ndn::Name, string> data;
- void set(const ndn::shared_ptr<const ndn::Data>& dataPacket) {
- // _LOG_FUNCTION (this << ", " << str1);
- ndn::Name dataName(dataPacket->getName());
- string str2(reinterpret_cast<const char*>(dataPacket->getContent().value()), dataPacket->getContent().value_size());
- data.insert(make_pair(dataName, str2));
- // cout << str1 << ", " << str2 << endl;
- }
-
- void set(ndn::Name name, const char * buf, int len) {
- string str2(buf, len);
- data.insert(make_pair(name, str2));
- }
-
- void setNum(const ndn::shared_ptr<const ndn::Data>& dataPacket) {
- int n = dataPacket->getContent().value_size() / 4;
- uint32_t *numbers = new uint32_t [n];
- memcpy(numbers, dataPacket->getContent().value(), dataPacket->getContent().value_size());
- for (int i = 0; i < n; i++) {
- sum += numbers[i];
- }
- delete numbers;
-
- }
-
- void setNum(ndn::Name name, const char * buf, int len) {
- int n = len / 4;
- int *numbers = new int [n];
- memcpy(numbers, buf, len);
- for (int i = 0; i < n; i++) {
- sum += numbers[i];
- }
- delete numbers;
- }
-
- uint32_t sum;
-
- void fetchAll(const vector<MissingDataInfo> &v, SyncSocket *socket) {
- int n = v.size();
-
- PRINT
-
- for (int i = 0; i < n; i++) {
- for(SeqNo s = v[i].low; s <= v[i].high; ++s) {
- //PRINT
- socket->fetchData(v[i].prefix, s, bind(&TestSocketApp::set, this, _1));
- }
- }
- }
-
- void fetchNumbers(const vector<MissingDataInfo> &v, SyncSocket *socket) {
- int n = v.size();
-
- PRINT
-
- // std::cout << "In fetchNumbers. size of v is: " << n << std::endl;
- for (int i = 0; i < n; i++) {
- // std::cout << "In fetchNumbers. v[i].low is (" <<v[i].low.getSession() <<", " << v[i].low.getSeq() << ") v[i].high is ("<<v[i].high.getSession() <<", " <<v[i].high.getSeq()<<")" << std::endl;
- for(SeqNo s = v[i].low; s <= v[i].high; ++s) {
- PRINT
- socket->fetchData(v[i].prefix, s, bind(&TestSocketApp::setNum, this, _1));
- }
- }
- }
-
- void pass(const string &prefix) {
- }
-
- string toString(){
- map<ndn::Name, string>::iterator it = data.begin();
- string str = "\n";
- for (; it != data.end(); ++it){
- str += "<";
- str += it->first.toUri();
- str += "|";
- str += it->second;
- str += ">";
- str += "\n";
- }
-
- return str;
- }
-
-};
-
-class TestSet1{
-public:
- TestSet1(ndn::shared_ptr<boost::asio::io_service> ioService)
- : m_validator(new ndn::ValidatorNull())
- , m_face1(new ndn::Face(ioService))
- , m_face2(new ndn::Face(ioService))
- , m_face3(new ndn::Face(ioService))
- , m_p1("/irl.cs.ucla.edu")
- , m_p2("/yakshi.org")
- , m_p3("/google.com")
- , m_syncPrefix("/let/us/sync")
- {}
-
- void
- createSyncSocket1()
- {
- _LOG_DEBUG ("s1");
- m_s1 = make_shared<SyncSocket>(m_syncPrefix, m_validator, m_face1,
- bind(&TestSocketApp::fetchAll, &m_a1, _1, _2),
- bind(&TestSocketApp::pass, &m_a1, _1));
- }
-
- void
- createSyncSocket2()
- {
- _LOG_DEBUG ("s2");
- m_s2 = make_shared<SyncSocket>(m_syncPrefix, m_validator, m_face2,
- bind(&TestSocketApp::fetchAll, &m_a2, _1, _2),
- bind(&TestSocketApp::pass, &m_a2, _1));
- }
-
- void
- createSyncSocket3()
- {
- _LOG_DEBUG ("s3");
- m_s3 = make_shared<SyncSocket>(m_syncPrefix, m_validator, m_face3,
- bind(&TestSocketApp::fetchAll, &m_a3, _1, _2),
- bind(&TestSocketApp::pass, &m_a3, _1));
- }
-
- void
- publishSocket1(uint32_t session, string data)
- {
- _LOG_DEBUG ("s1 publish");
- m_s1->publishData (m_p1, session, data.c_str(), data.size(), 1000);
- }
-
- void
- publishSocket2(uint32_t session, string data)
- {
- _LOG_DEBUG ("s2 publish");
- m_s2->publishData (m_p2, session, data.c_str(), data.size(), 1000);
- }
-
- void
- publishSocket3(uint32_t session, string data)
- {
- _LOG_DEBUG ("s3 publish");
- m_s3->publishData (m_p3, session, data.c_str(), data.size(), 1000);
- }
-
- void
- setSocket1(string suffix, string data)
- {
- _LOG_DEBUG ("a1 set");
- ndn::Name name = m_p1;
- name.append(suffix);
- m_a1.set (name, data.c_str(), data.size());
- }
-
- void
- setSocket2(string suffix, string data)
- {
- _LOG_DEBUG ("a2 set");
- ndn::Name name = m_p2;
- name.append(suffix);
- m_a2.set (name, data.c_str(), data.size());
- }
-
- void
- setSocket3(string suffix, string data)
- {
- _LOG_DEBUG ("a3 set");
- ndn::Name name = m_p3;
- name.append(suffix);
- m_a3.set (name, data.c_str(), data.size());
- }
-
- void
- check(int round)
- {
- BOOST_CHECK_EQUAL(m_a1.toString(), m_a2.toString());
- BOOST_CHECK_EQUAL(m_a2.toString(), m_a3.toString());
- }
-
- void
- done()
- {
- m_s1.reset();
- m_s2.reset();
- m_s3.reset();
- }
-
-
- TestSocketApp m_a1, m_a2, m_a3;
- ndn::shared_ptr<ndn::ValidatorNull> m_validator;
- ndn::shared_ptr<ndn::Face> m_face1, m_face2, m_face3;
- ndn::Name m_p1, m_p2, m_p3;
- ndn::shared_ptr<SyncSocket> m_s1, m_s2, m_s3;
- ndn::Name m_syncPrefix;
-};
-
-class TestSet2{
-public:
- TestSet2(ndn::shared_ptr<boost::asio::io_service> ioService)
- : m_validator(new ndn::ValidatorNull())
- , m_face1(new ndn::Face(ioService))
- , m_face2(new ndn::Face(ioService))
- , m_p1("/xiaonei.com")
- , m_p2("/mitbbs.com")
- , m_syncPrefix("/this/is/the/prefix")
- {}
-
- void
- createSyncSocket1()
- {
- _LOG_DEBUG ("s1");
- m_s1 = make_shared<SyncSocket>(m_syncPrefix, m_validator, m_face1,
- bind(&TestSocketApp::fetchNumbers, &m_a1, _1, _2),
- bind(&TestSocketApp::pass, &m_a1, _1));
- }
-
- void
- createSyncSocket2()
- {
- _LOG_DEBUG ("s2");
- m_s2 = make_shared<SyncSocket>(m_syncPrefix, m_validator, m_face2,
- bind(&TestSocketApp::fetchNumbers, &m_a2, _1, _2),
- bind(&TestSocketApp::pass, &m_a2, _1));
- }
-
- void
- publishSocket1(uint32_t session, string data)
- {
- _LOG_DEBUG ("s1 publish");
- m_s1->publishData (m_p1, session, data.c_str(), data.size(), 1000);
- }
-
- void
- publishSocket2(uint32_t session, string data)
- {
- _LOG_DEBUG ("s2 publish");
- m_s2->publishData (m_p2, session, data.c_str(), data.size(), 1000);
- }
-
- void
- setSocket1(const char* ptr, size_t size)
- {
- _LOG_DEBUG ("a1 setNum");
- m_a1.setNum (m_p1, ptr, size);
- }
-
- void
- setSocket2(const char* ptr, size_t size)
- {
- _LOG_DEBUG ("a2 setNum");
- m_a2.setNum (m_p2, ptr, size);
- }
-
- void
- check(int num)
- {
- _LOG_DEBUG ("codnum " << num);
- _LOG_DEBUG ("a1 sum " << m_a1.sum);
- _LOG_DEBUG ("a2 sum " << m_a2.sum);
-
- BOOST_CHECK(m_a1.sum == m_a2.sum && m_a1.sum == num);
- }
-
- void
- done()
- {
- m_s1.reset();
- m_s2.reset();
- }
-
- TestSocketApp m_a1, m_a2;
- ndn::shared_ptr<ndn::ValidatorNull> m_validator;
- ndn::shared_ptr<ndn::Face> m_face1, m_face2;
- ndn::Name m_p1, m_p2;
- ndn::shared_ptr<SyncSocket> m_s1, m_s2;
- ndn::Name m_syncPrefix;
-};
-
-BOOST_AUTO_TEST_CASE (AppSocketTest1)
-{
- INIT_LOGGERS ();
-
- ndn::shared_ptr<boost::asio::io_service> ioService = ndn::make_shared<boost::asio::io_service>();
- ndn::Scheduler scheduler(*ioService);
- TestSet1 testSet1(ioService);
-
- scheduler.scheduleEvent(ndn::time::seconds(0.00), ndn::bind(&TestSet1::createSyncSocket1, &testSet1));
- scheduler.scheduleEvent(ndn::time::seconds(0.05), ndn::bind(&TestSet1::createSyncSocket2, &testSet1));
- scheduler.scheduleEvent(ndn::time::seconds(0.10), ndn::bind(&TestSet1::createSyncSocket3, &testSet1));
- string data0 = "Very funny Scotty, now beam down my clothes";
- scheduler.scheduleEvent(ndn::time::seconds(0.15), ndn::bind(&TestSet1::publishSocket1, &testSet1, 0, data0));
- scheduler.scheduleEvent(ndn::time::seconds(1.15), ndn::bind(&TestSet1::setSocket1, &testSet1, "/0/0", data0));
- scheduler.scheduleEvent(ndn::time::seconds(1.16), ndn::bind(&TestSet1::check, &testSet1, 1));
- string data1 = "Yes, give me that ketchup";
- string data2 = "Don't look conspicuous, it draws fire";
- scheduler.scheduleEvent(ndn::time::seconds(1.17), ndn::bind(&TestSet1::publishSocket1, &testSet1, 0, data1));
- scheduler.scheduleEvent(ndn::time::seconds(1.18), ndn::bind(&TestSet1::publishSocket1, &testSet1, 0, data2));
- scheduler.scheduleEvent(ndn::time::seconds(2.15), ndn::bind(&TestSet1::setSocket1, &testSet1, "/0/1", data1));
- scheduler.scheduleEvent(ndn::time::seconds(2.16), ndn::bind(&TestSet1::setSocket1, &testSet1, "/0/2", data2));
- scheduler.scheduleEvent(ndn::time::seconds(2.17), ndn::bind(&TestSet1::check, &testSet1, 2));
- string data3 = "You surf the Internet, I surf the real world";
- string data4 = "I got a fortune cookie once that said 'You like Chinese food'";
- string data5 = "Real men wear pink. Why? Because their wives make them";
- scheduler.scheduleEvent(ndn::time::seconds(3.18), ndn::bind(&TestSet1::publishSocket3, &testSet1, 0, data3));
- scheduler.scheduleEvent(ndn::time::seconds(3.20), ndn::bind(&TestSet1::publishSocket2, &testSet1, 0, data4));
- scheduler.scheduleEvent(ndn::time::seconds(3.21), ndn::bind(&TestSet1::publishSocket2, &testSet1, 0, data5));
- scheduler.scheduleEvent(ndn::time::seconds(4.21), ndn::bind(&TestSet1::setSocket3, &testSet1, "/0/0", data3));
- scheduler.scheduleEvent(ndn::time::seconds(4.22), ndn::bind(&TestSet1::setSocket2, &testSet1, "/0/0", data4));
- scheduler.scheduleEvent(ndn::time::seconds(4.23), ndn::bind(&TestSet1::setSocket2, &testSet1, "/0/1", data5));
- scheduler.scheduleEvent(ndn::time::seconds(4.30), ndn::bind(&TestSet1::check, &testSet1, 3));
- // not sure weither this is simultanous data generation from multiple sources
- _LOG_DEBUG ("Simultaneous publishing");
- string data6 = "Shakespeare says: 'Prose before hos.'";
- string data7 = "Pick good people, talent never wears out";
- scheduler.scheduleEvent(ndn::time::seconds(5.50), ndn::bind(&TestSet1::publishSocket1, &testSet1, 0, data6));
- scheduler.scheduleEvent(ndn::time::seconds(5.50), ndn::bind(&TestSet1::publishSocket2, &testSet1, 0, data7));
- scheduler.scheduleEvent(ndn::time::seconds(6.80), ndn::bind(&TestSet1::setSocket1, &testSet1, "/0/3", data6));
- scheduler.scheduleEvent(ndn::time::seconds(6.80), ndn::bind(&TestSet1::setSocket2, &testSet1, "/0/2", data7));
- scheduler.scheduleEvent(ndn::time::seconds(6.90), ndn::bind(&TestSet1::check, &testSet1, 4));
- scheduler.scheduleEvent(ndn::time::seconds(7.00), ndn::bind(&TestSet1::done, &testSet1));
-
- ioService->run();
-}
-
-BOOST_AUTO_TEST_CASE (AppSocketTest2)
-{
- ndn::shared_ptr<boost::asio::io_service> ioService = ndn::make_shared<boost::asio::io_service>();
- ndn::Scheduler scheduler(*ioService);
- TestSet2 testSet2(ioService);
-
- scheduler.scheduleEvent(ndn::time::seconds(0.00), ndn::bind(&TestSet2::createSyncSocket1, &testSet2));
- scheduler.scheduleEvent(ndn::time::seconds(0.05), ndn::bind(&TestSet2::createSyncSocket2, &testSet2));
- uint32_t num[5] = {0, 1, 2, 3, 4};
- string data0((const char *) num, sizeof(num));
- scheduler.scheduleEvent(ndn::time::seconds(0.10), ndn::bind(&TestSet2::publishSocket1, &testSet2, 0, data0));
- scheduler.scheduleEvent(ndn::time::seconds(0.15), ndn::bind(&TestSet2::setSocket1, &testSet2, (const char *) num, sizeof (num)));
- scheduler.scheduleEvent(ndn::time::seconds(1.00), ndn::bind(&TestSet2::check, &testSet2, 10));
- uint32_t newNum[5] = {9, 7, 2, 1, 1};
- string data1((const char *) newNum, sizeof(newNum));
- scheduler.scheduleEvent(ndn::time::seconds(1.10), ndn::bind(&TestSet2::publishSocket2, &testSet2, 0, data1));
- scheduler.scheduleEvent(ndn::time::seconds(1.15), ndn::bind(&TestSet2::setSocket2, &testSet2, (const char *) newNum, sizeof (newNum)));
- scheduler.scheduleEvent(ndn::time::seconds(2.00), ndn::bind(&TestSet2::check, &testSet2, 30));
- scheduler.scheduleEvent(ndn::time::seconds(7.00), ndn::bind(&TestSet2::done, &testSet2));
-
- ioService->run();
-}
diff --git a/tests-integrated/nsync/test-sync-logic.cc.tmp b/tests-integrated/nsync/test-sync-logic.cc.tmp
deleted file mode 100644
index d2444e7..0000000
--- a/tests-integrated/nsync/test-sync-logic.cc.tmp
+++ /dev/null
@@ -1,179 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include <boost/test/unit_test.hpp>
-#include <boost/test/output_test_stream.hpp>
-#include <map>
-using boost::test_tools::output_test_stream;
-
-#include <boost/make_shared.hpp>
-
-#include <ndn-cpp-dev/security/validator-null.hpp>
-#include "sync-logic.h"
-#include "sync-seq-no.h"
-
-using namespace std;
-using namespace boost;
-using namespace Sync;
-
-struct Handler
-{
- string instance;
-
- Handler (const string &_instance)
- : instance (_instance)
- {
- }
-
- void wrapper (const vector<MissingDataInfo> &v) {
- int n = v.size();
- for (int i = 0; i < n; i++) {
- onUpdate (v[i].prefix, v[i].high, v[i].low);
- }
- }
-
- void onUpdate (const string &p/*prefix*/, const SeqNo &seq/*newSeq*/, const SeqNo &oldSeq/*oldSeq*/)
- {
- m_map[p] = seq.getSeq ();
-
- // cout << instance << "\t";
- // if (!oldSeq.isValid ())
- // cout << "Inserted: " << p << " (" << seq << ")" << endl;
- // else
- // cout << "Updated: " << p << " ( " << oldSeq << ".." << seq << ")" << endl;
- }
-
- void onRemove (const string &p/*prefix*/)
- {
- // cout << instance << "\tRemoved: " << p << endl;
- m_map.erase (p);
- }
-
- map<string, uint32_t> m_map;
-};
-
-class TestCore
-{
-public:
- TestCore(ndn::shared_ptr<boost::asio::io_service> ioService)
- : m_ioService(ioService)
- {
- m_l[0] = 0;
- m_l[1] = 0;
-
- m_validator = ndn::make_shared<ndn::ValidatorNull>();
- }
-
- ~TestCore()
- {
- if(m_l[0] != 0)
- delete m_l[0];
-
- if(m_l[1] != 0)
- delete m_l[1];
- }
-
- void
- finish()
- {
- }
-
- void
- createSyncLogic(int index,
- ndn::shared_ptr<Handler> h)
- {
- m_faces[index] = ndn::make_shared<ndn::Face>(m_ioService);
- m_l[index] = new SyncLogic(ndn::Name("/bcast"),
- m_validator, m_faces[index],
- bind (&Handler::wrapper, &*h, _1),
- bind (&Handler::onRemove, &*h, _1));
- }
-
- void
- getOldDigestForOne()
- {
- m_oldDigest = m_l[0]->getRootDigest();
- }
-
- void
- getNewDigestForOne()
- {
- m_newDigest = m_l[0]->getRootDigest();
- }
-
- void
- addLocalNamesForOne(ndn::Name name, uint64_t session, uint64_t seq)
- {
- m_l[0]->addLocalNames(name, session, seq);
- }
-
- void
- removeForOne(ndn::Name name)
- {
- m_l[0]->remove(name);
- }
-
- void
- checkDigest()
- {
- BOOST_CHECK(m_oldDigest != m_newDigest);
- }
-
-
-public:
- ndn::shared_ptr<boost::asio::io_service> m_ioService;
- SyncLogic* m_l[2];
- ndn::shared_ptr<ndn::Face> m_faces[2];
- ndn::shared_ptr<ndn::ValidatorNull> m_validator;
- string m_oldDigest;
- string m_newDigest;
-};
-
-void
-checkMapSize(ndn::shared_ptr<Handler> h, int size)
-{ BOOST_CHECK_EQUAL (h->m_map.size (), size); }
-
-
-BOOST_AUTO_TEST_CASE (SyncLogicTest)
-{
- ndn::shared_ptr<boost::asio::io_service> ioService = ndn::make_shared<boost::asio::io_service>();
- ndn::Scheduler scheduler(*ioService);
- TestCore testCore(ioService);
-
- ndn::shared_ptr<Handler> h1 = ndn::make_shared<Handler>("1");
- ndn::shared_ptr<Handler> h2 = ndn::make_shared<Handler>("2");
-
- scheduler.scheduleEvent(ndn::time::seconds(0), ndn::bind(&TestCore::createSyncLogic, &testCore, 0, h1));
- scheduler.scheduleEvent(ndn::time::seconds(0.1), ndn::bind(&TestCore::getOldDigestForOne, &testCore));
- scheduler.scheduleEvent(ndn::time::seconds(0.2), ndn::bind(&TestCore::addLocalNamesForOne, &testCore, "/one", 1, 2));
- scheduler.scheduleEvent(ndn::time::seconds(0.3), ndn::bind(&checkMapSize, h1, 0));
- scheduler.scheduleEvent(ndn::time::seconds(0.4), ndn::bind(&TestCore::createSyncLogic, &testCore, 1, h2));
- scheduler.scheduleEvent(ndn::time::seconds(0.5), ndn::bind(&checkMapSize, h1, 0));
- scheduler.scheduleEvent(ndn::time::seconds(0.6), ndn::bind(&checkMapSize, h2, 1));
- scheduler.scheduleEvent(ndn::time::seconds(0.7), ndn::bind(&TestCore::removeForOne, &testCore, "/one"));
- scheduler.scheduleEvent(ndn::time::seconds(0.8), ndn::bind(&TestCore::getNewDigestForOne, &testCore));
- scheduler.scheduleEvent(ndn::time::seconds(0.9), ndn::bind(&TestCore::checkDigest, &testCore));
- scheduler.scheduleEvent(ndn::time::seconds(1.0), ndn::bind(&TestCore::finish, &testCore));
-
- ioService->run();
-
-}
diff --git a/tests/nsync/test-digest.cc.tmp b/tests/nsync/test-digest.cc.tmp
deleted file mode 100644
index 4815919..0000000
--- a/tests/nsync/test-digest.cc.tmp
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include <boost/test/unit_test.hpp>
-#include <boost/test/output_test_stream.hpp>
-using boost::test_tools::output_test_stream;
-
-#include "sync-digest.h"
-#include <iostream>
-#include <sstream>
-
-using namespace Sync;
-using namespace Sync::Error;
-using namespace std;
-using namespace boost;
-
-BOOST_AUTO_TEST_SUITE(DigestTests)
-
-BOOST_AUTO_TEST_CASE (BasicTest)
-{
- Digest d0;
- BOOST_REQUIRE (d0.empty ());
-}
-
-BOOST_AUTO_TEST_CASE (DigestGenerationTest)
-{
- Digest d1;
- BOOST_CHECK_NO_THROW (d1 << "1\n");
-
- // without explicit finalizing, Digest will not be complete and printing out will cause assert
- BOOST_CHECK (d1.empty ());
-
- // fix hash
- d1.finalize ();
-
- BOOST_CHECK_NO_THROW (d1.getHash ());
- BOOST_CHECK (!d1.empty ());
- BOOST_CHECK (d1 == d1);
-
- BOOST_CHECK_THROW (d1 << "2", DigestCalculationError);
-
- output_test_stream output;
- BOOST_CHECK_NO_THROW (output << d1);
- // BOOST_CHECK (output.check_length (40, false) );
- // BOOST_CHECK (output.is_equal ("e5fa44f2b31c1fb553b6021e7360d07d5d91ff5e", true)); // for sha1
- BOOST_CHECK (output.check_length (64, false) );
- BOOST_CHECK (output.is_equal ("4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865", true)); // for sha256
-}
-
-BOOST_AUTO_TEST_CASE (DigestComparison)
-{
- Digest d1;
- BOOST_CHECK_NO_THROW (d1 << "1\n");
- // BOOST_CHECK_THROW (d1 == d1, DigestCalculationError);
- BOOST_CHECK_NO_THROW (d1.finalize ());
- BOOST_CHECK (d1 == d1);
-
- Digest d2;
- BOOST_CHECK_NO_THROW (d2 << "2\n");
- BOOST_CHECK_NO_THROW (d2.finalize ());
- BOOST_CHECK (d1 != d2);
-
- Digest d3;
- // istringstream is (string ("e5fa44f2b31c1fb553b6021e7360d07d5d91ff5e")); // real sha-1 for "1\n"
- istringstream is (string ("4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865")); // real sha256 for "1\n"
- BOOST_CHECK_NO_THROW (is >> d3);
- BOOST_CHECK (!d3.empty ());
- BOOST_CHECK (d3 == d1);
- BOOST_CHECK (d3 != d2);
-
- istringstream is2 (string ("25fa44f2b31c1fb553b6021e7360d07d5d91ff5e")); // some fake hash
- BOOST_CHECK_THROW (is2 >> d3, DigestCalculationError); // >> can be used only once
-
- Digest d4;
- BOOST_CHECK_THROW (is2 >> d4, DigestCalculationError); // is2 is now empty. empty >> is not allowed
-
- istringstream is3 (string ("25fa44f2b31c1fb553b6021e7360d07d5d91ff5e")); // some fake hash
- BOOST_CHECK_NO_THROW (is3 >> d4);
-
- BOOST_CHECK (d4 != d1);
- BOOST_CHECK (d4 != d2);
- BOOST_CHECK (d4 != d3);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/tests/nsync/test-leaf.cc.tmp b/tests/nsync/test-leaf.cc.tmp
deleted file mode 100644
index 49afcc5..0000000
--- a/tests/nsync/test-leaf.cc.tmp
+++ /dev/null
@@ -1,108 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include <boost/test/unit_test.hpp>
-#include <boost/test/output_test_stream.hpp>
-using boost::test_tools::output_test_stream;
-
-#include <boost/make_shared.hpp>
-
-#include "sync-full-leaf.h"
-#include "sync-diff-leaf.h"
-#include "sync-std-name-info.h"
-
-using namespace Sync;
-using namespace std;
-using namespace boost;
-
-BOOST_AUTO_TEST_SUITE(LeafTests)
-
-BOOST_AUTO_TEST_CASE (LeafBase)
-{
- NameInfoConstPtr name = StdNameInfo::FindOrCreate ("/test/name");
- BOOST_CHECK (name != 0);
-
- // find the same name
- BOOST_CHECK (name.get () == StdNameInfo::FindOrCreate ("/test/name").get ());
- BOOST_CHECK_EQUAL (name.use_count (), 1);
-
- BOOST_CHECK_NO_THROW (DiffLeaf x (name, SeqNo (12)));
- BOOST_CHECK_EQUAL (name.use_count (), 1);
-
- BOOST_CHECK_NO_THROW (DiffLeaf x (name));
- BOOST_CHECK_EQUAL (name.use_count (), 1);
-
- DiffLeaf updateLeaf (name, SeqNo (12));
- BOOST_CHECK_EQUAL (name.use_count (), 2);
-
- DiffLeaf removeLeaf (name);
- BOOST_CHECK_EQUAL (name.use_count (), 3);
-
- BOOST_CHECK_EQUAL (updateLeaf.getOperation (), UPDATE);
- BOOST_CHECK_EQUAL (updateLeaf.getSeq ().getSession (), 0);
- BOOST_CHECK_EQUAL (updateLeaf.getSeq ().getSeq (), 12);
-
- BOOST_CHECK_EQUAL (removeLeaf.getOperation (), REMOVE);
- BOOST_CHECK_EQUAL (removeLeaf.getSeq ().getSession (), 0);
- BOOST_CHECK_EQUAL (removeLeaf.getSeq ().getSeq (), 0);
-
- BOOST_REQUIRE_NO_THROW (FullLeaf x (name, SeqNo (12)));
- FullLeaf fullLeaf (name, SeqNo (12));
- BOOST_CHECK_EQUAL (name.use_count (), 4);
-}
-
-BOOST_AUTO_TEST_CASE (LeafDigest)
-{
- BOOST_CHECK_EQUAL (StdNameInfo::FindOrCreate ("/test/name").use_count (), 1);
- NameInfoConstPtr name = StdNameInfo::FindOrCreate ("/test/name");
- FullLeaf fullLeaf (name, SeqNo (12));
-
- // fullLeafDigest = hash ( hash(name), hash (session, seqNo) )
-
- // Digest manualDigest;
-
- // Digest manualNameDigest;
- // manualNameDigest << "/test/name";
- // manualNameDigest.finalize ();
-
- // Digest manualSeqNoDigest;
- // manualSeqNoDigest << 0 << 13;
- // manualSeqNoDigest.finalize ();
-
- // manualDigest << manualNameDigest << manualSeqNoDigest;
- // manualDigest.finalize ();
-
- // cout << manualDigest << "\n\n";
-
- output_test_stream output;
- output << fullLeaf.getDigest ();
- // BOOST_CHECK (output.is_equal ("991f8cf6262dfe0f519c63f6e9b92fe69e741a9b", true)); // for sha1
- BOOST_CHECK (output.is_equal ("526d63e6e1f05f97502fd500a1729c4907f3841483ae4561b7e6307c40188f35", true)); // for sha256
-
- fullLeaf.setSeq (SeqNo (13));
- output << fullLeaf.getDigest ();
- BOOST_CHECK (!output.is_equal ("991f8cf6262dfe0f519c63f6e9b92fe69e741a9b", false));
- // BOOST_CHECK (output.is_equal ("585a8687ab41d5c29f86e5906c8f188ddca816b3", true)); // for sha1
- BOOST_CHECK (output.is_equal ("39fefe65b3e1021776c07d3a9a3023c6c7cdf12724ee7f3a98b813b22f46d5ec", true)); // for sha256
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/tests/nsync/test-state.cc.outdated b/tests/nsync/test-state.cc.outdated
deleted file mode 100644
index 35fc79c..0000000
--- a/tests/nsync/test-state.cc.outdated
+++ /dev/null
@@ -1,294 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * 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: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * Chaoyi Bian <bcy@pku.edu.cn>
- * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#define BOOST_TEST_DYN_LINK 1
-#define BOOST_TEST_NO_MAIN 1
-// #define BOOST_TEST_MODULE StateTests
-#include <boost/test/unit_test.hpp>
-#include <boost/test/output_test_stream.hpp>
-using boost::test_tools::output_test_stream;
-
-#include <boost/make_shared.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-
-#include "sync-std-name-info.h"
-#include "sync-full-state.h"
-#include "sync-diff-state.h"
-
-using namespace Sync;
-using namespace std;
-using namespace boost;
-
-BOOST_AUTO_TEST_SUITE(StateTests)
-
-BOOST_AUTO_TEST_CASE (FullStateTest)
-{
- BOOST_CHECK_NO_THROW (FullState ());
- FullState state;
- BOOST_CHECK_EQUAL (state.getLeaves ().size (), 0);
-
- output_test_stream output;
- output << state.getTimeFromLastUpdate ();
- BOOST_CHECK (output.is_equal ("not-a-date-time", true));
-
- NameInfoConstPtr name = StdNameInfo::FindOrCreate ("/test/name");
- BOOST_CHECK_NO_THROW (state.update (name, SeqNo (12)));
- BOOST_CHECK_NO_THROW (state.update (name, SeqNo (12)));
- BOOST_CHECK_NO_THROW (state.update (name, SeqNo (12)));
- BOOST_CHECK_EQUAL (state.getLeaves ().size (), 1);
- BOOST_CHECK_EQUAL ((*state.getLeaves ().begin ())->getSeq ().getSeq (), 12);
-
- BOOST_CHECK_NO_THROW (state.update (name, SeqNo (13)));
- BOOST_CHECK_EQUAL ((*state.getLeaves ().begin ())->getSeq ().getSeq (), 13);
-
- BOOST_CHECK_NO_THROW (state.remove (name));
- BOOST_CHECK_EQUAL (state.getLeaves ().size (), 0);
-
- BOOST_CHECK_EQUAL (state.getTimeFromLastUpdate ().total_milliseconds (), 0);
-}
-
-BOOST_AUTO_TEST_CASE (DiffStateTest)
-{
- BOOST_CHECK_NO_THROW (DiffState ());
- DiffState state;
- BOOST_CHECK_EQUAL (state.getLeaves ().size (), 0);
-
- NameInfoConstPtr name = StdNameInfo::FindOrCreate ("/test/name");
- BOOST_CHECK_NO_THROW (state.update (name, SeqNo (12)));
- BOOST_CHECK_NO_THROW (state.update (name, SeqNo (12)));
- BOOST_CHECK_NO_THROW (state.update (name, SeqNo (12)));
- BOOST_CHECK_EQUAL (state.getLeaves ().size (), 1);
- BOOST_CHECK_EQUAL ((*state.getLeaves ().begin ())->getSeq ().getSeq (), 12);
-
- BOOST_CHECK_NO_THROW (state.update (name, SeqNo (13)));
- BOOST_CHECK_EQUAL ((*state.getLeaves ().begin ())->getSeq ().getSeq (), 13);
-
- BOOST_CHECK_NO_THROW (state.remove (name));
- BOOST_CHECK_EQUAL (state.getLeaves ().size (), 1);
- BOOST_CHECK_EQUAL ((*state.getLeaves ().begin ())->getSeq ().getSeq (), 0);
-}
-
-BOOST_AUTO_TEST_CASE (FullStateDigestTest)
-{
- FullState state;
- BOOST_CHECK_EQUAL (state.getLeaves ().size (), 0);
-
- NameInfoConstPtr name3 = StdNameInfo::FindOrCreate ("3");
- NameInfoConstPtr name2 = StdNameInfo::FindOrCreate ("2");
- NameInfoConstPtr name1 = StdNameInfo::FindOrCreate ("1");
-
- state.update (name1, SeqNo (10));
- DigestConstPtr digest1 = state.getDigest ();
-
- state.update (name2, SeqNo (12));
- DigestConstPtr digest2 = state.getDigest ();
-
- BOOST_CHECK (digest1.get () != digest2.get ());
- BOOST_CHECK (!digest1->empty ());
- BOOST_CHECK (!digest2->empty ());
-
- state.update (name3, SeqNo (8));
- DigestConstPtr digest3 = state.getDigest ();
-
- BOOST_CHECK (digest1.get () != digest2.get ());
- BOOST_CHECK (digest2.get () != digest3.get ());
- BOOST_CHECK (digest1.get () != digest3.get ());
-
- BOOST_CHECK (*digest1 != *digest2);
- BOOST_CHECK (*digest2 != *digest3);
- BOOST_CHECK (*digest1 != *digest3);
-
- // removing elements. Digest should get reverted to digest1
- state.remove (name2);
- state.remove (name3);
- DigestConstPtr digest4 = state.getDigest ();
- BOOST_CHECK (*digest1 == *digest4);
-
- name2.reset (); // force destructor
- name3.reset (); // force destructor
- name3 = StdNameInfo::FindOrCreate ("3"); // this will enforce different (larger) hashing ID of name
- name2 = StdNameInfo::FindOrCreate ("2"); // this will enforce different (larger) hashing ID of name
-
- // adding in different order
- state.update (name3, SeqNo (8));
- state.update (name2, SeqNo (12));
- DigestConstPtr digest5 = state.getDigest ();
- BOOST_CHECK (*digest5 == *digest3);
-}
-
-BOOST_AUTO_TEST_CASE (FullStateXml)
-{
- FullState state;
-
- NameInfoConstPtr name3 = StdNameInfo::FindOrCreate ("3");
- NameInfoConstPtr name2 = StdNameInfo::FindOrCreate ("2");
- NameInfoConstPtr name1 = StdNameInfo::FindOrCreate ("1");
-
- state.update (name1, SeqNo (10));
- state.update (name2, SeqNo (12));
- state.update (name3, SeqNo (8));
-
- string xml1 = "<state>"
- "<item><name>1</name><seq><session>0</session><seqno>10</seqno></seq></item>"
- "<item><name>2</name><seq><session>0</session><seqno>12</seqno></seq></item>"
- "<item><name>3</name><seq><session>0</session><seqno>8</seqno></seq></item>"
- "</state>";
- {
- ostringstream os;
- os << state;
- string s = os.str ();
- // cout << s << endl;
- erase_all (s, "\n");
- BOOST_CHECK_EQUAL (s, xml1);
- }
-
- state.remove (name2);
- string xml2 = "<state>"
- "<item><name>1</name><seq><session>0</session><seqno>10</seqno></seq></item>"
- "<item><name>3</name><seq><session>0</session><seqno>8</seqno></seq></item>"
- "</state>";
- {
- ostringstream os;
- os << state;
- string s = os.str ();
- erase_all (s, "\n");
- BOOST_CHECK_EQUAL (s, xml2);
- }
-
- FullState state2;
- istringstream xml1_is (xml1);
- BOOST_CHECK_NO_THROW (xml1_is >> state2);
- {
- ostringstream os;
- os << state2;
- string xml1_test = os.str ();
- erase_all (xml1_test, "\n");
- BOOST_CHECK_EQUAL (xml1_test, xml1);
- }
-
- istringstream xml2_is ("<state><item action=\"remove\"><name>2</name></item></state>");
- BOOST_CHECK_NO_THROW (xml2_is >> state2);
-
- {
- ostringstream os;
- os << state2;
- string xml2_test = os.str ();
- erase_all (xml2_test, "\n");
- BOOST_CHECK_EQUAL (xml2_test, xml2);
- }
-}
-
-BOOST_AUTO_TEST_CASE (DiffStateXml)
-{
- DiffState state;
-
- NameInfoConstPtr name3 = StdNameInfo::FindOrCreate ("3");
- NameInfoConstPtr name2 = StdNameInfo::FindOrCreate ("2");
- NameInfoConstPtr name1 = StdNameInfo::FindOrCreate ("1");
-
- state.update (name1, SeqNo (10));
- state.update (name2, SeqNo (12));
- state.update (name3, SeqNo (8));
-
- string xml1 = "<state>"
- "<item action=\"update\"><name>1</name><seq><session>0</session><seqno>10</seqno></seq></item>"
- "<item action=\"update\"><name>2</name><seq><session>0</session><seqno>12</seqno></seq></item>"
- "<item action=\"update\"><name>3</name><seq><session>0</session><seqno>8</seqno></seq></item>"
- "</state>";
- {
- ostringstream os;
- os << state;
- string xml1_test = os.str ();
- erase_all (xml1_test, "\n");
- BOOST_CHECK_EQUAL (xml1_test, xml1);
- }
-
- state.remove (name2);
- string xml2 = "<state>"
- "<item action=\"update\"><name>1</name><seq><session>0</session><seqno>10</seqno></seq></item>"
- "<item action=\"remove\"><name>2</name></item>"
- "<item action=\"update\"><name>3</name><seq><session>0</session><seqno>8</seqno></seq></item>"
- "</state>";
- {
- ostringstream os;
- os << state;
- string xml2_test = os.str ();
- erase_all (xml2_test, "\n");
- BOOST_CHECK_EQUAL (xml2_test, xml2);
- }
-
- //////////// //////////// //////////// //////////// //////////// ////////////
-
- DiffState state2;
- istringstream xml1_is (xml1);
- BOOST_CHECK_NO_THROW (xml1_is >> state2);
-
- {
- ostringstream os;
- os << state2;
- string xml1_test = os.str ();
- erase_all (xml1_test, "\n");
- BOOST_CHECK_EQUAL (xml1_test, xml1);
- }
-
- istringstream xml2_is ("<state><item action=\"remove\"><name>2</name></item></state>");
- BOOST_CHECK_NO_THROW (xml2_is >> state2);
-
- {
- ostringstream os;
- os << state2;
- string xml2_test = os.str ();
- erase_all (xml2_test, "\n");
- BOOST_CHECK_EQUAL (xml2_test, xml2);
- }
-
-}
-
-BOOST_AUTO_TEST_CASE (DiffStateDiffTest)
-{
- DiffStatePtr root = make_shared<DiffState> ();
-
- DiffStatePtr head = make_shared<DiffState> ();
- root->setNext (head);
-
- head->update (StdNameInfo::FindOrCreate ("3"), SeqNo (1));
- head->remove (StdNameInfo::FindOrCreate ("1"));
-
- DiffStatePtr tail = make_shared<DiffState> ();
- head->setNext (tail);
-
- tail->update (StdNameInfo::FindOrCreate ("3"), SeqNo (2));
-
- {
- ostringstream os;
- os << *root->diff ();
- string diffState = os.str ();
- erase_all (diffState, "\n");
- BOOST_CHECK_EQUAL (diffState,
- "<state>"
- "<item action=\"remove\"><name>1</name></item>"
- "<item action=\"update\"><name>3</name><seq><session>0</session><seqno>2</seqno></seq></item>"
- "</state>");
- }
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/tests/test-nlsr.cpp b/tests/test-nlsr.cpp
index ebf9beb..39fbee5 100644
--- a/tests/test-nlsr.cpp
+++ b/tests/test-nlsr.cpp
@@ -76,6 +76,7 @@
neighbors.insert(neighborC);
nlsr.getConfParameter().setHyperbolicState(HYPERBOLIC_STATE_ON);
+ nlsr.getConfParameter().setNetwork(ndn::Name("/test"));
nlsr.initialize();
diff --git a/tests/test-sync-logic-handler.cpp b/tests/test-sync-logic-handler.cpp
index 0d08401..ef990cf 100644
--- a/tests/test-sync-logic-handler.cpp
+++ b/tests/test-sync-logic-handler.cpp
@@ -51,15 +51,15 @@
void
receiveUpdate(std::string prefix, uint64_t seqNo, SyncLogicHandler& p_sync)
{
- Sync::MissingDataInfo info = {prefix, 0, seqNo};
+ chronosync::MissingDataInfo info = {ndn::Name(prefix).appendNumber(1), 0, seqNo};
- std::vector<Sync::MissingDataInfo> updates;
+ std::vector<chronosync::MissingDataInfo> updates;
updates.push_back(info);
face->processEvents(ndn::time::milliseconds(1));
face->sentInterests.clear();
- p_sync.onNsyncUpdate(updates, nullptr);
+ p_sync.onNsyncUpdate(updates);
face->processEvents(ndn::time::milliseconds(1));
}
diff --git a/tests/update/test-nfd-rib-command-processor.cpp b/tests/update/test-nfd-rib-command-processor.cpp
index 6f10930..3c0ae47 100644
--- a/tests/update/test-nfd-rib-command-processor.cpp
+++ b/tests/update/test-nfd-rib-command-processor.cpp
@@ -27,8 +27,8 @@
#include "adjacency-list.hpp"
#include "nlsr.hpp"
+#include <ndn-cxx/interest.hpp>
#include <ndn-cxx/util/dummy-client-face.hpp>
-
#include <ndn-cxx/security/key-chain.hpp>
namespace nlsr {
@@ -49,7 +49,12 @@
// Initialize NLSR so a sync socket is created
nlsr.initialize();
- this->advanceClocks(ndn::time::milliseconds(10), 1);
+
+ // Saving clock::now before any advanceClocks so that it will
+ // be the same value as what ChronoSync uses in setting the sessionName
+ sessionTime.appendNumber(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count());
+
+ this->advanceClocks(ndn::time::milliseconds(10));
face.sentInterests.clear();
}
@@ -63,9 +68,24 @@
return interest;
}
+ void sendInterestForPublishedData() {
+ // Need to send an interest now since ChronoSync
+ // no longer does face->put(*data) in publishData.
+ // Instead it does it in onInterest
+ ndn::Name lsaInterestName("/localhop/ndn/NLSR/LSA");
+ // The part after LSA is Chronosync getSession
+ lsaInterestName.append(sessionTime);
+ lsaInterestName.appendNumber(nlsr.getSequencingManager().getCombinedSeqNo());
+ shared_ptr<ndn::Interest> lsaInterest = make_shared<ndn::Interest>(lsaInterestName);
+
+ face.receive(*lsaInterest);
+ this->advanceClocks(ndn::time::milliseconds(10));
+ }
+
bool
wasRoutingUpdatePublished()
{
+ sendInterestForPublishedData();
const ndn::Name& lsaPrefix = nlsr.getConfParameter().getLsaPrefix();
const auto& it = std::find_if(face.sentData.begin(), face.sentData.end(),
@@ -83,6 +103,7 @@
Nlsr nlsr;
NamePrefixList& namePrefixes;
NfdRibCommandProcessor& processor;
+ ndn::Name sessionTime;
};
typedef boost::mpl::vector<NfdRibRegisterCommand, NfdRibUnregisterCommand> Commands;
@@ -119,7 +140,7 @@
parameters.setName(prefixName);
processor.insertPrefix(parameters);
- this->advanceClocks(ndn::time::milliseconds(10), 1);
+ this->advanceClocks(ndn::time::milliseconds(10));
BOOST_CHECK_EQUAL(namePrefixes.getNameList().size(), 1);
auto itr = std::find(namePrefixes.getNameList().begin(), namePrefixes.getNameList().end(),
@@ -140,7 +161,7 @@
BOOST_CHECK_EQUAL(namePrefixes.getNameList().size(), 1);
processor.removePrefix(parameters);
- this->advanceClocks(ndn::time::milliseconds(10), 1);
+ this->advanceClocks(ndn::time::milliseconds(10));
BOOST_CHECK_EQUAL(namePrefixes.getNameList().size(), 0);
auto itr = std::find(namePrefixes.getNameList().begin(), namePrefixes.getNameList().end(),
@@ -161,7 +182,7 @@
.wireEncode()), 0);
face.receive(*command);
- this->advanceClocks(ndn::time::milliseconds(10), 1);
+ this->advanceClocks(ndn::time::milliseconds(10));
BOOST_CHECK_EQUAL(namePrefixes.getNameList().size(), 1);
auto itr = std::find(namePrefixes.getNameList().begin(), namePrefixes.getNameList().end(),
@@ -185,7 +206,7 @@
.wireEncode()), 0);
face.receive(ndn::Interest(name));
- this->advanceClocks(ndn::time::milliseconds(10), 1);
+ this->advanceClocks(ndn::time::milliseconds(10));
BOOST_CHECK_EQUAL(namePrefixes.getNameList().size(), 0);
BOOST_CHECK(wasRoutingUpdatePublished());
@@ -201,7 +222,7 @@
.wireEncode()), 0);
face.receive(ndn::Interest(name));
- this->advanceClocks(ndn::time::milliseconds(10), 1);
+ this->advanceClocks(ndn::time::milliseconds(10));
BOOST_CHECK_EQUAL(namePrefixes.getNameList().size(), 0);
BOOST_CHECK(!wasRoutingUpdatePublished());
diff --git a/tests/update/test-prefix-update-processor.cpp b/tests/update/test-prefix-update-processor.cpp
index f21269b..169fc48 100644
--- a/tests/update/test-prefix-update-processor.cpp
+++ b/tests/update/test-prefix-update-processor.cpp
@@ -39,14 +39,14 @@
namespace update {
namespace test {
-class PrefixUpdateFixture : public nlsr::test::BaseFixture
+class PrefixUpdateFixture : public nlsr::test::UnitTestTimeFixture
{
public:
PrefixUpdateFixture()
- : face(std::make_shared<ndn::util::DummyClientFace>(g_ioService))
+ : face(g_ioService, keyChain, {true, true})
, siteIdentity(ndn::Name("/ndn/edu/test-site").appendVersion())
, opIdentity(ndn::Name(siteIdentity).append(ndn::Name("%C1.Operator")).appendVersion())
- , nlsr(g_ioService, g_scheduler, *face, g_keyChain)
+ , nlsr(g_ioService, g_scheduler, face, g_keyChain)
, keyPrefix(("/ndn/broadcast"))
, updateProcessor(nlsr.getPrefixUpdateProcessor())
, SITE_CERT_PATH(boost::filesystem::current_path() / std::string("site.cert"))
@@ -114,11 +114,12 @@
// Initialize NLSR so a sync socket is created
nlsr.initialize();
- // Listen on localhost prefix
- updateProcessor.startListening();
+ // Saving clock::now before any advanceClocks so that it will
+ // be the same value as what ChronoSync uses in setting the sessionName
+ sessionTime.appendNumber(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count());
- face->processEvents(ndn::time::milliseconds(1));
- face->sentInterests.clear();
+ this->advanceClocks(ndn::time::milliseconds(10));
+ face.sentInterests.clear();
}
void
@@ -155,28 +156,44 @@
keyChain.addCertificateAsIdentityDefault(*opCert);
}
+ void sendInterestForPublishedData() {
+ // Need to send an interest now since ChronoSync
+ // no longer does face->put(*data) in publishData.
+ // Instead it does it in onInterest
+ ndn::Name lsaInterestName("/localhop/ndn/NLSR/LSA");
+ // The part after LSA is Chronosync getSession
+ lsaInterestName.append(sessionTime);
+ lsaInterestName.appendNumber(nlsr.getSequencingManager().getCombinedSeqNo());
+ shared_ptr<Interest> lsaInterest = make_shared<Interest>(lsaInterestName);
+
+ face.receive(*lsaInterest);
+ this->advanceClocks(ndn::time::milliseconds(10));
+ }
+
bool
wasRoutingUpdatePublished()
{
+ sendInterestForPublishedData();
+
const ndn::Name& lsaPrefix = nlsr.getConfParameter().getLsaPrefix();
- const auto& it = std::find_if(face->sentData.begin(), face->sentData.end(),
+ const auto& it = std::find_if(face.sentData.begin(), face.sentData.end(),
[lsaPrefix] (const ndn::Data& data) {
return lsaPrefix.isPrefixOf(data.getName());
});
- return (it != face->sentData.end());
+ return (it != face.sentData.end());
}
void
checkResponseCode(const Name& commandPrefix, uint64_t expectedCode)
{
- std::vector<Data>::iterator it = std::find_if(face->sentData.begin(),
- face->sentData.end(),
+ std::vector<Data>::iterator it = std::find_if(face.sentData.begin(),
+ face.sentData.end(),
[commandPrefix] (const Data& data) {
return commandPrefix.isPrefixOf(data.getName());
});
- BOOST_REQUIRE(it != face->sentData.end());
+ BOOST_REQUIRE(it != face.sentData.end());
ndn::nfd::ControlResponse response(it->getContent().blockFromValue());
BOOST_CHECK_EQUAL(response.getCode(), expectedCode);
@@ -191,7 +208,7 @@
}
public:
- std::shared_ptr<ndn::util::DummyClientFace> face;
+ ndn::util::DummyClientFace face;
ndn::KeyChain keyChain;
ndn::Name siteIdentity;
@@ -207,6 +224,7 @@
PrefixUpdateProcessor& updateProcessor;
const boost::filesystem::path SITE_CERT_PATH;
+ ndn::Name sessionTime;
};
BOOST_FIXTURE_TEST_SUITE(TestPrefixUpdateProcessor, PrefixUpdateFixture)
@@ -225,8 +243,8 @@
std::shared_ptr<Interest> advertiseInterest = std::make_shared<Interest>(advertiseCommand);
keyChain.signByIdentity(*advertiseInterest, opIdentity);
- face->receive(*advertiseInterest);
- face->processEvents(ndn::time::milliseconds(1));
+ face.receive(*advertiseInterest);
+ this->advanceClocks(ndn::time::milliseconds(10));
NamePrefixList& namePrefixList = nlsr.getNamePrefixList();
@@ -234,7 +252,8 @@
BOOST_CHECK_EQUAL(namePrefixList.getNameList().front(), parameters.getName());
BOOST_CHECK(wasRoutingUpdatePublished());
- face->sentData.clear();
+
+ face.sentData.clear();
// Withdraw
ndn::Name withdrawCommand("/localhost/nlsr/prefix-update/withdraw");
@@ -243,8 +262,8 @@
std::shared_ptr<Interest> withdrawInterest = std::make_shared<Interest>(withdrawCommand);
keyChain.signByIdentity(*withdrawInterest, opIdentity);
- face->receive(*withdrawInterest);
- face->processEvents(ndn::time::milliseconds(1));
+ face.receive(*withdrawInterest);
+ this->advanceClocks(ndn::time::milliseconds(10));
BOOST_CHECK_EQUAL(namePrefixList.getSize(), 0);
@@ -263,22 +282,22 @@
keyChain.signByIdentity(*advertiseInterest, opIdentity);
// Command should be rejected
- face->receive(*advertiseInterest);
- face->processEvents(ndn::time::milliseconds(1));
+ face.receive(*advertiseInterest);
+ this->advanceClocks(ndn::time::milliseconds(10));
- BOOST_REQUIRE(!face->sentData.empty());
+ BOOST_REQUIRE(!face.sentData.empty());
- const ndn::MetaInfo& metaInfo = face->sentData.front().getMetaInfo();
+ const ndn::MetaInfo& metaInfo = face.sentData.front().getMetaInfo();
BOOST_CHECK_EQUAL(metaInfo.getType(), ndn::tlv::ContentType_Nack);
- face->sentData.clear();
+ face.sentData.clear();
// Enable PrefixUpdateProcessor so commands will be processed
updateProcessor.enable();
// Command should be accepted
- face->receive(*advertiseInterest);
- face->processEvents(ndn::time::milliseconds(1));
+ face.receive(*advertiseInterest);
+ this->advanceClocks(ndn::time::milliseconds(10));
checkResponseCode(advertiseCommand, 200);
}
diff --git a/tests/wscript b/tests/wscript
index d105888..d01a821 100644
--- a/tests/wscript
+++ b/tests/wscript
@@ -32,15 +32,6 @@
use='nlsr-objects',
)
- # nsync tests
- unit_tests_nsync = bld.program(
- target='../unit-tests-nsync',
- features='cxx cxxprogram',
- source=bld.path.ant_glob(['nsync/**/*.cc']),
- use='nsync-objects unit-tests-main',
- includes='.',
- install_path=None,
- )
# nlsr tests
unit_tests_nlsr = bld.program(
diff --git a/wscript b/wscript
index 186c98e..e59953e 100644
--- a/wscript
+++ b/wscript
@@ -33,8 +33,7 @@
def options(opt):
opt.load(['compiler_cxx', 'gnu_dirs'])
opt.load(['default-compiler-flags', 'coverage',
- 'boost', 'protoc', 'openssl',
- 'doxygen', 'sphinx_build'],
+ 'boost', 'doxygen', 'sphinx_build'],
tooldir=['.waf-tools'])
nlsropt = opt.add_option_group('NLSR Options')
@@ -45,8 +44,7 @@
def configure(conf):
conf.load(['compiler_cxx', 'gnu_dirs',
- 'boost', 'openssl',
- 'default-compiler-flags',
+ 'boost', 'default-compiler-flags',
'doxygen', 'sphinx_build'])
if 'PKG_CONFIG_PATH' not in os.environ:
@@ -58,8 +56,6 @@
conf.check_cfg(package='liblog4cxx', args=['--cflags', '--libs'],
uselib_store='LOG4CXX', mandatory=True)
- conf.check_openssl(mandatory=True)
-
boost_libs = 'system chrono program_options iostreams thread regex filesystem'
if conf.options.with_tests:
conf.env['WITH_TESTS'] = 1
@@ -73,7 +69,8 @@
Logs.error("Please upgrade your distribution or install custom boost libraries")
return
- conf.load('protoc')
+ conf.check_cfg(package='ChronoSync', args=['ChronoSync >= 0.1', '--cflags', '--libs'],
+ uselib_store='SYNC', mandatory=True)
conf.load('coverage')
@@ -100,23 +97,13 @@
VERSION_PATCH=VERSION_SPLIT[2],
)
- nsync_objects = bld(
- target='nsync-objects',
- name='nsync-objects',
- features='cxx',
- source=bld.path.ant_glob(['nsync/**/*.cc', 'nsync/**/*.proto']),
- use='BOOST NDN_CXX OPENSSL LOG4CXX',
- includes='nsync',
- export_includes='nsync',
- )
-
nlsr_objects = bld(
target='nlsr-objects',
name='nlsr-objects',
features='cxx',
source=bld.path.ant_glob(['src/**/*.cpp'],
excl=['src/main.cpp']),
- use='nsync-objects NDN_CXX BOOST LOG4CXX',
+ use='NDN_CXX BOOST LOG4CXX SYNC',
includes='. src',
export_includes='. src',
)