}
void
-Dhcpv6Srv::initContext(const Pkt6Ptr& pkt,
+Dhcpv6Srv::initContext(const Subnet6Ptr& subnet,
+ const Pkt6Ptr& pkt,
AllocEngine::ClientContext6& ctx,
bool& drop) {
- ctx.subnet_ = selectSubnet(pkt, drop);
+ ctx.subnet_ = subnet;
ctx.fwd_dns_update_ = false;
ctx.rev_dns_update_ = false;
ctx.hostname_ = "";
ctx.callout_handle_ = getCalloutHandle(pkt);
- if (drop) {
- // Caller will immediately drop the packet so simply return now.
- return;
- }
-
// Collect host identifiers if host reservations enabled. The identifiers
// are stored in order of preference. The server will use them in that
// order to search for host reservations.
}
void
-Dhcpv6Srv::processPacketAndSendResponseNoThrow(Pkt6Ptr& query) {
+Dhcpv6Srv::processPacketAndSendResponseNoThrow(Pkt6Ptr query) {
try {
processPacketAndSendResponse(query);
} catch (const std::exception& e) {
}
void
-Dhcpv6Srv::processPacketAndSendResponse(Pkt6Ptr& query) {
- Pkt6Ptr rsp;
- processPacket(query, rsp);
+Dhcpv6Srv::processPacketAndSendResponse(Pkt6Ptr query) {
+ Pkt6Ptr rsp = processPacket(query);
if (!rsp) {
return;
}
processPacketBufferSend(callout_handle, rsp);
}
-void
-Dhcpv6Srv::processPacket(Pkt6Ptr& query, Pkt6Ptr& rsp) {
+Pkt6Ptr
+Dhcpv6Srv::processPacket(Pkt6Ptr query) {
// All packets belong to ALL.
query->addClass("ALL");
// Increase the statistic of dropped packets.
StatsMgr::instance().addValue("pkt6-receive-drop",
static_cast<int64_t>(1));
- return;
+ return (Pkt6Ptr());
}
callout_handle->getArgument("query6", query);
+ if (!query) {
+ // Please use the status instead of resetting query!
+ return (Pkt6Ptr());
+ }
}
// Unpack the packet information unless the buffer6_receive callouts
static_cast<int64_t>(1));
StatsMgr::instance().addValue("pkt6-receive-drop",
static_cast<int64_t>(1));
- return;
+ return (Pkt6Ptr());
}
}
// Increase the statistic of dropped packets.
StatsMgr::instance().addValue("pkt6-receive-drop", static_cast<int64_t>(1));
- return;
+ return (Pkt6Ptr());
}
// Check if the received query has been sent to unicast or multicast.
// Increase the statistic of dropped packets.
StatsMgr::instance().addValue("pkt6-receive-drop", static_cast<int64_t>(1));
- return;
+ return (Pkt6Ptr());
}
// Assign this packet to a class, if possible
// Increase the statistic of dropped packets.
StatsMgr::instance().addValue("pkt6-receive-drop",
static_cast<int64_t>(1));
- return;
+ return (Pkt6Ptr());
}
callout_handle->getArgument("query6", query);
+ if (!query) {
+ // Please use the status instead of resetting query!
+ return (Pkt6Ptr());
+ }
}
// Reject the message if it doesn't pass the sanity check.
if (!sanityCheck(query)) {
- return;
+ return (Pkt6Ptr());
}
// Check the DROP special class.
.arg(query->toText());
StatsMgr::instance().addValue("pkt6-receive-drop",
static_cast<int64_t>(1));
- return;
+ return (Pkt6Ptr());
}
- processDhcp6Query(query, rsp);
+ return (processDhcp6Query(query));
}
void
-Dhcpv6Srv::processDhcp6QueryAndSendResponse(Pkt6Ptr& query, Pkt6Ptr& rsp) {
+Dhcpv6Srv::processDhcp6QueryAndSendResponse(Pkt6Ptr query) {
try {
- processDhcp6Query(query, rsp);
+ Pkt6Ptr rsp = processDhcp6Query(query);
if (!rsp) {
return;
}
}
}
-void
-Dhcpv6Srv::processDhcp6Query(Pkt6Ptr& query, Pkt6Ptr& rsp) {
+Pkt6Ptr
+Dhcpv6Srv::processDhcp6Query(Pkt6Ptr query) {
// Create a client race avoidance RAII handler.
ClientHandler client_handler;
(query->getType() == DHCPV6_DECLINE))) {
ContinuationPtr cont =
makeContinuation(std::bind(&Dhcpv6Srv::processDhcp6QueryAndSendResponse,
- this, query, rsp));
+ this, query));
if (!client_handler.tryLock(query, cont)) {
- return;
+ return (Pkt6Ptr());
}
}
// Let's create a simplified client context here.
AllocEngine::ClientContext6 ctx;
if (!earlyGHRLookup(query, ctx)) {
- return;
+ return (Pkt6Ptr());
}
if (query->getType() == DHCPV6_DHCPV4_QUERY) {
// This call never throws. Should this change, this section must be
// enclosed in try-catch.
processDhcp4Query(query);
- return;
+ return (Pkt6Ptr());
}
// Complete the client context initialization.
bool drop = false;
- initContext(query, ctx, drop);
-
- // Stop here if initContext decided to drop the packet.
+ Subnet6Ptr subnet = selectSubnet(query, drop);
if (drop) {
- return;
+ // Caller will immediately drop the packet so simply return now.
+ return (Pkt6Ptr());
}
// Park point here.
+ initContext(subnet, query, ctx, drop);
+ // Stop here if initContext decided to drop the packet.
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+
+ Pkt6Ptr rsp;
try {
switch (query->getType()) {
case DHCPV6_SOLICIT:
break;
default:
- return;
+ return (rsp);
}
} catch (const std::exception& e) {
}
if (!rsp) {
- return;
+ return (rsp);
}
// Process relay-supplied options. It is important to call this very
isc::stats::StatsMgr::instance().addValue("pkt6-receive-drop",
static_cast<int64_t>(1));
rsp.reset();
- return;
+ return (rsp);
}
}
if (rsp) {
processPacketPktSend(callout_handle, query, rsp);
}
+
+ return (rsp);
}
void
Dhcpv6Srv::sendResponseNoThrow(hooks::CalloutHandlePtr& callout_handle,
- Pkt6Ptr& query, Pkt6Ptr& rsp) {
+ Pkt6Ptr query, Pkt6Ptr& rsp) {
try {
processPacketPktSend(callout_handle, query, rsp);
processPacketBufferSend(callout_handle, rsp);
-// Copyright (C) 2011-2022 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2023 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
/// methods, generates appropriate answer, sends the answer to the client.
///
/// @param query A pointer to the packet to be processed.
- void processPacketAndSendResponse(Pkt6Ptr& query);
+ void processPacketAndSendResponse(Pkt6Ptr query);
/// @brief Process a single incoming DHCPv6 packet and sends the response.
///
/// methods, generates appropriate answer, sends the answer to the client.
///
/// @param query A pointer to the packet to be processed.
- void processPacketAndSendResponseNoThrow(Pkt6Ptr& query);
+ void processPacketAndSendResponseNoThrow(Pkt6Ptr query);
/// @brief Process an unparked DHCPv6 packet and sends the response.
///
/// @param query A pointer to the packet to be processed.
/// @param rsp A pointer to the response.
void sendResponseNoThrow(hooks::CalloutHandlePtr& callout_handle,
- Pkt6Ptr& query, Pkt6Ptr& rsp);
+ Pkt6Ptr query, Pkt6Ptr& rsp);
/// @brief Process a single incoming DHCPv6 packet.
///
/// methods, generates appropriate answer.
///
/// @param query A pointer to the packet to be processed.
- /// @param rsp A pointer to the response.
- void processPacket(Pkt6Ptr& query, Pkt6Ptr& rsp);
+ /// @return A pointer to the response.
+ Pkt6Ptr processPacket(Pkt6Ptr query);
/// @brief Process a single incoming DHCPv6 query.
///
/// It calls per-type processXXX methods, generates appropriate answer.
///
/// @param query A pointer to the packet to be processed.
- /// @param rsp A pointer to the response.
- void processDhcp6Query(Pkt6Ptr& query, Pkt6Ptr& rsp);
+ /// @return A pointer to the response.
+ Pkt6Ptr processDhcp6Query(Pkt6Ptr query);
/// @brief Process a single incoming DHCPv6 query.
///
/// sends the answer to the client.
///
/// @param query A pointer to the packet to be processed.
- /// @param rsp A pointer to the response.
- void processDhcp6QueryAndSendResponse(Pkt6Ptr& query, Pkt6Ptr& rsp);
+ void processDhcp6QueryAndSendResponse(Pkt6Ptr query);
/// @brief Instructs the server to shut down.
void shutdown() override;
/// @brief Initializes client context for specified packet
///
/// This method:
- /// - Performs the subnet selection and stores the result in context
/// - Extracts the duid from the packet and saves it to the context
/// - Extracts the hardware address from the packet and saves it to
/// the context
/// the Rapid Commit option was included and that the server respects
/// it.
///
+ /// @param subnet Selected subnet.
/// @param pkt pointer to a packet for which context will be created.
/// @param [out] ctx reference to context object to be initialized.
/// @param [out] drop if it is true the packet will be dropped.
- void initContext(const Pkt6Ptr& pkt,
+ void initContext(const Subnet6Ptr& subnet,
+ const Pkt6Ptr& pkt,
AllocEngine::ClientContext6& ctx,
bool& drop);
AllocEngine::ClientContext6 ctx1;
bool drop = !srv.earlyGHRLookup(query1, ctx1);
ASSERT_FALSE(drop);
- srv.initContext(query1, ctx1, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query1, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query1, ctx1, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response1 = srv.processSolicit(ctx1);
AllocEngine::ClientContext6 ctx2;
drop = !srv.earlyGHRLookup(query2, ctx2);
ASSERT_FALSE(drop);
- srv.initContext(query2, ctx2, drop);
+ subnet = srv_.selectSubnet(query2, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query2, ctx2, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response2 = srv.processSolicit(ctx2);
AllocEngine::ClientContext6 ctx3;
drop = !srv.earlyGHRLookup(query3, ctx3);
ASSERT_FALSE(drop);
- srv.initContext(query3, ctx3, drop);
+ subnet = srv_.selectSubnet(query3, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query3, ctx3, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response3 = srv.processSolicit(ctx3);
AllocEngine::ClientContext6 ctx1;
bool drop = !srv.earlyGHRLookup(query1, ctx1);
ASSERT_FALSE(drop);
- srv.initContext(query1, ctx1, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query1, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query1, ctx1, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response1 = srv.processSolicit(ctx1);
AllocEngine::ClientContext6 ctx2;
drop = !srv.earlyGHRLookup(query2, ctx2);
ASSERT_FALSE(drop);
- srv.initContext(query2, ctx2, drop);
+ subnet = srv_.selectSubnet(query2, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query2, ctx2, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response2 = srv.processSolicit(ctx2);
AllocEngine::ClientContext6 ctx3;
drop = !srv.earlyGHRLookup(query3, ctx3);
ASSERT_FALSE(drop);
- srv.initContext(query3, ctx3, drop);
+ subnet = srv_.selectSubnet(query3, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query3, ctx3, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response3 = srv.processSolicit(ctx3);
AllocEngine::ClientContext6 ctx1;
bool drop = !srv.earlyGHRLookup(query1, ctx1);
ASSERT_FALSE(drop);
- srv.initContext(query1, ctx1, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query1, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query1, ctx1, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response1 = srv.processSolicit(ctx1);
AllocEngine::ClientContext6 ctx2;
drop = !srv.earlyGHRLookup(query2, ctx2);
ASSERT_FALSE(drop);
- srv.initContext(query2, ctx2, drop);
+ subnet = srv_.selectSubnet(query2, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query2, ctx2, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response2 = srv.processSolicit(ctx2);
AllocEngine::ClientContext6 ctx3;
drop = !srv.earlyGHRLookup(query3, ctx3);
ASSERT_FALSE(drop);
- srv.initContext(query3, ctx3, drop);
+ subnet = srv_.selectSubnet(query3, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query3, ctx3, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response3 = srv.processSolicit(ctx3);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(query, ctx);
ASSERT_FALSE(drop);
- srv.initContext(query, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(query, ctx);
ASSERT_FALSE(drop);
- srv.initContext(query, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(query, ctx);
ASSERT_FALSE(drop);
- srv.initContext(query, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(query, ctx);
ASSERT_FALSE(drop);
- srv.initContext(query, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(query, ctx);
ASSERT_FALSE(drop);
- srv.initContext(query, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx1;
bool drop = !srv.earlyGHRLookup(query1, ctx1);
ASSERT_FALSE(drop);
- srv.initContext(query1, ctx1, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query1, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query1, ctx1, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response1 = srv.processSolicit(ctx1);
ASSERT_TRUE(response1);
AllocEngine::ClientContext6 ctx2;
drop = !srv.earlyGHRLookup(query2, ctx2);
ASSERT_FALSE(drop);
- srv.initContext(query2, ctx2, drop);
+ subnet = srv_.selectSubnet(query2, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query2, ctx2, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response2 = srv.processSolicit(ctx2);
ASSERT_TRUE(response2);
AllocEngine::ClientContext6 ctx3;
drop = !srv.earlyGHRLookup(query3, ctx3);
ASSERT_FALSE(drop);
- srv.initContext(query3, ctx3, drop);
+ subnet = srv_.selectSubnet(query3, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query3, ctx3, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response3 = srv.processSolicit(ctx3);
ASSERT_TRUE(response3);
AllocEngine::ClientContext6 ctx1;
bool drop = !srv.earlyGHRLookup(query1, ctx1);
ASSERT_FALSE(drop);
- srv.initContext(query1, ctx1, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query1, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query1, ctx1, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response1 = srv.processSolicit(ctx1);
ASSERT_TRUE(response1);
AllocEngine::ClientContext6 ctx2;
drop = !srv.earlyGHRLookup(query2, ctx2);
ASSERT_FALSE(drop);
- srv.initContext(query2, ctx2, drop);
+ subnet = srv_.selectSubnet(query2, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query2, ctx2, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response2 = srv.processSolicit(ctx2);
ASSERT_TRUE(response2);
AllocEngine::ClientContext6 ctx1;
bool drop = !srv.earlyGHRLookup(query1, ctx1);
ASSERT_FALSE(drop);
- srv.initContext(query1, ctx1, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(query1, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query1, ctx1, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response1 = srv.processSolicit(ctx1);
AllocEngine::ClientContext6 ctx2;
drop = !srv.earlyGHRLookup(query2, ctx2);
ASSERT_FALSE(drop);
- srv.initContext(query2, ctx2, drop);
+ subnet = srv_.selectSubnet(query2, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query2, ctx2, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response2 = srv.processSolicit(ctx2);
AllocEngine::ClientContext6 ctx3;
drop = !srv.earlyGHRLookup(query3, ctx3);
ASSERT_FALSE(drop);
- srv.initContext(query3, ctx3, drop);
+ subnet = srv_.selectSubnet(query3, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, query3, ctx3, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response3 = srv.processSolicit(ctx3);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr adv = srv_.processSolicit(ctx);
AllocEngine::ClientContext6 ctx2;
drop = !srv_.earlyGHRLookup(sol, ctx2);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx2, drop);
+ subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx2, drop);
ASSERT_FALSE(drop);
adv = srv_.processSolicit(ctx2);
ASSERT_TRUE(adv);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx1;
bool drop = !srv.earlyGHRLookup(sol1, ctx1);
ASSERT_FALSE(drop);
- srv.initContext(sol1, ctx1, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol1, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol1, ctx1, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply1 = srv.processSolicit(ctx1);
AllocEngine::ClientContext6 ctx2;
drop = !srv.earlyGHRLookup(sol2, ctx2);
ASSERT_FALSE(drop);
- srv.initContext(sol2, ctx2, drop);
+ subnet = srv.selectSubnet(sol2, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol2, ctx2, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply2 = srv.processSolicit(ctx2);
AllocEngine::ClientContext6 ctx3;
drop = !srv.earlyGHRLookup(sol3, ctx3);
ASSERT_FALSE(drop);
- srv.initContext(sol3, ctx3, drop);
+ subnet = srv.selectSubnet(sol3, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol3, ctx3, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply3 = srv.processSolicit(ctx3);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(req, ctx);
ASSERT_FALSE(drop);
- srv.initContext(req, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(req, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, req, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processRequest(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(req, ctx);
ASSERT_FALSE(drop);
- srv.initContext(req, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(req, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, req, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processRequest(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(req, ctx);
ASSERT_FALSE(drop);
- srv.initContext(req, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(req, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, req, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processRenew(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(req, ctx);
ASSERT_FALSE(drop);
- srv.initContext(req, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(req, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, req, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processRenew(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response = srv_.processSolicit(ctx);
AllocEngine::ClientContext6 ctx2;
drop = !srv_.earlyGHRLookup(sol, ctx2);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx2, drop);
+ subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx2, drop);
ASSERT_FALSE(drop);
response = srv_.processSolicit(ctx2);
AllocEngine::ClientContext6 ctx3;
drop = !srv_.earlyGHRLookup(sol, ctx3);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx3, drop);
+ subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx3, drop);
ASSERT_FALSE(drop);
response = srv_.processSolicit(ctx3);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr response = srv_.processSolicit(ctx);
AllocEngine::ClientContext6 ctx2;
drop = !srv_.earlyGHRLookup(sol, ctx2);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx2, drop);
+ subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx2, drop);
ASSERT_FALSE(drop);
response = srv_.processSolicit(ctx2);
AllocEngine::ClientContext6 ctx3;
drop = !srv_.earlyGHRLookup(sol, ctx3);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx3, drop);
+ subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx3, drop);
ASSERT_FALSE(drop);
response = srv_.processSolicit(ctx3);
AllocEngine::ClientContext6 ctx;
bool drop = !srv.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr reply = srv.processSolicit(ctx);
Pkt6Ptr processSolicit(const Pkt6Ptr& solicit) {
AllocEngine::ClientContext6 ctx;
bool drop = !earlyGHRLookup(solicit, ctx);
- initContext(solicit, ctx, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ Subnet6Ptr subnet = selectSubnet(solicit, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ initContext(subnet, solicit, ctx, drop);
if (drop) {
return (Pkt6Ptr());
}
Pkt6Ptr processRequest(const Pkt6Ptr& request) {
AllocEngine::ClientContext6 ctx;
bool drop = !earlyGHRLookup(request, ctx);
- initContext(request, ctx, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ Subnet6Ptr subnet = selectSubnet(request, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ initContext(subnet, request, ctx, drop);
if (drop) {
return (Pkt6Ptr());
}
Pkt6Ptr processRenew(const Pkt6Ptr& renew) {
AllocEngine::ClientContext6 ctx;
bool drop = !earlyGHRLookup(renew, ctx);
- initContext(renew, ctx, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ Subnet6Ptr subnet = selectSubnet(renew, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ initContext(subnet, renew, ctx, drop);
if (drop) {
return (Pkt6Ptr());
}
Pkt6Ptr processRebind(const Pkt6Ptr& rebind) {
AllocEngine::ClientContext6 ctx;
bool drop = !earlyGHRLookup(rebind, ctx);
- initContext(rebind, ctx, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ Subnet6Ptr subnet = selectSubnet(rebind, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ initContext(subnet, rebind, ctx, drop);
if (drop) {
return (Pkt6Ptr());
}
Pkt6Ptr processRelease(const Pkt6Ptr& release) {
AllocEngine::ClientContext6 ctx;
bool drop = !earlyGHRLookup(release, ctx);
- initContext(release, ctx, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ Subnet6Ptr subnet = selectSubnet(release, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ initContext(subnet, release, ctx, drop);
if (drop) {
return (Pkt6Ptr());
}
Pkt6Ptr processDecline(const Pkt6Ptr& decline) {
AllocEngine::ClientContext6 ctx;
bool drop = !earlyGHRLookup(decline, ctx);
- initContext(decline, ctx, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ Subnet6Ptr subnet = selectSubnet(decline, drop);
+ if (drop) {
+ return (Pkt6Ptr());
+ }
+ initContext(subnet, decline, ctx, drop);
if (drop) {
return (Pkt6Ptr());
}
AllocEngine::ClientContext6 ctx;
bool drop = !srv_->earlyGHRLookup(query, ctx);
ASSERT_FALSE(drop);
- srv_->initContext(query, ctx, drop);
+ Subnet6Ptr subnet = srv_->selectSubnet(query, drop);
+ ASSERT_FALSE(drop);
+ srv_->initContext(subnet, query, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr answer = generateMessageWithIds(DHCPV6_ADVERTISE);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_->earlyGHRLookup(req, ctx);
ASSERT_FALSE(drop);
- srv_->initContext(req, ctx, drop);
+ Subnet6Ptr subnet = srv_->selectSubnet(req, drop);
+ ASSERT_FALSE(drop);
+ srv_->initContext(subnet, req, ctx, drop);
ASSERT_FALSE(drop);
if (msg_type == DHCPV6_SOLICIT) {
AllocEngine::ClientContext6 ctx;
bool drop = !srv_->earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_->initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_->selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_->initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr adv = srv_->processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_->earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_->initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_->selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_->initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr adv = srv_->processSolicit(ctx);
// Advertised address must belong to the second pool (in subnet's range,
// in dynamic pool)
- auto subnet = subnets->begin();
- ++subnet;
- EXPECT_TRUE((*subnet)->inRange(addr_opt->getAddress()));
- EXPECT_TRUE((*subnet)->inPool(Lease::TYPE_NA, addr_opt->getAddress()));
+ auto subnet6 = subnets->begin();
+ ++subnet6;
+ EXPECT_TRUE((*subnet6)->inRange(addr_opt->getAddress()));
+ EXPECT_TRUE((*subnet6)->inPool(Lease::TYPE_NA, addr_opt->getAddress()));
// Check if the callout handle state was reset after the callout.
checkCalloutHandleReset(sol);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_->earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_->initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_->selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_->initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr adv = srv_->processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_->earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_->initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_->selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_->initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr adv = srv_->processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr adv = srv_.processSolicit(ctx);
AllocEngine::ClientContext6 ctx2;
drop = !srv_.earlyGHRLookup(sol, ctx2);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx2, drop);
+ subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx2, drop);
ASSERT_FALSE(drop);
adv = srv_.processSolicit(ctx2);
ASSERT_TRUE(adv);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr adv = srv_.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr adv = srv_.processSolicit(ctx);
AllocEngine::ClientContext6 ctx;
bool drop = !srv_.earlyGHRLookup(sol, ctx);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx, drop);
+ Subnet6Ptr subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx, drop);
ASSERT_FALSE(drop);
Pkt6Ptr adv = srv_.processSolicit(ctx);
AllocEngine::ClientContext6 ctx3;
drop = !srv_.earlyGHRLookup(sol, ctx3);
ASSERT_FALSE(drop);
- srv_.initContext(sol, ctx3, drop);
+ subnet = srv_.selectSubnet(sol, drop);
+ ASSERT_FALSE(drop);
+ srv_.initContext(subnet, sol, ctx3, drop);
ASSERT_FALSE(drop);
adv = srv_.processSolicit(ctx3);
ASSERT_TRUE(adv);