#pragma once #include #include #include #include #include // Small interface/vtable for L7 dissectors (PLAN.md's architecture // sketch), so protocols can be registered and added incrementally // without touching the L2-L4 decode path or main.cpp's dispatch logic. namespace wireframe::net { class L7Dissector { public: virtual ~L7Dissector() = default; // The transport port this dissector claims (e.g. 53 for DNS). A // single fixed port is enough for the protocols in scope so far; // dissectors needing a port range or heuristic sniffing can widen // this later without changing the registry's shape. virtual std::uint16_t port() const = 0; // A one-line summary of the payload, or nullopt if it doesn't look // like this protocol (e.g. truncated/malformed). virtual std::optional summarize(std::span payload) const = 0; }; class L7Registry { public: void add(const L7Dissector* dissector) { dissectors_.push_back(dissector); } std::optional dissect(std::uint16_t port, std::span payload) const { for (const auto* dissector : dissectors_) { if (dissector->port() == port) return dissector->summarize(payload); } return std::nullopt; } private: std::vector dissectors_; }; } // namespace wireframe::net