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
Sebastian Schrader
Kea
Commits
1d94a83e
Commit
1d94a83e
authored
Feb 27, 2017
by
Francis Dupont
Browse files
[master] Merged trac5070 (skip in lease4_select loops)
parents
1bda76b3
74f47a4a
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/lib/dhcpsrv/alloc_engine.cc
View file @
1d94a83e
...
...
@@ -710,6 +710,11 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) {
leases
.
push_back
(
lease
);
return
(
leases
);
}
else
if
(
ctx
.
callout_handle_
&&
(
ctx
.
callout_handle_
->
getStatus
()
!=
CalloutHandle
::
NEXT_STEP_CONTINUE
))
{
// Don't retry when the callout status is not continue.
break
;
}
// Although the address was free just microseconds ago, it may have
...
...
@@ -2841,6 +2846,11 @@ AllocEngine::allocateUnreservedLease4(ClientContext4& ctx) {
new_lease
=
allocateOrReuseLease4
(
candidate
,
ctx
);
if
(
new_lease
)
{
return
(
new_lease
);
}
else
if
(
ctx
.
callout_handle_
&&
(
ctx
.
callout_handle_
->
getStatus
()
!=
CalloutHandle
::
NEXT_STEP_CONTINUE
))
{
// Don't retry when the callout status is not continue.
break
;
}
}
}
...
...
src/lib/dhcpsrv/tests/alloc_engine_hooks_unittest.cc
View file @
1d94a83e
// Copyright (C) 2015-201
6
Internet Systems Consortium, Inc. ("ISC")
// Copyright (C) 2015-201
7
Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
...
...
@@ -46,6 +46,7 @@ public:
callback_addr_updated_
=
IOAddress
(
"::"
);
callback_qry_pkt6_
.
reset
();
callback_qry_options_copy_
=
false
;
callback_skip_
=
0
;
}
/// callback that stores received callout name and received values
...
...
@@ -91,6 +92,21 @@ public:
return
(
0
);
}
/// callback that return next step skip status
static
int
lease6_select_skip_callout
(
CalloutHandle
&
callout_handle
)
{
// Let's call the basic callout, so it can record all parameters
lease6_select_callout
(
callout_handle
);
// Count the call
callback_skip_
++
;
callout_handle
.
setStatus
(
CalloutHandle
::
NEXT_STEP_SKIP
);
return
(
0
);
}
// Values to be used in callout to override lease6 content
static
const
IOAddress
addr_override_
;
static
const
uint32_t
t1_override_
;
...
...
@@ -110,6 +126,9 @@ public:
static
vector
<
string
>
callback_argument_names_
;
static
Pkt6Ptr
callback_qry_pkt6_
;
static
bool
callback_qry_options_copy_
;
// Counter for next step skip (should be not retried)
static
unsigned
callback_skip_
;
};
// For some reason initialization within a class makes the linker confused.
...
...
@@ -132,6 +151,8 @@ vector<string> HookAllocEngine6Test::callback_argument_names_;
Pkt6Ptr
HookAllocEngine6Test
::
callback_qry_pkt6_
;
bool
HookAllocEngine6Test
::
callback_qry_options_copy_
;
unsigned
HookAllocEngine6Test
::
callback_skip_
;
// This test checks if the lease6_select callout is executed and expected
// parameters as passed.
TEST_F
(
HookAllocEngine6Test
,
lease6_select
)
{
...
...
@@ -153,7 +174,7 @@ TEST_F(HookAllocEngine6Test, lease6_select) {
HookLibsCollection
libraries
;
// no libraries at this time
HooksManager
::
loadLibraries
(
libraries
);
// Install
pkt6_receive_callou
t
// Install
lease6_selec
t
EXPECT_NO_THROW
(
HooksManager
::
preCalloutsLibraryHandle
().
registerCallout
(
"lease6_select"
,
lease6_select_callout
));
...
...
@@ -263,6 +284,36 @@ TEST_F(HookAllocEngine6Test, change_lease6_select) {
EXPECT_EQ
(
valid_override_
,
from_mgr
->
valid_lft_
);
}
// This test checks if lease6_select callout can set the status to next
// step skip without the engine to retry.
TEST_F
(
HookAllocEngine6Test
,
skip_lease6_select
)
{
// Create allocation engine (hook names are registered in its ctor)
boost
::
scoped_ptr
<
AllocEngine
>
engine
;
ASSERT_NO_THROW
(
engine
.
reset
(
new
AllocEngine
(
AllocEngine
::
ALLOC_ITERATIVE
,
100
)));
ASSERT_TRUE
(
engine
);
// Initialize Hooks Manager
HookLibsCollection
libraries
;
// no libraries at this time
HooksManager
::
loadLibraries
(
libraries
);
// Install a callout
EXPECT_NO_THROW
(
HooksManager
::
preCalloutsLibraryHandle
().
registerCallout
(
"lease6_select"
,
lease6_select_skip_callout
));
// Call allocateLeases6. Callouts should be triggered here.
Lease6Ptr
lease
;
AllocEngine
::
ClientContext6
ctx
(
subnet_
,
duid_
,
false
,
false
,
""
,
false
,
Pkt6Ptr
(
new
Pkt6
(
DHCPV6_REQUEST
,
1234
)),
HooksManager
::
createCalloutHandle
());
ctx
.
currentIA
().
iaid_
=
iaid_
;
EXPECT_NO_THROW
(
lease
=
expectOneLease
(
engine
->
allocateLeases6
(
ctx
)));
// Check that we got no lease
EXPECT_FALSE
(
lease
);
// Check no retry was attempted
EXPECT_EQ
(
1
,
callback_skip_
);
}
/// @brief helper class used in Hooks testing in AllocEngine4
///
...
...
@@ -294,6 +345,7 @@ public:
callback_addr_updated_
=
IOAddress
(
"::"
);
callback_qry_pkt4_
.
reset
();
callback_qry_options_copy_
=
false
;
callback_skip_
=
0
;
}
/// callback that stores received callout name and received values
...
...
@@ -338,6 +390,21 @@ public:
return
(
0
);
}
/// callback that return next step skip status
static
int
lease4_select_skip_callout
(
CalloutHandle
&
callout_handle
)
{
// Let's call the basic callout, so it can record all parameters
lease4_select_callout
(
callout_handle
);
// Count the call
callback_skip_
++
;
callout_handle
.
setStatus
(
CalloutHandle
::
NEXT_STEP_SKIP
);
return
(
0
);
}
// Values to be used in callout to override lease4 content
static
const
IOAddress
addr_override_
;
static
const
uint32_t
t1_override_
;
...
...
@@ -356,6 +423,9 @@ public:
static
vector
<
string
>
callback_argument_names_
;
static
Pkt4Ptr
callback_qry_pkt4_
;
static
bool
callback_qry_options_copy_
;
// Counter for next step skip (should be not retried)
static
unsigned
callback_skip_
;
};
// For some reason initialization within a class makes the linker confused.
...
...
@@ -377,6 +447,8 @@ vector<string> HookAllocEngine4Test::callback_argument_names_;
Pkt4Ptr
HookAllocEngine4Test
::
callback_qry_pkt4_
;
bool
HookAllocEngine4Test
::
callback_qry_options_copy_
;
unsigned
HookAllocEngine4Test
::
callback_skip_
;
// This test checks if the lease4_select callout is executed and expected
// parameters as passed.
TEST_F
(
HookAllocEngine4Test
,
lease4_select
)
{
...
...
@@ -399,7 +471,7 @@ TEST_F(HookAllocEngine4Test, lease4_select) {
HookLibsCollection
libraries
;
// no libraries at this time
HooksManager
::
loadLibraries
(
libraries
);
// Install
pkt4_receive_callou
t
// Install
lease4_selec
t
EXPECT_NO_THROW
(
HooksManager
::
preCalloutsLibraryHandle
().
registerCallout
(
"lease4_select"
,
lease4_select_callout
));
...
...
@@ -510,6 +582,41 @@ TEST_F(HookAllocEngine4Test, change_lease4_select) {
EXPECT_EQ
(
valid_override_
,
from_mgr
->
valid_lft_
);
}
// This test checks if lease4_select callout can set the status to next
// step skip without the engine to retry.
TEST_F
(
HookAllocEngine4Test
,
skip_lease4_select
)
{
// Create allocation engine (hook names are registered in its ctor)
boost
::
scoped_ptr
<
AllocEngine
>
engine
;
ASSERT_NO_THROW
(
engine
.
reset
(
new
AllocEngine
(
AllocEngine
::
ALLOC_ITERATIVE
,
100
,
false
)));
ASSERT_TRUE
(
engine
);
// Initialize Hooks Manager
HookLibsCollection
libraries
;
// no libraries at this time
HooksManager
::
loadLibraries
(
libraries
);
// Install a callout
EXPECT_NO_THROW
(
HooksManager
::
preCalloutsLibraryHandle
().
registerCallout
(
"lease4_select"
,
lease4_select_skip_callout
));
CalloutHandlePtr
callout_handle
=
HooksManager
::
createCalloutHandle
();
AllocEngine
::
ClientContext4
ctx
(
subnet_
,
clientid_
,
hwaddr_
,
IOAddress
(
"0.0.0.0"
),
false
,
false
,
""
,
false
);
ctx
.
query_
.
reset
(
new
Pkt4
(
DHCPREQUEST
,
1234
));
ctx
.
callout_handle_
=
callout_handle
;
Lease4Ptr
lease
=
engine
->
allocateLease4
(
ctx
);
// Check that we got no lease
EXPECT_FALSE
(
lease
);
// Check no retry was attempted
EXPECT_EQ
(
1
,
callback_skip_
);
}
};
// namespace test
};
// namespace dhcp
};
// namespace isc
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