]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2892] Add ServerID checking
authorwlodek <wlodek.wencel@gmail.com>
Mon, 13 Jan 2014 14:06:40 +0000 (15:06 +0100)
committerwlodek <wlodek.wencel@gmail.com>
Mon, 13 Jan 2014 14:06:40 +0000 (15:06 +0100)
src/bin/dhcp6/dhcp6_srv.cc

index 506eefde828d9c7177459faa79de26ed2835c069..4996adc4b33ac085c91db1992071307a49884426 100644 (file)
@@ -762,6 +762,16 @@ Dhcpv6Srv::createStatusCode(uint16_t code, const std::string& text) {
     return (option_status);
 }
 
+void
+Dhcpv6Srv::testServerid(const Pkt6Ptr& pkt){
+       OptionPtr serverid = pkt->getOption(D6O_SERVERID); 
+
+       // I just want to throw exception when server id's don't mach.
+       if !(getServerID()->getData() == serverid->getData()) 
+               //if received serverid isn't same with our, drop message
+               isc_throw(ServerID_mismatch, "Receievd serverid isn't ours");
+}
+
 void
 Dhcpv6Srv::sanityCheck(const Pkt6Ptr& pkt, RequirementLevel clientid,
                        RequirementLevel serverid) {
@@ -801,13 +811,21 @@ Dhcpv6Srv::sanityCheck(const Pkt6Ptr& pkt, RequirementLevel clientid,
                       << server_ids.size() << "), exactly 1 expected in message "
                       << pkt->getName());
         }
-        break;
+        // test server received server id to check if that's ours id
+        // RFCViolation will be thrown if we didn't get exaclty one server_id so
+        // checking server_ids.size() here is pointless.
+               testServerid(pkt);
+               break;
 
     case OPTIONAL:
         if (server_ids.size() > 1) {
             isc_throw(RFCViolation, "Too many (" << server_ids.size()
                       << ") server-id options received in " << pkt->getName());
         }
+        if (server_ids.size() == 1) {
+                               // test server received server id to check if that's ours id 
+                       testServerid(pkt);
+        }
     }
 }