@ -11,14 +11,11 @@ extern "C"
{
{
# include <windivert.h>
# include <windivert.h>
}
}
namespace L = llarp : : log ;
namespace llarp : : win32
namespace llarp : : win32
{
{
namespace
static auto logcat = log : : Cat ( " windivert " ) ;
{
auto cat = L : : Cat ( " windivert " ) ;
}
namespace wd
namespace wd
{
{
namespace
namespace
@ -73,7 +70,7 @@ namespace llarp::win32
: m_Wake { wake } , m_RecvQueue { recv_queue_size }
: m_Wake { wake } , m_RecvQueue { recv_queue_size }
{
{
wd : : Initialize ( ) ;
wd : : Initialize ( ) ;
L: : info ( cat, " load windivert with filterspec: '{}' " , filter_spec ) ;
log: : info ( log cat, " load windivert with filterspec: '{}' " , filter_spec ) ;
m_Handle = wd : : open ( filter_spec . c_str ( ) , WINDIVERT_LAYER_NETWORK , 0 , 0 ) ;
m_Handle = wd : : open ( filter_spec . c_str ( ) , WINDIVERT_LAYER_NETWORK , 0 , 0 ) ;
if ( auto err = GetLastError ( ) )
if ( auto err = GetLastError ( ) )
@ -95,14 +92,19 @@ namespace llarp::win32
if ( not wd : : recv ( m_Handle , pkt . data ( ) , pkt . size ( ) , & sz , & addr ) )
if ( not wd : : recv ( m_Handle , pkt . data ( ) , pkt . size ( ) , & sz , & addr ) )
{
{
auto err = GetLastError ( ) ;
auto err = GetLastError ( ) ;
if ( err and err ! = ERROR_BROKEN_PIPE )
if ( err = = ERROR_NO_DATA )
throw win32 : : error {
return std : : nullopt ;
err , fmt : : format ( " failed to receive packet from windivert (code={}) " , err ) } ;
if ( err = = ERROR_BROKEN_PIPE )
else if ( err )
{
SetLastError ( 0 ) ;
SetLastError ( 0 ) ;
return std : : nullopt ;
return std : : nullopt ;
}
log : : critical ( logcat , " error receiving packet: {} " , err ) ;
throw win32 : : error {
err , fmt : : format ( " failed to receive packet from windivert (code={}) " , err ) } ;
}
}
L : : trace ( cat , " got packet of size {}B " , sz ) ;
log: : trace ( log cat, " got packet of size {}B " , sz ) ;
pkt . resize ( sz ) ;
pkt . resize ( sz ) ;
return Packet { std : : move ( pkt ) , std : : move ( addr ) } ;
return Packet { std : : move ( pkt ) , std : : move ( addr ) } ;
}
}
@ -112,7 +114,7 @@ namespace llarp::win32
{
{
const auto & pkt = w_pkt . pkt ;
const auto & pkt = w_pkt . pkt ;
const auto * addr = & w_pkt . addr ;
const auto * addr = & w_pkt . addr ;
L: : trace ( cat, " send dns packet of size {}B " , pkt . size ( ) ) ;
log: : trace ( log cat, " send dns packet of size {}B " , pkt . size ( ) ) ;
UINT sz { } ;
UINT sz { } ;
if ( wd : : send ( m_Handle , pkt . data ( ) , pkt . size ( ) , & sz , addr ) )
if ( wd : : send ( m_Handle , pkt . data ( ) , pkt . size ( ) , & sz , addr ) )
return ;
return ;
@ -147,12 +149,12 @@ namespace llarp::win32
void
void
Start ( ) override
Start ( ) override
{
{
L: : info ( cat, " starting windivert " ) ;
log: : info ( log cat, " starting windivert " ) ;
if ( m_Runner . joinable ( ) )
if ( m_Runner . joinable ( ) )
throw std : : runtime_error { " windivert thread is already running " } ;
throw std : : runtime_error { " windivert thread is already running " } ;
auto read_loop = [ this ] ( ) {
auto read_loop = [ this ] ( ) {
log : : debug ( cat, " windivert read loop start " ) ;
log : : debug ( log cat, " windivert read loop start " ) ;
while ( true )
while ( true )
{
{
// in the read loop, read packets until they stop coming in
// in the read loop, read packets until they stop coming in
@ -166,7 +168,7 @@ namespace llarp::win32
else // leave loop on read fail
else // leave loop on read fail
break ;
break ;
}
}
log : : debug ( cat, " windivert read loop end " ) ;
log : : debug ( log cat, " windivert read loop end " ) ;
} ;
} ;
m_Runner = std : : thread { std : : move ( read_loop ) } ;
m_Runner = std : : thread { std : : move ( read_loop ) } ;
@ -175,7 +177,7 @@ namespace llarp::win32
void
void
Stop ( ) override
Stop ( ) override
{
{
L: : info ( cat, " stopping windivert " ) ;
log: : info ( log cat, " stopping windivert " ) ;
wd : : shutdown ( m_Handle , WINDIVERT_SHUTDOWN_BOTH ) ;
wd : : shutdown ( m_Handle , WINDIVERT_SHUTDOWN_BOTH ) ;
m_Runner . join ( ) ;
m_Runner . join ( ) ;
}
}