resolved: always take a timestamp when first seeing a packet
This is later useful if we want to adjust the TTLs of packets we want to propagate to clients.
This commit is contained in:
parent
8bc63a0b13
commit
5777c6130b
|
@ -71,6 +71,7 @@ struct DnsPacket {
|
||||||
union in_addr_union sender, destination;
|
union in_addr_union sender, destination;
|
||||||
uint16_t sender_port, destination_port;
|
uint16_t sender_port, destination_port;
|
||||||
uint32_t ttl;
|
uint32_t ttl;
|
||||||
|
usec_t timestamp; /* CLOCK_BOOTTIME (or CLOCK_MONOTONIC if the former doesn't exist) */
|
||||||
|
|
||||||
/* For support of truncated packets */
|
/* For support of truncated packets */
|
||||||
DnsPacket *more;
|
DnsPacket *more;
|
||||||
|
|
|
@ -377,6 +377,7 @@ static int on_stream_io(sd_event_source *es, int fd, uint32_t revents, void *use
|
||||||
s->read_packet->family = s->peer.sa.sa_family;
|
s->read_packet->family = s->peer.sa.sa_family;
|
||||||
s->read_packet->ttl = s->ttl;
|
s->read_packet->ttl = s->ttl;
|
||||||
s->read_packet->ifindex = s->ifindex;
|
s->read_packet->ifindex = s->ifindex;
|
||||||
|
s->read_packet->timestamp = now(clock_boottime_or_monotonic());
|
||||||
|
|
||||||
if (s->read_packet->family == AF_INET) {
|
if (s->read_packet->family == AF_INET) {
|
||||||
s->read_packet->sender.in = s->peer.in.sin_addr;
|
s->read_packet->sender.in = s->peer.in.sin_addr;
|
||||||
|
|
|
@ -890,7 +890,6 @@ static int dns_transaction_fix_rcode(DnsTransaction *t) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
|
void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
|
||||||
usec_t ts;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(t);
|
assert(t);
|
||||||
|
@ -973,8 +972,6 @@ void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_se(sd_event_now(t->scope->manager->event, clock_boottime_or_monotonic(), &ts) >= 0);
|
|
||||||
|
|
||||||
switch (t->scope->protocol) {
|
switch (t->scope->protocol) {
|
||||||
|
|
||||||
case DNS_PROTOCOL_DNS:
|
case DNS_PROTOCOL_DNS:
|
||||||
|
@ -1039,7 +1036,7 @@ void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
|
||||||
|
|
||||||
case DNS_PROTOCOL_LLMNR:
|
case DNS_PROTOCOL_LLMNR:
|
||||||
case DNS_PROTOCOL_MDNS:
|
case DNS_PROTOCOL_MDNS:
|
||||||
dns_scope_packet_received(t->scope, ts - t->start_usec);
|
dns_scope_packet_received(t->scope, p->timestamp - t->start_usec);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -854,6 +854,8 @@ int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
|
||||||
} else
|
} else
|
||||||
return -EAFNOSUPPORT;
|
return -EAFNOSUPPORT;
|
||||||
|
|
||||||
|
p->timestamp = now(clock_boottime_or_monotonic());
|
||||||
|
|
||||||
CMSG_FOREACH(cmsg, &mh) {
|
CMSG_FOREACH(cmsg, &mh) {
|
||||||
|
|
||||||
if (cmsg->cmsg_level == IPPROTO_IPV6) {
|
if (cmsg->cmsg_level == IPPROTO_IPV6) {
|
||||||
|
|
Loading…
Reference in New Issue