Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Netdump library #6518

Closed
wants to merge 29 commits into from
Closed
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
694732f
Netdump library, initial commit
hreintke Sep 14, 2019
c9ce6e8
Merge branch 'master' into NetdumpLibrary
earlephilhower Oct 1, 2019
d17f83d
Const update
hreintke Nov 12, 2019
b1912a8
Merge branch 'NetdumpLibrary' of https://github.com/hreintke/Arduino …
hreintke Nov 12, 2019
da5307f
Cleanup, added example
hreintke Nov 12, 2019
9545dd3
Example should start Serial by default.
hreintke Nov 12, 2019
11426ee
Further cleanup
hreintke Nov 13, 2019
9915230
Add PacketType & restructure printing using that
hreintke Nov 15, 2019
a3e83f6
Updates relating to @devyte comments
hreintke Nov 17, 2019
eea5caa
update pcap header writing & adding consts
hreintke Nov 18, 2019
d15f9d9
Improve NetdumpPacket type testing and content retrieval
hreintke Nov 18, 2019
de46b48
Updates related to remarks
hreintke Nov 18, 2019
e7886ce
Merge branch 'master' into NetdumpLibrary
hreintke Nov 21, 2019
f05a6f3
Restructure PacketType
hreintke Nov 24, 2019
328f240
Restructure printing, add PacketDetail::RAW
hreintke Nov 24, 2019
a5b3ad7
Fix printing
hreintke Nov 25, 2019
6f4fb0c
Use CallbackList to facilitate multiple Netdump instances
hreintke Nov 26, 2019
112c039
Separate commit to show update on experimental CallbackList
hreintke Dec 5, 2019
4f099cb
Further cleanup
hreintke Dec 5, 2019
3d41d25
Style update and small changes
hreintke May 3, 2020
1b77c97
wip
hreintke May 24, 2020
4398807
Merge branch 'master' into NetdumpLibrary
hreintke May 24, 2020
d1a142b
Use std::unique_ptr to prevent memory leak
hreintke May 27, 2020
5803720
Add LLMR
hreintke Jun 8, 2020
89485e8
Merge branch 'master' into NetdumpLibrary
d-a-v Aug 12, 2020
a0f1e5a
use LittleFS
d-a-v Aug 12, 2020
8e72ecb
Merge branch 'master' into NetdumpLibrary
d-a-v Aug 12, 2020
9be3d13
fixed "unused parameter"
d-a-v Aug 12, 2020
5cdee28
Merge branch 'NetdumpLibrary' of https://github.com/hreintke/Arduino …
hreintke Aug 14, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cores/esp8266/CallBackList.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class CallBackList
}

template<typename... Args>
void execute(Args... params) {
int execute(Args... params) {
for(auto it = std::begin(callBackEventList); it != std::end(callBackEventList); ) {
CallBackHandler &handler = *it;
if (handler->allowRemove() && handler.unique()) {
Expand All @@ -75,6 +75,7 @@ class CallBackList
++it;
}
}
return callBackEventList.size();
}
};

Expand Down
52 changes: 52 additions & 0 deletions libraries/Netdump/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@

esp8266/Arduino goodies
-----------------------

* NetDump (lwip2)
Packet sniffer library to help study network issues, check example-sketches
Log examples on serial console:
```
14:07:01.854 -> in 0 ARP who has 10.43.1.117 tell 10.43.1.254
14:07:01.854 -> out 0 ARP 10.43.1.117 is at 5c:cf:7f:c3:ad:51

[...] hello-world, dumped in packets:
14:07:46.227 -> in 0 IPv4 10.43.1.254>10.43.1.117 TCP 54546>2[P.] seq:1945448681..1945448699 ack:6618 win:29200 len=18
14:07:46.260 -> 5c cf 7f c3 ad 51 74 da 38 3a 1f 61 08 00 45 10 \..Qt.8:.a..E.
14:07:46.260 -> 00 3a b2 bc 40 00 40 06 70 29 0a 2b 01 fe 0a 2b .:..@.@.p).+...+
14:07:46.260 -> 01 75 d5 12 00 02 73 f5 30 e9 00 00 19 da 50 18 .u....s.0.....P.
14:07:46.260 -> 72 10 f8 da 00 00 70 6c 20 68 65 6c 6c 6f 2d 77 r.....pl hello-w
14:07:46.260 -> 6f 72 6c 64 20 31 0d 0a orld 1..
14:07:46.294 -> out 0 IPv4 10.43.1.117>10.43.1.254 TCP 2>54546[P.] seq:6618..6619 ack:1945448699 win:2126 len=1
14:07:46.326 -> 00 20 00 00 00 00 aa aa 03 00 00 00 08 00 45 00 . ............E.
14:07:46.326 -> 00 29 00 0d 00 00 ff 06 a3 f9 0a 2b 01 75 0a 2b .).........+.u.+
14:07:46.327 -> 01 fe 00 02 d5 12 00 00 19 da 73 f5 30 fb 50 18 ..........s.0.P.
14:07:46.327 -> 08 4e 93 d5 00 00 68 .N....h
14:07:46.327 -> in 0 IPv4 10.43.1.254>10.43.1.117 TCP 54546>2[.] seq:1945448699 ack:6619 win:29200
14:07:46.327 -> 5c cf 7f c3 ad 51 74 da 38 3a 1f 61 08 00 45 10 \..Qt.8:.a..E.
14:07:46.360 -> 00 28 b2 bd 40 00 40 06 70 3a 0a 2b 01 fe 0a 2b .(..@.@.p:.+...+
14:07:46.360 -> 01 75 d5 12 00 02 73 f5 30 fb 00 00 19 db 50 10 .u....s.0.....P.
14:07:46.360 -> 72 10 92 1b 00 00 r.....
14:07:46.360 -> out 0 IPv4 10.43.1.117>10.43.1.254 TCP 2>54546[P.] seq:6619..6630 ack:1945448699 win:2126 len=11
14:07:46.360 -> 00 20 00 00 00 00 aa aa 03 00 00 00 08 00 45 00 . ............E.
14:07:46.360 -> 00 33 00 0e 00 00 ff 06 a3 ee 0a 2b 01 75 0a 2b .3.........+.u.+
14:07:46.393 -> 01 fe 00 02 d5 12 00 00 19 db 73 f5 30 fb 50 18 ..........s.0.P.
14:07:46.393 -> 08 4e 16 a1 00 00 65 6c 6c 6f 2d 77 6f 72 6c 64 .N....ello-world
14:07:46.393 -> 0a .

[...] help protocol decoding from inside the esp
14:08:11.715 -> in 0 IPv4 10.43.1.254>239.255.255.250 UDP 50315>1900 len=172
14:08:11.716 -> 01 00 5e 7f ff fa 74 da 38 3a 1f 61 08 00 45 00 ....t.8:.a..E.
14:08:11.716 -> 00 c8 9b 40 40 00 01 11 e1 c1 0a 2b 01 fe ef ff ...@@......+....
14:08:11.749 -> ff fa c4 8b 07 6c 00 b4 9c 28 4d 2d 53 45 41 52 .....l...(M-SEAR
14:08:11.749 -> 43 48 20 2a 20 48 54 54 50 2f 31 2e 31 0d 0a 48 CH * HTTP/1.1..H
14:08:11.749 -> 4f 53 54 3a 20 32 33 39 2e 32 35 35 2e 32 35 35 OST: 239.255.255
14:08:11.749 -> 2e 32 35 30 3a 31 39 30 30 0d 0a 4d 41 4e 3a 20 .250:1900..MAN:
14:08:11.749 -> 22 73 73 64 70 3a 64 69 73 63 6f 76 65 72 22 0d "ssdp:discover".
14:08:11.749 -> 0a 4d 58 3a 20 31 0d 0a 53 54 3a 20 75 72 6e 3a .MX: 1..ST: urn:
14:08:11.782 -> 64 69 61 6c 2d 6d 75 6c 74 69 73 63 72 65 65 6e dial-multiscreen
14:08:11.782 -> 2d 6f 72 67 3a 73 65 72 76 69 63 65 3a 64 69 61 -org:service:dia
14:08:11.782 -> 6c 3a 31 0d 0a 55 53 45 52 2d 41 47 45 4e 54 3a l:1..USER-AGENT:
14:08:11.782 -> 20 47 6f 6f 67 6c 65 20 43 68 72 6f 6d 65 2f 36 Google Chrome/6
14:08:11.782 -> 36 2e 30 2e 33 33 35 39 2e 31 31 37 20 4c 69 6e 6.0.3359.117 Lin
14:08:11.782 -> 75 78 0d 0a 0d 0a ux....

32 changes: 32 additions & 0 deletions libraries/Netdump/astyle_goodies.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Code formatting rules for Arduino examples, taken from:
#
# https://github.com/arduino/Arduino/blob/master/build/shared/examples_formatter.conf
#

mode=c
lineend=linux
style=allman

# 4 spaces indentation
indent=spaces=4

# also indent macros
#indent-preprocessor

# indent classes, switches (and cases), comments starting at column 1
indent-col1-comments

# put a space around operators
pad-oper

# put a space after if/for/while
pad-header

# if you like one-liners, keep them
keep-one-line-statements

attach-closing-while
unpad-paren
pad-oper
remove-comment-prefix
add-braces
155 changes: 155 additions & 0 deletions libraries/Netdump/examples/Netdump/Netdump.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
#include "Arduino.h"

#include "Netdump.h"
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <FS.h>
#include <map>

using namespace NetCapture;

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

Netdump nd;

FS* filesystem = &SPIFFS;
//FS* filesystem = &LittleFS;

ESP8266WebServer webServer(80); // Used for sending commands
WiFiServer tcpServer(8000); // Used to show netcat option.
File tracefile;

std::map<PacketType, int> packetCount;

enum SerialOption {
AllFull,
LocalNone,
HTTPChar
};

void startSerial(int option) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The switch was changed, but the arg is still received as an int.

switch (option) {
case AllFull : //All Packets, show packet summary.
nd.printDump(Serial, Packet::PacketDetail::FULL);
break;

case LocalNone : // Only local IP traffic, full details
nd.printDump(Serial, Packet::PacketDetail::NONE,
[](Packet n) {
return (n.hasIP(WiFi.localIP()));
}
);
break;
case HTTPChar : // Only HTTP traffic, show packet content as chars
nd.printDump(Serial, Packet::PacketDetail::CHAR,
[](Packet n) {
return (n.isHTTP());
}
);
break;
default :
Serial.printf("No valid SerialOption provided\r\n");
};
}

void startTracefile() {
// To file all traffic, format pcap file
tracefile = filesystem->open("/tr.pcap", "w");
nd.fileDump(tracefile);
}

void startTcpDump() {
// To tcpserver, all traffic.
tcpServer.begin();
nd.tcpDump(tcpServer);
}

void setup(void) {
Serial.begin(115200);

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("WiFi Failed");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given that what comes next is an infinite loop, I suggest: "WiFiFailed, stopping sketch". I've been confused by these things myself.

while (1) {
delay(1000);
}
}

if (!MDNS.begin("netdumphost")) {
Serial.println("Error setting up MDNS responder!");
}

filesystem->begin();

webServer.on("/list",
[]() {
Dir dir = filesystem->openDir("/");
String d = "<h1>File list</h1>";
while (dir.next()) {
d.concat("<li>" + dir.fileName() + "</li>");
}
webServer.send(200, "text.html", d);
}
);

webServer.on("/req",
[]() {
static int rq = 0;
String a = "<h1>You are connected, Number of requests = " + String(rq++) + "</h1>";
webServer.send(200, "text/html", a);
}
);

webServer.on("/reset",
[]() {
nd.reset();
tracefile.close();
tcpServer.close();
webServer.send(200, "text.html", "<h1>Netdump session reset</h1>");
}
);

webServer.serveStatic("/", *filesystem, "/");
webServer.begin();

startSerial(AllFull); // Serial output examples, use enum SerialOption for selection

// startTcpDump(); // tcpdump option
// startTracefile(); // output to SPIFFS or LittleFS

// use a self provide callback, this count network packets
/*
nd.setCallback(
[](Packet p)
{
Serial.printf("PKT : %s : ",p.sourceIP().toString().c_str());
for ( auto pp : p.allPacketTypes())
{
Serial.printf("%s ",pp.toString().c_str());
packetCount[pp]++;
}
Serial.printf("\r\n CNT ");
for (auto pc : packetCount)
{
Serial.printf("%s %d ", pc.first.toString().c_str(),pc.second);
}
Serial.printf("\r\n");
}
);
*/
}

void loop(void) {
webServer.handleClient();
MDNS.update();
}

1 change: 1 addition & 0 deletions libraries/Netdump/keywords.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Empty file?

9 changes: 9 additions & 0 deletions libraries/Netdump/library.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name=NetDump
version=2
author=Herman Reintke
maintainer=Herman Reintke
sentence=tcpdump-like logger for esp8266/Arduino
paragraph=Dumps input / output packets on "Print"able type, or provide a TCP server for the real tcpdump. Check examples. Some other unrelated and independant tools are included.
category=Communication
url=https://
architectures=esp8266 lwip
Loading