@@ -492,20 +492,16 @@ Dhcpv6Srv::earlyGHRLookup(const Pkt6Ptr& query,
492
492
}
493
493
494
494
void
495
- Dhcpv6Srv::initContext (const Pkt6Ptr& pkt,
495
+ Dhcpv6Srv::initContext (const Subnet6Ptr& subnet,
496
+ const Pkt6Ptr& pkt,
496
497
AllocEngine::ClientContext6& ctx,
497
498
bool & drop) {
498
- ctx.subnet_ = selectSubnet (pkt, drop) ;
499
+ ctx.subnet_ = subnet ;
499
500
ctx.fwd_dns_update_ = false ;
500
501
ctx.rev_dns_update_ = false ;
501
502
ctx.hostname_ = " " ;
502
503
ctx.callout_handle_ = getCalloutHandle (pkt);
503
504
504
- if (drop) {
505
- // Caller will immediately drop the packet so simply return now.
506
- return ;
507
- }
508
-
509
505
// Collect host identifiers if host reservations enabled. The identifiers
510
506
// are stored in order of preference. The server will use them in that
511
507
// order to search for host reservations.
@@ -703,7 +699,7 @@ Dhcpv6Srv::runOne() {
703
699
}
704
700
705
701
void
706
- Dhcpv6Srv::processPacketAndSendResponseNoThrow (Pkt6Ptr& query) {
702
+ Dhcpv6Srv::processPacketAndSendResponseNoThrow (Pkt6Ptr query) {
707
703
try {
708
704
processPacketAndSendResponse (query);
709
705
} catch (const std::exception & e) {
@@ -715,9 +711,8 @@ Dhcpv6Srv::processPacketAndSendResponseNoThrow(Pkt6Ptr& query) {
715
711
}
716
712
717
713
void
718
- Dhcpv6Srv::processPacketAndSendResponse (Pkt6Ptr& query) {
719
- Pkt6Ptr rsp;
720
- processPacket (query, rsp);
714
+ Dhcpv6Srv::processPacketAndSendResponse (Pkt6Ptr query) {
715
+ Pkt6Ptr rsp = processPacket (query);
721
716
if (!rsp) {
722
717
return ;
723
718
}
@@ -726,8 +721,8 @@ Dhcpv6Srv::processPacketAndSendResponse(Pkt6Ptr& query) {
726
721
processPacketBufferSend (callout_handle, rsp);
727
722
}
728
723
729
- void
730
- Dhcpv6Srv::processPacket (Pkt6Ptr& query, Pkt6Ptr& rsp ) {
724
+ Pkt6Ptr
725
+ Dhcpv6Srv::processPacket (Pkt6Ptr query) {
731
726
// All packets belong to ALL.
732
727
query->addClass (" ALL" );
733
728
@@ -777,10 +772,14 @@ Dhcpv6Srv::processPacket(Pkt6Ptr& query, Pkt6Ptr& rsp) {
777
772
// Increase the statistic of dropped packets.
778
773
StatsMgr::instance ().addValue (" pkt6-receive-drop" ,
779
774
static_cast <int64_t >(1 ));
780
- return ;
775
+ return ( Pkt6Ptr ()) ;
781
776
}
782
777
783
778
callout_handle->getArgument (" query6" , query);
779
+ if (!query) {
780
+ // Please use the status instead of resetting query!
781
+ return (Pkt6Ptr ());
782
+ }
784
783
}
785
784
786
785
// Unpack the packet information unless the buffer6_receive callouts
@@ -812,7 +811,7 @@ Dhcpv6Srv::processPacket(Pkt6Ptr& query, Pkt6Ptr& rsp) {
812
811
static_cast <int64_t >(1 ));
813
812
StatsMgr::instance ().addValue (" pkt6-receive-drop" ,
814
813
static_cast <int64_t >(1 ));
815
- return ;
814
+ return ( Pkt6Ptr ()) ;
816
815
}
817
816
}
818
817
@@ -829,7 +828,7 @@ Dhcpv6Srv::processPacket(Pkt6Ptr& query, Pkt6Ptr& rsp) {
829
828
830
829
// Increase the statistic of dropped packets.
831
830
StatsMgr::instance ().addValue (" pkt6-receive-drop" , static_cast <int64_t >(1 ));
832
- return ;
831
+ return ( Pkt6Ptr ()) ;
833
832
}
834
833
835
834
// Check if the received query has been sent to unicast or multicast.
@@ -839,7 +838,7 @@ Dhcpv6Srv::processPacket(Pkt6Ptr& query, Pkt6Ptr& rsp) {
839
838
840
839
// Increase the statistic of dropped packets.
841
840
StatsMgr::instance ().addValue (" pkt6-receive-drop" , static_cast <int64_t >(1 ));
842
- return ;
841
+ return ( Pkt6Ptr ()) ;
843
842
}
844
843
845
844
// Assign this packet to a class, if possible
@@ -887,15 +886,19 @@ Dhcpv6Srv::processPacket(Pkt6Ptr& query, Pkt6Ptr& rsp) {
887
886
// Increase the statistic of dropped packets.
888
887
StatsMgr::instance ().addValue (" pkt6-receive-drop" ,
889
888
static_cast <int64_t >(1 ));
890
- return ;
889
+ return ( Pkt6Ptr ()) ;
891
890
}
892
891
893
892
callout_handle->getArgument (" query6" , query);
893
+ if (!query) {
894
+ // Please use the status instead of resetting query!
895
+ return (Pkt6Ptr ());
896
+ }
894
897
}
895
898
896
899
// Reject the message if it doesn't pass the sanity check.
897
900
if (!sanityCheck (query)) {
898
- return ;
901
+ return ( Pkt6Ptr ()) ;
899
902
}
900
903
901
904
// Check the DROP special class.
@@ -905,16 +908,16 @@ Dhcpv6Srv::processPacket(Pkt6Ptr& query, Pkt6Ptr& rsp) {
905
908
.arg (query->toText ());
906
909
StatsMgr::instance ().addValue (" pkt6-receive-drop" ,
907
910
static_cast <int64_t >(1 ));
908
- return ;
911
+ return ( Pkt6Ptr ()) ;
909
912
}
910
913
911
- processDhcp6Query (query, rsp );
914
+ return ( processDhcp6Query (query) );
912
915
}
913
916
914
917
void
915
- Dhcpv6Srv::processDhcp6QueryAndSendResponse (Pkt6Ptr& query, Pkt6Ptr& rsp ) {
918
+ Dhcpv6Srv::processDhcp6QueryAndSendResponse (Pkt6Ptr query) {
916
919
try {
917
- processDhcp6Query (query, rsp );
920
+ Pkt6Ptr rsp = processDhcp6Query (query);
918
921
if (!rsp) {
919
922
return ;
920
923
}
@@ -929,8 +932,8 @@ Dhcpv6Srv::processDhcp6QueryAndSendResponse(Pkt6Ptr& query, Pkt6Ptr& rsp) {
929
932
}
930
933
}
931
934
932
- void
933
- Dhcpv6Srv::processDhcp6Query (Pkt6Ptr& query, Pkt6Ptr& rsp ) {
935
+ Pkt6Ptr
936
+ Dhcpv6Srv::processDhcp6Query (Pkt6Ptr query) {
934
937
// Create a client race avoidance RAII handler.
935
938
ClientHandler client_handler;
936
939
@@ -944,36 +947,42 @@ Dhcpv6Srv::processDhcp6Query(Pkt6Ptr& query, Pkt6Ptr& rsp) {
944
947
(query->getType () == DHCPV6_DECLINE))) {
945
948
ContinuationPtr cont =
946
949
makeContinuation (std::bind (&Dhcpv6Srv::processDhcp6QueryAndSendResponse,
947
- this , query, rsp ));
950
+ this , query));
948
951
if (!client_handler.tryLock (query, cont)) {
949
- return ;
952
+ return ( Pkt6Ptr ()) ;
950
953
}
951
954
}
952
955
953
956
// Let's create a simplified client context here.
954
957
AllocEngine::ClientContext6 ctx;
955
958
if (!earlyGHRLookup (query, ctx)) {
956
- return ;
959
+ return ( Pkt6Ptr ()) ;
957
960
}
958
961
959
962
if (query->getType () == DHCPV6_DHCPV4_QUERY) {
960
963
// This call never throws. Should this change, this section must be
961
964
// enclosed in try-catch.
962
965
processDhcp4Query (query);
963
- return ;
966
+ return ( Pkt6Ptr ()) ;
964
967
}
965
968
966
969
// Complete the client context initialization.
967
970
bool drop = false ;
968
- initContext (query, ctx, drop);
969
-
970
- // Stop here if initContext decided to drop the packet.
971
+ Subnet6Ptr subnet = selectSubnet (query, drop);
971
972
if (drop) {
972
- return ;
973
+ // Caller will immediately drop the packet so simply return now.
974
+ return (Pkt6Ptr ());
973
975
}
974
976
975
977
// Park point here.
976
978
979
+ initContext (subnet, query, ctx, drop);
980
+ // Stop here if initContext decided to drop the packet.
981
+ if (drop) {
982
+ return (Pkt6Ptr ());
983
+ }
984
+
985
+ Pkt6Ptr rsp;
977
986
try {
978
987
switch (query->getType ()) {
979
988
case DHCPV6_SOLICIT:
@@ -1009,7 +1018,7 @@ Dhcpv6Srv::processDhcp6Query(Pkt6Ptr& query, Pkt6Ptr& rsp) {
1009
1018
break ;
1010
1019
1011
1020
default :
1012
- return ;
1021
+ return (rsp) ;
1013
1022
}
1014
1023
1015
1024
} catch (const std::exception & e) {
@@ -1031,7 +1040,7 @@ Dhcpv6Srv::processDhcp6Query(Pkt6Ptr& query, Pkt6Ptr& rsp) {
1031
1040
}
1032
1041
1033
1042
if (!rsp) {
1034
- return ;
1043
+ return (rsp) ;
1035
1044
}
1036
1045
1037
1046
// Process relay-supplied options. It is important to call this very
@@ -1162,7 +1171,7 @@ Dhcpv6Srv::processDhcp6Query(Pkt6Ptr& query, Pkt6Ptr& rsp) {
1162
1171
isc::stats::StatsMgr::instance ().addValue (" pkt6-receive-drop" ,
1163
1172
static_cast <int64_t >(1 ));
1164
1173
rsp.reset ();
1165
- return ;
1174
+ return (rsp) ;
1166
1175
}
1167
1176
}
1168
1177
@@ -1219,11 +1228,13 @@ Dhcpv6Srv::processDhcp6Query(Pkt6Ptr& query, Pkt6Ptr& rsp) {
1219
1228
if (rsp) {
1220
1229
processPacketPktSend (callout_handle, query, rsp);
1221
1230
}
1231
+
1232
+ return (rsp);
1222
1233
}
1223
1234
1224
1235
void
1225
1236
Dhcpv6Srv::sendResponseNoThrow (hooks::CalloutHandlePtr& callout_handle,
1226
- Pkt6Ptr& query, Pkt6Ptr& rsp) {
1237
+ Pkt6Ptr query, Pkt6Ptr& rsp) {
1227
1238
try {
1228
1239
processPacketPktSend (callout_handle, query, rsp);
1229
1240
processPacketBufferSend (callout_handle, rsp);
0 commit comments