Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Sebastian Schrader
Kea
Commits
9c9ec6cd
Commit
9c9ec6cd
authored
Feb 03, 2014
by
Tomek Mrugalski
🛰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[3274] Added Classes parameter to getSubnet{4,6} methods.
parent
b7c33a05
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
157 additions
and
98 deletions
+157
-98
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp4/dhcp4_srv.cc
+3
-2
src/bin/dhcp4/tests/config_parser_unittest.cc
src/bin/dhcp4/tests/config_parser_unittest.cc
+40
-19
src/bin/dhcp6/dhcp6_srv.cc
src/bin/dhcp6/dhcp6_srv.cc
+10
-6
src/bin/dhcp6/tests/config_parser_unittest.cc
src/bin/dhcp6/tests/config_parser_unittest.cc
+43
-26
src/lib/dhcpsrv/cfgmgr.cc
src/lib/dhcpsrv/cfgmgr.cc
+8
-4
src/lib/dhcpsrv/cfgmgr.h
src/lib/dhcpsrv/cfgmgr.h
+9
-4
src/lib/dhcpsrv/tests/cfgmgr_unittest.cc
src/lib/dhcpsrv/tests/cfgmgr_unittest.cc
+44
-37
No files found.
src/bin/dhcp4/dhcp4_srv.cc
View file @
9c9ec6cd
...
...
@@ -1508,11 +1508,12 @@ Dhcpv4Srv::selectSubnet(const Pkt4Ptr& question) {
if
(
relay
!=
notset
)
{
// Yes: Use relay address to select subnet
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
relay
);
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
relay
,
question
->
classes_
);
}
else
{
// No: Use client's address to select subnet
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
question
->
getRemoteAddr
());
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
question
->
getRemoteAddr
(),
question
->
classes_
);
}
/// @todo Implement getSubnet4(interface-name)
...
...
src/bin/dhcp4/tests/config_parser_unittest.cc
View file @
9c9ec6cd
...
...
@@ -24,6 +24,7 @@
#include <dhcp/option_custom.h>
#include <dhcp/option_int.h>
#include <dhcp/docsis3_option_defs.h>
#include <dhcp/classify.h>
#include <dhcpsrv/subnet.h>
#include <dhcpsrv/cfgmgr.h>
#include <hooks/hooks_manager.h>
...
...
@@ -231,7 +232,8 @@ public:
getOptionFromSubnet
(
const
IOAddress
&
subnet_address
,
const
uint16_t
option_code
,
const
uint16_t
expected_options_count
=
1
)
{
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
subnet_address
);
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
subnet_address
,
classify_
);
if
(
!
subnet
)
{
/// @todo replace toText() with the use of operator <<.
ADD_FAILURE
()
<<
"A subnet for the specified address "
...
...
@@ -457,6 +459,7 @@ public:
boost
::
scoped_ptr
<
Dhcpv4Srv
>
srv_
;
// DHCP4 server under test
int
rcode_
;
// Return code from element parsing
ConstElementPtr
comment_
;
// Reason for parse fail
isc
::
dhcp
::
Classes
classify_
;
// used in client classification
};
// Goal of this test is a verification if a very simple config update
...
...
@@ -531,7 +534,8 @@ TEST_F(Dhcp4ParserTest, subnetGlobalDefaults) {
// Now check if the configuration was indeed handled and we have
// expected pool configured.
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
1000
,
subnet
->
getT1
());
EXPECT_EQ
(
2000
,
subnet
->
getT2
());
...
...
@@ -749,7 +753,8 @@ TEST_F(Dhcp4ParserTest, nextServerGlobal) {
// Now check if the configuration was indeed handled and we have
// expected pool configured.
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
"1.2.3.4"
,
subnet
->
getSiaddr
().
toText
());
}
...
...
@@ -778,7 +783,8 @@ TEST_F(Dhcp4ParserTest, nextServerSubnet) {
// Now check if the configuration was indeed handled and we have
// expected pool configured.
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
"1.2.3.4"
,
subnet
->
getSiaddr
().
toText
());
}
...
...
@@ -865,7 +871,8 @@ TEST_F(Dhcp4ParserTest, nextServerOverride) {
// Now check if the configuration was indeed handled and we have
// expected pool configured.
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
"1.2.3.4"
,
subnet
->
getSiaddr
().
toText
());
}
...
...
@@ -935,7 +942,8 @@ TEST_F(Dhcp4ParserTest, subnetLocal) {
// returned value should be 0 (configuration success)
checkResult
(
status
,
0
);
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
1
,
subnet
->
getT1
());
EXPECT_EQ
(
2
,
subnet
->
getT2
());
...
...
@@ -987,7 +995,8 @@ TEST_F(Dhcp4ParserTest, poolPrefixLen) {
// returned value must be 0 (configuration accepted)
checkResult
(
status
,
0
);
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
1000
,
subnet
->
getT1
());
EXPECT_EQ
(
2000
,
subnet
->
getT2
());
...
...
@@ -1524,7 +1533,8 @@ TEST_F(Dhcp4ParserTest, optionDataDefaults) {
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
),
classify_
);
ASSERT_TRUE
(
subnet
);
Subnet
::
OptionContainerPtr
options
=
subnet
->
getOptionDescriptors
(
"dhcp4"
);
ASSERT_EQ
(
2
,
options
->
size
());
...
...
@@ -1608,7 +1618,8 @@ TEST_F(Dhcp4ParserTest, optionDataTwoSpaces) {
checkResult
(
status
,
0
);
// Options should be now available for the subnet.
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// Try to get the option from the space dhcp4.
Subnet
::
OptionDescriptor
desc1
=
subnet
->
getOptionDescriptor
(
"dhcp4"
,
56
);
...
...
@@ -1758,7 +1769,8 @@ TEST_F(Dhcp4ParserTest, optionDataEncapsulate) {
checkResult
(
status
,
0
);
// Get the subnet.
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// We should have one option available.
...
...
@@ -1826,7 +1838,8 @@ TEST_F(Dhcp4ParserTest, optionDataInSingleSubnet) {
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.24"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.24"
),
classify_
);
ASSERT_TRUE
(
subnet
);
Subnet
::
OptionContainerPtr
options
=
subnet
->
getOptionDescriptors
(
"dhcp4"
);
ASSERT_EQ
(
2
,
options
->
size
());
...
...
@@ -1978,7 +1991,8 @@ TEST_F(Dhcp4ParserTest, optionDataInMultipleSubnets) {
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
Subnet4Ptr
subnet1
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.100"
));
Subnet4Ptr
subnet1
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.100"
),
classify_
);
ASSERT_TRUE
(
subnet1
);
Subnet
::
OptionContainerPtr
options1
=
subnet1
->
getOptionDescriptors
(
"dhcp4"
);
ASSERT_EQ
(
1
,
options1
->
size
());
...
...
@@ -2002,7 +2016,8 @@ TEST_F(Dhcp4ParserTest, optionDataInMultipleSubnets) {
testOption
(
*
range1
.
first
,
56
,
foo_expected
,
sizeof
(
foo_expected
));
// Test another subnet in the same way.
Subnet4Ptr
subnet2
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.3.102"
));
Subnet4Ptr
subnet2
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.3.102"
),
classify_
);
ASSERT_TRUE
(
subnet2
);
Subnet
::
OptionContainerPtr
options2
=
subnet2
->
getOptionDescriptors
(
"dhcp4"
);
ASSERT_EQ
(
1
,
options2
->
size
());
...
...
@@ -2081,7 +2096,8 @@ TEST_F(Dhcp4ParserTest, optionDataLowerCase) {
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
Subnet
::
OptionContainerPtr
options
=
subnet
->
getOptionDescriptors
(
"dhcp4"
);
ASSERT_EQ
(
1
,
options
->
size
());
...
...
@@ -2125,7 +2141,8 @@ TEST_F(Dhcp4ParserTest, stdOptionData) {
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
Subnet
::
OptionContainerPtr
options
=
subnet
->
getOptionDescriptors
(
"dhcp4"
);
...
...
@@ -2327,7 +2344,8 @@ TEST_F(Dhcp4ParserTest, stdOptionDataEncapsulate) {
checkResult
(
status
,
0
);
// Get the subnet.
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// We should have one option available.
...
...
@@ -2409,7 +2427,8 @@ TEST_F(Dhcp4ParserTest, vendorOptionsHex) {
checkResult
(
status
,
0
);
// Options should be now available for the subnet.
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// Try to get the option from the vendor space 4491
...
...
@@ -2468,7 +2487,8 @@ TEST_F(Dhcp4ParserTest, vendorOptionsCsv) {
checkResult
(
status
,
0
);
// Options should be now available for the subnet.
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// Try to get the option from the vendor space 4491
...
...
@@ -2827,7 +2847,8 @@ TEST_F(Dhcp4ParserTest, subnetRelayInfo) {
// returned value should be 0 (configuration success)
checkResult
(
status
,
0
);
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
));
Subnet4Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet4
(
IOAddress
(
"192.0.2.200"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
"192.0.2.123"
,
subnet
->
relay_
.
addr_
.
toText
());
}
...
...
src/bin/dhcp6/dhcp6_srv.cc
View file @
9c9ec6cd
...
...
@@ -863,10 +863,12 @@ Dhcpv6Srv::selectSubnet(const Pkt6Ptr& question) {
// This is a direct (non-relayed) message
// Try to find a subnet if received packet from a directly connected client
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
question
->
getIface
());
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
question
->
getIface
(),
question
->
classes_
);
if
(
!
subnet
)
{
// If no subnet was found, try to find it based on remote address
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
question
->
getRemoteAddr
());
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
question
->
getRemoteAddr
(),
question
->
classes_
);
}
}
else
{
...
...
@@ -874,17 +876,19 @@ Dhcpv6Srv::selectSubnet(const Pkt6Ptr& question) {
OptionPtr
interface_id
=
question
->
getAnyRelayOption
(
D6O_INTERFACE_ID
,
Pkt6
::
RELAY_GET_FIRST
);
if
(
interface_id
)
{
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
interface_id
);
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
interface_id
,
question
->
classes_
);
}
if
(
!
subnet
)
{
// If no interface-id was specified (or not configured on server),
let's
// try address matching
// If no interface-id was specified (or not configured on server),
//
let's
try address matching
IOAddress
link_addr
=
question
->
relay_info_
.
back
().
linkaddr_
;
// if relay filled in link_addr field, then let's use it
if
(
link_addr
!=
IOAddress
(
"::"
))
{
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
link_addr
);
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
link_addr
,
question
->
classes_
);
}
}
}
...
...
src/bin/dhcp6/tests/config_parser_unittest.cc
View file @
9c9ec6cd
...
...
@@ -244,7 +244,8 @@ public:
getOptionFromSubnet
(
const
IOAddress
&
subnet_address
,
const
uint16_t
option_code
,
const
uint16_t
expected_options_count
=
1
)
{
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
subnet_address
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
subnet_address
,
classify_
);
if
(
!
subnet
)
{
/// @todo replace toText() with the use of operator <<.
ADD_FAILURE
()
<<
"A subnet for the specified address "
...
...
@@ -475,6 +476,7 @@ public:
ConstElementPtr
comment_
;
///< Comment (see @ref isc::config::parseAnswer)
string
valid_iface_
;
///< Valid network interface name (present in system)
string
bogus_iface_
;
///< invalid network interface name (not in system)
isc
::
dhcp
::
Classes
classify_
;
///< used in client classification
};
// Goal of this test is a verification if a very simple config update
...
...
@@ -554,7 +556,8 @@ TEST_F(Dhcp6ParserTest, subnetGlobalDefaults) {
// Now check if the configuration was indeed handled and we have
// expected pool configured.
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
1000
,
subnet
->
getT1
());
EXPECT_EQ
(
2000
,
subnet
->
getT2
());
...
...
@@ -772,7 +775,8 @@ TEST_F(Dhcp6ParserTest, subnetLocal) {
comment_
=
parseAnswer
(
rcode_
,
status
);
EXPECT_EQ
(
0
,
rcode_
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
1
,
subnet
->
getT1
());
EXPECT_EQ
(
2
,
subnet
->
getT2
());
...
...
@@ -808,7 +812,8 @@ TEST_F(Dhcp6ParserTest, subnetInterface) {
comment_
=
parseAnswer
(
rcode_
,
status
);
EXPECT_EQ
(
0
,
rcode_
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
valid_iface_
,
subnet
->
getIface
());
}
...
...
@@ -841,7 +846,8 @@ TEST_F(Dhcp6ParserTest, subnetInterfaceBogus) {
comment_
=
parseAnswer
(
rcode_
,
status
);
EXPECT_EQ
(
1
,
rcode_
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
EXPECT_FALSE
(
subnet
);
}
...
...
@@ -906,13 +912,13 @@ TEST_F(Dhcp6ParserTest, subnetInterfaceId) {
// Try to get a subnet based on bogus interface-id option
OptionBuffer
tmp
(
bogus_interface_id
.
begin
(),
bogus_interface_id
.
end
());
OptionPtr
ifaceid
(
new
Option
(
Option
::
V6
,
D6O_INTERFACE_ID
,
tmp
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
ifaceid
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
ifaceid
,
classify_
);
EXPECT_FALSE
(
subnet
);
// Now try to get subnet for valid interface-id value
tmp
=
OptionBuffer
(
valid_interface_id
.
begin
(),
valid_interface_id
.
end
());
ifaceid
.
reset
(
new
Option
(
Option
::
V6
,
D6O_INTERFACE_ID
,
tmp
));
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
ifaceid
);
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
ifaceid
,
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_TRUE
(
ifaceid
->
equal
(
subnet
->
getInterfaceId
()));
}
...
...
@@ -1025,7 +1031,8 @@ TEST_F(Dhcp6ParserTest, poolPrefixLen) {
comment_
=
parseAnswer
(
rcode_
,
x
);
EXPECT_EQ
(
0
,
rcode_
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
1000
,
subnet
->
getT1
());
EXPECT_EQ
(
2000
,
subnet
->
getT2
());
...
...
@@ -1068,9 +1075,8 @@ TEST_F(Dhcp6ParserTest, pdPoolBasics) {
EXPECT_EQ
(
0
,
rcode_
);
// Test that we can retrieve the subnet.
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// Fetch the collection of PD pools. It should have 1 entry.
...
...
@@ -1143,8 +1149,8 @@ TEST_F(Dhcp6ParserTest, pdPoolList) {
EXPECT_EQ
(
0
,
rcode_
);
// Test that we can retrieve the subnet.
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
)
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// Fetch the collection of NA pools. It should have 1 entry.
...
...
@@ -1201,8 +1207,8 @@ TEST_F(Dhcp6ParserTest, subnetAndPrefixDelegated) {
EXPECT_EQ
(
0
,
rcode_
);
// Test that we can retrieve the subnet.
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
)
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
...
...
@@ -1846,7 +1852,8 @@ TEST_F(Dhcp6ParserTest, optionDataDefaults) {
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
Subnet
::
OptionContainerPtr
options
=
subnet
->
getOptionDescriptors
(
"dhcp6"
);
ASSERT_EQ
(
2
,
options
->
size
());
...
...
@@ -1938,7 +1945,8 @@ TEST_F(Dhcp6ParserTest, optionDataTwoSpaces) {
checkResult
(
status
,
0
);
// Options should be now available for the subnet.
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// Try to get the option from the space dhcp6.
Subnet
::
OptionDescriptor
desc1
=
subnet
->
getOptionDescriptor
(
"dhcp6"
,
38
);
...
...
@@ -2089,7 +2097,8 @@ TEST_F(Dhcp6ParserTest, optionDataEncapsulate) {
checkResult
(
status
,
0
);
// Get the subnet.
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// We should have one option available.
...
...
@@ -2153,7 +2162,8 @@ TEST_F(Dhcp6ParserTest, optionDataInMultipleSubnets) {
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
Subnet6Ptr
subnet1
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet1
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet1
);
Subnet
::
OptionContainerPtr
options1
=
subnet1
->
getOptionDescriptors
(
"dhcp6"
);
ASSERT_EQ
(
1
,
options1
->
size
());
...
...
@@ -2178,7 +2188,8 @@ TEST_F(Dhcp6ParserTest, optionDataInMultipleSubnets) {
sizeof
(
subid_expected
));
// Test another subnet in the same way.
Subnet6Ptr
subnet2
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:2::4"
));
Subnet6Ptr
subnet2
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:2::4"
),
classify_
);
ASSERT_TRUE
(
subnet2
);
Subnet
::
OptionContainerPtr
options2
=
subnet2
->
getOptionDescriptors
(
"dhcp6"
);
ASSERT_EQ
(
1
,
options2
->
size
());
...
...
@@ -2348,7 +2359,8 @@ TEST_F(Dhcp6ParserTest, optionDataLowerCase) {
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
Subnet
::
OptionContainerPtr
options
=
subnet
->
getOptionDescriptors
(
"dhcp6"
);
ASSERT_EQ
(
1
,
options
->
size
());
...
...
@@ -2392,7 +2404,8 @@ TEST_F(Dhcp6ParserTest, stdOptionData) {
comment_
=
parseAnswer
(
rcode_
,
x
);
ASSERT_EQ
(
0
,
rcode_
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
Subnet
::
OptionContainerPtr
options
=
subnet
->
getOptionDescriptors
(
"dhcp6"
);
ASSERT_EQ
(
1
,
options
->
size
());
...
...
@@ -2467,7 +2480,8 @@ TEST_F(Dhcp6ParserTest, vendorOptionsHex) {
checkResult
(
status
,
0
);
// Options should be now available for the subnet.
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// Try to get the option from the vendor space 4491
...
...
@@ -2526,7 +2540,8 @@ TEST_F(Dhcp6ParserTest, vendorOptionsCsv) {
checkResult
(
status
,
0
);
// Options should be now available for the subnet.
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// Try to get the option from the vendor space 4491
...
...
@@ -2660,7 +2675,8 @@ TEST_F(Dhcp6ParserTest, stdOptionDataEncapsulate) {
checkResult
(
status
,
0
);
// Get the subnet.
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::5"
),
classify_
);
ASSERT_TRUE
(
subnet
);
// We should have one option available.
...
...
@@ -2949,7 +2965,8 @@ TEST_F(Dhcp6ParserTest, subnetRelayInfo) {
// returned value should be 0 (configuration success)
checkResult
(
status
,
0
);
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::1"
));
Subnet6Ptr
subnet
=
CfgMgr
::
instance
().
getSubnet6
(
IOAddress
(
"2001:db8:1::1"
),
classify_
);
ASSERT_TRUE
(
subnet
);
EXPECT_EQ
(
"2001:db8:1::abcd"
,
subnet
->
relay_
.
addr_
.
toText
());
}
...
...
src/lib/dhcpsrv/cfgmgr.cc
View file @
9c9ec6cd
...
...
@@ -122,7 +122,8 @@ CfgMgr::getOptionDef(const std::string& option_space,
}
Subnet6Ptr
CfgMgr
::
getSubnet6
(
const
std
::
string
&
iface
)
{
CfgMgr
::
getSubnet6
(
const
std
::
string
&
iface
,
const
isc
::
dhcp
::
Classes
&
/*classes*/
)
{
if
(
!
iface
.
length
())
{
return
(
Subnet6Ptr
());
...
...
@@ -142,7 +143,8 @@ CfgMgr::getSubnet6(const std::string& iface) {
}
Subnet6Ptr
CfgMgr
::
getSubnet6
(
const
isc
::
asiolink
::
IOAddress
&
hint
)
{
CfgMgr
::
getSubnet6
(
const
isc
::
asiolink
::
IOAddress
&
hint
,
const
isc
::
dhcp
::
Classes
&
/*classes*/
)
{
// If there's only one subnet configured, let's just use it
// The idea is to keep small deployments easy. In a small network - one
...
...
@@ -177,7 +179,8 @@ CfgMgr::getSubnet6(const isc::asiolink::IOAddress& hint) {
return
(
Subnet6Ptr
());
}
Subnet6Ptr
CfgMgr
::
getSubnet6
(
OptionPtr
iface_id_option
)
{
Subnet6Ptr
CfgMgr
::
getSubnet6
(
OptionPtr
iface_id_option
,
const
isc
::
dhcp
::
Classes
&
/*classes*/
)
{
if
(
!
iface_id_option
)
{
return
(
Subnet6Ptr
());
}
...
...
@@ -207,7 +210,8 @@ void CfgMgr::addSubnet6(const Subnet6Ptr& subnet) {
}
Subnet4Ptr
CfgMgr
::
getSubnet4
(
const
isc
::
asiolink
::
IOAddress
&
hint
)
{
CfgMgr
::
getSubnet4
(
const
isc
::
asiolink
::
IOAddress
&
hint
,
const
isc
::
dhcp
::
Classes
&
/*classes*/
)
{
// If there's only one subnet configured, let's just use it
// The idea is to keep small deployments easy. In a small network - one
...
...
src/lib/dhcpsrv/cfgmgr.h
View file @
9c9ec6cd
...
...
@@ -19,6 +19,7 @@
#include <dhcp/option.h>
#include <dhcp/option_definition.h>
#include <dhcp/option_space.h>
#include <dhcp/classify.h>
#include <dhcpsrv/d2_client.h>
#include <dhcpsrv/option_space_container.h>
#include <dhcpsrv/pool.h>
...
...
@@ -168,7 +169,8 @@ public:
/// @param hint an address that belongs to a searched subnet
///
/// @return a subnet object (or NULL if no suitable match was fount)
Subnet6Ptr
getSubnet6
(
const
isc
::
asiolink
::
IOAddress
&
hint
);
Subnet6Ptr
getSubnet6
(
const
isc
::
asiolink
::
IOAddress
&
hint
,
const
isc
::
dhcp
::
Classes
&
classes
);
/// @brief get IPv6 subnet by interface name
///
...
...
@@ -177,7 +179,8 @@ public:
/// user as reachable over specified network interface.
/// @param iface_name interface name
/// @return a subnet object (or NULL if no suitable match was fount)
Subnet6Ptr
getSubnet6
(
const
std
::
string
&
iface_name
);
Subnet6Ptr
getSubnet6
(
const
std
::
string
&
iface_name
,
const
isc
::
dhcp
::
Classes
&
classes
);
/// @brief get IPv6 subnet by interface-id
///
...
...
@@ -186,7 +189,8 @@ public:
/// @param interface_id content of interface-id option returned by a relay
///
/// @return a subnet object
Subnet6Ptr
getSubnet6
(
OptionPtr
interface_id
);
Subnet6Ptr
getSubnet6
(
OptionPtr
interface_id
,
const
isc
::
dhcp
::
Classes
&
classes
);
/// @brief adds an IPv6 subnet
///
...
...
@@ -244,7 +248,8 @@ public:
/// @param hint an address that belongs to a searched subnet
///
/// @return a subnet object
Subnet4Ptr
getSubnet4
(
const
isc
::
asiolink
::
IOAddress
&
hint
);
Subnet4Ptr
getSubnet4
(
const
isc
::
asiolink
::
IOAddress
&
hint
,
const
isc
::
dhcp
::
Classes
&
classes
);
/// @brief adds a subnet4
void
addSubnet4
(
const
Subnet4Ptr
&
subnet
);
...
...
src/lib/dhcpsrv/tests/cfgmgr_unittest.cc
View file @
9c9ec6cd
...
...
@@ -184,6 +184,9 @@ public:
CfgMgr
::
instance
().
deleteSubnets6
();
CfgMgr
::
instance
().
deleteOptionDefs
();
}
/// used in client classification (or just empty container for other tests)
isc
::
dhcp
::
Classes
classify_
;
};
// This test verifies that multiple option definitions can be added
...
...
@@ -358,30 +361,31 @@ TEST_F(CfgMgrTest, subnet4) {
Subnet4Ptr
subnet3
(
new
Subnet4
(
IOAddress
(
"192.0.2.128"
),
26
,
1
,
2
,
3
));
// There shouldn't be any subnet configured at this stage
EXPECT_FALSE
(
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.0"
)));
EXPECT_FALSE
(
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.0"
)
,
classify_
));
cfg_mgr
.
addSubnet4
(
subnet1
);
// Now we have only one subnet, any request will be served from it
EXPECT_EQ
(
subnet1
,
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.63"
)));
EXPECT_EQ
(
subnet1
,
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.63"
),
classify_
));
// Now we add more subnets and check that both old and new subnets
// are accessible.
cfg_mgr
.
addSubnet4
(
subnet2
);
cfg_mgr
.
addSubnet4
(
subnet3
);
EXPECT_EQ
(
subnet3
,
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.191"
)));
EXPECT_EQ
(
subnet1
,
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.15"
)));
EXPECT_EQ
(
subnet2
,
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.85"
)));
EXPECT_EQ
(
subnet3
,
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.191"
)
,
classify_
));
EXPECT_EQ
(
subnet1
,
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.15"
)
,
classify_
));
EXPECT_EQ
(
subnet2
,
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.85"
)
,
classify_
));
// Try to find an address that does not belong to any subnet
EXPECT_FALSE
(
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.192"
)));
EXPECT_FALSE
(
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.192"
)
,
classify_
));
// Check that deletion of the subnets works.
cfg_mgr
.
deleteSubnets4
();
EXPECT_FALSE
(
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.191"
)));
EXPECT_FALSE
(
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.15"
)));
EXPECT_FALSE
(
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.85"
)));
EXPECT_FALSE
(
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.191"
)
,
classify_
));
EXPECT_FALSE
(
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.15"
)
,
classify_
));
EXPECT_FALSE
(
cfg_mgr
.
getSubnet4
(
IOAddress
(
"192.0.2.85"
)
,
classify_
));
}
// This test verifies if the configuration manager is able to hold and return
...
...
@@ -394,29 +398,31 @@ TEST_F(CfgMgrTest, subnet6) {
Subnet6Ptr
subnet3
(
new
Subnet6
(
IOAddress
(
"4000::"
),
48
,
1
,
2
,
3
,
4
));