+++ /dev/null
-/* bootp.c
-
- BOOTP Protocol support. */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"$Id: bootp.c,v 1.24 1997/02/22 08:36:36 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-void bootp (packet)
- struct packet *packet;
-{
- int result;
- struct host_decl *hp;
- struct host_decl *host = (struct host_decl *)0;
- struct packet outgoing;
- struct dhcp_packet raw;
- struct sockaddr_in to;
- struct in_addr from;
- struct hardware hto;
- struct tree_cache *options [256];
- struct subnet *subnet;
- struct lease *lease;
- struct iaddr ip_address;
- int i;
-
- note ("BOOTREQUEST from %s via %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
-
-
-
- if (!locate_network (packet))
- return;
-
- hp = find_hosts_by_haddr (packet -> raw -> htype,
- packet -> raw -> chaddr,
- packet -> raw -> hlen);
-
- lease = find_lease (packet, packet -> shared_network);
-
- /* Find an IP address in the host_decl that matches the
- specified network. */
- if (hp)
- subnet = find_host_for_network (&hp, &ip_address,
- packet -> shared_network);
- else
- subnet = (struct subnet *)0;
-
- if (!subnet) {
- /* We didn't find an applicable host declaration.
- Just in case we may be able to dynamically assign
- an address, see if there's a host declaration
- that doesn't have an ip address associated with it. */
- if (hp) {
- for (; hp; hp = hp -> n_ipaddr) {
- if (!hp -> fixed_addr) {
- host = hp;
- break;
- }
- }
- }
-
- if (host && (!host -> group -> allow_booting)) {
- note ("Ignoring excluded BOOTP client %s",
- host -> name);
- return;
- }
-
- if (host && (!host -> group -> allow_bootp)) {
- note ("Ignoring BOOTP request from client %s",
- host -> name);
- return;
- }
-
- /* If we've been told not to boot unknown clients,
- and we didn't find any host record for this client,
- ignore it. */
- if (!host && !(packet -> shared_network ->
- group -> boot_unknown_clients)) {
- note ("Ignoring unknown BOOTP client %s via %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
- return;
- }
-
- /* If we've been told not to boot with bootp on this
- network, ignore it. */
- if (!host &&
- !(packet -> shared_network -> group -> allow_bootp)) {
- note ("Ignoring BOOTP request from client %s via %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
- return;
- }
-
- /* If the packet is from a host we don't know and there
- are no dynamic bootp addresses on the network it came
- in on, drop it on the floor. */
- if (!(packet -> shared_network -> group -> dynamic_bootp)) {
- lose:
- note ("No applicable record for BOOTP host %s via %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
- return;
- }
-
- /* If a lease has already been assigned to this client
- and it's still okay to use dynamic bootp on
- that lease, reassign it. */
- if (lease) {
- /* If this lease can be used for dynamic bootp,
- do so. */
- if ((lease -> flags & DYNAMIC_BOOTP_OK)) {
-
- /* If it's not a DYNAMIC_BOOTP lease,
- release it before reassigning it
- so that we don't get a lease
- conflict. */
- if (!(lease -> flags & BOOTP_LEASE))
- release_lease (lease);
-
- lease -> host = host;
- ack_lease (packet, lease, 0, 0);
- return;
- }
-
- /* If dynamic BOOTP is no longer allowed for
- this lease, set it free. */
- release_lease (lease);
- }
-
- /* If there are dynamic bootp addresses that might be
- available, try to snag one. */
- for (lease = packet -> shared_network -> last_lease;
- lease && lease -> ends <= cur_time;
- lease = lease -> prev) {
- if ((lease -> flags & DYNAMIC_BOOTP_OK)) {
- lease -> host = host;
- ack_lease (packet, lease, 0, 0);
- return;
- }
- }
- goto lose;
- }
-
- /* Make sure we're allowed to boot this client. */
- if (hp && (!hp -> group -> allow_booting)) {
- note ("Ignoring excluded BOOTP client %s",
- hp -> name);
- return;
- }
-
- /* Make sure we're allowed to boot this client with bootp. */
- if (hp && (!hp -> group -> allow_bootp)) {
- note ("Ignoring BOOTP request from client %s",
- hp -> name);
- return;
- }
-
- /* Set up the outgoing packet... */
- memset (&outgoing, 0, sizeof outgoing);
- memset (&raw, 0, sizeof raw);
- outgoing.raw = &raw;
-
- /* Come up with a list of options that we want to send to this
- client. Start with the per-subnet options, and then override
- those with client-specific options. */
-
- memcpy (options, subnet -> group -> options, sizeof options);
-
- for (i = 0; i < 256; i++) {
- if (hp -> group -> options [i])
- options [i] = hp -> group -> options [i];
- }
-
- /* Pack the options into the buffer. Unlike DHCP, we can't
- pack options into the filename and server name buffers. */
-
- outgoing.packet_length =
- cons_options (packet, outgoing.raw, options, 0, 0);
- if (outgoing.packet_length < BOOTP_MIN_LEN)
- outgoing.packet_length = BOOTP_MIN_LEN;
-
- /* Take the fields that we care about... */
- raw.op = BOOTREPLY;
- raw.htype = packet -> raw -> htype;
- raw.hlen = packet -> raw -> hlen;
- memcpy (raw.chaddr, packet -> raw -> chaddr, raw.hlen);
- memset (&raw.chaddr [raw.hlen], 0,
- (sizeof raw.chaddr) - raw.hlen);
- raw.hops = packet -> raw -> hops;
- raw.xid = packet -> raw -> xid;
- raw.secs = packet -> raw -> secs;
- raw.flags = 0;
- raw.ciaddr = packet -> raw -> ciaddr;
- memcpy (&raw.yiaddr, ip_address.iabuf, sizeof raw.yiaddr);
-
- /* Figure out the address of the next server. */
- if (hp && hp -> group -> next_server.len)
- memcpy (&raw.siaddr, hp -> group -> next_server.iabuf, 4);
- else if (subnet -> group -> next_server.len)
- memcpy (&raw.siaddr, subnet -> group -> next_server.iabuf, 4);
- else if (subnet -> interface_address.len)
- memcpy (&raw.siaddr, subnet -> interface_address.iabuf, 4);
- else
- raw.siaddr = packet -> interface -> primary_address;
-
- raw.giaddr = packet -> raw -> giaddr;
- if (hp -> group -> server_name) {
- strncpy (raw.sname, hp -> group -> server_name,
- (sizeof raw.sname) - 1);
- raw.sname [(sizeof raw.sname) - 1] = 0;
- }
- if (hp -> group -> filename) {
- strncpy (raw.file, hp -> group -> filename,
- (sizeof raw.file) - 1);
- raw.file [(sizeof raw.file) - 1] = 0;
- }
-
- /* Set up the hardware destination address... */
- hto.htype = packet -> raw -> htype;
- hto.hlen = packet -> raw -> hlen;
- memcpy (hto.haddr, packet -> raw -> chaddr, hto.hlen);
-
- from = packet -> interface -> primary_address;
-
- /* Report what we're doing... */
- note ("BOOTREPLY for %s to %s (%s) via %s",
- piaddr (ip_address), hp -> name,
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
-
- /* Set up the parts of the address that are in common. */
- to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
- to.sin_len = sizeof to;
-#endif
- memset (to.sin_zero, 0, sizeof to.sin_zero);
-
- /* If this was gatewayed, send it back to the gateway... */
- if (raw.giaddr.s_addr) {
- to.sin_addr = raw.giaddr;
- to.sin_port = local_port;
-
-#ifdef USE_FALLBACK
- result = send_fallback (&fallback_interface,
- (struct packet *)0,
- &raw, outgoing.packet_length,
- from, &to, &hto);
- if (result < 0)
- warn ("send_fallback: %m");
- return;
-#endif
- /* Otherwise, broadcast it on the local network. */
- } else {
- to.sin_addr.s_addr = INADDR_BROADCAST;
- to.sin_port = remote_port; /* XXX */
- }
-
- errno = 0;
- result = send_packet (packet -> interface,
- packet, &raw, outgoing.packet_length,
- from, &to, &hto);
- if (result < 0)
- warn ("send_packet: %m");
-}
-
-void relay (ip, packet, length)
- struct interface_info *ip;
- struct dhcp_packet *packet;
- int length;
-{
-}
+++ /dev/null
-/* conflex.c
-
- Lexical scanner for dhcpd config file... */
-
-/*
- * Copyright (c) 1995, 1996, 1997 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"$Id: conflex.c,v 1.22 1997/02/22 12:23:40 mellon Exp $ Copyright (c) 1995, 1996, 1997 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-#include "dhctoken.h"
-#include <ctype.h>
-
-int lexline;
-int lexchar;
-char *token_line;
-char *prev_line;
-char *cur_line;
-char *tlname;
-
-static char line1 [81];
-static char line2 [81];
-static int lpos;
-static int line;
-static int tlpos;
-static int tline;
-static int token;
-static int ugflag;
-static char *tval;
-static char tokbuf [1500];
-
-#ifdef OLD_LEXER
-char comments [4096];
-int comment_index;
-#endif
-
-
-static int get_char PROTO ((FILE *));
-static int get_token PROTO ((FILE *));
-static void skip_to_eol PROTO ((FILE *));
-static int read_string PROTO ((FILE *));
-static int read_number PROTO ((int, FILE *));
-static int read_num_or_name PROTO ((int, FILE *));
-static int intern PROTO ((char *, int));
-
-void new_parse (name)
- char *name;
-{
- tlname = name;
- lpos = line = 1;
- cur_line = line1;
- prev_line = line2;
- token_line = cur_line;
- cur_line [0] = prev_line [0] = 0;
- warnings_occurred = 0;
-}
-
-static int get_char (cfile)
- FILE *cfile;
-{
- int c = getc (cfile);
- if (!ugflag) {
- if (c == EOL) {
- if (cur_line == line1) {
- cur_line = line2;
- prev_line = line1;
- } else {
- cur_line = line2;
- prev_line = line1;
- }
- line++;
- lpos = 1;
- cur_line [0] = 0;
- } else if (c != EOF) {
- if (lpos <= 81) {
- cur_line [lpos - 1] = c;
- cur_line [lpos] = 0;
- }
- lpos++;
- }
- } else
- ugflag = 0;
- return c;
-}
-
-static int get_token (cfile)
- FILE *cfile;
-{
- int c;
- int ttok;
- static char tb [2];
- int l, p, u;
-
- do {
- l = line;
- p = lpos;
- u = ugflag;
-
- c = get_char (cfile);
-#ifdef OLD_LEXER
- if (c == '\n' && p == 1 && !u
- && comment_index < sizeof comments)
- comments [comment_index++] = '\n';
-#endif
-
- if (isascii (c) && isspace (c))
- continue;
- if (c == '#') {
-#ifdef OLD_LEXER
- if (comment_index < sizeof comments)
- comments [comment_index++] = '#';
-#endif
- skip_to_eol (cfile);
- continue;
- }
- if (c == '"') {
- lexline = l;
- lexchar = p;
- ttok = read_string (cfile);
- break;
- }
- if ((isascii (c) && isdigit (c)) || c == '-') {
- lexline = l;
- lexchar = p;
- ttok = read_number (c, cfile);
- break;
- } else if (isascii (c) && isalpha (c)) {
- lexline = l;
- lexchar = p;
- ttok = read_num_or_name (c, cfile);
- break;
- } else {
- lexline = l;
- lexchar = p;
- tb [0] = c;
- tb [1] = 0;
- tval = tb;
- ttok = c;
- break;
- }
- } while (1);
- return ttok;
-}
-
-int next_token (rval, cfile)
- char **rval;
- FILE *cfile;
-{
- int rv;
-
- if (token) {
- if (lexline != tline)
- token_line = cur_line;
- lexchar = tlpos;
- lexline = tline;
- rv = token;
- token = 0;
- } else {
- rv = get_token (cfile);
- token_line = cur_line;
- }
- if (rval)
- *rval = tval;
-#ifdef DEBUG_TOKENS
- fprintf (stderr, "%s:%d ", tval, rv);
-#endif
- return rv;
-}
-
-int peek_token (rval, cfile)
- char **rval;
- FILE *cfile;
-{
- int x;
-
- if (!token) {
- tlpos = lexchar;
- tline = lexline;
- token = get_token (cfile);
- if (lexline != tline)
- token_line = prev_line;
- x = lexchar; lexchar = tlpos; tlpos = x;
- x = lexline; lexline = tline; tline = x;
- }
- if (rval)
- *rval = tval;
-#ifdef DEBUG_TOKENS
- fprintf (stderr, "(%s:%d) ", tval, token);
-#endif
- return token;
-}
-
-static void skip_to_eol (cfile)
- FILE *cfile;
-{
- int c;
- do {
- c = get_char (cfile);
- if (c == EOF)
- return;
-#ifdef OLD_LEXER
- if (comment_index < sizeof (comments))
- comments [comment_index++] = c;
-#endif
- if (c == EOL) {
- return;
- }
- } while (1);
-}
-
-static int read_string (cfile)
- FILE *cfile;
-{
- int i;
- int bs = 0;
- int c;
-
- for (i = 0; i < sizeof tokbuf; i++) {
- c = get_char (cfile);
- if (c == EOF) {
- parse_warn ("eof in string constant");
- break;
- }
- if (bs) {
- bs = 0;
- tokbuf [i] = c;
- } else if (c == '\\')
- bs = 1;
- else if (c == '"')
- break;
- else
- tokbuf [i] = c;
- }
- /* Normally, I'd feel guilty about this, but we're talking about
- strings that'll fit in a DHCP packet here... */
- if (i == sizeof tokbuf) {
- parse_warn ("string constant larger than internal buffer");
- --i;
- }
- tokbuf [i] = 0;
- tval = tokbuf;
- return STRING;
-}
-
-static int read_number (c, cfile)
- int c;
- FILE *cfile;
-{
- int seenx = 0;
- int i = 0;
- int token = NUMBER;
-
- tokbuf [i++] = c;
- for (; i < sizeof tokbuf; i++) {
- c = get_char (cfile);
- if (!seenx && c == 'x') {
- seenx = 1;
-#ifndef OLD_LEXER
- } else if (isascii (c) && !isxdigit (c) &&
- (c == '-' || c == '_' || isalpha (c))) {
- token = NAME;
- } else if (isascii (c) && !isdigit (c) && isxdigit (c)) {
- token = NUMBER_OR_NAME;
-#endif
- } else if (!isascii (c) || !isxdigit (c)) {
- ungetc (c, cfile);
- ugflag = 1;
- break;
- }
- tokbuf [i] = c;
- }
- if (i == sizeof tokbuf) {
- parse_warn ("numeric token larger than internal buffer");
- --i;
- }
- tokbuf [i] = 0;
- tval = tokbuf;
- return token;
-}
-
-static int read_num_or_name (c, cfile)
- int c;
- FILE *cfile;
-{
- int i = 0;
- int rv = NUMBER_OR_NAME;
- tokbuf [i++] = c;
- for (; i < sizeof tokbuf; i++) {
- c = get_char (cfile);
- if (!isascii (c) ||
- (c != '-' && c != '_' && !isalnum (c))) {
- ungetc (c, cfile);
- ugflag = 1;
- break;
- }
- if (!isxdigit (c))
- rv = NAME;
- tokbuf [i] = c;
- }
- if (i == sizeof tokbuf) {
- parse_warn ("token larger than internal buffer");
- --i;
- }
- tokbuf [i] = 0;
- tval = tokbuf;
- return intern (tval, rv);
-}
-
-static int intern (atom, dfv)
- char *atom;
- int dfv;
-{
- if (!isascii (atom [0]))
- return dfv;
-
- switch (tolower (atom [0])) {
- case 'a':
- if (!strcasecmp (atom + 1, "llow"))
- return ALLOW;
- if (!strcasecmp (atom + 1, "lias"))
- return ALIAS;
- break;
- case 'b':
- if (!strcasecmp (atom + 1, "ootp"))
- return BOOTP;
- if (!strcasecmp (atom + 1, "ooting"))
- return BOOTING;
- if (!strcasecmp (atom + 1, "oot-unknown-clients"))
- return BOOT_UNKNOWN_CLIENTS;
- case 'c':
- if (!strcasecmp (atom + 1, "lass"))
- return CLASS;
- if (!strcasecmp (atom + 1, "iaddr"))
- return CIADDR;
- if (!strcasecmp (atom + 1, "lient-identifier"))
- return CLIENT_IDENTIFIER;
- break;
- case 'd':
- if (!strcasecmp (atom + 1, "eny"))
- return DENY;
- if (!strncasecmp (atom + 1, "efault", 6)) {
- if (!atom [7])
- return DEFAULT;
- if (!strcasecmp (atom + 7, "-lease-time"))
- return DEFAULT_LEASE_TIME;
- break;
- }
- if (!strncasecmp (atom + 1, "ynamic-bootp", 12)) {
- if (!atom [13])
- return DYNAMIC_BOOTP;
- if (!strcasecmp (atom + 13, "-lease-cutoff"))
- return DYNAMIC_BOOTP_LEASE_CUTOFF;
- if (!strcasecmp (atom + 13, "-lease-length"))
- return DYNAMIC_BOOTP_LEASE_LENGTH;
- break;
- }
- break;
- case 'e':
- if (!strcasecmp (atom + 1, "thernet"))
- return ETHERNET;
- if (!strcasecmp (atom + 1, "nds"))
- return ENDS;
- if (!strcasecmp (atom + 1, "xpire"))
- return EXPIRE;
- break;
- case 'f':
- if (!strcasecmp (atom + 1, "ilename"))
- return FILENAME;
- if (!strcasecmp (atom + 1, "ixed-address"))
- return FIXED_ADDR;
- break;
- case 'g':
- if (!strcasecmp (atom + 1, "iaddr"))
- return GIADDR;
- if (!strcasecmp (atom + 1, "roup"))
- return GROUP;
- if (!strcasecmp (atom + 1, "et-lease-hostnames"))
- return GET_LEASE_HOSTNAMES;
- break;
- case 'h':
- if (!strcasecmp (atom + 1, "ost"))
- return HOST;
- if (!strcasecmp (atom + 1, "ardware"))
- return HARDWARE;
- break;
- case 'i':
- if (!strcasecmp (atom + 1, "nterface"))
- return INTERFACE;
- break;
- case 'l':
- if (!strcasecmp (atom + 1, "ease"))
- return LEASE;
- break;
- case 'm':
- if (!strcasecmp (atom + 1, "ax-lease-time"))
- return MAX_LEASE_TIME;
- if (!strncasecmp (atom + 1, "edi", 3)) {
- if (!strcasecmp (atom + 4, "a"))
- return MEDIA;
- if (!strcasecmp (atom + 4, "um"))
- return MEDIUM;
- break;
- }
- break;
- case 'n':
- if (!strcasecmp (atom + 1, "etmask"))
- return NETMASK;
- if (!strcasecmp (atom + 1, "ext-server"))
- return NEXT_SERVER;
- break;
- case 'o':
- if (!strcasecmp (atom + 1, "ption"))
- return OPTION;
- if (!strcasecmp (atom + 1, "ne-lease-per-client"))
- return ONE_LEASE_PER_CLIENT;
- break;
- case 'p':
- if (!strcasecmp (atom + 1, "acket"))
- return PACKET;
- break;
- case 'r':
- if (!strcasecmp (atom + 1, "ange"))
- return RANGE;
- if (!strcasecmp (atom + 1, "equest"))
- return REQUEST;
- if (!strcasecmp (atom + 1, "equire"))
- return REQUIRE;
- if (!strcasecmp (atom + 1, "etry"))
- return RETRY;
- if (!strcasecmp (atom + 1, "enew"))
- return RENEW;
- if (!strcasecmp (atom + 1, "ebind"))
- return REBIND;
- break;
- case 's':
- if (!strcasecmp (atom + 1, "tarts"))
- return STARTS;
- if (!strcasecmp (atom + 1, "iaddr"))
- return SIADDR;
- if (!strcasecmp (atom + 1, "ubnet"))
- return SUBNET;
- if (!strcasecmp (atom + 1, "hared-network"))
- return SHARED_NETWORK;
- if (!strcasecmp (atom + 1, "erver-name"))
- return SERVER_NAME;
- if (!strcasecmp (atom + 1, "erver-identifier"))
- return SERVER_IDENTIFIER;
- if (!strcasecmp (atom + 1, "elect-timeout"))
- return SELECT_TIMEOUT;
- if (!strcasecmp (atom + 1, "end"))
- return SEND;
- if (!strcasecmp (atom + 1, "cript"))
- return SCRIPT;
- break;
- case 't':
- if (!strcasecmp (atom + 1, "imestamp"))
- return TIMESTAMP;
- if (!strcasecmp (atom + 1, "imeout"))
- return TIMEOUT;
- if (!strcasecmp (atom + 1, "oken-ring"))
- return TOKEN_RING;
- break;
- case 'u':
- if (!strcasecmp (atom + 1, "id"))
- return UID;
- if (!strcasecmp (atom + 1, "ser-class"))
- return USER_CLASS;
- if (!strcasecmp (atom + 1, "se-host-decl-names"))
- return USE_HOST_DECL_NAMES;
- if (!strcasecmp (atom + 1, "nknown-clients"))
- return UNKNOWN_CLIENTS;
- break;
- case 'v':
- if (!strcasecmp (atom + 1, "endor-class"))
- return VENDOR_CLASS;
- break;
- case 'y':
- if (!strcasecmp (atom + 1, "iaddr"))
- return YIADDR;
- break;
- }
- return dfv;
-}
+++ /dev/null
-/* db.c
-
- Persistent database management routines for DHCPD... */
-
-/*
- * Copyright (c) 1995, 1996 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"$Id: db.c,v 1.8 1996/09/02 21:16:24 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-FILE *db_file;
-
-static int counting = 0;
-static int count = 0;
-TIME write_time;
-
-/* Write the specified lease to the current lease database file. */
-
-int write_lease (lease)
- struct lease *lease;
-{
- struct tm *t;
- char tbuf [64];
- int errors = 0;
-
- if (counting)
- ++count;
- errno = 0;
- fprintf (db_file, "lease %s {\n", piaddr (lease -> ip_addr));
- if (errno) {
- ++errors;
- }
-
- t = gmtime (&lease -> starts);
- sprintf (tbuf, "%d %d/%d/%d %02d:%02d:%02d;",
- t -> tm_wday, t -> tm_year + 1900,
- t -> tm_mon + 1, t -> tm_mday,
- t -> tm_hour, t -> tm_min, t -> tm_sec);
- errno = 0;
- fprintf (db_file, "\tstarts %s\n", tbuf);
- if (errno) {
- ++errors;
- }
-
- t = gmtime (&lease -> ends);
- sprintf (tbuf, "%d %d/%d/%d %02d:%02d:%02d;",
- t -> tm_wday, t -> tm_year + 1900,
- t -> tm_mon + 1, t -> tm_mday,
- t -> tm_hour, t -> tm_min, t -> tm_sec);
- errno = 0;
- fprintf (db_file, "\tends %s", tbuf);
- if (errno) {
- ++errors;
- }
-
- if (lease -> hardware_addr.hlen) {
- errno = 0;
- fprintf (db_file, "\n\thardware %s %s;",
- hardware_types [lease -> hardware_addr.htype],
- print_hw_addr (lease -> hardware_addr.htype,
- lease -> hardware_addr.hlen,
- lease -> hardware_addr.haddr));
- if (errno) {
- ++errors;
- }
- }
- if (lease -> uid_len) {
- int i;
- errno = 0;
- fprintf (db_file, "\n\tuid %x", lease -> uid [0]);
- if (errno) {
- ++errors;
- }
- for (i = 1; i < lease -> uid_len; i++) {
- errno = 0;
- fprintf (db_file, ":%x", lease -> uid [i]);
- if (errno) {
- ++errors;
- }
- }
- putc (';', db_file);
- }
- if (lease -> flags & BOOTP_LEASE) {
- errno = 0;
- fprintf (db_file, "\n\tdynamic-bootp;");
- if (errno) {
- ++errors;
- }
- }
- errno = 0;
- fputs ("\n}\n", db_file);
- if (errno) {
- ++errors;
- }
- if (errors)
- note ("write_lease: unable to write lease %s",
- piaddr (lease -> ip_addr));
- return !errors;
-}
-
-/* Commit any leases that have been written out... */
-
-int commit_leases ()
-{
- /* Commit any outstanding writes to the lease database file.
- We need to do this even if we're rewriting the file below,
- just in case the rewrite fails. */
- if (fflush (db_file) == EOF) {
- note ("commit_leases: unable to commit: %m");
- return 0;
- }
- if (fsync (fileno (db_file)) < 0) {
- note ("commit_leases: unable to commit: %m");
- return 0;
- }
-
- /* If we've written more than a thousand leases or if
- we haven't rewritten the lease database in over an
- hour, rewrite it now. */
- if (count > 1000 || (count && cur_time - write_time > 3600)) {
- count = 0;
- write_time = cur_time;
- new_lease_file ();
- }
- return 1;
-}
-
-void db_startup ()
-{
- /* Read in the existing lease file... */
- read_leases ();
-
- new_lease_file ();
-}
-
-void new_lease_file ()
-{
- char newfname [512];
- char backfname [512];
- TIME t;
-
- /* If we already have an open database, close it. */
- if (db_file) {
- fclose (db_file);
- }
-
- /* Make a temporary lease file... */
- time (&t);
- sprintf (newfname, "%s.%d", path_dhcpd_db, (int) (t & 32767));
- if ((db_file = fopen (newfname, "w")) == NULL) {
- error ("Can't start new lease file: %m");
- }
-
- /* Write out all the leases that we know of... */
- counting = 0;
- write_leases ();
-
- /* Get the old database out of the way... */
- sprintf (backfname, "%s~", path_dhcpd_db);
- if (unlink (backfname) < 0 && errno != ENOENT)
- error ("Can't remove old lease database backup %s: %m",
- backfname);
- if (link (path_dhcpd_db, backfname) < 0)
- error ("Can't backup lease database %s to %s: %m",
- path_dhcpd_db, backfname);
-
- /* Move in the new file... */
- if (rename (newfname, path_dhcpd_db) < 0)
- error ("Can't install new lease database %s to %s: %m",
- newfname, path_dhcpd_db);
-
- counting = 1;
-}
+++ /dev/null
-/* dhcp.c
-
- DHCP Protocol engine. */
-
-/*
- * Copyright (c) 1995, 1996, 1997 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char copyright[] =
-"$Id: dhcp.c,v 1.40 1997/02/22 12:25:11 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
-#endif /* not lint */
-
-#include "dhcpd.h"
-
-static unsigned char dhcp_message [256];
-
-void dhcp (packet)
- struct packet *packet;
-{
- if (!locate_network (packet) && packet -> packet_type != DHCPREQUEST)
- return;
-
- switch (packet -> packet_type) {
- case DHCPDISCOVER:
- dhcpdiscover (packet);
- break;
-
- case DHCPREQUEST:
- dhcprequest (packet);
- break;
-
- case DHCPRELEASE:
- dhcprelease (packet);
- break;
-
- case DHCPDECLINE:
- dhcpdecline (packet);
- break;
-
- case DHCPINFORM:
- dhcpinform (packet);
- break;
-
- default:
- break;
- }
-}
-
-void dhcpdiscover (packet)
- struct packet *packet;
-{
- struct lease *lease = find_lease (packet, packet -> shared_network);
- struct host_decl *hp;
-
- note ("DHCPDISCOVER from %s via %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
-
- /* Sourceless packets don't make sense here. */
- if (!packet -> shared_network) {
- note ("Packet from unknown subnet: %s",
- inet_ntoa (packet -> raw -> giaddr));
- return;
- }
-
- /* If we didn't find a lease, try to allocate one... */
- if (!lease) {
- lease = packet -> shared_network -> last_lease;
-
- /* If there are no leases in that subnet that have
- expired, we have nothing to offer this client. */
- if (!lease || lease -> ends > cur_time) {
- note ("no free leases on subnet %s",
- packet -> shared_network -> name);
- return;
- }
-
- /* Try to find a host_decl that matches the client
- identifier or hardware address on the packet, and
- has no fixed IP address. If there is one, hang
- it off the lease so that its option definitions
- can be used. */
- if (((packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len
- != 0) &&
- ((hp = find_hosts_by_uid
- (packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].data,
- packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len))
- != (struct host_decl *)0)) ||
- ((hp = find_hosts_by_haddr (packet -> raw -> htype,
- packet -> raw -> chaddr,
- packet -> raw -> hlen))
- != (struct host_decl *)0)) {
- for (; hp; hp = hp -> n_ipaddr) {
- if (!hp -> fixed_addr) {
- lease -> host = hp;
- break;
- }
- }
- } else {
- lease -> host = (struct host_decl *)0;
- }
- }
-
- /* If this subnet won't boot unknown clients, ignore the
- request. */
- if (!lease -> host &&
- !lease -> subnet -> group -> boot_unknown_clients) {
- note ("Ignoring unknown client %s",
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr));
- } else if (lease -> host &&
- !lease -> host -> group -> allow_booting) {
- note ("Declining to boot client %s",
- lease -> host -> name);
- } else
- ack_lease (packet, lease, DHCPOFFER, cur_time + 120);
-}
-
-void dhcprequest (packet)
- struct packet *packet;
-{
- struct lease *lease;
- struct iaddr cip;
- struct subnet *subnet;
-
- if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) {
- cip.len = 4;
- memcpy (cip.iabuf,
- packet -> options [DHO_DHCP_REQUESTED_ADDRESS].data,
- 4);
- } else {
- cip.len = 4;
- memcpy (cip.iabuf, &packet -> raw -> ciaddr.s_addr, 4);
- }
- subnet = find_subnet (cip);
-
- /* Find the lease that matches the address requested by the
- client. */
- if (packet -> shared_network)
- lease = find_lease (packet, packet -> shared_network);
- else
- lease = (struct lease *)0;
-
- note ("DHCPREQUEST for %s from %s via %s",
- piaddr (cip),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
-
- /* If we found a lease for the client but it's not the one the
- client asked for, don't send it - some other server probably
- made the cut. */
- if (lease && !addr_eq (lease -> ip_addr, cip)) {
- return;
- }
-
- /* If a client on a given network wants to request a lease on
- an address on a different network, NAK it. If the Requested
- Address option was used, the protocol says that it must have
- been broadcast, so we can trust the source network information.
-
- If ciaddr was specified and Requested Address was not, then
- we really only know for sure what network a packet came from
- if it came through a BOOTP gateway - if it came through an
- IP router, we'll just have to assume that it's cool.
-
- This violates the protocol spec in the case that the client
- is in the REBINDING state and broadcasts a DHCPREQUEST on
- the local wire. We're supposed to check ciaddr for
- validity in that case, but if the packet was unicast
- through a router from a client in the RENEWING state, it
- would look exactly the same to us and it would be very
- bad to send a DHCPNAK. I think we just have to live with
- this. */
- if ((packet -> raw -> ciaddr.s_addr &&
- packet -> raw -> giaddr.s_addr) ||
- packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) {
-
- /* If we don't know where it came from but we do know
- where it claims to have come from, it didn't come
- from there. Fry it. */
- if (!packet -> shared_network) {
- if (subnet) {
- nak_lease (packet, &cip);
- return;
- }
- /* Otherwise, ignore it. */
- return;
- }
-
- /* If we do know where it came from and we don't know
- where it claims to have come from, same deal - fry it. */
- subnet = find_grouped_subnet (packet -> shared_network, cip);
- if (!subnet) {
- nak_lease (packet, &cip);
- return;
- }
- }
-
- /* If we own the lease that the client is asking for,
- and it's already been assigned to the client, ack it. */
- if (lease &&
- ((lease -> uid_len && lease -> uid_len ==
- packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len &&
- !memcmp (packet -> options
- [DHO_DHCP_CLIENT_IDENTIFIER].data,
- lease -> uid, lease -> uid_len)) ||
- (lease -> hardware_addr.hlen == packet -> raw -> hlen &&
- lease -> hardware_addr.htype == packet -> raw -> htype &&
- !memcmp (lease -> hardware_addr.haddr,
- packet -> raw -> chaddr,
- packet -> raw -> hlen)))) {
- ack_lease (packet, lease, DHCPACK, 0);
- return;
- }
-}
-
-void dhcprelease (packet)
- struct packet *packet;
-{
- struct lease *lease = find_lease (packet, packet -> shared_network);
-
- note ("DHCPRELEASE of %s from %s via %s",
- inet_ntoa (packet -> raw -> ciaddr),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
-
-
- /* If we found a lease, release it. */
- if (lease) {
- release_lease (lease);
- }
-}
-
-void dhcpdecline (packet)
- struct packet *packet;
-{
- struct lease *lease = find_lease (packet, packet -> shared_network);
- struct iaddr cip;
-
- if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) {
- cip.len = 4;
- memcpy (cip.iabuf,
- packet -> options [DHO_DHCP_REQUESTED_ADDRESS].data,
- 4);
- } else {
- cip.len = 0;
- }
-
- note ("DHCPDECLINE on %s from %s via %s",
- piaddr (cip),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
-
-
- /* If we found a lease, mark it as unusable and complain. */
- if (lease) {
- abandon_lease (lease);
- }
-}
-
-void dhcpinform (packet)
- struct packet *packet;
-{
- note ("DHCPINFORM from %s",
- inet_ntoa (packet -> raw -> ciaddr));
-}
-
-void nak_lease (packet, cip)
- struct packet *packet;
- struct iaddr *cip;
-{
- struct sockaddr_in to;
- struct in_addr from;
- int result;
- struct dhcp_packet raw;
- unsigned char nak = DHCPNAK;
- struct packet outgoing;
- struct hardware hto;
-
- struct tree_cache *options [256];
- struct tree_cache dhcpnak_tree;
- struct tree_cache dhcpmsg_tree;
-
- memset (options, 0, sizeof options);
- memset (&outgoing, 0, sizeof outgoing);
- memset (&raw, 0, sizeof raw);
- outgoing.raw = &raw;
-
- /* Set DHCP_MESSAGE_TYPE to DHCPNAK */
- options [DHO_DHCP_MESSAGE_TYPE] = &dhcpnak_tree;
- options [DHO_DHCP_MESSAGE_TYPE] -> value = &nak;
- options [DHO_DHCP_MESSAGE_TYPE] -> len = sizeof nak;
- options [DHO_DHCP_MESSAGE_TYPE] -> buf_size = sizeof nak;
- options [DHO_DHCP_MESSAGE_TYPE] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_MESSAGE_TYPE] -> tree = (struct tree *)0;
-
- /* Set DHCP_MESSAGE to whatever the message is */
- options [DHO_DHCP_MESSAGE] = &dhcpmsg_tree;
- options [DHO_DHCP_MESSAGE] -> value = dhcp_message;
- options [DHO_DHCP_MESSAGE] -> len = strlen (dhcp_message);
- options [DHO_DHCP_MESSAGE] -> buf_size = strlen (dhcp_message);
- options [DHO_DHCP_MESSAGE] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_MESSAGE] -> tree = (struct tree *)0;
-
- /* Do not use the client's requested parameter list. */
- packet -> options [DHO_DHCP_PARAMETER_REQUEST_LIST].len = 0;
- packet -> options [DHO_DHCP_PARAMETER_REQUEST_LIST].data =
- (unsigned char *)0;
-
- /* Set up the option buffer... */
- outgoing.packet_length =
- cons_options (packet, outgoing.raw, options, 0, 0);
-
-/* memset (&raw.ciaddr, 0, sizeof raw.ciaddr);*/
- raw.siaddr = packet -> interface -> primary_address;
- raw.giaddr = packet -> raw -> giaddr;
- memcpy (raw.chaddr, packet -> raw -> chaddr, sizeof raw.chaddr);
- raw.hlen = packet -> raw -> hlen;
- raw.htype = packet -> raw -> htype;
-
- raw.xid = packet -> raw -> xid;
- raw.secs = packet -> raw -> secs;
- raw.flags = packet -> raw -> flags | htons (BOOTP_BROADCAST);
- raw.hops = packet -> raw -> hops;
- raw.op = BOOTREPLY;
-
- /* Report what we're sending... */
- note ("DHCPNAK on %s to %s via %s",
- piaddr (*cip),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
-
-
-
-#ifdef DEBUG_PACKET
- dump_packet (packet);
- dump_raw ((unsigned char *)packet -> raw, packet -> packet_length);
- dump_packet (&outgoing);
- dump_raw ((unsigned char *)&raw, outgoing.packet_length);
-#endif
-
- hto.htype = packet -> raw -> htype;
- hto.hlen = packet -> raw -> hlen;
- memcpy (hto.haddr, packet -> raw -> chaddr, hto.hlen);
-
- /* Set up the common stuff... */
- to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
- to.sin_len = sizeof to;
-#endif
- memset (to.sin_zero, 0, sizeof to.sin_zero);
-
- from = packet -> interface -> primary_address;
-
- /* If this was gatewayed, send it back to the gateway.
- Otherwise, broadcast it on the local network. */
- if (raw.giaddr.s_addr) {
- to.sin_addr = raw.giaddr;
- to.sin_port = local_port;
-
- if (outgoing.packet_length < BOOTP_MIN_LEN)
- outgoing.packet_length = BOOTP_MIN_LEN;
-
-#ifdef USE_FALLBACK
- result = send_fallback (&fallback_interface,
- packet, &raw, outgoing.packet_length,
- from, &to, &hto);
- if (result < 0)
- warn ("send_fallback: %m");
- return;
-#endif
- } else {
- to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
- to.sin_port = packet->client_port;
- }
-
- errno = 0;
- result = send_packet (packet -> interface,
- packet, &raw, outgoing.packet_length,
- from, &to, (struct hardware *)0);
- if (result < 0)
- warn ("send_packet: %m");
-}
-
-void ack_lease (packet, lease, offer, when)
- struct packet *packet;
- struct lease *lease;
- unsigned char offer;
- TIME when;
-{
- struct lease lt;
- TIME lease_time;
- TIME offered_lease_time;
-
- int bufs = 0;
- struct packet outgoing;
- struct dhcp_packet raw;
- struct tree_cache *options [256];
- struct sockaddr_in to;
- struct in_addr from;
- struct hardware hto;
- int result;
-
- unsigned char lease_time_buf [4];
- unsigned char lease_t1_buf [4];
- unsigned char lease_t2_buf [4];
- struct tree_cache lease_time_tree;
- struct tree_cache lease_t1_tree;
- struct tree_cache lease_t2_tree;
- struct tree_cache dhcpoffer_tree;
- struct tree_cache server_id_tree;
- struct tree_cache vendor_class_tree;
- struct tree_cache user_class_tree;
- struct tree_cache hostname_tree;
- struct tree_cache netmask_tree;
-
- struct class *vendor_class, *user_class;
- char *filename;
- char *server_name;
- int i;
-
- if (packet -> options [DHO_DHCP_CLASS_IDENTIFIER].len) {
- vendor_class =
- find_class (0,
- packet ->
- options [DHO_DHCP_CLASS_IDENTIFIER].data,
- packet ->
- options [DHO_DHCP_CLASS_IDENTIFIER].len);
- } else {
- vendor_class = (struct class *)0;
- }
-
- if (packet -> options [DHO_DHCP_USER_CLASS_ID].len) {
- user_class =
- find_class (1,
- packet ->
- options [DHO_DHCP_USER_CLASS_ID].data,
- packet ->
- options [DHO_DHCP_USER_CLASS_ID].len);
- } else {
- user_class = (struct class *)0;
- }
-
- /* Choose a filename; first from the host_decl, if any, then from
- the user class, then from the vendor class. */
- if (lease -> host && lease -> host -> group -> filename)
- filename = lease -> host -> group -> filename;
- else if (user_class && user_class -> group -> filename)
- filename = user_class -> group -> filename;
- else if (vendor_class && vendor_class -> group -> filename)
- filename = vendor_class -> group -> filename;
- else filename = (char *)0;
-
- /* Choose a server name as above. */
- if (lease -> host && lease -> host -> group -> server_name)
- server_name = lease -> host -> group -> server_name;
- else if (user_class && user_class -> group -> server_name)
- server_name = user_class -> group -> server_name;
- else if (vendor_class && vendor_class -> group -> server_name)
- server_name = vendor_class -> group -> server_name;
- else server_name = (char *)0;
-
- /* At this point, we have a lease that we can offer the client.
- Now we construct a lease structure that contains what we want,
- and call supersede_lease to do the right thing with it. */
-
- memset (<, 0, sizeof lt);
-
- /* Use the ip address of the lease that we finally found in
- the database. */
- lt.ip_addr = lease -> ip_addr;
-
- /* Start now. */
- lt.starts = cur_time;
-
- /* Figure out how long a lease to assign. If this is a
- dynamic BOOTP lease, its duration must be infinite. */
- if (offer) {
- if (packet -> options [DHO_DHCP_LEASE_TIME].len == 4) {
- lease_time = getULong
- (packet -> options [DHO_DHCP_LEASE_TIME].data);
-
- /* Don't let the client ask for a longer lease than
- is supported for this subnet or host. */
- if (lease -> host &&
- lease -> host -> group -> max_lease_time) {
- if (lease_time >
- lease -> host -> group -> max_lease_time)
- lease_time = (lease -> host ->
- group -> max_lease_time);
- } else {
- if (lease_time >
- lease -> subnet -> group -> max_lease_time)
- lease_time = (lease -> subnet ->
- group -> max_lease_time);
- }
- } else {
- if (lease -> host
- && lease -> host -> group -> default_lease_time)
- lease_time = (lease -> host ->
- group -> default_lease_time);
- else
- lease_time = (lease -> subnet ->
- group -> default_lease_time);
- }
-
- lt.offered_expiry = cur_time + lease_time;
- if (when)
- lt.ends = when;
- else
- lt.ends = lt.offered_expiry;
- } else {
- if (lease -> host &&
- lease -> host -> group -> bootp_lease_length)
- lt.ends = (cur_time +
- lease -> host ->
- group -> bootp_lease_length);
- else if (lease -> subnet -> group -> bootp_lease_length)
- lt.ends = (cur_time +
- lease -> subnet ->
- group -> bootp_lease_length);
- else if (lease -> host &&
- lease -> host -> group -> bootp_lease_cutoff)
- lt.ends = lease -> host -> group -> bootp_lease_cutoff;
- else
- lt.ends = (lease -> subnet ->
- group -> bootp_lease_cutoff);
- lt.offered_expiry = lt.ends;
- lt.flags = BOOTP_LEASE;
- }
-
- lt.timestamp = cur_time;
-
- /* Record the uid, if given... */
- if (packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len) {
- lt.uid_len =
- packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len;
- lt.uid = packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].data;
- packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].data =
- (unsigned char *)0;
- packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len = 0;
- }
-
- /* Record the hardware address, if given... */
- lt.hardware_addr.hlen = packet -> raw -> hlen;
- lt.hardware_addr.htype = packet -> raw -> htype;
- memcpy (lt.hardware_addr.haddr, packet -> raw -> chaddr,
- packet -> raw -> hlen);
-
- lt.host = lease -> host;
- lt.subnet = lease -> subnet;
- lt.shared_network = lease -> shared_network;
-
- /* Record the transaction id... */
- lt.xid = packet -> raw -> xid;
-
- /* Don't call supersede_lease on a mocked-up lease. */
- if (lease -> flags & STATIC_LEASE)
- ;
- else
- /* Install the new information about this lease in the database.
- If this is a DHCPACK or a dynamic BOOTREPLY and we can't write
- the lease, don't ACK it (or BOOTREPLY it) either. */
- if (!(supersede_lease (lease, <, !offer || offer == DHCPACK)
- || (offer && offer != DHCPACK)))
- return;
-
- /* Send a response to the client... */
-
- memset (&outgoing, 0, sizeof outgoing);
- memset (&raw, 0, sizeof raw);
- outgoing.raw = &raw;
-
- /* Copy in the filename if given; otherwise, flag the filename
- buffer as available for options. */
- if (filename)
- strncpy (raw.file, filename, sizeof raw.file);
- else
- bufs |= 1;
-
- /* Copy in the server name if given; otherwise, flag the
- server_name buffer as available for options. */
- if (server_name)
- strncpy (raw.sname, server_name, sizeof raw.sname);
- else
- bufs |= 2; /* XXX */
-
- memcpy (raw.chaddr, packet -> raw -> chaddr, packet -> raw -> hlen);
- raw.hlen = packet -> raw -> hlen;
- raw.htype = packet -> raw -> htype;
-
- /* Start out with the subnet options... */
- memcpy (options, lease -> subnet -> group -> options, sizeof options);
-
- /* Vendor and user classes are only supported for DHCP clients. */
- if (offer) {
- /* If we have a vendor class, install those options,
- superseding any subnet options. */
- if (vendor_class) {
- for (i = 0; i < 256; i++)
- if (vendor_class -> group -> options [i])
- options [i] = (vendor_class -> group ->
- options [i]);
- }
-
- /* If we have a user class, install those options,
- superseding any subnet and vendor class options. */
- if (user_class) {
- for (i = 0; i < 256; i++)
- if (user_class -> group -> options [i])
- options [i] = (user_class -> group ->
- options [i]);
- }
-
- }
-
- /* If we have a host_decl structure, install the associated
- options, superseding anything that's in the way. */
- if (lease -> host) {
- for (i = 0; i < 256; i++)
- if (lease -> host -> group -> options [i])
- options [i] = (lease -> host ->
- group -> options [i]);
- }
-
- /* If we didn't get a hostname from an option somewhere, see if
- we can get one from the lease. */
- if (!options [DHO_HOST_NAME] && lease -> hostname) {
- options [DHO_HOST_NAME] = &hostname_tree;
- options [DHO_HOST_NAME] -> value =
- (unsigned char *)lease -> hostname;
- options [DHO_HOST_NAME] -> buf_size =
- options [DHO_HOST_NAME] -> len =
- strlen (lease -> hostname);
- options [DHO_HOST_NAME] -> timeout = 0xFFFFFFFF;
- options [DHO_HOST_NAME] -> tree = (struct tree *)0;
- }
-
- /* Now, if appropriate, put in DHCP-specific options that
- override those. */
- if (offer) {
- options [DHO_DHCP_MESSAGE_TYPE] = &dhcpoffer_tree;
- options [DHO_DHCP_MESSAGE_TYPE] -> value = &offer;
- options [DHO_DHCP_MESSAGE_TYPE] -> len = sizeof offer;
- options [DHO_DHCP_MESSAGE_TYPE] -> buf_size = sizeof offer;
- options [DHO_DHCP_MESSAGE_TYPE] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_MESSAGE_TYPE] -> tree = (struct tree *)0;
-
- options [DHO_DHCP_SERVER_IDENTIFIER] = &server_id_tree;
- options [DHO_DHCP_SERVER_IDENTIFIER] -> value =
- (unsigned char *)
- &packet -> interface -> primary_address;
- options [DHO_DHCP_SERVER_IDENTIFIER] -> len =
- sizeof packet -> interface -> primary_address;
- options [DHO_DHCP_SERVER_IDENTIFIER] -> buf_size =
- sizeof packet -> interface -> primary_address;
- options [DHO_DHCP_SERVER_IDENTIFIER] -> timeout =
- 0xFFFFFFFF;
- options [DHO_DHCP_SERVER_IDENTIFIER] -> tree =
- (struct tree *)0;
-
- /* Sanity check the lease time. */
- if ((lease->offered_expiry - cur_time) < 15)
- offered_lease_time = (lease -> subnet ->
- group -> default_lease_time);
- else if (lease -> offered_expiry - cur_time >
- lease -> subnet -> group -> max_lease_time)
- offered_lease_time = (lease -> subnet ->
- group -> max_lease_time);
- else
- offered_lease_time =
- lease -> offered_expiry - cur_time;
-
- putULong (lease_time_buf, offered_lease_time);
- options [DHO_DHCP_LEASE_TIME] = &lease_time_tree;
- options [DHO_DHCP_LEASE_TIME] -> value = lease_time_buf;
- options [DHO_DHCP_LEASE_TIME] -> len = sizeof lease_time_buf;
- options [DHO_DHCP_LEASE_TIME] ->
- buf_size = sizeof lease_time_buf;
- options [DHO_DHCP_LEASE_TIME] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_LEASE_TIME] -> tree = (struct tree *)0;
-
- /* Renewal time is lease time * 0.5. */
- offered_lease_time /= 2;
- putULong (lease_t1_buf, offered_lease_time);
- options [DHO_DHCP_RENEWAL_TIME] = &lease_t1_tree;
- options [DHO_DHCP_RENEWAL_TIME] -> value = lease_t1_buf;
- options [DHO_DHCP_RENEWAL_TIME] -> len = sizeof lease_t1_buf;
- options [DHO_DHCP_RENEWAL_TIME] ->
- buf_size = sizeof lease_t1_buf;
- options [DHO_DHCP_RENEWAL_TIME] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_RENEWAL_TIME] -> tree = (struct tree *)0;
-
- /* Rebinding time is lease time * 0.875. */
- offered_lease_time += (offered_lease_time / 2
- + offered_lease_time / 4);
- putULong (lease_t2_buf, offered_lease_time);
- options [DHO_DHCP_REBINDING_TIME] = &lease_t2_tree;
- options [DHO_DHCP_REBINDING_TIME] -> value = lease_t2_buf;
- options [DHO_DHCP_REBINDING_TIME] -> len = sizeof lease_t2_buf;
- options [DHO_DHCP_REBINDING_TIME] ->
- buf_size = sizeof lease_t2_buf;
- options [DHO_DHCP_REBINDING_TIME] -> timeout = 0xFFFFFFFF;
- options [DHO_DHCP_REBINDING_TIME] -> tree = (struct tree *)0;
-
- /* If we used the vendor class the client specified, we
- have to return it. */
- if (vendor_class) {
- options [DHO_DHCP_CLASS_IDENTIFIER] =
- &vendor_class_tree;
- options [DHO_DHCP_CLASS_IDENTIFIER] ->
- value = (unsigned char *)vendor_class -> name;
- options [DHO_DHCP_CLASS_IDENTIFIER] ->
- len = strlen (vendor_class -> name);
- options [DHO_DHCP_CLASS_IDENTIFIER] ->
- buf_size = strlen (vendor_class -> name);
- options [DHO_DHCP_CLASS_IDENTIFIER] ->
- timeout = 0xFFFFFFFF;
- options [DHO_DHCP_CLASS_IDENTIFIER] ->
- tree = (struct tree *)0;
- }
-
- /* If we used the user class the client specified, we
- have to return it. */
- if (user_class) {
- options [DHO_DHCP_USER_CLASS_ID] = &user_class_tree;
- options [DHO_DHCP_USER_CLASS_ID] ->
- value = (unsigned char *)user_class -> name;
- options [DHO_DHCP_USER_CLASS_ID] ->
- len = strlen (user_class -> name);
- options [DHO_DHCP_USER_CLASS_ID] ->
- buf_size = strlen (user_class -> name);
- options [DHO_DHCP_USER_CLASS_ID] ->
- timeout = 0xFFFFFFFF;
- options [DHO_DHCP_USER_CLASS_ID] ->
- tree = (struct tree *)0;
- }
- }
-
- /* Use the subnet mask from the subnet declaration if no other
- mask has been provided. */
- if (!options [DHO_SUBNET_MASK]) {
- options [DHO_SUBNET_MASK] = &netmask_tree;
- netmask_tree.value = lease -> subnet -> netmask.iabuf;
- netmask_tree.len = lease -> subnet -> netmask.len;
- netmask_tree.buf_size = lease -> subnet -> netmask.len;
- netmask_tree.timeout = 0xFFFFFFFF;
- netmask_tree.tree = (struct tree *)0;
- }
-
- /* See if this is a Microsoft client that NUL-terminates its
- strings and expects us to do likewise... */
- if (packet -> options [DHO_HOST_NAME].data &&
- packet -> options [DHO_HOST_NAME].data
- [packet -> options [DHO_HOST_NAME].len - 1] == '\0')
- outgoing.packet_length =
- cons_options (packet, outgoing.raw, options, bufs, 1);
- else
- outgoing.packet_length =
- cons_options (packet, outgoing.raw, options, bufs, 0);
- if (!offer && outgoing.packet_length < BOOTP_MIN_LEN)
- outgoing.packet_length = BOOTP_MIN_LEN;
-
- raw.ciaddr = packet -> raw -> ciaddr;
- memcpy (&raw.yiaddr, lease -> ip_addr.iabuf, 4);
-
- /* Figure out the address of the next server. */
- if (lease -> host && lease -> host -> group -> next_server.len)
- memcpy (&raw.siaddr,
- lease -> host -> group -> next_server.iabuf, 4);
- else if (lease -> subnet -> group -> next_server.len)
- memcpy (&raw.siaddr,
- lease -> subnet -> group -> next_server.iabuf, 4);
- else if (lease -> subnet -> interface_address.len)
- memcpy (&raw.siaddr,
- lease -> subnet -> interface_address.iabuf, 4);
- else
- raw.siaddr = packet -> interface -> primary_address;
-
- raw.giaddr = packet -> raw -> giaddr;
-
- raw.xid = packet -> raw -> xid;
- raw.secs = packet -> raw -> secs;
- raw.flags = packet -> raw -> flags;
- raw.hops = packet -> raw -> hops;
- raw.op = BOOTREPLY;
-
- /* Say what we're doing... */
- note ("%s on %s to %s via %s",
- (offer
- ? (offer == DHCPACK ? "DHCPACK" : "DHCPOFFER")
- : "BOOTREPLY"),
- piaddr (lease -> ip_addr),
- print_hw_addr (packet -> raw -> htype,
- packet -> raw -> hlen,
- packet -> raw -> chaddr),
- packet -> raw -> giaddr.s_addr
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
-
- /* Set up the hardware address... */
- hto.htype = packet -> raw -> htype;
- hto.hlen = packet -> raw -> hlen;
- memcpy (hto.haddr, packet -> raw -> chaddr, hto.hlen);
-
- to.sin_family = AF_INET;
-#ifdef HAVE_SA_LEN
- to.sin_len = sizeof to;
-#endif
- memset (to.sin_zero, 0, sizeof to.sin_zero);
-
- from = packet -> interface -> primary_address;
-
-#ifdef DEBUG_PACKET
- dump_packet (packet);
- dump_raw ((unsigned char *)packet -> raw, packet -> packet_length);
- dump_packet (&outgoing);
- dump_raw ((unsigned char *)&raw, outgoing.packet_length);
-#endif
-
- /* If this was gatewayed, send it back to the gateway... */
- if (raw.giaddr.s_addr) {
- to.sin_addr = raw.giaddr;
- to.sin_port = local_port;
-
- if (outgoing.packet_length < BOOTP_MIN_LEN)
- outgoing.packet_length = BOOTP_MIN_LEN;
-
-#ifdef USE_FALLBACK
- result = send_fallback (&fallback_interface,
- packet, &raw, outgoing.packet_length,
- raw.siaddr, &to, &hto);
- if (result < 0)
- warn ("send_fallback: %m");
- return;
-#endif
-
- /* If it comes from a client who already knows its address and
- is not requesting a broadcast response, sent it directly to
- that client. */
- } else if (raw.ciaddr.s_addr && offer == DHCPACK &&
- !(raw.flags & htons (BOOTP_BROADCAST))) {
- to.sin_addr = packet -> raw -> ciaddr;
- to.sin_port = remote_port; /* XXX */
-
-#ifdef USE_FALLBACK
- result = send_fallback (&fallback_interface,
- packet, &raw, outgoing.packet_length,
- raw.siaddr, &to, &hto);
- if (result < 0)
- warn ("send_fallback: %m");
- return;
-#endif
-
- /* Otherwise, broadcast it on the local network. */
- } else {
- to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
- to.sin_port = remote_port; /* XXX */
- }
-
-
- result = send_packet (packet -> interface,
- packet, &raw, outgoing.packet_length,
- raw.siaddr, &to, &hto);
- if (result < 0)
- warn ("sendpkt: %m");
-}
-
-struct lease *find_lease (packet, share)
- struct packet *packet;
- struct shared_network *share;
-{
- struct lease *uid_lease, *ip_lease, *hw_lease;
- struct lease *lease = (struct lease *)0;
- struct iaddr cip;
- struct host_decl *hp, *host = (struct host_decl *)0;
- struct lease *fixed_lease;
-
- /* Try to find a host or lease that's been assigned to the
- specified unique client identifier. */
- if (packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len) {
- /* First, try to find a fixed host entry for the specified
- client identifier... */
- hp = find_hosts_by_uid (packet -> options
- [DHO_DHCP_CLIENT_IDENTIFIER].data,
- packet -> options
- [DHO_DHCP_CLIENT_IDENTIFIER].len);
- if (hp) {
- host = hp;
- fixed_lease = mockup_lease (packet, share, hp);
- uid_lease = (struct lease *)0;
- } else {
- uid_lease = find_lease_by_uid
- (packet -> options
- [DHO_DHCP_CLIENT_IDENTIFIER].data,
- packet -> options
- [DHO_DHCP_CLIENT_IDENTIFIER].len);
- /* Find the lease matching this uid that's on the
- network the packet came from (if any). */
- for (; uid_lease; uid_lease = uid_lease -> n_uid)
- if (uid_lease -> shared_network == share)
- break;
- fixed_lease = (struct lease *)0;
- }
- } else {
- uid_lease = (struct lease *)0;
- fixed_lease = (struct lease *)0;
- }
-
- /* If we didn't find a fixed lease using the uid, try doing
- it with the hardware address... */
- if (!fixed_lease) {
- hp = find_hosts_by_haddr (packet -> raw -> htype,
- packet -> raw -> chaddr,
- packet -> raw -> hlen);
- if (hp) {
- host = hp; /* Save it for later. */
- fixed_lease = mockup_lease (packet, share, hp);
- }
- }
-
- /* Try to find a lease that's been attached to the client's
- hardware address... */
- hw_lease = find_lease_by_hw_addr (packet -> raw -> chaddr,
- packet -> raw -> hlen);
- /* Find the lease that's on the network the packet came from
- (if any). */
- for (; hw_lease; hw_lease = hw_lease -> n_hw)
- if (hw_lease -> shared_network == share)
- break;
-
- /* Try to find a lease that's been allocated to the client's
- IP address. */
- if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len &&
- packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len == 4) {
- cip.len = 4;
- memcpy (cip.iabuf,
- packet -> options [DHO_DHCP_REQUESTED_ADDRESS].data,
- cip.len);
- ip_lease = find_lease_by_ip_addr (cip);
- } else if (packet -> raw -> ciaddr.s_addr) {
- cip.len = 4;
- memcpy (cip.iabuf, &packet -> raw -> ciaddr, 4);
- ip_lease = find_lease_by_ip_addr (cip);
- } else
- ip_lease = (struct lease *)0;
-
- /* If the requested IP address isn't on the network the packet
- came from, don't use it (this is probably taken care of at
- a higher level, but it's cheap to make sure here too). */
- if (ip_lease && ip_lease -> shared_network != share)
- ip_lease = (struct lease *)0;
-
- /* Toss ip_lease if it hasn't yet expired and the uid doesn't
- match */
- if (ip_lease &&
- ip_lease -> ends >= cur_time &&
- ip_lease -> uid && ip_lease != uid_lease)
- ip_lease = (struct lease *)0;
-
- /* Toss hw_lease if it hasn't yet expired and the uid doesn't
- match, except that if the hardware address matches and the
- client is now doing dynamic BOOTP (and thus hasn't provided
- a uid) we let the client get away with it. */
- if (hw_lease &&
- hw_lease -> ends >= cur_time &&
- hw_lease -> uid && hw_lease != uid_lease &&
- (packet -> packet_type != 0 ||
- !(hw_lease -> flags & DYNAMIC_BOOTP_OK)))
- hw_lease = (struct lease *)0;
-
- /* Toss extra pointers to the same lease... */
- if (ip_lease == hw_lease)
- ip_lease = (struct lease *)0;
- if (hw_lease == uid_lease)
- hw_lease = (struct lease *)0;
- if (ip_lease == uid_lease)
- ip_lease = (struct lease *)0;
-
- /* If we got an ip address lease, make sure it isn't assigned to
- some *other* client! If it was assigned to this client, we'd
- have zeroed it out above, so the only way we can take it at this
- point is if some other client had it but it's timed out, or if no
- other client has ever had it. */
- if (ip_lease &&
- ip_lease -> ends >= cur_time)
- ip_lease = (struct lease *)0;
-
- /* If we've already eliminated the lease, it wasn't there to
- begin with. If we have come up with a matching lease,
- set the message to bad network in case we have to throw it out. */
- if (!ip_lease && !hw_lease && !uid_lease) {
- strcpy (dhcp_message, "requested address not available");
- } else {
- strcpy (dhcp_message, "requested address on bad subnet");
- }
-
- /* Now eliminate leases that are on the wrong network... */
- if (ip_lease &&
- (share != ip_lease -> shared_network)) {
- release_lease (ip_lease);
- ip_lease = (struct lease *)0;
- }
- if (uid_lease &&
- (share != uid_lease -> shared_network)) {
- release_lease (uid_lease);
- uid_lease = (struct lease *)0;
- }
- if (hw_lease &&
- (share != hw_lease -> shared_network)) {
- release_lease (hw_lease);
- hw_lease = (struct lease *)0;
- }
-
- /* At this point, if fixed_lease is nonzero, we can assign it to
- this client. */
- if (fixed_lease) {
- lease = fixed_lease;
- }
-
- /* If we got a lease that matched the ip address and don't have
- a better offer, use that; otherwise, release it. */
- if (ip_lease) {
- if (lease) {
- release_lease (ip_lease);
- } else {
- lease = ip_lease;
- lease -> host = (struct host_decl *)0;
- }
- }
-
- /* If we got a lease that matched the client identifier, we may want
- to use it, but if we already have a lease we like, we must free
- the lease that matched the client identifier. */
- if (uid_lease) {
- if (lease) {
- release_lease (uid_lease);
- } else {
- lease = uid_lease;
- lease -> host = (struct host_decl *)0;
- }
- }
-
- /* The lease that matched the hardware address is treated likewise. */
- if (hw_lease) {
- if (lease) {
- release_lease (hw_lease);
- } else {
- lease = hw_lease;
- lease -> host = (struct host_decl *)0;
- }
- }
-
- /* If we found a host_decl but no matching address, try to
- find a host_decl that has no address, and if there is one,
- hang it off the lease so that we can use the supplied
- options. */
- if (lease && host && !lease -> host) {
- for (; host; host = host -> n_ipaddr) {
- if (!host -> fixed_addr) {
- lease -> host = host;
- break;
- }
- }
- }
-
- return lease;
-}
-
-/* Search the provided host_decl structure list for an address that's on
- the specified shared network. If one is found, mock up and return a
- lease structure for it; otherwise return the null pointer. */
-
-struct lease *mockup_lease (packet, share, hp)
- struct packet *packet;
- struct shared_network *share;
- struct host_decl *hp;
-{
- static struct lease mock;
-
- mock.subnet = find_host_for_network (&hp, &mock.ip_addr, share);
- if (!mock.subnet)
- return (struct lease *)0;
- mock.next = mock.prev = (struct lease *)0;
- mock.shared_network = mock.subnet -> shared_network;
- mock.host = hp;
-
- if (hp -> group -> options [DHO_DHCP_CLIENT_IDENTIFIER]) {
- mock.uid = hp -> group ->
- options [DHO_DHCP_CLIENT_IDENTIFIER] -> value;
- mock.uid_len = hp -> group ->
- options [DHO_DHCP_CLIENT_IDENTIFIER] -> len;
- } else {
- mock.uid = (unsigned char *)0;
- mock.uid_len = 0;
- }
-
- mock.hardware_addr = hp -> interface;
- mock.starts = mock.timestamp = mock.ends = MIN_TIME;
- mock.flags = STATIC_LEASE;
- return &mock;
-}
+++ /dev/null
-.\" dhcpd.8
-.\"
-.\" Copyright (c) 1995, 1996 The Internet Software Consortium.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\"
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of The Internet Software Consortium nor the names
-.\" of its contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
-.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
-.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" This software has been written for the Internet Software Consortium
-.\" by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
-.\" Enterprises. To learn more about the Internet Software Consortium,
-.\" see ``http://www.isc.org/isc''. To learn more about Vixie
-.\" Enterprises, see ``http://www.vix.com''.
-.TH dhcpd 8
-.SH NAME
-dhcpd - Dynamic Host Configuration Protocol Server
-.SH SYNOPSIS
-.B dhcpd
-[
-.B -p
-.I port
-]
-[
-.B -f
-]
-[
-.B -d
-]
-[
-.B -cf
-.I config-file
-]
-[
-.B -lf
-.I lease-file
-]
-[
-.I if0
-[
-.I ...ifN
-]
-]
-.SH DESCRIPTION
-The Internet Software Consortium DHCP Server, dhcpd, implements the
-Dynamic Host Configuration Protocol (DHCP) and the Internet Bootstrap
-Protocol (BOOTP). DHCP allows hosts on a TCP/IP network to request
-and be assigned IP addresses, and also to discover information about
-the network to which they are attached. BOOTP provides similar
-functionality, with certain restrictions.
-.SH OPERATION
-.PP
-The DHCP protocol allows a host which is unknown to the network
-administrator to be automatically assigned a new IP address out of a
-pool of IP addresses for its network. In order for this to work, the
-network administrator allocates address pools in each subnet and
-enters them into the dhcpd.conf(5) file.
-.PP
-On startup, dhcpd reads the
-.IR dhcpd.conf
-file and stores a list of available addresses on each subnet in
-memory. When a client requests an address using the DHCP protocol,
-dhcpd allocates an address for it. Each client is assigned a lease,
-which expires after an amount of time chosen by the administrator (by
-default, one day). Before leases expire, the clients to which leases
-are assigned are expected to renew them in order to continue to use
-the addresses. Once a lease has expired, the client to which that
-lease was assigned is no longer permitted to use the leased IP
-address.
-.PP
-In order to keep track of leases across system reboots and server
-restarts, dhcpd keeps a list of leases it has assigned in the
-dhcpd.leases(5) file. Before dhcpd grants a lease to a host, it
-records the lease in this file and makes sure that the contents of the
-file are flushed to disk. This ensures that even in the event of a
-system crash, dhcpd will not forget about a lease that it has
-assigned. On startup, after reading the dhcpd.conf file, dhcpd
-reads the dhcpd.leases file to refresh its memory about what leases
-have been assigned.
-.PP
-New leases are appended to the end of the dhcpd.leases
-file. In order to prevent the file from becoming arbitrarily large,
-from time to time dhcpd creates a new dhcpd.leases file from its
-in-core lease database. Once this file has been written to disk, the
-old file is renamed
-.IR dhcpd.leases~ ,
-and the new file is renamed dhcpd.leases. If the system crashes in
-the middle of this process, whichever dhcpd.leases file remains will
-contain all the lease information, so there is no need for a special
-crash recovery process.
-.PP
-BOOTP support is also provided by this server. Unlike DHCP, the BOOTP
-protocol does not provide a protocol for recovering
-dynamically-assigned addresses once they are no longer needed. It is
-still possible to dynamically assign addresses to BOOTP clients, but
-some administrative process for reclaiming addresses is required. By
-default, leases are granted to BOOTP clients in perpetuity, although
-the network administrator may set an earlier cutoff date or a shorter
-lease length for BOOTP leases if that makes sense.
-.PP
-BOOTP clients may also be served in the old standard way, which is to
-simply provide a declaration in the dhcpd.conf file for each
-BOOTP client, permanently assigning an address to each client.
-.PP
-Whenever changes are made to the dhcpd.conf file, dhcpd must be
-restarted. To restart dhcpd, send a SIGTERM (signal 15) to the
-process ID contained in
-.IR RUNDIR/dhcpd.pid ,
-and then re-invoke dhcpd. Because the DHCP server database is not as
-lightweight as a BOOTP database, dhcpd does not automatically restart
-itself when it sees a change to the dhcpd.conf file.
-.SH COMMAND LINE
-.PP
-The names of the network interfaces on which dhcpd should listen for
-broadcasts may be specified on the command line. This should be done
-on systems where dhcpd is unable to identify non-broadcast interfaces,
-but should not be required on other systems. If no interface names
-are specified on the command line dhcpd will identify all network
-interfaces which are up, elimininating non-broadcast interfaces if
-possible, and listen for DHCP broadcasts on each interface.
-.PP
-If dhcpd should listen on a port other than the standard (port 67),
-the
-.B -p
-flag may used. It should be followed by the udp port number on which
-dhcpd should listen. This is mostly useful for debugging purposes.
-.PP
-To run dhcpd as a foreground process, rather than allowing it to run
-as a daemon in the background, the
-.B -f
-flag should be specified. This is useful when running dhcpd under a
-debugger, or when running it out of inittab on System V systems.
-.PP
-To have dhcpd log to the standard error descriptor, specify the
-.B -d
-flag. This can be useful for debugging, and also at sites where a
-complete log of all dhcp activity must be kept but syslogd is not
-reliable or otherwise cannot be used. Normally, dhcpd will log all
-output using the syslog(3) function with the log facility set to
-LOG_DAEMON.
-.PP
-Dhcpd can be made to use an alternate configuration file with the
-.B -cf
-flag, or an alternate lease file with the
-.B -lf
-flag. Because of the importance of using the same lease database at
-all times when running dhcpd in production, these options should be
-used \fBonly\fR for testing lease files or database files in a
-non-production environment.
-.SH CONFIGURATION
-The syntax of the dhcpd.conf(8) file is discussed seperately. This
-section should be used as an overview of the configuration process,
-and the dhcpd.conf(8) documentation should be consulted for detailed
-reference information.
-.PP
-.SH Subnets
-dhcpd needs to know the subnet numbers and netmasks of all subnets for
-which it will be providing service. In addition, in order to
-dynamically allocate addresses, it must be assigned one or more ranges
-of addresses on each subnet which it can in turn assign to client
-hosts as they boot. Thus, a very simple configuration providing DHCP
-support might look like this:
-.nf
-.sp 1
- subnet 239.252.197.0 netmask 255.255.255.0 {
- range 239.252.197.10 239.252.197.250;
- }
-.fi
-.PP
-Multiple address ranges may be specified like this:
-.nf
-.sp 1
- subnet 239.252.197.0 netmask 255.255.255.0 {
- range 239.252.197.10 239.252.197.107;
- range 239.252.197.113 239.252.197.250;
- }
-.fi
-.PP
-If a subnet will only be provided with BOOTP service and no dynamic
-address assignment, the range clause can be left out entirely, but the
-subnet statement must appear.
-.PP
-.SH Lease Lengths
-DHCP leases can be assigned almost any length from zero seconds to
-infinity. What lease length makes sense for any given subnet, or for
-any given installation, will vary depending on the kinds of hosts
-being served.
-.PP
-For example, in an office environment where systems are added from
-time to time and removed from time to time, but move relatively
-infrequently, it might make sense to allow lease times of a month of
-more. In a final test environment on a manufacturing floor, it may
-make more sense to assign a maximum lease length of 30 minutes -
-enough time to go through a simple test procedure on a network
-appliance before packaging it up for delivery.
-.PP
-It is possible to specify two lease lengths: the default length that
-will be assigned if a client doesn't ask for any particular lease
-length, and a maximum lease length. These are specified as clauses
-to the subnet command:
-.nf
-.sp 1
- subnet 239.252.197.0 netmask 255.255.255.0 {
- range 239.252.197.10 239.252.197.107;
- default-lease-time 600;
- max-lease-time 7200;
- |
-.fi
-.PP
-This particular subnet declaration specifies a default lease time of
-600 seconds (ten minutes), and a maximum lease time of 7200 seconds
-(two hours). Other common values would be 86400 (one day), 604800
-(one week) and 2592000 (30 days).
-.PP
-Each subnet need not have the same lease\(emin the case of an office
-environment and a manufacturing environment served by the same DHCP
-server, it might make sense to have widely disparate values for
-default and maximum lease times on each subnet.
-.SH BOOTP Support
-Each BOOTP client must be explicitly declared in the dhcpd.conf
-file. A very basic client declaration will specify the client
-network interface's hardware address and the IP address to assign to
-that client. If the client needs to be able to load a boot file from
-the server, that file's name must be specified. A simple bootp
-client declaration might look like this:
-.nf
-.sp 1
- host haagen {
- hardware ethernet 08:00:2b:4c:59:23;
- fixed-address 239.252.197.9;
- filename "/tftpboot/haagen.boot";
- }
-.fi
-.SH Options
-DHCP (and also BOOTP with Vendor Extensions) provide a mechanism
-whereby the server can provide the client with information about how
-to configure its network interface (e.g., subnet mask), and also how
-the client can access various network services (e.g., DNS, IP routers,
-and so on).
-.PP
-These options can be specified on a per-subnet basis, and, for BOOTP
-clients, also on a per-client basis. In the event that a BOOTP
-client declaration specifies options that are also specified in its
-subnet declaration, the options specified in the client declaration
-take precedence. An reasonably complete DHCP configuration might
-look something like this:
-.nf
-.sp 1
- subnet 239.252.197.0 netmask 255.255.255.0 {
- range 239.252.197.10 239.252.197.250;
- default-lease-time 600 max-lease-time 7200;
- option subnet-mask 255.255.255.0;
- option broadcast-address 239.252.197.255;
- option routers 239.252.197.1;
- option domain-name-servers 239.252.197.2, 239.252.197.3;
- option domain-name "isc.org";
- }
-.fi
-.PP
-A bootp host on that subnet that needs to be in a different domain and
-use a different name server might be declared as follows:
-.nf
-.sp 1
- host haagen hardware ethernet 08:00:2b:4c:59:23 {
- fixed-address 239.252.197.9;
- filename "/tftpboot/haagen.boot";
- option domain-name-servers 192.5.5.1;
- option domain-name "vix.com";
- }
-.fi
-.PP
-A more complete description of the dhcpd.conf file syntax is provided
-in dhcpd.conf(5).
-.SH FILES
-.B ETCDIR/dhcpd.conf, DBDIR/dhcpd.leases, RUNDIR/dhcpd.pid,
-.B DBDIR/dhcpd.leases~.
-.SH SEE ALSO
-dhclient(8), dhcrelay(8), dhcpd.conf(5), dhcpd.leases(5)
-.SH AUTHOR
-.B dhcpd(8)
-was written by Ted Lemon <mellon@vix.com>
-under a contract with Vixie Labs. Funding
-for this project was provided by the Internet Software Corporation.
-Information about the Internet Software Consortium can be found at
-.B http://www.isc.org/isc.
+++ /dev/null
-/* dhcpd.c
-
- DHCP Server Daemon. */
-
-/*
- * Copyright (c) 1995, 1996, 1997 The Internet Software Consortium.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- * of its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This software has been written for the Internet Software Consortium
- * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
- * Enterprises. To learn more about the Internet Software Consortium,
- * see ``http://www.vix.com/isc''. To learn more about Vixie
- * Enterprises, see ``http://www.vix.com''.
- */
-
-#ifndef lint
-static char ocopyright[] =
-"$Id: dhcpd.c,v 1.38 1997/02/22 08:49:44 mellon Exp $ Copyright 1995, 1996 The Internet Software Consortium.";
-#endif
-
-static char copyright[] =
-"Copyright 1995, 1996 The Internet Software Consortium.";
-static char arr [] = "All rights reserved.";
-static char message [] = "Internet Software Consortium DHCPD $Name: $";
-
-#include "dhcpd.h"
-
-static void usage PROTO ((void));
-
-TIME cur_time;
-struct group root_group;
-
-struct iaddr server_identifier;
-int server_identifier_matched;
-
-#ifdef USE_FALLBACK
-struct interface_info fallback_interface;
-#endif
-
-u_int16_t local_port;
-u_int16_t remote_port;
-
-int log_priority;
-#ifdef DEBUG
-int log_perror = -1;
-#else
-int log_perror = 1;
-#endif
-
-char *path_dhcpd_conf = _PATH_DHCPD_CONF;
-char *path_dhcpd_db = _PATH_DHCPD_DB;
-char *path_dhcpd_pid = _PATH_DHCPD_PID;
-
-int main (argc, argv, envp)
- int argc;
- char **argv, **envp;
-{
- int i, status;
- struct servent *ent;
- char *s;
-#ifndef DEBUG
- int pidfilewritten = 0;
- int pid;
- char pbuf [20];
- int daemon = 1;
-#endif
-
- /* Initially, log errors to stderr as well as to syslogd. */
-#ifdef SYSLOG_4_2
- openlog ("dhcpd", LOG_NDELAY);
- log_priority = DHCPD_LOG_FACILITY;
-#else
- openlog ("dhcpd", LOG_NDELAY, DHCPD_LOG_FACILITY);
-#endif
-
-#ifndef DEBUG
-#ifndef SYSLOG_4_2
- setlogmask (LOG_UPTO (LOG_INFO));
-#endif
-#endif
- note (message);
- note (copyright);
- note (arr);
-
- for (i = 1; i < argc; i++) {
- if (!strcmp (argv [i], "-p")) {
- if (++i == argc)
- usage ();
- for (s = argv [i]; *s; s++)
- if (!isdigit (*s))
- error ("%s: not a valid UDP port",
- argv [i]);
- status = atoi (argv [i]);
- if (status < 1 || status > 65535)
- error ("%s: not a valid UDP port",
- argv [i]);
- local_port = htons (status);
- debug ("binding to user-specified port %d",
- ntohs (local_port));
- } else if (!strcmp (argv [i], "-f")) {
-#ifndef DEBUG
- daemon = 0;
-#endif
- } else if (!strcmp (argv [i], "-d")) {
-#ifndef DEBUG
- daemon = 0;
-#endif
- log_perror = -1;
- } else if (!strcmp (argv [i], "-cf")) {
- if (++i == argc)
- usage ();
- path_dhcpd_conf = argv [i];
- } else if (!strcmp (argv [i], "-lf")) {
- if (++i == argc)
- usage ();
- path_dhcpd_db = argv [i];
- } else if (argv [i][0] == '-') {
- usage ();
- } else {
- struct interface_info *tmp =
- ((struct interface_info *)
- dmalloc (sizeof *tmp, "get_interface_list"));
- if (!tmp)
- error ("Insufficient memory to %s %s",
- "record interface", argv [i]);
- memset (tmp, 0, sizeof *tmp);
- strcpy (tmp -> name, argv [i]);
- tmp -> next = interfaces;
- tmp -> flags = INTERFACE_REQUESTED;
- interfaces = tmp;
- }
- }
-
-#ifndef DEBUG
- if (daemon) {
- /* First part of becoming a daemon... */
- if ((pid = fork ()) < 0)
- error ("Can't fork daemon: %m");
- else if (pid)
- exit (0);
- }
-
- /* Read previous pid file. */
- if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) {
- status = read (i, pbuf, (sizeof pbuf) - 1);
- close (i);
- pbuf [status] = 0;
- pid = atoi (pbuf);
-
- /* If the previous server process is not still running,
- write a new pid file immediately. */
- if (pid && kill (pid, 0) < 0) {
- unlink (path_dhcpd_pid);
- if ((i = open (path_dhcpd_pid,
- O_WRONLY | O_CREAT, 0640)) >= 0) {
- sprintf (pbuf, "%d\n", (int)getpid ());
- write (i, pbuf, strlen (pbuf));
- close (i);
- pidfilewritten = 1;
- }
- }
- }
-#endif /* !DEBUG */
-
- /* Default to the DHCP/BOOTP port. */
- if (!local_port)
- {
- ent = getservbyname ("dhcp", "udp");
- if (!ent)
- local_port = htons (67);
- else
- local_port = ent -> s_port;
- endservent ();
- }
-
- remote_port = htons (ntohs (local_port) + 1);
-
- /* Get the current time... */
- GET_TIME (&cur_time);
-
- /* Read the dhcpd.conf file... */
- if (!readconf ())
- error ("Configuration file errors encountered -- exiting");
-
- /* Start up the database... */
- db_startup ();
-
- /* Discover all the network interfaces and initialize them. */
- discover_interfaces (1);
-
-#ifndef DEBUG
- /* If we were requested to log to stdout on the command line,
- keep doing so; otherwise, stop. */
- if (log_perror == -1)
- log_perror = 1;
- else
- log_perror = 0;
-
- if (daemon) {
- /* Become session leader and get pid... */
- close (0);
- close (1);
- close (2);
- pid = setsid ();
- }
-
- /* If we didn't write the pid file earlier because we found a
- process running the logged pid, but we made it to here,
- meaning nothing is listening on the bootp port, then write
- the pid file out - what's in it now is bogus anyway. */
- if (!pidfilewritten) {
- unlink (path_dhcpd_pid);
- if ((i = open (path_dhcpd_pid,
- O_WRONLY | O_CREAT, 0640)) >= 0) {
- sprintf (pbuf, "%d\n", (int)getpid ());
- write (i, pbuf, strlen (pbuf));
- close (i);
- pidfilewritten = 1;
- }
- }
-#endif /* !DEBUG */
-
- /* Receive packets and dispatch them... */
- dispatch (1);
-
- /* Not reached */
- return 0;
-}
-
-/* Print usage message. */
-
-static void usage ()
-{
- error ("Usage: dhcpd [-p <UDP port #>] [-d] [-f] [-cf config-file]%s",
- "\n [-lf lease-file] [if0 [...ifN]]");
-}
-
-void cleanup ()
-{
-}
+++ /dev/null
-# dhcpd.conf
-#
-# Configuration file for ISC dhcpd
-#
-
-# Hosts with more than one interface MUST specify a ``server-identifier'',
-# which should be the IP address of the server's primary network interface,
-# or if there is no interface that can be described that way, at least an
-# interface whose address isn't likely to change.
-
-server-identifier toccata.fugue.com;
-
-# option definitions common to all supported networks...
-option domain-name "fugue.com";
-option domain-name-servers toccata.fugue.com;
-
-# Shared network declaration is used to group subnets which share the same
-# physical network together. The name is specified so that the shared
-# network can be referred to in log messages - it serves no other function.
-
-shared-network FUGUE {
-
-# option definitions common to this shared network.
- option subnet-mask 255.255.255.224;
- default-lease-time 600;
- max-lease-time 7200;
-
-# One of the two IP subnets that share this physical network
-#
-# Address ranges can be specified for each subnet attached to
-# a shared network. Since these subnets share the same physical
-# network, addresses are pooled together, and assignments are made
-# without regard to the actual subnet. If the optional dynamic-bootp
-# keyword is given in the address range declaration, then addresses
-# in that range can be assigned either with the DHCP protocol or the
-# BOOTP protocol; otherwise, only DHCP clients will have addresses
-# allocated from the address range.
-#
-# Note that each IP subnet can have its own options specific to that subnet.
-# options that aren't specified in the subnet are taken from the shared
-# network (if any) and then from the global option list.
-
- subnet 204.254.239.0 netmask 255.255.255.224 {
- range 204.254.239.10 204.254.239.20;
- option broadcast-address 204.254.239.31;
- option routers prelude.fugue.com;
- }
-
-# The other subnet that shares this physical network
- subnet 204.254.239.32 netmask 255.255.255.224 {
- range dynamic-bootp 204.254.239.10 204.254.239.20;
- option broadcast-address 204.254.239.31;
- option routers snarg.fugue.com;
- }
-}
-
-# IP subnets that are alone on their physical wire should be declared by
-# themselves. ISC dhcpd may still refer to them as shared networks in
-# log messages, but this is simply an artifact of the underlying data
-# structures.
-#
-# Note that options can be specified in the subnet declaration which
-# supersede the global options specified earlier.
-
-subnet 192.5.5.0 netmask 255.255.255.224 {
- range 192.5.5.26 192.5.5.30;
- option name-servers bb.home.vix.com, gw.home.vix.com;
- option domain-name "vix.com";
- option routers 192.5.5.1;
- option subnet-mask 255.255.255.224;
- option broadcast-address 192.5.5.31;
- default-lease-time 600;
- max-lease-time 7200;
-}
-
-# Hosts which require special configuration options can be listed in
-# host statements. If no address is specified, the address will be
-# allocated dynamically (if possible), but the host-specific information
-# will still come from the host declaration.
-
-host passacaglia {
- hardware ethernet 0:0:c0:5d:bd:95;
- filename "vmunix.passacaglia";
- server-name "toccata.fugue.com";
-}
-
-# Fixed IP addresses can also be specified for hosts. These addresses
-# should not also be listed as being available for dynamic assignment.
-# Hosts for which fixed IP addresses have been specified can boot using
-# BOOTP or DHCP. Hosts for which no fixed address is specified can only
-# be booted with DHCP, unless there is an address range on the subnet
-# to which a BOOTP client is connected which has the dynamic-bootp flag
-# set.
-host fantasia {
- hardware ethernet 08:00:07:26:c0:a5;
- fixed-address fantasia.fugue.com;
-}
-
-# If a DHCP or BOOTP client is mobile and might be connected to a variety
-# of networks, more than one fixed address for that host can be specified.
-# Hosts can have fixed addresses on some networks, but receive dynamically
-# allocated address on other subnets; in order to support this, a host
-# declaration for that client must be given which does not have a fixed
-# address. If a client should get different parameters depending on
-# what subnet it boots on, host declarations for each such network should
-# be given. Finally, if a domain name is given for a host's fixed address
-# and that domain name evaluates to more than one address, the address
-# corresponding to the network to which the client is attached, if any,
-# will be assigned.
-host confusia {
- hardware ethernet 02:03:04:05:06:07;
- fixed-address confusia-1.fugue.com, confusia-2.fugue.com;
- filename "vmunix.confusia";
- server-name "toccata.fugue.com";
-}
-
-host confusia {
- hardware ethernet 02:03:04:05:06:07;
- fixed-address confusia-3.fugue.com;
- filename "vmunix.confusia";
- server-name "snarg.fugue.com";
-}
-
-host confusia {
- hardware ethernet 02:03:04:05:06:07;
- filename "vmunix.confusia";
- server-name "bb.home.vix.com";
-}
+++ /dev/null
-.\" dhcpd.conf.5
-.\"
-.\" Copyright (c) 1995, 1996 The Internet Software Consortium.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\"
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of The Internet Software Consortium nor the names
-.\" of its contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
-.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
-.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" This software has been written for the Internet Software Consortium
-.\" by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
-.\" Enterprises. To learn more about the Internet Software Consortium,
-.\" see ``http://www.isc.org/isc''. To learn more about Vixie
-.\" Enterprises, see ``http://www.vix.com''.
-.TH dhcpd.conf 5
-.SH NAME
-dhcpd.conf - dhcpd configuration file
-.SH DESCRIPTION
-The dhcpd.conf file contains configuration information for
-.IR dhcpd,
-the Internet Software Consortium DHCP Server.
-.PP
-The dhcpd.conf file is a free-form ASCII text file. It is parsed by
-the recursive-descent parser built into dhcpd. The file may contain
-extra tabs and newlines for formatting purposes. Keywords in the file
-are case-insensitive. Comments may be placed anywhere within the
-file (except within quotes). Comments begin with the # character and
-end at the end of the line.
-.PP
-The file essentially consists of a list of statements. Statements
-fall into two broad categories - parameters and declarations.
-.PP
-Parameter statements either say how to do something (e.g., how long a
-lease to offer), whether to do something (e.g., should dhcpd provide
-addresses to unknown clients), or what parameters to provide to the
-client (e.g., use gateway 220.177.244.7).
-.PP
-Declarations are used to describe the topology of the
-network, to describe clients on the network, to provide addresses that
-can be assigned to clients, or to apply a group of parameters to a
-group of declarations. In any group of parameters and declarations,
-all parameters must be specified before any declarations which depend
-on those parameters may be specified.
-.PP
-Declarations about network topology include the
-\fIserver-identifier\fR, the \fIshared-network\fR and the \fIsubnet\fR
-declarations. If clients on a subnet are to be assigned addresses
-dynamically, a \fIrange\fR declaration must appear within the
-\fIsubnet\fR declaration. For clients with statically assigned
-addresses, or for installations where only known clients will be
-served, each such client must have a \fIhost\fR declaration. If
-parameters are to be applied to a group of declarations which are not
-related strictly on a per-subnet basis, the \fIgroup\fR declaration
-can be used.
-.PP
-Each dhcpd.conf file must have one (and only one)
-.I server-identifier
-declaration, which tells dhcpd the identifier to use when issuing
-leases. For every subnet which will be served, and for every subnet
-to which the dhcp server is connected, there must be one \fIsubnet\fR
-declaration, which tells dhcpd how to recognize that an address is on
-that subnet. A \fIsubnet\fR declaration is required for each subnet
-even if no addresses will be dynamically allocated on that subnet.
-.PP
-Some installations have physical networks on which more than one IP
-subnet operates. For example, if there is a site-wide requirement
-that 8-bit subnet masks be used, but a department with a single
-physical ethernet network expands to the point where it has more than
-254 nodes, it may be necessary to run two 8-bit subnets on the same
-ethernet until such time as a new physical network can be added. In
-this case, the \fIsubnet\fR declarations for these two networks may be
-enclosed in a \fIshared-network\fR declaration.
-.PP
-Some sites may have departments which have clients on more than one
-subnet, but it may be desirable to offer those clients a uniform set
-of parameters which are different than what would be offered to
-clients from other departments on the same subnet. For clients which
-will be declared explicitly with \fIhost\fR declarations, these
-declarations can be enclosed in a \fIgroup\fR declaration along with
-the parameters which are common to that department. For clients
-whose addresses will be dynamically assigned, there is currently no
-way to group parameter assignments other than by network topology.
-.PP
-When a client is to be booted, its boot parameters are determined by
-first consulting that client's \fIhost\fR declaration (if any), then
-consulting the \fIgroup\fR declaration (if any) which enclosed that
-\fIhost\fR declaration, then consulting the \fIsubnet\fR declaration
-for the subnet on which the client is booting, then consulting the
-\fIshared-network\fR declaration (if any) containing that subnet, and
-finally consulting the top-level parameters which may be specified
-outside of any declaration.
-.PP
-When dhcpd tries to find a \fIhost\fR declaration for a client, it
-first looks for a \fIhost\fR declaration which has a
-\fIfixed-address\fR parameter which matches the subnet or shared
-network on which the client is booting. If it doesn't find any such
-entry, it then tries to find an entry which has no \fIfixed-address\fR
-parameter. If no such entry is found, then dhcpd acts as if there is
-no entry in the dhcpd.conf file for that client, even if there is an
-entry for that client on a different subnet or shared network.
-.SH EXAMPLES
-.PP
-A typical dhcpd.conf file will look something like this:
-.nf
-
-server-identifier dhcps.isc.org;
-.I global parameters...
-
-shared-network ISC-BIGGIE {
- \fIshared-network-specific parameters...\fR
- subnet 204.254.239.0 netmask 255.255.255.224 {
- \fIsubnet-specific parameters...\fR
- range 204.254.239.10 204.254.239.30;
- }
- subnet 204.254.239.32 netmask 255.255.255.224 {
- \fIsubnet-specific parameters...\fR
- range 204.254.239.42 204.254.239.62;
- }
-}
-
-subnet 204.254.239.64 netmask 255.255.255.224 {
- \fIsubnet-specific parameters...\fR
- range 204.254.239.74 204.254.239.94;
-}
-
-group {
- \fIgroup-specific parameters...\fR
- host zappo.test.isc.org {
- \fIhost-specific parameters...\fR
- }
- host beppo.test.isc.org {
- \fIhost-specific parameters...\fR
- }
- host harpo.test.isc.org {
- \fIhost-specific parameters...\fR
- }
-}
-
-.ce 1
-Figure 1
-
-.fi
-.PP
-Notice that after the server-identifier declaration, there's a place
-for global parameters. These might be things like the organization's
-domain name, the addresses of the name servers (if they are common to
-the entire organization), and so on. So, for example:
-.nf
-
- option domain-name "isc.org";
- option name-servers ns1.isc.org, ns2.isc.org;
-
-.ce 1
-Figure 2
-.fi
-.PP
-As you can see in Figure 2, it's legal to specify host addresses in
-parameters as domain names rather than as numeric IP addresses. If a
-given hostname resolves to more than one IP address (for example, if
-that host has two ethernet interfaces), both addresses are supplied to
-the client.
-.PP
-In Figure 1, you can see that both the shared-network statement and
-the subnet statements can have parameters. Let us say that the
-shared network \fIISC-BIGGIE\fR supports an entire department -
-perhaps the accounting department. If accounting has its own domain,
-then a shared-network-specific parameter might be:
-.nf
-
- option domain-name "accounting.isc.org";
-.fi
-.PP
-All subnet declarations appearing in the shared-network declaration
-would then have the domain-name option set to "accounting.isc.org"
-instead of just "isc.org".
-.PP
-The most obvious reason for having subnet-specific parameters as
-shown in Figure 1 is that each subnet, of necessity, has its own
-router. So for the first subnet, for example, there should be
-something like:
-.nf
-
- option routers 204.254.239.1;
-.fi
-.PP
-Note that the address here is specified numerically. This is not
-required - if you have a different domain name for each interface on
-your router, it's perfectly legitimate to use the domain name for that
-interface instead of the numeric address. However, in many cases
-there may be only one domain name for all of a router's IP addresses, and
-it would not be appropriate to use that name here.
-.PP
-In Figure 1 there is also a \fIgroup\fR statement, which provides
-common parameters for a set of three hosts - zappo, beppo and harpo.
-As you can see, these hosts are all in the test.isc.org domain, so it
-might make sense for a group-specific parameter to override the domain
-name supplied to these hosts:
-.nf
-
- option domain-name "test.isc.org";
-.fi
-.PP
-Also, given the domain they're in, these are probably test machines.
-If we wanted to test the DHCP leasing mechanism, we might set the
-lease timeout somewhat shorter than the default:
-
-.nf
- max-lease-time 120;
- default-lease-time 120;
-.fi
-.PP
-You may have noticed that while some parameters start with the
-\fIoption\fR keyword, some do not. Parameters starting with the
-\fIoption\fR keyword correspond to actual DHCP options, while
-parameters that do not start with the option keyword either control
-the behaviour of the DHCP server (e.g., how long a lease dhcpd will
-give out), or specify client parameters that are not optional in the
-DHCP protocol (for example, server-name and filename).
-.PP
-In Figure 1, each host had \fIhost-specific parameters\fR. These
-could include such things as the \fIhostname\fR option, the name of a
-file to upload (the \fIfilename parameter) and the address of the
-server from which to upload the file (the \fInext-server\fR
-parameter). In general, any parameter can appear anywhere that
-parameters are allowed, and will be applied according to the scope in
-which the parameter appears.
-.PP
-Imagine that you have a site with a lot of NCD X-Terminals. These
-terminals come in a variety of models, and you want to specify the
-boot files for each models. One way to do this would be to have host
-declarations for each server and group them by model:
-.nf
-
-group {
- filename "Xncd19r";
- next-server ncd-booter;
-
- host ncd1 { hardware ethernet 0:c0:c3:49:2b:57; }
- host ncd4 { hardware ethernet 0:c0:c3:80:fc:32; }
- host ncd8 { hardware ethernet 0:c0:c3:22:46:81; }
-}
-
-group {
- filename "Xncd19c";
- next-server ncd-booter;
-
- host ncd2 { hardware ethernet 0:c0:c3:88:2d:81; }
- host ncd3 { hardware ethernet 0:c0:c3:00:14:11; }
-}
-
-group {
- filename "XncdHMX";
- next-server ncd-booter;
-
- host ncd1 { hardware ethernet 0:c0:c3:11:90:23; }
- host ncd4 { hardware ethernet 0:c0:c3:91:a7:8; }
- host ncd8 { hardware ethernet 0:c0:c3:cc:a:8f; }
-}
-.fi
-.SH REFERENCE: DECLARATIONS
-.PP
-.B The
-.I server-identifier
-.B statement
-.PP
- \fBserver-identifier \fIhostname\fR\fB;\fR
-.PP
-The server-identifier declaration must be used exactly once in each
-dhcpd.conf file to tell dhcpd what IP address to use as its server
-identifier, as required by the DHCP protocol. On a machine with a
-single interface, the server identifier should be the primary address
-of that interface. On machines with multiple interfaces, the address
-of one such interface must be chosen. Any address may be chosen, as
-long as it is the address of one of the interfaces of that machine.
-.PP
-.B The
-.I shared-network
-.B statement
-.PP
-.nf
- \fBshared-network\fR \fIname\fR \fB{\fR
- [ \fIparameters\fR ]
- [ \fIdeclarations\fR ]
- \fB}\fR
-.fi
-.PP
-The \fIshared-network\fR statement is used to inform the DHCP server
-that some IP subnets actually share the same physical network. Any
-subnets in a shared network should be declared within a
-\fIshared-network\fR statement. Parameters specified in the
-\fIshared-network\fR statement will be used when booting clients on
-those subnets unless parameters provided at the subnet or host level
-override them. If any subnet in a shared network has addresses
-available for dynamic allocation, those addresses are collected into a
-common pool for that shared network and assigned to clients as needed.
-There is no way to distinguish on which subnet of a shared network a
-client should boot.
-.PP
-.I Name
-should be the name of the shared network. This name is used when
-printing debugging messages, so it should be descriptive for the
-shared network. The name may have the syntax of a valid domain name
-(although it will never be used as such), or it may be any arbitrary
-name, enclosed in quotes.
-.PP
-.B The
-.I subnet
-.B statement
-.PP
-.nf
- \fBsubnet\fR \fIsubnet-number\fR \fBnetmask\fR \fInetmask\fR \fB{\fR
- [ \fIparameters\fR ]
- [ \fIdeclarations\fR ]
- \fB}\fR
-.fi
-.PP
-The \fIsubnet\fR statement is used to provide dhcpd with enough
-information to tell whether or not an IP address is on that subnet.
-It may also be used to provide subnet-specific parameters and to
-specify what addresses may be dynamically allocated to clients booting
-on that subnet. Such addresses are specified using the \fIrange\fR
-declaration.
-.PP
-The
-.I subnet-number
-should be an IP address or domain name which resolves to the subnet
-number of the subnet being described. The
-.I netmask
-should be an IP address or domain name which resolves to the subnet mask
-of the subnet being described. The subnet number, together with the
-netmask, are sufficient to determine whether any given IP address is
-on the specified subnet.
-.PP
-Although a netmask must be given with every subnet declaration, it is
-recommended that if there is any variance in subnet masks at a site, a
-subnet-mask option statement be used in each subnet declaration to set
-the desired subnet mask, since any subnet-mask option statement will
-override the subnet mask declared in the subnet statement.
-.PP
-.B The
-.I range
-.B statement
-.PP
-.nf
- \fBrange\fR [ \fBdynamic-bootp\fR ] \fIlow-address\fR [ \fIhigh-address\fR]\fB;\fR
-.fi
-.PP
-For any subnet on which addresses will be assigned dynamically, there
-must be at least one \fIrange\fR statement. The range statement
-gives the lowest and highest IP addresses in a range. All IP
-addresses in the range should be in the subnet in which the
-\fIrange\fR statement is declared. The \fIdynamic-bootp\fR flag may
-be specified if addresses in the specified range may be dynamically
-assigned to BOOTP clients as well as DHCP clients. When specifying a
-single address, \fIhigh-address\fR can be omitted.
-.PP
-.B The
-.I host
-.B statement
-.PP
-.nf
- \fBhost\fR \fIhostname\fR {
- [ \fIparameters\fR ]
- [ \fIdeclarations\fR ]
- \fB}\fR
-.fi
-.PP
-There must be at least one
-.B host
-statement for every BOOTP client that is to be served.
-.B host
-statements may also be specified for DHCP clients, although this is
-not required unless booting is only enabled for known hosts.
-.PP
-If it is desirable to be able to boot a DHCP or BOOTP
-client on more than one subnet with fixed addresses, more than one
-address may be specified in the
-.I fixed-address
-parameter, or more than one
-.B host
-statement may be specified.
-.PP
-If client-specific boot parameters must change based on the network
-to which the client is attached, then multiple
-.B host
-statements should
-be used.
-.PP
-If a client is to be booted using a fixed address if it's
-possible, but should be allocated a dynamic address otherwise, then a
-.B host
-statement must be specified without a
-.B fixed-address
-clause.
-.I hostname
-should be a name identifying the host. If a \fIhostname\fR option is
-not specified for the host, \fIhostname\fR is used.
-.PP
-\fIHost\fR declarations are matched to actual DHCP or BOOTP clients
-by matching the \fRdhcp-client-identifier\fR option specified in the
-\fIhost\fR declaration to the one supplied by the client, or, if the
-\fIhost\fR declaration or the client does not provide a
-\fRdhcp-client-identifier\fR option, by matching the \fIhardware\fR
-parameter in the \fIhost\fR declaration to the network hardware
-address supplied by the client. BOOTP clients do not normally
-provide a \fIdhcp-client-identifier\fR, so the hardware address must
-be used for all clients that may boot using the BOOTP protocol.
-.PP
-.B The
-.I group
-.B statement
-.PP
-.nf
- \fBgroup\fR {
- [ \fIparameters\fR ]
- [ \fIdeclarations\fR ]
- \fB}\fR
-.fi
-.PP
-The group statement is used simply to apply one or more parameters to
-a group of declarations. It can be used to group hosts, shared
-networks, subnets, or even other groups.
-.SH REFERENCE: ALLOW and DENY
-.PP
-The
-.I allow
-and
-.I deny
-statements can be used to control the behaviour of dhcpd to various
-sorts of requests.
-.PP
-.PP
-.B The
-.I unknown-clients
-.B keyword
-.PP
- \fBallow unknown-clients;\fR
- \fBdeny unknown-clients;\fR
-.PP
-The \fBunknown-clients\fR flag is used to tell dhcpd whether
-or not to dynamically assign addresses to unknown clients. Dynamic
-address assignment to unknown clients is \fBallow\fRed by default.
-.PP
-.B The
-.I bootp
-.B keyword
-.PP
- \fBallow bootp;\fR
- \fBdeny bootp;\fR
-.PP
-The \fBunknown-clients\fR flag is used to tell dhcpd whether
-or not to respond to bootp queries. Bootp queries are \fBallow\fRed
-by default.
-.PP
-.B The
-.I booting
-.B keyword
-.PP
- \fBallow booting;\fR
- \fBdeny booting;\fR
-.PP
-The \fBbooting\fR flag is used to tell dhcpd whether or not to respond
-to queries from a particular client. This keyword only has meaning
-when it appears in a host declaration. By default, booting is
-\fBallow\fRed, but if it is disabled for a particular client, then
-that client will not be able to get and address from the DHCP server.
-.SH REFERENCE: PARAMETERS
-.PP
-.B The
-.I default-lease-time
-.B statement
-.PP
- \fBdefault-lease-time\fR \fItime\fR\fB;\fR
-.PP
-.I Time
-should be the length in seconds that will be assigned to a lease if
-the client requesting the lease does not ask for a specific expiration
-time.
-.PP
-.B The
-.I max-lease-time
-.B statement
-.PP
- \fBmax-lease-time\fR \fItime\fR\fB;\fR
-.PP
-.I Time
-should be the maximum length in seconds that will be assigned to a
-lease if the client requesting the lease asks for a specific
-expiration time.
-.PP
-.B The
-.I hardware
-.B statement
-.PP
- \fBhardware\fR \fIhardware-type\fR \fIhardware-address\fR\fB;\fR
-.PP
-In order for a BOOTP client to be recognized, its network hardware
-address must be declared using a \fIhardware\fR clause in the
-.I host
-statement.
-.I hardware-type
-must be the name of a physical hardware interface type. Currently,
-only the
-.B ethernet
-type is recognized, although support for
-.B token-ring
-and
-.B fddi
-hardware types would also be desirable.
-The
-.I hardware-address
-should be a set of hexadecimal octets (numbers from 0 through ff)
-seperated by colons. The \fIhardwarefR statement may also be used
-for DHCP clients.
-.PP
-.B The
-.I filename
-.B statement
-.PP
- \fBfilename\fR \fB"\fR\fIfilename\fR\fB";\fR
-.PP
-The \fIfilename\fR statement can be used to specify the name of the
-initial boot file which is to be loaded by a client. The
-.I filename
-should be a filename recognizable to whatever file transfer protocol
-the client can be expected to use to load the file.
-.PP
-.B The
-.I server-name
-.B statement
-.PP
- \fBserver-name\fR \fB"\fR\fIname\fR\fB";\fR
-.PP
-The \fIserver-name\fR statement can be used to inform the client of
-the name of the server from which it is booting. \fIName\fR should
-be the name that will be provided to the client.
-.PP
-.B The
-.I next-server
-.B statement
-.PP
- \fBnext-server\fR \fIserver-name\fR\fB;\fR
-.PP
-The \fInext-server\fR statement is used to specify the host address of
-the server from which the initial boot file (specified in the
-\fIfilename\fR statement) is to be loaded. \fIServer-name\fR should
-be a numeric IP address or a domain name. If no \fInext-server\fR
-parameter applies to a given client, the address specified in the
-\fIserver-identifier\fR statement is used.
-.PP
-.B The
-.I fixed-address
-.B statement
-.PP
- \fBfixed-address\fR \fIaddress\fR [\fB,\fR \fIaddress\fR ... ]\fB;\fR
-.PP
-The \fIfixed-address\fR statement is used to assign one or more fixed
-IP addresses to a client. It should only appear in a \fIhost\fR
-declaration. If more than one address is supplied, then when the
-client boots, it will be assigned the address which corresponds to the
-network on which it is booting. If none of the addresses in the
-\fIfixed-address\fR statement are on the network on which the client
-is booting, that client will not match the \fIhost\fR declaration
-containing that \fIfixed-address\fR statement. Each \fIaddress\fR
-should be either an IP address or a domain name which resolves to one
-or more IP addresses.
-.PP
-.B The
-.I dynamic-bootp-lease-cutoff
-.B statement
-.PP
- \fBdynamic-bootp-lease-cutoff\fR \fIdate\fR\fB;\fR
-.PP
-The \fIdynamic-bootp-lease-cutoff\fR statement sets the ending time
-for all leases assigned dynamically to BOOTP clients. Because BOOTP
-clients do not have any way of renewing leases, and don't know that
-their leases could expire, by default dhcpd assignes infinite leases
-to all BOOTP clients. However, it may make sense in some situations
-to set a cutoff date for all BOOTP leases - for example, the end of a
-school term, or the time at night when a facility is closed and all
-machines are required to be powered off.
-.PP
-.I Date
-should be the date on which all assigned BOOTP leases will end. The
-date is specified in the form:
-.PP
-.ce 1
-W YYYY/MM/DD HH:MM:SS
-.PP
-W is the day of the week expressed as a number
-from zero (Sunday) to six (Saturday). YYYY is the year, including the
-century. MM is the month expressed as a number from 1 to 12. DD is
-the day of the month, counting from 1. HH is the hour, from zero to
-23. MM is the minute and SS is the second. The time is always in
-Greenwich Mean Time (GMT), not local time.
-.PP
-.B The
-.I dynamic-bootp-lease-length
-.B statement
-.PP
- \fBdynamic-bootp-lease-length\fR \fIlength\fR\fB;\fR
-.PP
-The \fIdynamic-bootp-lease-length\fR statement is used to set the
-length of leases dynamically assigned to BOOTP clients. At some
-sites, it may be possible to assume that a lease is no longer in
-use if its holder has not used BOOTP or DHCP to get its address within
-a certain time period. The period is specified in \fIlength\fR as a
-number of seconds. If a client reboots using BOOTP during the
-timeout period, the lease duration is reset to \fIlength\fR, so a
-BOOTP client that boots frequently enough will never lose its lease.
-Needless to say, this parameter should be adjusted with extreme
-caution.
-.PP
-.B The
-.I get-lease-hostnames
-.B statement
-.PP
- \fBget-lease-hostnames\fR \fIflag\fR\fB;\fR
-.PP
-The \fIget-lease-hostnames\fR statement is used to tell dhcpd whether
-or not to look up the domain name corresponding to the IP address of
-each address in the lease pool and use that address for the DHCP
-\fIhostname\fR option. If \fIflag\fR is true, then this lookup is
-done for all addresses in the current scope. By default, or if
-\fIflag\fR is false, no lookups are done.
-.PP
-.B The
-.I use-host-decl-names
-.B statement
-.PP
- \fBuse-host-decl-names\fR \fIflag\fR\fB;\fR
-.PP
-If the \fIuse-host-decl-names\fR parameter is true in a given scope,
-then for every host declaration within that scope, the name provided
-for the host declaration will be supplied to the client as its
-hostname. So, for example,
-.PP
-.nf
- group {
- use-host-decl-names on;
-
- host joe {
- hardware ethernet 08:00:2b:4c:29:32;
- fixed-address joe.fugue.com;
- }
- }
-
-is equivalent to
-
- host joe {
- hardware ethernet 08:00:2b:4c:29:32;
- fixed-address joe.fugue.com;
- option host-name "joe";
- }
-.fi
-.PP
-An \fIoption host-name\fR statement within a host declaration will
-override the use of the name in the host declaration.
-.SH REFERENCE: OPTION STATEMENTS
-.PP
-DHCP \fIoption\fR statements always start with the \fIoption\fR
-keyword, followed by an option name, followed by option data. The
-option names and data formats are described below. It is not
-necessary to exhaustively specify all DHCP options - only those
-options which are needed by clients must be specified.
-.PP
-Option data comes in a variety of formats, as defined below:
-.PP
-The
-.B ip-address
-data type can be entered either as an explicit IP
-address (e.g., 239.254.197.10) or as a domain name (e.g.,
-haagen.isc.org). When entering a domain name, be sure that that
-domain name resolves to a single IP address.
-.PP
-The
-.B int32
-data type specifies a signed 32-bit integer. The
-.B uint32
-data type specifies an unsigned 32-bit integer. The
-.B int16
-and
-.B uint16
-data types specify signed and unsigned 16-bit integers. The
-.B int8
-and
-.B uint8
-data types specify signed and unsigned 8-bit integers.
-Unsigned 8-bit integers are also sometimes referred to as octets.
-.PP
-The
-.B string
-data type specifies an NVT ASCII string, which must be
-enclosed in double quotes - for example, to specify a domain-name
-option, the syntax would be
-.nf
-.sp 1
- option domain-name "isc.org";
-.fi
-.PP
-The
-.B flag
-data type specifies a boolean value. Booleans can be either true or
-false (or on or off, if that makes more sense to you).
-.PP
-The
-.B data-string
-data type specifies either an NVT ASCII string
-enclosed in double quotes, or a series of octets specified in
-hexadecimal, seperated by colons. For example:
-.nf
-.sp 1
- option client-identifier "CLIENT-FOO";
-or
- option client-identifier 43:4c:49:45:54:2d:46:4f:4f;
-.fi
-.PP
-The documentation for the various options mentioned below is taken
-from the latest IETF draft document on DHCP options. Options which
-are not listed by name may be defined by the name option-\fInnn\fR,
-where \fInnn\fI is the decimal number of the option code. These
-options may be followed either by a string, enclosed in quotes, or by
-a series of octets, expressed as two-digit hexadecimal numbers seperated
-by colons. For example:
-.PP
-.nf
- option option-133 "my-option-133-text";
- option option-129 1:54:c9:2b:47;
-.fi
-.PP
-Because dhcpd does not know the format of these undefined option codes,
-no checking is done to ensure the correctness of the entered data.
-.PP
-The standard options are:
-.PP
- \fBoption subnet-mask\fR \fIip-address\fR\fB;\fR
-.PP
-The subnet mask option specifies the client's subnet mask as per RFC
-950. If no subnet mask option is provided anywhere in scope, as a
-last resort dhcpd will use the subnet mask from the subnet declaration
-for the network on which an address is being assigned. However,
-.I any
-subnet-mask option declaration that is in scope for the address being
-assigned will override the subnet mask specified in the subnet
-declaration.
-.PP
- \fBoption time-offset\fR \fIint32\fR\fB;\fR
-.PP
-The time-offset option specifies the offset of the client's subnet in
-seconds from Coordinated Universal Time (UTC).
-.PP
- \fBoption routers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The routers option specifies a list of IP addresses for routers on the
-client's subnet. Routers should be listed in order of preference.
-.PP
- \fBoption time-servers\fR \fIip-address [, \fIip-address\fR ... ]\fB;\fR
-.PP
-The time-server option specifies a list of RFC 868 time servers
-available to the client. Servers should be listed in order of
-preference.
-.PP
- \fBoption\fR \fBname-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ];
-.PP
-The name-servers option specifies a list of IEN 116 name servers
-available to the client. Servers should be listed in order of
-preference.
-.PP
- \fBoption\fR \fBdomain-name-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The domain-name-servers option specifies a list of Domain Name System
-(STD 13, RFC 1035) name servers available to the client. Servers
-should be listed in order of preference.
-.PP
- \fBoption\fR \fBlog-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The log-server option specifies a list of MIT-LCS UDP log servers
-available to the client. Servers should be listed in order of
-preference.
-.PP
- \fBoption\fR \fBcookie-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The cookie server option specifies a list of RFC 865 cookie
-servers available to the client. Servers should be listed in order
-of preference.
-.PP
- \fBoption\fR \fBlpr-servers\fR \fIip-address \fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The LPR server option specifies a list of RFC 1179 line printer
-servers available to the client. Servers should be listed in order
-of preference.
-.PP
- \fBoption\fR \fBimpress-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The impress-server option specifies a list of Imagen Impress servers
-available to the client. Servers should be listed in order of
-preference.
-.PP
- \fBoption\fR \fBresource-location-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of RFC 887 Resource Location
-servers available to the client. Servers should be listed in order
-of preference.
-.PP
- \fBoption\fR \fBhost-name\fR \fIstring\fR\fB;\fR
-.PP
-This option specifies the name of the client. The name may or may
-not be qualified with the local domain name (it is preferable to use
-the domain-name option to specify the domain name). See RFC 1035 for
-character set restrictions.
-.PP
- \fBoption\fR \fBboot-size\fR \fIuint16\fR\fB;\fR
-.PP
-This option specifies the length in 512-octet blocks of the default
-boot image for the client.
-.PP
- \fBoption\fR \fBmerit-dump\fR \fIstring\fR\fB;\fR
-.PP
-This option specifies the path-name of a file to which the client's
-core image should be dumped in the event the client crashes. The
-path is formatted as a character string consisting of characters from
-the NVT ASCII character set.
-.PP
- \fBoption\fR \fBdomain-name\fR \fIstring\fR\fB;\fR
-.PP
-This option specifies the domain name that client should use when
-resolving hostnames via the Domain Name System.
-.PP
- \fBoption\fR \fBswap-server\fR \fIip-address\fR\fB;\fR
-.PP
-This specifies the IP address of the client's swap server.
-.PP
- \fBoption\fR \fBroot-path\fR \fIstring\fB;\fR\fR
-.PP
-This option specifies the path-name that contains the client's root
-disk. The path is formatted as a character string consisting of
-characters from the NVT ASCII character set.
-.PP
- \fBoption\fR \fBip-forwarding\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether the client should configure its IP
-layer for packet forwarding. A value of 0 means disable IP
-forwarding, and a value of 1 means enable IP forwarding.
-.PP
- \fBoption\fR \fBnon-local-source-routing\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether the client should configure its IP
-layer to allow forwarding of datagrams with non-local source routes
-(see Section 3.3.5 of [4] for a discussion of this topic). A value
-of 0 means disallow forwarding of such datagrams, and a value of 1
-means allow forwarding.
-.PP
- \fBoption\fR \fBpolicy-filter\fR \fIip-address ip-address\fR [\fB,\fR \fIip-address ip-address\fR ... ]\fB;\fR
-.PP
-This option specifies policy filters for non-local source routing.
-The filters consist of a list of IP addresses and masks which specify
-destination/mask pairs with which to filter incoming source routes.
-.PP
-Any source routed datagram whose next-hop address does not match one
-of the filters should be discarded by the client.
-.PP
-See STD 3 (RFC1122) for further information.
-.PP
- \fBoption\fR \fBmax-dgram-reassembly\fR \fIuint16\fR\fB;\fR
-.PP
-This option specifies the maximum size datagram that the client
-should be prepared to reassemble. The minimum value legal value is
-576.
-.PP
- \fBoption\fR \fBdefault-ip-ttl\fR \fIuint8;\fR
-.PP
-This option specifies the default time-to-live that the client should
-use on outgoing datagrams.
-.PP
- \fBoption\fR \fBpath-mtu-aging-timeout\fR \fIuint32\fR\fB;\fR
-.PP
-This option specifies the timeout (in seconds) to use when aging Path
-MTU values discovered by the mechanism defined in RFC 1191.
-.PP
- \fBoption\fR \fBpath-mtu-plateau-table\fR \fIuint16\fR [\fB,\fR \fIuint16\fR ... ]\fB;\fR
-.PP
-This option specifies a table of MTU sizes to use when performing
-Path MTU Discovery as defined in RFC 1191. The table is formatted as
-a list of 16-bit unsigned integers, ordered from smallest to largest.
-The minimum MTU value cannot be smaller than 68.
-.PP
- \fBoption\fR \fBinterface-mtu\fR \fIuint16\fR\fB;\fR
-.PP
-This option specifies the MTU to use on this interface. The minimum
-legal value for the MTU is 68.
-.PP
- \fBoption\fR \fBall-subnets-local\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client may assume that all
-subnets of the IP network to which the client is connected use the
-same MTU as the subnet of that network to which the client is
-directly connected. A value of 1 indicates that all subnets share
-the same MTU. A value of 0 means that the client should assume that
-some subnets of the directly connected network may have smaller MTUs.
-.PP
- \fBoption\fR \fBbroadcast-address\fR \fIip-address\fR\fB;\fR
-.PP
-This option specifies the broadcast address in use on the client's
-subnet. Legal values for broadcast addresses are specified in
-section 3.2.1.3 of STD 3 (RFC1122).
-.PP
- \fBoption\fR \fBperform-mask-discovery\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client should perform subnet
-mask discovery using ICMP. A value of 0 indicates that the client
-should not perform mask discovery. A value of 1 means that the
-client should perform mask discovery.
-.PP
- \fBoption\fR \fBmask-supplier\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client should respond to
-subnet mask requests using ICMP. A value of 0 indicates that the
-client should not respond. A value of 1 means that the client should
-respond.
-.PP
- \fBoption\fR \fBrouter-discovery\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client should solicit
-routers using the Router Discovery mechanism defined in RFC 1256.
-A value of 0 indicates that the client should not perform
-router discovery. A value of 1 means that the client should perform
-router discovery.
-.PP
- \fBoption\fR \fBrouter-solicitation-address\fR \fIip-address\fR\fB;\fR
-.PP
-This option specifies the address to which the client should transmit
-router solicitation requests.
-.PP
- \fBoption\fR \fBstatic-routes\fR \fIip-address ip-address\fR [\fB,\fR \fIip-address ip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of static routes that the client should
-install in its routing cache. If multiple routes to the same
-destination are specified, they are listed in descending order of
-priority.
-.PP
-The routes consist of a list of IP address pairs. The first address
-is the destination address, and the second address is the router for
-the destination.
-.PP
-The default route (0.0.0.0) is an illegal destination for a static
-route. To specify the default route, use the
-.B routers
-option.
-.PP
- \fBoption\fR \fBtrailer-encapsulation\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client should negotiate the
-use of trailers (RFC 893 [14]) when using the ARP protocol. A value
-of 0 indicates that the client should not attempt to use trailers. A
-value of 1 means that the client should attempt to use trailers.
-.PP
- \fBoption\fR \fBarp-cache-timeout\fR \fIuint32\fR\fB;\fR
-.PP
-This option specifies the timeout in seconds for ARP cache entries.
-.PP
- \fBoption\fR \fBieee802-3-encapsulation\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies whether or not the client should use Ethernet
-Version 2 (RFC 894) or IEEE 802.3 (RFC 1042) encapsulation if the
-interface is an Ethernet. A value of 0 indicates that the client
-should use RFC 894 encapsulation. A value of 1 means that the client
-should use RFC 1042 encapsulation.
-.PP
- \fBoption\fR \fBdefault-tcp-ttl\fR \fIuint8\fR\fB;\fR
-.PP
-This option specifies the default TTL that the client should use when
-sending TCP segments. The minimum value is 1.
-.PP
- \fBoption\fR \fBtcp-keepalive-interval\fR \fIuint32\fR\fB;\fR
-.PP
-This option specifies the interval (in seconds) that the client TCP
-should wait before sending a keepalive message on a TCP connection.
-The time is specified as a 32-bit unsigned integer. A value of zero
-indicates that the client should not generate keepalive messages on
-connections unless specifically requested by an application.
-.PP
- \fBoption\fR \fBtcp-keepalive-garbage\fR \fIflag\fR\fB;\fR
-.PP
-This option specifies the whether or not the client should send TCP
-keepalive messages with a octet of garbage for compatibility with
-older implementations. A value of 0 indicates that a garbage octet
-should not be sent. A value of 1 indicates that a garbage octet
-should be sent.
-.PP
- \fBoption\fR \fBnis-domain\fR \fIstring\fR\fB;\fR
-.PP
-This option specifies the name of the client's NIS (Sun Network
-Information Services) domain. The domain is formatted as a character
-string consisting of characters from the NVT ASCII character set.
-.PP
- \fBoption\fR \fBnis-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of IP addresses indicating NIS servers
-available to the client. Servers should be listed in order of
-preference.
-.PP
- \fBoption\fR \fBntp-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of IP addresses indicating NTP (RFC 1035)
-servers available to the client. Servers should be listed in order
-of preference.
-.PP
- \fBoption\fR \fBnetbios-name-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The NetBIOS name server (NBNS) option specifies a list of RFC
-1001/1002 NBNS name servers listed in order of preference.
-.PP
- \fBoption\fR \fBnetbios-dd-server\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-The NetBIOS datagram distribution server (NBDD) option specifies a
-list of RFC 1001/1002 NBDD servers listed in order of preference.
-.PP
- \fBoption\fR \fBnetbios-node-type\fR \fIuint8\fR\fB;\fR
-.PP
-The NetBIOS node type option allows NetBIOS over TCP/IP clients which
-are configurable to be configured as described in RFC 1001/1002. The
-value is specified as a single octet which identifies the client type.
-A value of 1 corresponds to a NetBIOS B-node; a value of 2 corresponds
-to a P-node; a value of 4 corresponds to an M-node; a value of 8
-corresponds to an H-node.
-.PP
- \fBoption\fR \fBnetbios-scope\fR \fIstring\fR\fB;\fR
-.PP
-The NetBIOS scope option specifies the NetBIOS over TCP/IP scope
-parameter for the client as specified in RFC 1001/1002. See RFC1001,
-RFC1002, and RFC1035 for character-set restrictions.
-.PP
- \fBoption\fR \fBfont-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of X Window System Font servers available
-to the client. Servers should be listed in order of preference.
-.PP
- \fBoption\fR \fBx-display-manager\fR \fIip-address\fR [\fB,\fR \fIip-address\fR ... ]\fB;\fR
-.PP
-This option specifies a list of systems that are running the X Window
-System Display Manager and are available to the client. Addresses
-should be listed in order of preference.
-.PP
- \fBoption\fR \fBdhcp-client-identifier\fR \fIdata-string\fR\fB;\fR
-.PP
-This option can be used to specify the a DHCP client identifier in a
-host declaration, so that dhcpd can find the host record by matching
-against the client identifier.
-.SH SEE ALSO
-dhcpd.conf(5), dhcpd.leases(5),
-draft-ietf-dhc-options-1533update-04.txt, draft-ietf-dhc-dhcp-07.txt.
-.SH AUTHOR
-.B dhcpd(8)
-was written by Ted Lemon <mellon@vix.com>
-under a contract with Vixie Labs. Funding
-for this project was provided by the Internet Software Corporation.
-Information about the Internet Software Consortium can be found at
-.B http://www.isc.org/isc.
+++ /dev/null
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
-N\bNA\bAM\bME\bE
- dhcpd.conf - dhcpd configuration file
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
- The dhcpd.conf file contains configuration information for
- _\bd_\bh_\bc_\bp_\bd_\b, the Internet Software Consortium DHCP Server.
-
- The dhcpd.conf file is a free-form ASCII text file. It
- is parsed by the recursive-descent parser built into
- dhcpd. The file may contain extra tabs and newlines for
- formatting purposes. Keywords in the file are case-insen-
- sitive. Comments may be placed anywhere within the file
- (except within quotes). Comments begin with the # char-
- acter and end at the end of the line.
-
- The file essentially consists of a list of statements.
- Statements fall into two broad categories - parameters and
- declarations.
-
- Parameter statements either say how to do something (e.g.,
- how long a lease to offer), whether to do something (e.g.,
- should dhcpd provide addresses to unknown clients), or
- what parameters to provide to the client (e.g., use gate-
- way 220.177.244.7).
-
- Declarations are used to describe the topology of the net-
- work, to describe clients on the network, to provide
- addresses that can be assigned to clients, or to apply a
- group of parameters to a group of declarations. In any
- group of parameters and declarations, all parameters must
- be specified before any declarations which depend on those
- parameters may be specified.
-
- Declarations about network topology include the _\bs_\be_\br_\bv_\be_\br_\b-
- _\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br, the _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk and the _\bs_\bu_\bb_\bn_\be_\bt declara-
- tions. If clients on a subnet are to be assigned
- addresses dynamically, a _\br_\ba_\bn_\bg_\be declaration must appear
- within the _\bs_\bu_\bb_\bn_\be_\bt declaration. For clients with stati-
- cally assigned addresses, or for installations where only
- known clients will be served, each such client must have a
- _\bh_\bo_\bs_\bt declaration. If parameters are to be applied to a
- group of declarations which are not related strictly on a
- per-subnet basis, the _\bg_\br_\bo_\bu_\bp declaration can be used.
-
- Each dhcpd.conf file must have one (and only one) _\bs_\be_\br_\bv_\be_\br_\b-
- _\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br declaration, which tells dhcpd the identifier
- to use when issuing leases. For every subnet which will
- be served, and for every subnet to which the dhcp server
- is connected, there must be one _\bs_\bu_\bb_\bn_\be_\bt declaration, which
- tells dhcpd how to recognize that an address is on that
- subnet. A _\bs_\bu_\bb_\bn_\be_\bt declaration is required for each subnet
- even if no addresses will be dynamically allocated on that
- subnet.
-
-
-
-
- 1
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- Some installations have physical networks on which more
- than one IP subnet operates. For example, if there is a
- site-wide requirement that 8-bit subnet masks be used, but
- a department with a single physical ethernet network
- expands to the point where it has more than 254 nodes, it
- may be necessary to run two 8-bit subnets on the same eth-
- ernet until such time as a new physical network can be
- added. In this case, the _\bs_\bu_\bb_\bn_\be_\bt declarations for these
- two networks may be enclosed in a _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk declara-
- tion.
-
- Some sites may have departments which have clients on more
- than one subnet, but it may be desirable to offer those
- clients a uniform set of parameters which are different
- than what would be offered to clients from other depart-
- ments on the same subnet. For clients which will be
- declared explicitly with _\bh_\bo_\bs_\bt declarations, these declara-
- tions can be enclosed in a _\bg_\br_\bo_\bu_\bp declaration along with
- the parameters which are common to that department. For
- clients whose addresses will be dynamically assigned,
- there is currently no way to group parameter assignments
- other than by network topology.
-
- When a client is to be booted, its boot parameters are
- determined by first consulting that client's _\bh_\bo_\bs_\bt declara-
- tion (if any), then consulting the _\bg_\br_\bo_\bu_\bp declaration (if
- any) which enclosed that _\bh_\bo_\bs_\bt declaration, then consulting
- the _\bs_\bu_\bb_\bn_\be_\bt declaration for the subnet on which the client
- is booting, then consulting the _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk declaration
- (if any) containing that subnet, and finally consulting
- the top-level parameters which may be specified outside of
- any declaration.
-
- When dhcpd tries to find a _\bh_\bo_\bs_\bt declaration for a client,
- it first looks for a _\bh_\bo_\bs_\bt declaration which has a _\bf_\bi_\bx_\be_\bd_\b-
- _\ba_\bd_\bd_\br_\be_\bs_\bs parameter which matches the subnet or shared net-
- work on which the client is booting. If it doesn't find
- any such entry, it then tries to find an entry which has
- no _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs parameter. If no such entry is found,
- then dhcpd acts as if there is no entry in the dhcpd.conf
- file for that client, even if there is an entry for that
- client on a different subnet or shared network.
-
-E\bEX\bXA\bAM\bMP\bPL\bLE\bES\bS
- A typical dhcpd.conf file will look something like this:
-
- server-identifier dhcps.isc.org;
- _\bg_\bl_\bo_\bb_\ba_\bl _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
-
- shared-network ISC-BIGGIE {
- _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
- subnet 204.254.239.0 netmask 255.255.255.224 {
- _\bs_\bu_\bb_\bn_\be_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
- range 204.254.239.10 204.254.239.30;
-
-
-
- 2
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- }
- subnet 204.254.239.32 netmask 255.255.255.224 {
- _\bs_\bu_\bb_\bn_\be_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
- range 204.254.239.42 204.254.239.62;
- }
- }
-
- subnet 204.254.239.64 netmask 255.255.255.224 {
- _\bs_\bu_\bb_\bn_\be_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
- range 204.254.239.74 204.254.239.94;
- }
-
- group {
- _\bg_\br_\bo_\bu_\bp_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
- host zappo.test.isc.org {
- _\bh_\bo_\bs_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
- }
- host beppo.test.isc.org {
- _\bh_\bo_\bs_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
- }
- host harpo.test.isc.org {
- _\bh_\bo_\bs_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\b._\b.
- }
- }
-
- Figure 1
-
-
- Notice that after the server-identifier declaration,
- there's a place for global parameters. These might be
- things like the organization's domain name, the addresses
- of the name servers (if they are common to the entire
- organization), and so on. So, for example:
-
- option domain-name "isc.org";
- option name-servers ns1.isc.org, ns2.isc.org;
-
- Figure 2
-
- As you can see in Figure 2, it's legal to specify host
- addresses in parameters as domain names rather than as
- numeric IP addresses. If a given hostname resolves to
- more than one IP address (for example, if that host has
- two ethernet interfaces), both addresses are supplied to
- the client.
-
- In Figure 1, you can see that both the shared-network
- statement and the subnet statements can have parameters.
- Let us say that the shared network _\bI_\bS_\bC_\b-_\bB_\bI_\bG_\bG_\bI_\bE supports an
- entire department - perhaps the accounting department.
- If accounting has its own domain, then a shared-network-
- specific parameter might be:
-
- option domain-name "accounting.isc.org";
-
-
-
- 3
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- All subnet declarations appearing in the shared-network
- declaration would then have the domain-name option set to
- "accounting.isc.org" instead of just "isc.org".
-
- The most obvious reason for having subnet-specific parame-
- ters as shown in Figure 1 is that each subnet, of neces-
- sity, has its own router. So for the first subnet, for
- example, there should be something like:
-
- option routers 204.254.239.1;
-
- Note that the address here is specified numerically.
- This is not required - if you have a different domain name
- for each interface on your router, it's perfectly legiti-
- mate to use the domain name for that interface instead of
- the numeric address. However, in many cases there may be
- only one domain name for all of a router's IP addresses,
- and it would not be appropriate to use that name here.
-
- In Figure 1 there is also a _\bg_\br_\bo_\bu_\bp statement, which pro-
- vides common parameters for a set of three hosts - zappo,
- beppo and harpo. As you can see, these hosts are all in
- the test.isc.org domain, so it might make sense for a
- group-specific parameter to override the domain name sup-
- plied to these hosts:
-
- option domain-name "test.isc.org";
-
- Also, given the domain they're in, these are probably test
- machines. If we wanted to test the DHCP leasing mecha-
- nism, we might set the lease timeout somewhat shorter than
- the default:
-
- max-lease-time 120;
- default-lease-time 120;
-
- You may have noticed that while some parameters start with
- the _\bo_\bp_\bt_\bi_\bo_\bn keyword, some do not. Parameters starting
- with the _\bo_\bp_\bt_\bi_\bo_\bn keyword correspond to actual DHCP options,
- while parameters that do not start with the option keyword
- either control the behaviour of the DHCP server (e.g., how
- long a lease dhcpd will give out), or specify client
- parameters that are not optional in the DHCP protocol (for
- example, server-name and filename).
-
- In Figure 1, each host had _\bh_\bo_\bs_\bt_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs.
- These could include such things as the _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be option,
- the name of a file to upload (the _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\b) _\ba_\bn_\bd
- _\bt_\bh_\be _\ba_\bd_\bd_\br_\be_\bs_\bs _\bo_\bf _\bt_\bh_\be _\bs_\be_\br_\bv_\be_\br _\bf_\br_\bo_\bm _\bw_\bh_\bi_\bc_\bh _\bt_\bo _\bu_\bp_\bl_\bo_\ba_\bd _\bt_\bh_\be _\bf_\bi_\bl_\be
- _\b(_\bt_\bh_\be _\bn_\be_\bx_\bt_\b-_\bs_\be_\br_\bv_\be_\br parameter). In general, any parameter
- can appear anywhere that parameters are allowed, and will
- be applied according to the scope in which the parameter
- appears.
-
-
-
-
- 4
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- Imagine that you have a site with a lot of NCD X-Termi-
- nals. These terminals come in a variety of models, and
- you want to specify the boot files for each models. One
- way to do this would be to have host declarations for each
- server and group them by model:
-
- group {
- filename "Xncd19r";
- next-server ncd-booter;
-
- host ncd1 { hardware ethernet 0:c0:c3:49:2b:57; }
- host ncd4 { hardware ethernet 0:c0:c3:80:fc:32; }
- host ncd8 { hardware ethernet 0:c0:c3:22:46:81; }
- }
-
- group {
- filename "Xncd19c";
- next-server ncd-booter;
-
- host ncd2 { hardware ethernet 0:c0:c3:88:2d:81; }
- host ncd3 { hardware ethernet 0:c0:c3:00:14:11; }
- }
-
- group {
- filename "XncdHMX";
- next-server ncd-booter;
-
- host ncd1 { hardware ethernet 0:c0:c3:11:90:23; }
- host ncd4 { hardware ethernet 0:c0:c3:91:a7:8; }
- host ncd8 { hardware ethernet 0:c0:c3:cc:a:8f; }
- }
-
-R\bRE\bEF\bFE\bER\bRE\bEN\bNC\bCE\bE:\b: D\bDE\bEC\bCL\bLA\bAR\bRA\bAT\bTI\bIO\bON\bNS\bS
- T\bTh\bhe\be _\bs_\be_\br_\bv_\be_\br_\b-_\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- s\bse\ber\brv\bve\ber\br-\b-i\bid\bde\ben\bnt\bti\bif\bfi\bie\ber\br _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be;\b;
-
- The server-identifier declaration must be used exactly
- once in each dhcpd.conf file to tell dhcpd what IP address
- to use as its server identifier, as required by the DHCP
- protocol. On a machine with a single interface, the
- server identifier should be the primary address of that
- interface. On machines with multiple interfaces, the
- address of one such interface must be chosen. Any
- address may be chosen, as long as it is the address of one
- of the interfaces of that machine.
-
- T\bTh\bhe\be _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- s\bsh\bha\bar\bre\bed\bd-\b-n\bne\bet\btw\bwo\bor\brk\bk _\bn_\ba_\bm_\be {\b{
- [ _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs ]
- [ _\bd_\be_\bc_\bl_\ba_\br_\ba_\bt_\bi_\bo_\bn_\bs ]
- }\b}
-
-
-
-
- 5
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- The _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk statement is used to inform the DHCP
- server that some IP subnets actually share the same physi-
- cal network. Any subnets in a shared network should be
- declared within a _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk statement. Parameters
- specified in the _\bs_\bh_\ba_\br_\be_\bd_\b-_\bn_\be_\bt_\bw_\bo_\br_\bk statement will be used
- when booting clients on those subnets unless parameters
- provided at the subnet or host level override them. If
- any subnet in a shared network has addresses available for
- dynamic allocation, those addresses are collected into a
- common pool for that shared network and assigned to
- clients as needed. There is no way to distinguish on
- which subnet of a shared network a client should boot.
-
- _\bN_\ba_\bm_\be should be the name of the shared network. This name
- is used when printing debugging messages, so it should be
- descriptive for the shared network. The name may have
- the syntax of a valid domain name (although it will never
- be used as such), or it may be any arbitrary name,
- enclosed in quotes.
-
- T\bTh\bhe\be _\bs_\bu_\bb_\bn_\be_\bt s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- s\bsu\bub\bbn\bne\bet\bt _\bs_\bu_\bb_\bn_\be_\bt_\b-_\bn_\bu_\bm_\bb_\be_\br n\bne\bet\btm\bma\bas\bsk\bk _\bn_\be_\bt_\bm_\ba_\bs_\bk {\b{
- [ _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs ]
- [ _\bd_\be_\bc_\bl_\ba_\br_\ba_\bt_\bi_\bo_\bn_\bs ]
- }\b}
-
- The _\bs_\bu_\bb_\bn_\be_\bt statement is used to provide dhcpd with enough
- information to tell whether or not an IP address is on
- that subnet. It may also be used to provide subnet-spe-
- cific parameters and to specify what addresses may be
- dynamically allocated to clients booting on that subnet.
- Such addresses are specified using the _\br_\ba_\bn_\bg_\be declaration.
-
- The _\bs_\bu_\bb_\bn_\be_\bt_\b-_\bn_\bu_\bm_\bb_\be_\br should be an IP address or domain name
- which resolves to the subnet number of the subnet being
- described. The _\bn_\be_\bt_\bm_\ba_\bs_\bk should be an IP address or domain
- name which resolves to the subnet mask of the subnet being
- described. The subnet number, together with the netmask,
- are sufficient to determine whether any given IP address
- is on the specified subnet.
-
- Although a netmask must be given with every subnet decla-
- ration, it is recommended that if there is any variance in
- subnet masks at a site, a subnet-mask option statement be
- used in each subnet declaration to set the desired subnet
- mask, since any subnet-mask option statement will override
- the subnet mask declared in the subnet statement.
-
- T\bTh\bhe\be _\br_\ba_\bn_\bg_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- r\bra\ban\bng\bge\be [ d\bdy\byn\bna\bam\bmi\bic\bc-\b-b\bbo\boo\bot\btp\bp ] _\bl_\bo_\bw_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [ _\bh_\bi_\bg_\bh_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs];\b;
-
- For any subnet on which addresses will be assigned
-
-
-
- 6
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- dynamically, there must be at least one _\br_\ba_\bn_\bg_\be statement.
- The range statement gives the lowest and highest IP
- addresses in a range. All IP addresses in the range
- should be in the subnet in which the _\br_\ba_\bn_\bg_\be statement is
- declared. The _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b-_\bb_\bo_\bo_\bt_\bp flag may be specified if
- addresses in the specified range may be dynamically
- assigned to BOOTP clients as well as DHCP clients. When
- specifying a single address, _\bh_\bi_\bg_\bh_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs can be omitted.
-
- T\bTh\bhe\be _\bh_\bo_\bs_\bt s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- h\bho\bos\bst\bt _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be {
- [ _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs ]
- [ _\bd_\be_\bc_\bl_\ba_\br_\ba_\bt_\bi_\bo_\bn_\bs ]
- }\b}
-
- There must be at least one h\bho\bos\bst\bt statement for every BOOTP
- client that is to be served. h\bho\bos\bst\bt statements may also be
- specified for DHCP clients, although this is not required
- unless booting is only enabled for known hosts.
-
- If it is desirable to be able to boot a DHCP or BOOTP
- client on more than one subnet with fixed addresses, more
- than one address may be specified in the _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs
- parameter, or more than one h\bho\bos\bst\bt statement may be speci-
- fied.
-
- If client-specific boot parameters must change based on
- the network to which the client is attached, then multiple
- h\bho\bos\bst\bt statements should be used.
-
- If a client is to be booted using a fixed address if it's
- possible, but should be allocated a dynamic address other-
- wise, then a h\bho\bos\bst\bt statement must be specified without a
- f\bfi\bix\bxe\bed\bd-\b-a\bad\bdd\bdr\bre\bes\bss\bs clause. _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be should be a name identify-
- ing the host. If a _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be option is not specified for
- the host, _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be is used.
-
- _\bH_\bo_\bs_\bt declarations are matched to actual DHCP or BOOTP
- clients by matching the dhcp-client-identifier option
- specified in the _\bh_\bo_\bs_\bt declaration to the one supplied by
- the client, or, if the _\bh_\bo_\bs_\bt declaration or the client does
- not provide a dhcp-client-identifier option, by matching
- the _\bh_\ba_\br_\bd_\bw_\ba_\br_\be parameter in the _\bh_\bo_\bs_\bt declaration to the net-
- work hardware address supplied by the client. BOOTP
- clients do not normally provide a _\bd_\bh_\bc_\bp_\b-_\bc_\bl_\bi_\be_\bn_\bt_\b-_\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br,
- so the hardware address must be used for all clients that
- may boot using the BOOTP protocol.
-
- T\bTh\bhe\be _\bg_\br_\bo_\bu_\bp s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- g\bgr\bro\bou\bup\bp {
- [ _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs ]
- [ _\bd_\be_\bc_\bl_\ba_\br_\ba_\bt_\bi_\bo_\bn_\bs ]
-
-
-
- 7
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- }\b}
-
- The group statement is used simply to apply one or more
- parameters to a group of declarations. It can be used to
- group hosts, shared networks, subnets, or even other
- groups.
-
-R\bRE\bEF\bFE\bER\bRE\bEN\bNC\bCE\bE:\b: A\bAL\bLL\bLO\bOW\bW a\ban\bnd\bd D\bDE\bEN\bNY\bY
- The _\ba_\bl_\bl_\bo_\bw and _\bd_\be_\bn_\by statements can be used to control the
- behaviour of dhcpd to various sorts of requests.
-
-
- T\bTh\bhe\be _\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b-_\bc_\bl_\bi_\be_\bn_\bt_\bs k\bke\bey\byw\bwo\bor\brd\bd
-
- a\bal\bll\blo\bow\bw u\bun\bnk\bkn\bno\bow\bwn\bn-\b-c\bcl\bli\bie\ben\bnt\bts\bs;\b;
- d\bde\ben\bny\by u\bun\bnk\bkn\bno\bow\bwn\bn-\b-c\bcl\bli\bie\ben\bnt\bts\bs;\b;
-
- The u\bun\bnk\bkn\bno\bow\bwn\bn-\b-c\bcl\bli\bie\ben\bnt\bts\bs flag is used to tell dhcpd whether or
- not to dynamically assign addresses to unknown clients.
- Dynamic address assignment to unknown clients is a\bal\bll\blo\bow\bwed
- by default.
-
- T\bTh\bhe\be _\bb_\bo_\bo_\bt_\bp k\bke\bey\byw\bwo\bor\brd\bd
-
- a\bal\bll\blo\bow\bw b\bbo\boo\bot\btp\bp;\b;
- d\bde\ben\bny\by b\bbo\boo\bot\btp\bp;\b;
-
- The u\bun\bnk\bkn\bno\bow\bwn\bn-\b-c\bcl\bli\bie\ben\bnt\bts\bs flag is used to tell dhcpd whether or
- not to respond to bootp queries. Bootp queries are
- a\bal\bll\blo\bow\bwed by default.
-
- T\bTh\bhe\be _\bb_\bo_\bo_\bt_\bi_\bn_\bg k\bke\bey\byw\bwo\bor\brd\bd
-
- a\bal\bll\blo\bow\bw b\bbo\boo\bot\bti\bin\bng\bg;\b;
- d\bde\ben\bny\by b\bbo\boo\bot\bti\bin\bng\bg;\b;
-
- The b\bbo\boo\bot\bti\bin\bng\bg flag is used to tell dhcpd whether or not to
- respond to queries from a particular client. This keyword
- only has meaning when it appears in a host declaration.
- By default, booting is a\bal\bll\blo\bow\bwed, but if it is disabled for
- a particular client, then that client will not be able to
- get and address from the DHCP server.
-
-R\bRE\bEF\bFE\bER\bRE\bEN\bNC\bCE\bE:\b: P\bPA\bAR\bRA\bAM\bME\bET\bTE\bER\bRS\bS
- T\bTh\bhe\be _\bd_\be_\bf_\ba_\bu_\bl_\bt_\b-_\bl_\be_\ba_\bs_\be_\b-_\bt_\bi_\bm_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- d\bde\bef\bfa\bau\bul\blt\bt-\b-l\ble\bea\bas\bse\be-\b-t\bti\bim\bme\be _\bt_\bi_\bm_\be;\b;
-
- _\bT_\bi_\bm_\be should be the length in seconds that will be assigned
- to a lease if the client requesting the lease does not ask
- for a specific expiration time.
-
- T\bTh\bhe\be _\bm_\ba_\bx_\b-_\bl_\be_\ba_\bs_\be_\b-_\bt_\bi_\bm_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
-
-
-
- 8
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- m\bma\bax\bx-\b-l\ble\bea\bas\bse\be-\b-t\bti\bim\bme\be _\bt_\bi_\bm_\be;\b;
-
- _\bT_\bi_\bm_\be should be the maximum length in seconds that will be
- assigned to a lease if the client requesting the lease
- asks for a specific expiration time.
-
- T\bTh\bhe\be _\bh_\ba_\br_\bd_\bw_\ba_\br_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- h\bha\bar\brd\bdw\bwa\bar\bre\be _\bh_\ba_\br_\bd_\bw_\ba_\br_\be_\b-_\bt_\by_\bp_\be _\bh_\ba_\br_\bd_\bw_\ba_\br_\be_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
-
- In order for a BOOTP client to be recognized, its network
- hardware address must be declared using a _\bh_\ba_\br_\bd_\bw_\ba_\br_\be clause
- in the _\bh_\bo_\bs_\bt statement. _\bh_\ba_\br_\bd_\bw_\ba_\br_\be_\b-_\bt_\by_\bp_\be must be the name of
- a physical hardware interface type. Currently, only the
- e\bet\bth\bhe\ber\brn\bne\bet\bt type is recognized, although support for t\bto\bok\bke\ben\bn-\b-
- r\bri\bin\bng\bg and f\bfd\bdd\bdi\bi hardware types would also be desirable. The
- _\bh_\ba_\br_\bd_\bw_\ba_\br_\be_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs should be a set of hexadecimal octets
- (numbers from 0 through ff) seperated by colons. The
- _\bh_\ba_\br_\bd_\bw_\ba_\br_\be_\bf_\bR _\bs_\bt_\ba_\bt_\be_\bm_\be_\bn_\bt _\bm_\ba_\by _\ba_\bl_\bs_\bo _\bb_\be _\bu_\bs_\be_\bd _\bf_\bo_\br _\bD_\bH_\bC_\bP _\bc_\bl_\bi_\be_\bn_\bt_\bs_\b.
-
- T\bTh\bhe\be _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- f\bfi\bil\ble\ben\bna\bam\bme\be "\b"_\bf_\bi_\bl_\be_\bn_\ba_\bm_\be"\b";\b;
-
- The _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be statement can be used to specify the name of
- the initial boot file which is to be loaded by a client.
- The _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be should be a filename recognizable to whatever
- file transfer protocol the client can be expected to use
- to load the file.
-
- T\bTh\bhe\be _\bs_\be_\br_\bv_\be_\br_\b-_\bn_\ba_\bm_\be s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- s\bse\ber\brv\bve\ber\br-\b-n\bna\bam\bme\be "\b"_\bn_\ba_\bm_\be"\b";\b;
-
- The _\bs_\be_\br_\bv_\be_\br_\b-_\bn_\ba_\bm_\be statement can be used to inform the client
- of the name of the server from which it is booting. _\bN_\ba_\bm_\be
- should be the name that will be provided to the client.
-
- T\bTh\bhe\be _\bn_\be_\bx_\bt_\b-_\bs_\be_\br_\bv_\be_\br s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- n\bne\bex\bxt\bt-\b-s\bse\ber\brv\bve\ber\br _\bs_\be_\br_\bv_\be_\br_\b-_\bn_\ba_\bm_\be;\b;
-
- The _\bn_\be_\bx_\bt_\b-_\bs_\be_\br_\bv_\be_\br statement is used to specify the host
- address of the server from which the initial boot file
- (specified in the _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be statement) is to be loaded.
- _\bS_\be_\br_\bv_\be_\br_\b-_\bn_\ba_\bm_\be should be a numeric IP address or a domain
- name. If no _\bn_\be_\bx_\bt_\b-_\bs_\be_\br_\bv_\be_\br parameter applies to a given
- client, the address specified in the _\bs_\be_\br_\bv_\be_\br_\b-_\bi_\bd_\be_\bn_\bt_\bi_\bf_\bi_\be_\br
- statement is used.
-
- T\bTh\bhe\be _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- f\bfi\bix\bxe\bed\bd-\b-a\bad\bdd\bdr\bre\bes\bss\bs _\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-
-
-
- 9
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- The _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs statement is used to assign one or more
- fixed IP addresses to a client. It should only appear in
- a _\bh_\bo_\bs_\bt declaration. If more than one address is supplied,
- then when the client boots, it will be assigned the
- address which corresponds to the network on which it is
- booting. If none of the addresses in the _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs
- statement are on the network on which the client is boot-
- ing, that client will not match the _\bh_\bo_\bs_\bt declaration con-
- taining that _\bf_\bi_\bx_\be_\bd_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs statement. Each _\ba_\bd_\bd_\br_\be_\bs_\bs should
- be either an IP address or a domain name which resolves to
- one or more IP addresses.
-
- T\bTh\bhe\be _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b-_\bb_\bo_\bo_\bt_\bp_\b-_\bl_\be_\ba_\bs_\be_\b-_\bc_\bu_\bt_\bo_\bf_\bf s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- d\bdy\byn\bna\bam\bmi\bic\bc-\b-b\bbo\boo\bot\btp\bp-\b-l\ble\bea\bas\bse\be-\b-c\bcu\but\bto\bof\bff\bf _\bd_\ba_\bt_\be;\b;
-
- The _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b-_\bb_\bo_\bo_\bt_\bp_\b-_\bl_\be_\ba_\bs_\be_\b-_\bc_\bu_\bt_\bo_\bf_\bf statement sets the ending
- time for all leases assigned dynamically to BOOTP clients.
- Because BOOTP clients do not have any way of renewing
- leases, and don't know that their leases could expire, by
- default dhcpd assignes infinite leases to all BOOTP
- clients. However, it may make sense in some situations to
- set a cutoff date for all BOOTP leases - for example, the
- end of a school term, or the time at night when a facility
- is closed and all machines are required to be powered off.
-
- _\bD_\ba_\bt_\be should be the date on which all assigned BOOTP leases
- will end. The date is specified in the form:
-
- W YYYY/MM/DD HH:MM:SS
-
- W is the day of the week expressed as a number from zero
- (Sunday) to six (Saturday). YYYY is the year, including
- the century. MM is the month expressed as a number from 1
- to 12. DD is the day of the month, counting from 1. HH
- is the hour, from zero to 23. MM is the minute and SS is
- the second. The time is always in Greenwich Mean Time
- (GMT), not local time.
-
- T\bTh\bhe\be _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b-_\bb_\bo_\bo_\bt_\bp_\b-_\bl_\be_\ba_\bs_\be_\b-_\bl_\be_\bn_\bg_\bt_\bh s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- d\bdy\byn\bna\bam\bmi\bic\bc-\b-b\bbo\boo\bot\btp\bp-\b-l\ble\bea\bas\bse\be-\b-l\ble\ben\bng\bgt\bth\bh _\bl_\be_\bn_\bg_\bt_\bh;\b;
-
- The _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b-_\bb_\bo_\bo_\bt_\bp_\b-_\bl_\be_\ba_\bs_\be_\b-_\bl_\be_\bn_\bg_\bt_\bh statement is used to set
- the length of leases dynamically assigned to BOOTP
- clients. At some sites, it may be possible to assume
- that a lease is no longer in use if its holder has not
- used BOOTP or DHCP to get its address within a certain
- time period. The period is specified in _\bl_\be_\bn_\bg_\bt_\bh as a num-
- ber of seconds. If a client reboots using BOOTP during
- the timeout period, the lease duration is reset to _\bl_\be_\bn_\bg_\bt_\bh,
- so a BOOTP client that boots frequently enough will never
- lose its lease. Needless to say, this parameter should be
- adjusted with extreme caution.
-
-
-
- 10
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- T\bTh\bhe\be _\bg_\be_\bt_\b-_\bl_\be_\ba_\bs_\be_\b-_\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be_\bs s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- g\bge\bet\bt-\b-l\ble\bea\bas\bse\be-\b-h\bho\bos\bst\btn\bna\bam\bme\bes\bs _\bf_\bl_\ba_\bg;\b;
-
- The _\bg_\be_\bt_\b-_\bl_\be_\ba_\bs_\be_\b-_\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be_\bs statement is used to tell dhcpd
- whether or not to look up the domain name corresponding to
- the IP address of each address in the lease pool and use
- that address for the DHCP _\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be option. If _\bf_\bl_\ba_\bg is
- true, then this lookup is done for all addresses in the
- current scope. By default, or if _\bf_\bl_\ba_\bg is false, no
- lookups are done.
-
- T\bTh\bhe\be _\bu_\bs_\be_\b-_\bh_\bo_\bs_\bt_\b-_\bd_\be_\bc_\bl_\b-_\bn_\ba_\bm_\be_\bs s\bst\bta\bat\bte\bem\bme\ben\bnt\bt
-
- u\bus\bse\be-\b-h\bho\bos\bst\bt-\b-d\bde\bec\bcl\bl-\b-n\bna\bam\bme\bes\bs _\bf_\bl_\ba_\bg;\b;
-
- If the _\bu_\bs_\be_\b-_\bh_\bo_\bs_\bt_\b-_\bd_\be_\bc_\bl_\b-_\bn_\ba_\bm_\be_\bs parameter is true in a given
- scope, then for every host declaration within that scope,
- the name provided for the host declaration will be sup-
- plied to the client as its hostname. So, for example,
-
- group {
- use-host-decl-names on;
-
- host joe {
- hardware ethernet 08:00:2b:4c:29:32;
- fixed-address joe.fugue.com;
- }
- }
-
- is equivalent to
-
- host joe {
- hardware ethernet 08:00:2b:4c:29:32;
- fixed-address joe.fugue.com;
- option host-name "joe";
- }
-
- An _\bo_\bp_\bt_\bi_\bo_\bn _\bh_\bo_\bs_\bt_\b-_\bn_\ba_\bm_\be statement within a host declaration
- will override the use of the name in the host declaration.
-
-R\bRE\bEF\bFE\bER\bRE\bEN\bNC\bCE\bE:\b: O\bOP\bPT\bTI\bIO\bON\bN S\bST\bTA\bAT\bTE\bEM\bME\bEN\bNT\bTS\bS
- DHCP _\bo_\bp_\bt_\bi_\bo_\bn statements always start with the _\bo_\bp_\bt_\bi_\bo_\bn key-
- word, followed by an option name, followed by option data.
- The option names and data formats are described below.
- It is not necessary to exhaustively specify all DHCP
- options - only those options which are needed by clients
- must be specified.
-
- Option data comes in a variety of formats, as defined
- below:
-
- The i\bip\bp-\b-a\bad\bdd\bdr\bre\bes\bss\bs data type can be entered either as an
- explicit IP address (e.g., 239.254.197.10) or as a domain
-
-
-
- 11
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- name (e.g., haagen.isc.org). When entering a domain name,
- be sure that that domain name resolves to a single IP
- address.
-
- The i\bin\bnt\bt3\b32\b2 data type specifies a signed 32-bit integer.
- The u\bui\bin\bnt\bt3\b32\b2 data type specifies an unsigned 32-bit integer.
- The i\bin\bnt\bt1\b16\b6 and u\bui\bin\bnt\bt1\b16\b6 data types specify signed and
- unsigned 16-bit integers. The i\bin\bnt\bt8\b8 and u\bui\bin\bnt\bt8\b8 data types
- specify signed and unsigned 8-bit integers. Unsigned
- 8-bit integers are also sometimes referred to as octets.
-
- The s\bst\btr\bri\bin\bng\bg data type specifies an NVT ASCII string, which
- must be enclosed in double quotes - for example, to spec-
- ify a domain-name option, the syntax would be
-
- option domain-name "isc.org";
-
- The f\bfl\bla\bag\bg data type specifies a boolean value. Booleans
- can be either true or false (or on or off, if that makes
- more sense to you).
-
- The d\bda\bat\bta\ba-\b-s\bst\btr\bri\bin\bng\bg data type specifies either an NVT ASCII
- string enclosed in double quotes, or a series of octets
- specified in hexadecimal, seperated by colons. For exam-
- ple:
-
- option client-identifier "CLIENT-FOO";
- or
- option client-identifier 43:4c:49:45:54:2d:46:4f:4f;
-
- The documentation for the various options mentioned below
- is taken from the latest IETF draft document on DHCP
- options. Options which are not listed by name may be
- defined by the name option-_\bn_\bn_\bn, where _\bn_\bn_\bn _\bi_\bs _\bt_\bh_\be _\bd_\be_\bc_\bi_\bm_\ba_\bl
- _\bn_\bu_\bm_\bb_\be_\br _\bo_\bf _\bt_\bh_\be _\bo_\bp_\bt_\bi_\bo_\bn _\bc_\bo_\bd_\be_\b. _\bT_\bh_\be_\bs_\be _\bo_\bp_\bt_\bi_\bo_\bn_\bs _\bm_\ba_\by _\bb_\be _\bf_\bo_\bl_\bl_\bo_\bw_\be_\bd
- _\be_\bi_\bt_\bh_\be_\br _\bb_\by _\ba _\bs_\bt_\br_\bi_\bn_\bg_\b, _\be_\bn_\bc_\bl_\bo_\bs_\be_\bd _\bi_\bn _\bq_\bu_\bo_\bt_\be_\bs_\b, _\bo_\br _\bb_\by _\ba _\bs_\be_\br_\bi_\be_\bs _\bo_\bf
- _\bo_\bc_\bt_\be_\bt_\bs_\b, _\be_\bx_\bp_\br_\be_\bs_\bs_\be_\bd _\ba_\bs _\bt_\bw_\bo_\b-_\bd_\bi_\bg_\bi_\bt _\bh_\be_\bx_\ba_\bd_\be_\bc_\bi_\bm_\ba_\bl _\bn_\bu_\bm_\bb_\be_\br_\bs _\bs_\be_\bp_\be_\br_\b-
- _\ba_\bt_\be_\bd _\bb_\by _\bc_\bo_\bl_\bo_\bn_\bs_\b. _\bF_\bo_\br _\be_\bx_\ba_\bm_\bp_\bl_\be_\b:
-
- option option-133 "my-option-133-text";
- option option-129 1:54:c9:2b:47;
-
- Because dhcpd does not know the format of these undefined
- option codes, no checking is done to ensure the correct-
- ness of the entered data.
-
- The standard options are:
-
- o\bop\bpt\bti\bio\bon\bn s\bsu\bub\bbn\bne\bet\bt-\b-m\bma\bas\bsk\bk _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
-
- The subnet mask option specifies the client's subnet mask
- as per RFC 950. If no subnet mask option is provided any-
- where in scope, as a last resort dhcpd will use the subnet
- mask from the subnet declaration for the network on which
-
-
-
- 12
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- an address is being assigned. However, _\ba_\bn_\by subnet-mask
- option declaration that is in scope for the address being
- assigned will override the subnet mask specified in the
- subnet declaration.
-
- o\bop\bpt\bti\bio\bon\bn t\bti\bim\bme\be-\b-o\bof\bff\bfs\bse\bet\bt _\bi_\bn_\bt_\b3_\b2;\b;
-
- The time-offset option specifies the offset of the
- client's subnet in seconds from Coordinated Universal Time
- (UTC).
-
- o\bop\bpt\bti\bio\bon\bn r\bro\bou\but\bte\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- The routers option specifies a list of IP addresses for
- routers on the client's subnet. Routers should be listed
- in order of preference.
-
- o\bop\bpt\bti\bio\bon\bn t\bti\bim\bme\be-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs _\b[_\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- The time-server option specifies a list of RFC 868 time
- servers available to the client. Servers should be listed
- in order of preference.
-
- o\bop\bpt\bti\bio\bon\bn n\bna\bam\bme\be-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];
-
- The name-servers option specifies a list of IEN 116 name
- servers available to the client. Servers should be listed
- in order of preference.
-
- o\bop\bpt\bti\bio\bon\bn d\bdo\bom\bma\bai\bin\bn-\b-n\bna\bam\bme\be-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ...
- ];\b;
-
- The domain-name-servers option specifies a list of Domain
- Name System (STD 13, RFC 1035) name servers available to
- the client. Servers should be listed in order of prefer-
- ence.
-
- o\bop\bpt\bti\bio\bon\bn l\blo\bog\bg-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- The log-server option specifies a list of MIT-LCS UDP log
- servers available to the client. Servers should be listed
- in order of preference.
-
- o\bop\bpt\bti\bio\bon\bn c\bco\boo\bok\bki\bie\be-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- The cookie server option specifies a list of RFC 865
- cookie servers available to the client. Servers should be
- listed in order of preference.
-
- o\bop\bpt\bti\bio\bon\bn l\blp\bpr\br-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- The LPR server option specifies a list of RFC 1179 line
- printer servers available to the client. Servers should
- be listed in order of preference.
-
-
-
- 13
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- o\bop\bpt\bti\bio\bon\bn i\bim\bmp\bpr\bre\bes\bss\bs-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- The impress-server option specifies a list of Imagen
- Impress servers available to the client. Servers should
- be listed in order of preference.
-
- o\bop\bpt\bti\bio\bon\bn r\bre\bes\bso\bou\bur\brc\bce\be-\b-l\blo\boc\bca\bat\bti\bio\bon\bn-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs
- ... ];\b;
-
- This option specifies a list of RFC 887 Resource Location
- servers available to the client. Servers should be listed
- in order of preference.
-
- o\bop\bpt\bti\bio\bon\bn h\bho\bos\bst\bt-\b-n\bna\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
- This option specifies the name of the client. The name
- may or may not be qualified with the local domain name (it
- is preferable to use the domain-name option to specify the
- domain name). See RFC 1035 for character set restric-
- tions.
-
- o\bop\bpt\bti\bio\bon\bn b\bbo\boo\bot\bt-\b-s\bsi\biz\bze\be _\bu_\bi_\bn_\bt_\b1_\b6;\b;
-
- This option specifies the length in 512-octet blocks of
- the default boot image for the client.
-
- o\bop\bpt\bti\bio\bon\bn m\bme\ber\bri\bit\bt-\b-d\bdu\bum\bmp\bp _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
- This option specifies the path-name of a file to which the
- client's core image should be dumped in the event the
- client crashes. The path is formatted as a character
- string consisting of characters from the NVT ASCII charac-
- ter set.
-
- o\bop\bpt\bti\bio\bon\bn d\bdo\bom\bma\bai\bin\bn-\b-n\bna\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
- This option specifies the domain name that client should
- use when resolving hostnames via the Domain Name System.
-
- o\bop\bpt\bti\bio\bon\bn s\bsw\bwa\bap\bp-\b-s\bse\ber\brv\bve\ber\br _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
-
- This specifies the IP address of the client's swap server.
-
- o\bop\bpt\bti\bio\bon\bn r\bro\boo\bot\bt-\b-p\bpa\bat\bth\bh _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
- This option specifies the path-name that contains the
- client's root disk. The path is formatted as a character
- string consisting of characters from the NVT ASCII charac-
- ter set.
-
- o\bop\bpt\bti\bio\bon\bn i\bip\bp-\b-f\bfo\bor\brw\bwa\bar\brd\bdi\bin\bng\bg _\bf_\bl_\ba_\bg;\b;
-
- This option specifies whether the client should configure
- its IP layer for packet forwarding. A value of 0 means
-
-
-
- 14
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- disable IP forwarding, and a value of 1 means enable IP
- forwarding.
-
- o\bop\bpt\bti\bio\bon\bn n\bno\bon\bn-\b-l\blo\boc\bca\bal\bl-\b-s\bso\bou\bur\brc\bce\be-\b-r\bro\bou\but\bti\bin\bng\bg _\bf_\bl_\ba_\bg;\b;
-
- This option specifies whether the client should configure
- its IP layer to allow forwarding of datagrams with non-
- local source routes (see Section 3.3.5 of [4] for a dis-
- cussion of this topic). A value of 0 means disallow for-
- warding of such datagrams, and a value of 1 means allow
- forwarding.
-
- o\bop\bpt\bti\bio\bon\bn p\bpo\bol\bli\bic\bcy\by-\b-f\bfi\bil\blt\bte\ber\br _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs
- _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- This option specifies policy filters for non-local source
- routing. The filters consist of a list of IP addresses
- and masks which specify destination/mask pairs with which
- to filter incoming source routes.
-
- Any source routed datagram whose next-hop address does not
- match one of the filters should be discarded by the
- client.
-
- See STD 3 (RFC1122) for further information.
-
- o\bop\bpt\bti\bio\bon\bn m\bma\bax\bx-\b-d\bdg\bgr\bra\bam\bm-\b-r\bre\bea\bas\bss\bse\bem\bmb\bbl\bly\by _\bu_\bi_\bn_\bt_\b1_\b6;\b;
-
- This option specifies the maximum size datagram that the
- client should be prepared to reassemble. The minimum
- value legal value is 576.
-
- o\bop\bpt\bti\bio\bon\bn d\bde\bef\bfa\bau\bul\blt\bt-\b-i\bip\bp-\b-t\btt\btl\bl _\bu_\bi_\bn_\bt_\b8_\b;
-
- This option specifies the default time-to-live that the
- client should use on outgoing datagrams.
-
- o\bop\bpt\bti\bio\bon\bn p\bpa\bat\bth\bh-\b-m\bmt\btu\bu-\b-a\bag\bgi\bin\bng\bg-\b-t\bti\bim\bme\beo\bou\but\bt _\bu_\bi_\bn_\bt_\b3_\b2;\b;
-
- This option specifies the timeout (in seconds) to use when
- aging Path MTU values discovered by the mechanism defined
- in RFC 1191.
-
- o\bop\bpt\bti\bio\bon\bn p\bpa\bat\bth\bh-\b-m\bmt\btu\bu-\b-p\bpl\bla\bat\bte\bea\bau\bu-\b-t\bta\bab\bbl\ble\be _\bu_\bi_\bn_\bt_\b1_\b6 [,\b, _\bu_\bi_\bn_\bt_\b1_\b6 ... ];\b;
-
- This option specifies a table of MTU sizes to use when
- performing Path MTU Discovery as defined in RFC 1191. The
- table is formatted as a list of 16-bit unsigned integers,
- ordered from smallest to largest. The minimum MTU value
- cannot be smaller than 68.
-
- o\bop\bpt\bti\bio\bon\bn i\bin\bnt\bte\ber\brf\bfa\bac\bce\be-\b-m\bmt\btu\bu _\bu_\bi_\bn_\bt_\b1_\b6;\b;
-
- This option specifies the MTU to use on this interface.
-
-
-
- 15
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- The minimum legal value for the MTU is 68.
-
- o\bop\bpt\bti\bio\bon\bn a\bal\bll\bl-\b-s\bsu\bub\bbn\bne\bet\bts\bs-\b-l\blo\boc\bca\bal\bl _\bf_\bl_\ba_\bg;\b;
-
- This option specifies whether or not the client may assume
- that all subnets of the IP network to which the client is
- connected use the same MTU as the subnet of that network
- to which the client is directly connected. A value of 1
- indicates that all subnets share the same MTU. A value of
- 0 means that the client should assume that some subnets of
- the directly connected network may have smaller MTUs.
-
- o\bop\bpt\bti\bio\bon\bn b\bbr\bro\boa\bad\bdc\bca\bas\bst\bt-\b-a\bad\bdd\bdr\bre\bes\bss\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
-
- This option specifies the broadcast address in use on the
- client's subnet. Legal values for broadcast addresses are
- specified in section 3.2.1.3 of STD 3 (RFC1122).
-
- o\bop\bpt\bti\bio\bon\bn p\bpe\ber\brf\bfo\bor\brm\bm-\b-m\bma\bas\bsk\bk-\b-d\bdi\bis\bsc\bco\bov\bve\ber\bry\by _\bf_\bl_\ba_\bg;\b;
-
- This option specifies whether or not the client should
- perform subnet mask discovery using ICMP. A value of 0
- indicates that the client should not perform mask discov-
- ery. A value of 1 means that the client should perform
- mask discovery.
-
- o\bop\bpt\bti\bio\bon\bn m\bma\bas\bsk\bk-\b-s\bsu\bup\bpp\bpl\bli\bie\ber\br _\bf_\bl_\ba_\bg;\b;
-
- This option specifies whether or not the client should
- respond to subnet mask requests using ICMP. A value of 0
- indicates that the client should not respond. A value of
- 1 means that the client should respond.
-
- o\bop\bpt\bti\bio\bon\bn r\bro\bou\but\bte\ber\br-\b-d\bdi\bis\bsc\bco\bov\bve\ber\bry\by _\bf_\bl_\ba_\bg;\b;
-
- This option specifies whether or not the client should
- solicit routers using the Router Discovery mechanism
- defined in RFC 1256. A value of 0 indicates that the
- client should not perform router discovery. A value of 1
- means that the client should perform router discovery.
-
- o\bop\bpt\bti\bio\bon\bn r\bro\bou\but\bte\ber\br-\b-s\bso\bol\bli\bic\bci\bit\bta\bat\bti\bio\bon\bn-\b-a\bad\bdd\bdr\bre\bes\bss\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs;\b;
-
- This option specifies the address to which the client
- should transmit router solicitation requests.
-
- o\bop\bpt\bti\bio\bon\bn s\bst\bta\bat\bti\bic\bc-\b-r\bro\bou\but\bte\bes\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs
- _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- This option specifies a list of static routes that the
- client should install in its routing cache. If multiple
- routes to the same destination are specified, they are
- listed in descending order of priority.
-
-
-
-
- 16
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- The routes consist of a list of IP address pairs. The
- first address is the destination address, and the second
- address is the router for the destination.
-
- The default route (0.0.0.0) is an illegal destination for
- a static route. To specify the default route, use the
- r\bro\bou\but\bte\ber\brs\bs option.
-
- o\bop\bpt\bti\bio\bon\bn t\btr\bra\bai\bil\ble\ber\br-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bti\bio\bon\bn _\bf_\bl_\ba_\bg;\b;
-
- This option specifies whether or not the client should
- negotiate the use of trailers (RFC 893 [14]) when using
- the ARP protocol. A value of 0 indicates that the client
- should not attempt to use trailers. A value of 1 means
- that the client should attempt to use trailers.
-
- o\bop\bpt\bti\bio\bon\bn a\bar\brp\bp-\b-c\bca\bac\bch\bhe\be-\b-t\bti\bim\bme\beo\bou\but\bt _\bu_\bi_\bn_\bt_\b3_\b2;\b;
-
- This option specifies the timeout in seconds for ARP cache
- entries.
-
- o\bop\bpt\bti\bio\bon\bn i\bie\bee\bee\be8\b80\b02\b2-\b-3\b3-\b-e\ben\bnc\bca\bap\bps\bsu\bul\bla\bat\bti\bio\bon\bn _\bf_\bl_\ba_\bg;\b;
-
- This option specifies whether or not the client should use
- Ethernet Version 2 (RFC 894) or IEEE 802.3 (RFC 1042)
- encapsulation if the interface is an Ethernet. A value of
- 0 indicates that the client should use RFC 894 encapsula-
- tion. A value of 1 means that the client should use RFC
- 1042 encapsulation.
-
- o\bop\bpt\bti\bio\bon\bn d\bde\bef\bfa\bau\bul\blt\bt-\b-t\btc\bcp\bp-\b-t\btt\btl\bl _\bu_\bi_\bn_\bt_\b8;\b;
-
- This option specifies the default TTL that the client
- should use when sending TCP segments. The minimum value
- is 1.
-
- o\bop\bpt\bti\bio\bon\bn t\btc\bcp\bp-\b-k\bke\bee\bep\bpa\bal\bli\biv\bve\be-\b-i\bin\bnt\bte\ber\brv\bva\bal\bl _\bu_\bi_\bn_\bt_\b3_\b2;\b;
-
- This option specifies the interval (in seconds) that the
- client TCP should wait before sending a keepalive message
- on a TCP connection. The time is specified as a 32-bit
- unsigned integer. A value of zero indicates that the
- client should not generate keepalive messages on connec-
- tions unless specifically requested by an application.
-
- o\bop\bpt\bti\bio\bon\bn t\btc\bcp\bp-\b-k\bke\bee\bep\bpa\bal\bli\biv\bve\be-\b-g\bga\bar\brb\bba\bag\bge\be _\bf_\bl_\ba_\bg;\b;
-
- This option specifies the whether or not the client should
- send TCP keepalive messages with a octet of garbage for
- compatibility with older implementations. A value of 0
- indicates that a garbage octet should not be sent. A value
- of 1 indicates that a garbage octet should be sent.
-
- o\bop\bpt\bti\bio\bon\bn n\bni\bis\bs-\b-d\bdo\bom\bma\bai\bin\bn _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
-
-
- 17
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- This option specifies the name of the client's NIS (Sun
- Network Information Services) domain. The domain is for-
- matted as a character string consisting of characters from
- the NVT ASCII character set.
-
- o\bop\bpt\bti\bio\bon\bn n\bni\bis\bs-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- This option specifies a list of IP addresses indicating
- NIS servers available to the client. Servers should be
- listed in order of preference.
-
- o\bop\bpt\bti\bio\bon\bn n\bnt\btp\bp-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- This option specifies a list of IP addresses indicating
- NTP (RFC 1035) servers available to the client. Servers
- should be listed in order of preference.
-
- o\bop\bpt\bti\bio\bon\bn n\bne\bet\btb\bbi\bio\bos\bs-\b-n\bna\bam\bme\be-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ...
- ];\b;
-
- The NetBIOS name server (NBNS) option specifies a list of
- RFC 1001/1002 NBNS name servers listed in order of prefer-
- ence.
-
- o\bop\bpt\bti\bio\bon\bn n\bne\bet\btb\bbi\bio\bos\bs-\b-d\bdd\bd-\b-s\bse\ber\brv\bve\ber\br _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- The NetBIOS datagram distribution server (NBDD) option
- specifies a list of RFC 1001/1002 NBDD servers listed in
- order of preference.
-
- o\bop\bpt\bti\bio\bon\bn n\bne\bet\btb\bbi\bio\bos\bs-\b-n\bno\bod\bde\be-\b-t\bty\byp\bpe\be _\bu_\bi_\bn_\bt_\b8;\b;
-
- The NetBIOS node type option allows NetBIOS over TCP/IP
- clients which are configurable to be configured as
- described in RFC 1001/1002. The value is specified as a
- single octet which identifies the client type. A value of
- 1 corresponds to a NetBIOS B-node; a value of 2 corre-
- sponds to a P-node; a value of 4 corresponds to an M-node;
- a value of 8 corresponds to an H-node.
-
- o\bop\bpt\bti\bio\bon\bn n\bne\bet\btb\bbi\bio\bos\bs-\b-s\bsc\bco\bop\bpe\be _\bs_\bt_\br_\bi_\bn_\bg;\b;
-
- The NetBIOS scope option specifies the NetBIOS over TCP/IP
- scope parameter for the client as specified in RFC
- 1001/1002. See RFC1001, RFC1002, and RFC1035 for charac-
- ter-set restrictions.
-
- o\bop\bpt\bti\bio\bon\bn f\bfo\bon\bnt\bt-\b-s\bse\ber\brv\bve\ber\brs\bs _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
- This option specifies a list of X Window System Font
- servers available to the client. Servers should be listed
- in order of preference.
-
- o\bop\bpt\bti\bio\bon\bn x\bx-\b-d\bdi\bis\bsp\bpl\bla\bay\by-\b-m\bma\ban\bna\bag\bge\ber\br _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs [,\b, _\bi_\bp_\b-_\ba_\bd_\bd_\br_\be_\bs_\bs ... ];\b;
-
-
-
- 18
-
-
-
-
-
-dhcpd.conf(5) dhcpd.conf(5)
-
-
- This option specifies a list of systems that are running
- the X Window System Display Manager and are available to
- the client. Addresses should be listed in order of pref-
- erence.
-
- o\bop\bpt\bti\bio\bon\bn d\bdh\bhc\bcp\bp-\b-c\bcl\bli\bie\ben\bnt\bt-\b-i\bid\bde\ben\bnt\bti\bif\bfi\bie\ber\br _\bd_\ba_\bt_\ba_\b-_\bs_\bt_\br_\bi_\bn_\bg;\b;
-
- This option can be used to specify the a DHCP client iden-
- tifier in a host declaration, so that dhcpd can find the
- host record by matching against the client identifier.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
- dhcpd.conf(5), dhcpd.leases(5), draft-ietf-dhc-
- options-1533update-04.txt, draft-ietf-dhc-dhcp-07.txt.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
- d\bdh\bhc\bcp\bpd\bd(\b(8\b8)\b) was written by Ted Lemon <mellon@vix.com> under a
- contract with Vixie Labs. Funding for this project was
- provided by the Internet Software Corporation. Informa-
- tion about the Internet Software Consortium can be found
- at h\bht\btt\btp\bp:\b:/\b//\b/w\bww\bww\bw.\b.i\bis\bsc\bc.\b.o\bor\brg\bg/\b/i\bis\bsc\bc.\b.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 19
-
-