blob: 4020d45bb99ca7d261dfd6ef6ae28fb8416ba2f2 [file] [log] [blame]
Junxiao Shi2222a612015-06-06 08:01:38 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento60f8cc12018-05-10 22:05:21 -04002/*
3 * Copyright (c) 2014-2018, Regents of the University of California.
Junxiao Shi3cd47df2015-06-07 20:58:14 -07004 *
5 * This file is part of ndn-tools (Named Data Networking Essential Tools).
6 * See AUTHORS.md for complete list of ndn-tools authors and contributors.
7 *
8 * ndn-tools is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
11 *
12 * ndn-tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * ndn-tools, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 */
Davide Pesavento60f8cc12018-05-10 22:05:21 -040019/*
Junxiao Shi2222a612015-06-06 08:01:38 -070020 * Copyright (c) 2011-2014, Regents of the University of California,
21 *
22 * This file is part of ndndump, the packet capture and analysis tool for Named Data
23 * Networking (NDN).
24 *
25 * ndndump is free software: you can redistribute it and/or modify it under the terms
26 * of the GNU General Public License as published by the Free Software Foundation,
27 * either version 3 of the License, or (at your option) any later version.
28 *
29 * ndndump is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
30 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
31 * PURPOSE. See the GNU General Public License for more details.
32 *
33 * You should have received a copy of the GNU General Public License along with
34 * ndndump, e.g., in COPYING file. If not, see <http://www.gnu.org/licenses/>.
35 **/
36
37#include "ndndump.hpp"
38
Davide Pesavento051db002018-07-22 18:56:16 -040039#include <net/ethernet.h>
40#include <netinet/ip.h>
41#include <netinet/tcp.h>
42#include <netinet/udp.h>
Junxiao Shi2222a612015-06-06 08:01:38 -070043
Junxiao Shi022bddf2016-11-24 23:15:20 +000044#include <pcap/sll.h>
45
Junxiao Shi2222a612015-06-06 08:01:38 -070046#include <iomanip>
Davide Pesaventoc0702702017-08-24 22:04:00 -040047#include <sstream>
Junxiao Shi2222a612015-06-06 08:01:38 -070048
Vince Lehman277ecf02016-02-10 16:37:48 -060049#include <ndn-cxx/lp/nack.hpp>
50#include <ndn-cxx/lp/packet.hpp>
Davide Pesaventoecd44802018-07-23 23:48:10 -040051#include <ndn-cxx/net/ethernet.hpp>
Junxiao Shi2222a612015-06-06 08:01:38 -070052
53namespace ndn {
Junxiao Shi3cd47df2015-06-07 20:58:14 -070054namespace dump {
Junxiao Shi2222a612015-06-06 08:01:38 -070055
Davide Pesaventoecd44802018-07-23 23:48:10 -040056NdnDump::~NdnDump()
Junxiao Shic1c2b832016-07-24 20:45:36 +000057{
Davide Pesaventoecd44802018-07-23 23:48:10 -040058 if (m_pcap)
59 pcap_close(m_pcap);
60}
61
62static void
63pcapCallback(uint8_t* user, const pcap_pkthdr* pkthdr, const uint8_t* payload)
64{
65 reinterpret_cast<const NdnDump*>(user)->printPacket(pkthdr, payload);
Junxiao Shic1c2b832016-07-24 20:45:36 +000066}
67
Junxiao Shi2222a612015-06-06 08:01:38 -070068void
Davide Pesaventoecd44802018-07-23 23:48:10 -040069NdnDump::run()
Junxiao Shi2222a612015-06-06 08:01:38 -070070{
Davide Pesaventoecd44802018-07-23 23:48:10 -040071 char errbuf[PCAP_ERRBUF_SIZE];
Junxiao Shi2222a612015-06-06 08:01:38 -070072
Davide Pesaventoecd44802018-07-23 23:48:10 -040073 if (inputFile.empty() && interface.empty()) {
74 const char* defaultDevice = pcap_lookupdev(errbuf);
75
76 if (defaultDevice == nullptr) {
Junxiao Shic7599632016-07-24 20:46:24 +000077 BOOST_THROW_EXCEPTION(Error(errbuf));
Junxiao Shi2222a612015-06-06 08:01:38 -070078 }
79
Davide Pesaventoecd44802018-07-23 23:48:10 -040080 interface = defaultDevice;
Junxiao Shi2222a612015-06-06 08:01:38 -070081 }
82
Davide Pesaventoecd44802018-07-23 23:48:10 -040083 std::string action;
Junxiao Shi2222a612015-06-06 08:01:38 -070084 if (!interface.empty()) {
Davide Pesavento24c08612018-07-26 13:33:24 -040085 m_pcap = pcap_open_live(interface.data(), 65535, wantPromisc, 1000, errbuf);
Junxiao Shic1c2b832016-07-24 20:45:36 +000086 if (m_pcap == nullptr) {
Davide Pesaventoecd44802018-07-23 23:48:10 -040087 BOOST_THROW_EXCEPTION(Error("Cannot open interface " + interface + ": " + errbuf));
Junxiao Shi2222a612015-06-06 08:01:38 -070088 }
Davide Pesaventoecd44802018-07-23 23:48:10 -040089 action = "listening on " + interface;
Junxiao Shi2222a612015-06-06 08:01:38 -070090 }
91 else {
Davide Pesavento78de7352018-07-22 00:35:45 -040092 m_pcap = pcap_open_offline(inputFile.data(), errbuf);
Junxiao Shic1c2b832016-07-24 20:45:36 +000093 if (m_pcap == nullptr) {
Davide Pesaventoecd44802018-07-23 23:48:10 -040094 BOOST_THROW_EXCEPTION(Error("Cannot open file '" + inputFile + "' for reading: " + errbuf));
Junxiao Shi2222a612015-06-06 08:01:38 -070095 }
Davide Pesaventoecd44802018-07-23 23:48:10 -040096 action = "reading from file " + inputFile;
Junxiao Shi2222a612015-06-06 08:01:38 -070097 }
98
Davide Pesaventoecd44802018-07-23 23:48:10 -040099 m_dataLinkType = pcap_datalink(m_pcap);
100 const char* dltName = pcap_datalink_val_to_name(m_dataLinkType);
101 const char* dltDesc = pcap_datalink_val_to_description(m_dataLinkType);
102 std::string formattedDlt = dltName ? dltName : to_string(m_dataLinkType);
103 if (dltDesc) {
104 formattedDlt += " ("s + dltDesc + ")";
105 }
106
107 std::cerr << "ndndump: " << action << ", link-type " << formattedDlt << std::endl;
108
109 switch (m_dataLinkType) {
110 case DLT_EN10MB:
111 case DLT_LINUX_SLL:
112 case DLT_PPP:
113 // we know how to handle these
114 break;
115 default:
116 BOOST_THROW_EXCEPTION(Error("Unsupported link-layer header type " + formattedDlt));
117 }
118
119 if (!pcapFilter.empty()) {
Davide Pesavento24c08612018-07-26 13:33:24 -0400120 if (wantVerbose) {
Davide Pesaventoecd44802018-07-23 23:48:10 -0400121 std::cerr << "ndndump: using pcap filter: " << pcapFilter << std::endl;
Junxiao Shi2222a612015-06-06 08:01:38 -0700122 }
123
124 bpf_program program;
Davide Pesaventofb42a3d2018-07-26 12:33:14 -0400125 int res = pcap_compile(m_pcap, &program, pcapFilter.data(), 1, PCAP_NETMASK_UNKNOWN);
Junxiao Shic1c2b832016-07-24 20:45:36 +0000126 if (res < 0) {
Davide Pesaventofb42a3d2018-07-26 12:33:14 -0400127 BOOST_THROW_EXCEPTION(Error("Cannot compile pcap filter '" + pcapFilter + "': " + pcap_geterr(m_pcap)));
Junxiao Shi2222a612015-06-06 08:01:38 -0700128 }
129
Junxiao Shic1c2b832016-07-24 20:45:36 +0000130 res = pcap_setfilter(m_pcap, &program);
Junxiao Shi2222a612015-06-06 08:01:38 -0700131 pcap_freecode(&program);
Junxiao Shic1c2b832016-07-24 20:45:36 +0000132 if (res < 0) {
Davide Pesaventoecd44802018-07-23 23:48:10 -0400133 BOOST_THROW_EXCEPTION(Error("Cannot set pcap filter: "s + pcap_geterr(m_pcap)));
Junxiao Shi2222a612015-06-06 08:01:38 -0700134 }
135 }
136
Davide Pesaventoecd44802018-07-23 23:48:10 -0400137 if (pcap_loop(m_pcap, -1, &pcapCallback, reinterpret_cast<uint8_t*>(this)) < 0) {
138 BOOST_THROW_EXCEPTION(Error("pcap_loop: "s + pcap_geterr(m_pcap)));
Junxiao Shic1c2b832016-07-24 20:45:36 +0000139 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700140}
141
Junxiao Shi2222a612015-06-06 08:01:38 -0700142void
Davide Pesaventoecd44802018-07-23 23:48:10 -0400143NdnDump::printPacket(const pcap_pkthdr* pkthdr, const uint8_t* payload) const
Junxiao Shi2222a612015-06-06 08:01:38 -0700144{
Davide Pesaventoecd44802018-07-23 23:48:10 -0400145 // sanity checks
146 if (pkthdr->caplen == 0) {
147 std::cout << "[Invalid header: caplen=0]" << std::endl;
148 return;
149 }
150 if (pkthdr->len == 0) {
151 std::cout << "[Invalid header: len=0]" << std::endl;
152 return;
153 }
154 else if (pkthdr->len < pkthdr->caplen) {
155 std::cout << "[Invalid header: len(" << pkthdr->len
156 << ") < caplen(" << pkthdr->caplen << ")]" << std::endl;
157 return;
158 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700159
Davide Pesaventoecd44802018-07-23 23:48:10 -0400160 std::ostringstream os;
Davide Pesaventob5b8f952018-07-26 14:19:16 -0400161 if (wantTimestamp) {
162 printTimestamp(os, pkthdr->ts);
163 }
Davide Pesaventoecd44802018-07-23 23:48:10 -0400164
165 ssize_t payloadSize = pkthdr->len;
Junxiao Shi2222a612015-06-06 08:01:38 -0700166
167 int frameType = skipDataLinkHeaderAndGetFrameType(payload, payloadSize);
168 if (frameType < 0) {
Junxiao Shi2222a612015-06-06 08:01:38 -0700169 return;
170 }
171
Junxiao Shic1c2b832016-07-24 20:45:36 +0000172 int res = skipAndProcessFrameHeader(frameType, payload, payloadSize, os);
173 if (res < 0) {
Junxiao Shi2222a612015-06-06 08:01:38 -0700174 return;
175 }
176
177 bool isOk = false;
178 Block block;
179 std::tie(isOk, block) = Block::fromBuffer(payload, payloadSize);
180 if (!isOk) {
Vince Lehman277ecf02016-02-10 16:37:48 -0600181 // if packet is incomplete, we will not be able to process it
182 if (payloadSize > 0) {
183 std::cout << os.str() << ", " << "INCOMPLETE-PACKET" << ", size: " << payloadSize << std::endl;
184 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700185 return;
186 }
187
Vince Lehman277ecf02016-02-10 16:37:48 -0600188 lp::Packet lpPacket;
189 Block netPacket;
190
191 if (block.type() == lp::tlv::LpPacket) {
Davide Pesaventod1b1bf62018-07-26 18:05:08 -0400192 try {
193 lpPacket.wireDecode(block);
194 }
195 catch (const tlv::Error& e) {
196 std::cout << os.str() << ", " << "INVALID-NDNLPv2-PACKET: " << e.what() << std::endl;
197 return;
198 }
Vince Lehman277ecf02016-02-10 16:37:48 -0600199
200 Buffer::const_iterator begin, end;
Vince Lehman277ecf02016-02-10 16:37:48 -0600201 if (lpPacket.has<lp::FragmentField>()) {
202 std::tie(begin, end) = lpPacket.get<lp::FragmentField>();
203 }
204 else {
205 std::cout << os.str() << ", " << "NDNLPv2-IDLE" << std::endl;
206 return;
207 }
208
209 bool isOk = false;
210 std::tie(isOk, netPacket) = Block::fromBuffer(&*begin, std::distance(begin, end));
211 if (!isOk) {
212 // if network packet is fragmented, we will not be able to process it
213 std::cout << os.str() << ", " << "NDNLPv2-FRAGMENT" << std::endl;
214 return;
215 }
216 }
217 else {
218 netPacket = block;
219 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700220
221 try {
Vince Lehman277ecf02016-02-10 16:37:48 -0600222 if (netPacket.type() == tlv::Interest) {
223 Interest interest(netPacket);
Junxiao Shi2222a612015-06-06 08:01:38 -0700224 if (matchesFilter(interest.getName())) {
Vince Lehman277ecf02016-02-10 16:37:48 -0600225 if (lpPacket.has<lp::NackField>()) {
226 lp::Nack nack(interest);
227 nack.setHeader(lpPacket.get<lp::NackField>());
Vince Lehman277ecf02016-02-10 16:37:48 -0600228 std::cout << os.str() << ", " << "NACK: " << nack.getReason() << ", " << interest << std::endl;
229 }
230 else {
231 std::cout << os.str() << ", " << "INTEREST: " << interest << std::endl;
232 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700233 }
234 }
Vince Lehman277ecf02016-02-10 16:37:48 -0600235 else if (netPacket.type() == tlv::Data) {
236 Data data(netPacket);
Junxiao Shi2222a612015-06-06 08:01:38 -0700237 if (matchesFilter(data.getName())) {
238 std::cout << os.str() << ", " << "DATA: " << data.getName() << std::endl;
239 }
240 }
Vince Lehman277ecf02016-02-10 16:37:48 -0600241 else {
242 std::cout << os.str() << ", " << "UNKNOWN-NETWORK-PACKET" << std::endl;
243 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700244 }
Junxiao Shic1c2b832016-07-24 20:45:36 +0000245 catch (const tlv::Error& e) {
Davide Pesaventod1b1bf62018-07-26 18:05:08 -0400246 std::cout << os.str() << ", " << "INVALID-PACKET: " << e.what() << std::endl;
Junxiao Shi2222a612015-06-06 08:01:38 -0700247 }
248}
249
250void
Davide Pesaventoecd44802018-07-23 23:48:10 -0400251NdnDump::printTimestamp(std::ostream& os, const timeval& tv) const
Junxiao Shi2222a612015-06-06 08:01:38 -0700252{
Davide Pesaventoecd44802018-07-23 23:48:10 -0400253 /// \todo Add more timestamp formats (time since previous packet, time since first packet, ...)
254 os << tv.tv_sec
Junxiao Shi2222a612015-06-06 08:01:38 -0700255 << "."
Davide Pesaventoecd44802018-07-23 23:48:10 -0400256 << std::setfill('0') << std::setw(6) << tv.tv_usec
257 << " ";
Junxiao Shi2222a612015-06-06 08:01:38 -0700258}
259
260int
Davide Pesaventoecd44802018-07-23 23:48:10 -0400261NdnDump::skipDataLinkHeaderAndGetFrameType(const uint8_t*& payload, ssize_t& payloadSize) const
Junxiao Shi2222a612015-06-06 08:01:38 -0700262{
Davide Pesaventoecd44802018-07-23 23:48:10 -0400263 int frameType = -1;
Junxiao Shi2222a612015-06-06 08:01:38 -0700264
265 switch (m_dataLinkType) {
Junxiao Shic1c2b832016-07-24 20:45:36 +0000266 case DLT_EN10MB: { // Ethernet frames can have Ethernet or 802.3 encapsulation
Davide Pesaventoecd44802018-07-23 23:48:10 -0400267 const ether_header* eh = reinterpret_cast<const ether_header*>(payload);
Junxiao Shi2222a612015-06-06 08:01:38 -0700268
Davide Pesaventoecd44802018-07-23 23:48:10 -0400269 if (payloadSize < ETHER_HDR_LEN) {
270 std::cerr << "Invalid Ethernet frame" << std::endl;
Junxiao Shi2222a612015-06-06 08:01:38 -0700271 return -1;
272 }
273
Davide Pesaventoecd44802018-07-23 23:48:10 -0400274 frameType = ntohs(eh->ether_type);
Davide Pesavento051db002018-07-22 18:56:16 -0400275 payloadSize -= ETHER_HDR_LEN;
276 payload += ETHER_HDR_LEN;
Junxiao Shi2222a612015-06-06 08:01:38 -0700277
278 break;
279 }
Junxiao Shic1c2b832016-07-24 20:45:36 +0000280 case DLT_PPP: {
Junxiao Shi2222a612015-06-06 08:01:38 -0700281 frameType = *payload;
Junxiao Shic1c2b832016-07-24 20:45:36 +0000282 --payloadSize;
283 ++payload;
Junxiao Shi2222a612015-06-06 08:01:38 -0700284
285 if (!(frameType & 1)) {
286 frameType = (frameType << 8) | *payload;
Junxiao Shic1c2b832016-07-24 20:45:36 +0000287 --payloadSize;
288 ++payload;
Junxiao Shi2222a612015-06-06 08:01:38 -0700289 }
290
Davide Pesaventoecd44802018-07-23 23:48:10 -0400291 if (payloadSize < 4) { // PPP_HDRLEN in linux/ppp_defs.h
Junxiao Shi2222a612015-06-06 08:01:38 -0700292 std::cerr << "Invalid PPP frame" << std::endl;
293 return -1;
294 }
295
296 break;
297 }
Junxiao Shi022bddf2016-11-24 23:15:20 +0000298 case DLT_LINUX_SLL: {
Davide Pesaventoecd44802018-07-23 23:48:10 -0400299 const sll_header* sll = reinterpret_cast<const sll_header*>(payload);
Junxiao Shi022bddf2016-11-24 23:15:20 +0000300
301 if (payloadSize < SLL_HDR_LEN) {
302 std::cerr << "Invalid LINUX_SLL frame" << std::endl;
303 return -1;
304 }
305
Davide Pesaventoecd44802018-07-23 23:48:10 -0400306 frameType = ntohs(sll->sll_protocol);
Junxiao Shi022bddf2016-11-24 23:15:20 +0000307 payloadSize -= SLL_HDR_LEN;
308 payload += SLL_HDR_LEN;
309
310 break;
311 }
Davide Pesaventoecd44802018-07-23 23:48:10 -0400312 default:
313 std::cerr << "Unknown frame type" << std::endl;
314 break;
Junxiao Shi2222a612015-06-06 08:01:38 -0700315 }
316
317 return frameType;
318}
319
320int
Davide Pesaventoecd44802018-07-23 23:48:10 -0400321NdnDump::skipAndProcessFrameHeader(int frameType, const uint8_t*& payload, ssize_t& payloadSize,
Junxiao Shic1c2b832016-07-24 20:45:36 +0000322 std::ostream& os) const
Junxiao Shi2222a612015-06-06 08:01:38 -0700323{
Junxiao Shic1c2b832016-07-24 20:45:36 +0000324 switch (frameType) {
Davide Pesaventoecd44802018-07-23 23:48:10 -0400325 case ETHERTYPE_IP:
Junxiao Shic1c2b832016-07-24 20:45:36 +0000326 case DLT_EN10MB: { // pcap encapsulation
327 const ip* ipHeader = reinterpret_cast<const ip*>(payload);
Davide Pesavento051db002018-07-22 18:56:16 -0400328 size_t ipHeaderSize = ipHeader->ip_hl * 4;
Junxiao Shic1c2b832016-07-24 20:45:36 +0000329 if (ipHeaderSize < 20) {
Davide Pesaventoecd44802018-07-23 23:48:10 -0400330 std::cerr << "Invalid IPv4 header len: " << ipHeaderSize << " bytes" << std::endl;
Junxiao Shic1c2b832016-07-24 20:45:36 +0000331 return -1;
332 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700333
Junxiao Shic1c2b832016-07-24 20:45:36 +0000334 os << "From: " << inet_ntoa(ipHeader->ip_src) << ", ";
335 os << "To: " << inet_ntoa(ipHeader->ip_dst);
Junxiao Shi2222a612015-06-06 08:01:38 -0700336
Junxiao Shic1c2b832016-07-24 20:45:36 +0000337 payloadSize -= ipHeaderSize;
338 payload += ipHeaderSize;
Junxiao Shi2222a612015-06-06 08:01:38 -0700339
Junxiao Shic1c2b832016-07-24 20:45:36 +0000340 if (payloadSize < 0) {
Davide Pesaventoecd44802018-07-23 23:48:10 -0400341 std::cerr << "Invalid IPv4 packet" << std::endl;
Junxiao Shic1c2b832016-07-24 20:45:36 +0000342 return -1;
343 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700344
Junxiao Shic1c2b832016-07-24 20:45:36 +0000345 switch (ipHeader->ip_p) {
346 case IPPROTO_UDP: {
Junxiao Shic1c2b832016-07-24 20:45:36 +0000347 payloadSize -= sizeof(udphdr);
348 payload += sizeof(udphdr);
Junxiao Shi2222a612015-06-06 08:01:38 -0700349
Junxiao Shic1c2b832016-07-24 20:45:36 +0000350 if (payloadSize < 0) {
Davide Pesaventoecd44802018-07-23 23:48:10 -0400351 std::cerr << "Invalid UDP/IP packet" << std::endl;
Junxiao Shic1c2b832016-07-24 20:45:36 +0000352 return -1;
Junxiao Shi2222a612015-06-06 08:01:38 -0700353 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700354
Junxiao Shic1c2b832016-07-24 20:45:36 +0000355 os << ", Tunnel Type: UDP";
356 break;
357 }
358 case IPPROTO_TCP: {
Junxiao Shic1c2b832016-07-24 20:45:36 +0000359 const tcphdr* tcpHeader = reinterpret_cast<const tcphdr*>(payload);
Davide Pesavento051db002018-07-22 18:56:16 -0400360 size_t tcpHeaderSize = tcpHeader->th_off * 4;
Junxiao Shi2222a612015-06-06 08:01:38 -0700361
Junxiao Shic1c2b832016-07-24 20:45:36 +0000362 if (tcpHeaderSize < 20) {
Davide Pesaventoecd44802018-07-23 23:48:10 -0400363 std::cerr << "Invalid TCP header len: " << tcpHeaderSize << " bytes" << std::endl;
Junxiao Shic1c2b832016-07-24 20:45:36 +0000364 return -1;
Junxiao Shi2222a612015-06-06 08:01:38 -0700365 }
Junxiao Shic1c2b832016-07-24 20:45:36 +0000366
367 payloadSize -= tcpHeaderSize;
368 payload += tcpHeaderSize;
369
370 if (payloadSize < 0) {
Davide Pesaventoecd44802018-07-23 23:48:10 -0400371 std::cerr << "Invalid TCP/IP packet" << std::endl;
Junxiao Shic1c2b832016-07-24 20:45:36 +0000372 return -1;
373 }
374
375 os << ", Tunnel Type: TCP";
376 break;
377 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700378 default:
379 return -1;
Junxiao Shi2222a612015-06-06 08:01:38 -0700380 }
Junxiao Shic1c2b832016-07-24 20:45:36 +0000381 break;
382 }
Davide Pesaventoecd44802018-07-23 23:48:10 -0400383 case ethernet::ETHERTYPE_NDN:
384 case 0x7777: // NDN ethertype used in ndnSIM
Junxiao Shi2222a612015-06-06 08:01:38 -0700385 os << "Tunnel Type: EthernetFrame";
386 break;
Davide Pesaventoecd44802018-07-23 23:48:10 -0400387 case 0x0077: // protocol field in PPP header used in ndnSIM
Junxiao Shi2222a612015-06-06 08:01:38 -0700388 os << "Tunnel Type: PPP";
389 payloadSize -= 2;
390 payload += 2;
391 break;
Junxiao Shic1c2b832016-07-24 20:45:36 +0000392 default: // do nothing if it is not a recognized type of a packet
Junxiao Shi2222a612015-06-06 08:01:38 -0700393 return -1;
Junxiao Shic1c2b832016-07-24 20:45:36 +0000394 }
Junxiao Shi2222a612015-06-06 08:01:38 -0700395
396 return 0;
397}
398
Junxiao Shic1c2b832016-07-24 20:45:36 +0000399bool
Davide Pesaventoecd44802018-07-23 23:48:10 -0400400NdnDump::matchesFilter(const Name& name) const
Junxiao Shic1c2b832016-07-24 20:45:36 +0000401{
Davide Pesavento78de7352018-07-22 00:35:45 -0400402 if (!nameFilter)
Junxiao Shic1c2b832016-07-24 20:45:36 +0000403 return true;
404
405 /// \todo Switch to NDN regular expressions
Davide Pesavento78de7352018-07-22 00:35:45 -0400406 return std::regex_match(name.toUri(), *nameFilter);
Junxiao Shic1c2b832016-07-24 20:45:36 +0000407}
408
Junxiao Shi3cd47df2015-06-07 20:58:14 -0700409} // namespace dump
Junxiao Shi2222a612015-06-06 08:01:38 -0700410} // namespace ndn