Path MTU
This commit is contained in:
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
static void dos_detected( const char *expression, const char *file, int line, const char *function )
|
static void dos_detected( const char *expression, const char *file, int line, const char *function )
|
||||||
{
|
{
|
||||||
fprintf( stderr, "Illegal counterparty input (possible DOS) in function %s at %s:%d, failed test: %s\n",
|
fprintf( stderr, "Illegal counterparty input (possible denial of service) in function %s at %s:%d, failed test: %s\n",
|
||||||
function, file, line, expression );
|
function, file, line, expression );
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
|
|||||||
+29
-1
@@ -60,7 +60,8 @@ Connection<Outgoing, Incoming>::Connection( bool s_server )
|
|||||||
sock( -1 ),
|
sock( -1 ),
|
||||||
remote_addr(),
|
remote_addr(),
|
||||||
server( s_server ),
|
server( s_server ),
|
||||||
attached( false )
|
attached( false ),
|
||||||
|
MTU( RECEIVE_MTU )
|
||||||
{
|
{
|
||||||
|
|
||||||
/* create socket */
|
/* create socket */
|
||||||
@@ -80,6 +81,31 @@ Connection<Outgoing, Incoming>::Connection( bool s_server )
|
|||||||
perror( "bind" );
|
perror( "bind" );
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Enable path MTU discovery */
|
||||||
|
char flag = IP_PMTUDISC_DO;
|
||||||
|
socklen_t optlen = sizeof( flag );
|
||||||
|
if ( setsockopt( sock, IPPROTO_IP, IP_MTU_DISCOVER, &flag, optlen ) < 0 ) {
|
||||||
|
perror( "setsockopt" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Outgoing, class Incoming>
|
||||||
|
void Connection<Outgoing, Incoming>::update_MTU( void )
|
||||||
|
{
|
||||||
|
socklen_t optlen = sizeof( MTU );
|
||||||
|
if ( getsockopt( sock, IPPROTO_IP, IP_MTU, &MTU, &optlen ) < 0 ) {
|
||||||
|
perror( "getsockopt" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( optlen != sizeof( MTU ) ) {
|
||||||
|
fprintf( stderr, "Error getting path MTU.\n" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf( stderr, "Path MTU: %d\n", MTU );
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Outgoing, class Incoming>
|
template <class Outgoing, class Incoming>
|
||||||
@@ -115,6 +141,8 @@ void Connection<Outgoing, Incoming>::send( Outgoing &s )
|
|||||||
perror( "sendto" );
|
perror( "sendto" );
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_MTU();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Outgoing, class Incoming>
|
template <class Outgoing, class Incoming>
|
||||||
|
|||||||
+5
-2
@@ -49,10 +49,9 @@ namespace Network {
|
|||||||
|
|
||||||
uint64_t next_seq;
|
uint64_t next_seq;
|
||||||
const Direction direction;
|
const Direction direction;
|
||||||
int MTU;
|
|
||||||
|
|
||||||
Flow( Direction s_direction )
|
Flow( Direction s_direction )
|
||||||
: next_seq( 0 ), direction( s_direction ), MTU( 2048 )
|
: next_seq( 0 ), direction( s_direction )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Packet new_packet( Payload &s_payload );
|
Packet new_packet( Payload &s_payload );
|
||||||
@@ -71,6 +70,10 @@ namespace Network {
|
|||||||
bool server;
|
bool server;
|
||||||
bool attached;
|
bool attached;
|
||||||
|
|
||||||
|
int MTU;
|
||||||
|
|
||||||
|
void update_MTU( void );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Connection( bool s_server );
|
Connection( bool s_server );
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user