blob: 7e6a1bf743e256081b94a480ec619b6cd80aa8dc [file] [log] [blame]
susmit91e1d7c2016-10-03 16:16:57 -06001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi2760adc2017-07-06 05:44:52 +00002/*
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -04003 * Copyright (c) 2014-2018, Regents of the University of California,
susmit91e1d7c2016-10-03 16:16:57 -06004 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
26#include "core/network-interface-predicate.hpp"
susmit91e1d7c2016-10-03 16:16:57 -060027
28#include "tests/test-common.hpp"
29
Junxiao Shia5765d62017-08-09 04:07:46 +000030#include <ndn-cxx/net/ethernet.hpp>
Junxiao Shi2760adc2017-07-06 05:44:52 +000031#include <ndn-cxx/net/network-monitor-stub.hpp>
susmit91e1d7c2016-10-03 16:16:57 -060032#include <boost/property_tree/info_parser.hpp>
33#include <sstream>
34
35namespace nfd {
36namespace tests {
37
38class NetworkInterfacePredicateFixture : public BaseFixture
39{
40protected:
41 NetworkInterfacePredicateFixture()
42 {
43 using namespace boost::asio::ip;
Junxiao Shi2760adc2017-07-06 05:44:52 +000044 using namespace ndn::net;
Junxiao Shia5765d62017-08-09 04:07:46 +000045 namespace ethernet = ndn::ethernet;
Junxiao Shi2760adc2017-07-06 05:44:52 +000046
47 netifs.push_back(NetworkMonitorStub::makeNetworkInterface());
48 netifs.back()->setIndex(0);
49 netifs.back()->setName("eth0");
50 netifs.back()->setEthernetAddress(ethernet::Address::fromString("3e:15:c2:8b:65:00"));
51 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V4,
52 address_v4::from_string("129.82.100.1"), address_v4::from_string("129.82.255.255"),
53 16, AddressScope::GLOBAL, 0));
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -040054 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V4,
55 address_v6::from_string("2001:db8:1::1"), address_v6::from_string("2001:db8:1::ffff:ffff:ffff:ffff"),
56 64, AddressScope::GLOBAL, 0));
Junxiao Shi2760adc2017-07-06 05:44:52 +000057 netifs.back()->setFlags(IFF_UP);
58
59 netifs.push_back(NetworkMonitorStub::makeNetworkInterface());
60 netifs.back()->setIndex(1);
61 netifs.back()->setName("eth1");
62 netifs.back()->setEthernetAddress(ethernet::Address::fromString("3e:15:c2:8b:65:01"));
63 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V4,
64 address_v4::from_string("192.168.2.1"), address_v4::from_string("192.168.2.255"),
65 24, AddressScope::GLOBAL, 0));
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -040066 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V4,
67 address_v6::from_string("2001:db8:2::1"), address_v6::from_string("2001:db8:2::ffff:ffff:ffff:ffff"),
68 64, AddressScope::GLOBAL, 0));
Junxiao Shi2760adc2017-07-06 05:44:52 +000069 netifs.back()->setFlags(IFF_UP);
70
71 netifs.push_back(NetworkMonitorStub::makeNetworkInterface());
72 netifs.back()->setIndex(2);
73 netifs.back()->setName("eth2");
74 netifs.back()->setEthernetAddress(ethernet::Address::fromString("3e:15:c2:8b:65:02"));
75 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V4,
76 address_v4::from_string("198.51.100.1"), address_v4::from_string("198.51.100.255"),
77 24, AddressScope::GLOBAL, 0));
78 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V6,
79 address_v6::from_string("2001:db8::1"), address_v6::from_string("2001:db8::ffff"),
80 112, AddressScope::GLOBAL, 0));
81 netifs.back()->setFlags(IFF_MULTICAST | IFF_BROADCAST | IFF_UP);
82
83 netifs.push_back(NetworkMonitorStub::makeNetworkInterface());
84 netifs.back()->setIndex(3);
85 netifs.back()->setName("enp68s0f1");
86 netifs.back()->setEthernetAddress(ethernet::Address::fromString("3e:15:c2:8b:65:03"));
87 netifs.back()->addNetworkAddress(NetworkAddress(AddressFamily::V4,
88 address_v4::from_string("192.168.2.3"), address_v4::from_string("192.168.2.255"),
89 24, AddressScope::GLOBAL, 0));
90 netifs.back()->setFlags(IFF_UP);
susmit91e1d7c2016-10-03 16:16:57 -060091 }
92
93 void
94 parseConfig(const std::string& config)
95 {
96 std::istringstream input(config);
97 boost::property_tree::ptree ptree;
98 boost::property_tree::read_info(input, ptree);
99
100 for (const auto& i : ptree) {
101 if (i.first == "whitelist") {
102 predicate.parseWhitelist(i.second);
103 }
104 else if (i.first == "blacklist") {
105 predicate.parseBlacklist(i.second);
106 }
107 }
108 }
109
110protected:
111 NetworkInterfacePredicate predicate;
Junxiao Shi2760adc2017-07-06 05:44:52 +0000112 std::vector<shared_ptr<ndn::net::NetworkInterface>> netifs;
susmit91e1d7c2016-10-03 16:16:57 -0600113};
114
115BOOST_FIXTURE_TEST_SUITE(TestNetworkInterfacePredicate, NetworkInterfacePredicateFixture)
116
117BOOST_AUTO_TEST_CASE(Default)
118{
119 parseConfig("");
120
Junxiao Shi2760adc2017-07-06 05:44:52 +0000121 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
122 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
123 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
124 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit91e1d7c2016-10-03 16:16:57 -0600125}
126
127BOOST_AUTO_TEST_CASE(EmptyWhitelist)
128{
129 parseConfig("whitelist\n"
130 "{\n"
131 "}");
132
Junxiao Shi2760adc2017-07-06 05:44:52 +0000133 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
134 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
135 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
136 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600137}
138
139BOOST_AUTO_TEST_CASE(WildcardBlacklist)
140{
141 parseConfig("blacklist\n"
142 "{\n"
143 " *\n"
144 "}");
145
Junxiao Shi2760adc2017-07-06 05:44:52 +0000146 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
147 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
148 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
149 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600150}
151
152BOOST_AUTO_TEST_CASE(IfnameWhitelist)
153{
154 parseConfig("whitelist\n"
155 "{\n"
156 " ifname eth0\n"
157 " ifname eth1\n"
158 "}");
159
Junxiao Shi2760adc2017-07-06 05:44:52 +0000160 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
161 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
162 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
163 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600164}
165
166BOOST_AUTO_TEST_CASE(IfnameBlacklist)
167{
168 parseConfig("blacklist\n"
169 "{\n"
170 " ifname eth0\n"
171 " ifname eth1\n"
172 "}");
173
Junxiao Shi2760adc2017-07-06 05:44:52 +0000174 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
175 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
176 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
177 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit21f22e62017-03-25 15:44:45 -0500178}
179
180BOOST_AUTO_TEST_CASE(IfnameWildcardStart)
181{
182 parseConfig("whitelist\n"
183 "{\n"
184 " ifname enp*\n"
185 "}");
186
Junxiao Shi2760adc2017-07-06 05:44:52 +0000187 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
188 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
189 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
190 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit21f22e62017-03-25 15:44:45 -0500191}
192
193BOOST_AUTO_TEST_CASE(IfnameWildcardMiddle)
194{
195 parseConfig("whitelist\n"
196 "{\n"
197 " ifname *th*\n"
198 "}");
199
Junxiao Shi2760adc2017-07-06 05:44:52 +0000200 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
201 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
202 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
203 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit21f22e62017-03-25 15:44:45 -0500204}
205
206BOOST_AUTO_TEST_CASE(IfnameWildcardDouble)
207{
208 parseConfig("whitelist\n"
209 "{\n"
210 " ifname eth**\n"
211 "}");
212
Junxiao Shi2760adc2017-07-06 05:44:52 +0000213 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
214 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
215 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
216 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit21f22e62017-03-25 15:44:45 -0500217}
218
219BOOST_AUTO_TEST_CASE(IfnameWildcardOnly)
220{
221 parseConfig("whitelist\n"
222 "{\n"
223 " ifname *\n"
224 "}");
225
Junxiao Shi2760adc2017-07-06 05:44:52 +0000226 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
227 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
228 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
229 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit21f22e62017-03-25 15:44:45 -0500230}
231
232BOOST_AUTO_TEST_CASE(IfnameQuestionMark)
233{
234 parseConfig("whitelist\n"
235 "{\n"
236 " ifname eth?\n"
237 "}");
238
Junxiao Shi2760adc2017-07-06 05:44:52 +0000239 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
240 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
241 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
242 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600243}
244
245BOOST_AUTO_TEST_CASE(IfnameMalformed)
246{
247 BOOST_CHECK_THROW(
248 parseConfig("whitelist\n"
249 "{\n"
250 " ifname\n"
251 "}"),
252 ConfigFile::Error);
253}
254
255BOOST_AUTO_TEST_CASE(EtherWhitelist)
256{
257 parseConfig("whitelist\n"
258 "{\n"
259 " ether 3e:15:c2:8b:65:00\n"
260 " ether 3e:15:c2:8b:65:01\n"
261 "}");
262
Junxiao Shi2760adc2017-07-06 05:44:52 +0000263 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
264 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
265 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
266 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600267}
268
269BOOST_AUTO_TEST_CASE(EtherBlacklist)
270{
271 parseConfig("blacklist\n"
272 "{\n"
273 " ether 3e:15:c2:8b:65:00\n"
274 " ether 3e:15:c2:8b:65:01\n"
275 "}");
276
Junxiao Shi2760adc2017-07-06 05:44:52 +0000277 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
278 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
279 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
280 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit91e1d7c2016-10-03 16:16:57 -0600281}
282
283BOOST_AUTO_TEST_CASE(EtherMalformed)
284{
285 BOOST_CHECK_THROW(
286 parseConfig("blacklist\n"
287 "{\n"
288 " ether foo\n"
289 "}"),
290 ConfigFile::Error);
291}
292
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -0400293BOOST_AUTO_TEST_CASE(Subnet4Whitelist)
susmit91e1d7c2016-10-03 16:16:57 -0600294{
295 parseConfig("whitelist\n"
296 "{\n"
297 " subnet 192.168.0.0/16\n"
298 "}");
299
Junxiao Shi2760adc2017-07-06 05:44:52 +0000300 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
301 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
302 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
303 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
susmit91e1d7c2016-10-03 16:16:57 -0600304}
305
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -0400306BOOST_AUTO_TEST_CASE(Subnet4Blacklist)
susmit91e1d7c2016-10-03 16:16:57 -0600307{
308 parseConfig("blacklist\n"
309 "{\n"
310 " subnet 192.168.0.0/16\n"
311 "}");
312
Junxiao Shi2760adc2017-07-06 05:44:52 +0000313 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
314 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
315 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
316 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
susmit91e1d7c2016-10-03 16:16:57 -0600317}
318
Alexander Afanasyev3bdc1de2018-04-03 17:33:31 -0400319BOOST_AUTO_TEST_CASE(Subnet6Whitelist)
320{
321 parseConfig("whitelist\n"
322 "{\n"
323 " subnet 2001:db8:2::1/120\n"
324 "}");
325
326 BOOST_CHECK_EQUAL(predicate(*netifs[0]), false);
327 BOOST_CHECK_EQUAL(predicate(*netifs[1]), true);
328 BOOST_CHECK_EQUAL(predicate(*netifs[2]), false);
329 BOOST_CHECK_EQUAL(predicate(*netifs[3]), false);
330}
331
332BOOST_AUTO_TEST_CASE(Subnet6Blacklist)
333{
334 parseConfig("blacklist\n"
335 "{\n"
336 " subnet 2001:db8:2::1/120\n"
337 "}");
338
339 BOOST_CHECK_EQUAL(predicate(*netifs[0]), true);
340 BOOST_CHECK_EQUAL(predicate(*netifs[1]), false);
341 BOOST_CHECK_EQUAL(predicate(*netifs[2]), true);
342 BOOST_CHECK_EQUAL(predicate(*netifs[3]), true);
343}
344
susmit91e1d7c2016-10-03 16:16:57 -0600345BOOST_AUTO_TEST_CASE(SubnetMalformed)
346{
347 BOOST_CHECK_THROW(
348 parseConfig("blacklist\n"
349 "{\n"
350 " subnet 266.0.0.91/\n"
351 "}"),
352 ConfigFile::Error);
353}
354
355BOOST_AUTO_TEST_SUITE_END() // TestNetworkInterfacePredicate
356
357} // namespace tests
358} // namespace nfd