Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ISC Open Source Projects
Kea
Commits
30a20ce2
Commit
30a20ce2
authored
Mar 26, 2014
by
Marcin Siodelski
Browse files
[3281] DHCPv4 configuration parser sets the subnet id specified by user.
parent
17282104
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/bin/dhcp4/config_parser.cc
View file @
30a20ce2
...
...
@@ -201,7 +201,8 @@ protected:
DhcpConfigParser
*
parser
=
NULL
;
if
((
config_id
.
compare
(
"valid-lifetime"
)
==
0
)
||
(
config_id
.
compare
(
"renew-timer"
)
==
0
)
||
(
config_id
.
compare
(
"rebind-timer"
)
==
0
))
{
(
config_id
.
compare
(
"rebind-timer"
)
==
0
)
||
(
config_id
.
compare
(
"id"
)
==
0
))
{
parser
=
new
Uint32Parser
(
config_id
,
uint32_values_
);
}
else
if
((
config_id
.
compare
(
"subnet"
)
==
0
)
||
(
config_id
.
compare
(
"interface"
)
==
0
)
||
...
...
@@ -271,6 +272,10 @@ protected:
Triplet
<
uint32_t
>
t1
=
getParam
(
"renew-timer"
);
Triplet
<
uint32_t
>
t2
=
getParam
(
"rebind-timer"
);
Triplet
<
uint32_t
>
valid
=
getParam
(
"valid-lifetime"
);
// Subnet ID is optional. If it is not supplied the value of 0 is used,
// which means autogenerate.
SubnetID
subnet_id
=
static_cast
<
SubnetID
>
(
uint32_values_
->
getOptionalParam
(
"id"
,
0
));
stringstream
tmp
;
tmp
<<
addr
<<
"/"
<<
(
int
)
len
...
...
@@ -278,7 +283,7 @@ protected:
LOG_INFO
(
dhcp4_logger
,
DHCP4_CONFIG_NEW_SUBNET
).
arg
(
tmp
.
str
());
Subnet4Ptr
subnet4
(
new
Subnet4
(
addr
,
len
,
t1
,
t2
,
valid
));
Subnet4Ptr
subnet4
(
new
Subnet4
(
addr
,
len
,
t1
,
t2
,
valid
,
subnet_id
));
subnet_
=
subnet4
;
// Try global value first
...
...
src/bin/dhcp4/dhcp4.spec
View file @
30a20ce2
...
...
@@ -213,6 +213,12 @@
"item_default": ""
},
{ "item_name": "id",
"item_type": "integer",
"item_optional": false,
"item_default": 0
},
{ "item_name": "renew-timer",
"item_type": "integer",
"item_optional": false,
...
...
src/bin/dhcp4/tests/config_parser_unittest.cc
View file @
30a20ce2
...
...
@@ -550,6 +550,8 @@ TEST_F(Dhcp4ParserTest, subnetGlobalDefaults) {
// multiple times.
TEST_F
(
Dhcp4ParserTest
,
multipleSubnets
)
{
ConstElementPtr
x
;
// Collection of four subnets for which subnet ids should be
// autogenerated - ids are unspecified or set to 0.
string
config
=
"{
\"
interfaces
\"
: [
\"
*
\"
],"
"
\"
rebind-timer
\"
: 2000, "
"
\"
renew-timer
\"
: 1000, "
...
...
@@ -559,7 +561,8 @@ TEST_F(Dhcp4ParserTest, multipleSubnets) {
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.3.101 - 192.0.3.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.3.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.3.0/24
\"
, "
"
\"
id
\"
: 0 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.4.101 - 192.0.4.150
\"
],"
...
...
@@ -605,6 +608,106 @@ TEST_F(Dhcp4ParserTest, multipleSubnets) {
}
while
(
++
cnt
<
10
);
}
// This test checks that it is possible to assign arbitrary ids for subnets.
TEST_F
(
Dhcp4ParserTest
,
multipleSubnetsExplicitIDs
)
{
ConstElementPtr
x
;
// Collection of four subnets for which subnet ids should be
// autogenerated - ids are unspecified or set to 0.
string
config
=
"{
\"
interfaces
\"
: [
\"
*
\"
],"
"
\"
rebind-timer
\"
: 2000, "
"
\"
renew-timer
\"
: 1000, "
"
\"
subnet4
\"
: [ { "
"
\"
pool
\"
: [
\"
192.0.2.1 - 192.0.2.100
\"
],"
"
\"
subnet
\"
:
\"
192.0.2.0/24
\"
, "
"
\"
id
\"
: 1024 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.3.101 - 192.0.3.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.3.0/24
\"
, "
"
\"
id
\"
: 100 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.4.101 - 192.0.4.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.4.0/24
\"
, "
"
\"
id
\"
: 1 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.5.101 - 192.0.5.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.5.0/24
\"
, "
"
\"
id
\"
: 34 "
" } ],"
"
\"
valid-lifetime
\"
: 4000 }"
;
ElementPtr
json
=
Element
::
fromJSON
(
config
);
EXPECT_NO_THROW
(
x
=
configureDhcp4Server
(
*
srv_
,
json
));
ASSERT_TRUE
(
x
);
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
int
cnt
=
0
;
// Number of reconfigurations
do
{
ElementPtr
json
=
Element
::
fromJSON
(
config
);
EXPECT_NO_THROW
(
x
=
configureDhcp4Server
(
*
srv_
,
json
));
ASSERT_TRUE
(
x
);
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
const
Subnet4Collection
*
subnets
=
CfgMgr
::
instance
().
getSubnets4
();
ASSERT_TRUE
(
subnets
);
ASSERT_EQ
(
4
,
subnets
->
size
());
// We expect 4 subnets
// Verify that subnet ids are as expected.
EXPECT_EQ
(
1024
,
subnets
->
at
(
0
)
->
getID
());
EXPECT_EQ
(
100
,
subnets
->
at
(
1
)
->
getID
());
EXPECT_EQ
(
1
,
subnets
->
at
(
2
)
->
getID
());
EXPECT_EQ
(
34
,
subnets
->
at
(
3
)
->
getID
());
// Repeat reconfiguration process 10 times and check that the subnet-id
// is set to the same value.
}
while
(
++
cnt
<
10
);
}
// Check that the configuration with two subnets having the same id is rejected.
TEST_F
(
Dhcp4ParserTest
,
multipleSubnetsOverlapingIDs
)
{
ConstElementPtr
x
;
// Collection of four subnets for which subnet ids should be
// autogenerated - ids are unspecified or set to 0.
string
config
=
"{
\"
interfaces
\"
: [
\"
*
\"
],"
"
\"
rebind-timer
\"
: 2000, "
"
\"
renew-timer
\"
: 1000, "
"
\"
subnet4
\"
: [ { "
"
\"
pool
\"
: [
\"
192.0.2.1 - 192.0.2.100
\"
],"
"
\"
subnet
\"
:
\"
192.0.2.0/24
\"
, "
"
\"
id
\"
: 1024 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.3.101 - 192.0.3.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.3.0/24
\"
, "
"
\"
id
\"
: 100 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.4.101 - 192.0.4.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.4.0/24
\"
, "
"
\"
id
\"
: 1024 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.5.101 - 192.0.5.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.5.0/24
\"
, "
"
\"
id
\"
: 34 "
" } ],"
"
\"
valid-lifetime
\"
: 4000 }"
;
ElementPtr
json
=
Element
::
fromJSON
(
config
);
EXPECT_NO_THROW
(
x
=
configureDhcp4Server
(
*
srv_
,
json
));
ASSERT_TRUE
(
x
);
comment_
=
parseAnswer
(
rcode_
,
x
);
EXPECT_NE
(
rcode_
,
0
);
}
// Goal of this test is to verify that a previously configured subnet can be
// deleted in subsequent reconfiguration.
TEST_F
(
Dhcp4ParserTest
,
reconfigureRemoveSubnet
)
{
...
...
@@ -616,19 +719,23 @@ TEST_F(Dhcp4ParserTest, reconfigureRemoveSubnet) {
"
\"
renew-timer
\"
: 1000, "
"
\"
subnet4
\"
: [ { "
"
\"
pool
\"
: [
\"
192.0.2.1 - 192.0.2.100
\"
],"
"
\"
subnet
\"
:
\"
192.0.2.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.2.0/24
\"
, "
"
\"
id
\"
: 1 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.3.101 - 192.0.3.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.3.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.3.0/24
\"
, "
"
\"
id
\"
: 2 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.4.101 - 192.0.4.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.4.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.4.0/24
\"
, "
"
\"
id
\"
: 3 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.5.101 - 192.0.5.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.5.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.5.0/24
\"
, "
"
\"
id
\"
: 4 "
" } ],"
"
\"
valid-lifetime
\"
: 4000 }"
;
...
...
@@ -638,15 +745,18 @@ TEST_F(Dhcp4ParserTest, reconfigureRemoveSubnet) {
"
\"
renew-timer
\"
: 1000, "
"
\"
subnet4
\"
: [ { "
"
\"
pool
\"
: [
\"
192.0.2.1 - 192.0.2.100
\"
],"
"
\"
subnet
\"
:
\"
192.0.2.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.2.0/24
\"
, "
"
\"
id
\"
: 1 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.3.101 - 192.0.3.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.3.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.3.0/24
\"
, "
"
\"
id
\"
: 2 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.4.101 - 192.0.4.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.4.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.4.0/24
\"
, "
"
\"
id
\"
: 3 "
" } ],"
"
\"
valid-lifetime
\"
: 4000 }"
;
...
...
@@ -656,15 +766,18 @@ TEST_F(Dhcp4ParserTest, reconfigureRemoveSubnet) {
"
\"
renew-timer
\"
: 1000, "
"
\"
subnet4
\"
: [ { "
"
\"
pool
\"
: [
\"
192.0.2.1 - 192.0.2.100
\"
],"
"
\"
subnet
\"
:
\"
192.0.2.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.2.0/24
\"
, "
"
\"
id
\"
: 1 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.4.101 - 192.0.4.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.4.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.4.0/24
\"
, "
"
\"
id
\"
: 3 "
" },"
" {"
"
\"
pool
\"
: [
\"
192.0.5.101 - 192.0.5.150
\"
],"
"
\"
subnet
\"
:
\"
192.0.5.0/24
\"
"
"
\"
subnet
\"
:
\"
192.0.5.0/24
\"
, "
"
\"
id
\"
: 4 "
" } ],"
"
\"
valid-lifetime
\"
: 4000 }"
;
...
...
@@ -700,7 +813,6 @@ TEST_F(Dhcp4ParserTest, reconfigureRemoveSubnet) {
/// CASE 2: Configure 4 subnets, then reconfigure and remove one
/// from in between (not first, not last)
#if 0
/// @todo: Uncomment subnet removal test as part of #3281.
json
=
Element
::
fromJSON
(
config4
);
EXPECT_NO_THROW
(
x
=
configureDhcp4Server
(
*
srv_
,
json
));
...
...
@@ -723,7 +835,6 @@ TEST_F(Dhcp4ParserTest, reconfigureRemoveSubnet) {
// The second subnet (with subnet-id = 2) is no longer there
EXPECT_EQ
(
3
,
subnets
->
at
(
1
)
->
getID
());
EXPECT_EQ
(
4
,
subnets
->
at
(
2
)
->
getID
());
#endif
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment