@ -49,13 +49,11 @@ namespace llarp
}
}
TunEndpoint : : TunEndpoint ( const std : : string & nickname , AbstractRouter * r ,
service : : Context * parent , bool lazyVPN )
TunEndpoint : : TunEndpoint (
const std : : string & nickname , AbstractRouter * r , service : : Context * parent , bool lazyVPN )
: service : : Endpoint ( nickname , r , parent )
, m_UserToNetworkPktQueue ( nickname + " _sendq " , r - > netloop ( ) ,
r - > netloop ( ) )
, m_NetworkToUserPktQueue ( nickname + " _recvq " , r - > netloop ( ) ,
r - > netloop ( ) )
, m_UserToNetworkPktQueue ( nickname + " _sendq " , r - > netloop ( ) , r - > netloop ( ) )
, m_NetworkToUserPktQueue ( nickname + " _recvq " , r - > netloop ( ) , r - > netloop ( ) )
, m_Resolver ( std : : make_shared < dns : : Proxy > (
r - > netloop ( ) , r - > logic ( ) , r - > netloop ( ) , r - > logic ( ) , this ) )
{
@ -123,8 +121,7 @@ namespace llarp
}
else
{
LogError ( Name ( ) , " config option reachable = ' " , v ,
" ' does not make sense " ) ;
LogError ( Name ( ) , " config option reachable = ' " , v , " ' does not make sense " ) ;
return false ;
}
}
@ -140,8 +137,7 @@ namespace llarp
LogInfo ( Name ( ) , " booyeah network isolation succeeded " ) ;
return true ;
# else
LogError ( Name ( ) ,
" network isolation is not supported on your platform " ) ;
LogError ( Name ( ) , " network isolation is not supported on your platform " ) ;
return false ;
# endif
}
@ -157,15 +153,14 @@ namespace llarp
RouterContact rc ;
if ( ! m_router - > nodedb ( ) - > Get ( connect , rc ) )
{
LogError ( Name ( ) , " we don't have the RC for " , v ,
" so we can't use it in strict-connect " ) ;
LogError (
Name ( ) , " we don't have the RC for " , v , " so we can't use it in strict-connect " ) ;
return false ;
}
for ( const auto & ai : rc . addrs )
{
m_StrictConnectAddrs . emplace_back ( ai ) ;
LogInfo ( Name ( ) , " added " , m_StrictConnectAddrs . back ( ) ,
" to strict connect " ) ;
LogInfo ( Name ( ) , " added " , m_StrictConnectAddrs . back ( ) , " to strict connect " ) ;
}
return true ;
}
@ -193,8 +188,7 @@ namespace llarp
}
routerStr = str ( TrimWhitespace ( routerStr ) ) ;
if ( ! ( exitRouter . FromString ( routerStr )
| | HexDecode ( routerStr . c_str ( ) , exitRouter . begin ( ) ,
exitRouter . size ( ) ) ) )
| | HexDecode ( routerStr . c_str ( ) , exitRouter . begin ( ) , exitRouter . size ( ) ) ) )
{
llarp : : LogError ( Name ( ) , " bad exit router key: " , routerStr ) ;
return false ;
@ -202,10 +196,12 @@ namespace llarp
auto exit = std : : make_shared < llarp : : exit : : ExitSession > (
exitRouter ,
util : : memFn ( & TunEndpoint : : QueueInboundPacketForExit , this ) ,
m_router , numPaths , numHops , ShouldBundleRC ( ) ) ;
m_router ,
numPaths ,
numHops ,
ShouldBundleRC ( ) ) ;
m_ExitMap . Insert ( exitRange , exit ) ;
llarp : : LogInfo ( Name ( ) , " using exit at " , exitRouter , " for " ,
exitRange ) ;
llarp : : LogInfo ( Name ( ) , " using exit at " , exitRouter , " for " , exitRange ) ;
}
if ( k = = " local-dns " )
{
@ -233,15 +229,16 @@ namespace llarp
dnsport = std : : atoi ( v . substr ( pos + 1 ) . c_str ( ) ) ;
}
m_UpstreamResolvers . emplace_back ( resolverAddr , dnsport ) ;
llarp : : LogInfo ( Name ( ) , " adding upstream DNS server " , resolverAddr ,
" : " , dnsport ) ;
llarp : : LogInfo ( Name ( ) , " adding upstream DNS server " , resolverAddr , " : " , dnsport ) ;
}
if ( k = = " mapaddr " )
{
auto pos = v . find ( " : " ) ;
if ( pos = = std : : string : : npos )
{
llarp : : LogError ( " Cannot map address " , v ,
llarp : : LogError (
" Cannot map address " ,
v ,
" invalid format, missing colon (:), expects "
" address.loki:ip.address.goes.here " ) ;
return false ;
@ -265,8 +262,7 @@ namespace llarp
}
else
{
llarp : : LogError ( Name ( ) , " failed to map " , ip_str ,
" failed to parse IP " ) ;
llarp : : LogError ( Name ( ) , " failed to map " , ip_str , " failed to parse IP " ) ;
return false ;
}
return MapAddress ( addr , ipv6 , false ) ;
@ -315,8 +311,7 @@ namespace llarp
tunif - > netmask = 32 ;
addr = v ;
}
llarp : : LogInfo ( Name ( ) + " set ifaddr to " , addr , " with netmask " ,
tunif - > netmask ) ;
llarp : : LogInfo ( Name ( ) + " set ifaddr to " , addr , " with netmask " , tunif - > netmask ) ;
strncpy ( tunif - > ifaddr , addr . c_str ( ) , sizeof ( tunif - > ifaddr ) - 1 ) ;
return true ;
}
@ -341,8 +336,7 @@ namespace llarp
{
static const auto func = [ ] ( auto self ) {
self - > FlushSend ( ) ;
self - > m_ExitMap . ForEachValue (
[ ] ( const auto & exit ) { exit - > FlushUpstream ( ) ; } ) ;
self - > m_ExitMap . ForEachValue ( [ ] ( const auto & exit ) { exit - > FlushUpstream ( ) ; } ) ;
self - > Pump ( self - > Now ( ) ) ;
} ;
if ( NetworkIsIsolated ( ) )
@ -404,20 +398,16 @@ namespace llarp
}
bool
TunEndpoint : : HandleHookedDNSMessage (
dns : : Message msg , std : : function < void ( dns : : Message ) > reply )
TunEndpoint : : HandleHookedDNSMessage ( dns : : Message msg , std : : function < void ( dns : : Message ) > reply )
{
auto ReplyToSNodeDNSWhenReady = [ self = this , reply = reply ] (
RouterID snode , auto msg ,
bool isV6 ) - > bool {
return self - > EnsurePathToSNode (
snode , [ = ] ( const RouterID & , exit : : BaseSession_ptr s ) {
RouterID snode , auto msg , bool isV6 ) - > bool {
return self - > EnsurePathToSNode ( snode , [ = ] ( const RouterID & , exit : : BaseSession_ptr s ) {
self - > SendDNSReply ( snode , s , msg , reply , true , isV6 ) ;
} ) ;
} ;
auto ReplyToLokiDNSWhenReady = [ self = this , reply = reply ] (
service : : Address addr , auto msg ,
bool isV6 ) - > bool {
service : : Address addr , auto msg , bool isV6 ) - > bool {
using service : : Address ;
using service : : OutboundContext ;
if ( self - > HasAddress ( addr ) )
@ -447,8 +437,7 @@ namespace llarp
RouterID addr ;
if ( not addr . FromString ( qname ) )
return false ;
auto replyMsg =
std : : make_shared < dns : : Message > ( clear_dns_message ( msg ) ) ;
auto replyMsg = std : : make_shared < dns : : Message > ( clear_dns_message ( msg ) ) ;
return ReplyToSNodeDNSWhenReady ( addr , std : : move ( replyMsg ) , false ) ;
}
else if ( answer . HasCNameForTLD ( " .loki " ) )
@ -460,8 +449,7 @@ namespace llarp
service : : Address addr ;
if ( not addr . FromString ( qname ) )
return false ;
auto replyMsg =
std : : make_shared < dns : : Message > ( clear_dns_message ( msg ) ) ;
auto replyMsg = std : : make_shared < dns : : Message > ( clear_dns_message ( msg ) ) ;
return ReplyToLokiDNSWhenReady ( addr , replyMsg , false ) ;
}
}
@ -499,8 +487,7 @@ namespace llarp
{
size_t counter = 0 ;
context - > ForEachService (
[ & ] ( const std : : string & ,
const std : : shared_ptr < service : : Endpoint > & service ) - > bool {
[ & ] ( const std : : string & , const std : : shared_ptr < service : : Endpoint > & service ) - > bool {
const service : : Address addr = service - > GetIdentity ( ) . pub . Addr ( ) ;
msg . AddCNAMEReply ( addr . ToString ( ) , 1 ) ;
+ + counter ;
@ -513,8 +500,7 @@ namespace llarp
msg . AddNXReply ( ) ;
reply ( msg ) ;
}
else if ( msg . questions [ 0 ] . qtype = = dns : : qTypeA
| | msg . questions [ 0 ] . qtype = = dns : : qTypeAAAA )
else if ( msg . questions [ 0 ] . qtype = = dns : : qTypeA | | msg . questions [ 0 ] . qtype = = dns : : qTypeAAAA )
{
const bool isV6 = msg . questions [ 0 ] . qtype = = dns : : qTypeAAAA ;
const bool isV4 = msg . questions [ 0 ] . qtype = = dns : : qTypeA ;
@ -530,8 +516,7 @@ namespace llarp
if ( Router ( ) - > GetRandomGoodRouter ( random ) )
{
msg . AddCNAMEReply ( random . ToString ( ) , 1 ) ;
return ReplyToSNodeDNSWhenReady (
random , std : : make_shared < dns : : Message > ( msg ) , isV6 ) ;
return ReplyToSNodeDNSWhenReady ( random , std : : make_shared < dns : : Message > ( msg ) , isV6 ) ;
}
else
msg . AddNXReply ( ) ;
@ -540,8 +525,7 @@ namespace llarp
{
size_t counter = 0 ;
context - > ForEachService (
[ & ] ( const std : : string & ,
const std : : shared_ptr < service : : Endpoint > & service ) - > bool {
[ & ] ( const std : : string & , const std : : shared_ptr < service : : Endpoint > & service ) - > bool {
if ( ! service - > HasIfAddr ( ) )
return true ;
huint128_t ip = service - > GetIfAddr ( ) ;
@ -563,8 +547,7 @@ namespace llarp
}
else
{
return ReplyToLokiDNSWhenReady (
addr , std : : make_shared < dns : : Message > ( msg ) , isV6 ) ;
return ReplyToLokiDNSWhenReady ( addr , std : : make_shared < dns : : Message > ( msg ) , isV6 ) ;
}
}
else if ( addr . FromString ( qname , " .snode " ) )
@ -624,8 +607,7 @@ namespace llarp
TunEndpoint : : ResetInternalState ( )
{
service : : Endpoint : : ResetInternalState ( ) ;
m_ExitMap . ForEachValue (
[ ] ( const auto & exit ) { exit - > ResetInternalState ( ) ; } ) ;
m_ExitMap . ForEachValue ( [ ] ( const auto & exit ) { exit - > ResetInternalState ( ) ; } ) ;
}
bool
@ -667,14 +649,13 @@ namespace llarp
}
bool
TunEndpoint : : MapAddress ( const service : : Address & addr , huint128_t ip ,
bool SNode )
TunEndpoint : : MapAddress ( const service : : Address & addr , huint128_t ip , bool SNode )
{
auto itr = m_IPToAddr . find ( ip ) ;
if ( itr ! = m_IPToAddr . end ( ) )
{
llarp : : LogWarn ( ip , " already mapped to " ,
service : : Address ( itr - > second . as_array ( ) ) . ToString ( ) ) ;
llarp : : LogWarn (
ip , " already mapped to " , service : : Address ( itr - > second . as_array ( ) ) . ToString ( ) ) ;
return false ;
}
llarp : : LogInfo ( Name ( ) + " map " , addr . ToString ( ) , " to " , ip ) ;
@ -783,9 +764,8 @@ namespace llarp
{
if ( ! llarp_ev_add_tun ( loop . get ( ) , tunif . get ( ) ) )
{
llarp : : LogError ( Name ( ) ,
" failed to set up tun interface: " , tunif - > ifaddr ,
" on " , tunif - > ifname ) ;
llarp : : LogError (
Name ( ) , " failed to set up tun interface: " , tunif - > ifaddr , " on " , tunif - > ifname ) ;
return false ;
}
}
@ -826,8 +806,7 @@ namespace llarp
m_OurRange . addr = m_OurIP ;
m_MaxIP = m_OurRange . HighestAddr ( ) ;
llarp : : LogInfo ( Name ( ) , " set " , ifname , " to have address " , m_OurIP ) ;
llarp : : LogInfo ( Name ( ) , " allocated up to " , m_MaxIP , " on range " ,
m_OurRange ) ;
llarp : : LogInfo ( Name ( ) , " allocated up to " , m_MaxIP , " on range " , m_OurRange ) ;
const service : : Address ourAddr = m_Identity . pub . Addr ( ) ;
@ -919,28 +898,32 @@ namespace llarp
if ( pkt . IsV4 ( ) & & ! llarp : : IsIPv4Bogon ( pkt . dstv4 ( ) ) )
{
pkt . UpdateIPv4Address ( { 0 } , xhtonl ( pkt . dstv4 ( ) ) ) ;
exit - > QueueUpstreamTraffic ( std : : move ( pkt ) ,
llarp : : routing : : ExitPadSize ) ;
exit - > QueueUpstreamTraffic ( std : : move ( pkt ) , llarp : : routing : : ExitPadSize ) ;
}
else if ( pkt . IsV6 ( ) )
{
pkt . UpdateIPv6Address ( { 0 } , pkt . dstv6 ( ) ) ;
exit - > QueueUpstreamTraffic ( std : : move ( pkt ) ,
llarp : : routing : : ExitPadSize ) ;
exit - > QueueUpstreamTraffic ( std : : move ( pkt ) , llarp : : routing : : ExitPadSize ) ;
}
}
return ;
}
if ( m_SNodes . at ( itr - > second ) )
{
sendFunc = std : : bind ( & TunEndpoint : : SendToSNodeOrQueue , this ,
itr - > second . as_array ( ) , std : : placeholders : : _1 ) ;
sendFunc = std : : bind (
& TunEndpoint : : SendToSNodeOrQueue ,
this ,
itr - > second . as_array ( ) ,
std : : placeholders : : _1 ) ;
}
else
{
sendFunc = std : : bind ( & TunEndpoint : : SendToServiceOrQueue , this ,
sendFunc = std : : bind (
& TunEndpoint : : SendToServiceOrQueue ,
this ,
service : : Address ( itr - > second . as_array ( ) ) ,
std : : placeholders : : _1 , pkt . ServiceProtocol ( ) ) ;
std : : placeholders : : _1 ,
pkt . ServiceProtocol ( ) ) ;
}
// prepare packet for insertion into network
// this includes clearing IP addresses, recalculating checksums, etc
@ -967,8 +950,7 @@ namespace llarp
// llarp::LogInfo("themIP ", themIP);
auto usIP = m_OurIP ;
ManagedBuffer buf ( b ) ;
return m_NetworkToUserPktQueue . EmplaceIf (
[ buf , themIP , usIP ] ( net : : IPPacket & pkt ) - > bool {
return m_NetworkToUserPktQueue . EmplaceIf ( [ buf , themIP , usIP ] ( net : : IPPacket & pkt ) - > bool {
// load
if ( ! pkt . Load ( buf ) )
return false ;
@ -981,15 +963,14 @@ namespace llarp
if ( pkt . IsV4 ( ) )
{
auto hdr = pkt . Header ( ) ;
if ( pkt . sz < sizeof ( * hdr )
| | ( hdr - > saddr ! = 0 & & * ( byte_t * ) & ( hdr - > saddr ) = = 0 )
if ( pkt . sz < sizeof ( * hdr ) | | ( hdr - > saddr ! = 0 & & * ( byte_t * ) & ( hdr - > saddr ) = = 0 )
| | ( hdr - > daddr ! = 0 & & * ( byte_t * ) & ( hdr - > daddr ) = = 0 )
| | ( ( hdr - > saddr = = 0 ) ! = ( hdr - > daddr = = 0 ) ) )
{
return false ;
}
pkt . UpdateIPv4Address ( xhtonl ( net : : IPPacket : : TruncateV6 ( themIP ) ) ,
xhtonl ( net : : IPPacket : : TruncateV6 ( usIP ) ) ) ;
pkt . UpdateIPv4Address (
xhtonl ( net : : IPPacket : : TruncateV6 ( themIP ) ) , xhtonl ( net : : IPPacket : : TruncateV6 ( usIP ) ) ) ;
}
else if ( pkt . IsV6 ( ) )
{
@ -1026,8 +1007,7 @@ namespace llarp
do
{
nextIP = + + m_NextIP ;
} while ( m_IPToAddr . find ( nextIP ) ! = m_IPToAddr . end ( )
& & m_NextIP < m_MaxIP ) ;
} while ( m_IPToAddr . find ( nextIP ) ! = m_IPToAddr . end ( ) & & m_NextIP < m_MaxIP ) ;
if ( nextIP < m_MaxIP )
{
m_AddrToIP [ ident ] = nextIP ;