Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Kea
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Adam Osuchowski
Kea
Commits
0a5d26df
Commit
0a5d26df
authored
Jul 11, 2013
by
Marcin Siodelski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[1555] Reopen active sockets when configuration changes.
parent
9517e24b
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
96 additions
and
8 deletions
+96
-8
src/bin/dhcp4/ctrl_dhcp4_srv.cc
src/bin/dhcp4/ctrl_dhcp4_srv.cc
+43
-3
src/bin/dhcp4/ctrl_dhcp4_srv.h
src/bin/dhcp4/ctrl_dhcp4_srv.h
+11
-0
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp4/dhcp4_srv.cc
+3
-2
src/bin/dhcp4/dhcp4_srv.h
src/bin/dhcp4/dhcp4_srv.h
+29
-0
src/lib/dhcp/iface_mgr.cc
src/lib/dhcp/iface_mgr.cc
+6
-3
src/lib/dhcp/iface_mgr.h
src/lib/dhcp/iface_mgr.h
+4
-0
No files found.
src/bin/dhcp4/ctrl_dhcp4_srv.cc
View file @
0a5d26df
...
...
@@ -20,17 +20,18 @@
#include <config/ccsession.h>
#include <dhcp/iface_mgr.h>
#include <dhcpsrv/dhcp_config_parser.h>
#include <dhcpsrv/cfgmgr.h>
#include <dhcp4/ctrl_dhcp4_srv.h>
#include <dhcp4/dhcp4_log.h>
#include <dhcp4/spec_config.h>
#include <dhcp4/config_parser.h>
#include <exceptions/exceptions.h>
#include <boost/bind.hpp>
#include <util/buffer.h>
#include <cassert>
#include <iostream>
#include <cassert>
#include <iostream>
#include <sstream>
using
namespace
isc
::
asiolink
;
using
namespace
isc
::
cc
;
...
...
@@ -101,7 +102,27 @@ ControlledDhcpv4Srv::dhcp4ConfigHandler(ConstElementPtr new_config) {
}
// Configure the server.
return
(
configureDhcp4Server
(
*
server_
,
merged_config
));
ConstElementPtr
answer
=
configureDhcp4Server
(
*
server_
,
merged_config
);
// Check that configuration was successful. If not, do not reopen sockets.
int
rcode
=
0
;
parseAnswer
(
rcode
,
answer
);
if
(
rcode
!=
0
)
{
return
(
answer
);
}
// Configuration may change active interfaces. Therefore, we have to reopen
// sockets according to new configuration. This operation is not exception
// safe and we really don't want to emit exceptions to the callback caller.
// Instead, catch an exception and create appropriate answer.
try
{
server_
->
openActiveSockets
(
server_
->
getPort
(),
server_
->
useBroadcast
());
}
catch
(
std
::
exception
&
ex
)
{
std
::
ostringstream
err
;
err
<<
"failed to open sockets after server reconfiguration: "
<<
ex
.
what
();
answer
=
isc
::
config
::
createAnswer
(
1
,
err
.
str
());
}
return
(
answer
);
}
ConstElementPtr
...
...
@@ -228,6 +249,25 @@ ControlledDhcpv4Srv::execDhcpv4ServerCommand(const std::string& command_id,
}
}
void
ControlledDhcpv4Srv
::
openActiveSockets
(
const
uint16_t
port
,
const
bool
use_bcast
)
{
IfaceMgr
::
instance
().
closeSockets
();
// Get the reference to the collection of interfaces. This reference should be
// valid as long as the program is run because IfaceMgr is a singleton.
// Therefore we can safely iterate over instances of all interfaces and modify
// their flags. Here we modify flags which indicate wheter socket should be
// open for a particular interface or not.
IfaceMgr
::
IfaceCollection
ifaces
=
IfaceMgr
::
instance
().
getIfaces
();
for
(
IfaceMgr
::
IfaceCollection
::
iterator
iface
=
ifaces
.
begin
();
iface
!=
ifaces
.
end
();
++
iface
)
{
iface
->
inactive_
=
!
CfgMgr
::
instance
().
isActiveIface
(
iface
->
getName
());
}
// Let's reopen active sockets. openSockets4 will check internally whether
// sockets are marked active or inactive.
IfaceMgr
::
instance
().
openSockets4
(
port
,
use_bcast
);
}
};
};
src/bin/dhcp4/ctrl_dhcp4_srv.h
View file @
0a5d26df
...
...
@@ -130,6 +130,17 @@ protected:
/// when there is a new command or configuration sent over msgq.
static
void
sessionReader
(
void
);
/// @brief Open sockets which are marked as active in @c CfgMgr.
///
/// This function reopens sockets according to the current settings in the
/// Configuration Manager. It holds the list of the interfaces which server
/// should listen on. This function will open sockets on these interfaces
/// only. This function is not exception safe.
///
/// @param port UDP port on which server should listen.
/// @param use_bcast should broadcast flags be set on the sockets.
static
void
openActiveSockets
(
const
uint16_t
port
,
const
bool
use_bcast
);
/// @brief IOService object, used for all ASIO operations.
isc
::
asiolink
::
IOService
io_service_
;
...
...
src/bin/dhcp4/dhcp4_srv.cc
View file @
0a5d26df
...
...
@@ -58,7 +58,8 @@ static const char* SERVER_ID_FILE = "b10-dhcp4-serverid";
// grants those options and a single, fixed, hardcoded lease.
Dhcpv4Srv
::
Dhcpv4Srv
(
uint16_t
port
,
const
char
*
dbconfig
,
const
bool
use_bcast
,
const
bool
direct_response_desired
)
{
const
bool
direct_response_desired
)
:
port_
(
port
),
use_bcast_
(
use_bcast
)
{
LOG_DEBUG
(
dhcp4_logger
,
DBG_DHCP4_START
,
DHCP4_OPEN_SOCKET
).
arg
(
port
);
try
{
// First call to instance() will create IfaceMgr (it's a singleton)
...
...
@@ -73,7 +74,7 @@ Dhcpv4Srv::Dhcpv4Srv(uint16_t port, const char* dbconfig, const bool use_bcast,
if
(
port
)
{
// open sockets only if port is non-zero. Port 0 is used
// for non-socket related testing.
IfaceMgr
::
instance
().
openSockets4
(
port
,
use_bcast
);
IfaceMgr
::
instance
().
openSockets4
(
port
_
,
use_bcast_
);
}
string
srvid_file
=
CfgMgr
::
instance
().
getDataDir
()
+
"/"
+
string
(
SERVER_ID_FILE
);
...
...
src/bin/dhcp4/dhcp4_srv.h
View file @
0a5d26df
...
...
@@ -113,6 +113,32 @@ public:
/// be freed by the caller.
static
const
char
*
serverReceivedPacketName
(
uint8_t
type
);
///
/// @name Public accessors returning values required to (re)open sockets.
///
/// These accessors must be public because sockets are reopened from the
/// static configuration callback handler. This callback handler invokes
/// @c ControlledDhcpv4Srv::openActiveSockets which requires parameters
/// which has to be retrieved from the @c ControlledDhcpv4Srv object.
/// They are retrieved using these public functions
//@{
///
/// @brief Get UDP port on which server should listen.
///
/// @return UDP port on which server should listen.
uint16_t
getPort
()
const
{
return
(
port_
);
}
/// @brief Return bool value indicating that broadcast flags should be set
/// on sockets.
///
/// @return A bool value indicating that broadcast should be used (if true).
bool
useBroadcast
()
const
{
return
(
use_bcast_
);
}
//@}
protected:
/// @brief verifies if specified packet meets RFC requirements
...
...
@@ -310,6 +336,9 @@ private:
/// during normal operation (e.g. to use different allocators)
boost
::
shared_ptr
<
AllocEngine
>
alloc_engine_
;
uint16_t
port_
;
///< UDP port number on which server listens.
bool
use_bcast_
;
///< Should broadcast be enabled on sockets (if true).
};
};
// namespace isc::dhcp
...
...
src/lib/dhcp/iface_mgr.cc
View file @
0a5d26df
...
...
@@ -51,7 +51,8 @@ IfaceMgr::instance() {
Iface
::
Iface
(
const
std
::
string
&
name
,
int
ifindex
)
:
name_
(
name
),
ifindex_
(
ifindex
),
mac_len_
(
0
),
hardware_type_
(
0
),
flag_loopback_
(
false
),
flag_up_
(
false
),
flag_running_
(
false
),
flag_multicast_
(
false
),
flag_broadcast_
(
false
),
flags_
(
0
)
flag_multicast_
(
false
),
flag_broadcast_
(
false
),
flags_
(
0
),
inactive_
(
false
)
{
memset
(
mac_
,
0
,
sizeof
(
mac_
));
}
...
...
@@ -295,7 +296,8 @@ bool IfaceMgr::openSockets4(const uint16_t port, const bool use_bcast) {
if
(
iface
->
flag_loopback_
||
!
iface
->
flag_up_
||
!
iface
->
flag_running_
)
{
!
iface
->
flag_running_
,
iface
->
inactive_
)
{
continue
;
}
...
...
@@ -361,7 +363,8 @@ bool IfaceMgr::openSockets6(const uint16_t port) {
if
(
iface
->
flag_loopback_
||
!
iface
->
flag_up_
||
!
iface
->
flag_running_
)
{
!
iface
->
flag_running_
,
!
iface
->
inactive_
)
{
continue
;
}
...
...
src/lib/dhcp/iface_mgr.h
View file @
0a5d26df
...
...
@@ -309,6 +309,10 @@ public:
/// Interface flags (this value is as is returned by OS,
/// it may mean different things on different OSes).
uint32_t
flags_
;
/// Interface is inactive. This can be explicitly set to prevent Interface
/// Manager from opening the socket on this interface.
bool
inactive_
;
};
/// @brief Handles network interfaces, transmission and reception.
...
...
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