mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-02 02:54:01 +01:00
update config file example, add v6 status to windows daemon window, code cleanup
Signed-off-by: R4SAS <r4sas@i2pmail.org>
This commit is contained in:
parent
d299cbaabd
commit
c359c6e634
|
@ -142,25 +142,47 @@ namespace win32
|
||||||
s << bytes << " Bytes\n";
|
s << bytes << " Bytes\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ShowNetworkStatus (std::stringstream& s, RouterStatus status)
|
||||||
|
{
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case eRouterStatusOK: s << "OK"; break;
|
||||||
|
case eRouterStatusTesting: s << "Test"; break;
|
||||||
|
case eRouterStatusFirewalled: s << "FW"; break;
|
||||||
|
case eRouterStatusUnknown: s << "Unk"; break;
|
||||||
|
case eRouterStatusProxy: s << "Proxy"; break;
|
||||||
|
case eRouterStatusMesh: s << "Mesh"; break;
|
||||||
|
case eRouterStatusError:
|
||||||
|
{
|
||||||
|
s << "Err";
|
||||||
|
switch (i2p::context.GetError ())
|
||||||
|
{
|
||||||
|
case eRouterErrorClockSkew:
|
||||||
|
s << " - Clock skew";
|
||||||
|
break;
|
||||||
|
case eRouterErrorOffline:
|
||||||
|
s << " - Offline";
|
||||||
|
break;
|
||||||
|
case eRouterErrorSymmetricNAT:
|
||||||
|
s << " - Symmetric NAT";
|
||||||
|
break;
|
||||||
|
default: ;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: s << "Unk";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void PrintMainWindowText (std::stringstream& s)
|
static void PrintMainWindowText (std::stringstream& s)
|
||||||
{
|
{
|
||||||
s << "\n";
|
s << "\n";
|
||||||
s << "Status: ";
|
s << "Status: ";
|
||||||
switch (i2p::context.GetStatus())
|
ShowNetworkStatus (s, i2p::context.GetStatus ());
|
||||||
|
if (i2p::context.SupportsV6 ())
|
||||||
{
|
{
|
||||||
case eRouterStatusOK: s << "OK"; break;
|
s << " / ";
|
||||||
case eRouterStatusTesting: s << "Testing"; break;
|
ShowNetworkStatus (s, i2p::context.GetStatusV6 ());
|
||||||
case eRouterStatusFirewalled: s << "Firewalled"; break;
|
|
||||||
case eRouterStatusError:
|
|
||||||
{
|
|
||||||
switch (i2p::context.GetError())
|
|
||||||
{
|
|
||||||
case eRouterErrorClockSkew: s << "Clock skew"; break;
|
|
||||||
default: s << "Error";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: s << "Unknown";
|
|
||||||
}
|
}
|
||||||
s << "; ";
|
s << "; ";
|
||||||
s << "Success Rate: " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate() << "%\n";
|
s << "Success Rate: " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate() << "%\n";
|
||||||
|
|
|
@ -35,14 +35,30 @@
|
||||||
## Write full CLF-formatted date and time to log (default: write only time)
|
## Write full CLF-formatted date and time to log (default: write only time)
|
||||||
# logclftime = true
|
# logclftime = true
|
||||||
|
|
||||||
## Daemon mode. Router will go to background after start
|
## Daemon mode. Router will go to background after start. Ignored on Windows
|
||||||
# daemon = true
|
# daemon = true
|
||||||
|
|
||||||
## Specify a family, router belongs to (default - none)
|
## Specify a family, router belongs to (default - none)
|
||||||
# family =
|
# family =
|
||||||
|
|
||||||
## External IP address to listen for connections
|
## Network interface to bind to
|
||||||
|
## Updates address4/6 options if they are not set
|
||||||
|
# ifname =
|
||||||
|
## You can specify different interfaces for IPv4 and IPv6
|
||||||
|
# ifname4 =
|
||||||
|
# ifname6 =
|
||||||
|
|
||||||
|
## Local address to bind transport sockets to
|
||||||
|
## Overrides host option if:
|
||||||
|
## For ipv4: if ipv4 = true and nat = false
|
||||||
|
## For ipv6: if 'host' is not set or ipv4 = true
|
||||||
|
# address4 =
|
||||||
|
# address6 =
|
||||||
|
|
||||||
|
## External IPv4 or IPv6 address to listen for connections
|
||||||
## By default i2pd sets IP automatically
|
## By default i2pd sets IP automatically
|
||||||
|
## Sets published NTCP2v4/SSUv4 address to 'host' value if nat = true
|
||||||
|
## Sets published NTCP2v6/SSUv6 address to 'host' value if ipv4 = false
|
||||||
# host = 1.2.3.4
|
# host = 1.2.3.4
|
||||||
|
|
||||||
## Port to listen for connections
|
## Port to listen for connections
|
||||||
|
@ -55,17 +71,6 @@ ipv4 = true
|
||||||
## Enable communication through ipv6
|
## Enable communication through ipv6
|
||||||
ipv6 = false
|
ipv6 = false
|
||||||
|
|
||||||
## Network interface to bind to
|
|
||||||
# ifname =
|
|
||||||
## You can specify different interfaces for IPv4 and IPv6
|
|
||||||
# ifname4 =
|
|
||||||
# ifname6 =
|
|
||||||
|
|
||||||
## Enable NTCP transport (default = true)
|
|
||||||
# ntcp = true
|
|
||||||
## If you run i2pd behind a proxy server, you can only use NTCP transport with ntcpproxy option
|
|
||||||
## Should be http://address:port or socks://address:port
|
|
||||||
# ntcpproxy = http://127.0.0.1:8118
|
|
||||||
## Enable SSU transport (default = true)
|
## Enable SSU transport (default = true)
|
||||||
# ssu = true
|
# ssu = true
|
||||||
|
|
||||||
|
@ -82,6 +87,7 @@ ipv6 = false
|
||||||
# notransit = true
|
# notransit = true
|
||||||
|
|
||||||
## Router will be floodfill
|
## Router will be floodfill
|
||||||
|
## Note: that mode uses much more network connections and CPU!
|
||||||
# floodfill = true
|
# floodfill = true
|
||||||
|
|
||||||
[http]
|
[http]
|
||||||
|
|
|
@ -142,15 +142,15 @@ namespace util
|
||||||
i2p::context.SetNetID (netID);
|
i2p::context.SetNetID (netID);
|
||||||
i2p::context.Init ();
|
i2p::context.Init ();
|
||||||
|
|
||||||
bool ipv6; i2p::config::GetOption("ipv6", ipv6);
|
bool ipv6; i2p::config::GetOption("ipv6", ipv6);
|
||||||
bool ipv4; i2p::config::GetOption("ipv4", ipv4);
|
bool ipv4; i2p::config::GetOption("ipv4", ipv4);
|
||||||
#ifdef MESHNET
|
#ifdef MESHNET
|
||||||
// manual override for meshnet
|
// manual override for meshnet
|
||||||
ipv4 = false;
|
ipv4 = false;
|
||||||
ipv6 = true;
|
ipv6 = true;
|
||||||
#endif
|
#endif
|
||||||
// ifname -> address
|
// ifname -> address
|
||||||
std::string ifname; i2p::config::GetOption("ifname", ifname);
|
std::string ifname; i2p::config::GetOption("ifname", ifname);
|
||||||
if (ipv4 && i2p::config::IsDefault ("address4"))
|
if (ipv4 && i2p::config::IsDefault ("address4"))
|
||||||
{
|
{
|
||||||
std::string ifname4; i2p::config::GetOption("ifname4", ifname4);
|
std::string ifname4; i2p::config::GetOption("ifname4", ifname4);
|
||||||
|
|
|
@ -2,6 +2,10 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <openssl/x509.h>
|
#include <openssl/x509.h>
|
||||||
#include <openssl/pem.h>
|
#include <openssl/pem.h>
|
||||||
|
|
||||||
|
// Use global placeholders from boost introduced when local_time.hpp is loaded
|
||||||
|
#define BOOST_BIND_GLOBAL_PLACEHOLDERS
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/date_time/local_time/local_time.hpp>
|
#include <boost/date_time/local_time/local_time.hpp>
|
||||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
|
|
|
@ -62,11 +62,11 @@ namespace config {
|
||||||
("floodfill", bool_switch()->default_value(false), "Router will be floodfill (default: disabled)")
|
("floodfill", bool_switch()->default_value(false), "Router will be floodfill (default: disabled)")
|
||||||
("bandwidth", value<std::string>()->default_value(""), "Bandwidth limit: integer in KBps or letters: L (32), O (256), P (2048), X (>9000)")
|
("bandwidth", value<std::string>()->default_value(""), "Bandwidth limit: integer in KBps or letters: L (32), O (256), P (2048), X (>9000)")
|
||||||
("share", value<int>()->default_value(100), "Limit of transit traffic from max bandwidth in percents. (default: 100)")
|
("share", value<int>()->default_value(100), "Limit of transit traffic from max bandwidth in percents. (default: 100)")
|
||||||
("ntcp", bool_switch()->default_value(false), "Ignored. Always false")
|
("ntcp", bool_switch()->default_value(false), "Deprecated option. Always false")
|
||||||
("ssu", bool_switch()->default_value(true), "Enable SSU transport (default: enabled)")
|
("ssu", bool_switch()->default_value(true), "Enable SSU transport (default: enabled)")
|
||||||
("ntcpproxy", value<std::string>()->default_value(""), "Ignored")
|
("ntcpproxy", value<std::string>()->default_value(""), "Deprecated option")
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
("svcctl", value<std::string>()->default_value(""), "Ignored")
|
("svcctl", value<std::string>()->default_value(""), "Deprecated option")
|
||||||
("insomnia", bool_switch()->default_value(false), "Prevent system from sleeping (default: disabled)")
|
("insomnia", bool_switch()->default_value(false), "Prevent system from sleeping (default: disabled)")
|
||||||
("close", value<std::string>()->default_value("ask"), "Action on close: minimize, exit, ask")
|
("close", value<std::string>()->default_value("ask"), "Action on close: minimize, exit, ask")
|
||||||
#endif
|
#endif
|
||||||
|
@ -77,9 +77,9 @@ namespace config {
|
||||||
("limits.coresize", value<uint32_t>()->default_value(0), "Maximum size of corefile in Kb (0 - use system limit)")
|
("limits.coresize", value<uint32_t>()->default_value(0), "Maximum size of corefile in Kb (0 - use system limit)")
|
||||||
("limits.openfiles", value<uint16_t>()->default_value(0), "Maximum number of open files (0 - use system default)")
|
("limits.openfiles", value<uint16_t>()->default_value(0), "Maximum number of open files (0 - use system default)")
|
||||||
("limits.transittunnels", value<uint16_t>()->default_value(2500), "Maximum active transit sessions (default:2500)")
|
("limits.transittunnels", value<uint16_t>()->default_value(2500), "Maximum active transit sessions (default:2500)")
|
||||||
("limits.ntcpsoft", value<uint16_t>()->default_value(0), "Threshold to start probabilistic backoff with ntcp sessions (default: use system limit)")
|
("limits.ntcpsoft", value<uint16_t>()->default_value(0), "Deprecated option")
|
||||||
("limits.ntcphard", value<uint16_t>()->default_value(0), "Maximum number of ntcp sessions (default: use system limit)")
|
("limits.ntcphard", value<uint16_t>()->default_value(0), "Deprecated option")
|
||||||
("limits.ntcpthreads", value<uint16_t>()->default_value(1), "Maximum number of threads used by NTCP DH worker (default: 1)")
|
("limits.ntcpthreads", value<uint16_t>()->default_value(1), "Deprecated option")
|
||||||
;
|
;
|
||||||
|
|
||||||
options_description httpserver("HTTP Server options");
|
options_description httpserver("HTTP Server options");
|
||||||
|
@ -281,7 +281,7 @@ namespace config {
|
||||||
|
|
||||||
options_description meshnets("Meshnet transports options");
|
options_description meshnets("Meshnet transports options");
|
||||||
meshnets.add_options()
|
meshnets.add_options()
|
||||||
("meshnets.yggdrasil", bool_switch()->default_value(false), "Support transports through the Yggdrasil (deafult: false)")
|
("meshnets.yggdrasil", bool_switch()->default_value(false), "Support transports through the Yggdrasil (default: false)")
|
||||||
("meshnets.yggaddress", value<std::string>()->default_value(""), "Yggdrasil address to publish")
|
("meshnets.yggaddress", value<std::string>()->default_value(""), "Yggdrasil address to publish")
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
@ -509,7 +509,7 @@ namespace client
|
||||||
// schedule verification
|
// schedule verification
|
||||||
m_PublishVerificationTimer.expires_from_now (boost::posix_time::seconds(PUBLISH_VERIFICATION_TIMEOUT));
|
m_PublishVerificationTimer.expires_from_now (boost::posix_time::seconds(PUBLISH_VERIFICATION_TIMEOUT));
|
||||||
m_PublishVerificationTimer.async_wait (std::bind (&LeaseSetDestination::HandlePublishVerificationTimer,
|
m_PublishVerificationTimer.async_wait (std::bind (&LeaseSetDestination::HandlePublishVerificationTimer,
|
||||||
shared_from_this (), std::placeholders::_1));
|
shared_from_this (), std::placeholders::_1));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
i2p::garlic::GarlicDestination::HandleDeliveryStatusMessage (msgID);
|
i2p::garlic::GarlicDestination::HandleDeliveryStatusMessage (msgID);
|
||||||
|
@ -592,8 +592,7 @@ namespace client
|
||||||
// assume it successive and try to verify
|
// assume it successive and try to verify
|
||||||
m_PublishVerificationTimer.expires_from_now (boost::posix_time::seconds(PUBLISH_VERIFICATION_TIMEOUT));
|
m_PublishVerificationTimer.expires_from_now (boost::posix_time::seconds(PUBLISH_VERIFICATION_TIMEOUT));
|
||||||
m_PublishVerificationTimer.async_wait (std::bind (&LeaseSetDestination::HandlePublishVerificationTimer,
|
m_PublishVerificationTimer.async_wait (std::bind (&LeaseSetDestination::HandlePublishVerificationTimer,
|
||||||
shared_from_this (), std::placeholders::_1));
|
shared_from_this (), std::placeholders::_1));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -717,7 +717,7 @@ namespace transport
|
||||||
m_Establisher->m_SessionRequestBuffer = new uint8_t[287]; // 287 bytes max for now
|
m_Establisher->m_SessionRequestBuffer = new uint8_t[287]; // 287 bytes max for now
|
||||||
boost::asio::async_read (m_Socket, boost::asio::buffer(m_Establisher->m_SessionRequestBuffer, 64), boost::asio::transfer_all (),
|
boost::asio::async_read (m_Socket, boost::asio::buffer(m_Establisher->m_SessionRequestBuffer, 64), boost::asio::transfer_all (),
|
||||||
std::bind(&NTCP2Session::HandleSessionRequestReceived, shared_from_this (),
|
std::bind(&NTCP2Session::HandleSessionRequestReceived, shared_from_this (),
|
||||||
std::placeholders::_1, std::placeholders::_2));
|
std::placeholders::_1, std::placeholders::_2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void NTCP2Session::ReceiveLength ()
|
void NTCP2Session::ReceiveLength ()
|
||||||
|
@ -780,7 +780,7 @@ namespace transport
|
||||||
if (IsTerminated ()) return;
|
if (IsTerminated ()) return;
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
const int one = 1;
|
const int one = 1;
|
||||||
setsockopt(m_Socket.native_handle(), IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
|
setsockopt(m_Socket.native_handle(), IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
|
||||||
#endif
|
#endif
|
||||||
boost::asio::async_read (m_Socket, boost::asio::buffer(m_NextReceivedBuffer, m_NextReceivedLen), boost::asio::transfer_all (),
|
boost::asio::async_read (m_Socket, boost::asio::buffer(m_NextReceivedBuffer, m_NextReceivedLen), boost::asio::transfer_all (),
|
||||||
std::bind(&NTCP2Session::HandleReceived, shared_from_this (), std::placeholders::_1, std::placeholders::_2));
|
std::bind(&NTCP2Session::HandleReceived, shared_from_this (), std::placeholders::_1, std::placeholders::_2));
|
||||||
|
|
|
@ -74,11 +74,11 @@ namespace i2p
|
||||||
bool ipv6; i2p::config::GetOption("ipv6", ipv6);
|
bool ipv6; i2p::config::GetOption("ipv6", ipv6);
|
||||||
bool ssu; i2p::config::GetOption("ssu", ssu);
|
bool ssu; i2p::config::GetOption("ssu", ssu);
|
||||||
bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2);
|
bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2);
|
||||||
bool ygg; i2p::config::GetOption("meshnets.yggdrasil", ygg);
|
bool ygg; i2p::config::GetOption("meshnets.yggdrasil", ygg);
|
||||||
bool nat; i2p::config::GetOption("nat", nat);
|
bool nat; i2p::config::GetOption("nat", nat);
|
||||||
|
|
||||||
if ((ntcp2 || ygg) && !m_NTCP2Keys)
|
if ((ntcp2 || ygg) && !m_NTCP2Keys)
|
||||||
NewNTCP2Keys ();
|
NewNTCP2Keys ();
|
||||||
bool ntcp2Published = false;
|
bool ntcp2Published = false;
|
||||||
if (ntcp2)
|
if (ntcp2)
|
||||||
{
|
{
|
||||||
|
@ -402,7 +402,7 @@ namespace i2p
|
||||||
case i2p::data::CAPS_FLAG_EXTRA_BANDWIDTH1 : limit = 2048; type = extra; break;
|
case i2p::data::CAPS_FLAG_EXTRA_BANDWIDTH1 : limit = 2048; type = extra; break;
|
||||||
case i2p::data::CAPS_FLAG_EXTRA_BANDWIDTH2 : limit = 1000000; type = unlim; break; // 1Gbyte/s
|
case i2p::data::CAPS_FLAG_EXTRA_BANDWIDTH2 : limit = 1000000; type = unlim; break; // 1Gbyte/s
|
||||||
default:
|
default:
|
||||||
limit = 48; type = low;
|
limit = 48; type = low;
|
||||||
}
|
}
|
||||||
/* update caps & flags in RI */
|
/* update caps & flags in RI */
|
||||||
auto caps = m_RouterInfo.GetCaps ();
|
auto caps = m_RouterInfo.GetCaps ();
|
||||||
|
@ -416,8 +416,8 @@ namespace i2p
|
||||||
#if (__cplusplus >= 201703L) // C++ 17 or higher
|
#if (__cplusplus >= 201703L) // C++ 17 or higher
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
#endif
|
#endif
|
||||||
// no break here, extra + high means 'X'
|
// no break here, extra + high means 'X'
|
||||||
case high : caps |= i2p::data::RouterInfo::eHighBandwidth; break;
|
case high : caps |= i2p::data::RouterInfo::eHighBandwidth; break;
|
||||||
}
|
}
|
||||||
m_RouterInfo.SetCaps (caps);
|
m_RouterInfo.SetCaps (caps);
|
||||||
UpdateRouterInfo ();
|
UpdateRouterInfo ();
|
||||||
|
@ -787,8 +787,8 @@ namespace i2p
|
||||||
SetReachable (true, true); // we assume reachable until we discover firewall through peer tests
|
SetReachable (true, true); // we assume reachable until we discover firewall through peer tests
|
||||||
|
|
||||||
// read NTCP2
|
// read NTCP2
|
||||||
bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2);
|
bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2);
|
||||||
bool ygg; i2p::config::GetOption("meshnets.yggdrasil", ygg);
|
bool ygg; i2p::config::GetOption("meshnets.yggdrasil", ygg);
|
||||||
if (ntcp2 || ygg)
|
if (ntcp2 || ygg)
|
||||||
{
|
{
|
||||||
if (!m_NTCP2Keys) NewNTCP2Keys ();
|
if (!m_NTCP2Keys) NewNTCP2Keys ();
|
||||||
|
|
|
@ -412,7 +412,7 @@ namespace transport
|
||||||
|
|
||||||
std::shared_ptr<SSUSession> SSUServer::FindSession (const boost::asio::ip::udp::endpoint& e) const
|
std::shared_ptr<SSUSession> SSUServer::FindSession (const boost::asio::ip::udp::endpoint& e) const
|
||||||
{
|
{
|
||||||
auto& sessions = e.address ().is_v6 () ? m_SessionsV6 : m_Sessions;
|
auto& sessions = e.address ().is_v6 () ? m_SessionsV6 : m_Sessions;
|
||||||
auto it = sessions.find (e);
|
auto it = sessions.find (e);
|
||||||
if (it != sessions.end ())
|
if (it != sessions.end ())
|
||||||
return it->second;
|
return it->second;
|
||||||
|
@ -648,7 +648,7 @@ namespace transport
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<std::shared_ptr<SSUSession> > SSUServer::FindIntroducers (int maxNumIntroducers,
|
std::list<std::shared_ptr<SSUSession> > SSUServer::FindIntroducers (int maxNumIntroducers,
|
||||||
bool v4, std::set<i2p::data::IdentHash>& excluded)
|
bool v4, std::set<i2p::data::IdentHash>& excluded)
|
||||||
{
|
{
|
||||||
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
|
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
|
||||||
|
@ -664,7 +664,7 @@ namespace transport
|
||||||
}
|
}
|
||||||
if ((int)ret.size () > maxNumIntroducers)
|
if ((int)ret.size () > maxNumIntroducers)
|
||||||
{
|
{
|
||||||
// shink ret randomly
|
// shink ret randomly
|
||||||
int sz = ret.size () - maxNumIntroducers;
|
int sz = ret.size () - maxNumIntroducers;
|
||||||
for (int i = 0; i < sz; i++)
|
for (int i = 0; i < sz; i++)
|
||||||
{
|
{
|
||||||
|
@ -824,7 +824,7 @@ namespace transport
|
||||||
boost::asio::ip::udp::endpoint ep (address->host, address->port);
|
boost::asio::ip::udp::endpoint ep (address->host, address->port);
|
||||||
if (std::find (introducers.begin (), introducers.end (), ep) == introducers.end ()) // not connected yet
|
if (std::find (introducers.begin (), introducers.end (), ep) == introducers.end ()) // not connected yet
|
||||||
{
|
{
|
||||||
CreateDirectSession (introducer, ep, false);
|
CreateDirectSession (introducer, ep, false);
|
||||||
excluded.insert (introducer->GetIdentHash ());
|
excluded.insert (introducer->GetIdentHash ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -383,7 +383,7 @@ namespace transport
|
||||||
{
|
{
|
||||||
// tell out peer to now assign relay tag
|
// tell out peer to now assign relay tag
|
||||||
flag = SSU_HEADER_EXTENDED_OPTIONS_INCLUDED;
|
flag = SSU_HEADER_EXTENDED_OPTIONS_INCLUDED;
|
||||||
*payload = 2; payload++; // 1 byte length
|
*payload = 2; payload++; // 1 byte length
|
||||||
uint16_t flags = 0; // clear EXTENDED_OPTIONS_FLAG_REQUEST_RELAY_TAG
|
uint16_t flags = 0; // clear EXTENDED_OPTIONS_FLAG_REQUEST_RELAY_TAG
|
||||||
htobe16buf (payload, flags);
|
htobe16buf (payload, flags);
|
||||||
payload += 2;
|
payload += 2;
|
||||||
|
|
Loading…
Reference in a new issue