Browse Source

parse '4' and '6' address caps

pull/1638/head
orignal 4 years ago
parent
commit
b60ebfe1c6
  1. 49
      libi2pd/RouterInfo.cpp
  2. 19
      libi2pd/RouterInfo.h

49
libi2pd/RouterInfo.cpp

@ -186,6 +186,7 @@ namespace data
void RouterInfo::ReadFromStream (std::istream& s) void RouterInfo::ReadFromStream (std::istream& s)
{ {
m_Caps = 0;
s.read ((char *)&m_Timestamp, sizeof (m_Timestamp)); s.read ((char *)&m_Timestamp, sizeof (m_Timestamp));
m_Timestamp = be64toh (m_Timestamp); m_Timestamp = be64toh (m_Timestamp);
// read addresses // read addresses
@ -251,7 +252,7 @@ namespace data
LogPrint (eLogWarning, "RouterInfo: Unexpected field 'key' for NTCP"); LogPrint (eLogWarning, "RouterInfo: Unexpected field 'key' for NTCP");
} }
else if (!strcmp (key, "caps")) else if (!strcmp (key, "caps"))
address->caps = ExtractCaps (value); address->caps = ExtractAddressCaps (value);
else if (!strcmp (key, "s")) // ntcp2 static key else if (!strcmp (key, "s")) // ntcp2 static key
{ {
Base64ToByteStream (value, strlen (value), address->ntcp2->staticKey, 32); Base64ToByteStream (value, strlen (value), address->ntcp2->staticKey, 32);
@ -354,7 +355,7 @@ namespace data
// extract caps // extract caps
if (!strcmp (key, "caps")) if (!strcmp (key, "caps"))
m_Caps = ExtractCaps (value); ExtractCaps (value);
// extract version // extract version
else if (!strcmp (key, ROUTER_INFO_PROPERTY_VERSION)) else if (!strcmp (key, ROUTER_INFO_PROPERTY_VERSION))
{ {
@ -403,40 +404,59 @@ namespace data
return m_Family == fam; return m_Family == fam;
} }
uint8_t RouterInfo::ExtractCaps (const char * value) void RouterInfo::ExtractCaps (const char * value)
{ {
uint8_t caps = 0;
const char * cap = value; const char * cap = value;
while (*cap) while (*cap)
{ {
switch (*cap) switch (*cap)
{ {
case CAPS_FLAG_FLOODFILL: case CAPS_FLAG_FLOODFILL:
caps |= Caps::eFloodfill; m_Caps |= Caps::eFloodfill;
break; break;
case CAPS_FLAG_HIGH_BANDWIDTH1: case CAPS_FLAG_HIGH_BANDWIDTH1:
case CAPS_FLAG_HIGH_BANDWIDTH2: case CAPS_FLAG_HIGH_BANDWIDTH2:
case CAPS_FLAG_HIGH_BANDWIDTH3: case CAPS_FLAG_HIGH_BANDWIDTH3:
caps |= Caps::eHighBandwidth; m_Caps |= Caps::eHighBandwidth;
break; break;
case CAPS_FLAG_EXTRA_BANDWIDTH1: case CAPS_FLAG_EXTRA_BANDWIDTH1:
case CAPS_FLAG_EXTRA_BANDWIDTH2: case CAPS_FLAG_EXTRA_BANDWIDTH2:
caps |= Caps::eExtraBandwidth | Caps::eHighBandwidth; m_Caps |= Caps::eExtraBandwidth | Caps::eHighBandwidth;
break; break;
case CAPS_FLAG_HIDDEN: case CAPS_FLAG_HIDDEN:
caps |= Caps::eHidden; m_Caps |= Caps::eHidden;
break; break;
case CAPS_FLAG_REACHABLE: case CAPS_FLAG_REACHABLE:
caps |= Caps::eReachable; m_Caps |= Caps::eReachable;
break; break;
case CAPS_FLAG_UNREACHABLE: case CAPS_FLAG_UNREACHABLE:
caps |= Caps::eUnreachable; m_Caps |= Caps::eUnreachable;
break; break;
default: ;
}
cap++;
}
}
uint8_t RouterInfo::ExtractAddressCaps (const char * value) const
{
uint8_t caps = 0;
const char * cap = value;
while (*cap)
{
switch (*cap)
{
case CAPS_FLAG_V4:
caps |= AddressCaps::eV4;
break;
case CAPS_FLAG_V6:
caps |= AddressCaps::eV6;
break;
case CAPS_FLAG_SSU_TESTING: case CAPS_FLAG_SSU_TESTING:
caps |= Caps::eSSUTesting; caps |= AddressCaps::eSSUTesting;
break; break;
case CAPS_FLAG_SSU_INTRODUCER: case CAPS_FLAG_SSU_INTRODUCER:
caps |= Caps::eSSUIntroducer; caps |= AddressCaps::eSSUIntroducer;
break; break;
default: ; default: ;
} }
@ -444,7 +464,7 @@ namespace data
} }
return caps; return caps;
} }
void RouterInfo::UpdateCapsProperty () void RouterInfo::UpdateCapsProperty ()
{ {
std::string caps; std::string caps;
@ -799,7 +819,8 @@ namespace data
void RouterInfo::SetCaps (const char * caps) void RouterInfo::SetCaps (const char * caps)
{ {
SetProperty ("caps", caps); SetProperty ("caps", caps);
m_Caps = ExtractCaps (caps); m_Caps = 0;
ExtractCaps (caps);
} }
void RouterInfo::SetProperty (const std::string& key, const std::string& value) void RouterInfo::SetProperty (const std::string& key, const std::string& value)

19
libi2pd/RouterInfo.h

@ -44,6 +44,8 @@ namespace data
const char CAPS_FLAG_EXTRA_BANDWIDTH1 = 'P'; /* 256-2000 KBps */ const char CAPS_FLAG_EXTRA_BANDWIDTH1 = 'P'; /* 256-2000 KBps */
const char CAPS_FLAG_EXTRA_BANDWIDTH2 = 'X'; /* > 2000 KBps */ const char CAPS_FLAG_EXTRA_BANDWIDTH2 = 'X'; /* > 2000 KBps */
const char CAPS_FLAG_V4 = '4';
const char CAPS_FLAG_V6 = '6';
const char CAPS_FLAG_SSU_TESTING = 'B'; const char CAPS_FLAG_SSU_TESTING = 'B';
const char CAPS_FLAG_SSU_INTRODUCER = 'C'; const char CAPS_FLAG_SSU_INTRODUCER = 'C';
@ -67,12 +69,18 @@ namespace data
eHighBandwidth = 0x02, eHighBandwidth = 0x02,
eExtraBandwidth = 0x04, eExtraBandwidth = 0x04,
eReachable = 0x08, eReachable = 0x08,
eSSUTesting = 0x10, eHidden = 0x10,
eSSUIntroducer = 0x20, eUnreachable = 0x20
eHidden = 0x40,
eUnreachable = 0x80
}; };
enum AddressCaps
{
eV4 = 0x01,
eV6 = 0x02,
eSSUTesting = 0x04,
eSSUIntroducer = 0x08
};
enum TransportStyle enum TransportStyle
{ {
eTransportUnknown = 0, eTransportUnknown = 0,
@ -234,7 +242,8 @@ namespace data
void WriteToStream (std::ostream& s) const; void WriteToStream (std::ostream& s) const;
size_t ReadString (char* str, size_t len, std::istream& s) const; size_t ReadString (char* str, size_t len, std::istream& s) const;
void WriteString (const std::string& str, std::ostream& s) const; void WriteString (const std::string& str, std::ostream& s) const;
uint8_t ExtractCaps (const char * value); void ExtractCaps (const char * value);
uint8_t ExtractAddressCaps (const char * value) const;
template<typename Filter> template<typename Filter>
std::shared_ptr<const Address> GetAddress (Filter filter) const; std::shared_ptr<const Address> GetAddress (Filter filter) const;
void UpdateCapsProperty (); void UpdateCapsProperty ();

Loading…
Cancel
Save