uint16_t size;
} dnsdist_ffi_raw_value_t;
+typedef enum {
+ dnsdist_ffi_protocol_type_doudp = 0,
+ dnsdist_ffi_protocol_type_dotcp = 1,
+ dnsdist_ffi_protocol_type_dnscryptudp = 2,
+ dnsdist_ffi_protocol_type_dnscrypttcp = 3,
+ dnsdist_ffi_protocol_type_dot = 4,
+ dnsdist_ffi_protocol_type_doh = 5,
+} dnsdist_ffi_protocol_type;
+
void dnsdist_ffi_dnsquestion_get_localaddr(const dnsdist_ffi_dnsquestion_t* dq, const void** addr, size_t* addrSize) __attribute__ ((visibility ("default")));
uint16_t dnsdist_ffi_dnsquestion_get_local_port(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default")));
void dnsdist_ffi_dnsquestion_get_remoteaddr(const dnsdist_ffi_dnsquestion_t* dq, const void** addr, size_t* addrSize) __attribute__ ((visibility ("default")));
bool dnsdist_ffi_dnsquestion_set_size(dnsdist_ffi_dnsquestion_t* dq, size_t newSize) __attribute__ ((visibility ("default")));
uint8_t dnsdist_ffi_dnsquestion_get_opcode(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default")));
bool dnsdist_ffi_dnsquestion_get_tcp(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default")));
+dnsdist_ffi_protocol_type dnsdist_ffi_dnsquestion_get_protocol(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default")));
bool dnsdist_ffi_dnsquestion_get_skip_cache(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default")));
bool dnsdist_ffi_dnsquestion_get_use_ecs(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default")));
bool dnsdist_ffi_dnsquestion_get_add_xpf(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default")));
const char* dnsdist_ffi_dnsquestion_get_http_query_string(dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default")));
const char* dnsdist_ffi_dnsquestion_get_http_host(dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default")));
const char* dnsdist_ffi_dnsquestion_get_http_scheme(dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default")));
+size_t dnsdist_ffi_dnsquestion_get_mac_addr(const dnsdist_ffi_dnsquestion_t* dq, void* buffer, size_t bufferSize) __attribute__ ((visibility ("default")));
// returns the length of the resulting 'out' array. 'out' is not set if the length is 0
size_t dnsdist_ffi_dnsquestion_get_edns_options(dnsdist_ffi_dnsquestion_t* ref, const dnsdist_ffi_ednsoption_t** out) __attribute__ ((visibility ("default")));
dnsdist_ffi_comboaddress_to_raw(*dq->dq->remote, addr, addrSize);
}
+size_t dnsdist_ffi_dnsquestion_get_mac_addr(const dnsdist_ffi_dnsquestion_t* dq, void* buffer, size_t bufferSize)
+{
+ if (dq == nullptr) {
+ return 0;
+ }
+ std::string mac = getMACAddress(*dq->dq->remote);
+ if (mac.empty()) {
+ return 0;
+ }
+ if (mac.size() > bufferSize) {
+ return bufferSize;
+ }
+ memcpy(buffer, mac.data(), mac.size());
+ return mac.size();
+}
+
void dnsdist_ffi_dnsquestion_get_masked_remoteaddr(dnsdist_ffi_dnsquestion_t* dq, const void** addr, size_t* addrSize, uint8_t bits)
{
dq->maskedRemote = Netmask(*dq->dq->remote, bits).getMaskedNetwork();
return dq->dq->overTCP();
}
+dnsdist_ffi_protocol_type dnsdist_ffi_dnsquestion_get_protocol(const dnsdist_ffi_dnsquestion_t* dq)
+{
+ if (dq != nullptr) {
+ auto proto = dq->dq->getProtocol();
+ if (proto == dnsdist::Protocol::DoUDP) {
+ return dnsdist_ffi_protocol_type_doudp;
+ }
+ else if (proto == dnsdist::Protocol::DoTCP) {
+ return dnsdist_ffi_protocol_type_dotcp;
+ }
+ else if (proto == dnsdist::Protocol::DNSCryptUDP) {
+ return dnsdist_ffi_protocol_type_dnscryptudp;
+ }
+ else if (proto == dnsdist::Protocol::DNSCryptTCP) {
+ return dnsdist_ffi_protocol_type_dnscrypttcp;
+ }
+ else if (proto == dnsdist::Protocol::DoT) {
+ return dnsdist_ffi_protocol_type_dot;
+ }
+ else if (proto == dnsdist::Protocol::DoH) {
+ return dnsdist_ffi_protocol_type_doh;
+ }
+ }
+ return dnsdist_ffi_protocol_type_doudp;
+}
+
bool dnsdist_ffi_dnsquestion_get_skip_cache(const dnsdist_ffi_dnsquestion_t* dq)
{
return dq->dq->skipCache;