From 2aa4cd219b1fae15f061ec9753d5a6990ec2ba48 Mon Sep 17 00:00:00 2001 From: jca Date: Sat, 18 Feb 2017 19:23:05 +0000 Subject: Add EDNS0 support. EDNS allows for various DNS extensions, among which UDP DNS packets size bigger than 512 bytes. The default is still to not advertize anything. ok eric@ --- lib/libc/asr/asr_utils.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'lib/libc/asr/asr_utils.c') diff --git a/lib/libc/asr/asr_utils.c b/lib/libc/asr/asr_utils.c index 835d5dfb448..e540aae9ab6 100644 --- a/lib/libc/asr/asr_utils.c +++ b/lib/libc/asr/asr_utils.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asr_utils.c,v 1.14 2017/02/17 22:24:45 eric Exp $ */ +/* $OpenBSD: asr_utils.c,v 1.15 2017/02/18 19:23:05 jca Exp $ */ /* * Copyright (c) 2009-2012 Eric Faurot * @@ -380,6 +380,14 @@ pack_u16(struct asr_pack *p, uint16_t v) return (pack_data(p, &v, 2)); } +static int +pack_u32(struct asr_pack *p, uint32_t v) +{ + v = htonl(v); + + return (pack_data(p, &v, 4)); +} + static int pack_dname(struct asr_pack *p, const char *dname) { @@ -414,6 +422,18 @@ _asr_pack_query(struct asr_pack *p, uint16_t type, uint16_t class, const char *d return (p->err) ? (-1) : (0); } +int +_asr_pack_edns0(struct asr_pack *p, uint16_t pktsz) +{ + pack_dname(p, ""); /* root */ + pack_u16(p, 41); /* OPT */ + pack_u16(p, pktsz); /* UDP payload size */ + pack_u32(p, 0); /* extended RCODE and flags */ + pack_u16(p, 0); /* RDATA len */ + + return (p->err) ? (-1) : (0); +} + int _asr_sockaddr_from_str(struct sockaddr *sa, int family, const char *str) { -- cgit v1.2.3-59-g8ed1b