-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Netdump library #6518
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
Changes from 20 commits
694732f
c9ce6e8
d17f83d
b1912a8
da5307f
9545dd3
11426ee
9915230
a3e83f6
eea5caa
d15f9d9
de46b48
e7886ce
f05a6f3
328f240
a5b3ad7
6f4fb0c
112c039
4f099cb
3d41d25
1b77c97
4398807
d1a142b
5803720
89485e8
a0f1e5a
8e72ecb
9be3d13
5cdee28
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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.... | ||
|
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 |
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) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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(); | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Empty file? |
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 |
Uh oh!
There was an error while loading. Please reload this page.