Browse Source

[2892] testServerID founction added, Copyright date changed

WlodekWencel 11 years ago
parent
commit
a5664487fa
1 changed files with 31 additions and 20 deletions
  1. 31 20
      src/bin/dhcp6/dhcp6_srv.cc

+ 31 - 20
src/bin/dhcp6/dhcp6_srv.cc

@@ -1,4 +1,4 @@
-// Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2014 Internet Systems Consortium, Inc. ("ISC")
 //
 // Permission to use, copy, modify, and/or distribute this software for any
 // purpose with or without fee is hereby granted, provided that the above
@@ -205,6 +205,29 @@ void Dhcpv6Srv::sendPacket(const Pkt6Ptr& packet) {
     IfaceMgr::instance().send(packet);
 }
 
+bool
+Dhcpv6Srv::testServerID(const Pkt6Ptr& pkt){
+	OptionCollection server_ids = pkt->getOptions(D6O_SERVERID);
+	// if we find serverid option, lets test it.
+	/// @todo: In case we get message that has ServerID option forbidden
+	/// by the RFC, we will drop this loging DHCP6_PACKET_RECEIVED_MISMATCH_SERVERID
+	/// not RFCViolation. Some things should be double checked here and in sanityCheck
+	if (server_ids.size() == 1){
+		// Let us test received ServerID if it is same as ServerID
+		// which is beeing used by server
+		OptionPtr server_id = pkt->getOption(D6O_SERVERID);
+		if (getServerID()->getData() != server_id->getData()){
+			LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL_DATA, DHCP6_PACKET_RECEIVED_MISMATCH_SERVERID)
+				.arg(pkt->getName())
+				.arg(pkt->getTransid())
+				.arg(pkt->getIface());
+			return false;
+		}
+	}
+	// retunr True if: no serverid received or ServerIDs matching
+	return true;
+}
+
 bool Dhcpv6Srv::run() {
     while (!shutdown_) {
         /// @todo Calculate actual timeout to the next event (e.g. lease
@@ -277,6 +300,12 @@ bool Dhcpv6Srv::run() {
                 continue;
             }
         }
+        // Check received query if it carry ServerID that matches ServerID
+        // that beeing used by the server.
+        if (!testServerID(query)){
+        	continue;
+        }
+
         LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, DHCP6_PACKET_RECEIVED)
             .arg(query->getName());
         LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL_DATA, DHCP6_QUERY_DATA)
@@ -763,16 +792,6 @@ Dhcpv6Srv::createStatusCode(uint16_t code, const std::string& text) {
 }
 
 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) {
     OptionCollection client_ids = pkt->getOptions(D6O_CLIENTID);
@@ -811,21 +830,13 @@ Dhcpv6Srv::sanityCheck(const Pkt6Ptr& pkt, RequirementLevel clientid,
                       << server_ids.size() << "), exactly 1 expected in message "
                       << pkt->getName());
         }
-        // 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;
+        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);
-        }
     }
 }