Kea  2.3.5-git
isc::ha::QueryFilter Class Reference

DHCP query filtering class. More...

#include <query_filter.h>

Public Member Functions

 QueryFilter (const HAConfigPtr &config)
 Constructor. More...
 
bool amServingScope (const std::string &scope_name) const
 Checks if this server instance is configured to process traffic belonging to a particular scope. More...
 
std::set< std::string > getServedScopes () const
 Returns served scopes. More...
 
bool inScope (const dhcp::Pkt4Ptr &query4, std::string &scope_class) const
 Checks if this server should process the DHCPv4 query. More...
 
bool inScope (const dhcp::Pkt6Ptr &query6, std::string &scope_class) const
 Checks if this server should process the DHCPv6 query. More...
 
void serveDefaultScopes ()
 Serve default scopes for the given HA mode. More...
 
void serveFailoverScopes ()
 Enable scopes required in failover case. More...
 
void serveNoScopes ()
 Disables all scopes. More...
 
void serveScope (const std::string &scope_name)
 Enable scope. More...
 
void serveScopeOnly (const std::string &scope_name)
 Enable scope and disable all other scopes. More...
 
void serveScopes (const std::vector< std::string > &scopes)
 Enables selected scopes. More...
 

Static Public Member Functions

static bool isHaType (const dhcp::Pkt4Ptr &query4)
 Determines if a DHCPv4 query is a message type HA should process. More...
 
static bool isHaType (const dhcp::Pkt6Ptr &query6)
 Determines if a DHCPv6 query is a message type HA should process. More...
 

Protected Member Functions

int loadBalance (const dhcp::Pkt4Ptr &query4) const
 Performs load balancing of the DHCPv4 queries. More...
 
int loadBalance (const dhcp::Pkt6Ptr &query6) const
 Performs load balancing of the DHCPv6 queries. More...
 
uint8_t loadBalanceHash (const uint8_t *key, const size_t key_len) const
 Compute load balancing hash. More...
 
std::string makeScopeClass (const std::string &scope_name) const
 Returns scope class name for the specified scope name. More...
 
void validateScopeName (const std::string &scope_name) const
 Checks if the scope name matches a name of any of the configured servers. More...
 

Protected Attributes

int active_servers_
 Number of the active servers in the given HA mode. More...
 
HAConfigPtr config_
 Pointer to the HA configuration. More...
 
boost::scoped_ptr< std::mutex > mutex_
 Mutex to protect the internal state. More...
 
std::vector< HAConfig::PeerConfigPtrpeers_
 Vector of HA peers configurations. More...
 
std::map< std::string, bool > scopes_
 Holds mapping of the scope names to the flag which indicates if the scopes are enabled or disabled. More...
 

Detailed Description

DHCP query filtering class.

This class is a central point of information about distribution of the DHCP queries processed by the servers within HA setup. It also implements load balancing of the DHCP queries, when configured to do so.

The query filter uses a term "scope" to identify group of DHCP queries processed by a given server. Currently, we support load balancing between two servers. Therefore, in this mode of operation, there are two scopes named after servers responsible for processing packets belonging to those scopes, e.g. "server1" and "server2".

In the hot-standby mode, there is only one server processing incoming DHCP queries. Thus, there is only one scope named after the primary server, e.g. "server1".

This class allows for assigning the server to process queries belonging to various scopes. For example: when a failure of the partner server is detected, the QueryFilter::serveFailoverScopes is called to indicate that this server instance should start handling queries belonging to the scope(s) of the server which have died. Converesly, a call to QueryFilter::serveDefaultScopes reverts to the default state.

When DHCP query is received, the QueryFilter class is used to determine whether this query should be processed by this server. The QueryFilter::inScope methods return boolean value indicating whether the query should be processed or not. If not, the query is dropped.

The server administrator may force the server to start processing queries from the selected scopes, e.g. the administrator may manually instruct the backup server to take over the traffic of the primary and secondary servers. The 'ha-scopes' command is sent in such case, which enables/disables scopes within this class instance.

Definition at line 61 of file query_filter.h.

Constructor & Destructor Documentation

◆ QueryFilter()

isc::ha::QueryFilter::QueryFilter ( const HAConfigPtr config)
explicit

Constructor.

This constructor puts HA peers configurations in the following order:

  • primary server configuration,
  • secondary or standby server configuration,
  • backup servers configurations

It also sets the active_servers_ value to the number of active servers (responding to DHCP queries) for a given HA mode. In our case, this is 2 for the load balancing case and 1 for the hot-standby. Such organization of the configurations makes it easier for the load balancing algorithm to distribute queries between active servers. In our simple case, the load balancing algorithm can produce a value of 0 or 1, which points to a primary or secondary server in the configuration vector.

Parameters
configpointer to the HA configuration.
Exceptions
HAConfigValidationErrorif provided configuration is invalid.

Definition at line 121 of file query_filter.cc.

References active_servers_, config_, peers_, isc::ha::HAConfig::PeerConfig::PRIMARY, isc::ha::HAConfig::PeerConfig::SECONDARY, serveDefaultScopes(), and isc::ha::HAConfig::PeerConfig::STANDBY.

+ Here is the call graph for this function:

Member Function Documentation

◆ amServingScope()

bool isc::ha::QueryFilter::amServingScope ( const std::string &  scope_name) const

Checks if this server instance is configured to process traffic belonging to a particular scope.

Parameters
scope_namename of the scope/server.
Returns
true if the scope is enabled.

Definition at line 313 of file query_filter.cc.

References mutex_, and scopes_.

◆ getServedScopes()

std::set< std::string > isc::ha::QueryFilter::getServedScopes ( ) const

Returns served scopes.

This method is mostly useful for testing purposes.

Definition at line 329 of file query_filter.cc.

References mutex_, and scopes_.

Referenced by isc::ha::HAService::processHeartbeat(), and isc::ha::HAService::processStatusGet().

◆ inScope() [1/2]

bool isc::ha::QueryFilter::inScope ( const dhcp::Pkt4Ptr query4,
std::string &  scope_class 
) const

Checks if this server should process the DHCPv4 query.

This method uses a table of DHCPv4 message types to determine whether or not a query needs further analysis to determine which HA server should handle it or if it should simply be processed by this server.

For message types that qualify (e.g. DHCPDISCOVER, DHCPREQUEST, etc), it then takes into account enabled scopes for this server and HA mode to determine whether this query should be processed. It triggers load balancing when load balancing mode is enabled.

Non-qualifying message types (e.g. DHCPLEASEQUERY) are passed through for handling by this server.

Parameters
query4pointer to the DHCPv4 query instance.
[out]scope_classname of the class which corresponds to the name of the server which owns the packet. Those class names are used in subnets, pools and network configurations to associate them with different servers.
Returns
true if the specified query should be processed by this server, false otherwise.

Definition at line 363 of file query_filter.cc.

References mutex_.

Referenced by isc::ha::HAService::inScope().

◆ inScope() [2/2]

bool isc::ha::QueryFilter::inScope ( const dhcp::Pkt6Ptr query6,
std::string &  scope_class 
) const

Checks if this server should process the DHCPv6 query.

This method uses a table of DHCPv6 message types to determine whether or not a query needs further analysis to determine which HA server should handle it or if it should simply be processed by this server.

For message types that qualify (e.g. DHCPV6_SOLICIT, DHCPV6_REQUEST, etc), it then takes into account enabled scopes for this server and HA mode to determine whether this query should be processed. It triggers load balancing when load balancing mode is enabled.

Non-qualifying message types (e.g. DHCPV6_LEASEQUERY) are passed through for handling by this server.

Parameters
query6pointer to the DHCPv6 query instance.
[out]scope_classname of the class which corresponds to the name of the server which owns the packet. Those class names are used in subnets, pools and network configurations to associate them with different servers.
Returns
true if the specified query should be processed by this server, false otherwise.

Definition at line 373 of file query_filter.cc.

References config_, isc_throw, isHaType(), isc::ha::HAConfig::LOAD_BALANCING, loadBalance(), makeScopeClass(), mutex_, and peers_.

+ Here is the call graph for this function:

◆ isHaType() [1/2]

bool isc::ha::QueryFilter::isHaType ( const dhcp::Pkt4Ptr query4)
static

Determines if a DHCPv4 query is a message type HA should process.

Parameters
query4DHCPv4 packet to test. Must not be null.
Returns

Definition at line 350 of file query_filter.cc.

Referenced by inScope().

◆ isHaType() [2/2]

bool isc::ha::QueryFilter::isHaType ( const dhcp::Pkt6Ptr query6)
static

Determines if a DHCPv6 query is a message type HA should process.

Parameters
query6DHCPv6 packet to test. Must not be null.
Returns

Definition at line 356 of file query_filter.cc.

◆ loadBalance() [1/2]

int isc::ha::QueryFilter::loadBalance ( const dhcp::Pkt4Ptr query4) const
protected

Performs load balancing of the DHCPv4 queries.

This method returns an index of the server configuration held within peers_ vector. This points to a server which should process the given query. Currently, we only support load balancing between two servers, therefore this value should be 0 or 1.

Parameters
query4pointer to the DHCPv4 query instance.
Returns
Index of the server which should process the query. It returns negative value if the query is malformed, i.e. contains no HW address and no client identifier.

Definition at line 417 of file query_filter.cc.

References active_servers_, isc::log::DBGLVL_TRACE_BASIC, isc::dhcp::DHO_DHCP_CLIENT_IDENTIFIER, isc::ha::HA_LOAD_BALANCING_IDENTIFIER_MISSING, isc::ha::ha_logger, loadBalanceHash(), and LOG_DEBUG.

Referenced by inScope().

+ Here is the call graph for this function:

◆ loadBalance() [2/2]

int isc::ha::QueryFilter::loadBalance ( const dhcp::Pkt6Ptr query6) const
protected

Performs load balancing of the DHCPv6 queries.

This method returns an index of the server configuration held within peers_ vector. This points to a server which should process the given query. Currently, we only support load balancing between two servers, therefore this value should be 0 or 1.

Parameters
query6pointer to the DHCPv6 query instance.
Returns
Index of the server which should process the query. It returns negative value if the query is malformed, i.e. contains no DUID.

Definition at line 449 of file query_filter.cc.

References active_servers_, D6O_CLIENTID, isc::log::DBGLVL_TRACE_BASIC, isc::ha::HA_LOAD_BALANCING_DUID_MISSING, isc::ha::ha_logger, loadBalanceHash(), and LOG_DEBUG.

+ Here is the call graph for this function:

◆ loadBalanceHash()

uint8_t isc::ha::QueryFilter::loadBalanceHash ( const uint8_t *  key,
const size_t  key_len 
) const
protected

Compute load balancing hash.

The load balancing hash is computed according to section 6 if RFC3074.

Parameters
keyidentifier used to compute a hash, i.e. HW address or client identifier.
key_lenlength of the key.
Returns
Computed hash value.

Definition at line 472 of file query_filter.cc.

Referenced by loadBalance().

◆ makeScopeClass()

std::string isc::ha::QueryFilter::makeScopeClass ( const std::string &  scope_name) const
protected

Returns scope class name for the specified scope name.

When the server is designated to process a received DHCP query, it is often required to assign a class to this query which corresponds to the particular server. This class name is associated with the pools, subnets and/or networks which this server should hand out leases from.

This function converts scope name to the class name by prefixing the scope name with "ha_" string.

Parameters
scope_namescope name to be converted to class name.
Returns
Scope class name.

Definition at line 495 of file query_filter.cc.

Referenced by inScope().

◆ serveDefaultScopes()

void isc::ha::QueryFilter::serveDefaultScopes ( )

◆ serveFailoverScopes()

void isc::ha::QueryFilter::serveFailoverScopes ( )

Enable scopes required in failover case.

In the load balancing case, the scopes of the primary and secondary servers are enabled (this server will handle the entire traffic). In the hot standby case, the primary server's scope is enabled (this server will handle the entire traffic normally processed by the primary server).

Definition at line 262 of file query_filter.cc.

References mutex_, peers_, isc::ha::HAConfig::PeerConfig::PRIMARY, and isc::ha::HAConfig::PeerConfig::SECONDARY.

Referenced by isc::ha::HAService::partnerDownStateHandler(), and isc::ha::HAService::partnerInMaintenanceStateHandler().

◆ serveNoScopes()

◆ serveScope()

void isc::ha::QueryFilter::serveScope ( const std::string &  scope_name)

Enable scope.

Starts serving queries from the specified scope. It doesn't affect other scopes.

Parameters
scope_namename of the scope/server to be enabled.
Exceptions
BadValueif scope name doesn't match any of the server names.

Definition at line 173 of file query_filter.cc.

References mutex_, scopes_, and validateScopeName().

+ Here is the call graph for this function:

◆ serveScopeOnly()

void isc::ha::QueryFilter::serveScopeOnly ( const std::string &  scope_name)

Enable scope and disable all other scopes.

Starts serving queries from the specified scope. Disable all other scopes.

Parameters
scope_namename of the scope/server to be enabled.
Exceptions
BadValueif scope name doesn't match any of the server names.

Definition at line 189 of file query_filter.cc.

References mutex_, and validateScopeName().

+ Here is the call graph for this function:

◆ serveScopes()

void isc::ha::QueryFilter::serveScopes ( const std::vector< std::string > &  scopes)

Enables selected scopes.

All non listed scopes are disabled.

Parameters
scopesvector of scope names to be enabled.

Definition at line 206 of file query_filter.cc.

References mutex_, and scopes_.

Referenced by isc::ha::HAService::processScopes().

◆ validateScopeName()

void isc::ha::QueryFilter::validateScopeName ( const std::string &  scope_name) const
protected

Checks if the scope name matches a name of any of the configured servers.

Parameters
scope_namescope name to be tested.
Exceptions
BadValueif no server is found for a given scope name.

Definition at line 483 of file query_filter.cc.

References config_, and isc_throw.

Referenced by serveScope(), and serveScopeOnly().

Member Data Documentation

◆ active_servers_

int isc::ha::QueryFilter::active_servers_
protected

Number of the active servers in the given HA mode.

Definition at line 366 of file query_filter.h.

Referenced by loadBalance(), and QueryFilter().

◆ config_

HAConfigPtr isc::ha::QueryFilter::config_
protected

Pointer to the HA configuration.

Definition at line 356 of file query_filter.h.

Referenced by inScope(), QueryFilter(), serveDefaultScopes(), and validateScopeName().

◆ mutex_

boost::scoped_ptr<std::mutex> isc::ha::QueryFilter::mutex_
protected

Mutex to protect the internal state.

Definition at line 369 of file query_filter.h.

Referenced by amServingScope(), getServedScopes(), inScope(), serveDefaultScopes(), serveFailoverScopes(), serveNoScopes(), serveScope(), serveScopeOnly(), and serveScopes().

◆ peers_

std::vector<HAConfig::PeerConfigPtr> isc::ha::QueryFilter::peers_
protected

Vector of HA peers configurations.

Definition at line 359 of file query_filter.h.

Referenced by inScope(), QueryFilter(), serveFailoverScopes(), and serveNoScopes().

◆ scopes_

std::map<std::string, bool> isc::ha::QueryFilter::scopes_
protected

Holds mapping of the scope names to the flag which indicates if the scopes are enabled or disabled.

Definition at line 363 of file query_filter.h.

Referenced by amServingScope(), getServedScopes(), serveNoScopes(), serveScope(), and serveScopes().


The documentation for this class was generated from the following files: