mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-08-30 05:47:45 +00:00
Mass commit for Brian Murrell.
This commit is contained in:
parent
b3677620b6
commit
d9eefc5dec
@ -22,7 +22,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char ocopyright[] =
|
||||
"$Id: dhclient.c,v 1.89 1999/11/13 23:49:41 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: dhclient.c,v 1.90 1999/11/20 18:36:03 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@ -1995,8 +1995,8 @@ void script_init (client, reason, medium)
|
||||
if (!mktemp (scriptName))
|
||||
log_fatal ("can't create temporary script %s: %m",
|
||||
scriptName);
|
||||
fd = creat (scriptName, 0600);
|
||||
} while (fd < 0 && errno == EEXISTS);
|
||||
fd = open (scriptName, O_EXCL | O_CREAT | O_WRONLY, 0600);
|
||||
} while (fd < 0 && errno == EEXIST);
|
||||
#endif
|
||||
if (fd < 0)
|
||||
log_fatal ("can't create temporary script %s: %m", scriptName);
|
||||
|
@ -171,7 +171,15 @@ LLEEAASSEE RREEQQUUIIRREEMMEENNTTSS AANNDD RREEQQUUEES
|
||||
any server responding to the client send the client its
|
||||
values for the specified options. Only the option names
|
||||
should be specified in the request statement - not option
|
||||
parameters.
|
||||
parameters. By default, the DHCP server requests the
|
||||
subnet-mask, broadcast-address, time-offset, routers,
|
||||
domain-name, domain-name-servers and host-name options.
|
||||
|
||||
In some cases, it may be desirable to send no parameter
|
||||
request list at all. To do this, simply write the
|
||||
request statement but specify no parameters:
|
||||
|
||||
request;
|
||||
|
||||
_T_h_e rreeqquuiirree _s_t_a_t_e_m_e_n_t
|
||||
|
||||
@ -183,14 +191,6 @@ LLEEAASSEE RREEQQUUIIRREEMMEENNTTSS AANNDD RREEQQUUEES
|
||||
|
||||
_T_h_e sseenndd _s_t_a_t_e_m_e_n_t
|
||||
|
||||
sseenndd {{ [[ _o_p_t_i_o_n _d_e_c_l_a_r_a_t_i_o_n ] [,, _._._. _o_p_t_i_o_n _d_e_c_l_a_r_a_t_i_o_n
|
||||
]}}
|
||||
|
||||
The send statement causes the client to send the specified
|
||||
options to the server with the specified values. These
|
||||
are full option declarations as described in ddhhccpp--
|
||||
ooppttiioonnss((55)). Options that are always sent in the DHCP
|
||||
|
||||
|
||||
|
||||
3
|
||||
@ -202,11 +202,18 @@ LLEEAASSEE RREEQQUUIIRREEMMEENNTTSS AANNDD RREEQQUUEES
|
||||
dhclient.conf(5) dhclient.conf(5)
|
||||
|
||||
|
||||
protocol should not be specified here, except that the
|
||||
client can specify a rreeqquueesstteedd--lleeaassee--ttiimmee option other
|
||||
than the default requested lease time, which is two hours.
|
||||
The other obvious use for this statement is to send infor
|
||||
mation to the server that will allow it to differentiate
|
||||
sseenndd {{ [[ _o_p_t_i_o_n _d_e_c_l_a_r_a_t_i_o_n ] [,, _._._. _o_p_t_i_o_n _d_e_c_l_a_r_a_t_i_o_n
|
||||
]}}
|
||||
|
||||
The send statement causes the client to send the specified
|
||||
options to the server with the specified values. These
|
||||
are full option declarations as described in ddhhccpp--
|
||||
ooppttiioonnss((55)). Options that are always sent in the DHCP pro
|
||||
tocol should not be specified here, except that the client
|
||||
can specify a rreeqquueesstteedd--lleeaassee--ttiimmee option other than the
|
||||
default requested lease time, which is two hours. The
|
||||
other obvious use for this statement is to send informa
|
||||
tion to the server that will allow it to differentiate
|
||||
between this client and other clients or kinds of clients.
|
||||
|
||||
OOPPTTIIOONN MMOODDIIFFIIEERRSS
|
||||
@ -250,13 +257,6 @@ OOPPTTIIOONN MMOODDIIFFIIEERRSS
|
||||
|
||||
_T_h_e aappppeenndd _s_t_a_t_e_m_e_n_t
|
||||
|
||||
aappppeenndd [[ _o_p_t_i_o_n _d_e_c_l_a_r_a_t_i_o_n ] ;;
|
||||
|
||||
If for some set of options the client should first use the
|
||||
values supplied by the server, if any, and then use values
|
||||
you supply, these values can be defined in the aappppeenndd
|
||||
statement. The aappppeenndd statement can only be used for
|
||||
|
||||
|
||||
|
||||
4
|
||||
@ -268,6 +268,12 @@ OOPPTTIIOONN MMOODDIIFFIIEERRSS
|
||||
dhclient.conf(5) dhclient.conf(5)
|
||||
|
||||
|
||||
aappppeenndd [[ _o_p_t_i_o_n _d_e_c_l_a_r_a_t_i_o_n ] ;;
|
||||
|
||||
If for some set of options the client should first use the
|
||||
values supplied by the server, if any, and then use values
|
||||
you supply, these values can be defined in the aappppeenndd
|
||||
statement. The aappppeenndd statement can only be used for
|
||||
options which allow more than one value to be given.
|
||||
This restriction is not enforced - if you ignore it, the
|
||||
behaviour will be unpredictable.
|
||||
@ -316,12 +322,6 @@ LLEEAASSEE DDEECCLLAARRAATTIIOONNSS
|
||||
the client receives a lease from a server, it always
|
||||
records the interface number on which it received that
|
||||
lease. If predefined leases are specified in the
|
||||
dhclient.conf file, the interface should also be speci
|
||||
fied, although this is not required.
|
||||
|
||||
ffiixxeedd--aaddddrreessss _i_p_-_a_d_d_r_e_s_s;;
|
||||
|
||||
The ffiixxeedd--aaddddrreessss statement is used to set the ip address
|
||||
|
||||
|
||||
|
||||
@ -334,6 +334,12 @@ LLEEAASSEE DDEECCLLAARRAATTIIOONNSS
|
||||
dhclient.conf(5) dhclient.conf(5)
|
||||
|
||||
|
||||
dhclient.conf file, the interface should also be speci
|
||||
fied, although this is not required.
|
||||
|
||||
ffiixxeedd--aaddddrreessss _i_p_-_a_d_d_r_e_s_s;;
|
||||
|
||||
The ffiixxeedd--aaddddrreessss statement is used to set the ip address
|
||||
of a particular lease. This is required for all lease
|
||||
statements. The IP address must be specified as a dotted
|
||||
quad (e.g., 12.34.56.78).
|
||||
@ -382,12 +388,6 @@ dhclient.conf(5) dhclient.conf(5)
|
||||
passed on the ifconfig command line when configuring te
|
||||
interface.
|
||||
|
||||
The dhcp client automatically declares this parameter if
|
||||
it used a media type (see the mmeeddiiaa statement) when con
|
||||
figuring the interface in order to obtain a lease. This
|
||||
statement should be used in predefined leases only if the
|
||||
network interface requires media type configuration.
|
||||
|
||||
|
||||
|
||||
|
||||
@ -400,6 +400,12 @@ dhclient.conf(5) dhclient.conf(5)
|
||||
dhclient.conf(5) dhclient.conf(5)
|
||||
|
||||
|
||||
The dhcp client automatically declares this parameter if
|
||||
it used a media type (see the mmeeddiiaa statement) when con
|
||||
figuring the interface in order to obtain a lease. This
|
||||
statement should be used in predefined leases only if the
|
||||
network interface requires media type configuration.
|
||||
|
||||
rreenneeww _d_a_t_e;;
|
||||
|
||||
rreebbiinndd _d_a_t_e;;
|
||||
@ -449,12 +455,6 @@ AALLIIAASS DDEECCLLAARRAATTIIOONNSS
|
||||
the dhcp client can be set up to configure an IP alias
|
||||
using the aalliiaass declaration.
|
||||
|
||||
The alias declaration resembles a lease declaration,
|
||||
except that options other than the subnet-mask option are
|
||||
ignored by the standard client configuration script, and
|
||||
expiry times are ignored. A typical alias declaration
|
||||
includes an interface declaration, a fixed-address
|
||||
|
||||
|
||||
|
||||
7
|
||||
@ -466,9 +466,14 @@ AALLIIAASS DDEECCLLAARRAATTIIOONNSS
|
||||
dhclient.conf(5) dhclient.conf(5)
|
||||
|
||||
|
||||
declaration for the IP alias address, and a subnet-mask
|
||||
option declaration. A medium statement should never be
|
||||
included in an alias declaration.
|
||||
The alias declaration resembles a lease declaration,
|
||||
except that options other than the subnet-mask option are
|
||||
ignored by the standard client configuration script, and
|
||||
expiry times are ignored. A typical alias declaration
|
||||
includes an interface declaration, a fixed-address decla
|
||||
ration for the IP alias address, and a subnet-mask option
|
||||
declaration. A medium statement should never be included
|
||||
in an alias declaration.
|
||||
|
||||
OOTTHHEERR DDEECCLLAARRAATTIIOONNSS
|
||||
rreejjeecctt _i_p_-_a_d_d_r_e_s_s;;
|
||||
@ -516,11 +521,6 @@ OOTTHHEERR DDEECCLLAARRAATTIIOONNSS
|
||||
script "/etc/dhclient-secondary";
|
||||
}
|
||||
|
||||
The client script for the pseudo-interface should not con
|
||||
figure the interface up or down - essentially, all it
|
||||
needs to handle are the states where a lease has been
|
||||
acquired or renewed, and the states where a lease has
|
||||
|
||||
|
||||
|
||||
8
|
||||
@ -532,6 +532,10 @@ OOTTHHEERR DDEECCLLAARRAATTIIOONNSS
|
||||
dhclient.conf(5) dhclient.conf(5)
|
||||
|
||||
|
||||
The client script for the pseudo-interface should not con
|
||||
figure the interface up or down - essentially, all it
|
||||
needs to handle are the states where a lease has been
|
||||
acquired or renewed, and the states where a lease has
|
||||
expired. See ddhhcclliieenntt--ssccrriipptt((88)) for more information.
|
||||
|
||||
mmeeddiiaa ""_m_e_d_i_a _s_e_t_u_p"" _[ ,, ""_m_e_d_i_a _s_e_t_u_p"",, _._._. _];;
|
||||
@ -582,10 +586,6 @@ SSAAMMPPLLEE
|
||||
request subnet-mask, broadcast-address, time-offset, routers,
|
||||
domain-name, domain-name-servers, host-name;
|
||||
require subnet-mask, domain-name-servers;
|
||||
script "/etc/dhclient-script";
|
||||
media "media 10baseT/UTP", "media 10base2/BNC";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@ -598,6 +598,10 @@ SSAAMMPPLLEE
|
||||
dhclient.conf(5) dhclient.conf(5)
|
||||
|
||||
|
||||
script "/etc/dhclient-script";
|
||||
media "media 10baseT/UTP", "media 10base2/BNC";
|
||||
}
|
||||
|
||||
alias {
|
||||
interface "ep0";
|
||||
fixed-address 192.5.5.213;
|
||||
@ -646,10 +650,6 @@ AAUUTTHHOORR
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -25,7 +25,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: nsupdate.c,v 1.13 1999/10/25 15:14:52 mellon Exp $ Copyright (c) 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: nsupdate.c,v 1.14 1999/11/20 18:36:09 mellon Exp $ Copyright (c) 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@ -332,7 +332,7 @@ int nsupdatePTR (revname, hostname, ttl, opcode)
|
||||
}
|
||||
break;
|
||||
}
|
||||
z = res_update(u);
|
||||
z = res_update (u);
|
||||
log_info ("%s %s: %s %ld IN PTR %s", opcode == ADD ? "add" :
|
||||
"delete", z == 1 ? "succeeded" : "failed",
|
||||
NAME (revname), (unsigned long)ttl, NAME (u -> r_data));
|
||||
@ -505,11 +505,11 @@ int updateA (lhs, rhs, ttl, lease)
|
||||
int y;
|
||||
|
||||
hostname[0] = '\0';
|
||||
strncat(hostname, (const char *)lhs -> data, lhs -> len);
|
||||
strncat (hostname, (const char *)lhs -> data, lhs -> len);
|
||||
hostname[lhs -> len] = '\0';
|
||||
|
||||
ipaddr[0] = '\0';
|
||||
strncat(ipaddr, (const char *)rhs -> data, rhs -> len);
|
||||
strncat (ipaddr, (const char *)rhs -> data, rhs -> len);
|
||||
ipaddr[rhs -> len] = '\0';
|
||||
|
||||
#if 0 /* Wrong! This causes zone churn on every DHCPREQUEST!
|
||||
@ -532,10 +532,6 @@ int updateA (lhs, rhs, ttl, lease)
|
||||
if (y < 1)
|
||||
return 0;
|
||||
|
||||
/* remember this in the lease structure for release */
|
||||
lease -> ddns_fwd_name = dmalloc (strlen(hostname) + 1, "nsupdate");
|
||||
strcpy (lease -> ddns_fwd_name, hostname);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -552,11 +548,11 @@ int updatePTR (lhs, rhs, ttl, lease)
|
||||
int y;
|
||||
|
||||
revname[0] = '\0';
|
||||
strncat(revname, (const char *)lhs -> data, lhs -> len);
|
||||
strncat (revname, (const char *)lhs -> data, lhs -> len);
|
||||
revname[lhs -> len] = '\0';
|
||||
|
||||
hostname[0] = '\0';
|
||||
strncat(hostname, (const char *)rhs -> data, rhs -> len);
|
||||
strncat (hostname, (const char *)rhs -> data, rhs -> len);
|
||||
hostname[rhs -> len] = '\0';
|
||||
|
||||
#if 0 /* Wrong! This causes zone churn on every DHCPREQUEST!
|
||||
@ -579,10 +575,6 @@ int updatePTR (lhs, rhs, ttl, lease)
|
||||
if (y < 1)
|
||||
return 0;
|
||||
|
||||
/* remember this in the lease structure for release */
|
||||
lease -> ddns_rev_name = dmalloc (strlen(revname) + 1, "nsupdate");
|
||||
strcpy (lease -> ddns_rev_name, revname);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -598,11 +590,11 @@ int deleteA (lhs, rhs, lease)
|
||||
int y;
|
||||
|
||||
hostname[0] = '\0';
|
||||
strncat(hostname, (const char *)lhs -> data, lhs -> len);
|
||||
strncat (hostname, (const char *)lhs -> data, lhs -> len);
|
||||
hostname[lhs -> len] = '\0';
|
||||
|
||||
ipaddr[0] = '\0';
|
||||
strncat(ipaddr, (const char *)rhs -> data, rhs -> len);
|
||||
strncat (ipaddr, (const char *)rhs -> data, rhs -> len);
|
||||
ipaddr[rhs -> len] = '\0';
|
||||
|
||||
#if 0 /* Wrong! This causes zone churn on every DHCPREQUEST!
|
||||
@ -642,11 +634,11 @@ int deletePTR (lhs, rhs, lease)
|
||||
int y;
|
||||
|
||||
revname[0] = '\0';
|
||||
strncat(revname, (const char *)lhs -> data, lhs -> len);
|
||||
strncat (revname, (const char *)lhs -> data, lhs -> len);
|
||||
revname[lhs -> len] = '\0';
|
||||
|
||||
hostname[0] = '\0';
|
||||
strncat(hostname, (const char *)rhs -> data, rhs -> len);
|
||||
strncat (hostname, (const char *)rhs -> data, rhs -> len);
|
||||
hostname[rhs -> len] = '\0';
|
||||
|
||||
#if 0 /* Wrong! This causes zone churn on every DHCPREQUEST!
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: parse.c,v 1.55 1999/11/13 23:53:57 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: parse.c,v 1.56 1999/11/20 18:36:09 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@ -1992,7 +1992,7 @@ int parse_non_binary (expr, cfile, lose, context)
|
||||
goto nocomma;
|
||||
|
||||
if (!(parse_data_expression
|
||||
(&(*expr) -> data.dns_update.expr1, cfile, lose)))
|
||||
(&(*expr) -> data.dns_update.rrname, cfile, lose)))
|
||||
goto nodata;
|
||||
|
||||
token = next_token (&val, cfile);
|
||||
@ -2000,7 +2000,7 @@ int parse_non_binary (expr, cfile, lose, context)
|
||||
goto nocomma;
|
||||
|
||||
if (!(parse_data_expression
|
||||
(&(*expr) -> data.dns_update.expr2, cfile, lose)))
|
||||
(&(*expr) -> data.dns_update.rrdata, cfile, lose)))
|
||||
goto nodata;
|
||||
|
||||
token = next_token (&val, cfile);
|
||||
@ -2052,7 +2052,7 @@ int parse_non_binary (expr, cfile, lose, context)
|
||||
goto nocomma;
|
||||
|
||||
if (!(parse_data_expression
|
||||
(&(*expr) -> data.dns_update.expr1, cfile, lose)))
|
||||
(&(*expr) -> data.dns_update.rrname, cfile, lose)))
|
||||
goto nodata;
|
||||
|
||||
token = next_token (&val, cfile);
|
||||
@ -2060,7 +2060,7 @@ int parse_non_binary (expr, cfile, lose, context)
|
||||
goto nocomma;
|
||||
|
||||
if (!(parse_data_expression
|
||||
(&(*expr) -> data.dns_update.expr2, cfile, lose)))
|
||||
(&(*expr) -> data.dns_update.rrdata, cfile, lose)))
|
||||
goto nodata;
|
||||
|
||||
token = next_token (&val, cfile);
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: print.c,v 1.28 1999/11/14 00:01:08 mellon Exp $ Copyright (c) 1995, 1996, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: print.c,v 1.29 1999/11/20 18:36:10 mellon Exp $ Copyright (c) 1995, 1996, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@ -663,11 +663,11 @@ static unsigned print_subexpression (expr, buf, len)
|
||||
buf + rv, len - rv - 4);
|
||||
buf [rv++] = ' ';
|
||||
rv += print_subexpression
|
||||
(expr -> data.dns_update.expr1,
|
||||
(expr -> data.dns_update.rrname,
|
||||
buf + rv, len - rv - 3);
|
||||
buf [rv++] = ' ';
|
||||
rv += print_subexpression
|
||||
(expr -> data.dns_update.expr2,
|
||||
(expr -> data.dns_update.rrdata,
|
||||
buf + rv, len - rv - 2);
|
||||
buf [rv++] = ' ';
|
||||
rv += print_subexpression
|
||||
|
221
common/tree.c
221
common/tree.c
@ -22,7 +22,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: tree.c,v 1.64 1999/11/03 16:10:41 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: tree.c,v 1.65 1999/11/20 18:36:10 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@ -388,9 +388,9 @@ int evaluate_boolean_expression (result, packet, lease, in_options,
|
||||
struct expression *expr;
|
||||
{
|
||||
struct data_string left, right;
|
||||
struct data_string rrtype, expr1, expr2;
|
||||
struct data_string rrtype, rrname, rrdata;
|
||||
unsigned long ttl;
|
||||
int s0, s1, s2, s3;
|
||||
int srrtype, srrname, srrdata, sttl;
|
||||
int bleft, bright;
|
||||
int sleft, sright;
|
||||
|
||||
@ -557,52 +557,94 @@ int evaluate_boolean_expression (result, packet, lease, in_options,
|
||||
if (!packet || packet -> packet_type != DHCPREQUEST)
|
||||
return 0;
|
||||
memset (&rrtype, 0, sizeof rrtype);
|
||||
s0 = evaluate_data_expression (&rrtype, packet, lease,
|
||||
srrtype = evaluate_data_expression (&rrtype, packet, lease,
|
||||
in_options, cfg_options,
|
||||
expr -> data.dns_update.type);
|
||||
memset (&expr1, 0, sizeof expr1);
|
||||
s1 = evaluate_data_expression (&expr1, packet, lease,
|
||||
memset (&rrname, 0, sizeof rrname);
|
||||
srrname = evaluate_data_expression (&rrname, packet, lease,
|
||||
in_options, cfg_options,
|
||||
expr -> data.dns_update.expr1);
|
||||
memset (&expr2, 0, sizeof expr2);
|
||||
s2 = evaluate_data_expression (&expr2, packet, lease,
|
||||
expr -> data.dns_update.rrname);
|
||||
memset (&rrdata, 0, sizeof rrdata);
|
||||
srrdata = evaluate_data_expression (&rrdata, packet, lease,
|
||||
in_options, cfg_options,
|
||||
expr -> data.dns_update.expr2);
|
||||
s3 = evaluate_numeric_expression (&ttl, packet, lease,
|
||||
expr -> data.dns_update.rrdata);
|
||||
sttl = evaluate_numeric_expression (&ttl, packet, lease,
|
||||
in_options, cfg_options,
|
||||
expr -> data.dns_update.ttl);
|
||||
|
||||
*result = 0; /* assume failure */
|
||||
if (s0 && s1 && s2 && s3) {
|
||||
if (rrtype.len == 1 &&
|
||||
strncmp((const char *)rrtype.data, "a", 1) == 0) {
|
||||
if (!sttl) {
|
||||
log_error("dns-update: RR type subexpression %s",
|
||||
"evaluates to NULL.");
|
||||
goto done_dns_update;
|
||||
}
|
||||
if (!srrname) {
|
||||
log_error("dns-update: RR name subexpression %s",
|
||||
"evaluates to NULL.");
|
||||
goto done_dns_update;
|
||||
}
|
||||
if (!srrdata) {
|
||||
log_error("dns-update: RR data subexpression %s",
|
||||
"evaluates to NULL.");
|
||||
goto done_dns_update;
|
||||
}
|
||||
if (!srrtype) {
|
||||
log_error("dns-update: RR ttl subexpression %s",
|
||||
"evaluates to NULL.");
|
||||
goto done_dns_update;
|
||||
}
|
||||
if (rrtype.len == 1 &&
|
||||
strncmp((const char *)rrtype.data, "a", 1) == 0) {
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
log_debug("calling updateA(%s, %s, %ld, lease)",
|
||||
expr1.data, expr2.data, ttl);
|
||||
log_debug("calling updateA(%s, %s, %ld, lease)",
|
||||
rrname.data, rrdata.data, ttl);
|
||||
#endif
|
||||
updateA(&expr1, &expr2, ttl, lease);
|
||||
} else if (rrtype.len == 3 &&
|
||||
strncmp((const char *)rrtype.data,
|
||||
"ptr", 3) == 0) {
|
||||
if (!updateA(&rrname, &rrdata, ttl, lease)) {
|
||||
log_error("dns-update: DNS add of A %s",
|
||||
"record failed");
|
||||
goto done_dns_update;
|
||||
}
|
||||
/* remember this in the lease structure for release */
|
||||
lease -> ddns_fwd_name = dmalloc (rrname.len,
|
||||
"evaluate_boolean_expression");
|
||||
strncpy (lease -> ddns_fwd_name, rrname.data,
|
||||
rrname.len);
|
||||
|
||||
} else if (rrtype.len == 3 &&
|
||||
strncmp((const char *)rrtype.data, "ptr", 3) == 0) {
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
log_debug ("%s updatePTR(%s, %s, %ld, lease)",
|
||||
"calling", expr1.data, expr2.data, ttl);
|
||||
"calling", rrname.data, rrdata.data, ttl);
|
||||
#endif
|
||||
updatePTR(&expr1, &expr2, ttl, lease);
|
||||
}
|
||||
*result = 1;
|
||||
} else {
|
||||
log_error("dns-update: one or more subexpressions %s",
|
||||
"evaluate to NULL.");
|
||||
return 0;
|
||||
if (!updatePTR(&rrname, &rrdata, ttl, lease)) {
|
||||
log_error("dns-update: DNS add of PTR %s",
|
||||
"record failed");
|
||||
goto done_dns_update;
|
||||
}
|
||||
/* remember this in the lease structure for release */
|
||||
lease -> ddns_rev_name = dmalloc (rrname.len,
|
||||
"evaluate_boolean_expression");
|
||||
strncpy (lease -> ddns_rev_name, rrname.data,
|
||||
rrname.len);
|
||||
}
|
||||
*result = 1;
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
log_debug ("dns-update (%s, %s, %s):",
|
||||
print_hex_1(rrtype.len, rrtype.data, 60),
|
||||
print_hex_2(expr1.len, expr1.data, 60),
|
||||
print_hex_3(expr2.len, expr2.data, 60));
|
||||
print_hex_2(rrname.len, rrname.data, 60),
|
||||
print_hex_3(rrdata.len, rrdata.data, 60));
|
||||
#endif
|
||||
return 1;
|
||||
done_dns_update:
|
||||
if (srrname)
|
||||
data_string_forget (&rrname,
|
||||
"evaluate_boolean_expression");
|
||||
if (srrdata)
|
||||
data_string_forget (&rrdata,
|
||||
"evaluate_boolean_expression");
|
||||
if (srrtype)
|
||||
data_string_forget (&rrtype,
|
||||
"evaluate_boolean_expression");
|
||||
return *result;
|
||||
#endif /* NSUPDATE */
|
||||
|
||||
case expr_dns_delete:
|
||||
@ -610,50 +652,85 @@ int evaluate_boolean_expression (result, packet, lease, in_options,
|
||||
return 0;
|
||||
#else
|
||||
memset (&rrtype, 0, sizeof rrtype);
|
||||
s0 = evaluate_data_expression (&rrtype, packet, lease,
|
||||
srrtype = evaluate_data_expression (&rrtype, packet, lease,
|
||||
in_options, cfg_options,
|
||||
expr -> data.dns_update.type);
|
||||
memset (&expr1, 0, sizeof expr1);
|
||||
s1 = evaluate_data_expression (&expr1, packet, lease,
|
||||
memset (&rrname, 0, sizeof rrname);
|
||||
srrname = evaluate_data_expression (&rrname, packet, lease,
|
||||
in_options, cfg_options,
|
||||
expr -> data.dns_update.expr1);
|
||||
memset (&expr2, 0, sizeof expr2);
|
||||
s2 = evaluate_data_expression (&expr2, packet, lease,
|
||||
expr -> data.dns_update.rrname);
|
||||
memset (&rrdata, 0, sizeof rrdata);
|
||||
srrdata = evaluate_data_expression (&rrdata, packet, lease,
|
||||
in_options, cfg_options,
|
||||
expr -> data.dns_update.expr2);
|
||||
expr -> data.dns_update.rrdata);
|
||||
|
||||
*result = 0; /* assume failure */
|
||||
if (s0 && s1 && s2) {
|
||||
if (rrtype.len == 1 &&
|
||||
strncmp((const char *)rrtype.data, "a", 1) == 0) {
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
log_debug("calling deleteA(%s, %s, lease)",
|
||||
expr1.data , expr2.data);
|
||||
#endif
|
||||
deleteA(&expr1, &expr2, lease);
|
||||
} else if (rrtype.len == 3 &&
|
||||
strncmp((const char *)rrtype.data,
|
||||
"ptr", 3) == 0) {
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
log_debug ("%s deletePTR(%s, %s, lease)",
|
||||
"calling", expr1.data,
|
||||
expr2.data);
|
||||
#endif
|
||||
deletePTR(&expr1, &expr2, lease);
|
||||
}
|
||||
*result = 1;
|
||||
} else {
|
||||
log_error("dns-update: one or more subexpressions %s",
|
||||
"evaluate to NULL.");
|
||||
return 0;
|
||||
if (!srrtype) {
|
||||
log_error("dns-delete: RR type subexpression %s",
|
||||
"evaluates to NULL.");
|
||||
goto done_dns_delete;
|
||||
}
|
||||
if (!srrname) {
|
||||
log_error("dns-delete: RR name subexpression %s",
|
||||
"evaluates to NULL.");
|
||||
goto done_dns_delete;
|
||||
}
|
||||
if (!srrdata) {
|
||||
log_error("dns-delete: RR data subexpression %s",
|
||||
"evaluates to NULL.");
|
||||
goto done_dns_delete;
|
||||
}
|
||||
if (rrtype.len == 1 &&
|
||||
strncmp((const char *)rrtype.data, "a", 1) == 0) {
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
log_debug("calling deleteA(%s, %s, lease)",
|
||||
rrname.data , rrdata.data);
|
||||
#endif
|
||||
if (!deleteA(&rrname, &rrdata, lease)) {
|
||||
log_error("dns-delete: DNS delete of A %s",
|
||||
"record failed");
|
||||
goto done_dns_delete;
|
||||
}
|
||||
if (lease -> ddns_fwd_name) {
|
||||
dfree (lease -> ddns_fwd_name,
|
||||
"evaluate_boolean_expression");
|
||||
lease -> ddns_fwd_name = (char *)0;
|
||||
}
|
||||
} else if (rrtype.len == 3 &&
|
||||
strncmp((const char *)rrtype.data, "ptr", 3) == 0) {
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
log_debug ("calling deletePTR(%s, %s, lease)",
|
||||
rrname.data, rrdata.data);
|
||||
#endif
|
||||
if (!deletePTR(&rrname, &rrdata, lease)) {
|
||||
log_error("dns-delete: DNS delete of PTR %s",
|
||||
"record failed");
|
||||
goto done_dns_delete;
|
||||
}
|
||||
if (lease -> ddns_rev_name) {
|
||||
dfree (lease -> ddns_rev_name,
|
||||
"evaluate_boolean_expression");
|
||||
lease -> ddns_rev_name = (char *)0;
|
||||
}
|
||||
}
|
||||
*result = 1;
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
log_debug ("dns-delete (%s, %s, %s):",
|
||||
print_hex_1(rrtype.len, rrtype.data, 60),
|
||||
print_hex_2(expr1.len, expr1.data, 60),
|
||||
print_hex_3(expr2.len, expr2.data, 60));
|
||||
print_hex_2(rrname.len, rrname.data, 60),
|
||||
print_hex_3(rrdata.len, rrdata.data, 60));
|
||||
#endif
|
||||
return 1;
|
||||
done_dns_delete:
|
||||
if (srrname)
|
||||
data_string_forget (&rrname,
|
||||
"evaluate_boolean_expression");
|
||||
if (srrdata)
|
||||
data_string_forget (&rrdata,
|
||||
"evaluate_boolean_expression");
|
||||
if (srrtype)
|
||||
data_string_forget (&rrtype,
|
||||
"evaluate_boolean_expression");
|
||||
return *result;
|
||||
#endif /* NSUPDATE */
|
||||
|
||||
case expr_none:
|
||||
@ -1784,11 +1861,11 @@ void expression_dereference (eptr, name)
|
||||
if (expr -> data.dns_update.type)
|
||||
expression_dereference (&expr -> data.dns_update.type,
|
||||
name);
|
||||
if (expr -> data.dns_update.expr1)
|
||||
expression_dereference (&expr -> data.dns_update.expr1,
|
||||
if (expr -> data.dns_update.rrname)
|
||||
expression_dereference (&expr -> data.dns_update.rrname,
|
||||
name);
|
||||
if (expr -> data.dns_update.expr2)
|
||||
expression_dereference (&expr -> data.dns_update.expr2,
|
||||
if (expr -> data.dns_update.rrdata)
|
||||
expression_dereference (&expr -> data.dns_update.rrdata,
|
||||
name);
|
||||
if (expr -> data.dns_update.ttl)
|
||||
expression_dereference (&expr -> data.dns_update.ttl,
|
||||
@ -2344,11 +2421,11 @@ int write_expression (file, expr, col, indent)
|
||||
col, scol);
|
||||
col = token_print_indent (file, col, scol, "", " ",
|
||||
",");
|
||||
col = write_expression (file, expr -> data.dns_update.expr1,
|
||||
col = write_expression (file, expr -> data.dns_update.rrname,
|
||||
col, scol);
|
||||
col = token_print_indent (file, col, scol, "", " ",
|
||||
",");
|
||||
col = write_expression (file, expr -> data.dns_update.expr2,
|
||||
col = write_expression (file, expr -> data.dns_update.rrdata,
|
||||
col, scol);
|
||||
col = token_print_indent (file, col, scol, "", " ",
|
||||
",");
|
||||
@ -2380,11 +2457,11 @@ int write_expression (file, expr, col, indent)
|
||||
col, scol);
|
||||
col = token_print_indent (file, col, scol, "", " ",
|
||||
",");
|
||||
col = write_expression (file, expr -> data.dns_update.expr1,
|
||||
col = write_expression (file, expr -> data.dns_update.rrname,
|
||||
col, scol);
|
||||
col = token_print_indent (file, col, scol, "", " ",
|
||||
",");
|
||||
col = write_expression (file, expr -> data.dns_update.expr2,
|
||||
col = write_expression (file, expr -> data.dns_update.rrdata,
|
||||
col, scol);
|
||||
col = token_print_indent (file, col, indent, "", "",
|
||||
")");
|
||||
|
@ -67,7 +67,7 @@ clean:
|
||||
-rm -f $(OBJ) test.o test
|
||||
|
||||
realclean: clean
|
||||
-rm -f libdhcp.a *~ $(CATMANPAGES) $(SEDMANPAGES)
|
||||
-rm -f libdhcpctl.a *~ $(CATMANPAGES) $(SEDMANPAGES)
|
||||
|
||||
distclean: realclean
|
||||
-rm -f Makefile
|
||||
|
@ -118,6 +118,8 @@ extern int h_errno;
|
||||
#define TIME time_t
|
||||
#define GET_TIME(x) time ((x))
|
||||
|
||||
#define HAVE_MKSTEMP
|
||||
|
||||
/* Solaris prior to 2.5 didn't have random(). Rather than being clever and
|
||||
using random() only on versions >2.5, always use rand() and srand(). */
|
||||
|
||||
|
@ -58,13 +58,14 @@
|
||||
#include "inet.h"
|
||||
#include "auth.h"
|
||||
#include "dhctoken.h"
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
# include "failover.h"
|
||||
#endif
|
||||
|
||||
#include <isc/result.h>
|
||||
#include <omapip/omapip.h>
|
||||
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
# include "failover.h"
|
||||
#endif
|
||||
|
||||
#if !defined (OPTION_HASH_SIZE)
|
||||
# define OPTION_HASH_SIZE 17
|
||||
#endif
|
||||
@ -102,6 +103,13 @@ struct parse {
|
||||
unsigned bufsiz;
|
||||
};
|
||||
|
||||
/* Client FQDN option, failover FQDN option, etc. */
|
||||
typedef struct {
|
||||
u_int8_t codes [2];
|
||||
unsigned length;
|
||||
u_int8_t *data;
|
||||
} ddns_fqdn_t;
|
||||
|
||||
/* Variable-length array of data. */
|
||||
|
||||
struct string_list {
|
||||
@ -1417,6 +1425,12 @@ extern struct hash_table universe_hash;
|
||||
void initialize_common_option_spaces PROTO ((void));
|
||||
|
||||
/* stables.c */
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
struct failover_option_info ft_options [0];
|
||||
u_int32_t fto_allowed [0];
|
||||
int ft_sizes [0];
|
||||
char *dhcp_failover_link_state_names [0];
|
||||
#endif
|
||||
extern struct universe agent_universe;
|
||||
extern struct option agent_options [256];
|
||||
extern struct universe server_universe;
|
||||
@ -1685,6 +1699,11 @@ extern omapi_object_type_t *dhcp_type_pool;
|
||||
extern omapi_object_type_t *dhcp_type_shared_network;
|
||||
extern omapi_object_type_t *dhcp_type_subnet;
|
||||
extern omapi_object_type_t *dhcp_type_class;
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
extern omapi_object_type_t *dhcp_type_failover_state;
|
||||
extern omapi_object_type_t *dhcp_type_failover_link;
|
||||
extern omapi_object_type_t *dhcp_type_failover_listener;
|
||||
#endif
|
||||
|
||||
void dhcp_db_objects_setup (void);
|
||||
|
||||
@ -1875,3 +1894,59 @@ int deleteA (const struct data_string *, const struct data_string *,
|
||||
struct lease *);
|
||||
int deletePTR (const struct data_string *, const struct data_string *,
|
||||
struct lease *);
|
||||
|
||||
/* failover.c */
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
void enter_failover_peer PROTO ((struct failover_peer *));
|
||||
struct failover_peer *find_failover_peer PROTO ((char *));
|
||||
isc_result_t dhcp_failover_link_initiate PROTO ((omapi_object_t *));
|
||||
isc_result_t dhcp_failover_link_signal PROTO ((omapi_object_t *,
|
||||
const char *, va_list));
|
||||
isc_result_t dhcp_failover_link_set_value PROTO ((omapi_object_t *,
|
||||
omapi_object_t *,
|
||||
omapi_data_string_t *,
|
||||
omapi_typed_data_t *));
|
||||
isc_result_t dhcp_failover_link_get_value PROTO ((omapi_object_t *,
|
||||
omapi_object_t *,
|
||||
omapi_data_string_t *,
|
||||
omapi_value_t **));
|
||||
isc_result_t dhcp_failover_link_destroy PROTO ((omapi_object_t *,
|
||||
const char *));
|
||||
isc_result_t dhcp_failover_link_stuff_values PROTO ((omapi_object_t *,
|
||||
omapi_object_t *,
|
||||
omapi_object_t *));
|
||||
isc_result_t dhcp_failover_listen PROTO ((omapi_object_t *));
|
||||
|
||||
isc_result_t dhcp_failover_listener_signal PROTO ((omapi_object_t *,
|
||||
const char *,
|
||||
va_list));
|
||||
isc_result_t dhcp_failover_listener_set_value PROTO ((omapi_object_t *,
|
||||
omapi_object_t *,
|
||||
omapi_data_string_t *,
|
||||
omapi_typed_data_t *));
|
||||
isc_result_t dhcp_failover_listener_get_value PROTO ((omapi_object_t *,
|
||||
omapi_object_t *,
|
||||
omapi_data_string_t *,
|
||||
omapi_value_t **));
|
||||
isc_result_t dhcp_failover_listener_destroy PROTO ((omapi_object_t *,
|
||||
const char *));
|
||||
isc_result_t dhcp_failover_listener_stuff PROTO ((omapi_object_t *,
|
||||
omapi_object_t *,
|
||||
omapi_object_t *));
|
||||
isc_result_t dhcp_failover_register PROTO ((omapi_object_t *));
|
||||
isc_result_t dhcp_failover_state_signal PROTO ((omapi_object_t *,
|
||||
const char *, va_list));
|
||||
isc_result_t dhcp_failover_state_set_value PROTO ((omapi_object_t *,
|
||||
omapi_object_t *,
|
||||
omapi_data_string_t *,
|
||||
omapi_typed_data_t *));
|
||||
isc_result_t dhcp_failover_state_get_value PROTO ((omapi_object_t *,
|
||||
omapi_object_t *,
|
||||
omapi_data_string_t *,
|
||||
omapi_value_t **));
|
||||
isc_result_t dhcp_failover_state_destroy PROTO ((omapi_object_t *,
|
||||
const char *));
|
||||
isc_result_t dhcp_failover_state_stuff PROTO ((omapi_object_t *,
|
||||
omapi_object_t *,
|
||||
omapi_object_t *));
|
||||
#endif /* FAILOVER_PROTOCOL */
|
||||
|
@ -20,15 +20,21 @@
|
||||
* http://www.isc.org for more information.
|
||||
*/
|
||||
|
||||
struct failover_option {
|
||||
struct failover_option_info {
|
||||
int code;
|
||||
char *name;
|
||||
enum { FT_UINT8, FT_IPADDR, FT_UINT32, FT_BYTES, FT_DDNS,
|
||||
FT_UINT16, FT_TEXT, FT_UNDEF, FT_DIGEST } data_type;
|
||||
enum { FT_UINT8, FT_IPADDR, FT_UINT32, FT_BYTES, FT_DDNS, FT_DDNS1,
|
||||
FT_UINT16, FT_TEXT, FT_UNDEF, FT_DIGEST } type;
|
||||
int num_present;
|
||||
int data_offset;
|
||||
int offset;
|
||||
u_int32_t bit;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
int count;
|
||||
u_int8_t *data;
|
||||
} failover_option_t;
|
||||
|
||||
#define FM_OFFSET(x) ((char *)(((struct failover_message *)0).x) - \
|
||||
(char *)(((struct failover_message *)0)))
|
||||
|
||||
@ -102,3 +108,44 @@ struct failover_option {
|
||||
#define FTM_STATE 10
|
||||
#define FTM_CONTACT 11
|
||||
#define FTM_DISCONNECT 12
|
||||
|
||||
#define DHCP_FAILOVER_MAX_MESSAGE_SIZE 2048
|
||||
|
||||
typedef struct {
|
||||
u_int8_t type;
|
||||
u_int32_t time;
|
||||
u_int32_t xid;
|
||||
int options_present;
|
||||
} failover_message_t;
|
||||
|
||||
typedef struct {
|
||||
OMAPI_OBJECT_PREAMBLE;
|
||||
char *peer_name;
|
||||
unsigned peer_port;
|
||||
int options_present;
|
||||
enum dhcp_flink_state {
|
||||
dhcp_flink_start,
|
||||
dhcp_flink_message_length_wait,
|
||||
dhcp_flink_message_wait,
|
||||
dhcp_flink_disconnected,
|
||||
dhcp_flink_state_max
|
||||
} state;
|
||||
failover_message_t *imsg;
|
||||
u_int16_t imsg_len;
|
||||
unsigned imsg_count;
|
||||
u_int8_t imsg_payoff; /* Pay*load* offset. :') */
|
||||
} dhcp_failover_link_t;
|
||||
|
||||
typedef struct {
|
||||
OMAPI_OBJECT_PREAMBLE;
|
||||
unsigned local_port;
|
||||
char *peer_name;
|
||||
} dhcp_failover_listener_t;
|
||||
|
||||
typedef struct _dhcp_failover_state {
|
||||
OMAPI_OBJECT_PREAMBLE;
|
||||
struct _dhcp_failover_state *next;
|
||||
char *remote_peer;
|
||||
int listen_port;
|
||||
} dhcp_failover_state_t;
|
||||
|
||||
|
@ -116,8 +116,8 @@ struct __omapi_object {
|
||||
#define OMAPI_PROTOCOL_PORT 7911
|
||||
|
||||
isc_result_t omapi_protocol_connect (omapi_object_t *,
|
||||
const char *, int, omapi_object_t *);
|
||||
isc_result_t omapi_protocol_listen (omapi_object_t *, int, int);
|
||||
const char *, unsigned, omapi_object_t *);
|
||||
isc_result_t omapi_protocol_listen (omapi_object_t *, unsigned, int);
|
||||
isc_result_t omapi_protocol_accept (omapi_object_t *);
|
||||
isc_result_t omapi_protocol_send_intro (omapi_object_t *, unsigned, unsigned);
|
||||
isc_result_t omapi_protocol_ready (omapi_object_t *);
|
||||
@ -157,7 +157,7 @@ isc_result_t omapi_protocol_send_status (omapi_object_t *, omapi_object_t *,
|
||||
isc_result_t omapi_protocol_send_update (omapi_object_t *, omapi_object_t *,
|
||||
unsigned, omapi_object_t *);
|
||||
|
||||
isc_result_t omapi_connect (omapi_object_t *, const char *, int);
|
||||
isc_result_t omapi_connect (omapi_object_t *, const char *, unsigned);
|
||||
isc_result_t omapi_disconnect (omapi_object_t *, int);
|
||||
int omapi_connection_readfd (omapi_object_t *);
|
||||
int omapi_connection_writefd (omapi_object_t *);
|
||||
@ -184,7 +184,7 @@ isc_result_t omapi_connection_put_handle (omapi_object_t *c,
|
||||
omapi_object_t *h);
|
||||
|
||||
|
||||
isc_result_t omapi_listen (omapi_object_t *, int, int);
|
||||
isc_result_t omapi_listen (omapi_object_t *, unsigned, int);
|
||||
isc_result_t omapi_listener_accept (omapi_object_t *);
|
||||
int omapi_listener_readfd (omapi_object_t *);
|
||||
isc_result_t omapi_accept (omapi_object_t *);
|
||||
@ -334,7 +334,7 @@ isc_result_t omapi_make_int_value (omapi_value_t **, omapi_data_string_t *,
|
||||
isc_result_t omapi_make_handle_value (omapi_value_t **, omapi_data_string_t *,
|
||||
omapi_object_t *, const char *);
|
||||
isc_result_t omapi_make_string_value (omapi_value_t **, omapi_data_string_t *,
|
||||
char *, const char *);
|
||||
const char *, const char *);
|
||||
isc_result_t omapi_get_int_value (unsigned long *, omapi_typed_data_t *);
|
||||
|
||||
isc_result_t omapi_object_handle (omapi_handle_t *, omapi_object_t *);
|
||||
|
@ -51,17 +51,17 @@
|
||||
/* Define this if you want debugging output for DHCP failover protocol
|
||||
messages. */
|
||||
|
||||
/* #define DEBUG_FAILOVER_MESSAGES */
|
||||
#define DEBUG_FAILOVER_MESSAGES
|
||||
|
||||
/* Define this if you want debugging output for DHCP failover protocol
|
||||
lease assignment timing. */
|
||||
|
||||
/* #define DEBUG_FAILOVER_TIMING */
|
||||
#define DEBUG_FAILOVER_TIMING
|
||||
|
||||
/* Define this if you want DHCP failover protocol support in the DHCP
|
||||
server. */
|
||||
|
||||
/* #define FAILOVER_PROTOCOL */
|
||||
#define FAILOVER_PROTOCOL
|
||||
|
||||
/* Define this if you want the dhcpd.pid file to go somewhere other than
|
||||
the default (which varies from system to system, but is usually either
|
||||
|
@ -145,8 +145,8 @@ struct expression {
|
||||
} pick_first_value;
|
||||
struct {
|
||||
struct expression *type;
|
||||
struct expression *expr1;
|
||||
struct expression *expr2;
|
||||
struct expression *rrname;
|
||||
struct expression *rrdata;
|
||||
struct expression *ttl;
|
||||
} dns_update;
|
||||
struct expression *updated_dns_rr;
|
||||
|
@ -70,7 +70,7 @@ clean:
|
||||
-rm -f $(OBJ) test.o test
|
||||
|
||||
realclean: clean
|
||||
-rm -f libdhcp.a *~ $(CATMANPAGES) $(SEDMANPAGES)
|
||||
-rm -f libomapi.a *~ $(CATMANPAGES) $(SEDMANPAGES)
|
||||
|
||||
distclean: realclean
|
||||
-rm -f Makefile
|
||||
|
@ -24,7 +24,7 @@
|
||||
|
||||
isc_result_t omapi_connect (omapi_object_t *c,
|
||||
const char *server_name,
|
||||
int port)
|
||||
unsigned port)
|
||||
{
|
||||
struct hostent *he;
|
||||
int hix;
|
||||
|
@ -23,7 +23,7 @@
|
||||
#include <omapip/omapip_p.h>
|
||||
|
||||
isc_result_t omapi_listen (omapi_object_t *h,
|
||||
int port,
|
||||
unsigned port,
|
||||
int max)
|
||||
{
|
||||
struct hostent *he;
|
||||
|
@ -24,7 +24,7 @@
|
||||
|
||||
isc_result_t omapi_protocol_connect (omapi_object_t *h,
|
||||
const char *server_name,
|
||||
int port,
|
||||
unsigned port,
|
||||
omapi_object_t *authinfo)
|
||||
{
|
||||
isc_result_t status;
|
||||
@ -257,10 +257,8 @@ isc_result_t omapi_protocol_signal_handler (omapi_object_t *h,
|
||||
case omapi_protocol_intro_wait:
|
||||
/* Get protocol version and header size in network
|
||||
byte order. */
|
||||
omapi_connection_get_uint32
|
||||
(c, (u_int32_t *)&p -> protocol_version);
|
||||
omapi_connection_get_uint32
|
||||
(c, (u_int32_t *)&p -> header_size);
|
||||
omapi_connection_get_uint32 (c, &p -> protocol_version);
|
||||
omapi_connection_get_uint32 (c, &p -> header_size);
|
||||
|
||||
/* We currently only support the current protocol version. */
|
||||
if (p -> protocol_version != OMAPI_PROTOCOL_VERSION) {
|
||||
@ -282,8 +280,8 @@ isc_result_t omapi_protocol_signal_handler (omapi_object_t *h,
|
||||
/* Register a need for the number of bytes in a
|
||||
header, and if we already have that many, process
|
||||
them immediately. */
|
||||
if ((omapi_connection_require
|
||||
(c, p -> header_size)) != ISC_R_SUCCESS)
|
||||
if ((omapi_connection_require (c, p -> header_size)) !=
|
||||
ISC_R_SUCCESS)
|
||||
break;
|
||||
/* If we already have the data, fall through. */
|
||||
|
||||
@ -296,20 +294,14 @@ isc_result_t omapi_protocol_signal_handler (omapi_object_t *h,
|
||||
}
|
||||
|
||||
/* Swap in the header... */
|
||||
omapi_connection_get_uint32
|
||||
(c, (u_int32_t *)&p -> message -> authid);
|
||||
omapi_connection_get_uint32 (c, &p -> message -> authid);
|
||||
|
||||
/* XXX bind the authenticator here! */
|
||||
omapi_connection_get_uint32
|
||||
(c, (u_int32_t *)&p -> message -> authlen);
|
||||
omapi_connection_get_uint32
|
||||
(c, (u_int32_t *)&p -> message -> op);
|
||||
omapi_connection_get_uint32
|
||||
(c, (u_int32_t *)&p -> message -> handle);
|
||||
omapi_connection_get_uint32
|
||||
(c, (u_int32_t *)&p -> message -> id);
|
||||
omapi_connection_get_uint32
|
||||
(c, (u_int32_t *)&p -> message -> rid);
|
||||
omapi_connection_get_uint32 (c, &p -> message -> authlen);
|
||||
omapi_connection_get_uint32 (c, &p -> message -> op);
|
||||
omapi_connection_get_uint32 (c, &p -> message -> handle);
|
||||
omapi_connection_get_uint32 (c, &p -> message -> id);
|
||||
omapi_connection_get_uint32 (c, &p -> message -> rid);
|
||||
|
||||
/* If there was any extra header data, skip over it. */
|
||||
if (p -> header_size > sizeof (omapi_protocol_header_t)) {
|
||||
@ -554,7 +546,7 @@ isc_result_t omapi_protocol_stuff_values (omapi_object_t *c,
|
||||
a listener object, not a protocol object. */
|
||||
|
||||
isc_result_t omapi_protocol_listen (omapi_object_t *h,
|
||||
int port,
|
||||
unsigned port,
|
||||
int max)
|
||||
{
|
||||
isc_result_t status;
|
||||
|
@ -639,7 +639,7 @@ isc_result_t omapi_make_handle_value (omapi_value_t **vp,
|
||||
|
||||
isc_result_t omapi_make_string_value (omapi_value_t **vp,
|
||||
omapi_data_string_t *name,
|
||||
char *value, const char *caller)
|
||||
const char *value, const char *caller)
|
||||
{
|
||||
isc_result_t status;
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: confpars.c,v 1.91 1999/11/14 00:17:47 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: confpars.c,v 1.92 1999/11/20 18:36:27 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@ -589,7 +589,7 @@ void parse_failover_peer (cfile, group, type)
|
||||
|
||||
if (type != SHARED_NET_DECL && type != ROOT_GROUP) {
|
||||
parse_warn (cfile,
|
||||
"failover peer statements not in shared-network%s"
|
||||
"failover peer statements not in shared-network%s",
|
||||
" declaration or at top level.");
|
||||
skip_to_semi (cfile);
|
||||
return;
|
||||
@ -1610,7 +1610,7 @@ void parse_group_declaration (cfile, group)
|
||||
int declaration = 0;
|
||||
struct group_object *t;
|
||||
isc_result_t status;
|
||||
char *name;
|
||||
char *name = NULL;
|
||||
int deletedp = 0;
|
||||
int dynamicp = 0;
|
||||
int staticp = 0;
|
||||
@ -2117,7 +2117,7 @@ void parse_address_range (cfile, group, type, pool)
|
||||
pool -> permit_list &&
|
||||
!pool -> permit_list -> next &&
|
||||
(pool -> permit_list -> type ==
|
||||
permit_dynamic_bootp_clients))) {
|
||||
permit_all_clients))) {
|
||||
break;
|
||||
}
|
||||
last = pool;
|
||||
@ -2135,7 +2135,7 @@ void parse_address_range (cfile, group, type, pool)
|
||||
log_fatal ("no memory for ad-hoc %s.",
|
||||
"permit");
|
||||
pool -> permit_list -> type =
|
||||
permit_dynamic_bootp_clients;
|
||||
permit_all_clients;
|
||||
}
|
||||
if (share -> pools)
|
||||
last -> next = pool;
|
||||
|
199
server/dhcp.c
199
server/dhcp.c
@ -22,7 +22,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: dhcp.c,v 1.128 1999/11/14 00:22:29 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: dhcp.c,v 1.129 1999/11/20 18:36:28 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@ -70,19 +70,33 @@ void dhcpdiscover (packet)
|
||||
struct packet *packet;
|
||||
{
|
||||
struct lease *lease;
|
||||
char msgbuf [1024];
|
||||
char msgbuf [1024]; /* XXX */
|
||||
TIME when;
|
||||
|
||||
sprintf (msgbuf, "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));
|
||||
char *s;
|
||||
|
||||
lease = find_lease (packet, packet -> shared_network, 0);
|
||||
|
||||
if (lease && lease -> client_hostname &&
|
||||
db_printable (lease -> client_hostname))
|
||||
s = lease -> client_hostname;
|
||||
else
|
||||
s = (char *)0;
|
||||
|
||||
/* Say what we're doing... */
|
||||
sprintf (msgbuf, "DHCPDISCOVER from %s %s%s%svia %s",
|
||||
(packet -> raw -> htype
|
||||
? print_hw_addr (packet -> raw -> htype,
|
||||
packet -> raw -> hlen,
|
||||
packet -> raw -> chaddr),
|
||||
: (lease
|
||||
? print_hex_1 (lease -> uid_len, lease -> uid,
|
||||
lease -> uid_len)
|
||||
: "<no identifier>")),
|
||||
s ? "(" : "", s ? s : "", s ? ") " : "",
|
||||
packet -> raw -> giaddr.s_addr
|
||||
? inet_ntoa (packet -> raw -> giaddr)
|
||||
: packet -> interface -> name);
|
||||
|
||||
/* Sourceless packets don't make sense here. */
|
||||
if (!packet -> shared_network) {
|
||||
log_info ("Packet from unknown subnet: %s",
|
||||
@ -123,7 +137,8 @@ void dhcprequest (packet)
|
||||
struct option_cache *oc;
|
||||
struct data_string data;
|
||||
int status;
|
||||
char msgbuf [1024];
|
||||
char msgbuf [1024]; /* XXX */
|
||||
char *s;
|
||||
|
||||
oc = lookup_option (&dhcp_universe, packet -> options,
|
||||
DHO_DHCP_REQUESTED_ADDRESS);
|
||||
@ -150,14 +165,27 @@ void dhcprequest (packet)
|
||||
else
|
||||
lease = (struct lease *)0;
|
||||
|
||||
sprintf (msgbuf, "DHCPREQUEST for %s from %s via %s",
|
||||
if (lease && lease -> client_hostname &&
|
||||
db_printable (lease -> client_hostname))
|
||||
s = lease -> client_hostname;
|
||||
else
|
||||
s = (char *)0;
|
||||
|
||||
/* Say what we're doing... */
|
||||
sprintf (msgbuf, "DHCPREQUEST for from %s %s%s%svia %s",
|
||||
piaddr (cip),
|
||||
print_hw_addr (packet -> raw -> htype,
|
||||
packet -> raw -> hlen,
|
||||
packet -> raw -> chaddr),
|
||||
(packet -> raw -> giaddr.s_addr
|
||||
(packet -> raw -> htype
|
||||
? print_hw_addr (packet -> raw -> htype,
|
||||
packet -> raw -> hlen,
|
||||
packet -> raw -> chaddr),
|
||||
: (lease
|
||||
? print_hex_1 (lease -> uid_len, lease -> uid,
|
||||
lease -> uid_len)
|
||||
: "<no identifier>")),
|
||||
s ? "(" : "", s ? s : "", s ? ") " : "",
|
||||
packet -> raw -> giaddr.s_addr
|
||||
? inet_ntoa (packet -> raw -> giaddr)
|
||||
: packet -> interface -> name));
|
||||
: packet -> interface -> name);
|
||||
|
||||
/* If a client on a given network REQUESTs a lease on an
|
||||
address on a different network, NAK it. If the Requested
|
||||
@ -297,15 +325,28 @@ void dhcprelease (packet)
|
||||
}
|
||||
|
||||
|
||||
log_info ("DHCPRELEASE of %s from %s via %s (%sfound)",
|
||||
inet_ntoa (packet -> raw -> ciaddr),
|
||||
print_hw_addr (packet -> raw -> htype,
|
||||
if (lease && lease -> client_hostname &&
|
||||
db_printable (lease -> client_hostname))
|
||||
s = lease -> client_hostname;
|
||||
else
|
||||
s = (char *)0;
|
||||
|
||||
/* Say what we're doing... */
|
||||
log_info ("DHCPRELEASE of %s from %s %s%s%svia %s (%sfound)",
|
||||
inet_ntoa (packet -> raw -> ciaddr),
|
||||
(packet -> raw -> htype
|
||||
? 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,
|
||||
lease ? "" : "not ");
|
||||
: (lease
|
||||
? print_hex_1 (lease -> uid_len, lease -> uid,
|
||||
lease -> uid_len)
|
||||
: "<no identifier>")),
|
||||
s ? "(" : "", s ? s : "", s ? ") " : "",
|
||||
packet -> raw -> giaddr.s_addr
|
||||
? inet_ntoa (packet -> raw -> giaddr)
|
||||
: packet -> interface -> name,
|
||||
lease ? "" : "not ");
|
||||
|
||||
/* If we found a lease, release it. */
|
||||
if (lease && lease -> ends > cur_time)
|
||||
@ -323,6 +364,7 @@ void dhcpdecline (packet)
|
||||
int ignorep;
|
||||
int i;
|
||||
const char *status;
|
||||
char *s;
|
||||
|
||||
/* DHCPDECLINE must specify address. */
|
||||
if (!(oc = lookup_option (&dhcp_universe, packet -> options,
|
||||
@ -372,15 +414,29 @@ void dhcpdecline (packet)
|
||||
} else
|
||||
status = " (ignored)";
|
||||
|
||||
if (!ignorep)
|
||||
log_info ("DHCPDECLINE on %s from %s via %s%s",
|
||||
if (!ignorep) {
|
||||
char *s;
|
||||
if (lease && lease -> client_hostname &&
|
||||
db_printable (lease -> client_hostname))
|
||||
s = lease -> client_hostname;
|
||||
else
|
||||
s = (char *)0;
|
||||
|
||||
log_info ("DHCPDECLINE of %s from %s %s%s%svia %s %s",
|
||||
piaddr (cip),
|
||||
print_hw_addr (packet -> raw -> htype,
|
||||
packet -> raw -> hlen,
|
||||
packet -> raw -> chaddr),
|
||||
(packet -> raw -> htype
|
||||
? print_hw_addr (packet -> raw -> htype,
|
||||
packet -> raw -> hlen,
|
||||
packet -> raw -> chaddr),
|
||||
: (lease
|
||||
? print_hex_1 (lease -> uid_len, lease -> uid,
|
||||
lease -> uid_len)
|
||||
: "<no identifier>")),
|
||||
s ? "(" : "", s ? s : "", s ? ") " : "",
|
||||
packet -> raw -> giaddr.s_addr
|
||||
? inet_ntoa (packet -> raw -> giaddr)
|
||||
: packet -> interface -> name, status);
|
||||
: packet -> interface -> name,
|
||||
status);
|
||||
|
||||
option_state_dereference (&options, "dhcpdecline");
|
||||
}
|
||||
@ -922,18 +978,25 @@ void ack_lease (packet, lease, offer, when, msg)
|
||||
(struct agent_options *)0;
|
||||
}
|
||||
|
||||
/* Get rid of any old expiry or release statements - by executing
|
||||
the statements below, we will be inserting new ones if there are
|
||||
any to insert. */
|
||||
if (lease -> on_expiry)
|
||||
executable_statement_dereference (&lease -> on_expiry,
|
||||
"ack_lease");
|
||||
if (lease -> on_commit)
|
||||
executable_statement_dereference (&lease -> on_commit,
|
||||
"ack_lease");
|
||||
if (lease -> on_release)
|
||||
executable_statement_dereference (&lease -> on_release,
|
||||
"ack_lease");
|
||||
/* If we are offering a lease that is still currently valid, preserve
|
||||
the events. We need to do this because if the client does not
|
||||
REQUEST our offer, it will expire in 2 minutes, overriding the
|
||||
expire time in the currently in force lease. We want the expire
|
||||
events to be executed at that point. */
|
||||
if (lease -> ends <= cur_time && offer != DHCPOFFER) {
|
||||
/* Get rid of any old expiry or release statements - by
|
||||
executing the statements below, we will be inserting new
|
||||
ones if there are any to insert. */
|
||||
if (lease -> on_expiry)
|
||||
executable_statement_dereference (&lease -> on_expiry,
|
||||
"ack_lease");
|
||||
if (lease -> on_commit)
|
||||
executable_statement_dereference (&lease -> on_commit,
|
||||
"ack_lease");
|
||||
if (lease -> on_release)
|
||||
executable_statement_dereference (&lease -> on_release,
|
||||
"ack_lease");
|
||||
}
|
||||
|
||||
/* Execute statements in scope starting with the subnet scope. */
|
||||
execute_statements_in_scope (packet, lease,
|
||||
@ -1352,20 +1415,6 @@ void ack_lease (packet, lease, offer, when, msg)
|
||||
}
|
||||
}
|
||||
|
||||
/* Do the DDNS update. It needs to be done here so that the lease
|
||||
structure values for the forward and reverse names are in place for
|
||||
supersede() -> write_lease() to be able to write into the
|
||||
dhcpd.leases file. We have to pass the "state" structure here as it
|
||||
is not yet hanging off the lease. */
|
||||
/* why not update for static leases too? */
|
||||
/* Because static leases aren't currently recorded? */
|
||||
/* XXX
|
||||
#if defined (NSUPDATE)
|
||||
if (!(lease -> flags & STATIC_LEASE) && offer == DHCPACK)
|
||||
nsupdate (lease, state, packet, ADD);
|
||||
#endif
|
||||
*/
|
||||
|
||||
/* If there are statements to execute when the lease is
|
||||
committed, execute them. */
|
||||
if (lease -> on_commit && (!offer || offer == DHCPACK)) {
|
||||
@ -1401,6 +1450,19 @@ void ack_lease (packet, lease, offer, when, msg)
|
||||
free_lease_state (state, "ack_lease");
|
||||
static_lease_dereference (lease, "ack_lease");
|
||||
return;
|
||||
} else {
|
||||
/* If this is a DHCPOFFER transaction, supersede_lease
|
||||
will not add the timer for the expire event to the
|
||||
queue. This is because DHCPOFFERS are not commited,
|
||||
and supersede_lease only adds commited leases to the
|
||||
timer queue. So if supersede_lease set this lease
|
||||
as the next one to expire for the pool we need to
|
||||
put it on the timer queue ourself. */
|
||||
/* XXX need to think about this. */
|
||||
if (offer == DHCPOFFER && lease -> pool &&
|
||||
lease -> pool -> next_expiry == lease)
|
||||
add_timeout (lease -> ends, pool_timer,
|
||||
lease -> pool);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1787,6 +1849,7 @@ void dhcp_reply (lease)
|
||||
struct option_tag *ot, *not;
|
||||
struct data_string d1;
|
||||
struct option_cache *oc;
|
||||
char *s;
|
||||
|
||||
if (!state)
|
||||
log_fatal ("dhcp_reply was supplied lease with no state!");
|
||||
@ -1857,21 +1920,25 @@ void dhcp_reply (lease)
|
||||
raw.hops = state -> hops;
|
||||
raw.op = BOOTREPLY;
|
||||
|
||||
if (lease -> client_hostname &&
|
||||
db_printable (lease -> client_hostname))
|
||||
s = lease -> client_hostname;
|
||||
else
|
||||
s = (char *)0;
|
||||
|
||||
/* Say what we're doing... */
|
||||
log_info ("%s on %s to %s via %s",
|
||||
log_info ("%s on %s to %s %s%s%svia %s",
|
||||
(state -> offer
|
||||
? (state -> offer == DHCPACK ? "DHCPACK" : "DHCPOFFER")
|
||||
: "BOOTREPLY"),
|
||||
piaddr (lease -> ip_addr),
|
||||
(lease -> client_hostname &&
|
||||
db_printable (lease -> client_hostname))
|
||||
? lease -> client_hostname
|
||||
: (lease -> hardware_addr.htype
|
||||
? print_hw_addr (lease -> hardware_addr.htype,
|
||||
lease -> hardware_addr.hlen,
|
||||
lease -> hardware_addr.haddr)
|
||||
: print_hex_1 (lease -> uid_len, lease -> uid,
|
||||
lease -> uid_len)),
|
||||
s ? "(" : "", s ? s : "", s ? ") " : "",
|
||||
(lease -> hardware_addr.htype
|
||||
? print_hw_addr (lease -> hardware_addr.htype,
|
||||
lease -> hardware_addr.hlen,
|
||||
lease -> hardware_addr.haddr)
|
||||
: print_hex_1 (lease -> uid_len, lease -> uid,
|
||||
lease -> uid_len)),
|
||||
state -> giaddr.s_addr
|
||||
? inet_ntoa (state -> giaddr)
|
||||
: state -> ip -> name);
|
||||
|
@ -539,7 +539,7 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
you might write the following subclass declaration for
|
||||
that client:
|
||||
|
||||
subclass "allocation-class-2" 08:00:2b:a1:11:31 {
|
||||
subclass "allocation-class-2" 1:08:00:2b:a1:11:31 {
|
||||
option root-path "samsara:/var/diskless/alphapc";
|
||||
filename "/tftpboot/netbsd.alphapc-diskless";
|
||||
}
|
||||
@ -828,16 +828,18 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
RREEFFEERREENNCCEE:: AALLLLOOWW AANNDD DDEENNYY
|
||||
The _a_l_l_o_w and _d_e_n_y statements can be used to control the
|
||||
behaviour of dhcpd to various sorts of requests. The
|
||||
allow and deny keywords actually have different meanings
|
||||
depending on the context. In a pool context, these key
|
||||
words can be used to set up access lists for address allo
|
||||
cation pools. In other contexts, the keywords simply
|
||||
response of the DHCP server to various sorts of requests.
|
||||
The allow and deny keywords actually have different mean
|
||||
ings depending on the context. In a pool context, these
|
||||
keywords can be used to set up access lists for address
|
||||
allocation pools. In other contexts, the keywords simply
|
||||
control general server behaviour with respect to clients
|
||||
based on scope.
|
||||
based on scope. In a non-pool context, the _i_g_n_o_r_e key
|
||||
word can be used in place of the _d_e_n_y keyword to prevent
|
||||
logging of denied requests.
|
||||
|
||||
|
||||
AALLLLOOWW AANNDD DDEENNYY IINN SSCCOOPPEE
|
||||
AALLLLOOWW DDEENNYY AANNDD IIGGNNOORREE IINN SSCCOOPPEE
|
||||
The following usages of allow and deny will work in any
|
||||
scope, although it is not recommended that they be used in
|
||||
pool declarations.
|
||||
@ -846,10 +848,8 @@ AALLLLOOWW AANNDD DDEENNYY IINN SSCCOOPPEE
|
||||
|
||||
aallllooww uunnkknnoowwnn--cclliieennttss;;
|
||||
ddeennyy uunnkknnoowwnn--cclliieennttss;;
|
||||
iiggnnoorree uunnkknnoowwnn--cclliieennttss;;
|
||||
|
||||
The uunnkknnoowwnn--cclliieennttss flag is used to tell dhcpd whether or
|
||||
not to dynamically assign addresses to unknown clients.
|
||||
Dynamic address assignment to unknown clients is aalllloowwed
|
||||
|
||||
|
||||
|
||||
@ -862,12 +862,16 @@ AALLLLOOWW AANNDD DDEENNYY IINN SSCCOOPPEE
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
The uunnkknnoowwnn--cclliieennttss flag is used to tell dhcpd whether or
|
||||
not to dynamically assign addresses to unknown clients.
|
||||
Dynamic address assignment to unknown clients is aalllloowwed
|
||||
by default.
|
||||
|
||||
TThhee _b_o_o_t_p kkeeyywwoorrdd
|
||||
|
||||
aallllooww bboooottpp;;
|
||||
ddeennyy bboooottpp;;
|
||||
iiggnnoorree bboooottpp;;
|
||||
|
||||
The bboooottpp flag is used to tell dhcpd whether or not to
|
||||
respond to bootp queries. Bootp queries are aalllloowwed by
|
||||
@ -877,13 +881,71 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
aallllooww bboooottiinngg;;
|
||||
ddeennyy bboooottiinngg;;
|
||||
iiggnnoorree bboooottiinngg;;
|
||||
|
||||
The bboooottiinngg 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 aalllloowwed, but if it is disabled for
|
||||
a particular client, then that client will not be able to
|
||||
get and address from the DHCP server.
|
||||
get and address from the DHCP server. TThhee _d_u_p_l_i_c_a_t_e_s kkeeyy
|
||||
wwoorrdd
|
||||
|
||||
aallllooww dduupplliiccaatteess;;
|
||||
ddeennyy dduupplliiccaatteess;;
|
||||
|
||||
Host declarations can match client messages based on the
|
||||
DHCP Client Identifer option or based on the client's net
|
||||
work hardware type and MAC address. If the MAC address
|
||||
is used, the host declaration will match any client with
|
||||
that MAC address - even clients with different client
|
||||
identifiers. This doesn't normally happen, but is possi
|
||||
ble when one computer has more than one operating system
|
||||
installed on it - for example, Microsoft Windows and
|
||||
NetBSD or Linux.
|
||||
|
||||
The dduupplliiccaatteess flag tells the DHCP server that if a
|
||||
request is received from a client that matches the MAC
|
||||
address of a host declaration, any other leases matching
|
||||
that MAC address should be discarded by the server, even
|
||||
if the UID is not the same. This is a violation of the
|
||||
DHCP protocol, but can prevent clients whose client iden
|
||||
tifiers change regularly from holding many leases at the
|
||||
same time. By default, duplicates are aalllloowwed. TThhee
|
||||
_d_e_c_l_i_n_e_s kkeeyywwoorrdd
|
||||
|
||||
aallllooww ddeecclliinneess;;
|
||||
ddeennyy ddeecclliinneess;;
|
||||
|
||||
|
||||
|
||||
14
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
iiggnnoorree ddeecclliinneess;;
|
||||
|
||||
The DHCPDECLINE message is used by DHCP clients to indi
|
||||
cate that the lease the server has offered is not valid.
|
||||
When the server receives a DHCPDECLINE for a particular
|
||||
address, it normally abandons that address, assuming that
|
||||
some unauthorized system is using it. Unfortunately, a
|
||||
malicious or buggy client can, using DHCPDECLINE messages,
|
||||
completely exhaust the DHCP server's allocation pool.
|
||||
The server will reclaim these leases, but while the client
|
||||
is running through the pool, it may cause serious thrash
|
||||
ing in the DNS, and it will also cause the DHCP server to
|
||||
forget old DHCP client address allocations.
|
||||
|
||||
The ddeecclliinneess flag tells the DHCP server whether or not to
|
||||
honor DHCPDECLINE messages. If it is set to ddeennyy or
|
||||
iiggnnoorree in a particular scope, the DHCP server will not
|
||||
respond to DHCPDECLINE messages.
|
||||
|
||||
AALLLLOOWW AANNDD DDEENNYY WWIITTHHIINN PPOOOOLL DDEECCLLAARRAATTIIOONNSS
|
||||
The uses of the allow and deny keyword shown in the previ
|
||||
@ -916,10 +978,14 @@ AALLLLOOWW AANNDD DDEENNYY WWIITTHHIINN PPOOOOLL DDEECC
|
||||
allocation process is done as described previously in the
|
||||
ADDRESS ALLOCATION section.
|
||||
|
||||
When declaring permit lists for address allocation pools,
|
||||
the following syntaxes are recognized following the allow
|
||||
or deny keyword:
|
||||
|
||||
|
||||
|
||||
14
|
||||
|
||||
15
|
||||
|
||||
|
||||
|
||||
@ -928,10 +994,6 @@ AALLLLOOWW AANNDD DDEENNYY WWIITTHHIINN PPOOOOLL DDEECC
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
When declaring permit lists for address allocation pools,
|
||||
the following syntaxes are recognized following the allow
|
||||
or deny keyword:
|
||||
|
||||
kknnoowwnn cclliieennttss;;
|
||||
|
||||
If specified, this statement either allows or prevents
|
||||
@ -981,73 +1043,11 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
next renew.
|
||||
|
||||
RREEFFEERREENNCCEE:: PPAARRAAMMEETTEERRSS
|
||||
TThhee _d_e_f_a_u_l_t_-_l_e_a_s_e_-_t_i_m_e ssttaatteemmeenntt
|
||||
TThhee _l_e_a_s_e_-_f_i_l_e_-_n_a_m_e ssttaatteemmeenntt
|
||||
|
||||
lleeaassee--ffiillee--nnaammee _n_a_m_e;;
|
||||
|
||||
|
||||
15
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
ddeeffaauulltt--lleeaassee--ttiimmee _t_i_m_e;;
|
||||
|
||||
_T_i_m_e 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.
|
||||
|
||||
TThhee _m_a_x_-_l_e_a_s_e_-_t_i_m_e ssttaatteemmeenntt
|
||||
|
||||
mmaaxx--lleeaassee--ttiimmee _t_i_m_e;;
|
||||
|
||||
_T_i_m_e should be the maximum length in seconds that will be
|
||||
assigned to a lease. The only exception to this is that
|
||||
Dynamic BOOTP lease lengths, which are not specified by
|
||||
the client, are not limited by this maximum.
|
||||
|
||||
TThhee _m_i_n_-_l_e_a_s_e_-_t_i_m_e ssttaatteemmeenntt
|
||||
|
||||
mmiinn--lleeaassee--ttiimmee _t_i_m_e;;
|
||||
|
||||
_T_i_m_e should be the minimum length in seconds that will be
|
||||
assigned to a lease.
|
||||
|
||||
TThhee _m_i_n_-_s_e_c_s ssttaatteemmeenntt
|
||||
|
||||
mmiinn--sseeccss _s_e_c_o_n_d_s;;
|
||||
|
||||
_S_e_c_o_n_d_s should be the minimum number of seconds since a
|
||||
client began trying to acquire a new lease before the DHCP
|
||||
server will respond to its request. The number of seconds
|
||||
is based on what the client reports, and the maximum value
|
||||
that the client can report is 255 seconds. Generally,
|
||||
setting this to one will result in the DHCP server not
|
||||
responding to the client's first request, but always
|
||||
responding to its second request.
|
||||
|
||||
This can be used to set up a secondary DHCP server which
|
||||
never offers an address to a client until the primary
|
||||
server has been given a chance to do so. If the primary
|
||||
server is down, the client will bind to the secondary
|
||||
server, but otherwise clients should always bind to the
|
||||
primary. Note that this does not, by itself, permit a
|
||||
primary server and a secondary server to share a pool of
|
||||
dynamically-allocatable addresses.
|
||||
|
||||
TThhee _h_a_r_d_w_a_r_e ssttaatteemmeenntt
|
||||
|
||||
hhaarrddwwaarree _h_a_r_d_w_a_r_e_-_t_y_p_e _h_a_r_d_w_a_r_e_-_a_d_d_r_e_s_s;;
|
||||
|
||||
In order for a BOOTP client to be recognized, its network
|
||||
hardware address must be declared using a _h_a_r_d_w_a_r_e clause
|
||||
in the _h_o_s_t statement. _h_a_r_d_w_a_r_e_-_t_y_p_e must be the name of
|
||||
a physical hardware interface type. Currently, only the
|
||||
eetthheerrnneett and ttookkeenn--rriinngg types are recognized, although
|
||||
support for a ffddddii hardware type (and others) would also
|
||||
_N_a_m_e should be the name of the DHCP server's lease file.
|
||||
|
||||
|
||||
|
||||
@ -1060,19 +1060,102 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
be desirable. The _h_a_r_d_w_a_r_e_-_a_d_d_r_e_s_s should be a set of
|
||||
hexadecimal octets (numbers from 0 through ff) seperated
|
||||
by colons. The _h_a_r_d_w_a_r_e statement may also be used for
|
||||
By default, this is /var/db/dhcpd.leases. This statement
|
||||
mmuusstt appear in the outer scope of the configuration file -
|
||||
if it appears in some other scope, it will have no effect.
|
||||
|
||||
TThhee _p_i_d_-_f_i_l_e_-_n_a_m_e ssttaatteemmeenntt
|
||||
|
||||
ppiidd--ffiillee--nnaammee _n_a_m_e;;
|
||||
|
||||
_N_a_m_e should be the name of the DHCP server's process ID
|
||||
file. This is the file in which the DHCP server's pro
|
||||
cess ID is stored when the server starts. By default,
|
||||
this is /var/run/dhcpd.pid. Like the lease-file-name
|
||||
statement, this statement must appear in the outer scope
|
||||
of the configuration file.
|
||||
|
||||
TThhee _d_e_f_a_u_l_t_-_l_e_a_s_e_-_t_i_m_e ssttaatteemmeenntt
|
||||
|
||||
ddeeffaauulltt--lleeaassee--ttiimmee _t_i_m_e;;
|
||||
|
||||
_T_i_m_e 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.
|
||||
|
||||
TThhee _m_a_x_-_l_e_a_s_e_-_t_i_m_e ssttaatteemmeenntt
|
||||
|
||||
mmaaxx--lleeaassee--ttiimmee _t_i_m_e;;
|
||||
|
||||
_T_i_m_e should be the maximum length in seconds that will be
|
||||
assigned to a lease. The only exception to this is that
|
||||
Dynamic BOOTP lease lengths, which are not specified by
|
||||
the client, are not limited by this maximum.
|
||||
|
||||
TThhee _m_i_n_-_l_e_a_s_e_-_t_i_m_e ssttaatteemmeenntt
|
||||
|
||||
mmiinn--lleeaassee--ttiimmee _t_i_m_e;;
|
||||
|
||||
_T_i_m_e should be the minimum length in seconds that will be
|
||||
assigned to a lease.
|
||||
|
||||
TThhee _m_i_n_-_s_e_c_s ssttaatteemmeenntt
|
||||
|
||||
mmiinn--sseeccss _s_e_c_o_n_d_s;;
|
||||
|
||||
_S_e_c_o_n_d_s should be the minimum number of seconds since a
|
||||
client began trying to acquire a new lease before the DHCP
|
||||
server will respond to its request. The number of seconds
|
||||
is based on what the client reports, and the maximum value
|
||||
that the client can report is 255 seconds. Generally,
|
||||
setting this to one will result in the DHCP server not
|
||||
responding to the client's first request, but always
|
||||
responding to its second request.
|
||||
|
||||
This can be used to set up a secondary DHCP server which
|
||||
never offers an address to a client until the primary
|
||||
|
||||
|
||||
|
||||
17
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
server has been given a chance to do so. If the primary
|
||||
server is down, the client will bind to the secondary
|
||||
server, but otherwise clients should always bind to the
|
||||
primary. Note that this does not, by itself, permit a
|
||||
primary server and a secondary server to share a pool of
|
||||
dynamically-allocatable addresses.
|
||||
|
||||
TThhee _h_a_r_d_w_a_r_e ssttaatteemmeenntt
|
||||
|
||||
hhaarrddwwaarree _h_a_r_d_w_a_r_e_-_t_y_p_e _h_a_r_d_w_a_r_e_-_a_d_d_r_e_s_s;;
|
||||
|
||||
In order for a BOOTP client to be recognized, its network
|
||||
hardware address must be declared using a _h_a_r_d_w_a_r_e clause
|
||||
in the _h_o_s_t statement. _h_a_r_d_w_a_r_e_-_t_y_p_e must be the name of
|
||||
a physical hardware interface type. Currently, only the
|
||||
eetthheerrnneett and ttookkeenn--rriinngg types are recognized, although
|
||||
support for a ffddddii hardware type (and others) would also
|
||||
be desirable. The _h_a_r_d_w_a_r_e_-_a_d_d_r_e_s_s should be a set of
|
||||
hexadecimal octets (numbers from 0 through ff) seperated
|
||||
by colons. The _h_a_r_d_w_a_r_e statement may also be used for
|
||||
DHCP clients.
|
||||
|
||||
TThhee _f_i_l_e_n_a_m_e ssttaatteemmeenntt
|
||||
|
||||
ffiilleennaammee ""_f_i_l_e_n_a_m_e"";;
|
||||
|
||||
The _f_i_l_e_n_a_m_e statement can be used to specify the name of
|
||||
the initial boot file which is to be loaded by a client.
|
||||
The _f_i_l_e_n_a_m_e statement can be used to specify the name of
|
||||
the initial boot file which is to be loaded by a client.
|
||||
The _f_i_l_e_n_a_m_e should be a filename recognizable to whatever
|
||||
file transfer protocol the client can be expected to use
|
||||
file transfer protocol the client can be expected to use
|
||||
to load the file.
|
||||
|
||||
TThhee _s_e_r_v_e_r_-_n_a_m_e ssttaatteemmeenntt
|
||||
@ -1087,100 +1170,17 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
nneexxtt--sseerrvveerr _s_e_r_v_e_r_-_n_a_m_e;;
|
||||
|
||||
The _n_e_x_t_-_s_e_r_v_e_r statement is used to specify the host
|
||||
address of the server from which the initial boot file
|
||||
(specified in the _f_i_l_e_n_a_m_e statement) is to be loaded.
|
||||
_S_e_r_v_e_r_-_n_a_m_e should be a numeric IP address or a domain
|
||||
name. If no _n_e_x_t_-_s_e_r_v_e_r parameter applies to a given
|
||||
The _n_e_x_t_-_s_e_r_v_e_r statement is used to specify the host
|
||||
address of the server from which the initial boot file
|
||||
(specified in the _f_i_l_e_n_a_m_e statement) is to be loaded.
|
||||
_S_e_r_v_e_r_-_n_a_m_e should be a numeric IP address or a domain
|
||||
name. If no _n_e_x_t_-_s_e_r_v_e_r parameter applies to a given
|
||||
client, the DHCP server's IP address is used.
|
||||
|
||||
TThhee _f_i_x_e_d_-_a_d_d_r_e_s_s ssttaatteemmeenntt
|
||||
|
||||
ffiixxeedd--aaddddrreessss _a_d_d_r_e_s_s [,, _a_d_d_r_e_s_s ... ];;
|
||||
|
||||
The _f_i_x_e_d_-_a_d_d_r_e_s_s statement is used to assign one or more
|
||||
fixed IP addresses to a client. It should only appear in
|
||||
a _h_o_s_t 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 _f_i_x_e_d_-_a_d_d_r_e_s_s
|
||||
statement are on the network on which the client is boot
|
||||
ing, that client will not match the _h_o_s_t declaration con
|
||||
taining that _f_i_x_e_d_-_a_d_d_r_e_s_s statement. Each _a_d_d_r_e_s_s should
|
||||
be either an IP address or a domain name which resolves to
|
||||
one or more IP addresses.
|
||||
|
||||
TThhee _d_y_n_a_m_i_c_-_b_o_o_t_p_-_l_e_a_s_e_-_c_u_t_o_f_f ssttaatteemmeenntt
|
||||
|
||||
ddyynnaammiicc--bboooottpp--lleeaassee--ccuuttooffff _d_a_t_e;;
|
||||
|
||||
|
||||
|
||||
|
||||
17
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
The _d_y_n_a_m_i_c_-_b_o_o_t_p_-_l_e_a_s_e_-_c_u_t_o_f_f 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.
|
||||
|
||||
_D_a_t_e 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.
|
||||
|
||||
TThhee _d_y_n_a_m_i_c_-_b_o_o_t_p_-_l_e_a_s_e_-_l_e_n_g_t_h ssttaatteemmeenntt
|
||||
|
||||
ddyynnaammiicc--bboooottpp--lleeaassee--lleennggtthh _l_e_n_g_t_h;;
|
||||
|
||||
The _d_y_n_a_m_i_c_-_b_o_o_t_p_-_l_e_a_s_e_-_l_e_n_g_t_h 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 _l_e_n_g_t_h as a num
|
||||
ber of seconds. If a client reboots using BOOTP during
|
||||
the timeout period, the lease duration is reset to _l_e_n_g_t_h,
|
||||
so a BOOTP client that boots frequently enough will never
|
||||
lose its lease. Needless to say, this parameter should be
|
||||
adjusted with extreme caution.
|
||||
|
||||
TThhee _g_e_t_-_l_e_a_s_e_-_h_o_s_t_n_a_m_e_s ssttaatteemmeenntt
|
||||
|
||||
ggeett--lleeaassee--hhoossttnnaammeess _f_l_a_g;;
|
||||
|
||||
The _g_e_t_-_l_e_a_s_e_-_h_o_s_t_n_a_m_e_s 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 _h_o_s_t_n_a_m_e option. If _f_l_a_g is
|
||||
true, then this lookup is done for all addresses in the
|
||||
current scope. By default, or if _f_l_a_g is false, no
|
||||
lookups are done.
|
||||
|
||||
TThhee _u_s_e_-_h_o_s_t_-_d_e_c_l_-_n_a_m_e_s ssttaatteemmeenntt
|
||||
|
||||
uussee--hhoosstt--ddeeccll--nnaammeess _f_l_a_g;;
|
||||
|
||||
|
||||
|
||||
18
|
||||
@ -1192,9 +1192,91 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
If the _u_s_e_-_h_o_s_t_-_d_e_c_l_-_n_a_m_e_s 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
|
||||
The _f_i_x_e_d_-_a_d_d_r_e_s_s statement is used to assign one or more
|
||||
fixed IP addresses to a client. It should only appear in
|
||||
a _h_o_s_t 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 _f_i_x_e_d_-_a_d_d_r_e_s_s
|
||||
statement are on the network on which the client is boot
|
||||
ing, that client will not match the _h_o_s_t declaration con
|
||||
taining that _f_i_x_e_d_-_a_d_d_r_e_s_s statement. Each _a_d_d_r_e_s_s should
|
||||
be either an IP address or a domain name which resolves to
|
||||
one or more IP addresses.
|
||||
|
||||
TThhee _d_y_n_a_m_i_c_-_b_o_o_t_p_-_l_e_a_s_e_-_c_u_t_o_f_f ssttaatteemmeenntt
|
||||
|
||||
ddyynnaammiicc--bboooottpp--lleeaassee--ccuuttooffff _d_a_t_e;;
|
||||
|
||||
The _d_y_n_a_m_i_c_-_b_o_o_t_p_-_l_e_a_s_e_-_c_u_t_o_f_f 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.
|
||||
|
||||
_D_a_t_e 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.
|
||||
|
||||
TThhee _d_y_n_a_m_i_c_-_b_o_o_t_p_-_l_e_a_s_e_-_l_e_n_g_t_h ssttaatteemmeenntt
|
||||
|
||||
ddyynnaammiicc--bboooottpp--lleeaassee--lleennggtthh _l_e_n_g_t_h;;
|
||||
|
||||
The _d_y_n_a_m_i_c_-_b_o_o_t_p_-_l_e_a_s_e_-_l_e_n_g_t_h 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 _l_e_n_g_t_h as a num
|
||||
ber of seconds. If a client reboots using BOOTP during
|
||||
the timeout period, the lease duration is reset to _l_e_n_g_t_h,
|
||||
so a BOOTP client that boots frequently enough will never
|
||||
lose its lease. Needless to say, this parameter should be
|
||||
adjusted with extreme caution.
|
||||
|
||||
|
||||
|
||||
19
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
TThhee _g_e_t_-_l_e_a_s_e_-_h_o_s_t_n_a_m_e_s ssttaatteemmeenntt
|
||||
|
||||
ggeett--lleeaassee--hhoossttnnaammeess _f_l_a_g;;
|
||||
|
||||
The _g_e_t_-_l_e_a_s_e_-_h_o_s_t_n_a_m_e_s 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 _h_o_s_t_n_a_m_e option. If _f_l_a_g is
|
||||
true, then this lookup is done for all addresses in the
|
||||
current scope. By default, or if _f_l_a_g is false, no
|
||||
lookups are done.
|
||||
|
||||
TThhee _u_s_e_-_h_o_s_t_-_d_e_c_l_-_n_a_m_e_s ssttaatteemmeenntt
|
||||
|
||||
uussee--hhoosstt--ddeeccll--nnaammeess _f_l_a_g;;
|
||||
|
||||
If the _u_s_e_-_h_o_s_t_-_d_e_c_l_-_n_a_m_e_s 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 {
|
||||
@ -1214,7 +1296,7 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
option host-name "joe";
|
||||
}
|
||||
|
||||
An _o_p_t_i_o_n _h_o_s_t_-_n_a_m_e statement within a host declaration
|
||||
An _o_p_t_i_o_n _h_o_s_t_-_n_a_m_e statement within a host declaration
|
||||
will override the use of the name in the host declaration.
|
||||
|
||||
TThhee _a_u_t_h_o_r_i_t_a_t_i_v_e ssttaatteemmeenntt
|
||||
@ -1223,96 +1305,14 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
nnoott aauutthhoorriittaattiivvee;;
|
||||
|
||||
The DHCP server will normally assume that the configura
|
||||
The DHCP server will normally assume that the configura
|
||||
tion information about a given network segment is known to
|
||||
be correct and is authoritative. So if a client requests
|
||||
an IP address on a given network segment that the server
|
||||
knows is not valid for that segment, the server will
|
||||
an IP address on a given network segment that the server
|
||||
knows is not valid for that segment, the server will
|
||||
respond with a DHCPNAK message, causing the client to for
|
||||
get its IP address and try to get a new one.
|
||||
|
||||
If a DHCP server is being configured by somebody who is
|
||||
not the network administrator and who therefore does not
|
||||
wish to assert this level of authority, then the statement
|
||||
"not authoritative" should be written in the appropriate
|
||||
scope in the configuration file.
|
||||
|
||||
Usually, writing nnoott aauutthhoorriittaattiivvee;; at the top level of
|
||||
the file should be sufficient. However, if a DHCP server
|
||||
is to be set up so that it is aware of some networks for
|
||||
which it is authoritative and some networks for which it
|
||||
is not, it may be more appropriate to declare authority on
|
||||
a per-network-segment basis.
|
||||
|
||||
Note that the most specific scope for which the concept of
|
||||
authority makes any sense is the physical network segment
|
||||
|
||||
|
||||
|
||||
19
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
- either a shared-network statement or a subnet statement
|
||||
that is not contained within a shared-network statement.
|
||||
It is not meaningful to specify that the server is author
|
||||
itative for some subnets within a shared network, but not
|
||||
authoritative for others, nor is it meaningful to specify
|
||||
that the server is authoritative for some host declara
|
||||
tions and not others.
|
||||
|
||||
TThhee _a_l_w_a_y_s_-_r_e_p_l_y_-_r_f_c_1_0_4_8 ssttaatteemmeenntt
|
||||
|
||||
aallwwaayyss--rreeppllyy--rrffcc11004488 _f_l_a_g;;
|
||||
|
||||
Some BOOTP clients expect RFC1048-style responses, but do
|
||||
not follow RFC1048 when sending their requests. You can
|
||||
tell that a client is having this problem if it is not
|
||||
getting the options you have configured for it and if you
|
||||
see in the server log the message "(non-rfc1048)" printed
|
||||
with each BOOTREQUEST that is logged.
|
||||
|
||||
If you want to send rfc1048 options to such a client, you
|
||||
can set the aallwwaayyss--rreeppllyy--rrffcc11004488 option in that client's
|
||||
host declaration, and the DHCP server will respond with an
|
||||
RFC-1048-style vendor options field. This flag can be
|
||||
set in any scope, and will affect all clients covered by
|
||||
that scope.
|
||||
|
||||
TThhee _a_l_w_a_y_s_-_b_r_o_a_d_c_a_s_t ssttaatteemmeenntt
|
||||
|
||||
aallwwaayyss--bbrrooaaddccaasstt _f_l_a_g;;
|
||||
|
||||
The DHCP and BOOTP protocols both require DHCP and BOOTP
|
||||
clients to set the broadcast bit in the flags field of the
|
||||
BOOTP message header. Unfortunately, some DHCP and BOOTP
|
||||
clients do not do this, and therefore may not receive
|
||||
responses from the DHCP server. The DHCP server can be
|
||||
made to always broadcast its responses to clients by set
|
||||
ting this flag to 'on' for the relevant scope. To avoid
|
||||
creating excess broadcast traffic on your network, we rec
|
||||
ommend that you restrict the use of this option to as few
|
||||
clients as possible. For example, the Microsoft DHCP
|
||||
client is known not to have this problem, as are the Open
|
||||
Transport and ISC DHCP clients.
|
||||
|
||||
TThhee _o_n_e_-_l_e_a_s_e_-_p_e_r_-_c_l_i_e_n_t ssttaatteemmeenntt
|
||||
|
||||
oonnee--lleeaassee--ppeerr--cclliieenntt _f_l_a_g;;
|
||||
|
||||
If this flag is enabled, whenever a client sends a DHCPRE
|
||||
QUEST for a particular lease, the server will automati
|
||||
cally free any other leases the client holds. This pre
|
||||
sumes that when the client sends a DHCPREQUEST, it has
|
||||
forgotten any lease not mentioned in the DHCPREQUEST -
|
||||
i.e., the client has only a single network interface _a_n_d
|
||||
it does not remember leases it's holding on networks to
|
||||
|
||||
|
||||
|
||||
20
|
||||
@ -1324,60 +1324,60 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
which it is not currently attached. Neither of these
|
||||
assumptions are guaranteed or provable, so we urge caution
|
||||
in the use of this statement.
|
||||
If a DHCP server is being configured by somebody who is
|
||||
not the network administrator and who therefore does not
|
||||
wish to assert this level of authority, then the statement
|
||||
"not authoritative" should be written in the appropriate
|
||||
scope in the configuration file.
|
||||
|
||||
TThhee _u_s_e_-_l_e_a_s_e_-_a_d_d_r_-_f_o_r_-_d_e_f_a_u_l_t_-_r_o_u_t_e ssttaatteemmeenntt
|
||||
Usually, writing nnoott aauutthhoorriittaattiivvee;; at the top level of
|
||||
the file should be sufficient. However, if a DHCP server
|
||||
is to be set up so that it is aware of some networks for
|
||||
which it is authoritative and some networks for which it
|
||||
is not, it may be more appropriate to declare authority on
|
||||
a per-network-segment basis.
|
||||
|
||||
uussee--lleeaassee--aaddddrr--ffoorr--ddeeffaauulltt--rroouuttee _f_l_a_g;;
|
||||
Note that the most specific scope for which the concept of
|
||||
authority makes any sense is the physical network segment
|
||||
- either a shared-network statement or a subnet statement
|
||||
that is not contained within a shared-network statement.
|
||||
It is not meaningful to specify that the server is author
|
||||
itative for some subnets within a shared network, but not
|
||||
authoritative for others, nor is it meaningful to specify
|
||||
that the server is authoritative for some host declara
|
||||
tions and not others.
|
||||
|
||||
If the _u_s_e_-_l_e_a_s_e_-_a_d_d_r_-_f_o_r_-_d_e_f_a_u_l_t_-_r_o_u_t_e parameter is true
|
||||
in a given scope, then instead of sending the value speci
|
||||
fied in the routers option (or sending no value at all),
|
||||
the IP address of the lease being assigned is sent to the
|
||||
client. This supposedly causes Win95 machines to ARP for
|
||||
all IP addresses, which can be helpful if your router is
|
||||
configured for proxy ARP.
|
||||
TThhee _a_l_w_a_y_s_-_r_e_p_l_y_-_r_f_c_1_0_4_8 ssttaatteemmeenntt
|
||||
|
||||
TThhee _s_e_r_v_e_r_-_i_d_e_n_t_i_f_i_e_r ssttaatteemmeenntt
|
||||
aallwwaayyss--rreeppllyy--rrffcc11004488 _f_l_a_g;;
|
||||
|
||||
sseerrvveerr--iiddeennttiiffiieerr _h_o_s_t_n_a_m_e;;
|
||||
Some BOOTP clients expect RFC1048-style responses, but do
|
||||
not follow RFC1048 when sending their requests. You can
|
||||
tell that a client is having this problem if it is not
|
||||
getting the options you have configured for it and if you
|
||||
see in the server log the message "(non-rfc1048)" printed
|
||||
with each BOOTREQUEST that is logged.
|
||||
|
||||
The server-identifier statement can be used to define the
|
||||
value that is sent in the DHCP Server Identifier option
|
||||
for a given scope. The value specified mmuusstt be an IP
|
||||
address for the DHCP server, and must be reachable by all
|
||||
clients served by a particular scope.
|
||||
If you want to send rfc1048 options to such a client, you
|
||||
can set the aallwwaayyss--rreeppllyy--rrffcc11004488 option in that client's
|
||||
host declaration, and the DHCP server will respond with an
|
||||
RFC-1048-style vendor options field. This flag can be
|
||||
set in any scope, and will affect all clients covered by
|
||||
that scope.
|
||||
|
||||
The use of the server-identifier statement is not recom
|
||||
mended - the only reason to use it is to force a value
|
||||
other than the default value to be sent on occasions where
|
||||
the default value would be incorrect. The default value
|
||||
is the first IP address associated with the physical net
|
||||
work interface on which the request arrived.
|
||||
TThhee _a_l_w_a_y_s_-_b_r_o_a_d_c_a_s_t ssttaatteemmeenntt
|
||||
|
||||
The usual case where the _s_e_r_v_e_r_-_i_d_e_n_t_i_f_i_e_r statement needs
|
||||
to be sent is when a physical interface has more than one
|
||||
IP address, and the one being sent by default isn't appro
|
||||
priate for some or all clients served by that interface.
|
||||
Another common case is when an alias is defined for the
|
||||
purpose of having a consistent IP address for the DHCP
|
||||
server, and it is desired that the clients use this IP
|
||||
address when contacting the server.
|
||||
aallwwaayyss--bbrrooaaddccaasstt _f_l_a_g;;
|
||||
|
||||
Supplying a value for the dhcp-server-identifier option is
|
||||
equivalent to using the server-identifier statement.
|
||||
|
||||
RREEFFEERREENNCCEE:: OOPPTTIIOONN SSTTAATTEEMMEENNTTSS
|
||||
DHCP option statements are documented in the ddhhccpp--
|
||||
ooppttiioonnss((55)) manual page.
|
||||
|
||||
VVEENNDDOORR EENNCCAAPPSSUULLAATTEEDD OOPPTTIIOONNSS
|
||||
The DHCP protocol defines the vveennddoorr--eennccaappssuullaatteedd--ooppttiioonnss
|
||||
option, which allows vendors to define their own options
|
||||
that will be sent encapsulated in a standard DHCP option.
|
||||
The format of the vveennddoorr--eennccaappssuullaatteedd--ooppttiioonnss option is
|
||||
The DHCP and BOOTP protocols both require DHCP and BOOTP
|
||||
clients to set the broadcast bit in the flags field of the
|
||||
BOOTP message header. Unfortunately, some DHCP and BOOTP
|
||||
clients do not do this, and therefore may not receive
|
||||
responses from the DHCP server. The DHCP server can be
|
||||
made to always broadcast its responses to clients by set
|
||||
ting this flag to 'on' for the relevant scope. To avoid
|
||||
creating excess broadcast traffic on your network, we rec
|
||||
ommend that you restrict the use of this option to as few
|
||||
|
||||
|
||||
|
||||
@ -1390,15 +1390,96 @@ VVEENNDDOORR EENNCCAAPPSSUULLAATTEEDD OOPPTTIIOONNSS
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
either a hunk of opaque data, or an actual option buffer
|
||||
clients as possible. For example, the Microsoft DHCP
|
||||
client is known not to have this problem, as are the Open
|
||||
Transport and ISC DHCP clients.
|
||||
|
||||
TThhee _o_n_e_-_l_e_a_s_e_-_p_e_r_-_c_l_i_e_n_t ssttaatteemmeenntt
|
||||
|
||||
oonnee--lleeaassee--ppeerr--cclliieenntt _f_l_a_g;;
|
||||
|
||||
If this flag is enabled, whenever a client sends a DHCPRE
|
||||
QUEST for a particular lease, the server will automati
|
||||
cally free any other leases the client holds. This pre
|
||||
sumes that when the client sends a DHCPREQUEST, it has
|
||||
forgotten any lease not mentioned in the DHCPREQUEST -
|
||||
i.e., the client has only a single network interface _a_n_d
|
||||
it does not remember leases it's holding on networks to
|
||||
which it is not currently attached. Neither of these
|
||||
assumptions are guaranteed or provable, so we urge caution
|
||||
in the use of this statement.
|
||||
|
||||
TThhee _u_s_e_-_l_e_a_s_e_-_a_d_d_r_-_f_o_r_-_d_e_f_a_u_l_t_-_r_o_u_t_e ssttaatteemmeenntt
|
||||
|
||||
uussee--lleeaassee--aaddddrr--ffoorr--ddeeffaauulltt--rroouuttee _f_l_a_g;;
|
||||
|
||||
If the _u_s_e_-_l_e_a_s_e_-_a_d_d_r_-_f_o_r_-_d_e_f_a_u_l_t_-_r_o_u_t_e parameter is true
|
||||
in a given scope, then instead of sending the value speci
|
||||
fied in the routers option (or sending no value at all),
|
||||
the IP address of the lease being assigned is sent to the
|
||||
client. This supposedly causes Win95 machines to ARP for
|
||||
all IP addresses, which can be helpful if your router is
|
||||
configured for proxy ARP.
|
||||
|
||||
TThhee _s_e_r_v_e_r_-_i_d_e_n_t_i_f_i_e_r ssttaatteemmeenntt
|
||||
|
||||
sseerrvveerr--iiddeennttiiffiieerr _h_o_s_t_n_a_m_e;;
|
||||
|
||||
The server-identifier statement can be used to define the
|
||||
value that is sent in the DHCP Server Identifier option
|
||||
for a given scope. The value specified mmuusstt be an IP
|
||||
address for the DHCP server, and must be reachable by all
|
||||
clients served by a particular scope.
|
||||
|
||||
The use of the server-identifier statement is not recom
|
||||
mended - the only reason to use it is to force a value
|
||||
other than the default value to be sent on occasions where
|
||||
the default value would be incorrect. The default value
|
||||
is the first IP address associated with the physical net
|
||||
work interface on which the request arrived.
|
||||
|
||||
The usual case where the _s_e_r_v_e_r_-_i_d_e_n_t_i_f_i_e_r statement needs
|
||||
to be sent is when a physical interface has more than one
|
||||
IP address, and the one being sent by default isn't appro
|
||||
priate for some or all clients served by that interface.
|
||||
Another common case is when an alias is defined for the
|
||||
purpose of having a consistent IP address for the DHCP
|
||||
|
||||
|
||||
|
||||
22
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
server, and it is desired that the clients use this IP
|
||||
address when contacting the server.
|
||||
|
||||
Supplying a value for the dhcp-server-identifier option is
|
||||
equivalent to using the server-identifier statement.
|
||||
|
||||
RREEFFEERREENNCCEE:: OOPPTTIIOONN SSTTAATTEEMMEENNTTSS
|
||||
DHCP option statements are documented in the ddhhccpp--
|
||||
ooppttiioonnss((55)) manual page.
|
||||
|
||||
VVEENNDDOORR EENNCCAAPPSSUULLAATTEEDD OOPPTTIIOONNSS
|
||||
The DHCP protocol defines the vveennddoorr--eennccaappssuullaatteedd--ooppttiioonnss
|
||||
option, which allows vendors to define their own options
|
||||
that will be sent encapsulated in a standard DHCP option.
|
||||
The format of the vveennddoorr--eennccaappssuullaatteedd--ooppttiioonnss option is
|
||||
either a hunk of opaque data, or an actual option buffer
|
||||
just like a standard DHCP option buffer.
|
||||
|
||||
You can send this option to clients in one of two ways -
|
||||
either define the data directly, using a text string or a
|
||||
colon-seperated list of hexadecimal values, or define an
|
||||
option space, define some options in that option space,
|
||||
provide values for them, and specify that that option
|
||||
space should be used to generate the vveennddoorr--eennccaappssuullaatteedd--
|
||||
You can send this option to clients in one of two ways -
|
||||
either define the data directly, using a text string or a
|
||||
colon-seperated list of hexadecimal values, or define an
|
||||
option space, define some options in that option space,
|
||||
provide values for them, and specify that that option
|
||||
space should be used to generate the vveennddoorr--eennccaappssuullaatteedd--
|
||||
ooppttiioonnss option in some scope.
|
||||
|
||||
To send a simple clump of data, simply provide a value for
|
||||
@ -1409,13 +1490,13 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
3:12:73:75:6e:64:68:63:70:2d:73:65:72:76:65:72:31:37:2d:31:
|
||||
4:12:2f:65:78:70:6f:72:74:2f:72:6f:6f:74:2f:69:38:36:70:63;
|
||||
|
||||
To define a new option space in which vendor options can
|
||||
To define a new option space in which vendor options can
|
||||
be stored, use the option space statement:
|
||||
|
||||
ooppttiioonn ssppaaccee _n_a_m_e ;;
|
||||
|
||||
The name can then be used in option definitions, as
|
||||
described in the ddhhccpp--ooppttiioonnss((55)) manual page. For exam
|
||||
The name can then be used in option definitions, as
|
||||
described in the ddhhccpp--ooppttiioonnss((55)) manual page. For exam
|
||||
ple:
|
||||
|
||||
option space SUNW;
|
||||
@ -1423,15 +1504,27 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
option SUNW.server-name code 3 = text;
|
||||
option SUNW.root-path code 4 = text;
|
||||
|
||||
Once you have defined an option space and some options,
|
||||
you can set up scopes that define values for those
|
||||
options, and you can say when to use them. For example,
|
||||
suppose you want to handle two different classes of
|
||||
clients, as in the example in the CCLLIIEENNTT CCLLAASSSSIINNGG section.
|
||||
Using the option space definition shown in the previous
|
||||
example, something very similar to the vendor-encapsu
|
||||
lated-options definition shown earlier can be done as fol
|
||||
lows:
|
||||
Once you have defined an option space and some options,
|
||||
you can set up scopes that define values for those
|
||||
options, and you can say when to use them. For example,
|
||||
suppose you want to handle two different classes of
|
||||
clients, as in the example in the VVEENNDDOORR EENNCCAAPPSSUULLAATTEEDD
|
||||
OOPPTTIIOONNSS section. Using the option space definition shown
|
||||
|
||||
|
||||
|
||||
23
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
in the previous example, something very similar to the
|
||||
vendor-encapsulated-options definition shown earlier can
|
||||
be done as follows:
|
||||
|
||||
class "vendor-classes" {
|
||||
match option vendor-class-identifier;
|
||||
@ -1445,29 +1538,18 @@ dhcpd.conf(5) dhcpd.conf(5)
|
||||
option SUNW.root-path "/export/root/sparc";
|
||||
}
|
||||
|
||||
|
||||
|
||||
22
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dhcpd.conf(5) dhcpd.conf(5)
|
||||
|
||||
|
||||
subclass "vendor-classes" "SUNW.i86pc" {
|
||||
vendor-option-space SUNW;
|
||||
option SUNW.root-path "/export/root/i86pc";
|
||||
}
|
||||
|
||||
As you can see in the preceding example, regular scoping
|
||||
rules apply, so you can define values that are global in
|
||||
As you can see in the preceding example, regular scoping
|
||||
rules apply, so you can define values that are global in
|
||||
the global scope, and only define values that are specific
|
||||
to a particular class in the local scope. The vveennddoorr--
|
||||
to a particular class in the local scope. The vveennddoorr--
|
||||
ooppttiioonn--ssppaaccee declaration indicates that in that scope, the
|
||||
vveennddoorr--eennccaappssuullaatteedd--ooppttiioonnss option should be constructed
|
||||
using the values of all the options in the SUNW option
|
||||
vveennddoorr--eennccaappssuullaatteedd--ooppttiioonnss option should be constructed
|
||||
using the values of all the options in the SUNW option
|
||||
space.
|
||||
|
||||
SSEEEE AALLSSOO
|
||||
@ -1475,9 +1557,9 @@ SSEEEE AALLSSOO
|
||||
|
||||
AAUUTTHHOORR
|
||||
ddhhccppdd((88)) was written by Ted Lemon <mellon@vix.com> under a
|
||||
contract with Vixie Labs. Funding for this project was
|
||||
contract with Vixie Labs. Funding for this project was
|
||||
provided by the Internet Software Consortium. Information
|
||||
about the Internet Software Consortium can be found at
|
||||
about the Internet Software Consortium can be found at
|
||||
hhttttpp::////wwwwww..iisscc..oorrgg//iisscc..
|
||||
|
||||
|
||||
@ -1497,22 +1579,6 @@ AAUUTTHHOORR
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
23
|
||||
24
|
||||
|
||||
|
||||
|
@ -22,14 +22,16 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: failover.c,v 1.3 1999/11/14 00:42:57 mellon Exp $ Copyright (c) 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: failover.c,v 1.4 1999/11/20 18:36:31 mellon Exp $ Copyright (c) 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
#include <omapip/omapip_p.h>
|
||||
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
static struct hash_table *failover_hash;
|
||||
static isc_result_t do_a_failover_option (omapi_connection_object_t *,
|
||||
static dhcp_failover_state_t *failover_states;
|
||||
static isc_result_t do_a_failover_option (omapi_object_t *,
|
||||
dhcp_failover_link_t *);
|
||||
|
||||
void enter_failover_peer (peer)
|
||||
@ -70,15 +72,20 @@ isc_result_t dhcp_failover_link_initiate (omapi_object_t *h)
|
||||
dhcp_failover_link_t *obj;
|
||||
char *peer_name;
|
||||
unsigned long port;
|
||||
omapi_typed_data_t *value = (omapi_typed_data_t *)0;
|
||||
omapi_value_t *value = (omapi_value_t *)0;
|
||||
|
||||
status = omapi_get_value_str (h, (omapi_object_t *)0,
|
||||
"remote-port", &value);
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
|
||||
status = omapi_get_int_value (&port, value);
|
||||
omapi_typed_data_dereference (&value, "dhcp_failover_link_initiate");
|
||||
if (!value -> value) {
|
||||
omapi_value_dereference (&value,
|
||||
"dhcp_failover_link_initiate");
|
||||
return ISC_R_INVALIDARG;
|
||||
}
|
||||
|
||||
status = omapi_get_int_value (&port, value -> value);
|
||||
omapi_value_dereference (&value, "dhcp_failover_link_initiate");
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
|
||||
@ -86,24 +93,26 @@ isc_result_t dhcp_failover_link_initiate (omapi_object_t *h)
|
||||
"remote-peer", &value);
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
if (value -> type != omapi_datatype_string &&
|
||||
value -> type != omapu_datatype_data) {
|
||||
omapi_typed_data_dereference (&value,
|
||||
"dhcp_failover_link_initiate");
|
||||
if (!value -> value ||
|
||||
(value -> value -> type != omapi_datatype_string &&
|
||||
value -> value -> type != omapi_datatype_data)) {
|
||||
omapi_value_dereference (&value,
|
||||
"dhcp_failover_link_initiate");
|
||||
return ISC_R_INVALIDARG;
|
||||
}
|
||||
|
||||
/* Save the name. */
|
||||
peer_name = malloc (value -> u.buffer.len + 1);
|
||||
peer_name = malloc (value -> value -> u.buffer.len + 1);
|
||||
if (!peer_name) {
|
||||
omapi_typed_data_dereference (&value,
|
||||
"dhcp_failover_link_initiate");
|
||||
omapi_value_dereference (&value,
|
||||
"dhcp_failover_link_initiate");
|
||||
return ISC_R_NOMEMORY;
|
||||
}
|
||||
|
||||
memcpy (peer_name, value -> u.buffer.data, value -> u.buffer.len);
|
||||
peer_name [value -> u.buffer.len] = 0;
|
||||
omapi_typed_data_dereference (&value, "dhcp_failover_link_initiate");
|
||||
memcpy (peer_name, value -> value -> u.buffer.value,
|
||||
value -> value -> u.buffer.len);
|
||||
peer_name [value -> value -> u.buffer.len] = 0;
|
||||
omapi_value_dereference (&value, "dhcp_failover_link_initiate");
|
||||
|
||||
obj = (dhcp_failover_link_t *)malloc (sizeof *obj);
|
||||
if (!obj)
|
||||
@ -112,9 +121,9 @@ isc_result_t dhcp_failover_link_initiate (omapi_object_t *h)
|
||||
obj -> refcnt = 1;
|
||||
obj -> type = dhcp_type_failover_link;
|
||||
obj -> peer_name = peer_name;
|
||||
obj -> port = port;
|
||||
obj -> peer_port = port;
|
||||
|
||||
status = omapi_connect ((omapi_object_t *)obj, server_name, port);
|
||||
status = omapi_connect ((omapi_object_t *)obj, peer_name, port);
|
||||
if (status != ISC_R_SUCCESS) {
|
||||
omapi_object_dereference ((omapi_object_t **)&obj,
|
||||
"dhcp_failover_link_initiate");
|
||||
@ -165,41 +174,50 @@ isc_result_t dhcp_failover_link_signal (omapi_object_t *h,
|
||||
|
||||
/* Not a signal we recognize? */
|
||||
if (strcmp (name, "ready")) {
|
||||
if (p -> inner && p -> inner -> type -> signal_handler)
|
||||
return (*(p -> inner -> type -> signal_handler)) (h,
|
||||
if (h -> inner && h -> inner -> type -> signal_handler)
|
||||
return (*(h -> inner -> type -> signal_handler)) (h,
|
||||
name,
|
||||
ap);
|
||||
return ISC_R_NOTFOUND;
|
||||
}
|
||||
|
||||
if (!p -> outer || p -> outer -> type != omapi_type_connection)
|
||||
if (!h -> outer || h -> outer -> type != omapi_type_connection)
|
||||
return ISC_R_INVALIDARG;
|
||||
c = p -> outer;
|
||||
c = h -> outer;
|
||||
|
||||
/* We get here because we requested that we be woken up after
|
||||
some number of bytes were read, and that number of bytes
|
||||
has in fact been read. */
|
||||
switch (p -> state) {
|
||||
switch (link -> state) {
|
||||
case dhcp_flink_start:
|
||||
p -> state = dhcp_flink_message_length_wait;
|
||||
link -> state = dhcp_flink_message_length_wait;
|
||||
if ((omapi_connection_require (c, 2)) != ISC_R_SUCCESS)
|
||||
break;
|
||||
case dhcp_flink_message_length_wait:
|
||||
p -> state = dhcp_flink_message_wait;
|
||||
memset (link -> incoming_message, 0, sizeof (link -> imsg));
|
||||
/* Get the length: */
|
||||
omapi_connection_get_uint16 (c, &link -> imsg_len);
|
||||
link -> imsg_count = 0; /* Bytes read. */
|
||||
|
||||
/* Maximum of 2048 bytes in any failover message. */
|
||||
if (link -> imsg_len > DHCP_FAILOVER_MAX_MESSAGE_SIZE) {
|
||||
link -> state = dhcp_flink_message_wait;
|
||||
link -> imsg = dmalloc (sizeof (failover_message_t),
|
||||
"dhcp_failover_link_signal");
|
||||
if (!link -> imsg) {
|
||||
dhcp_flink_fail:
|
||||
if (link -> imsg) {
|
||||
dfree (link -> imsg,
|
||||
"dhcp_failover_link_signal");
|
||||
link -> imsg = (failover_message_t *)0;
|
||||
}
|
||||
link -> state = dhcp_flink_disconnected;
|
||||
omapi_disconnect (c, 1);
|
||||
/* XXX just blow away the protocol state now?
|
||||
XXX or will disconnect blow it away? */
|
||||
return ISC_R_UNEXPECTED;
|
||||
}
|
||||
memset (link -> imsg, 0, sizeof (link -> imsg));
|
||||
/* Get the length: */
|
||||
omapi_connection_get_uint16 (c, &link -> imsg_len);
|
||||
link -> imsg_count = 0; /* Bytes read. */
|
||||
|
||||
/* Maximum of 2048 bytes in any failover message. */
|
||||
if (link -> imsg_len > DHCP_FAILOVER_MAX_MESSAGE_SIZE)
|
||||
goto dhcp_flink_fail;
|
||||
|
||||
if ((omapi_connection_require (c, link -> imsg_len)) !=
|
||||
ISC_R_SUCCESS)
|
||||
@ -234,11 +252,11 @@ isc_result_t dhcp_failover_link_signal (omapi_object_t *h,
|
||||
|
||||
/* Skip over any portions of the message header that we
|
||||
don't understand. */
|
||||
if (link -> payoff - link -> imsg_count) {
|
||||
if (link -> imsg_payoff - link -> imsg_count) {
|
||||
omapi_connection_copyout ((unsigned char *)0, c,
|
||||
(link -> payoff -
|
||||
(link -> imsg_payoff -
|
||||
link -> imsg_count));
|
||||
link -> imsg_count = link -> payoff;
|
||||
link -> imsg_count = link -> imsg_payoff;
|
||||
}
|
||||
|
||||
/* Get transaction ID. */
|
||||
@ -264,14 +282,15 @@ isc_result_t dhcp_failover_link_signal (omapi_object_t *h,
|
||||
}
|
||||
|
||||
static isc_result_t do_a_failover_option (c, link)
|
||||
omapi_connection_object_t *c;
|
||||
omapi_object_t *c;
|
||||
dhcp_failover_link_t *link;
|
||||
{
|
||||
u_int16_t option_code;
|
||||
u_int16_t option_len;
|
||||
char *op;
|
||||
int op_size;
|
||||
int op_count;
|
||||
unsigned char *op;
|
||||
unsigned op_size;
|
||||
unsigned op_count;
|
||||
int i;
|
||||
|
||||
if (link -> imsg_count + 2 > link -> imsg_len) {
|
||||
log_error ("FAILOVER: message overflow at option code.");
|
||||
@ -299,7 +318,7 @@ static isc_result_t do_a_failover_option (c, link)
|
||||
option_code, option_len);
|
||||
#endif
|
||||
omapi_connection_copyout ((unsigned char *)0, c, option_len);
|
||||
link -> imsg_count = += option_len;
|
||||
link -> imsg_count += option_len;
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
@ -320,7 +339,7 @@ static isc_result_t do_a_failover_option (c, link)
|
||||
}
|
||||
|
||||
/* Only accept an option once. */
|
||||
if (imsg -> options_present & ft_options [option_code].bit) {
|
||||
if (link -> imsg -> options_present & ft_options [option_code].bit) {
|
||||
log_error ("FAILOVER: duplicate option %s",
|
||||
ft_options [option_code].name);
|
||||
return ISC_R_PROTOCOLERROR;
|
||||
@ -335,7 +354,7 @@ static isc_result_t do_a_failover_option (c, link)
|
||||
if (ft_options [option_code].bit &&
|
||||
!(fto_allowed [option_code] & ft_options [option_code].bit)) {
|
||||
omapi_connection_copyout ((unsigned char *)0, c, option_len);
|
||||
link -> imsg_count = += option_len;
|
||||
link -> imsg_count += option_len;
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
@ -346,27 +365,28 @@ static isc_result_t do_a_failover_option (c, link)
|
||||
we expect the space for them to be preallocated,
|
||||
and we can just read the data in. */
|
||||
|
||||
op = ((char *)&link -> imsg) + ft_options [option_code].offset;
|
||||
op = ((unsigned char *)&link -> imsg) +
|
||||
ft_options [option_code].offset;
|
||||
op_size = ft_sizes [ft_options [option_code].type];
|
||||
op_count = ft_options [option_code].num_present;
|
||||
|
||||
if (option_length != op_size * op_count) {
|
||||
if (option_len != op_size * op_count) {
|
||||
log_error ("FAILOVER: option size (%d:%d), option %s",
|
||||
option_length,
|
||||
option_len,
|
||||
(ft_sizes [ft_options [option_code].type] *
|
||||
ft_options [option_code].num_present),
|
||||
ft_options [option_code].name);
|
||||
return ISC_R_PROTOCOLERROR;
|
||||
}
|
||||
} else {
|
||||
struct failover_option *fo;
|
||||
failover_option_t *fo;
|
||||
|
||||
/* FT_DDNS* are special - one or two bytes of status
|
||||
followed by the client FQDN. */
|
||||
if (ft_options [option_code].type == FT_DDNS1 ||
|
||||
ft_options [option_code].type == FT_DDNS1) {
|
||||
struct failover_ddns *ddns =
|
||||
((struct failover_ddns *)
|
||||
ddns_fqdn_t *ddns =
|
||||
((ddns_fqdn_t *)
|
||||
(((char *)&link -> imsg) +
|
||||
ft_options [option_code].offset));
|
||||
|
||||
@ -378,7 +398,7 @@ static isc_result_t do_a_failover_option (c, link)
|
||||
if (op_count == 1)
|
||||
ddns -> codes [1] = 0;
|
||||
op_size = 1;
|
||||
op_count = option_length - op_count;
|
||||
op_count = option_len - op_count;
|
||||
|
||||
ddns -> length = op_count;
|
||||
ddns -> data = malloc (op_count);
|
||||
@ -393,7 +413,7 @@ static isc_result_t do_a_failover_option (c, link)
|
||||
omapi_connection_copyout (ddns -> data, c, op_count);
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
|
||||
/* A zero for num_present means that any number of
|
||||
elements can appear, so we have to figure out how
|
||||
many we got from the length of the option, and then
|
||||
@ -403,20 +423,20 @@ static isc_result_t do_a_failover_option (c, link)
|
||||
|
||||
/* Make sure that option data length is a multiple of the
|
||||
size of the data type being sent. */
|
||||
if (op_size > 1 && option_length % op_size) {
|
||||
log_error ("FAILOVER: option_length %d not %s%d",
|
||||
option_length, "multiple of ", option_size);
|
||||
if (op_size > 1 && option_len % op_size) {
|
||||
log_error ("FAILOVER: option_len %d not %s%d",
|
||||
option_len, "multiple of ", op_size);
|
||||
return ISC_R_PROTOCOLERROR;
|
||||
}
|
||||
|
||||
op_count = option_length / op_size;
|
||||
op_count = option_len / op_size;
|
||||
|
||||
fo = ((struct failover_option *)
|
||||
fo = ((failover_option_t *)
|
||||
(((char *)&link -> imsg) +
|
||||
ft_options [option_code].offset));
|
||||
|
||||
fo -> count = op_count;
|
||||
fo -> data = malloc (option_length);
|
||||
fo -> data = malloc (option_len);
|
||||
if (!fo -> data) {
|
||||
log_error ("FAILOVER: no memory getting %s (%d)",
|
||||
"option data", op_count);
|
||||
@ -438,12 +458,12 @@ static isc_result_t do_a_failover_option (c, link)
|
||||
for (i = 0; i < op_count; i++) {
|
||||
switch (ft_options [option_code].type) {
|
||||
case FT_UINT32:
|
||||
omapi_connection_get_uint32 (c, op);
|
||||
omapi_connection_get_uint32 (c, (u_int32_t *)op);
|
||||
op += 4;
|
||||
break;
|
||||
|
||||
case FT_UINT16:
|
||||
omapi_connection_get_uint16 (c, op);
|
||||
omapi_connection_get_uint16 (c, (u_int16_t *)op);
|
||||
op += 2;
|
||||
break;
|
||||
|
||||
@ -458,7 +478,7 @@ static isc_result_t do_a_failover_option (c, link)
|
||||
}
|
||||
out:
|
||||
/* Remember that we got this option. */
|
||||
link -> options_present |= ft_options [option_code].bit;
|
||||
link -> imsg -> options_present |= ft_options [option_code].bit;
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
@ -471,7 +491,7 @@ isc_result_t dhcp_failover_link_set_value (omapi_object_t *h,
|
||||
return ISC_R_INVALIDARG;
|
||||
|
||||
/* Never valid to set these. */
|
||||
if (!omapi_ds_strcmp (name, "port") ||
|
||||
if (!omapi_ds_strcmp (name, "link-port") ||
|
||||
!omapi_ds_strcmp (name, "link-name") ||
|
||||
!omapi_ds_strcmp (name, "link-state"))
|
||||
return ISC_R_NOPERM;
|
||||
@ -493,8 +513,9 @@ isc_result_t dhcp_failover_link_get_value (omapi_object_t *h,
|
||||
return ISC_R_INVALIDARG;
|
||||
link = (dhcp_failover_link_t *)h;
|
||||
|
||||
if (!omapi_ds_strcmp (name, "port")) {
|
||||
return omapi_make_int_value (value, name, link -> port,
|
||||
if (!omapi_ds_strcmp (name, "link-port")) {
|
||||
return omapi_make_int_value (value, name,
|
||||
(int)link -> peer_port,
|
||||
"dhcp_failover_link_get_value");
|
||||
} else if (!omapi_ds_strcmp (name, "link-name")) {
|
||||
return omapi_make_string_value
|
||||
@ -502,7 +523,7 @@ isc_result_t dhcp_failover_link_get_value (omapi_object_t *h,
|
||||
"dhcp_failover_link_get_value");
|
||||
} else if (!omapi_ds_strcmp (name, "link-state")) {
|
||||
if (link -> state < 0 ||
|
||||
link -> state >= dhcp_failover_link_state_max)
|
||||
link -> state >= dhcp_flink_state_max)
|
||||
return omapi_make_string_value
|
||||
(value, name, "invalid link state",
|
||||
"dhcp_failover_link_get_value");
|
||||
@ -520,13 +541,14 @@ isc_result_t dhcp_failover_link_get_value (omapi_object_t *h,
|
||||
|
||||
isc_result_t dhcp_failover_link_destroy (omapi_object_t *h, const char *name)
|
||||
{
|
||||
dhcp_failover_link_t *p;
|
||||
dhcp_failover_link_t *link;
|
||||
if (h -> type != dhcp_type_failover_link)
|
||||
return ISC_R_INVALIDARG;
|
||||
p = (dhcp_failover_link_object_t *)h;
|
||||
if (p -> message)
|
||||
omapi_object_dereference ((omapi_object_t **)&p -> message,
|
||||
name);
|
||||
link = (dhcp_failover_link_t *)h;
|
||||
if (link -> imsg) {
|
||||
dfree (link -> imsg, "dhcp_failover_link_destroy");
|
||||
link -> imsg = (failover_message_t *)0;
|
||||
}
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
@ -535,21 +557,22 @@ isc_result_t dhcp_failover_link_destroy (omapi_object_t *h, const char *name)
|
||||
|
||||
isc_result_t dhcp_failover_link_stuff_values (omapi_object_t *c,
|
||||
omapi_object_t *id,
|
||||
omapi_object_t *p)
|
||||
omapi_object_t *l)
|
||||
{
|
||||
dhcp_failover_link_t *link;
|
||||
isc_result_t status;
|
||||
|
||||
if (h -> type != omapi_type_protocol)
|
||||
if (l -> type != dhcp_type_failover_link)
|
||||
return ISC_R_INVALIDARG;
|
||||
link = (dhcp_failover_link_t *)h;
|
||||
link = (dhcp_failover_link_t *)l;
|
||||
|
||||
status = omapi_connection_put_name (c, "port");
|
||||
status = omapi_connection_put_name (c, "link-port");
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
status = omapi_put_uint32 (c, sizeof (int));
|
||||
status = omapi_connection_put_uint32 (c, sizeof (int));
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
status = omapi_put_uint32 (c, link -> port);
|
||||
status = omapi_connection_put_uint32 (c, link -> peer_port);
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
|
||||
@ -564,7 +587,7 @@ isc_result_t dhcp_failover_link_stuff_values (omapi_object_t *c,
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
if (link -> state < 0 ||
|
||||
link -> state >= dhcp_failover_link_state_max)
|
||||
link -> state >= dhcp_flink_state_max)
|
||||
status = omapi_connection_put_string (c, "invalid link state");
|
||||
else
|
||||
status = (omapi_connection_put_string
|
||||
@ -572,19 +595,19 @@ isc_result_t dhcp_failover_link_stuff_values (omapi_object_t *c,
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
|
||||
if (p -> inner && p -> inner -> type -> stuff_values)
|
||||
return (*(p -> inner -> type -> stuff_values)) (c, id,
|
||||
p -> inner);
|
||||
if (link -> inner && link -> inner -> type -> stuff_values)
|
||||
return (*(link -> inner -> type -> stuff_values)) (c, id,
|
||||
link -> inner);
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
/* Set up a listener for the omapi protocol. The handle stored points to
|
||||
a listener object, not a protocol object. */
|
||||
|
||||
isc_result_t dhcp_failover_listen (omapi_object_t *h);
|
||||
isc_result_t dhcp_failover_listen (omapi_object_t *h)
|
||||
{
|
||||
isc_result_t status;
|
||||
dhcp_failover_listener_object_t *obj;
|
||||
dhcp_failover_listener_t *obj;
|
||||
unsigned long port;
|
||||
omapi_value_t *value = (omapi_value_t *)0;
|
||||
|
||||
@ -592,19 +615,23 @@ isc_result_t dhcp_failover_listen (omapi_object_t *h);
|
||||
"local-port", &value);
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
if (!value -> value) {
|
||||
omapi_value_dereference (&value, "dhcp_failover_listen");
|
||||
return ISC_R_INVALIDARG;
|
||||
}
|
||||
|
||||
status = omapi_get_int_value (&port, value);
|
||||
omapi_typed_data_dereference (&value, "dhcp_failover_listen");
|
||||
status = omapi_get_int_value (&port, value -> value);
|
||||
omapi_value_dereference (&value, "dhcp_failover_listen");
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
|
||||
obj = (dhcp_failover_listener_object_t *)malloc (sizeof *obj);
|
||||
obj = (dhcp_failover_listener_t *)malloc (sizeof *obj);
|
||||
if (!obj)
|
||||
return ISC_R_NOMEMORY;
|
||||
memset (obj, 0, sizeof *obj);
|
||||
obj -> refcnt = 1;
|
||||
obj -> type = dhcp_type_failover_listener;
|
||||
obj -> port = port;
|
||||
obj -> local_port = port;
|
||||
|
||||
status = omapi_listen ((omapi_object_t *)obj, port, 1);
|
||||
omapi_object_dereference ((omapi_object_t **)&obj,
|
||||
@ -638,14 +665,14 @@ isc_result_t dhcp_failover_listener_signal (omapi_object_t *o,
|
||||
{
|
||||
isc_result_t status;
|
||||
omapi_connection_object_t *c;
|
||||
omapi_protocol_object_t *obj;
|
||||
dhcp_failover_listener_object_t *p;
|
||||
dhcp_failover_state_object_t *state;
|
||||
dhcp_failover_link_t *obj;
|
||||
dhcp_failover_listener_t *p;
|
||||
dhcp_failover_state_t *state;
|
||||
char *peer_name;
|
||||
|
||||
if (!o || o -> type != dhcp_type_failover_listener)
|
||||
return ISC_R_INVALIDARG;
|
||||
p = (dhcp_failover_listener_object_t *)o;
|
||||
p = (dhcp_failover_listener_t *)o;
|
||||
|
||||
/* Not a signal we recognize? */
|
||||
if (strcmp (name, "connect")) {
|
||||
@ -661,13 +688,13 @@ isc_result_t dhcp_failover_listener_signal (omapi_object_t *o,
|
||||
|
||||
/* See if we can find a secondary failover_state object that
|
||||
matches this connection. */
|
||||
for (state = states; state; state = state -> next) {
|
||||
for (state = failover_states; state; state = state -> next) {
|
||||
struct hostent *he;
|
||||
int hix;
|
||||
struct in_addr ia;
|
||||
|
||||
if (inet_aton (state -> remote_peer, &ia)) {
|
||||
if (ia == c -> remote_addr.sin_addr)
|
||||
if (ia.s_addr == c -> remote_addr.sin_addr.s_addr)
|
||||
break;
|
||||
} else {
|
||||
he = gethostbyname (state -> remote_peer);
|
||||
@ -695,26 +722,26 @@ isc_result_t dhcp_failover_listener_signal (omapi_object_t *o,
|
||||
return ISC_R_INVALIDARG;
|
||||
}
|
||||
|
||||
obj = (omapi_protocol_object_t *)malloc (sizeof *obj);
|
||||
obj = (dhcp_failover_link_t *)malloc (sizeof *obj);
|
||||
if (!obj)
|
||||
return ISC_R_NOMEMORY;
|
||||
memset (obj, 0, sizeof *obj);
|
||||
obj -> refcnt = 1;
|
||||
obj -> type = omapi_type_protocol;
|
||||
obj -> type = dhcp_type_failover_link;
|
||||
peer_name = malloc (strlen (state -> remote_peer) + 1);
|
||||
if (!peer_name)
|
||||
return ISC_R_NOMEMORY;
|
||||
strcpy (peer_name, state -> remote_peer);
|
||||
obj -> peer_name = peer_name;
|
||||
obj -> port = ntohs (c -> remote_addr.sin_port);
|
||||
obj -> peer_port = ntohs (c -> remote_addr.sin_port);
|
||||
|
||||
status = omapi_object_reference (&obj -> outer, c,
|
||||
status = omapi_object_reference (&obj -> outer, (omapi_object_t *)c,
|
||||
"dhcp_failover_listener_signal");
|
||||
if (status != ISC_R_SUCCESS) {
|
||||
lose:
|
||||
omapi_object_dereference ((omapi_object_t **)&obj,
|
||||
"dhcp_failover_listener_signal");
|
||||
omapi_disconnect (c, 1);
|
||||
omapi_disconnect ((omapi_object_t *)c, 1);
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -725,7 +752,7 @@ isc_result_t dhcp_failover_listener_signal (omapi_object_t *o,
|
||||
|
||||
/* Notify the master state machine of the arrival of a new
|
||||
connection. */
|
||||
status = omapi_signal (state, "connect", obj);
|
||||
status = omapi_signal_in ((omapi_object_t *)state, "connect", obj);
|
||||
if (status != ISC_R_SUCCESS)
|
||||
goto lose;
|
||||
|
||||
@ -790,10 +817,10 @@ isc_result_t dhcp_failover_listener_stuff (omapi_object_t *c,
|
||||
|
||||
/* Set up master state machine for the failover protocol. */
|
||||
|
||||
isc_result_t dhcp_failover_register (omapi_object_t *h);
|
||||
isc_result_t dhcp_failover_register (omapi_object_t *h)
|
||||
{
|
||||
isc_result_t status;
|
||||
dhcp_failover_state_object_t *obj;
|
||||
dhcp_failover_state_t *obj;
|
||||
unsigned long port;
|
||||
omapi_value_t *value = (omapi_value_t *)0;
|
||||
|
||||
@ -801,19 +828,23 @@ isc_result_t dhcp_failover_register (omapi_object_t *h);
|
||||
"local-port", &value);
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
if (!value -> value) {
|
||||
omapi_value_dereference (&value, "dhcp_failover_register");
|
||||
return ISC_R_INVALIDARG;
|
||||
}
|
||||
|
||||
status = omapi_get_int_value (&port, value);
|
||||
omapi_typed_data_dereference (&value, "dhcp_failover_listen");
|
||||
status = omapi_get_int_value (&port, value -> value);
|
||||
omapi_value_dereference (&value, "dhcp_failover_listen");
|
||||
if (status != ISC_R_SUCCESS)
|
||||
return status;
|
||||
|
||||
obj = (dhcp_failover_state_object_t *)malloc (sizeof *obj);
|
||||
obj = (dhcp_failover_state_t *)malloc (sizeof *obj);
|
||||
if (!obj)
|
||||
return ISC_R_NOMEMORY;
|
||||
memset (obj, 0, sizeof *obj);
|
||||
obj -> refcnt = 1;
|
||||
obj -> type = dhcp_type_failover_state;
|
||||
obj -> port = port;
|
||||
obj -> listen_port = port;
|
||||
|
||||
status = omapi_listen ((omapi_object_t *)obj, port, 1);
|
||||
omapi_object_dereference ((omapi_object_t **)&obj,
|
||||
@ -847,25 +878,25 @@ isc_result_t dhcp_failover_state_signal (omapi_object_t *o,
|
||||
isc_result_t status;
|
||||
omapi_connection_object_t *c;
|
||||
omapi_protocol_object_t *obj;
|
||||
dhcp_failover_state_object_t *p;
|
||||
dhcp_failover_state_object_t *state;
|
||||
dhcp_failover_state_t *state;
|
||||
char *peer_name;
|
||||
|
||||
if (!o || o -> type != dhcp_type_failover_state)
|
||||
return ISC_R_INVALIDARG;
|
||||
p = (dhcp_failover_state_object_t *)o;
|
||||
state = (dhcp_failover_state_t *)o;
|
||||
|
||||
/* Not a signal we recognize? */
|
||||
if (strcmp (name, "connect") &&
|
||||
strcmp (name, "disconnect") &&
|
||||
strcmp (name, "message")) {
|
||||
if (p -> inner && p -> inner -> type -> signal_handler)
|
||||
return (*(p -> inner -> type -> signal_handler))
|
||||
(p -> inner, name, ap);
|
||||
if (state -> inner && state -> inner -> type -> signal_handler)
|
||||
return (*(state -> inner -> type -> signal_handler))
|
||||
(state -> inner, name, ap);
|
||||
return ISC_R_NOTFOUND;
|
||||
}
|
||||
|
||||
|
||||
/* Handle all the events we care about... */
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
isc_result_t dhcp_failover_state_set_value (omapi_object_t *h,
|
||||
|
21
server/mdb.c
21
server/mdb.c
@ -22,7 +22,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: mdb.c,v 1.20 1999/11/14 00:32:28 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: mdb.c,v 1.21 1999/11/20 18:36:32 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@ -867,7 +867,7 @@ int supersede_lease (comp, lease, commit)
|
||||
/* Copy the data files, but not the linkages. */
|
||||
comp -> starts = lease -> starts;
|
||||
if (lease -> uid) {
|
||||
if (lease -> uid_len < sizeof (lease -> uid_buf)) {
|
||||
if (lease -> uid_len <= sizeof (lease -> uid_buf)) {
|
||||
memcpy (comp -> uid_buf,
|
||||
lease -> uid, lease -> uid_len);
|
||||
comp -> uid = &comp -> uid_buf [0];
|
||||
@ -948,9 +948,9 @@ int supersede_lease (comp, lease, commit)
|
||||
break;
|
||||
if (lp && lp -> on_expiry) {
|
||||
comp -> pool -> next_expiry = lp;
|
||||
if (commit)
|
||||
add_timeout (lp -> ends,
|
||||
pool_timer, lp -> pool);
|
||||
if (commit)
|
||||
add_timeout (lp -> ends,
|
||||
pool_timer, lp -> pool);
|
||||
} else {
|
||||
comp -> pool -> next_expiry = (struct lease *)0;
|
||||
if (commit)
|
||||
@ -1096,22 +1096,13 @@ void release_lease (lease, packet)
|
||||
#endif
|
||||
|
||||
/* If there are statements to execute when the lease is
|
||||
committed, execute them. */
|
||||
released, execute them. */
|
||||
if (lease -> on_release) {
|
||||
execute_statements (packet, lease, packet -> options,
|
||||
(struct option_state *)0, /* XXX */
|
||||
lease -> on_release);
|
||||
executable_statement_dereference (&lease -> on_release,
|
||||
"dhcprelease");
|
||||
|
||||
if (lease -> ddns_fwd_name) {
|
||||
dfree (lease -> ddns_fwd_name, "pool_timer");
|
||||
lease -> ddns_fwd_name = (char *)0;
|
||||
}
|
||||
if (lease -> ddns_rev_name) {
|
||||
dfree (lease -> ddns_rev_name, "pool_timer");
|
||||
lease -> ddns_rev_name = (char *)0;
|
||||
}
|
||||
}
|
||||
|
||||
/* We do either the on_release or the on_expiry events, but
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: omapi.c,v 1.20 1999/11/14 00:39:33 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: omapi.c,v 1.21 1999/11/20 18:36:32 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@ -41,9 +41,11 @@ omapi_object_type_t *dhcp_type_pool;
|
||||
omapi_object_type_t *dhcp_type_shared_network;
|
||||
omapi_object_type_t *dhcp_type_subnet;
|
||||
omapi_object_type_t *dhcp_type_class;
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
omapi_object_type_t *dhcp_type_failover_state;
|
||||
omapi_object_type_t *dhcp_type_failover_link;
|
||||
omapi_object_type_t *dhcp_type_failover_listener;
|
||||
#endif
|
||||
|
||||
void dhcp_db_objects_setup ()
|
||||
{
|
||||
|
129
server/stables.c
129
server/stables.c
@ -22,73 +22,74 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: stables.c,v 1.1 1999/11/14 00:36:51 mellon Exp $ Copyright (c) 1995, 1996, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: stables.c,v 1.2 1999/11/20 18:36:32 mellon Exp $ Copyright (c) 1995, 1996, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
struct failover_option ft_options [] =
|
||||
struct failover_option_info ft_options [] =
|
||||
{
|
||||
{ 0, "unused", FT_UNDEF, 0, 0 },
|
||||
{ 1, "binding-status",
|
||||
FT_UINT8, 1, FM_OFFSET (binding_status) },
|
||||
{ 2, "assigned-IP-address",
|
||||
FT_IPADDR, 1, FM_OFFSET (assigned_addr) },
|
||||
{ 3, "sending-server-IP-address",
|
||||
FT_IPADDR, 1, FM_OFFSET (sending_server) },
|
||||
{ 4, "addresses-transferred",
|
||||
FT_UINT32, 1, FM_OFFSET (addresses_transferred) },
|
||||
{ 5, "client-identifier",
|
||||
FT_BYTES, 0, FM_OFFSET (client_identifier) },
|
||||
{ 6, "client-hardware-address",
|
||||
FT_BYTES, 0, FM_OFFSET (chaddr) },
|
||||
{ 7, "DDNS",
|
||||
FT_DDNS, 1, FM_OFFSET (ddns) },
|
||||
{ 8, "reject-reason",
|
||||
FT_UINT8, 1, FM_OFFSET (reject_reason) },
|
||||
{ 9, "message",
|
||||
FT_TEXT, 0, FM_OFFSET (message) },
|
||||
{ 10, "MCLT",
|
||||
FT_UINT32, 1, FM_OFFSET (mclt) },
|
||||
{ 11, "vendor-class-identifier",
|
||||
FT_BYTES, 0, FM_OFFSET (vendor_class) },
|
||||
{ 12, "undefined", FT_UNDEF, 0, 0 },
|
||||
{ 13, "lease-expiration-time",
|
||||
FT_UINT32, 1, FM_OFFSET (expiry) },
|
||||
{ 14, "potential-expiration-time",
|
||||
FT_UINT32, 1, FM_OFFSET (potential_expiry) },
|
||||
{ 15, "grace-expiration-time",
|
||||
FT_UINT32, 1, FM_OFFSET (grace_expiry) },
|
||||
{ 16, "client-last-transaction-time",
|
||||
FT_UINT32, 1, FM_OFFSET (client_ltt) },
|
||||
{ 17, "start-time-of-state",
|
||||
FT_UINT32, 1, FM_OFFSET (stos) },
|
||||
{ 18, "server-state",
|
||||
FT_UINT8, 1, FM_OFFSET (server_state) },
|
||||
{ 19, "server-flags",
|
||||
FT_UINT8, 1, FM_OFFSET (server_flags) },
|
||||
{ 20, "vendor-specific-options",
|
||||
FT_BYTES, 0, FM_OFFSET (vendor_options) },
|
||||
{ 21, "max-unacked-bndupd",
|
||||
FT_UINT32, 1, FM_OFFSET (max_unacked) },
|
||||
{ 0, "unused", FT_UNDEF, 0, 0, 0 },
|
||||
{ FTO_BINDING_STATUS, "binding-status",
|
||||
FT_UINT8, 1, FM_OFFSET (binding_status), FTB_BINDING_STATUS },
|
||||
{ FTO_ASSIGNED_IP_ADDRESS, "assigned-IP-address",
|
||||
FT_IPADDR, 1, FM_OFFSET (assigned_addr), FTB_ASSIGNED_IP_ADDRESS },
|
||||
{ FTO_SERVER_ADDR, "sending-server-IP-address",
|
||||
FT_IPADDR, 1, FM_OFFSET (sending_server), FTB_SERVER_ADDR },
|
||||
{ FTO_ADDRESSES_TRANSFERRED, "addresses-transferred",
|
||||
FT_UINT32, 1, FM_OFFSET (addresses_transferred),
|
||||
FTB_ADDRESSES_TRANSFERRED },
|
||||
{ FTO_CLIENT_IDENTIFIER, "client-identifier",
|
||||
FT_BYTES, 0, FM_OFFSET (client_identifier), FTB_CLIENT_IDENTIFIER },
|
||||
{ FTO_CLIENT_HARDWARE_ADDRESS, "client-hardware-address",
|
||||
FT_BYTES, 0, FM_OFFSET (chaddr), FTB_CLIENT_HARDWARE_ADDRESS },
|
||||
{ FTO_DDNS, "DDNS",
|
||||
FT_DDNS, 1, FM_OFFSET (ddns), FTB_DDNS },
|
||||
{ FTO_REJECT_REASON, "reject-reason",
|
||||
FT_UINT8, 1, FM_OFFSET (reject_reason), FTB_REJECT_REASON },
|
||||
{ FTO_MESSAGE, "message",
|
||||
FT_TEXT, 0, FM_OFFSET (message), FTB_MESSAGE },
|
||||
{ FTO_MCLT, "MCLT",
|
||||
FT_UINT32, 1, FM_OFFSET (mclt), FTB_MCLT },
|
||||
{ FTO_VENDOR_CLASS, "vendor-class-identifier",
|
||||
FT_BYTES, 0, FM_OFFSET (vendor_class), FTB_VENDOR_CLASS },
|
||||
{ FTO_UNDEFINED, "undefined", FT_UNDEF, 0, 0, FTB_UNDEFINED },
|
||||
{ FTO_LEASE_EXPIRY, "lease-expiration-time",
|
||||
FT_UINT32, 1, FM_OFFSET (expiry), FTB_LEASE_EXPIRY },
|
||||
{ FTO_POTENTIAL_EXPIRY, "potential-expiration-time",
|
||||
FT_UINT32, 1, FM_OFFSET (potential_expiry), FTB_POTENTIAL_EXPIRY },
|
||||
{ FTO_GRACE_EXPIRY, "grace-expiration-time",
|
||||
FT_UINT32, 1, FM_OFFSET (grace_expiry), FTB_GRACE_EXPIRY },
|
||||
{ FTO_CLTT, "client-last-transaction-time",
|
||||
FT_UINT32, 1, FM_OFFSET (client_ltt), FTB_CLTT },
|
||||
{ FTO_STOS, "start-time-of-state",
|
||||
FT_UINT32, 1, FM_OFFSET (stos), FTB_STOS },
|
||||
{ FTO_SERVER_STATE, "server-state",
|
||||
FT_UINT8, 1, FM_OFFSET (server_state), FTB_SERVER_STATE },
|
||||
{ FTO_SERVER_FLAGS, "server-flags",
|
||||
FT_UINT8, 1, FM_OFFSET (server_flags), FTB_SERVER_FLAGS },
|
||||
{ FTO_VENDOR_OPTIONS, "vendor-specific-options",
|
||||
FT_BYTES, 0, FM_OFFSET (vendor_options), FTB_VENDOR_OPTIONS },
|
||||
{ FTO_MAX_UNACKED, "max-unacked-bndupd",
|
||||
FT_UINT32, 1, FM_OFFSET (max_unacked), FTB_MAX_UNACKED },
|
||||
{ 22, "undefined", FT_UNDEF, 0, 0 },
|
||||
{ 23, "receive-timer",
|
||||
FT_UINT32, 1, FM_OFFSET (receive_timer) },
|
||||
{ 24, "hash-bucket-assignment",
|
||||
FT_BYTES, 0, FM_OFFSET (hba) },
|
||||
{ 25, "message-digest",
|
||||
FT_DIGEST, 0, 0 },
|
||||
{ 26, "protocol-version",
|
||||
FT_UINT8, 1, FM_OFFSET (protocol_version) },
|
||||
{ 27, "TLS-request",
|
||||
FT_UINT8, 2, FM_OFFSET (tls_request) },
|
||||
{ 28, "TLS-reply",
|
||||
FT_BYTES, 1, FM_OFFSET (tls_reply ) },
|
||||
{ 29, "client-request-options",
|
||||
FT_BYTES, 0, FM_OFFSET (request_options) },
|
||||
{ 30, "client-reply-options",
|
||||
FT_BYTES, 0, FM_OFFSET (reply_options) }
|
||||
{ FTO_RECEIVE_TIMER, "receive-timer",
|
||||
FT_UINT32, 1, FM_OFFSET (receive_timer), FTB_RECEIVE_TIMER },
|
||||
{ FTO_HBA, "hash-bucket-assignment",
|
||||
FT_BYTES, 0, FM_OFFSET (hba), FTB_HBA },
|
||||
{ FTO_MESSAGE_DIGEST, "message-digest",
|
||||
FT_DIGEST, 0, 0, FTB_MESSAGE_DIGEST },
|
||||
{ FTO_PROTOCOL_VERSION, "protocol-version",
|
||||
FT_UINT8, 1, FM_OFFSET (protocol_version), FTB_PROTOCOL_VERSION },
|
||||
{ FTO_TLS_REQUEST, "TLS-request",
|
||||
FT_UINT8, 2, FM_OFFSET (tls_request), FTB_TLS_REQUEST },
|
||||
{ FTO_TLS_REPLY, "TLS-reply",
|
||||
FT_BYTES, 1, FM_OFFSET (tls_reply ), FTB_TLS_REPLY },
|
||||
{ FTO_REQUEST_OPTIONS, "client-request-options",
|
||||
FT_BYTES, 0, FM_OFFSET (request_options), FTB_REQUEST_OPTIONS },
|
||||
{ FTO_REPLY_OPTIONS, "client-reply-options",
|
||||
FT_BYTES, 0, FM_OFFSET (reply_options), FTB_REPLY_OPTIONS }
|
||||
};
|
||||
|
||||
/* These are really options that make sense for a particular request - if
|
||||
@ -132,6 +133,14 @@ int ft_sizes [] = {
|
||||
0, /* FT_UNDEF */
|
||||
0, /* FT_DIGEST */
|
||||
};
|
||||
|
||||
char *dhcp_flink_state_names [] = {
|
||||
"invalid state 0",
|
||||
"startup",
|
||||
"message length wait",
|
||||
"message wait",
|
||||
"disconnected"
|
||||
};
|
||||
#endif /* FAILOVER_PROTOCOL */
|
||||
|
||||
struct universe agent_universe;
|
||||
|
Loading…
x
Reference in New Issue
Block a user