@@ -928,14 +928,22 @@ Dhcpv4Srv::sendPacket(const Pkt4Ptr& packet) {
928
928
IfaceMgr::instance ().send (packet);
929
929
}
930
930
931
- bool
932
- Dhcpv4Srv::earlyGHRLookup (const Pkt4Ptr& query,
933
- AllocEngine::ClientContext4Ptr ctx) {
931
+ void
932
+ Dhcpv4Srv::initContext0 (const Pkt4Ptr& query,
933
+ AllocEngine::ClientContext4Ptr ctx) {
934
934
// Pointer to client's query.
935
935
ctx->query_ = query;
936
936
937
937
// Hardware address.
938
938
ctx->hwaddr_ = query->getHWAddr ();
939
+ }
940
+
941
+ bool
942
+ Dhcpv4Srv::earlyGHRLookup (const Pkt4Ptr& query,
943
+ AllocEngine::ClientContext4Ptr ctx) {
944
+
945
+ // First part of context initialization.
946
+ initContext0 (query, ctx);
939
947
940
948
// Get the early-global-reservations-lookup flag value.
941
949
data::ConstElementPtr egrl = CfgMgr::instance ().getCurrentCfg ()->
@@ -1115,7 +1123,7 @@ Dhcpv4Srv::runOne() {
1115
1123
}
1116
1124
1117
1125
void
1118
- Dhcpv4Srv::processPacketAndSendResponseNoThrow (Pkt4Ptr& query) {
1126
+ Dhcpv4Srv::processPacketAndSendResponseNoThrow (Pkt4Ptr query) {
1119
1127
try {
1120
1128
processPacketAndSendResponse (query);
1121
1129
} catch (const std::exception & e) {
@@ -1127,9 +1135,8 @@ Dhcpv4Srv::processPacketAndSendResponseNoThrow(Pkt4Ptr& query) {
1127
1135
}
1128
1136
1129
1137
void
1130
- Dhcpv4Srv::processPacketAndSendResponse (Pkt4Ptr& query) {
1131
- Pkt4Ptr rsp;
1132
- processPacket (query, rsp);
1138
+ Dhcpv4Srv::processPacketAndSendResponse (Pkt4Ptr query) {
1139
+ Pkt4Ptr rsp = processPacket (query);
1133
1140
if (!rsp) {
1134
1141
return ;
1135
1142
}
@@ -1139,8 +1146,8 @@ Dhcpv4Srv::processPacketAndSendResponse(Pkt4Ptr& query) {
1139
1146
processPacketBufferSend (callout_handle, rsp);
1140
1147
}
1141
1148
1142
- void
1143
- Dhcpv4Srv::processPacket (Pkt4Ptr& query, Pkt4Ptr& rsp , bool allow_packet_park) {
1149
+ Pkt4Ptr
1150
+ Dhcpv4Srv::processPacket (Pkt4Ptr query, bool allow_packet_park) {
1144
1151
query->addPktEvent (" process_started" );
1145
1152
1146
1153
// All packets belong to ALL.
@@ -1185,7 +1192,7 @@ Dhcpv4Srv::processPacket(Pkt4Ptr& query, Pkt4Ptr& rsp, bool allow_packet_park) {
1185
1192
.arg (query->getRemoteAddr ().toText ())
1186
1193
.arg (query->getLocalAddr ().toText ())
1187
1194
.arg (query->getIface ());
1188
- return ;
1195
+ return ( Pkt4Ptr ()); ;
1189
1196
}
1190
1197
1191
1198
// Callouts decided to skip the next processing step. The next
@@ -1233,7 +1240,7 @@ Dhcpv4Srv::processPacket(Pkt4Ptr& query, Pkt4Ptr& rsp, bool allow_packet_park) {
1233
1240
static_cast <int64_t >(1 ));
1234
1241
isc::stats::StatsMgr::instance ().addValue (" pkt4-receive-drop" ,
1235
1242
static_cast <int64_t >(1 ));
1236
- return ;
1243
+ return ( Pkt4Ptr ()) ;
1237
1244
}
1238
1245
}
1239
1246
@@ -1258,7 +1265,7 @@ Dhcpv4Srv::processPacket(Pkt4Ptr& query, Pkt4Ptr& rsp, bool allow_packet_park) {
1258
1265
// Increase the statistic of dropped packets.
1259
1266
isc::stats::StatsMgr::instance ().addValue (" pkt4-receive-drop" ,
1260
1267
static_cast <int64_t >(1 ));
1261
- return ;
1268
+ return ( Pkt4Ptr ()) ;
1262
1269
}
1263
1270
1264
1271
// We have sanity checked (in accept() that the Message Type option
@@ -1303,7 +1310,7 @@ Dhcpv4Srv::processPacket(Pkt4Ptr& query, Pkt4Ptr& rsp, bool allow_packet_park) {
1303
1310
LOG_DEBUG (hooks_logger, DBG_DHCP4_HOOKS,
1304
1311
DHCP4_HOOK_PACKET_RCVD_SKIP)
1305
1312
.arg (query->getLabel ());
1306
- return ;
1313
+ return ( Pkt4Ptr ()) ;
1307
1314
}
1308
1315
1309
1316
callout_handle->getArgument (" query4" , query);
@@ -1316,17 +1323,17 @@ Dhcpv4Srv::processPacket(Pkt4Ptr& query, Pkt4Ptr& rsp, bool allow_packet_park) {
1316
1323
.arg (query->toText ());
1317
1324
isc::stats::StatsMgr::instance ().addValue (" pkt4-receive-drop" ,
1318
1325
static_cast <int64_t >(1 ));
1319
- return ;
1326
+ return ( Pkt4Ptr ()) ;
1320
1327
}
1321
1328
1322
- processDhcp4Query (query, rsp, allow_packet_park);
1329
+ return ( processDhcp4Query (query, allow_packet_park) );
1323
1330
}
1324
1331
1325
1332
void
1326
- Dhcpv4Srv::processDhcp4QueryAndSendResponse (Pkt4Ptr& query, Pkt4Ptr& rsp ,
1333
+ Dhcpv4Srv::processDhcp4QueryAndSendResponse (Pkt4Ptr query,
1327
1334
bool allow_packet_park) {
1328
1335
try {
1329
- processDhcp4Query (query, rsp , allow_packet_park);
1336
+ Pkt4Ptr rsp = processDhcp4Query (query, allow_packet_park);
1330
1337
if (!rsp) {
1331
1338
return ;
1332
1339
}
@@ -1341,9 +1348,8 @@ Dhcpv4Srv::processDhcp4QueryAndSendResponse(Pkt4Ptr& query, Pkt4Ptr& rsp,
1341
1348
}
1342
1349
}
1343
1350
1344
- void
1345
- Dhcpv4Srv::processDhcp4Query (Pkt4Ptr& query, Pkt4Ptr& rsp,
1346
- bool allow_packet_park) {
1351
+ Pkt4Ptr
1352
+ Dhcpv4Srv::processDhcp4Query (Pkt4Ptr query, bool allow_packet_park) {
1347
1353
// Create a client race avoidance RAII handler.
1348
1354
ClientHandler client_handler;
1349
1355
@@ -1355,18 +1361,30 @@ Dhcpv4Srv::processDhcp4Query(Pkt4Ptr& query, Pkt4Ptr& rsp,
1355
1361
(query->getType () == DHCPDECLINE))) {
1356
1362
ContinuationPtr cont =
1357
1363
makeContinuation (std::bind (&Dhcpv4Srv::processDhcp4QueryAndSendResponse,
1358
- this , query, rsp, allow_packet_park));
1364
+ this , query, allow_packet_park));
1359
1365
if (!client_handler.tryLock (query, cont)) {
1360
- return ;
1366
+ return ( Pkt4Ptr ()) ;
1361
1367
}
1362
1368
}
1363
1369
1364
1370
AllocEngine::ClientContext4Ptr ctx (new AllocEngine::ClientContext4 ());
1365
1371
if (!earlyGHRLookup (query, ctx)) {
1366
- return ;
1372
+ return ( Pkt4Ptr ()) ;
1367
1373
}
1368
1374
1375
+ Pkt4Ptr rsp;
1369
1376
try {
1377
+ sanityCheck (query);
1378
+ if ((query->getType () == DHCPDISCOVER) ||
1379
+ (query->getType () == DHCPREQUEST) ||
1380
+ (query->getType () == DHCPINFORM)) {
1381
+ bool drop = false ;
1382
+ ctx->subnet_ = selectSubnet (query, drop);
1383
+ // Stop here if selectSubnet decided to drop the packet
1384
+ if (drop) {
1385
+ return (Pkt4Ptr ());
1386
+ }
1387
+ }
1370
1388
switch (query->getType ()) {
1371
1389
case DHCPDISCOVER:
1372
1390
rsp = processDiscover (query, ctx);
@@ -1506,8 +1524,7 @@ Dhcpv4Srv::processDhcp4Query(Pkt4Ptr& query, Pkt4Ptr& rsp,
1506
1524
.arg (query->getLabel ());
1507
1525
isc::stats::StatsMgr::instance ().addValue (" pkt4-receive-drop" ,
1508
1526
static_cast <int64_t >(1 ));
1509
- rsp.reset ();
1510
- return ;
1527
+ return (Pkt4Ptr ());
1511
1528
}
1512
1529
}
1513
1530
@@ -1603,6 +1620,7 @@ Dhcpv4Srv::processDhcp4Query(Pkt4Ptr& query, Pkt4Ptr& rsp,
1603
1620
Subnet4Ptr subnet = (ctx ? ctx->subnet_ : Subnet4Ptr ());
1604
1621
processPacketPktSend (callout_handle, query, rsp, subnet);
1605
1622
}
1623
+ return (rsp);
1606
1624
}
1607
1625
1608
1626
void
@@ -3471,18 +3489,8 @@ Dhcpv4Srv::getNetmaskOption(const Subnet4Ptr& subnet) {
3471
3489
3472
3490
Pkt4Ptr
3473
3491
Dhcpv4Srv::processDiscover (Pkt4Ptr& discover, AllocEngine::ClientContext4Ptr& context) {
3474
- // server-id is forbidden.
3475
- sanityCheck (discover, FORBIDDEN);
3476
-
3477
3492
bool drop = false ;
3478
- Subnet4Ptr subnet = selectSubnet (discover, drop);
3479
-
3480
- // Stop here if selectSubnet decided to drop the packet
3481
- if (drop) {
3482
- return (Pkt4Ptr ());
3483
- }
3484
-
3485
- Dhcpv4Exchange ex (alloc_engine_, discover, context, subnet, drop);
3493
+ Dhcpv4Exchange ex (alloc_engine_, discover, context, context->subnet_ , drop);
3486
3494
3487
3495
// Stop here if Dhcpv4Exchange constructor decided to drop the packet
3488
3496
if (drop) {
@@ -3550,19 +3558,8 @@ Dhcpv4Srv::processDiscover(Pkt4Ptr& discover, AllocEngine::ClientContext4Ptr& co
3550
3558
3551
3559
Pkt4Ptr
3552
3560
Dhcpv4Srv::processRequest (Pkt4Ptr& request, AllocEngine::ClientContext4Ptr& context) {
3553
- // Since we cannot distinguish between client states
3554
- // we'll make server-id is optional for REQUESTs.
3555
- sanityCheck (request, OPTIONAL);
3556
-
3557
3561
bool drop = false ;
3558
- Subnet4Ptr subnet = selectSubnet (request, drop);
3559
-
3560
- // Stop here if selectSubnet decided to drop the packet
3561
- if (drop) {
3562
- return (Pkt4Ptr ());
3563
- }
3564
-
3565
- Dhcpv4Exchange ex (alloc_engine_, request, context, subnet, drop);
3562
+ Dhcpv4Exchange ex (alloc_engine_, request, context, context->subnet_ , drop);
3566
3563
3567
3564
// Stop here if Dhcpv4Exchange constructor decided to drop the packet
3568
3565
if (drop) {
@@ -3632,10 +3629,6 @@ Dhcpv4Srv::processRequest(Pkt4Ptr& request, AllocEngine::ClientContext4Ptr& cont
3632
3629
3633
3630
void
3634
3631
Dhcpv4Srv::processRelease (Pkt4Ptr& release, AllocEngine::ClientContext4Ptr& context) {
3635
- // Server-id is mandatory in DHCPRELEASE (see table 5, RFC2131)
3636
- // but ISC DHCP does not enforce this, so we'll follow suit.
3637
- sanityCheck (release, OPTIONAL);
3638
-
3639
3632
// Try to find client-id. Note that for the DHCPRELEASE we don't check if the
3640
3633
// match-client-id configuration parameter is disabled because this parameter
3641
3634
// is configured for subnets and we don't select subnet for the DHCPRELEASE.
@@ -3783,10 +3776,6 @@ Dhcpv4Srv::processRelease(Pkt4Ptr& release, AllocEngine::ClientContext4Ptr& cont
3783
3776
3784
3777
void
3785
3778
Dhcpv4Srv::processDecline (Pkt4Ptr& decline, AllocEngine::ClientContext4Ptr& context) {
3786
- // Server-id is mandatory in DHCPDECLINE (see table 5, RFC2131)
3787
- // but ISC DHCP does not enforce this, so we'll follow suit.
3788
- sanityCheck (decline, OPTIONAL);
3789
-
3790
3779
// Client is supposed to specify the address being declined in
3791
3780
// Requested IP address option, but must not set its ciaddr.
3792
3781
// (again, see table 5 in RFC2131).
@@ -4081,19 +4070,8 @@ Dhcpv4Srv::serverDeclineNoThrow(hooks::CalloutHandlePtr& callout_handle, Pkt4Ptr
4081
4070
4082
4071
Pkt4Ptr
4083
4072
Dhcpv4Srv::processInform (Pkt4Ptr& inform, AllocEngine::ClientContext4Ptr& context) {
4084
- // server-id is supposed to be forbidden (as is requested address)
4085
- // but ISC DHCP does not enforce either. So neither will we.
4086
- sanityCheck (inform, OPTIONAL);
4087
-
4088
4073
bool drop = false ;
4089
- Subnet4Ptr subnet = selectSubnet (inform, drop);
4090
-
4091
- // Stop here if selectSubnet decided to drop the packet
4092
- if (drop) {
4093
- return (Pkt4Ptr ());
4094
- }
4095
-
4096
- Dhcpv4Exchange ex (alloc_engine_, inform, context, subnet, drop);
4074
+ Dhcpv4Exchange ex (alloc_engine_, inform, context, context->subnet_ , drop);
4097
4075
4098
4076
// Stop here if Dhcpv4Exchange constructor decided to drop the packet
4099
4077
if (drop) {
@@ -4398,6 +4376,36 @@ Dhcpv4Srv::acceptServerId(const Pkt4Ptr& query) const {
4398
4376
return (opt_server_id && (opt_server_id->readAddress () == server_id));
4399
4377
}
4400
4378
4379
+ void
4380
+ Dhcpv4Srv::sanityCheck (const Pkt4Ptr& query) {
4381
+ switch (query->getType ()) {
4382
+ case DHCPDISCOVER:
4383
+ // server-id is forbidden.
4384
+ sanityCheck (query, FORBIDDEN);
4385
+ break ;
4386
+ case DHCPREQUEST:
4387
+ // Since we cannot distinguish between client states
4388
+ // we'll make server-id is optional for REQUESTs.
4389
+ sanityCheck (query, OPTIONAL);
4390
+ break ;
4391
+ case DHCPRELEASE:
4392
+ // Server-id is mandatory in DHCPRELEASE (see table 5, RFC2131)
4393
+ // but ISC DHCP does not enforce this, so we'll follow suit.
4394
+ sanityCheck (query, OPTIONAL);
4395
+ break ;
4396
+ case DHCPDECLINE:
4397
+ // Server-id is mandatory in DHCPDECLINE (see table 5, RFC2131)
4398
+ // but ISC DHCP does not enforce this, so we'll follow suit.
4399
+ sanityCheck (query, OPTIONAL);
4400
+ break ;
4401
+ case DHCPINFORM:
4402
+ // server-id is supposed to be forbidden (as is requested address)
4403
+ // but ISC DHCP does not enforce either. So neither will we.
4404
+ sanityCheck (query, OPTIONAL);
4405
+ break ;
4406
+ }
4407
+ }
4408
+
4401
4409
void
4402
4410
Dhcpv4Srv::sanityCheck (const Pkt4Ptr& query, RequirementLevel serverid) {
4403
4411
OptionPtr server_id = query->getOption (DHO_DHCP_SERVER_IDENTIFIER);
0 commit comments