Skip to content

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

Closed
wants to merge 29 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Add PacketType & restructure printing using that
  • Loading branch information
hreintke committed Nov 15, 2019
commit 991523024fb6e0ea65046855df3c1dd0bf22579e
263 changes: 141 additions & 122 deletions libraries/Netdump/src/NetdumpPacket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#include "Netdump.h"
#include <lwip/init.h>

constexpr char* NetdumpPacket::packetTypeArray[];

void NetdumpPacket::printDetail(Print& out, const String& indent, const char* data, size_t size, PacketDetail pd) const
{
if (pd == PacketDetail::NONE)
Expand Down Expand Up @@ -61,17 +63,47 @@ void NetdumpPacket::printDetail(Print& out, const String& indent, const char* da
}
}

NetdumpPacket::PacketType NetdumpPacket::packetType() const
{
if (isARP()) return PacketType::ARP;
if (isIP())
{
if (isUDP())
{
if (isMDNS()) return PacketType::MDNS;
if (isDNS()) return PacketType::DNS;
if (isSSDP()) return PacketType::SSDP;
if (isDHCP()) return PacketType::DHCP;
if (isWSDD()) return PacketType::WSDD;
if (isNETBIOS()) return PacketType::NETBIOS;
if (isSMB()) return PacketType::SMB;
if (isOTA()) return PacketType::OTA;
return PacketType::UDP;
}
if (isTCP())
{
if (isHTTP()) return PacketType::HTTP;
return PacketType::TCP;
}
if (isICMP()) return PacketType::ICMP;
if (isIGMP()) return PacketType::IGMP;
return PacketType::IP;
}
return PacketType::UKNW;
}


String NetdumpPacket::toString(PacketDetail netdumpDetail) const
{
StreamString sstr;
sstr.reserve(128);

sstr.printf("%d %3s ", netif_idx, out ? "out" : "in ");
sstr.printf("%d %3s %s ", netif_idx, out ? "out" : "in ", packetTypeString(packetType()));

if (isARP())
switch (packetType())
{
case PacketType::ARP :
{
sstr.printf("ARP ");
switch (getARPType())
{
case 1 : sstr.printf("who has %s tell %s", getIP(ETH_HDR_LEN + 24).toString().c_str(), getIP(ETH_HDR_LEN + 14).toString().c_str());
Expand All @@ -90,143 +122,130 @@ String NetdumpPacket::toString(PacketDetail netdumpDetail) const
sstr.printf("\r\n");
return sstr;
}

if (isIP())
case PacketType::MDNS :
case PacketType::DNS :
{
if (isUDP())
sstr.printf("%s>%s ", sourceIP().toString().c_str(), destIP().toString().c_str());
sstr.printf("ID=0x%04x ", ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8));
sstr.printf("F=0x%04x ", ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8 + 2));
if (uint16_t t = ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8 + 4))
{
if (isMDNS() || isDNS())
{
sstr.printf("%s%s>%s ", isMDNS() ? "MDNS " : "DNS ", sourceIP().toString().c_str(), destIP().toString().c_str());
sstr.printf("ID=0x%04x ", ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8));
sstr.printf("F=0x%04x ", ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8 + 2));
if (uint16_t t = ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8 + 4))
{
sstr.printf("Q=%d ", t);
}
if (uint16_t t = ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8 + 6))
{
sstr.printf("R=%d ", t);
}
if (uint16_t t = ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8 + 8))
{
sstr.printf("TR=%d ", t);
}
if (uint16_t t = ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8 + 10))
{
sstr.printf("DR=%d ", t);
}
sstr.printf("\r\n");
}
else
{
String udpType;

if (isSSDP())
{
udpType = "SSDP";
}
else if (isDHCP())
{
udpType = "DHCP";
}
else if (isWSDD())
{
udpType = "WSDD";
}
else if (isOTA())
{
udpType = "OTA";
}
else
{
udpType = "UDP ";
}
sstr.printf("%s %s>%s ", udpType.c_str(), sourceIP().toString().c_str(), destIP().toString().c_str());
sstr.printf("%d:%d", getSrcPort(), getDstPort());
sstr.printf("\r\n");
}
printDetail(sstr, " H ", &data[ETH_HDR_LEN + getIpHdrLen()], getUdpHdrLen(), netdumpDetail);
printDetail(sstr, " D ", &data[ETH_HDR_LEN + getIpHdrLen() + getUdpHdrLen()], getUdpLen(), netdumpDetail);
return sstr;
sstr.printf("Q=%d ", t);
}
else if (isTCP())
if (uint16_t t = ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8 + 6))
{
sstr.printf(isHTTP() ? "HTTP " : "TCP ");
sstr.printf("%s>%s ", sourceIP().toString().c_str(), destIP().toString().c_str());
sstr.printf("%d:%d ", getSrcPort(), getDstPort());
uint16_t flags = getTcpFlags();
sstr.print('[');
const char chars [] = "FSRPAUECN";
for (uint8_t i = 0; i < sizeof chars; i++)
if (flags & (1 << i))
{
sstr.print(chars[i]);
}
sstr.print(']');
sstr.printf(" len: %u seq: %u, ack: %u, wnd: %u ", getTcpLen(), getTcpSeq(), getTcpAck(), getTcpWindow());
sstr.printf("\r\n");
printDetail(sstr, " H ", &data[ETH_HDR_LEN + getIpHdrLen()], getTcpHdrLen(), netdumpDetail);
printDetail(sstr, " D ", &data[ETH_HDR_LEN + getIpHdrLen() + getTcpHdrLen()], getTcpLen(), netdumpDetail);
return sstr;
sstr.printf("R=%d ", t);
}
if (uint16_t t = ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8 + 8))
{
sstr.printf("TR=%d ", t);
}
else if (isICMP())
if (uint16_t t = ntoh16(ETH_HDR_LEN + getIpHdrLen() + 8 + 10))
{
sstr.printf("ICMP ");
sstr.printf("%s>%s ", sourceIP().toString().c_str(), destIP().toString().c_str());
if (isIPv4())
sstr.printf("DR=%d ", t);
}
sstr.printf("\r\n");
printDetail(sstr, " H ", &data[ETH_HDR_LEN + getIpHdrLen()], getUdpHdrLen(), netdumpDetail);
printDetail(sstr, " D ", &data[ETH_HDR_LEN + getIpHdrLen() + getUdpHdrLen()], getUdpLen(), netdumpDetail);
return sstr;
}
case PacketType::SSDP :
case PacketType::DHCP :
case PacketType::WSDD :
case PacketType::NETBIOS :
case PacketType::SMB :
case PacketType::OTA :
case PacketType::UDP :
{
sstr.printf("%s>%s ", sourceIP().toString().c_str(), destIP().toString().c_str());
sstr.printf("%d:%d", getSrcPort(), getDstPort());
sstr.printf("\r\n");
printDetail(sstr, " H ", &data[ETH_HDR_LEN + getIpHdrLen()], getUdpHdrLen(), netdumpDetail);
printDetail(sstr, " D ", &data[ETH_HDR_LEN + getIpHdrLen() + getUdpHdrLen()], getUdpLen(), netdumpDetail);
return sstr;
}
case PacketType::TCP :
case PacketType::HTTP :
{
sstr.printf("%s>%s ", sourceIP().toString().c_str(), destIP().toString().c_str());
sstr.printf("%d:%d ", getSrcPort(), getDstPort());
uint16_t flags = getTcpFlags();
sstr.print('[');
const char chars [] = "FSRPAUECN";
for (uint8_t i = 0; i < sizeof chars; i++)
if (flags & (1 << i))
{
switch (getIcmpType())
{
case 0 : sstr.printf("ping reply"); break;
case 8 : sstr.printf("ping request"); break;
default: sstr.printf("type(0x%02x)", getIcmpType()); break;
}
sstr.print(chars[i]);
}
if (isIPv6())
sstr.print(']');
sstr.printf(" len: %u seq: %u, ack: %u, wnd: %u ", getTcpLen(), getTcpSeq(), getTcpAck(), getTcpWindow());
sstr.printf("\r\n");
printDetail(sstr, " H ", &data[ETH_HDR_LEN + getIpHdrLen()], getTcpHdrLen(), netdumpDetail);
printDetail(sstr, " D ", &data[ETH_HDR_LEN + getIpHdrLen() + getTcpHdrLen()], getTcpLen(), netdumpDetail);
return sstr;
}
case PacketType::ICMP :
{
sstr.printf("%s>%s ", sourceIP().toString().c_str(), destIP().toString().c_str());
if (isIPv4())
{
switch (getIcmpType())
{
switch (getIcmpType())
{
case 129 : sstr.printf("ping reply"); break;
case 128 : sstr.printf("ping request"); break;
case 135 : sstr.printf("Neighbour solicitation"); break;
case 136 : sstr.printf("Neighbour advertisement"); break;
default: sstr.printf("type(0x%02x)", getIcmpType()); break;
}
case 0 : sstr.printf("ping reply"); break;
case 8 : sstr.printf("ping request"); break;
default: sstr.printf("type(0x%02x)", getIcmpType()); break;
}
sstr.printf("\r\n");
return sstr;
}
else if (isIGMP())
if (isIPv6())
{
sstr.printf("IGMP ");
switch (getIgmpType())
switch (getIcmpType())
{
case 1 : sstr.printf("Create Group Request"); break;
case 2 : sstr.printf("Create Group Reply"); break;
case 3 : sstr.printf("Join Group Request"); break;
case 4 : sstr.printf("Join Group Reply"); break;
case 5 : sstr.printf("Leave Group Request"); break;
case 6 : sstr.printf("Leave Group Reply"); break;
case 7 : sstr.printf("Confirm Group Request"); break;
case 8 : sstr.printf("Confirm Group Reply"); break;
case 0x11 : sstr.printf("Group Membership Query"); break;
case 0x12 : sstr.printf("IGMPv1 Membership Report"); break;
case 0x22 : sstr.printf("IGMPv3 Membership Report"); break;
default: sstr.printf("type(0x%02x)", getIgmpType()); break;
case 129 : sstr.printf("ping reply"); break;
case 128 : sstr.printf("ping request"); break;
case 135 : sstr.printf("Neighbour solicitation"); break;
case 136 : sstr.printf("Neighbour advertisement"); break;
default: sstr.printf("type(0x%02x)", getIcmpType()); break;
}
sstr.printf("\r\n");
return sstr;
}
else
sstr.printf("\r\n");
return sstr;
}
case PacketType::IGMP :
{
switch (getIgmpType())
{
sstr.printf("UKWN type = %d\r\n", ipType());
return sstr;
case 1 : sstr.printf("Create Group Request"); break;
case 2 : sstr.printf("Create Group Reply"); break;
case 3 : sstr.printf("Join Group Request"); break;
case 4 : sstr.printf("Join Group Reply"); break;
case 5 : sstr.printf("Leave Group Request"); break;
case 6 : sstr.printf("Leave Group Reply"); break;
case 7 : sstr.printf("Confirm Group Request"); break;
case 8 : sstr.printf("Confirm Group Reply"); break;
case 0x11 : sstr.printf("Group Membership Query"); break;
case 0x12 : sstr.printf("IGMPv1 Membership Report"); break;
case 0x22 : sstr.printf("IGMPv3 Membership Report"); break;
default: sstr.printf("type(0x%02x)", getIgmpType()); break;
}
sstr.printf("\r\n");
return sstr;
}
case PacketType::IP :
{
sstr.printf("Unknown IP type : %d\r\n", ipType());
return sstr;
}
case PacketType::UKNW :
{
sstr.printf("Unknown packet, type = 0x%04x\r\n", ethType());
return sstr;
}
default :
{
sstr.printf("Non identified packet\r\n");
return sstr;
}
}

sstr.printf("Unknown packet, type = 0x%04x\r\n", ethType());
return sstr;

}

42 changes: 38 additions & 4 deletions libraries/Netdump/src/NetdumpPacket.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,36 @@ class NetdumpPacket
CHARS
};

enum class PacketType
{
ARP,
IP,
UDP,
MDNS,
DNS,
SSDP,
DHCP,
WSDD,
NETBIOS,
SMB,
OTA,
TCP,
HTTP,
ICMP,
IGMP,
UKNW,
};

static constexpr char* packetTypeArray[] = {"ARP ","IP ","UDP ","MDNS","DNS ",
"SSDP","DHCP","WSDD","NBIO", "SMB ","OTA ","TCP ",
"HTTP","ICMP","IGMP","UKNW"};

const char* packetTypeString (PacketType pt) const
{
return packetTypeArray[static_cast<int>(pt)];
}
PacketType packetType() const;

const char* rawData() const
{
return data;
Expand Down Expand Up @@ -152,8 +182,6 @@ class NetdumpPacket
{
return ntoh16(ETH_HDR_LEN + getIpHdrLen() + 4);
};


bool isARP() const
{
return (ethType() == 0x0806);
Expand Down Expand Up @@ -214,8 +242,14 @@ class NetdumpPacket
{
return (hasPort(8266));
}


bool isNETBIOS() const
{
return (hasPort(137) || hasPort(138) || hasPort(139));
}
bool isSMB() const
{
return (hasPort(445));
}
NetdumpIP getIP(uint16_t idx) const
{
return NetdumpIP(data[idx],
Expand Down
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy