blob: 9d3dc779aed07cd0422fddfc145bc90e836ce69c [file] [log] [blame]
Yingdi Yu43e71612013-10-30 22:19:31 -07001/* -*- Mode: C32++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2012 University of California, Los Angeles
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Yingdi Yu <yingdi@cs.ucla.edu>
19 */
20
21#include "sync-socket.h"
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080022#include "sync-logging.h"
23
Yingdi Yu43e71612013-10-30 22:19:31 -070024using namespace std;
25using namespace ndn;
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080026
27INIT_LOGGER ("SyncSocket");
Yingdi Yu43e71612013-10-30 22:19:31 -070028
29namespace Sync {
30
Alexander Afanasyev531803b2014-02-05 15:57:35 -080031using ndn::shared_ptr;
32
Yingdi Yu0eee6002014-02-11 15:54:17 -080033SyncSocket::SyncSocket (const Name& syncPrefix,
Yingdi Yu3da10fe2014-02-27 16:37:34 -080034 const ndn::Name& dataPrefix,
35 uint64_t dataSession,
36 const IdentityCertificate& myCertificate,
37 shared_ptr<SecRuleRelative> dataRule,
Yingdi Yu6e235db2013-12-27 08:40:53 +080038 shared_ptr<Face> face,
Yingdi Yu43e71612013-10-30 22:19:31 -070039 NewDataCallback dataCallback,
40 RemoveCallback rmCallback )
Yingdi Yu3da10fe2014-02-27 16:37:34 -080041 : m_dataPrefix(dataPrefix)
42 , m_dataSession(dataSession)
43 , m_newDataCallback(dataCallback)
44 , m_myCertificate(myCertificate)
Yingdi Yu6e235db2013-12-27 08:40:53 +080045 , m_face(face)
Yingdi Yu51c80252014-02-10 19:32:05 -080046 , m_ioService(face->ioService())
Yingdi Yu3da10fe2014-02-27 16:37:34 -080047 , m_syncValidator(new SyncValidator(syncPrefix,
48 m_myCertificate,
49 m_face,
50 bind(&SyncSocket::publishData, this, _1, _2, _3, true),
51 dataRule))
Yingdi Yu43e71612013-10-30 22:19:31 -070052 , m_syncLogic (syncPrefix,
Yingdi Yu3da10fe2014-02-27 16:37:34 -080053 myCertificate,
54 m_syncValidator,
Yingdi Yu6e235db2013-12-27 08:40:53 +080055 face,
Yingdi Yu43e71612013-10-30 22:19:31 -070056 bind(&SyncSocket::passCallback, this, _1),
57 rmCallback)
Yingdi Yu280bb962014-01-30 09:52:43 -080058{}
Yingdi Yu43e71612013-10-30 22:19:31 -070059
60SyncSocket::~SyncSocket()
Yingdi Yu479e1172013-11-06 16:36:19 -080061{
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080062}
63
Yingdi Yu3da10fe2014-02-27 16:37:34 -080064void
65SyncSocket::publishData(const uint8_t* buf, size_t len, int freshness, bool isCert)
Yingdi Yu43e71612013-10-30 22:19:31 -070066{
Yingdi Yu51c80252014-02-10 19:32:05 -080067 shared_ptr<Data> data = make_shared<Data>();
68 data->setContent(reinterpret_cast<const uint8_t*>(buf), len);
69 data->setFreshnessPeriod(1000*freshness);
70
Yingdi Yu3da10fe2014-02-27 16:37:34 -080071 m_ioService->post(bind(&SyncSocket::publishDataInternal, this,
72 data, m_dataPrefix, m_dataSession, isCert));
Yingdi Yu51c80252014-02-10 19:32:05 -080073}
74
75void
Yingdi Yu3da10fe2014-02-27 16:37:34 -080076SyncSocket::publishDataInternal(shared_ptr<Data> data, const Name &prefix, uint64_t session, bool isCert)
Yingdi Yu51c80252014-02-10 19:32:05 -080077{
Yingdi Yu280bb962014-01-30 09:52:43 -080078 uint64_t sequence = getNextSeq(prefix, session);
Yingdi Yu6d638f02014-01-24 11:01:21 -080079 Name dataName = prefix;
Yingdi Yu280bb962014-01-30 09:52:43 -080080 dataName.append(boost::lexical_cast<string>(session)).append(boost::lexical_cast<string>(sequence));
Yingdi Yu3da10fe2014-02-27 16:37:34 -080081 if(isCert)
82 dataName.append("INTRO-CERT");
Yingdi Yu51c80252014-02-10 19:32:05 -080083 data->setName(dataName);
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080084
Yingdi Yu3da10fe2014-02-27 16:37:34 -080085 m_keyChain.sign(*data, m_myCertificate.getName());
Yingdi Yu51c80252014-02-10 19:32:05 -080086 m_face->put(*data);
Yingdi Yu46c9f1a2013-12-18 15:15:46 +080087
Yingdi Yu43e71612013-10-30 22:19:31 -070088 SeqNo s(session, sequence + 1);
Yingdi Yu51c80252014-02-10 19:32:05 -080089
Yingdi Yu43e71612013-10-30 22:19:31 -070090 m_sequenceLog[prefix] = s;
91 m_syncLogic.addLocalNames (prefix, session, sequence);
Yingdi Yu43e71612013-10-30 22:19:31 -070092}
93
94void
Yingdi Yu3da10fe2014-02-27 16:37:34 -080095SyncSocket::fetchData(const Name &prefix, const SeqNo &seq, const OnDataValidated& dataCallback, int retry)
Yingdi Yu43e71612013-10-30 22:19:31 -070096{
Yingdi Yu6d638f02014-01-24 11:01:21 -080097 Name interestName = prefix;
Yingdi Yu280bb962014-01-30 09:52:43 -080098 interestName.append(boost::lexical_cast<string>(seq.getSession())).append(boost::lexical_cast<string>(seq.getSeq()));
Yingdi Yu6d638f02014-01-24 11:01:21 -080099
Yingdi Yu6d638f02014-01-24 11:01:21 -0800100 ndn::Interest interest(interestName);
Yingdi Yu280bb962014-01-30 09:52:43 -0800101 interest.setMustBeFresh(true);
Yingdi Yu3da10fe2014-02-27 16:37:34 -0800102
103 const OnDataValidated& onValidated = bind(&SyncSocket::onDataValidated, this, _1, interestName.size(), dataCallback);
104 const OnDataValidationFailed& onValidationFailed = bind(&SyncSocket::onDataValidationFailed, this, _1, _2);
105
Yingdi Yu6d638f02014-01-24 11:01:21 -0800106 m_face->expressInterest(interest,
Yingdi Yu280bb962014-01-30 09:52:43 -0800107 bind(&SyncSocket::onData, this, _1, _2, onValidated, onValidationFailed),
108 bind(&SyncSocket::onDataTimeout, this, _1, retry, onValidated, onValidationFailed));
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800109
Yingdi Yu43e71612013-10-30 22:19:31 -0700110}
111
112void
Yingdi Yu51c80252014-02-10 19:32:05 -0800113SyncSocket::onData(const ndn::Interest& interest, Data& data,
Yingdi Yu280bb962014-01-30 09:52:43 -0800114 const OnDataValidated& onValidated,
115 const OnDataValidationFailed& onValidationFailed)
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800116{
Yingdi Yu3da10fe2014-02-27 16:37:34 -0800117 m_syncValidator->validate(data, onValidated, onValidationFailed);
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800118}
119
120void
Yingdi Yu51c80252014-02-10 19:32:05 -0800121SyncSocket::onDataTimeout(const ndn::Interest& interest,
Yingdi Yu6d638f02014-01-24 11:01:21 -0800122 int retry,
Yingdi Yu280bb962014-01-30 09:52:43 -0800123 const OnDataValidated& onValidated,
124 const OnDataValidationFailed& onValidationFailed)
Yingdi Yu43e71612013-10-30 22:19:31 -0700125{
126 if(retry > 0)
127 {
Yingdi Yu51c80252014-02-10 19:32:05 -0800128 m_face->expressInterest(interest,
Yingdi Yu6d638f02014-01-24 11:01:21 -0800129 bind(&SyncSocket::onData,
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800130 this,
131 _1,
132 _2,
Yingdi Yu280bb962014-01-30 09:52:43 -0800133 onValidated,
134 onValidationFailed),
Yingdi Yu6d638f02014-01-24 11:01:21 -0800135 bind(&SyncSocket::onDataTimeout,
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800136 this,
137 _1,
138 retry - 1,
Yingdi Yu280bb962014-01-30 09:52:43 -0800139 onValidated,
140 onValidationFailed));
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800141
Yingdi Yu43e71612013-10-30 22:19:31 -0700142 }
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800143 else
Yingdi Yu6d638f02014-01-24 11:01:21 -0800144 _LOG_DEBUG("interest eventually time out!");
Yingdi Yu43e71612013-10-30 22:19:31 -0700145}
146
147void
Yingdi Yu3da10fe2014-02-27 16:37:34 -0800148SyncSocket::onDataValidated(const shared_ptr<const Data>& data,
149 size_t interestNameSize,
150 const OnDataValidated& onValidated)
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800151{
Yingdi Yu3da10fe2014-02-27 16:37:34 -0800152 _LOG_DEBUG("--------------------" << data->getName());
153 if(data->getName().size() > interestNameSize
154 && data->getName().get(interestNameSize).toEscapedString() == "INTRO-CERT")
155 {
156 Data rawData;
157 rawData.wireDecode(data->getContent().blockFromValue());
158 IntroCertificate introCert(rawData);
159 m_syncValidator->addParticipant(introCert);
160 }
161 else
162 {
163 onValidated(data);
164 }
Yingdi Yu46c9f1a2013-12-18 15:15:46 +0800165}
Yingdi Yu43e71612013-10-30 22:19:31 -0700166
Yingdi Yu3da10fe2014-02-27 16:37:34 -0800167void
168SyncSocket::onDataValidationFailed(const shared_ptr<const Data>& data,
169 const std::string& failureInfo)
Yingdi Yu43e71612013-10-30 22:19:31 -0700170{
Yingdi Yu3da10fe2014-02-27 16:37:34 -0800171 _LOG_DEBUG("data cannot be verified!: " << failureInfo);
Yingdi Yu43e71612013-10-30 22:19:31 -0700172}
173
174}//Sync