mirror of
https://github.com/oxen-io/lokinet.git
synced 2024-10-31 09:20:21 +00:00
b1c14af938
* update loki-mq submodule for tuple support * srv record reply implementation still need to encode srv records into intro sets / router contacts as well as decode from them and match against queried service.proto * inverted condition fix in config code * SRV record struct (de-)serialization for intro sets * parsing and using srv records from config (for/in introsets) * adopt str utils from core and use for srv parsing * changes to repeat requests no longer drop repeat requests on the floor, but do not make an *actual* request for them if one is in progress. do not call reply hook for each reply for a request, as each userland request is actually made into several lokinet requests and this would result in duplicate replies. * fetch SRVs from introsets for .loki * make format * dns and srv fixes, srv appears to be working
63 lines
1.7 KiB
C++
63 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include <dns/name.hpp>
|
|
#include <dns/serialize.hpp>
|
|
|
|
#include <tuple>
|
|
#include <string_view>
|
|
|
|
namespace llarp::dns
|
|
{
|
|
typedef std::tuple<std::string, uint16_t, uint16_t, uint16_t, std::string> SRVTuple;
|
|
|
|
struct SRVData
|
|
{
|
|
static constexpr size_t TARGET_MAX_SIZE = 200;
|
|
|
|
std::string service_proto; // service and protocol may as well be together
|
|
|
|
uint16_t priority;
|
|
uint16_t weight;
|
|
uint16_t port;
|
|
|
|
// target string for the SRV record to point to
|
|
// options:
|
|
// empty - refer to query name
|
|
// dot - authoritative "no such service available"
|
|
// any other .loki or .snode - target is that .loki or .snode
|
|
std::string target;
|
|
|
|
// do some basic validation on the target string
|
|
// note: this is not a conclusive, regex solution,
|
|
// but rather some sanity/safety checks
|
|
bool
|
|
IsValid() const;
|
|
|
|
SRVTuple
|
|
toTuple() const;
|
|
|
|
static SRVData
|
|
fromTuple(SRVTuple tuple);
|
|
|
|
/* bind-like formatted string for SRV records in config file
|
|
*
|
|
* format:
|
|
* srv=service.proto priority weight port target
|
|
*
|
|
* exactly one space character between parts.
|
|
*
|
|
* target can be empty, in which case the space after port should
|
|
* be omitted. if this is the case, the target is
|
|
* interpreted as the .loki or .snode of the current context.
|
|
*
|
|
* if target is not empty, it must be either
|
|
* - simply a full stop (dot/period) OR
|
|
* - a name within the .loki or .snode subdomains. a target
|
|
* specified in this manner must not end with a full stop.
|
|
*/
|
|
bool
|
|
fromString(std::string_view srvString);
|
|
};
|
|
|
|
} // namespace llarp::dns
|