summaryrefslogtreecommitdiff
path: root/common/dns.c
diff options
context:
space:
mode:
authorTed Lemon <source@isc.org>2001-01-11 02:12:16 +0000
committerTed Lemon <source@isc.org>2001-01-11 02:12:16 +0000
commit05528f7f054e62d938423747c06cd7522ddbe902 (patch)
treeb6e689bca2906af455e6c871f77adb9a826f22b5 /common/dns.c
parent87fec47565b95339695e8d257f68492cb8743057 (diff)
downloadisc-dhcp-05528f7f054e62d938423747c06cd7522ddbe902.tar.gz
Move the dhcid computer into common code.
Diffstat (limited to 'common/dns.c')
-rw-r--r--common/dns.c68
1 files changed, 67 insertions, 1 deletions
diff --git a/common/dns.c b/common/dns.c
index 2dc01257..8908675b 100644
--- a/common/dns.c
+++ b/common/dns.c
@@ -42,11 +42,12 @@
#ifndef lint
static char copyright[] =
-"$Id: dns.c,v 1.32 2000/11/28 22:34:02 mellon Exp $ Copyright (c) 2000 The Internet Software Consortium. All rights reserved.\n";
+"$Id: dns.c,v 1.33 2001/01/11 02:12:16 mellon Exp $ Copyright (c) 2000 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
#include "arpa/nameser.h"
+#include "../minires/md5.h"
/* This file is kind of a crutch for the BIND 8 nsupdate code, which has
* itself been cruelly hacked from its original state. What this code
@@ -463,6 +464,71 @@ void cache_found_zone (ns_class class,
enter_dns_zone (zone);
}
+
+int get_dhcid (struct data_string *id, struct lease *lease)
+{
+ unsigned char buf[MD5_DIGEST_LENGTH];
+ MD5_CTX md5;
+ int i;
+
+ if (!buffer_allocate (&id -> buffer,
+ (MD5_DIGEST_LENGTH * 2) + 3, MDL))
+ return 0;
+ id -> data = id -> buffer -> data;
+
+ /*
+ * DHCP clients and servers should use the following forms of client
+ * identification, starting with the most preferable, and finishing
+ * with the least preferable. If the client does not send any of these
+ * forms of identification, the DHCP/DDNS interaction is not defined by
+ * this specification. The most preferable form of identification is
+ * the Globally Unique Identifier Option [TBD]. Next is the DHCP
+ * Client Identifier option. Last is the client's link-layer address,
+ * as conveyed in its DHCPREQUEST message. Implementors should note
+ * that the link-layer address cannot be used if there are no
+ * significant bytes in the chaddr field of the DHCP client's request,
+ * because this does not constitute a unique identifier.
+ * -- "Interaction between DHCP and DNS"
+ * <draft-ietf-dhc-dhcp-dns-12.txt>
+ * M. Stapp, Y. Rekhter
+ */
+
+ MD5_Init (&md5);
+
+ if (lease -> uid) {
+ id -> buffer -> data [0] =
+ "0123456789abcdef" [DHO_DHCP_CLIENT_IDENTIFIER >> 4];
+ id -> buffer -> data [1] =
+ "0123456789abcdef" [DHO_DHCP_CLIENT_IDENTIFIER % 15];
+ /* Use the DHCP Client Identifier option. */
+ MD5_Update (&md5, lease -> uid, lease -> uid_len);
+ } else if (lease -> hardware_addr.hlen) {
+ id -> buffer -> data [0] = '0';
+ id -> buffer -> data [1] = '0';
+ /* Use the link-layer address. */
+ MD5_Update (&md5,
+ lease -> hardware_addr.hbuf,
+ lease -> hardware_addr.hlen);
+ } else {
+ /* Uh-oh. Something isn't right here. */
+ return 1;
+ }
+
+ MD5_Final (buf, &md5);
+
+ /* Convert into ASCII. */
+ for (i = 0; i < MD5_DIGEST_LENGTH; i++) {
+ id -> buffer -> data [i * 2 + 2] =
+ "0123456789abcdef" [(buf [i] >> 4) & 0xf];
+ id -> buffer -> data [i * 2 + 3] =
+ "0123456789abcdef" [buf [i] & 0xf];
+ }
+ id -> len = MD5_DIGEST_LENGTH * 2 + 2;
+ id -> buffer -> data [id -> len] = 0;
+ id -> terminated = 1;
+
+ return 0;
+}
#endif /* NSUPDATE */
HASH_FUNCTIONS (dns_zone, const char *, struct dns_zone)