瀏覽代碼

2008-02-21 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Make room for future enchancements for IPv6 addresses.
	Bump up version number of dht.dat file format to 2.
	Not compatible with previous version.
	* src/DHTRoutingTableSerializer.cc
	* src/DHTRoutingTableDeserializer.cc
	* test/DHTRoutingTableSerializerTest.cc
Tatsuhiro Tsujikawa 17 年之前
父節點
當前提交
0d130b77f4
共有 4 個文件被更改,包括 73 次插入7 次删除
  1. 9 0
      ChangeLog
  2. 16 3
      src/DHTRoutingTableDeserializer.cc
  3. 10 2
      src/DHTRoutingTableSerializer.cc
  4. 38 2
      test/DHTRoutingTableSerializerTest.cc

+ 9 - 0
ChangeLog

@@ -1,3 +1,12 @@
+2008-02-21  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Make room for future enchancements for IPv6 addresses.
+	Bump up version number of dht.dat file format to 2.
+	Not compatible with previous version.
+	* src/DHTRoutingTableSerializer.cc
+	* src/DHTRoutingTableDeserializer.cc
+	* test/DHTRoutingTableSerializerTest.cc
+
 2008-02-21  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Added handling for the return values from

+ 16 - 3
src/DHTRoutingTableDeserializer.cc

@@ -73,7 +73,7 @@ void DHTRoutingTableDeserializer::deserialize(std::istream& in)
     header[2] = 0x02;
     // version
     header[6] = 0;
-    header[7] = 0x01;
+    header[7] = 0x02;
 
     char zero[8];
     memset(zero, 0, sizeof(zero));
@@ -108,21 +108,34 @@ void DHTRoutingTableDeserializer::deserialize(std::istream& in)
 
     // nodes
     for(size_t i = 0; i < numNodes; ++i) {
+      // Currently, only IPv4 addresses are supported.
+      // 1byte compact peer info length
+      uint8_t peerInfoLen;
+      in >> peerInfoLen;
+      if(peerInfoLen != 6) {
+	// skip this entry
+	in.read(buf, 42+7+6);
+	continue;
+      }
+      // 7bytes reserved
+      in.read(buf, 7);
       // 6bytes compact peer info
       in.read(buf, 6);
       if(memcmp(zero, buf, 6) == 0) {
 	// skip this entry
-	in.read(buf, 26);
+	in.read(buf, 42);
 	continue;
       }
       std::pair<std::string, uint16_t> peer = PeerMessageUtil::unpackcompact(buf);
       if(peer.first.empty()) {
 	// skip this entry
-	in.read(buf, 26);
+	in.read(buf, 42);
 	continue;
       }
       // 2bytes reserved
       in.read(buf, 2);
+      // 16byte reserved
+      in.read(buf, 16);
       // localnode ID
       in.read(buf, DHT_ID_LENGTH);
 

+ 10 - 2
src/DHTRoutingTableSerializer.cc

@@ -70,9 +70,9 @@ void DHTRoutingTableSerializer::serialize(std::ostream& o)
   header[2] = 0x02;
   // version
   header[6] = 0;
-  header[7] = 0x01;
+  header[7] = 0x02;
   
-  char zero[8];
+  char zero[16];
   memset(zero, 0, sizeof(zero));
   try {
     o.write(header, 8);
@@ -99,14 +99,22 @@ void DHTRoutingTableSerializer::serialize(std::ostream& o)
     // nodes
     for(std::deque<SharedHandle<DHTNode> >::const_iterator i = _nodes.begin(); i != _nodes.end(); ++i) {
       const SharedHandle<DHTNode>& node = *i;
+      // Currently, only IPv4 address and IPv4-mapped address are saved.
       // 6bytes: write IP address + port in Compact IP-address/port info form.
       char compactPeer[6];
       if(!PeerMessageUtil::createcompact(compactPeer, node->getIPAddress(), node->getPort())) {
 	memset(compactPeer, 0, 6);
       }
+      // 1byte compact peer format length
+      o << static_cast<uint8_t>(sizeof(compactPeer));
+      // 7bytes reserved
+      o.write(zero, 7);
+      // 6 bytes compact peer
       o.write(compactPeer, 6);
       // 2bytes reserved
       o.write(zero, 2);
+      // 16bytes reserved
+      o.write(zero, 16);
       // 20bytes: node ID
       o.write(reinterpret_cast<const char*>(node->getID()), DHT_ID_LENGTH);
       // 4bytes reserved

+ 38 - 2
test/DHTRoutingTableSerializerTest.cc

@@ -48,7 +48,7 @@ void DHTRoutingTableSerializerTest::testSerialize()
   std::stringstream ss;
   s.serialize(ss);
 
-  char zero[8];
+  char zero[16];
   memset(zero, 0, sizeof(zero));
 
   char buf[20];
@@ -65,7 +65,7 @@ void DHTRoutingTableSerializerTest::testSerialize()
   CPPUNIT_ASSERT((char)0x00 == buf[5]);
   // version
   CPPUNIT_ASSERT((char)0x00 == buf[6]);
-  CPPUNIT_ASSERT((char)0x01 == buf[7]);
+  CPPUNIT_ASSERT((char)0x02 == buf[7]);
 
   // time
   ss.read(buf, 4);
@@ -95,6 +95,15 @@ void DHTRoutingTableSerializerTest::testSerialize()
   CPPUNIT_ASSERT(memcmp(zero, buf, 4) == 0);
 
   // node[0]
+  // 1byte compatc peer format length
+  {
+    uint8_t len;
+    ss >> len;
+    CPPUNIT_ASSERT_EQUAL((uint8_t)6, len);
+  }
+  // 7bytes reserved
+  ss.read(buf, 7);
+  CPPUNIT_ASSERT(memcmp(zero, buf, 7) == 0);
   // 6bytes compact peer info
   ss.read(buf, 6);
   {
@@ -105,6 +114,9 @@ void DHTRoutingTableSerializerTest::testSerialize()
   // 2bytes reserved
   ss.read(buf, 2);
   CPPUNIT_ASSERT(memcmp(zero, buf, 2) == 0);
+  // 16bytes reserved
+  ss.read(buf, 16);
+  CPPUNIT_ASSERT(memcmp(zero, buf, 16) == 0);
   // localnode ID
   ss.read(buf, DHT_ID_LENGTH);
   CPPUNIT_ASSERT(memcmp(nodes[0]->getID(), buf, DHT_ID_LENGTH) == 0);
@@ -113,6 +125,15 @@ void DHTRoutingTableSerializerTest::testSerialize()
   CPPUNIT_ASSERT(memcmp(zero, buf, 4) == 0);
 
   // node[1]
+  // 1byte compatc peer format length
+  {
+    uint8_t len;
+    ss >> len;
+    CPPUNIT_ASSERT_EQUAL((uint8_t)6, len);
+  }
+  // 7bytes reserved
+  ss.read(buf, 7);
+  CPPUNIT_ASSERT(memcmp(zero, buf, 7) == 0);
   // 6bytes compact peer info
   ss.read(buf, 6);
   // zero filled because node[1]'s hostname is not numerical form
@@ -121,6 +142,9 @@ void DHTRoutingTableSerializerTest::testSerialize()
   // 2bytes reserved
   ss.read(buf, 2);
   CPPUNIT_ASSERT(memcmp(zero, buf, 2) == 0);
+  // 16bytes reserved
+  ss.read(buf, 16);
+  CPPUNIT_ASSERT(memcmp(zero, buf, 16) == 0);
   // localnode ID
   ss.read(buf, DHT_ID_LENGTH);
   CPPUNIT_ASSERT(memcmp(nodes[1]->getID(), buf, DHT_ID_LENGTH) == 0);
@@ -129,6 +153,15 @@ void DHTRoutingTableSerializerTest::testSerialize()
   CPPUNIT_ASSERT(memcmp(zero, buf, 4) == 0);
 
   // node[2]
+  // 1byte compatc peer format length
+  {
+    uint8_t len;
+    ss >> len;
+    CPPUNIT_ASSERT_EQUAL((uint8_t)6, len);
+  }
+  // 7bytes reserved
+  ss.read(buf, 7);
+  CPPUNIT_ASSERT(memcmp(zero, buf, 7) == 0);
   // 6bytes compact peer info
   ss.read(buf, 6);
   {
@@ -139,6 +172,9 @@ void DHTRoutingTableSerializerTest::testSerialize()
   // 2bytes reserved
   ss.read(buf, 2);
   CPPUNIT_ASSERT(memcmp(zero, buf, 2) == 0);
+  // 16bytes reserved
+  ss.read(buf, 16);
+  CPPUNIT_ASSERT(memcmp(zero, buf, 16) == 0);
   // localnode ID
   ss.read(buf, DHT_ID_LENGTH);
   CPPUNIT_ASSERT(memcmp(nodes[2]->getID(), buf, DHT_ID_LENGTH) == 0);