srdusr
aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_summarize.cpp
diff options
context:
space:
mode:
authorsrdusr <[email protected]>2026-05-31 23:29:00 +0200
committersrdusr <[email protected]>2026-05-31 23:29:00 +0200
commit8c8708e43aeae394787d0d1aa71ee22dca635bbe (patch)
treed1e168d081ecf52fd9a62802a214d4263824331b /tests/test_summarize.cpp
parent719b7f439c1c8c76d0573b34daa329061c9ad8a6 (diff)
downloadpacketeer-8c8708e43aeae394787d0d1aa71ee22dca635bbe.tar.gz
packeteer-8c8708e43aeae394787d0d1aa71ee22dca635bbe.zip
Add LLDP - dispatched by ethertype, no IP layer at all
Real switches broadcast this every ~30s, but this project had zero treatment for it (0x88CC was previously the test suite's own example of an "unhandled ethertype"). Dispatched by ethertype the same way ARP is, since LLDP sits directly on Ethernet. TLV-encoded; only the three mandatory TLVs (Chassis ID, Port ID, TTL) plus System Name are rendered, while every other TLV is still walked over correctly so nothing after it is lost. Live-verified two ways, since this machine is on WiFi (LLDP isn't relayed to wireless clients even when a real switch sends it) with no LLDP daemon installed to generate traffic locally either: a 15-second passive capture confirmed no organic LLDP traffic exists to accidentally rely on, then a real 802.1AB frame was sent via a raw AF_PACKET socket onto the actual NIC (not fed directly to parse_lldp() in a unit test) and captured through the full pipeline, decoding correctly.
Diffstat (limited to 'tests/test_summarize.cpp')
-rw-r--r--tests/test_summarize.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/tests/test_summarize.cpp b/tests/test_summarize.cpp
index baf4ed4..0cb0f98 100644
--- a/tests/test_summarize.cpp
+++ b/tests/test_summarize.cpp
@@ -166,10 +166,30 @@ TEST_CASE("summarize_packet reports a truncated Ethernet frame without decoding
TEST_CASE("summarize_packet stops after the Ethernet line for an unhandled ethertype") {
std::vector<unsigned char> bytes = {
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
- 0x88, 0xCC, // LLDP, not IPv4/IPv6/ARP
+ 0x80, 0x35, // RARP - real ethertype, just not one this project decodes
};
auto line = packeteer::summarize_packet(bytes, DLT_EN10MB);
- CHECK(line == "ETH aa:bb:cc:dd:ee:ff -> 11:22:33:44:55:66 ethertype=0x88cc");
+ CHECK(line == "ETH aa:bb:cc:dd:ee:ff -> 11:22:33:44:55:66 ethertype=0x8035");
+}
+
+TEST_CASE("summarize_packet decodes an LLDP frame end to end") {
+ std::vector<unsigned char> bytes = {
+ 0x01, 0x80, 0xC2, 0x00, 0x00, 0x0E, // dst: LLDP multicast
+ 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, // src mac
+ 0x88, 0xCC, // ethertype: LLDP
+ // Chassis ID TLV: subtype=4 (MAC), value=aa:bb:cc:dd:ee:ff
+ 0x02, 0x07, 4, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
+ // Port ID TLV: subtype=7 (locally assigned), value="eth0"
+ 0x04, 0x05, 7, 'e', 't', 'h', '0',
+ // TTL TLV: 120 seconds
+ 0x06, 0x02, 0x00, 0x78,
+ // End of LLDPDU
+ 0x00, 0x00,
+ };
+ auto line = packeteer::summarize_packet(bytes, DLT_EN10MB);
+ CHECK(line ==
+ "ETH aa:bb:cc:dd:ee:ff -> 01:80:c2:00:00:0e ethertype=0x88cc | "
+ "LLDP chassis=aa:bb:cc:dd:ee:ff port=eth0 ttl=120");
}
TEST_CASE("summarize_packet decodes an ARP request end to end") {