From b84599f263b60ada4cc6f8ddb0b79031fc4e709f Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Wed, 3 Aug 2011 21:35:48 -0400 Subject: [PATCH] Correct path MTU discovery --- network.cpp | 16 +++++++++++----- network.hpp | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/network.cpp b/network.cpp index b5c71ab..60c928b 100644 --- a/network.cpp +++ b/network.cpp @@ -130,19 +130,25 @@ void Connection::client_connect( const char *ip, int port ) } template -void Connection::send( Outgoing &s ) +bool Connection::send( Outgoing &s ) { assert( attached ); string p = flow.new_packet( s ).tostring(); - if ( sendto( sock, p.data(), p.size(), 0, - (sockaddr *)&remote_addr, sizeof( remote_addr ) ) < 0 ) { + ssize_t bytes_sent = sendto( sock, p.data(), p.size(), 0, + (sockaddr *)&remote_addr, sizeof( remote_addr ) ); + + if ( (bytes_sent < 0) && (errno == EMSGSIZE) ) { + update_MTU(); + return false; + } else if ( bytes_sent == static_cast( p.size() ) ) { + return true; + } else { perror( "sendto" ); exit( 1 ); + return false; } - - update_MTU(); } template diff --git a/network.hpp b/network.hpp index 26b7e78..3d1e2b7 100644 --- a/network.hpp +++ b/network.hpp @@ -78,7 +78,7 @@ namespace Network { Connection( bool s_server ); void client_connect( const char *ip, int port ); - void send( Outgoing &s ); + bool send( Outgoing &s ); Incoming recv( void ); int fd( void ) { return sock; } int port( void );