blob: 51f61fafd3b2994e6b138f28c4c55086436475f6 [file] [log] [blame] [view]
# DNS
This directory contains DNS library which is a modified copy of Chromium's DNS
code (net/dns). The current files are taken from milestone M88 of the code
with the latest commit hash of `ad67ec1efbf21306b583c4daf34cf2ba4c591237`.
DNS library is used by:
* Patchpanel's multicast forwarder.
* DNS proxy for DNS over HTTPS.
It provides DNS functionalities of:
* Parsing DNS queries.
* Create raw DNS responses from DNS queries' answers.
## Modifications
The code here is a modification of Chromium's DNS code. The modification is
done to minimize the code imported. Currently, the necessary functions we
want are:
* `DnsQuery::Parse` (for parsing queries),
* `DnsResponse::WriteHeader`, `WriteAnswer`, ... (for writing raw responses).
The modification process is done by importing only the necessary functions,
followed by importing the minimal amount of code necessary to make the
necessary functions work. For example, functionality of writing DNS queries
and parsing DNS responses are removed.
Below are the changes made:
* Namespaces are changed from net to patchpanel.
* All the necessary files are flattened into one directory.
* Update `NET_EXPORT` with `BRILLO_EXPORT`.
* Remove all unneeded functionality.
## Alternatives Considered
An alternative is to having a modified copy of the Chromium's DNS code is to
port the DNS code to libchrome. Although it avoids having to copy and maintain
duplicated code, it has the downsides of needing to continuously update the code
alongside *libchrome* uprevs and having to include the whole DNS code.
Another option would be to use a low level library like *libbind9*. One
disadvantage of going with this approach is introducing additional payload
by adding the development package. The API of the library is also fairly
complicated and prone to introducing semantic bugs.