Commit ba712666 authored by Michael Gilbert's avatar Michael Gilbert

import upstream version 4.3.0b1

parent 79118632
Internet Systems Consortium DHCP Distribution
Version 4.3.0
3 February 2014
Version 4.3.1b1
8 July 2014
README FILE
......@@ -99,7 +99,7 @@ directory, it may not have up-to-date information).
RELEASE STATUS
This is ISC DHCP 4.3.0. The major theme for this release is "ipv6 uplift",
This is ISC DHCP 4.3.x The major theme for this release is "ipv6 uplift",
in which we enhance the v6 code to support many of the features found
in the v4 code. These include: support for v6, support for on_commit,
on_expiry and on_release in v6, support for accessing v6 relay options
......@@ -141,12 +141,12 @@ information. On Digital Unix, type ``man pfilt''.
To build the DHCP Distribution, unpack the compressed tar file using
the tar utility and the gzip command - type something like:
gunzip dhcp-4.3.0.tar.gz
tar xvf dhcp-4.3.0.tar
gunzip dhcp-4.3.1b1.tar.gz
tar xvf dhcp-4.3.1b1.tar
CONFIGURING IT
Now, cd to the dhcp-4.3.0 subdirectory that you've just created and
Now, cd to the dhcp-4.3.1b1 subdirectory that you've just created and
configure the source tree by typing:
./configure
......
This diff is collapsed.
No preview for this file type
......@@ -8,6 +8,6 @@ DESCRIPTION="(Extended Support Version)"
MAJORVER=9
MINORVER=9
PATCHVER=5
RELEASETYPE=
RELEASEVER=
RELEASETYPE=-P
RELEASEVER=1
EXTENSIONS=
# We want to build this directory first, before descending into tests subdir.
# The reason is that ideally the tests should link existing objects from this
# directory. That eliminates any discrepancies between tested code and
# production code. Sadly, we are not there yet.
SUBDIRS = . tests
dist_sysconf_DATA = dhclient.conf.example
sbin_PROGRAMS = dhclient
dhclient_SOURCES = clparse.c dhclient.c dhc6.c \
......
......@@ -244,6 +244,45 @@ int read_client_conf_file (const char *name, struct interface_info *ip,
}
/* lease-file :== client-lease-statements END_OF_FILE
client-lease-statements :== <nil>
| client-lease-statements LEASE client-lease-statement
* This routine looks through a lease file and only tries to parse
* the duid statements.
*/
void read_client_duid ()
{
int file;
isc_result_t status;
struct parse *cfile;
const char *val;
int token;
/* Open the lease file. If we can't open it, just return -
we can safely trust the server to remember our state. */
if ((file = open (path_dhclient_duid, O_RDONLY)) < 0)
return;
cfile = NULL;
status = new_parse(&cfile, file, NULL, 0, path_dhclient_duid, 0);
if (status != ISC_R_SUCCESS || cfile == NULL)
return;
while ((token = next_token(&val, NULL, cfile)) != END_OF_FILE) {
/*
* All we care about is DUIDs - if we get anything else
* just toss it and continue looking for DUIDs until we
* run out of file.
*/
if (token == DEFAULT_DUID) {
parse_client_default_duid(cfile);
}
}
end_parse(&cfile);
}
/* lease-file :== client-lease-statements END_OF_FILE
client-lease-statements :== <nil>
| client-lease-statements LEASE client-lease-statement */
......
/* dhc6.c - DHCPv6 client routines. */
/*
* Copyright (c) 2012-2013 by Internet Systems Consortium, Inc. ("ISC")
* Copyright (c) 2012-2014 by Internet Systems Consortium, Inc. ("ISC")
* Copyright (c) 2006-2010 by Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and distribute this software for any
......@@ -300,7 +300,7 @@ dhc6_retrans_init(struct client_state *client)
static void
dhc6_retrans_advance(struct client_state *client)
{
struct timeval elapsed;
struct timeval elapsed, elapsed_plus_rt;
/* elapsed = cur - start */
elapsed.tv_sec = cur_tv.tv_sec - client->start_time.tv_sec;
......@@ -317,6 +317,12 @@ dhc6_retrans_advance(struct client_state *client)
elapsed.tv_sec += 1;
elapsed.tv_usec -= 1000000;
}
/*
* Save what the time will be after the current RT to determine
* what the delta to MRD will be.
*/
elapsed_plus_rt.tv_sec = elapsed.tv_sec;
elapsed_plus_rt.tv_usec = elapsed.tv_usec;
/*
* RT for each subsequent message transmission is based on the previous
......@@ -355,12 +361,16 @@ dhc6_retrans_advance(struct client_state *client)
}
if (elapsed.tv_sec >= client->MRD) {
/*
* wake at RT + cur = start + MRD
* The desired RT is the time that will be remaining in MRD
* when the current timeout finishes. We then have
* desired RT = MRD - (elapsed time + previous RT); or
* desired RT = MRD - elapsed_plut_rt;
*/
client->RT = client->MRD +
(client->start_time.tv_sec - cur_tv.tv_sec);
client->RT = client->RT * 100 +
(client->start_time.tv_usec - cur_tv.tv_usec) / 10000;
client->RT = client->MRD - elapsed_plus_rt.tv_sec;
client->RT = (client->RT * 100) -
(elapsed_plus_rt.tv_usec / 10000);
if (client->RT < 0)
client->RT = 0;
}
client->txcount++;
}
......@@ -1437,7 +1447,7 @@ check_timing6 (struct client_state *client, u_int8_t msg_type,
}
/* Check if finished (-1 argument). */
if ((client->MRD != 0) && (elapsed.tv_sec > client->MRD)) {
if ((client->MRD != 0) && (elapsed.tv_sec >= client->MRD)) {
log_info("Max retransmission duration exceeded.");
return(CHK_TIM_MRD_EXCEEDED);
}
......@@ -3841,11 +3851,8 @@ dhc6_marshall_values(const char *prefix, struct client_state *client,
piaddr(addr->address),
(unsigned) addr->plen);
} else {
/* Current practice is that all subnets are /64's, but
* some suspect this may not be permanent.
*/
client_envadd(client, prefix, "ip6_prefixlen",
"%d", 64);
"%d", DHCLIENT_DEFAULT_PREFIX_LEN);
client_envadd(client, prefix, "ip6_address",
"%s", piaddr(addr->address));
}
......
......@@ -73,6 +73,10 @@ dhclient - Dynamic Host Configuration Protocol Client
.B -d
]
[
.B -df
.I duid-lease-file
]
[
.B -e
.I VAR=value
]
......@@ -391,6 +395,16 @@ Path to the client configuration file. If unspecified, the default
.B ETCDIR/dhclient.conf
is used. See \fBdhclient.conf(5)\fR for a description of this file.
.TP
.BI \-df \ duid-lease-file
Path to a secondary lease file. If the primary lease file doesn't contain
a DUID this file will be searched. The DUID read from the secondary will
be written to the primary. This option can be used to allow an IPv4 instance
of the client to share a DUID with an IPv6 instance. After starting one of
the instances the second can be started with this option pointing to the
lease file of the first instance. There is no default. If no file is
specified no search is made for a DUID should one not be found in the main
lease file.
.TP
.BI \-lf \ lease-file
Path to the lease database file. If unspecified, the default
.B DBDIR/dhclient.leases
......
This diff is collapsed.
Content-Type: application/X-atf-atffile; version="1"
prop: test-suite = dhcp4
tp-glob: *_unittests
SUBDIRS = .
AM_CPPFLAGS = $(ATF_CFLAGS) -DUNIT_TEST -I$(top_srcdir)/includes
AM_CPPFLAGS += -I$(top_srcdir)/bind/include -I$(top_srcdir)
AM_CPPFLAGS += -DLOCALSTATEDIR='"."'
AM_CPPFLAGS += -DCLIENT_PATH='"."'
EXTRA_DIST = Atffile duid0_test.txt duid1_test.txt duid2_test.txt duid3_test.txt
# for autotools debugging only
info:
@echo "ATF_CFLAGS=$(ATF_CFLAGS)"
@echo "ATF_LDFLAGS=$(ATF_LDFLAGS)"
@echo "ATF_LIBS=$(ATF_LIBS)"
DHCPSRC = ../clparse.c ../dhc6.c ../dhclient.c
DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a \
$(top_builddir)/dhcpctl/libdhcpctl.a $(top_builddir)/bind/lib/libirs.a \
$(top_builddir)/bind/lib/libdns.a $(top_builddir)/bind/lib/libisccfg.a \
$(top_builddir)/bind/lib/libisc.a
ATF_TESTS =
TESTS =
if HAVE_ATF
check: $(ATF_TESTS)
atf-run | atf-report
ATF_TESTS += duid_unittests
duid_unittests_SOURCES = $(DHCPSRC)
duid_unittests_SOURCES += duid_unittest.c
duid_unittests_LDADD = $(ATF_LDFLAGS)
duid_unittests_LDADD += $(DHCPLIBS)
endif
check_PROGRAMS = $(ATF_TESTS) $(TESTS)
lease {
interface "em1";
fixed-address 172.16.132.152;
option subnet-mask 255.255.255.0;
option dhcp-lease-time 60;
option routers 17.132.16.200;
option dhcp-message-type 5;
option dhcp-server-identifier 172.16.132.200;
option dhcp-renewal-time 30;
option dhcp-rebinding-time 45;
option domain-name "example.org";
renew 2 2014/05/13 23:11:53;
rebind 2 2014/05/13 23:11:53;
expire 2 2014/05/13 23:11:53;
}
default-duid "\000\001";
lease6 {
interface "em1";
ia-na 56:32:02:02 {
starts 1399436400;
renew 3;
rebind 15;
iaaddr 2000::37a {
starts 1399436400;
preferred-life 18;
max-life 30;
}
}
option dhcp6.client-id 0:1:0:1:1a:1:2d:7c:0:50:56:32:2:2;
option dhcp6.server-id 0:1:0:1:19:fd:aa:20:0:50:56:2f:de:8a;
option dhcp6.name-servers 2000::2;
}
default-duid "\000\001\000\001\001\002\003\004\005\006\007\010\011\012";
default-duid "\000\003\000\001\005\006\007\010\011\012";
lease {
interface "em1";
fixed-address 172.16.132.152;
option subnet-mask 255.255.255.0;
option dhcp-lease-time 60;
option routers 17.132.16.200;
option dhcp-message-type 5;
option dhcp-server-identifier 172.16.132.200;
option dhcp-renewal-time 30;
option dhcp-rebinding-time 45;
option domain-name "example.org";
renew 2 2014/05/13 22:11:53;
rebind 2 2014/05/13 22:11:53;
expire 2 2014/05/13 22:11:53;
}
lease {
interface "em1";
fixed-address 172.16.132.152;
option subnet-mask 255.255.255.0;
option dhcp-lease-time 60;
option routers 17.132.16.200;
option dhcp-message-type 5;
option dhcp-server-identifier 172.16.132.200;
option dhcp-renewal-time 30;
option dhcp-rebinding-time 45;
option domain-name "example.org";
foooo;
}
lease {
interface "em1";
fixed-address 172.16.132.152;
option subnet-mask 255.255.255.0;
option dhcp-lease-time 60;
option routers 17.132.16.200;
option dhcp-message-type 5;
option dhcp-server-identifier 172.16.132.200;
option dhcp-renewal-time 30;
option dhcp-rebinding-time 45;
option domain-name "example.org";
renew 2 2014/05/13 23:11:53;
rebind 2 2014/05/13 23:11:53;
expire 2 2014/05/13 23:11:53;
}
lease6 {
interface "em1";
ia-na 56:32:02:02 {
starts 1399436400;
renew 3;
rebind 15;
iaaddr 2000::37a {
starts 1399436400;
preferred-life 18;
max-life 30;
}
}
option dhcp6.client-id 0:1:0:1:1a:1:2d:7c:0:50:56:32:2:2;
option dhcp6.server-id 0:1:0:1:19:fd:aa:20:0:50:56:2f:de:8a;
option dhcp6.name-servers 2000::2;
}
default-duid "\000\003\000\001\017\020\021\022\023\024";
default-duid "\000\003\000\001\005\006\007\010\011\012";
lease {
interface "em1";
fixed-address 172.16.132.152;
option subnet-mask 255.255.255.0;
option dhcp-lease-time 60;
option routers 17.132.16.200;
option dhcp-message-type 5;
option dhcp-server-identifier 172.16.132.200;
option dhcp-renewal-time 30;
option dhcp-rebinding-time 45;
option domain-name "example.org";
renew 2 2014/05/13 22:11:53;
rebind 2 2014/05/13 22:11:53;
expire 2 2014/05/13 22:11:53;
}
lease {
interface "em1";
fixed-address 172.16.132.152;
option subnet-mask 255.255.255.0;
option dhcp-lease-time 60;
option routers 17.132.16.200;
option dhcp-message-type 5;
option dhcp-server-identifier 172.16.132.200;
option dhcp-renewal-time 30;
option dhcp-rebinding-time 45;
option domain-name "example.org";
lease {
interface "em1";
fixed-address 172.16.132.152;
option subnet-mask 255.255.255.0;
option dhcp-lease-time 60;
option routers 17.132.16.200;
option dhcp-message-type 5;
option dhcp-server-identifier 172.16.132.200;
option dhcp-renewal-time 30;
option dhcp-rebinding-time 45;
option domain-name "example.org";
renew 2 2014/05/13 23:11:53;
rebind 2 2014/05/13 23:11:53;
expire 2 2014/05/13 23:11:53;
}
default-duid "\000\001";
lease6 {
interface "em1";
ia-na 56:32:02:02 {
starts 1399436400;
renew 3;
rebind 15;
iaaddr 2000::37a {
starts 1399436400;
preferred-life 18;
max-life 30;
}
}
option dhcp6.client-id 0:1:0:1:1a:1:2d:7c:0:50:56:32:2:2;
option dhcp6.server-id 0:1:0:1:19:fd:aa:20:0:50:56:2f:de:8a;
option dhcp6.name-servers 2000::2;
}
default-duid "\000\001\000\001\025\026\027\030\031\032\033\034\035\036";
/*
* Copyright (c) 2014 by Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Internet Systems Consortium, Inc.
* 950 Charter Street
* Redwood City, CA 94063
* <info@isc.org>
* https://www.isc.org/
*
*/
#include "config.h"
#include <atf-c.h>
#include <omapip/omapip_p.h>
#include "dhcpd.h"
/* Tests to see if the routine to read a secondary lease file
* for the DUID works properly. The tests:
* Test file x:
* no test file - should result in no duid
* Test filx 0:
* A test file but no DUID def, no duid
* Test file 1:
* Can it read a single DUID in the file?
* Test file 2:
* Can it find a second DUID in the file after a good lease and
* a badly formatted lease?
* Test file 3:
* Can it find a later DUID after a good one and a bad one?
* and to give a bit more coverage test file 1 should use LLT
* test file 2 should use LL and test file 3 should use LL for
* the first one and LLT for the third one.
*/
int duidx_len = 0;
int duid0_len = 0;
int duid1_len = 14;
char duid1_data[] = {0, 1, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int duid2_len = 10;
char duid2_data[] = {0, 3, 0, 1, 15, 16, 17, 18, 19, 20};
int duid3_len = 14;
char duid3_data[] = {0, 1, 0, 1, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30};
ATF_TC(read_duid_test);
ATF_TC_HEAD(read_duid_test, tc) {
atf_tc_set_md_var(tc, "descr", "read secondary file looking for duid");
}
ATF_TC_BODY(read_duid_test, tc) {
static const char *srcdir;
char duid_fname[1024];
/* Get the srcidr so we can find our test files */
if (atf_tc_has_config_var(tc, "srcdir"))
srcdir = atf_tc_get_config_var(tc, "srcdir");
/* point the duid file at our filename space
We will update it per test below */
path_dhclient_duid = duid_fname;
/* Initialize client globals. */
memset(&default_duid, 0, sizeof(default_duid));
/* Try to read a nonexistent test file
*/
sprintf(duid_fname, "%s/duidx_test.txt", srcdir);
read_client_duid();
if (default_duid.len != duidx_len) {
atf_tc_fail("failed to properly read duid1");
}
/* Try to read test file 0
* This doesn't have a DUID.
*/
sprintf(duid_fname, "%s/duid0_test.txt", srcdir);
read_client_duid();
if (default_duid.len != duid0_len) {
atf_tc_fail("failed to properly read duid0");
}
/* Try to read test file 1
* This has a single good LLT DUID in it
*/
sprintf(duid_fname, "%s/duid1_test.txt", srcdir);
read_client_duid();
if ((default_duid.len != duid1_len) ||
(memcmp(default_duid.data, duid1_data, duid1_len) != 0)) {
atf_tc_fail("failed to properly read duid1");
}
/* Try to read test file 2
* This has two good LL DUIDs in it with several good and bad leases between them.
*/
sprintf(duid_fname, "%s/duid2_test.txt", srcdir);
read_client_duid();
if ((default_duid.len != duid2_len) ||
(memcmp(default_duid.data, duid2_data, duid2_len) != 0)) {
atf_tc_fail("failed to properly read duid2");
}
/* Try to read test file 3
* This has a good LL DUID, a bad LLT DUID and a good LLT DUID
*/
sprintf(duid_fname, "%s/duid3_test.txt", srcdir);
read_client_duid();
if ((default_duid.len != duid3_len) ||
(memcmp(default_duid.data, duid3_data, duid3_len) != 0)) {
atf_tc_fail("failed to properly read duid3");
}
}
ATF_TP_ADD_TCS(tp) {
ATF_TP_ADD_TC(tp, read_duid_test);
return (atf_no_error());
}
......@@ -578,6 +578,9 @@ get_hw_addr(const char *name, struct hardware *hw) {
*/
switch (sa->sdl_type) {
case IFT_ETHER:
#if defined (IFT_L2VLAN)
case IFT_L2VLAN:
#endif
hw->hlen = sa->sdl_alen + 1;
hw->hbuf[0] = HTYPE_ETHER;
memcpy(&hw->hbuf[1], LLADDR(sa), sa->sdl_alen);
......
......@@ -888,6 +888,9 @@ intern(char *atom, enum dhcp_token dfv) {
if (!strcasecmp(atom + 7, "list"))
return DOMAIN_LIST;
}
if (!strcasecmp (atom + 1, "o-forward-updates"))
return DO_FORWARD_UPDATE;
/* do-forward-update is included for historical reasons */
if (!strcasecmp (atom + 1, "o-forward-update"))
return DO_FORWARD_UPDATE;
if (!strcasecmp (atom + 1, "ebug"))
......
......@@ -34,11 +34,15 @@ the ability to perform conditional behavior depending on the contents
of packets they receive. The syntax for specifying this conditional
behaviour is documented here.
.SH REFERENCE: CONDITIONAL BEHAVIOUR
Conditional behaviour is specified using the if statement and the else
or elsif statements. A conditional statement can appear anywhere
Conditional behaviour may be specified using the if statement and the else
or elsif statements or the switch and case statements.
A conditional statement can appear anywhere
that a regular statement (e.g., an option statement) can appear, and
can enclose one or more such statements. A typical conditional
statement in a server might be:
can enclose one or more such statements.
.PP
.B CONDITIONAL BEHAVIOUR: IF
.PP
A typical conditional if statement in a server might be:
.PP
.nf
if option dhcp-user-class = "accounting" {
......@@ -108,6 +112,53 @@ clause, the statements enclosed in braces following the
.B else
are evaluated. Boolean expressions that evaluate to null are
treated as false in conditionals.
.PP
.B CONDITIONAL BEHAVIOUR: SWITCH
.PP
The above example can be rewritten using a switch construct as well.
.PP
.nf
switch (option dhcp-user-class) {
case "accounting":
max-lease-time 17600;
option domain-name "accounting.example.org";
option domain-name-servers ns1.accounting.example.org,
ns2.accounting.example.org;
case "sales":
max-lease-time 17600;
option domain-name "sales.example.org";
option domain-name-servers ns1.sales.example.org,
ns2.sales.example.org;
break;
case "engineering":
max-lease-time 17600;
option domain-name "engineering.example.org";
option domain-name-servers ns1.engineering.example.org,
ns2.engineering.example.org;
break;
default:
max-lease-time 600;
option domain-name "misc.example.org";
option domain-name-servers ns1.misc.example.org,
ns2.misc.example.org;
break;
}
.fi
.PP
The
.B switch
statement and the
.B case
statements can both be data expressions or numeric expressions. Within
a switch statement they all must be the same type. The server
evaluates the expression from the switch statement and then it evaluates
the expressions from the case statements until it finds a match.
.PP
If it finds a match it starts executing statements from that case
until the next break statement. If it doesn't find a match it
starts from the default statement and again proceeds to the next
break statement. If there is no match and no default it does nothing.
.PP
.SH BOOLEAN EXPRESSIONS
The following is the current list of boolean expressions that are
supported by the DHCP distribution.
......@@ -384,6 +435,20 @@ general, the maximum size of such an integer should not be assumed to
be representable in fewer than 32 bits, but the precision of such
integers may be more than 32 bits.
.PP
In addition to the following operators several standard math functions
are available. They are:
.nf
operation symbol
add \fB+\fR
subtract \fB-\fR
divide \fB/\fR
multiply \fB*\fR
modulus \fB%\fR
bitwise and \fB&\fR
bitwise or \fB|\fR
bitwise xor \fB^\fR
.fi
.PP
.B extract-int (\fIdata-expr\fB, \fIwidth\fB)\fR
.PP
.RS 0.25i
......
......@@ -177,6 +177,16 @@ some subnets of the directly connected network may have smaller MTUs.
This option specifies the timeout in seconds for ARP cache entries.
.RE
.PP
.B option \fBassociated-ip\fR \fIip-address\fR [\fB,\fR
\fIip-address\fR... ]\fB;\fR
.RS 0.25i
.PP
This option is part of lease query. It is used to
return all of the IP addresses associated with a given DHCP client.
.PP
This option is not user configurable.
.RE
.PP
.B option \fBbcms-controller-address\fR \fIip-address\fR [\fB,\fR
\fIip-address\fR... ]\fB;\fR
.RS 0.25i
......@@ -230,6 +240,17 @@ The addresses are listed in preference order.
This option is included based on RFC 5417.
.RE
.PP
.B option \fBclient-last-transaction-time\fR \fIuint32\fR\fB;\fR
.RS 0.25i
.PP
This option is part of lease query. It allows the
receiver to determine the time of the most recent access by the
client. The value is a duration in seconds from when the client
last communicated with the DHCP server.
.PP
This option is not user configurable.
.RE
.PP
.B option \fBcookie-servers\fR \fIip-address\fR [\fB,\fR \fIip-address\fR...
]\fB;\fR
.RS 0.25i
......@@ -361,8 +382,8 @@ This option is not user configurable.
.PP
.RE
.PP
.B option \fBdhcp-parameter-request-list\fR \fIuint16\fR [\fB,\fR
\fIuint16\fR... ]\fB;\fR
.B option \fBdhcp-parameter-request-list\fR \fIuint8\fR [\fB,\fR
\fIuint8\fR... ]\fB;\fR
.RS 0.25i
.PP
This option, when sent by the client, specifies which options the
......@@ -1026,7 +1047,7 @@ assigned will override the subnet mask specified in the subnet
declaration.
.RE
.PP
.B option \fBsubnet-selection\fR \fIstring\fR\fB;\fR
.B option \fBsubnet-selection\fR \fIip-address\fR\fB;\fR
.RS 0.25i
.PP
Sent by the client if an address is required in a subnet other than the one
......@@ -1771,7 +1792,7 @@ have some vendor-specific structure (similar to VSIO), but we have chosen
to treat this option as an opaque field.
.RE
.PP
.B option \fBdhcp6.subscriber-id\fR\fB;\fR
.B option \fBdhcp6.subscriber-id\fR \fIstring\fR\fB;\fR
.RS 0.25i
.PP
The \fBsubscriber-id\fR option is an opaque field provided by the relay agent,
......
......@@ -29,6 +29,9 @@
#include "dhcpd.h"
/* length of line we can read from the IF file, 256 is too small in some cases */
#define IF_LINE_LENGTH 1024
#define BSD_COMP /* needed on Solaris for SIOCGLIFNUM */
#include <sys/ioctl.h>
#include <errno.h>
......@@ -408,7 +411,7 @@ struct iface_info {
*/
int
begin_iface_scan(struct iface_conf_list *ifaces) {