# Implementation status vs upstream mosdns

This document summarizes the current implementation status of the Rust `lazydns` project against the upstream `mosdns` feature list (see `upstream-features.md`). It lists implemented features, partial implementations, and known gaps. Paths reference current source files where applicable.

## Summary

- Overall status: large portion of core features and many plugins implemented in Rust with the goal of parity.
- Focus so far: plugin architecture, forward/cache/hosts, control-flow plugins, and executable plugins including `reverse_lookup`, `ipset`, and `nftset`.

## 1. Core DNS functionality

- DNS parsing & serialization: Implemented. See `src/dns/*` (message, wire, record, rdata, types).
- Supported record types: implemented for the common set (A, AAAA, CNAME, MX, NS, PTR, SOA, TXT, SRV). SVCB/HTTPS and CAA are present in `RecordType` definitions (`src/dns/types.rs`).

Status: IMPLEMENTED (core parsing and record support).

## 2. Transport & server features

- UDP and TCP servers: Implemented (`src/server/udp.rs`, `src/server/tcp.rs`).
- DoT (DNS over TLS): Implemented (`src/server/dot.rs`, `src/server/tls.rs`).
- DoH (DNS over HTTPS): Implemented (`src/server/doh.rs`).
- DoQ (DNS over QUIC): implemented (`src/server/doq.rs`).
- Multi-listen, concurrency, connection handling: Implemented via `tokio`-based servers (`src/server/*`).

Status: PARTIAL — UDP/TCP/DoH/DoT/DoQ present, not all features.

## 3. Plugin system

- Plugin architecture: Implemented (`src/plugin/*`, `src/plugins/mod.rs`).
- Execution flow, context, and conditional execution: Implemented (`src/plugin/context.rs`, `src/plugins/advanced.rs`, `src/plugin/builder.rs`).

### Core plugin coverage (select)

- `forward`: Implemented (`src/plugins/forward.rs`) — supports multiple upstreams and concurrent queries. Transport feature parity (DoH/DoT/DoQ upstream) is partial on transport side.
- `cache`: Implemented (`src/plugins/cache.rs`). - TODO: `lazy_cache_ttl`
- `hosts`: Implemented (`src/plugins/hosts.rs`). Parser supports both ip-first and hostname-first lines, multiple IPs per line, and mixed ordering across files; unit tests verify A/AAAA behavior and hostname-first parsing.
- `domain_set` / `geosite`: Implemented (`src/plugins/domain_matcher.rs`, `src/plugins/geosite.rs`).
- `ip_set` / IP matching: Implemented (`src/plugins/ip_matcher.rs`, `src/plugins/data_provider.rs`).
- `geoip`: Implemented (`src/plugins/geoip.rs`) — GeoIP integration present; check for data loader details.

### Executable & control plugins

- `sequence`, `parallel`, `if`, `goto`, `return`, `drop_resp`: Implemented (`src/plugins/advanced.rs`, `src/plugins/control_flow.rs`).
- `ttl`: Implemented (`src/plugins/executable/ttl.rs`).
- `query_summary`: Implemented (`src/plugins/executable/query_summary.rs`).
- `reverse_lookup`: Implemented with in-memory cache and save hook (`src/plugins/executable/reverse_lookup.rs`). Integration: `PluginHandler` calls `save_ips_after` after response population.
- `arbitrary`, `black_hole`, `drop_resp`: Implemented in `src/plugins/executable/*.rs`.

### ipset / nftset integration

- `ipset`: Implemented (`src/plugins/executable/ipset.rs`). Behavior:

  - Computes CIDR prefixes from A/AAAA answers.
  - QuickSetup parser present.
  - On Linux, invokes system `ipset` binary via `std::process::Command` (guarded with `cfg(target_os = "linux")`).
  - On other platforms records metadata (`ipset_added`) for tests/visibility.

- `nftset`: Implemented (`src/plugins/executable/nftset.rs`). Behavior mirrors `ipset`:
  - Computes prefixes, QuickSetup parser.
  - On Linux uses `nft` binary; otherwise records metadata (`nftset_added_v4`, `nftset_added_v6`).

Status: IMPLEMENTED (CLI-based integration). Note: upstream native netlink integration is not used; a native implementation could be added later.

## 4. Configuration system

- YAML config loader and validation: Implemented (`src/config/*`) with `PluginBuilder` and `PluginConfig` parsing. Example configs included in `examples/etc/config.yaml`.
- Hot reload: partial — `ConfigReloader` exists; verify runtime hot-reload semantics for production.

Status: PARTIAL — YAML loading and validation implemented; hot-reload present as a reloader component.

## 5. Advanced features

- Performance: designed for async `tokio` concurrency; memory pools and advanced tuning are incremental work (some pool utilities exist in project).
- Observability: metrics and monitoring modules exist (`src/server/monitoring.rs`, `src/metrics` planned). Prometheus-style exposure may be partial.
- Security: TLS support for DoT/DoH implemented. Certificate handling present in `src/server/tls.rs`.

Status: PARTIAL — basic observability and TLS present; more integrations possible.

## 6. Deployment & management

- Standalone binary and Docker artifacts: project includes `Dockerfile` and `docker-compose.yml` in workspace root.
- CLI flags and signal handling: implemented in `src/main.rs` (config path, working dir, log level, graceful shutdown via ctrl-c).

Status: IMPLEMENTED (basic deployment support present).

## 7. Testing coverage

- Unit tests: extensive unit tests across DNS, plugin, and executable modules (run via `cargo test`).
- Integration tests: added integration tests for the reverse-lookup save hook and ipset/nftset metadata behavior under `tests/`.

Status: IMPLEMENTED — good test coverage; integration tests added for key behaviors.

## Gaps and recommended next steps

1. DoQ (DNS over QUIC): implement DoQ server and transport support to match upstream feature set.
2. Replace CLI-based ipset/nft manipulation with native netlink integration (via a Rust netlink crate) for more robust system integration and error handling.
3. Expand documentation per-plugin (config examples and QuickSetup documentation) and add README snippets linking `examples/etc/config.yaml` to plugin behaviors.
4. Add further integration tests for multi-plugin sequences (e.g., forward->ipset->ros_addrlist flow) and permissioned system behaviors.
5. Verify Prometheus metrics coverage and add exporter where missing.

## File references (key files)

- Core DNS: `src/dns/*` (types.rs, message.rs, record.rs, wire.rs)
- Server: `src/server/*` (`udp.rs`, `tcp.rs`, `doh.rs`, `dot.rs`)
- Plugin system: `src/plugin/*`, `src/plugins/*`
- Executable plugins: `src/plugins/executable/*` (includes `ipset.rs`, `nftset.rs`, `reverse_lookup.rs`, `ttl.rs`, `query_summary.rs`)
- Config and examples: `src/config/*`, `examples/etc/config.yaml`
