blob: 64dc8171439b8923837a0b7e9c61703f32e380a4 [file] [log] [blame]
Jeff Thompson25b4e612013-10-10 16:03:24 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
Jeff Thompson47eecfc2013-07-07 22:56:46 -07002/**
Jeff Thompson7687dc02013-09-13 11:54:07 -07003 * Copyright (C) 2013 Regents of the University of California.
4 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
Jeff Thompson47eecfc2013-07-07 22:56:46 -07005 * See COPYING for copyright and distribution information.
Jeff Thompsonb7f95562013-07-03 18:36:42 -07006 */
7
Alexander Afanasyev09c613f2014-01-29 00:23:58 -08008#include "common.hpp"
Alexander Afanasyeve2dcdfd2014-02-07 15:53:28 -08009
Alexander Afanasyev09c613f2014-01-29 00:23:58 -080010#include "interest.hpp"
Alexander Afanasyeve9fdb802014-02-05 17:36:51 -080011#include "util/random.hpp"
Junxiao Shiaf8eeea2014-03-31 20:10:56 -070012#include "data.hpp"
Alexander Afanasyev840139f2013-12-28 15:02:50 -080013
Jeff Thompsonb7f95562013-07-03 18:36:42 -070014namespace ndn {
Alexander Afanasyev84681982014-01-03 13:26:09 -080015
Alexander Afanasyev85480842014-01-06 14:46:54 -080016const uint32_t&
Alexander Afanasyev840139f2013-12-28 15:02:50 -080017Interest::getNonce() const
18{
Alexander Afanasyevc348f832014-02-17 16:35:17 -080019 if (m_nonce == 0)
20 m_nonce = random::generateWord32();
Alexander Afanasyev840139f2013-12-28 15:02:50 -080021
Alexander Afanasyevc348f832014-02-17 16:35:17 -080022 return m_nonce;
Alexander Afanasyev840139f2013-12-28 15:02:50 -080023}
24
25
Alexander Afanasyev84681982014-01-03 13:26:09 -080026bool
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -070027Interest::matchesName(const Name& name) const
Jeff Thompson25b4e612013-10-10 16:03:24 -070028{
Alexander Afanasyev1dd95c52014-03-22 19:11:36 -070029 if (name.size() < m_name.size())
30 return false;
31
Alexander Afanasyevc348f832014-02-17 16:35:17 -080032 if (!m_name.isPrefixOf(name))
Alexander Afanasyev84681982014-01-03 13:26:09 -080033 return false;
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070034
Alexander Afanasyevc348f832014-02-17 16:35:17 -080035 if (getMinSuffixComponents() >= 0 &&
Alexander Afanasyev84681982014-01-03 13:26:09 -080036 // Add 1 for the implicit digest.
Alexander Afanasyev1dd95c52014-03-22 19:11:36 -070037 !(name.size() + 1 - m_name.size() >= static_cast<size_t>(getMinSuffixComponents())))
Alexander Afanasyev84681982014-01-03 13:26:09 -080038 return false;
39
Alexander Afanasyevc348f832014-02-17 16:35:17 -080040 if (getMaxSuffixComponents() >= 0 &&
Alexander Afanasyev84681982014-01-03 13:26:09 -080041 // Add 1 for the implicit digest.
Alexander Afanasyev1dd95c52014-03-22 19:11:36 -070042 !(name.size() + 1 - m_name.size() <= static_cast<size_t>(getMaxSuffixComponents())))
Alexander Afanasyev84681982014-01-03 13:26:09 -080043 return false;
44
Alexander Afanasyev1dd95c52014-03-22 19:11:36 -070045 if (!getExclude().empty() &&
46 name.size() > m_name.size() &&
Alexander Afanasyevc348f832014-02-17 16:35:17 -080047 getExclude().isExcluded(name[m_name.size()]))
Alexander Afanasyev84681982014-01-03 13:26:09 -080048 return false;
49
50 return true;
Jeff Thompson25b4e612013-10-10 16:03:24 -070051}
52
Junxiao Shiaf8eeea2014-03-31 20:10:56 -070053bool
54Interest::matchesData(const Data& data) const
55{
56 if (!this->matchesName(data.getName())) {
57 return false;
58 }
59
60 const KeyLocator& publisherPublicKeyLocator = this->getPublisherPublicKeyLocator();
61 if (!publisherPublicKeyLocator.empty()) {
62 const Signature& signature = data.getSignature();
63 const Block& signatureInfo = signature.getInfo();
64 Block::element_const_iterator it = signatureInfo.find(Tlv::KeyLocator);
65 if (it == signatureInfo.elements_end()) {
66 return false;
67 }
68 if (publisherPublicKeyLocator.wireEncode() != *it) {
69 return false;
70 }
71 }
72
73 return true;
74}
75
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -070076std::ostream&
77operator<<(std::ostream& os, const Interest& interest)
Jeff Thompsonfe556862013-07-09 13:52:55 -070078{
Alexander Afanasyev84681982014-01-03 13:26:09 -080079 os << interest.getName();
Jeff Thompsonfe556862013-07-09 13:52:55 -070080
Alexander Afanasyev84681982014-01-03 13:26:09 -080081 char delim = '?';
82
83 if (interest.getMinSuffixComponents() >= 0) {
84 os << delim << "ndn.MinSuffixComponents=" << interest.getMinSuffixComponents();
85 delim = '&';
Jeff Thompsonfe556862013-07-09 13:52:55 -070086 }
Alexander Afanasyev84681982014-01-03 13:26:09 -080087 if (interest.getMaxSuffixComponents() >= 0) {
88 os << delim << "ndn.MaxSuffixComponents=" << interest.getMaxSuffixComponents();
89 delim = '&';
Jeff Thompson37527d62013-08-21 11:15:54 -070090 }
Alexander Afanasyev84681982014-01-03 13:26:09 -080091 if (interest.getChildSelector() >= 0) {
92 os << delim << "ndn.ChildSelector=" << interest.getChildSelector();
93 delim = '&';
Jeff Thompson13e280b2013-12-03 13:12:23 -080094 }
Alexander Afanasyev84681982014-01-03 13:26:09 -080095 if (interest.getMustBeFresh()) {
96 os << delim << "ndn.MustBeFresh=" << interest.getMustBeFresh();
97 delim = '&';
Jeff Thompson13e280b2013-12-03 13:12:23 -080098 }
Alexander Afanasyev84681982014-01-03 13:26:09 -080099 if (interest.getScope() >= 0) {
100 os << delim << "ndn.Scope=" << interest.getScope();
101 delim = '&';
Jeff Thompson13e280b2013-12-03 13:12:23 -0800102 }
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700103 if (interest.getInterestLifetime() >= time::milliseconds::zero()
104 && interest.getInterestLifetime() != DEFAULT_INTEREST_LIFETIME) {
Alexander Afanasyev84681982014-01-03 13:26:09 -0800105 os << delim << "ndn.InterestLifetime=" << interest.getInterestLifetime();
106 delim = '&';
107 }
108
109 if (interest.getNonce() > 0) {
110 os << delim << "ndn.Nonce=" << interest.getNonce();
111 delim = '&';
112 }
113 if (!interest.getExclude().empty()) {
114 os << delim << "ndn.Exclude=" << interest.getExclude();
115 delim = '&';
116 }
117
118 return os;
Jeff Thompson13e280b2013-12-03 13:12:23 -0800119}
120
Jeff Thompsonb7f95562013-07-03 18:36:42 -0700121}