]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: add udp_header_size() helper
authorLennart Poettering <lennart@poettering.net>
Mon, 16 Nov 2020 20:00:24 +0000 (21:00 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 18 Feb 2021 14:55:58 +0000 (15:55 +0100)
src/resolve/resolved-dns-packet.h
src/resolve/resolved-dns-scope.c

index f7c350221c43fa1ad0195ec1413655d05ac2c3fa..1d53fcfb20adea4b8a50a28cc96ed0cf25bbc041 100644 (file)
@@ -2,6 +2,7 @@
 #pragma once
 
 #include <netinet/ip.h>
+#include <netinet/ip6.h>
 #include <netinet/udp.h>
 
 #include "hashmap.h"
@@ -32,14 +33,19 @@ struct DnsPacketHeader {
         be16_t ancount;
         be16_t nscount;
         be16_t arcount;
-};
+} _packed_;
 
 #define DNS_PACKET_HEADER_SIZE sizeof(DnsPacketHeader)
-#define UDP_PACKET_HEADER_SIZE (sizeof(struct iphdr) + sizeof(struct udphdr))
+#define UDP4_PACKET_HEADER_SIZE (sizeof(struct iphdr) + sizeof(struct udphdr))
+#define UDP6_PACKET_HEADER_SIZE (sizeof(struct ip6_hdr) + sizeof(struct udphdr))
+
+assert_cc(sizeof(struct ip6_hdr) == 40);
+assert_cc(sizeof(struct iphdr) == 20);
+assert_cc(sizeof(struct udphdr) == 8);
+assert_cc(sizeof(DnsPacketHeader) == 12);
 
-/* The various DNS protocols deviate in how large a packet can grow,
- * but the TCP transport has a 16bit size field, hence that appears to
- * be the absolute maximum. */
+/* The various DNS protocols deviate in how large a packet can grow, but the TCP transport has a 16bit size
+ * field, hence that appears to be the absolute maximum. */
 #define DNS_PACKET_SIZE_MAX 0xFFFFu
 
 /* The default size to use for allocation when we don't know how large
@@ -307,3 +313,15 @@ static inline size_t dns_packet_size_max(DnsPacket *p) {
 
         return p->max_size != 0 ? p->max_size : DNS_PACKET_SIZE_MAX;
 }
+
+static inline size_t udp_header_size(int af) {
+
+        switch (af) {
+        case AF_INET:
+                return UDP4_PACKET_HEADER_SIZE;
+        case AF_INET6:
+                return UDP6_PACKET_HEADER_SIZE;
+        default:
+                assert_not_reached("Unexpected address family");
+        }
+}
index d4b45f93082896e9276c86b9de7a49303ab579f2..6f1b48fffb5a9a65577cbc532bea3211a44585f7 100644 (file)
@@ -212,7 +212,7 @@ static int dns_scope_emit_one(DnsScope *s, int fd, DnsPacket *p) {
                 if (p->size > DNS_PACKET_UNICAST_SIZE_MAX)
                         return -EMSGSIZE;
 
-                if (p->size + UDP_PACKET_HEADER_SIZE > mtu)
+                if (p->size + UDP4_PACKET_HEADER_SIZE > mtu)
                         return -EMSGSIZE;
 
                 r = manager_write(s->manager, fd, p);